Coder Social home page Coder Social logo

steve-community / steve Goto Github PK

View Code? Open in Web Editor NEW
729.0 65.0 364.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 Issues

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

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).

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?

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.

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"}]

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.

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

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.

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?

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)

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

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

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

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

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.

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

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!

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.

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.

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

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>

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

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.

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.

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?

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

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.

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:?]

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 !

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

[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 ?

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

User ID tag is truncated

Go DataManagement -> Users

Create user with tag 12345678901234567890

Final user tag is now: 123456789012345

[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.

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

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

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())

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

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.