steve-community / steve Goto Github PK
View Code? Open in Web Editor NEWSteVe - OCPP server implementation in Java
License: GNU General Public License v3.0
SteVe - OCPP server implementation in Java
License: GNU General Public License v3.0
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.
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.
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?
When Steve received a boot notification for a not registrered SOAP station. Steve send an email "Charging station 'XXXX' is NOT registered.".
This is not working for JSON station and very usefull :(
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
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?
Go DataManagement -> Users
Create user with tag 12345678901234567890
Final user tag is now: 123456789012345
Beim Vergleich der Tests zwischen
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.
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())
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
for example "+49_861_0125*0013", issues in Chargebox Details because ajax mistake?
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
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).
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.
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 :
https.enabled = false
https.port = 8443
keystore.path =
keystore.password =
thank you
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
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)
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
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
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.
I would like to test the new OCPP 1.6 features with Steve with some chargepoint simulator.
What simulator do you recommend?
I have tried with the ChargeTimeEU chargepoint (https://github.com/ChargeTimeEU/Java-OCA-OCPP), that implements version 1.6, but haven't succeeded...
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.
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.
beeing able to sort transactions, e.g., by start time, would be nice.
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:
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:
Should be great to received a mail notification in case of chargepoint deconnection (especially in JSON).
Regards
due to the extra overhead, this profile is left out for release 3.0.0. this issue keeps track of the implementation status and any related discussion.
Even though we fixed issue #16, the connector status summary on homepage is still inaccurate, because used code path is different.
Before fix:
After fix:
But still:
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
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
Create a new record with blocked properties when RFID 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?
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.
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
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
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:
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"}]
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.
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>
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 ?
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:?]
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!
I have the following OCPP ID 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
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:
Thanks
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 !
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.
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
Hello,
Could you detail how works this feature ?
Regards
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.