Coder Social home page Coder Social logo

steve-community / steve Goto Github PK

View Code? Open in Web Editor NEW
724.0 65.0 362.0 8.92 MB

SteVe - OCPP server implementation in Java

License: GNU General Public License v3.0

Java 98.65% JavaScript 0.45% CSS 0.80% Dockerfile 0.10%
steve ocpp java emobility chargingstation mobility smarthome

steve's Introduction

SteVe

build and run tests

Introduction

SteVe started its life at the RWTH Aachen University in 2013. The name is derived from Steckdosenverwaltung in German (in English: socket administration). The aim of SteVe is to support the deployment and popularity of electric mobility, so it is easy to install and to use. It provides basic functions for the administration of charge points, user data, and RFID cards for user authentication and was tested successfully in operation.

SteVe is considered as an open platform to implement, test and evaluate novel ideas for electric mobility, like authentication protocols, reservation mechanisms for charge points, and business models for electric mobility. The project is distributed under GPL and is free to use. If you are going to deploy it we are happy to see the logo on a charge point.

Charge Point Support

Electric charge points using the following OCPP versions are supported:

  • OCPP1.2S
  • OCPP1.2J
  • OCPP1.5S
  • OCPP1.5J
  • OCPP1.6S
  • OCPP1.6J

For Charging Station compatibility please check: https://github.com/steve-community/steve/wiki/Charging-Station-Compatibility

System Requirements

SteVe requires

  • JDK 17 or newer
  • Maven
  • MySQL or MariaDB. You should use one of these supported versions.

to build and run.

SteVe is designed to run standalone, a java servlet container / web server (e.g. Apache Tomcat), is not required.

Configuration and Installation

  1. Database preparation:

    Important: Make sure that the time zone of the MySQL server is the same as the time zone of SteVe. Since UTC is strongly recommended by OCPP, it is the default in SteVe and you should set it in MySQL, accordingly.

    Make sure MySQL is reachable via TCP (e.g., remove skip-networking from my.cnf). The following MySQL statements can be used as database initialization (adjust database name and credentials according to your setup).

    CREATE DATABASE stevedb CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    CREATE USER 'steve'@'localhost' IDENTIFIED BY 'changeme';
    GRANT ALL PRIVILEGES ON stevedb.* TO 'steve'@'localhost';
    GRANT SUPER ON *.* TO 'steve'@'localhost';
    

    Note: The statement GRANT SUPER [...] is only necessary to execute some of the previous migration files and is only needed for the initial database setup. Afterwards, you can remove this privilege by executing

    REVOKE SUPER ON *.* FROM 'steve'@'localhost';
    
  2. Download and extract tarball:

    You can download and extract the SteVe releases using the following commands (replace X.X.X with the desired version number):

    wget https://github.com/steve-community/steve/archive/steve-X.X.X.tar.gz
    tar xzvf steve-X.X.X.tar.gz
    cd steve-X.X.X
    
  3. Configure SteVe before building:

    The basic configuration is defined in main.properties:

    For advanced configuration please see the Configuration wiki

  4. Build SteVe:

    To compile SteVe simply use Maven. A runnable jar file containing the application and configuration will be created in the subdirectory steve/target.

    # ./mvnw package
    
  5. Run SteVe:

    To start the application run (please do not run SteVe as root):

    # java -jar target/steve.jar
    

Docker

If you prefer to build and start this project via docker (you can skip the steps 1, 4 and 5 from above), this can be done as follows: docker compose up -d

Because the docker compose file is written to build the project for you, you still have to change the project configuration settings from step 3. Instead of changing the main.properties in the prod directory, you have to change the main.properties in the docker directory. There you have to change all configurations which are described in step 3. The database password for the user "steve" has to be the same as you have configured it in the docker compose file.

With the default docker compose configuration, the web interface will be accessible at: http://localhost:8180

Kubernetes

First build your image, and push it to a registry your K8S cluster can access. Make sure the build args in the docker build command are set with the same database configuration that the main deployment will use.

docker build --build-arg DB_HOST= --build-arg DB_PORT= --build-arg DB_USERNAME= --build-arg DB_PASSWORD= --build-arg DB_DATABASE= -f k8s/docker/Dockerfile -t <IMAGE_NAME> .

docker push <IMAGE_NAME>

Then go to k8s/yaml/Deployment.yaml and change ### YOUR BUILT IMAGE HERE ### to your image tag, and fill in the environment variables with the same database connection that you used at build time.

After this, create the namespace using kubectl create ns steve and apply your yaml with kubectl apply -f k8s/yaml/Deployment.yaml followed by kubectl apply -f k8s/yaml/Service.yaml

To access this publicaly, you'll also have to setup an ingress using something like nginx or traefik.

Ubuntu

You'll find a tutorial how to prepare Ubuntu for SteVe here: https://github.com/steve-community/steve/wiki/Prepare-Ubuntu-VM-for-SteVe

AWS

You'll find a tutorial how to setup SteVe in AWS using Lightsail here: https://github.com/steve-community/steve/wiki/Create-SteVe-Instance-in-AWS-Lightsail

