Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/glurp/ocpp_simulator

Simulation of a electrical Charge Point via OCPP protocol
https://github.com/glurp/ocpp_simulator

emobility ocpp simulator

Last synced: 3 months ago
JSON representation

Simulation of a electrical Charge Point via OCPP protocol

Awesome Lists containing this project

README

        

ocpp_simulator
==============

Simulator of a Charge Point via OCPP protocol

SOAP is used via xml templates, so this gem do not depend on any soap stack ...

5 usages :
* client.rb : invoke CP->CS dialog. Alone can invoke a SOAP request to a scada
* server.rb : serve a CS->CP dialog, as CP. Alone it print request/responses, responses are always status=Accepted.
server api : invoke a client callback foreach request received
see tc.rb for simulate CS
* cp.rb : simulate one Charge Point with multiple connectorId, use client.rb and serveur.rb for
scada dialogs, make some start/stop transactions, some notifications.
* tc.rb : client as scada: send commandes to chargePoints
* parc_sim.rb : simulate a set of charge point.

Some tools developped with the framework:
* hmi_test.rb : simple HMI for simulate a charge point in plaforme : test central ocpp configuration
* tc_batch.rb : loop with some centrale commands for stimulate charge point
* rcrelai.rb : ocpp cs->cp router : receive commands on listen socket and route as client to another IP:port addresse
From/To/MessageId are updated, timing is calculate
News
====

21/06/2017
* dataTransfert in hmi_test
* support https for soap-client

TODO
=====
A mini-scada, for fun, with OCPP and Ruiby/SVG Gui

Client
======

Examples :

>ruby client.rb http://ns8363.ovh.net:6060/ocpp CB1000 bootNotification
>ruby client.rb http://ns8363.ovh.net:6060/ocpp CB1002 hbeat
>ruby client.rb http://ns8363.ovh.net:6060/ocpp CB1002 dataTransfert
>ruby client.rb http://ns8363.ovh.net:6060/ocpp CB1001 meterValue
>ruby client.rb http://ns8363.ovh.net:6060/ocpp CB1000 startTransaction CONID 1
>ruby client.rb http://ns8363.ovh.net:6060/ocpp CB1000 startTransaction CONID 1 TAGID 11223344
>ruby client.rb http://ns8363.ovh.net:6060/ocpp CB1000 stopTransaction TRANSACTIONID 818101

>ruby client.rb http://localhost:8080/ocpp CB1000 reset TYPE Hard
>ruby client.rb http://localhost:8080/ocpp CB1000 remoteStopTransaction TRANSACTIONID 818101

>ruby server.rb 8080 &

>ruby client.rb http://localhost:6061/ocpp CB1000 meterValues CONI 1 V1 1 V2 2 V3 3 V4 4 V5 5 V6 6 V7 7 V8 8 V9 9 V10 10 V11 11 V12 12 V13 13
>ruby client.rb http://localhost:6060/ocpp CB1000 startTransaction CONID 1 TAGID 12345678 METERSTART 11
>ruby client.rb http://localhost:6060/ocpp CB1000 stopTransaction TRANSACIF 765701 METERSTOP 23
>ruby client.rb http://localhost:6060/ocpp CB1000 statusNotification CONID 1 STATUS Faulted ERRORC PowerMeterFailure
>ruby client.rb http://localhost:6060/ocpp CB1000 statusNotification CONID 1 STATUS Faulted ERRORC NoError

Server
=====

traces exemples (with -d) :
```
>>
"connexion... #"
"reading 757..."
Request : {"ACTION"=>"ChangeConfiguration"}
Response: {"ACTION"=>"ChangeConfiguration", "HCHARGEBOXID"=>nil, "HMESSID"=>1383169016773, "HRELMESSIDTO"=>"urn:uuid:dd6f6442-a5e7-4055-84fd-ac9174005674", "HTO"=>"http://ocpp.server.org"}
data : <<
wsa:Action /ChangeConfiguration
wsa:RelatesTo urn:uuid:dd6f6442-a5e7-4055-84fd-ac9174005674
wsa:To http://ocpp.server.org
wsa:MessageID 1383169016773
ocppCs15:status Accepted
>>
"connexion... #"
"reading 875..."
Request : {"ACTION"=>"GetDiagnostics"}
Response: {"ACTION"=>"GetDiagnostics", "HCHARGEBOXID"=>nil, "HMESSID"=>1383169016783, "HRELMESSIDTO"=>"urn:uuid:68f17156-8a2a-4dba-a53e-90e42eb3059c", "HTO"=>"http://ocpp.server.org"}
data : <<
wsa:Action /GetDiagnostics
wsa:RelatesTo urn:uuid:68f17156-8a2a-4dba-a53e-90e42eb3059c
wsa:To http://ocpp.server.org
wsa:MessageID 1383169016783
ocppCs15:fileName toto.html
>>
"connexion... #"
"reading 731..."
Request : {"ACTION"=>"UnlockConnector", "CONID"=>nil}
Response: {"ACTION"=>"UnlockConnector", "HCHARGEBOXID"=>nil, "HMESSID"=>1383169095099, "HRELMESSIDTO"=>"urn:uuid:e245a17c-f301-4815-b2cd-b6d2fba7c39d", "HTO"=>"http://ocpp.server.org"}
data : <<
wsa:Action /UnlockConnector
wsa:RelatesTo urn:uuid:e245a17c-f301-4815-b2cd-b6d2fba7c39d
wsa:To http://ocpp.server.org
wsa:MessageID 1383169095099
ocppCs15:status Accepted
>>
```

CP : simulation of a ChargePoint
===============================
Usage:
> ruby cp.rb name ip port path url_server c1 c2 c3...
> ruby cp.rb SIEM001 localhost 6061 /ocpp http://localhost:9090/ocpp 1 2 3 4

What is simulate:
* boot, lock , ask autorize, start charge, stop charge : autonomous (tempo/random/duration)
* energies imported, send it by meterValues periodicly
* start / stop charge by remote commande (suppose that (transactionId%100) => connectorId !!)
* change Availlibility by remote commande (Inoperative ==> reboot)

What is missing:
* statusNotification with errorCode
* diagnostic, dataTransfered,updateFirmware (!), getConfiguration,reset,
* localList of tag (the tag is alays the same : '12345678')
* reservation

Parc_sim
========
Create a bunch of ChargePoint

> ruby parc_sim.rb nbChargePoint ip port0 path url_server nb_connector_by_cp
> ruby parc.rb 10 localhost 6060 /ocpp http://localhost:9090/ocpp 1 2 3 4

This will create :
* 10 chargePoints, 4 connector on each,
* first ChargePoint will use port 6060, seconde 6061 .. and so on
* all cp will send data to asoap server a locolhost:9090/ocpp

Configuration
=============

All Soap requests/responses are configured in templateOCPP.rb

Client : each SOAP request/response are configured with
* request: xml template to send, each 'value' place are represented with a key
* request: list the key in request (replace strings) to be use a parameters
* response : list of filter of value to extract from request

Server : each SOAP request/response are configured with
* request: hash of 'xpath' to be use for extract data, value of hash are varnames. So a request
received is represented by a hash of varname=>value
* response : (as request of client) : string template, list of key

LIMITATION !!! : all that SOAP stuff work only with xml with statics structure !
* you can't extract a list of tagid received from CS
* you can't send a free list of measures