First Steps

After SteVe has successfully started, you can access the web interface using the configured credentials under:

http://<your-server-ip>:<port>/steve/manager

Add a charge point

  1. In order for SteVe to accept messages from a charge point, the charge point must first be registered. To add a charge point to SteVe select Data Management >> Charge Points >> Add. Enter the ChargeBox ID configured in the charge point and confirm.

  2. The charge points must be configured to communicate with following addresses. Depending on the OCPP version of the charge point, SteVe will automatically route messages to the version-specific implementation.

    • SOAP: http://<your-server-ip>:<port>/steve/services/CentralSystemService
    • WebSocket/JSON: ws://<your-server-ip>:<port>/steve/websocket/CentralSystemService

As soon as a heartbeat is received, you should see the status of the charge point in the SteVe Dashboard.

Have fun!

Screenshots

  1. Home
  2. Connector Status
  3. Data Management - Charge Points
  4. Data Management - Users
  5. Data Management - OCPP Tags
  6. Data Management - Reservations
  7. Data Management - Transactions
  8. Operations - OCPP v1.2
  9. Operations - OCPP v1.5
  10. Settings

GDPR

If you are in the EU and offer vehicle charging to other people using SteVe, keep in mind that you have to comply to the General Data Protection Regulation (GDPR) as SteVe processes charging transactions, which can be considered personal data.

Are you having issues?

See the FAQ

Acknowledgments

goekay thanks to

  • JetBrains who support this project by providing a free All Products Pack license, and
  • ej-technologies GmbH who support this project by providing a free license for their Java profiler.

steve's People

Contributors

aheuvels avatar andychriss123 avatar benvia avatar chuck-h avatar csamsel avatar dakai-wei-of-shizen avatar danpeggparallax avatar daynnnnn avatar dependabot-preview[bot] avatar dependabot[bot] avatar drotak avatar fnkbsi avatar friedkiwi avatar goekay avatar gregorschatz avatar javaisjavascript avatar jpires avatar juherr avatar lategoodbye avatar mhei avatar muued avatar redhell avatar sirhcel avatar slachiewicz avatar weickmanna avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

steve's Issues

jooq.steve.db.routines does not exist

Hi there,

I cannot build the latest master version of Steve.
I'm trying to build it with the maven:onbuild docker image on docker-machine with a windows client.

I get:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project steve: Compilation failure
[ERROR] /usr/src/app/src/main/java/de/rwth/idsg/steve/repository/impl/GenericRepositoryImpl.java:[7,30] package jooq.steve.db.routines does not exist

Any thoughts?

CentralSystemServer doesn't like empty websocket message

I have an OCPP1.6J charge point which consistently sends an empty websocket message after its pong message. This causes an error in the steve log after each ping.

[INFO ] 2018-05-15 09:26:52,345 de.rwth.idsg.steve.ocpp.ws.PingTask - [id=4faae375] Sending ping message
[INFO ] 2018-05-15 09:26:52,757 de.rwth.idsg.steve.ocpp.ws.ocpp16.Ocpp16WebSocketEndpoint - [chargeBoxId=Delta01, sessionId=4faae375] Received message: 
[ERROR] 2018-05-15 09:26:52,758 org.springframework.web.socket.adapter.jetty.JettyWebSocketHandlerAdapter - Closing session due to exception for JettyWebSocketSession[id=4faae375, uri=ws://192.168.1.133:8080/steve/websocket/CentralSystemService/Delta01]
de.rwth.idsg.steve.SteveException: Deserialization of incoming string failed: 
[...]

(more complete log extract below).

Functionally, the application recovers smoothly after closing and reopening the websocket.

Although there is no need for the charge point to send this empty message, I have read that this is a fairly common websocket "keep-alive" method and is generally considered benign.

It appears to me from the error log that this could be fixed by testing for a null incoming string before parsing it in steve/src/main/java/de/rwth/idsg/steve/ocpp/ws/pipeline/Deserializer.java, but I do not understand the code very deeply.

    public void accept(CommunicationContext context) {
        try (JsonParser parser = mapper.getFactory().createParser(context.getIncomingString())) {

Here is the offending message sequence on the wire:
image
image

CentralSystemServer is 192.168.1.133, charge station is 192.168.1.128.

More complete steve error log extract:

[INFO ] 2018-05-15 09:26:52,345 de.rwth.idsg.steve.ocpp.ws.PingTask - [id=4faae375] Sending ping message
[INFO ] 2018-05-15 09:26:52,757 de.rwth.idsg.steve.ocpp.ws.ocpp16.Ocpp16WebSocketEndpoint - [chargeBoxId=Delta01, sessionId=4faae375] Received message: 
[ERROR] 2018-05-15 09:26:52,758 org.springframework.web.socket.adapter.jetty.JettyWebSocketHandlerAdapter - Closing session due to exception for JettyWebSocketSession[id=4faae375, uri=ws://192.168.1.133:8080/steve/websocket/CentralSystemService/Delta01]
de.rwth.idsg.steve.SteveException: Deserialization of incoming string failed: 
	at de.rwth.idsg.steve.ocpp.ws.pipeline.Deserializer.accept(Deserializer.java:75) ~[steve-3.0.1.jar:?]
	at de.rwth.idsg.steve.ocpp.ws.pipeline.IncomingPipeline.accept(IncomingPipeline.java:31) ~[steve-3.0.1.jar:?]
	at de.rwth.idsg.steve.ocpp.ws.AbstractWebSocketEndpoint.handleTextMessage(AbstractWebSocketEndpoint.java:90) ~[steve-3.0.1.jar:?]
	at de.rwth.idsg.steve.ocpp.ws.AbstractWebSocketEndpoint.handleMessage(AbstractWebSocketEndpoint.java:68) ~[steve-3.0.1.jar:?]
	at org.springframework.web.socket.adapter.jetty.JettyWebSocketHandlerAdapter.onWebSocketText(JettyWebSocketHandlerAdapter.java:83) ~[steve-3.0.1.jar:?]
	at sun.reflect.GeneratedMethodAccessor83.invoke(Unknown Source) ~[?:?]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_162]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_162]
	at org.eclipse.jetty.websocket.common.events.annotated.CallableMethod.call(CallableMethod.java:71) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.events.annotated.OptionalSessionCallableMethod.call(OptionalSessionCallableMethod.java:72) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.events.JettyAnnotatedEventDriver.onTextMessage(JettyAnnotatedEventDriver.java:234) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.message.SimpleTextMessage.messageComplete(SimpleTextMessage.java:69) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.appendMessage(AbstractEventDriver.java:66) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.events.JettyAnnotatedEventDriver.onTextFrame(JettyAnnotatedEventDriver.java:226) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.incomingFrame(AbstractEventDriver.java:162) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.WebSocketSession.incomingFrame(WebSocketSession.java:476) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.extensions.ExtensionStack.incomingFrame(ExtensionStack.java:220) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.Parser.notifyFrame(Parser.java:220) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.Parser.parse(Parser.java:245) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.readParse(AbstractWebSocketConnection.java:560) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillable(AbstractWebSocketConnection.java:391) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:319) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:175) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:133) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:754) ~[steve-3.0.1.jar:?]
	at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:672) ~[steve-3.0.1.jar:?]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_162]
Caused by: com.fasterxml.jackson.core.JsonParseException: Current token (null) not numeric, can not use numeric value accessors
 at [Source: (String)""; line: 1, column: 1]
	at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1804) ~[steve-3.0.1.jar:?]
	at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:668) ~[steve-3.0.1.jar:?]
	at com.fasterxml.jackson.core.base.ParserBase._parseNumericValue(ParserBase.java:781) ~[steve-3.0.1.jar:?]
	at com.fasterxml.jackson.core.base.ParserBase._parseIntValue(ParserBase.java:799) ~[steve-3.0.1.jar:?]
	at com.fasterxml.jackson.core.base.ParserBase.getIntValue(ParserBase.java:645) ~[steve-3.0.1.jar:?]
	at de.rwth.idsg.steve.ocpp.ws.pipeline.Deserializer.accept(Deserializer.java:52) ~[steve-3.0.1.jar:?]
	... 30 more
[WARN ] 2018-05-15 09:26:52,759 de.rwth.idsg.steve.ocpp.ws.ocpp16.Ocpp16WebSocketEndpoint - [id=4faae375] Connection was closed, status: CloseStatus[code=1011, reason=null]
[INFO ] 2018-05-15 09:26:53,637 de.rwth.idsg.steve.ocpp.ws.ocpp16.Ocpp16WebSocketEndpoint - New connection established: JettyWebSocketSession[id=7215b6a5, uri=ws://192.168.1.133:8080/steve/websocket/CentralSystemService/Delta01]
[INFO ] 2018-05-15 09:26:54,327 de.rwth.idsg.steve.ocpp.ws.ocpp16.Ocpp16WebSocketEndpoint - [chargeBoxId=Delta01, sessionId=7215b6a5] Received message: [2,"1526401612","Heartbeat",{}]
[INFO ] 2018-05-15 09:26:54,365 de.rwth.idsg.steve.ocpp.ws.pipeline.Sender - [chargeBoxId=Delta01, sessionId=7215b6a5] Sending message: [3,"1526401612",{"currentTime":"2018-05-15T16:26:54.327Z"}]

User ID tag is truncated

Go DataManagement -> Users

Create user with tag 12345678901234567890

Final user tag is now: 123456789012345

OCPP1.5 meter units "Volt","Amp" not accepted

Between v1.5 and v1.6 there was a subtle change in the UnitOfMeasure type: "Volt" and "Amp" were shortened to "V" and "A". The Server15to16Impl converter needs to take this into account.

Error Message does not match the OCPP JSON specification.

Hi,
When the server send a CALLERROR the message does not match the specification.

Received: [4,"UID2077486715","InternalError","Internal services failed while processing of the payload","SQL [insert into stevedb.connector_meter_value (connector_pk, transaction_pk, `value_timesta..."]

the entry "SQL [insert into stevedb.connector_meter_value (connector_pk, transaction_pk, `value_timesta..."" should be a object and is a string.
JSON Schecma of CALLERROR:

{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "CallError",
"type": "object",
"properties": {
    "errorCode": {
        "type": "string",
        "enum": [
            "NotImplemented",
            "NotSupported",
            "InternalError",
            "ProtocolError",
            "SecurityError",
            "FormationViolation",
            "PropertyConstraintViolation",
            "OccurenceConstraintViolation",
            "TypeConstraintViolation",
            "GenericError"
        ]
    },
    "errorDescription": {
        "type": "string",
        "maxLength": 20
    },
    "errorDetails": {
        "type": "object"
    }
},
"additionalProperties": false,
"required": [
    "messageTypeId",
    "idTag",
    "errorCode",
    "ErrorDescription",
    "errorDetails"
]
}

Thank you,
nuno

auto-register unknown charging stations?

off-topic but it is being discussed in ChargeTimeEU/Java-OCA-OCPP#37

i can see the value of such feature, but it is highly dangerous to accept/register unknown stations. therefore, i was thinking maybe to add a new flag to the main.properties and the user of steve can make the decision and steve can act accordingly. but first i want to collect opinions from the community. @victormunoz @V2G-UK what do you think?

[question] External config file

During compilation of Steve we have a message "The Java system property '{}' can be set to point to an external properties file". Is that would tell that Steve could run with external main.properties file ?

It should be great to be able to change parameters without recompiling the file.

Showing Errors in all the java files

Hi,
I just imported 'steve' into my eclipse workspace and changed properties file params.
I am able to BUILD the project successfully and application is working fine.

But in eclipse, almost every java file showing errors.
for example: in main class Apllication.java i am getting the following errors
-- "log" cannot be resolved
-- The method "getProfile()" is undefined for the type SteveConfiguration
How to resolve these errors?
I appreciate your support.

Foreign key failure with meter values report

I have an OCPP1.5 charge point (Delta AC Mini, v02.05.30 firmware) which is configured for periodic meter values reporting. After powering up the charge point, the first meter values report fails.

Without analyzing code, I speculate that perhaps Steve isn't set up to accept meter readings that don't belong to a transaction?

Charge point POST (periodic meter values report):

eXtensible Markup Language
    <?xml
        version="1.0"
        encoding="UTF-8"
        ?>
    <SOAP-ENV:Envelope
        xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
        xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:ns1="urn://Ocpp/Cp/2012/06/"
        xmlns:chan="http://schemas.microsoft.com/ws/2005/02/duplex"
        xmlns:wsa5="http://www.w3.org/2005/08/addressing"
        xmlns:ns2="urn://Ocpp/Cs/2012/06/">
        <SOAP-ENV:Header>
            <ns2:chargeBoxIdentity
                SOAP-ENV:mustUnderstand="true">
                Delta01
                </ns2:chargeBoxIdentity>
            <wsa5:MessageID>
                urn:uuid:904b4b43-3b10-45bc-9afc-bd799c407dd7
                </wsa5:MessageID>
            <wsa5:From>
                <wsa5:Address>
                    http://192.168.1.128:8080/ChargeBox/OCPP15
                    </wsa5:Address>
                </wsa5:From>
            <wsa5:To
                SOAP-ENV:mustUnderstand="true">
                http://192.168.1.133:8080/steve/services/CentralSystemService
                </wsa5:To>
            <wsa5:Action
                SOAP-ENV:mustUnderstand="true">
                /MeterValues
                </wsa5:Action>
            </SOAP-ENV:Header>
        <SOAP-ENV:Body>
            <ns2:meterValuesRequest>
                <ns2:connectorId>
                    0
                    </ns2:connectorId>
                <ns2:transactionId>
                    0
                    </ns2:transactionId>
                <ns2:values>
                    <ns2:timestamp>
                        2018-05-06T17:40:23Z
                        </ns2:timestamp>
                    <ns2:value
                        unit="kWh"
                        location="Body"
                        measurand="Energy.Active.Import.Interval"
                        format="Raw"
                        context="Sample.Periodic">
                        0.00
                        </ns2:value>
                    </ns2:values>
                <ns2:values>
                    <ns2:timestamp>
                        2018-05-06T17:40:23Z
                        </ns2:timestamp>
                    <ns2:value
                        unit="kW"
                        location="Body"
                        measurand="Power.Active.Import"
                        format="Raw"
                        context="Sample.Periodic">
                        0.02
                        </ns2:value>
                    </ns2:values>
                <ns2:values>
                    <ns2:timestamp>
                        2018-05-06T17:40:23Z
                        </ns2:timestamp>
                    <ns2:value
                        unit="Amp"
                        location="Body"
                        measurand="Current.Import"
                        format="Raw"
                        context="Sample.Periodic">
                        0.06
                        </ns2:value>
                    </ns2:values>
                <ns2:values>
                    <ns2:timestamp>
                        2018-05-06T17:40:23Z
                        </ns2:timestamp>
                    <ns2:value
                        unit="Volt"
                        location="Body"
                        measurand="Voltage"
                        format="Raw"
                        context="Sample.Periodic">
                        238.14
                        </ns2:value>
                    </ns2:values>
                </ns2:meterValuesRequest>
            </SOAP-ENV:Body>
        </SOAP-ENV:Envelope>

Central System reply (database error)

eXtensible Markup Language
    <soap:Envelope
        xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
        <soap:Header>
            <Action
                xmlns="http://www.w3.org/2005/08/addressing">
                urn://Ocpp/Cs/2012/06/:CentralSystemService:MeterValues:Fault:DataAccessException
                </Action>
            <MessageID
                xmlns="http://www.w3.org/2005/08/addressing">
                urn:uuid:c2267cc0-4cba-4891-8b67-6e17d15d4852
                </MessageID>
            <To
                xmlns="http://www.w3.org/2005/08/addressing">
                http://www.w3.org/2005/08/addressing/anonymous
                </To>
            <RelatesTo
                xmlns="http://www.w3.org/2005/08/addressing">
                urn:uuid:904b4b43-3b10-45bc-9afc-bd799c407dd7
                </RelatesTo>
            </soap:Header>
        <soap:Body>
            <soap:Fault>
                <soap:Code>
                    <soap:Value>
                        soap:Receiver
                        </soap:Value>
                    </soap:Code>
                <soap:Reason>
                    <soap:Text
                        xml:lang="en">
                         SQL [insert into `stevedb`.`connector_meter_value` (`connector_pk`, `transaction_pk`, `value_timestamp`, `value`, `reading_context`, `format`, `measurand`, `location`, `unit`, `phase`) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; Cannot add or update a child row: a foreign key constraint fails (`stevedb`.`connector_meter_value`, CONSTRAINT `FK_tid_cm` FOREIGN KEY (`transaction_pk`) REFERENCES `transaction` (`transaction_pk`) ON DELETE SET NULL ON UPDATE NO ACTION)
                        </soap:Text>
                    </soap:Reason>
                </soap:Fault>
            </soap:Body>
        </soap:Envelope>

Problem accessing /steve/manager/signin.

HTTP ERROR 500
Problem accessing /steve/manager/signin. Reason:

Server Error

Caused by:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:238)
at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:198)
at org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration$LazyPasswordEncoder.matches(AuthenticationConfiguration.java:289)
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:86)
at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:166)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:174)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199)
at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:124)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:666)
at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:61)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:531)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:352)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:319)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:175)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:133)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:754)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:672)
at java.lang.Thread.run(Thread.java:748)

Standard Configuration Key Name HeartbeatInterval mismatch.

When calling GetConfiguration requesting the HeartbeatInterval the Key Configuration name is HeartBeatInterval. The OCPP v1.6 correct key name is HeartbeatInterval.

PS: should I create a new issue for each new identified issue?

Thank you,
Nuno

Data too long for column 'chargePointSerialNumber'

Below is a BootNotification causing a 500 error at SteVe

[INFO ] 2015-10-08 12:37:26,264 org.apache.cxf.services.CentralSystemService.CentralSystemServiceSoap12.CentralSystemService - Inbound Message
ID: 5990
Address: http://10.199.0.21:8080/steve/services/CentralSystemService
Encoding: UTF-8
Http-Method: POST
Content-Type: application/soap+xml; charset=utf-8; action="/BootNotification"
Headers: {connection=[close], Content-Length=[1425], content-type=[application/soap+xml; charset=utf-8; action="/BootNotification"], Host=[10.199.0.21:8080], SOAPAction=["/BootN

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
    xmlns:chan="http://schemas.microsoft.com/ws/2005/02/duplex"
    xmlns:cp="urn://Ocpp/Cp/2012/06/"
    xmlns:cs="urn://Ocpp/Cs/2012/06/"
    xmlns:wsa5="http://www.w3.org/2005/08/addressing"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SOAP-ENV:Header>
        <cs:chargeBoxIdentity>sp-btk-01-13</cs:chargeBoxIdentity>
        <wsa5:MessageID>urn:uuid:51023ad8-5cd6-470d-a185-6cce52ab7323</wsa5:MessageID>
        <wsa5:From>
            <wsa5:Address>http://10.150.0.13:8080</wsa5:Address>
        </wsa5:From>
        <wsa5:ReplyTo>
            <wsa5:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa5:Address>
        </wsa5:ReplyTo>
        <wsa5:To SOAP-ENV:mustUnderstand="true">http://10.199.0.21:8080/steve/services/CentralSystemService</wsa5:To>
        <wsa5:Action SOAP-ENV:mustUnderstand="true">/BootNotification</wsa5:Action>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <cs:bootNotificationRequest>
            <cs:chargePointVendor>Schneider Electric</cs:chargePointVendor>
            <cs:chargePointModel>MONOBLOCK</cs:chargePointModel>
            <cs:chargePointSerialNumber>3N144750475B1S1B7551700009</cs:chargePointSerialNumber>
            <cs:chargeBoxSerialNumber>EV.1S22P22R3N14521100020025014D5A</cs:chargeBoxSerialNumber>
            <cs:firmwareVersion>2.7.3.17</cs:firmwareVersion>
        </cs:bootNotificationRequest>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

yelds

at java.lang.Thread.run(Thread.java:745) [?:1.7.0_79]

Caused by: org.jooq.exception.DataAccessException: SQL [update stevedb.chargebox set stevedb.chargebox.ocppProtocol = ?, stevedb.chargebox.chargePointVendor = ?, stevedb.chargebox.chargePointModel = ?, stevedb.chargebox.chargePointSerialNumber = ?, stevedb.chargebox.chargeBoxSerialNumber = ?, stevedb.chargebox.fwVersion = ?, stevedb.chargebox.iccid = ?, stevedb.chargebox.imsi = ?, stevedb.chargebox.meterType = ?, stevedb.chargebox.meterSerialNumber = ?, stevedb.chargebox.lastHeartbeatTimestamp = ? where stevedb.chargebox.chargeBoxId = ?]; Data truncation: Data too long for column 'chargePointSerialNumber' at row 1

API features (OCPI ?)

I do love steve-plugsurfing for "OIOI hacks" possibilities. It is very precious to be able to play remotely with charging stations by the plugsurfing's API.
Unfortunately, I do not think it is possible to do a "simple" merge of steve 1.6 on steve-plugsurfing (1.5).
In the same time OIOI evolves to v4. So steve endpoint should also need to be upgraded.

In my opinion, the best "API" to integrate should be OCPI which seems to become the new industry standard. However this option involves probably a "structural" evolution of steve to integrate emi3 denominations for EVSE.

Custom Namespace ("ns1") for NKT-Devices // Benutzerdefinierter Namensraum ("ns1") für NKT-Ladesäulen

Beim Vergleich der Tests zwischen

  1. SteVe <--> Ladesäulensimulator
  2. SteVe <--> realer NKT-Ladesäule

ist im Wiresharkmitschnitt aufgefallen, das die NKT-Säule im Gegensatz zur Simulation u.a. den Namespace "ns1" (im Head sowie auch im Body) ihres SOAP-Authentifizierungspaketes verwendet.

Im Branch custom-ns-prefix wurden zwar bereits einige dieser Unterschiede angeglichen, allerdings wird der ns1-Namespace bisher nur im Header aber noch nicht im Body berücksichtigt.*

Für die weitere Arbeit ist es erforderlich, das dies weiterverfolgt und der spezielle Namensraum überall verwendet wird.

Store and lock unknow user from past start transaction

When a charging station is offline, it is better for user experience to accept any occp tag. But when the Steve connection is back, the charging station send to the back-office the list of "offline" transactions.

So when a transaction was started by a not registered ocpp tag, the charging station send recurly this transaction which is not accepted by Steve. In this case we need a manual creation of the tag or a clear cache of the charging station.
It should be great if Steve automatically add the tag in database and just after the lock it.

HTTPS implement

Hello,

I would like to know what are the steps and the configuration to make to set up the https. I saw that the configuration file foresees it :

Jetty HTTPS configuration

https.enabled = false
https.port = 8443
keystore.path =
keystore.password =

thank you

disallow connector id 0 reservation

starting with the commit ad17187 we store not only the charge box id in db, but also the connector id that is used for reservation. we did not do that before, because ocpp allows sending a ReserveNow request with connector id 0 (= no specification which connector to reserve). logically, this should not reserve the whole station, but only one connector that was held eligible by the station (taking other reservations, ongoing transactions, status of connectors etc. into account). however, the response to the request does not specify the reserved connector, and therefore we never know. this ambiguity can cause us problems.

for this reason, we should disallow connector id 0. this is a serious restriction, but probably necessary for the overall health of system.

edit: this is particularly relevant to roaming extensions, which work with the concept of connector rather than charging station.

OCPP IDTags expiry date does not match the configuration in the Steve portal

I have the following OCPP ID Tags:
tags
And the SendLocalList command has the following output:

Received: [2,"1f762142-f659-4a2a-a278-5148f00921b3","SendLocalList",{"listVersion":9,"localAuthorizationList":[{"idTag":"user","idTagInfo":{"expiryDate":"2018-03-26T16:44:14.689Z","status":"Accepted"}},{"idTag":"user1","idTagInfo":{"expiryDate":"2018-03-26T16:44:14.689Z","status":"Accepted"}},{"idTag":"user2","idTagInfo":{"expiryDate":"2018-03-26T16:44:14.689Z","status":"Accepted"}}],"updateType":"Full"}]

What could be the problem?
Thank you,
Nuno

Question: SOAP OCPP endpoint

Hi there,
I have been implementing a 1.5 SOAP client (no WS), and all communications initiated by the client to steve went perfect!
However, now I wanted to implement the server-initiated ones. I went into the Operations section but my client was not there. I then looked into the steve code and I think I found those operations are only available for websockets. Is this correct? If that were not the case, how could I introduce the client endpoint? (in the client details, in steve dashboard, the endpoint appears empty).
Thanks in advance!

Store value update at each meter values

For active transaction, in transaction list.
It should be great to update the "stop value field" by the latest meter value.

So we will have a view of delivered power during the transaction.

no String-argument constructor/factory method to deserialize from String value

I have got an error, when I received a probably "not perfectly implemented" MeterValues

[2,"ItsDUO5RdnafWxbit1xjiSqxjqb7P6rh","MeterValues",{"connectorId":2,"transactionId":1,"values":[{"timestamp":"2016-09-17T15:47:37Z","value":["100"]}]}]

[ERROR] 2016-09-19 22:02:19,296 de.rwth.idsg.steve.ocpp.ws.pipeline.Deserializer - Exception occurred
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of ocpp.cs._2012._06.MeterValue$Value: no String-argument constructor/factory method to deserialize from String value ('100')

I think it is due to the form of the value list witch is encapsulated by [ and " (seems allowed by protocol dixit manufacturer). Could you help me to adapt Jackson to deserialise it anyway or catch the exception for simulate metervalue as accepted to the chargepoint (for the moment charge point, retry every minute to resend the meter value waiting for acceptation).

Regards

VendorErrorCode not stored in databas

I thinks there is a small issue with recording of status notifications in database.

File
steve/src/main/java/de/rwth/idsg/steve/repository/impl/OcppServerRepositoryImpl.java

WAS
.set(CONNECTOR_STATUS.VENDOR_ERROR_CODE, p.getErrorCode())
SHOULD BE
.set(CONNECTOR_STATUS.VENDOR_ERROR_CODE, p.getVendorErrorCode())

Cheers

Documentation on extensions

We planned to develop an extension to SteVe.
This extension will add to SteVe the compatibility with a payment operator.

It would be nice to have some technical explanation about how to develop and integrate an extension to SteVe.
I took a quick look on steve-plugsurfing repo, but understand how the extension is integrated is not so easy ...

Apart of this point, having a comprehensive overview of SteVe features would also be very helpful !

WebSocketPingInterval configuration for JSON charge points

Source: "OCPP implementation guide SOAP - RC1 0.6" and in section "8. Configuration"

Currently ping-pong is done at fixed intervals [1] under the covers without allowing the user to change any configuration [2].

One major issue implementing this feature is, how to cleanly seperate between SOAP and JSON logic, (since this feature would only apply to JSON charge points), while keeping the frontend the same.

[1] https://github.com/RWTH-i5-IDSG/steve/blob/master/src/main/java/de/rwth/idsg/steve/config/WebSocketConfiguration.java#L45
[2] https://github.com/RWTH-i5-IDSG/steve/blob/master/src/main/java/de/rwth/idsg/steve/ocpp/ws/AbstractWebSocketEndpoint.java#L92-L96

Connection is not available, request timed out after 30002ms

Hello,
I notice these exceptions for last few days.

Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 -
Connection is not available, request timed out after 30000ms.
    at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:555)
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:188)
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:147)
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:83)
    at org.jooq.impl.DataSourceConnectionProvider.acquire(DataSourceConnectionProvider.java:86)
    ... 36 more

I saw an open issue on HikariCP ((brettwooldridge/HikariCP#1007 we use the same library.

any help is welcomed

OCPP ChangeConfiguration with custom key is broken

OPERATIONS > Change Configuration >
Key Type: Custom
Custom Configuration Key: is not used

It seems to be ocpp/task/ChangeConfigurationTask.java
.withKey(params.getConfKey())
needs to be
.withKey(params.getKey())

mysql.proc no longer exists in mysql version 8.0

the mysql.proc table no longer exists in mysql version 8.0. See here for more details.

Therefore, I couldn't execute below code:

GRANT SELECT ON mysql.proc TO 'steve'@'localhost' IDENTIFIED BY 'changeme';

Does this make any issue?

[feature] desactivate automatic redirection from root of serveur

I would like try to run several instance of the Steve running on the same server (different JAR and database).
In my vision, each JAR will be configured with a different context path with the objective to have different endpoint on the same IP/PORT.

For the moment, steve automatically redirect connection from server root to => serveur:port/context/manager. I think it should be a problem to run several instance of Steve simultaneously. I also suppose that should be easy to remove this automatic redirection.

I there a way to simply desactivate this redirection ?

Custom configuration keys

Some chargepoints manufacturers implement specific "configuration fields. This custom fields are well received by "get configuration" with any selected parameters. But it is actually impossible to send this kind of parameter. A free text field in change configuration keys should be very interesting.

How to keep System running after close Terminal?

Hello, team

Sorry to bother you. We are using Steve system, which is running in cloud. But we found that we have to restart it every time after we close terminal. Wondering if we can make it as a service...even we close the terminal, the system still running...

We start system:

java -jar target/steve.jar

Thanks

NullPointerException for Send Local List

Haven't found a fix yet with the new class structure @goekay hence this issue.

NullPointerException when calling SendLocalList.

[ERROR] 2018-03-13 14:51:31,862 de.rwth.idsg.steve.web.GlobalControllerAdvice - Request: http://127.0.0.1:8080/steve/manager/operations/v1.5/SendLocalList raised following exception. java.lang.NullPointerException: null at de.rwth.idsg.steve.utils.StringUtils.getOperationName(StringUtils.java:21) ~[steve-2.1.0.jar:?] at de.rwth.idsg.steve.ocpp.CommunicationTask.<init>(CommunicationTask.java:78) ~[steve-2.1.0.jar:?] at de.rwth.idsg.steve.ocpp.CommunicationTask.<init>(CommunicationTask.java:55) ~[steve-2.1.0.jar:?] at de.rwth.idsg.steve.ocpp.task.SendLocalListTask.<init>(SendLocalListTask.java:28) ~[steve-2.1.0.jar:?] at de.rwth.idsg.steve.service.ChargePointService15_Client.sendLocalList(ChargePointService15_Client.java:95) ~[steve-2.1.0.jar:?] at de.rwth.idsg.steve.web.controller.Ocpp15Controller.postSendList(Ocpp15Controller.java:368) ~[steve-2.1.0.jar:?]

maximumPoolSize in Hikari

In some case, when Steve is stopped (or crashed), when you restart it and if there if more than 10 charging station reconnecting simultaneously, database access can crash (again) with HikariPoolError.

It seems that can be cause by the maximumPoolSize of Hikari parameters which is by default at 10 and can be enlarge with the spring.datasource.hikari.maximum-pool-size parameters ( exemple jhipster/generator-jhipster#3150).

OCPP 1.6 compatibility

Hello,
I all-ready tried Steve, and it is pretty awesome. I have a question concerning OCPP 1.6 compatibility.

OCPP 1.6 is very near from OCPP 1.5-J. New features concern mainly smart-charging. As specified in protocol definition, only "core" features are mandatory and we allready have them in Steve (1.5).

So, I would like to know if it is possible to update Steve and let it accept OCCP 1.6 charging stations and consider them like a 1.5(-J) charging station.

I am pretty sure there is something to do in /src/main/java/de/rwth/idsg/steve/ocpp/OcppVersion.java but my tests did not work.

Regards

IllegalStateException from Jetty

When the browser requests /steve, and we try to redirect to /steve/manager/home it works in practice. But Jetty throws an exception with the log message

org.eclipse.jetty.server.HttpChannel - Could not send response error 500: java.lang.IllegalStateException: Committed

multiple WebSocket connections

Current implementation assumes only one WebSocket connection for each charge point. In the case of second WebSocket connection, the SessionContextStore overwrites the previous connection! When the latest connection is closed, the previous connection is not visible to the application/user anymore.

FutureResponseContextStore also suffers from that.

Connector status presentation annoyance

When Steve received a status info for connector id 0 (which represents the whole station) which is more recent than the others, this status should override the status of other connectors, and we should only display the status with 0. So, this should not happen:

steve_-steckdosenverwaltung-_2016-03-11_12 55 07

By the same token, if the actual connectors have more recent status, the status for connector id 0 should be filtered out. So, this should not happen:

steve_-steckdosenverwaltung-_2016-03-11_13 01 34

OCPP 1.5 Reservation

Hello,

I just tested the reservation This works well for the first occurrence of the reserved badge (OCPP tag). Once the reserved badge has passed, the point charge remains blocked and no other badge passes or even this booked. The reservation is on the dashboard of the administration but I can not cancel it. So I had to shut down the application and delete the reservation at the database. And once restarted. To conclude from what I understood is that once the badge reserved is accepted, steve fails to close (canceled) the reservation.

If you need the logs, let me know.

Any help will be welcome.
Thank you

Database link error

I followed the readme to install the packege. When I ran "mvn package", got the below messages:

[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< de.rwth.idsg:steve >-------------------------
[INFO] Building steve 3.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- properties-maven-plugin:1.0.0:read-project-properties (default) @ steve ---
[INFO]
[INFO] --- cxf-codegen-plugin:3.2.4:wsdl2java (generate-sources) @ steve ---
[INFO]
[INFO] --- flyway-maven-plugin:4.2.0:migrate (default) @ steve ---
Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
[INFO] Flyway 4.2.0 by Boxfuse
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.264 s
[INFO] Finished at: 2018-04-10T09:54:40+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:4.2.0:migrate (default) on project steve: org.flywaydb.core.internal.dbsupport.FlywaySqlException:
[ERROR] Unable to obtain Jdbc connection from DataSource (jdbc:mysql://localhost:3306/stevedb?useSSL=true&serverTimezone=UTC) for user 'steve': Communications link failure
[ERROR]
[ERROR] The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
[ERROR] -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[ERROR] SQL State : 08S01
[ERROR] Error Code : 0
[ERROR] Message : Communications link failure
[ERROR]
[ERROR] The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
[ERROR] : Path does not chain with any of the trust anchors
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Can someone give some help what's wrong with this?

Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.