feat: ensure charging station add op return its station info
[e-mobility-charging-stations-simulator.git] / README.md
CommitLineData
d6b76da3 1<!-- markdownlint-disable-file MD033 MD024 -->
aef08642 2<div align="center">
9e0845f7 3
aef08642 4# [e-Mobility charging stations simulator](https://github.com/sap/e-mobility-charging-stations-simulator)
7dde0b73 5
aef08642
JB
6</div>
7
8<div align="center">
7b0ca523 9
b0b6537f
JB
10[![GitHub Clones](https://img.shields.io/badge/dynamic/json?color=brightgreen&label=Clone&query=count&url=https://gist.githubusercontent.com/jerome-benoit/c7c669b881d5b27dc0b44a639504ff93/raw/clone.json&logo=github)](https://github.com/SAP/e-mobility-charging-stations-simulator/graphs/traffic)
11[![GitHub commit activity (main)](https://img.shields.io/github/commit-activity/m/SAP/e-mobility-charging-stations-simulator/main?color=brightgreen&logo=github)](https://github.com/SAP/e-mobility-charging-stations-simulator/graphs/commit-activity)
f1fded7b 12[![CI workflow](https://github.com/SAP/e-mobility-charging-stations-simulator/actions/workflows/ci.yml/badge.svg)](https://github.com/SAP/e-mobility-charging-stations-simulator/actions/workflows/ci.yml)
4d188eb9 13[![REUSE status](https://api.reuse.software/badge/github.com/SAP/e-mobility-charging-stations-simulator)](https://api.reuse.software/info/github.com/SAP/e-mobility-charging-stations-simulator)
b157a1df 14[![Javascript Standard Style Guide](<https://badgen.net/static/code style/standard/green>)](https://standardjs.com)
0a3d08ef 15
aef08642
JB
16</div>
17
18Simple [node.js](https://nodejs.org/) software to simulate and scale a set of charging stations based on the OCPP-J protocol as part of [SAP e-Mobility](https://www.sap.com/products/scm/e-mobility.html) solution.
19
99a3209e
JB
20## Table of contents
21
99a3209e
JB
22- [Installation](#installation)
23 - [Prerequisites](#prerequisites)
24 - [Windows](#windows)
25 - [MacOSX](#macosx)
26 - [GNU/Linux](#gnulinux)
27 - [Dependencies](#dependencies)
28- [Initial configuration](#initial-configuration)
ea208169 29- [Start simulator](#start-simulator)
99a3209e
JB
30- [Start Web UI](#start-web-ui)
31- [Configuration files syntax](#configuration-files-syntax)
32 - [Charging stations simulator configuration](#charging-stations-simulator-configuration)
33 - [Charging station configuration template](#charging-station-configuration-template)
34 - [Charging station configuration](#charging-station-configuration)
35- [Docker](#docker)
36- [OCPP-J commands supported](#ocpp-j-commands-supported)
37 - [Version 1.6](#version-16)
38 - [Version 2.x.x](#version-2xx)
39- [OCPP-J standard parameters supported](#ocpp-j-standard-parameters-supported)
40 - [Version 1.6](#version-16-1)
41 - [Version 2.x.x](#version-2xx-1)
e35d61ad 42- [UI Protocol](#ui-protocol)
99a3209e
JB
43 - [Websocket Protocol](#websocket-protocol)
44 - [HTTP Protocol](#http-protocol)
45- [Support, Feedback, Contributing](#support-feedback-contributing)
46- [Code of Conduct](#code-of-conduct)
47- [Licensing](#licensing)
48
99a3209e
JB
49## Installation
50
51### Prerequisites
696ce53a 52
5845e83d 53Install the [node.js](https://nodejs.org/) current LTS or superior version runtime environment:
007ee642 54
99a3209e 55#### Windows
696ce53a 56
e7aeea18 57- [Chocolatey](https://chocolatey.org/):
696ce53a
JB
58
59```powershell
5845e83d 60choco install -y nodejs
696ce53a
JB
61```
62
99a3209e 63#### MacOSX
696ce53a 64
e7aeea18 65- [Homebrew](https://brew.sh/):
696ce53a
JB
66
67```shell
5845e83d 68brew install node
696ce53a
JB
69```
70
99a3209e 71#### GNU/Linux
511780c3 72
eef659c1 73- [NodeSource](https://github.com/nodesource/distributions) Node.js Binary Distributions for all supported versions.
511780c3 74
99a3209e 75#### Dependencies
007ee642 76
1a662d29 77Enable corepack if not already done and install latest pnpm version:
5845e83d
JB
78
79```shell
80corepack enable
1a662d29 81corepack prepare pnpm@latest --activate
5845e83d
JB
82```
83
007ee642
JB
84In the repository root, run the following command:
85
86```shell
881f450c 87pnpm install
007ee642
JB
88```
89
90## Initial configuration
91
f80e9e18
JB
92Copy the configuration template file [src/assets/config-template.json](./src/assets/config-template.json) to [src/assets/config.json](./src/assets/config.json).
93Copy the RFID tags template file [src/assets/idtags-template.json](./src/assets/idtags-template.json) to [src/assets/idtags.json](./src/assets/idtags.json).
db70b600 94
352ea56d 95Tweak them to your needs by following the section [configuration files syntax](#configuration-files-syntax): OCPP server supervision URL(s), charging station templates, etc.
007ee642 96
ea208169 97## Start simulator
007ee642 98
a1223736 99Run: `pnpm start`.
007ee642 100
4e3ff94d 101## Start Web UI
007ee642 102
f80e9e18 103See Web UI [README.md](./ui/web/README.md) for more information.
b8cc885d 104
4d3821a2 105## Configuration files syntax
2c28fc83 106
ea208169 107All configuration files are using the JSON standard syntax.
2c28fc83 108
ff82dc5f 109**Configuration files locations**:
2c28fc83 110
f80e9e18
JB
111- charging stations simulator configuration: [src/assets/config.json](./src/assets/config.json);
112- charging station configuration templates: [src/assets/station-templates](./src/assets/station-templates);
113- charging station configurations: [dist/assets/configurations](./dist/assets/configurations);
114- charging station RFID tags lists: [src/assets](./src/assets).
2c28fc83 115
f80e9e18 116The charging stations simulator's configuration parameters must be within the `src/assets/config.json` file. A charging station simulator configuration template file is available at [src/assets/config-template.json](./src/assets/config-template.json).
1816f743 117
f80e9e18 118All charging station configuration templates are in the directory [src/assets/station-templates](./src/assets/station-templates).
1816f743 119
f80e9e18 120A list of RFID tags must be defined for the automatic transaction generator in a file with the default location and name: `src/assets/idtags.json`. A template file is available at [src/assets/idtags-template.json](./src/assets/idtags-template.json).
1816f743
JB
121
122**Configuration files hierarchy and priority**:
123
f80e9e18
JB
1241. charging station configuration: [dist/assets/configurations](./dist/assets/configurations);
1252. charging station configuration template: [src/assets/station-templates](./src/assets/station-templates);
1263. charging stations simulator configuration: [src/assets/config.json](./src/assets/config.json).
511780c3 127
3a28512c 128The charging stations simulator has an automatic configuration files reload feature at change for:
511780c3 129
170bec53 130- charging stations simulator configuration;
1816f743 131- charging station configuration templates;
170bec53 132- charging station authorization RFID tags lists.
2c28fc83 133
f80e9e18 134But the modifications to test have to be done to the files in the build target directory [dist/assets](./dist/assets). Once the modifications are done, they have to be reported to the matching files in the build source directory [src/assets](./src/assets) to ensure they will be taken into account at next build.
e7aeea18 135
170bec53 136### Charging stations simulator configuration
2c28fc83 137
b1d6e944 138**src/assets/config.json**:
2c28fc83 139
da47bc29
JB
140| Key | Value(s) | Default Value | Value type | Description |
141| -------------------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
142| supervisionUrls | | [] | string \| string[] | string or strings array containing global connection URIs to OCPP-J servers |
143| supervisionUrlDistribution | round-robin/random/charging-station-affinity | charging-station-affinity | string | supervision urls distribution policy to simulated charging stations |
144| log | | {<br />"enabled": true,<br />"file": "logs/combined.log",<br />"errorFile": "logs/error.log",<br />"statisticsInterval": 60,<br />"level": "info",<br />"console": false,<br />"format": "simple",<br />"rotate": true<br />} | {<br />enabled?: boolean;<br />file?: string;<br />errorFile?: string;<br />statisticsInterval?: number;<br />level?: string;<br />console?: boolean;<br />format?: string;<br />rotate?: boolean;<br />maxFiles?: string \| number;<br />maxSize?: string \| number;<br />} | Log configuration section:<br />- _enabled_: enable logging<br />- _file_: log file relative path<br />- _errorFile_: error log file relative path<br />- _statisticsInterval_: seconds between charging stations statistics output in the logs<br />- _level_: emerg/alert/crit/error/warning/notice/info/debug [winston](https://github.com/winstonjs/winston) logging level</br >- _console_: output logs on the console<br />- _format_: [winston](https://github.com/winstonjs/winston) log format<br />- _rotate_: enable daily log files rotation<br />- _maxFiles_: maximum number of log files: https://github.com/winstonjs/winston-daily-rotate-file#options<br />- _maxSize_: maximum size of log files in bytes, or units of kb, mb, and gb: https://github.com/winstonjs/winston-daily-rotate-file#options |
145| worker | | {<br />"processType": "workerSet",<br />"startDelay": 500,<br />"elementAddDelay": 0,<br />"elementsPerWorker": 'auto',<br />"poolMinSize": 4,<br />"poolMaxSize": 16<br />} | {<br />processType?: WorkerProcessType;<br />startDelay?: number;<br />elementAddDelay?: number;<br />elementsPerWorker?: number \| 'auto' \| 'all';<br />poolMinSize?: number;<br />poolMaxSize?: number;<br />resourceLimits?: ResourceLimits;<br />} | Worker configuration section:<br />- _processType_: worker threads process type (`workerSet`/`fixedPool`/`dynamicPool`)<br />- _startDelay_: milliseconds to wait at worker threads startup (only for `workerSet` worker threads process type)<br />- _elementAddDelay_: milliseconds to wait between charging station add<br />- _elementsPerWorker_: number of charging stations per worker threads for the `workerSet` process type (`auto` means (number of stations) / (number of CPUs) \* 1.5 if (number of stations) > (number of CPUs), otherwise 1; `all` means a unique worker will run all charging stations)<br />- _poolMinSize_: worker threads pool minimum number of threads</br >- _poolMaxSize_: worker threads pool maximum number of threads<br />- _resourceLimits_: worker threads [resource limits](https://nodejs.org/api/worker_threads.html#new-workerfilename-options) object option |
146| uiServer | | {<br />"enabled": false,<br />"type": "ws",<br />"version": "1.1",<br />"options": {<br />"host": "localhost",<br />"port": 8080<br />}<br />} | {<br />enabled?: boolean;<br />type?: ApplicationProtocol;<br />version?: ApplicationProtocolVersion;<br />options?: ServerOptions;<br />authentication?: {<br />enabled: boolean;<br />type: AuthenticationType;<br />username?: string;<br />password?: string;<br />}<br />} | UI server configuration section:<br />- _enabled_: enable UI server<br />- _type_: 'http' or 'ws'<br />- _version_: HTTP version '1.1' or '2.0'<br />- _options_: node.js net module [listen options](https://nodejs.org/api/net.html#serverlistenoptions-callback)<br />- _authentication_: authentication type configuration section |
147| performanceStorage | | {<br />"enabled": true,<br />"type": "none",<br />} | {<br />enabled?: boolean;<br />type?: string;<br />uri?: string;<br />} | Performance storage configuration section:<br />- _enabled_: enable performance storage<br />- _type_: 'jsonfile', 'mongodb' or 'none'<br />- _uri_: storage URI |
148| stationTemplateUrls | | {}[] | {<br />file: string;<br />numberOfStations: number;<br />}[] | array of charging station configuration templates URIs configuration section (charging station configuration template file name and number of stations) |
e7aeea18 149
d6b76da3 150#### Worker process model
a6b3c6c3
JB
151
152- **workerSet**:
1d8f226b 153 Worker set executing each a fixed number (elementsPerWorker) of simulated charging stations from the total
a6b3c6c3 154
1d8f226b
JB
155- **fixedPool**:
156 Fixedly sized worker pool executing a fixed total number of simulated charging stations
a6b3c6c3 157
56e2e1ab 158- **dynamicPool** (experimental):
1d8f226b 159 Dynamically sized worker pool executing a fixed total number of simulated charging stations
a6b3c6c3 160
1816f743
JB
161### Charging station configuration template
162
afccb423 163**src/assets/station-templates/\<name\>.json**:
1816f743 164
f80e9e18
JB
165| Key | Value(s) | Default Value | Value type | Description |
166| ---------------------------------------------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
167| supervisionUrls | | [] | string \| string[] | string or strings array containing connection URIs to OCPP-J servers |
168| supervisionUser | | undefined | string | basic HTTP authentication user to OCPP-J server |
169| supervisionPassword | | undefined | string | basic HTTP authentication password to OCPP-J server |
170| supervisionUrlOcppConfiguration | true/false | false | boolean | enable supervision URL configuration via a vendor OCPP parameter key |
171| supervisionUrlOcppKey | | 'ConnectionUrl' | string | the vendor string that will be used as a vendor OCPP parameter key to set the supervision URL |
172| autoStart | true/false | true | boolean | enable automatic start of added charging station from template |
173| ocppVersion | 1.6/2.0/2.0.1 | 1.6 | string | OCPP version |
174| ocppProtocol | json | json | string | OCPP protocol |
175| ocppStrictCompliance | true/false | true | boolean | enable strict adherence to the OCPP version and protocol specifications with OCPP commands PDU validation against [OCA](https://www.openchargealliance.org/) JSON schemas |
176| ocppPersistentConfiguration | true/false | true | boolean | enable persistent OCPP parameters storage by charging stations 'hashId'. The persistency is ensured by the charging stations configuration files in [dist/assets/configurations](./dist/assets/configurations) |
177| stationInfoPersistentConfiguration | true/false | true | boolean | enable persistent station information and specifications storage by charging stations 'hashId'. The persistency is ensured by the charging stations configuration files in [dist/assets/configurations](./dist/assets/configurations) |
178| automaticTransactionGeneratorPersistentConfiguration | true/false | true | boolean | enable persistent automatic transaction generator configuration storage by charging stations 'hashId'. The persistency is ensured by the charging stations configuration files in [dist/assets/configurations](./dist/assets/configurations) |
179| wsOptions | | {} | ClientOptions & ClientRequestArgs | [ws](https://github.com/websockets/ws) and node.js [http](https://nodejs.org/api/http.html) clients options intersection |
180| idTagsFile | | undefined | string | RFID tags list file relative to [src/assets](./src/assets) path |
181| baseName | | undefined | string | base name to build charging stations id |
182| nameSuffix | | undefined | string | name suffix to build charging stations id |
183| fixedName | true/false | false | boolean | use the 'baseName' as the charging stations unique name |
184| chargePointModel | | undefined | string | charging stations model |
185| chargePointVendor | | undefined | string | charging stations vendor |
186| chargePointSerialNumberPrefix | | undefined | string | charge point serial number prefix |
187| chargeBoxSerialNumberPrefix | | undefined | string | charge box serial number prefix (deprecated since OCPP 1.6) |
188| firmwareVersionPattern | | Semantic versioning regular expression: https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string | string | charging stations firmware version pattern |
189| firmwareVersion | | undefined | string | charging stations firmware version |
190| power | | | float \| float[] | charging stations maximum power value(s) |
191| powerSharedByConnectors | true/false | false | boolean | charging stations power shared by its connectors |
192| powerUnit | W/kW | W | string | charging stations power unit |
193| currentOutType | AC/DC | AC | string | charging stations current out type |
194| voltageOut | | AC:230/DC:400 | integer | charging stations voltage out |
195| numberOfPhases | 0/1/3 | AC:3/DC:0 | integer | charging stations number of phase(s) |
196| numberOfConnectors | | | integer \| integer[] | charging stations number of connector(s) |
197| useConnectorId0 | true/false | true | boolean | use connector id 0 definition from the charging station configuration template |
198| randomConnectors | true/false | false | boolean | randomize runtime connector id affectation from the connector id definition in charging station configuration template |
199| resetTime | | 60 | integer | seconds to wait before the charging stations come back at reset |
200| autoRegister | true/false | false | boolean | set charging stations as registered at boot notification for testing purpose |
201| autoReconnectMaxRetries | | -1 (unlimited) | integer | connection retries to the OCPP-J server |
202| reconnectExponentialDelay | true/false | false | boolean | connection delay retry to the OCPP-J server |
203| registrationMaxRetries | | -1 (unlimited) | integer | charging stations boot notification retries |
204| amperageLimitationOcppKey | | undefined | string | charging stations OCPP parameter key used to set the amperage limit, per phase for each connector on AC and global for DC |
205| amperageLimitationUnit | A/cA/dA/mA | A | string | charging stations amperage limit unit |
206| enableStatistics | true/false | false | boolean | enable charging stations statistics |
207| remoteAuthorization | true/false | true | boolean | enable RFID tags remote authorization |
208| beginEndMeterValues | true/false | false | boolean | enable Transaction.{Begin,End} MeterValues |
209| outOfOrderEndMeterValues | true/false | false | boolean | send Transaction.End MeterValues out of order. Need to relax OCPP specifications strict compliance ('ocppStrictCompliance' parameter) |
210| meteringPerTransaction | true/false | true | boolean | enable metering history on a per transaction basis |
211| transactionDataMeterValues | true/false | false | boolean | enable transaction data MeterValues at stop transaction |
212| stopTransactionsOnStopped | true/false | true | boolean | enable stop transactions on charging station stop |
213| mainVoltageMeterValues | true/false | true | boolean | include charging stations main voltage MeterValues on three phased charging stations |
214| phaseLineToLineVoltageMeterValues | true/false | false | boolean | include charging stations line to line voltage MeterValues on three phased charging stations |
215| customValueLimitationMeterValues | true/false | true | boolean | enable limitation on custom fluctuated value in MeterValues |
216| firmwareUpgrade | | {<br />"versionUpgrade": {<br />"step": 1<br />},<br />"reset": true<br />} | {<br />versionUpgrade?: {<br />patternGroup?: number;<br />step?: number;<br />};<br />reset?: boolean;<br />failureStatus?: 'DownloadFailed' \| 'InstallationFailed';<br />} | Configuration section for simulating firmware upgrade support. |
217| commandsSupport | | {<br />"incomingCommands": {},<br />"outgoingCommands": {}<br />} | {<br /> incomingCommands: Record<IncomingRequestCommand, boolean>;<br />outgoingCommands?: Record<RequestCommand, boolean>;<br />} | Configuration section for OCPP commands support. Empty section or subsections means all implemented OCPP commands are supported |
218| messageTriggerSupport | | {} | Record<MessageTrigger, boolean> | Configuration section for OCPP commands trigger support. Empty section means all implemented OCPP trigger commands are supported |
219| Configuration | | | ChargingStationOcppConfiguration | charging stations OCPP parameters configuration section |
220| AutomaticTransactionGenerator | | | AutomaticTransactionGeneratorConfiguration | charging stations ATG configuration section |
221| Connectors | | | Record<string, ConnectorStatus> | charging stations connectors configuration section |
222| Evses | | | Record<string, EvseTemplate> | charging stations EVSEs configuration section |
c94a349a 223
3e1dfe42 224#### Configuration section syntax example
c94a349a
JB
225
226```json
0302da79 227 "Configuration": {
c94a349a
JB
228 "configurationKey": [
229 ...
230 {
231 "key": "StandardKey",
232 "readonly": false,
233 "value": "StandardValue",
234 "visible": true,
235 "reboot": false
236 },
237 ...
238 {
239 "key": "VendorKey",
240 "readonly": false,
241 "value": "VendorValue",
242 "visible": false,
243 "reboot": true
244 },
245 ...
246 ]
247 }
248```
249
3e1dfe42 250#### AutomaticTransactionGenerator section syntax example
c94a349a 251
20f09970 252##### Type definition:
c72f6634
JB
253
254```ts
255type AutomaticTransactionGeneratorConfiguration = {
66a7748d
JB
256 enable: boolean
257 minDuration: number
258 maxDuration: number
259 minDelayBetweenTwoTransactions: number
260 maxDelayBetweenTwoTransactions: number
261 probabilityOfStart: number
262 stopAfterHours: number
46a830d2 263 stopAbsoluteDuration: boolean
66a7748d
JB
264 requireAuthorize?: boolean
265 idTagDistribution?: 'random' | 'round-robin' | 'connector-affinity'
266}
c72f6634
JB
267```
268
20f09970 269##### Example:
c72f6634 270
c94a349a 271```json
0302da79 272 "AutomaticTransactionGenerator": {
c94a349a
JB
273 "enable": false,
274 "minDuration": 60,
275 "maxDuration": 80,
276 "minDelayBetweenTwoTransactions": 15,
277 "maxDelayBetweenTwoTransactions": 30,
278 "probabilityOfStart": 1,
279 "stopAfterHours": 0.3,
c72f6634
JB
280 "requireAuthorize": true,
281 "idTagDistribution": "random"
c94a349a
JB
282 }
283```
e7aeea18 284
3e1dfe42 285#### Connectors section syntax example
c94a349a
JB
286
287```json
0302da79 288 "Connectors": {
c94a349a
JB
289 "0": {},
290 "1": {
291 "bootStatus": "Available",
292 "MeterValues": [
9bd87386
JB
293 ...
294 {
295 "unit": "W",
296 "measurand": "Power.Active.Import",
297 "phase": "L1-N",
298 "value": "5000",
299 "fluctuationPercent": "10"
300 },
c94a349a
JB
301 ...
302 {
303 "unit": "A",
860ef183
JB
304 "measurand": "Current.Import",
305 "minimum": "0.5"
c94a349a
JB
306 },
307 ...
308 {
309 "unit": "Wh"
310 },
311 ...
312 ]
313 }
314 },
315```
316
3e1dfe42
JB
317#### Evses section syntax example
318
319```json
320 "Evses": {
321 "0": {
322 "Connectors": {
323 "0": {}
324 }
325 },
326 "1": {
327 "Connectors": {
328 "1": {
329 "bootStatus": "Available",
330 "MeterValues": [
331 ...
332 {
333 "unit": "W",
334 "measurand": "Power.Active.Import",
335 "phase": "L1-N",
336 "value": "5000",
337 "fluctuationPercent": "10"
338 },
339 ...
340 {
341 "unit": "A",
342 "measurand": "Current.Import",
343 "minimum": "0.5"
344 },
345 ...
346 {
347 "unit": "Wh"
348 },
349 ...
350 ]
351 }
352 }
353 }
354 },
355```
356
1816f743
JB
357### Charging station configuration
358
1c51fd1d 359**dist/assets/configurations/\<hashId\>.json**:
1816f743 360
a9ec2018 361The charging station configuration file is automatically generated at startup from the charging station configuration template file and is persistent.
1816f743
JB
362
363The charging station configuration file content can be regenerated partially on matching charging station configuration template file changes. The charging station serial number is kept unchanged.
364
09810639 365#### stationInfo section (optional)
1816f743
JB
366
367The syntax is similar to charging station configuration template with some added fields like the charging station id (name) and the 'Configuration' section removed.
368
10211789 369That section is overwritten on matching charging station configuration template file changes.
1816f743 370
10211789
JB
371#### connectorsStatus section
372
373The syntax is similar to charging station configuration template 'Connectors' section with some added fields.
374
375That section is overwritten on matching charging station configuration template file changes.
1816f743 376
0aa874ce
JB
377#### evsesStatus section
378
379The syntax is similar to charging station configuration template 'Evses' section with some added fields.
380
381That section is overwritten on matching charging station configuration template file changes.
382
09810639 383#### automaticTransactionGenerator section (optional)
3a28512c
JB
384
385The syntax is similar to the charging station configuration template 'AutomaticTransactionGenerator' section.
386
10211789
JB
387That section is overwritten on matching charging station configuration template file changes.
388
389#### automaticTransactionGeneratorStatuses section
390
391That section is not overwritten on matching charging station configuration template file changes.
392
09810639 393#### configurationKey section (optional)
10211789
JB
394
395The syntax is similar to the charging station configuration template 'Configuration' section.
396
397That section is not overwritten on matching charging station configuration template file changes.
398
6f0ec20e
JB
399## Docker
400
401In the [docker](./docker) folder:
402
81ed2a48 403```shell
6f0ec20e
JB
404make
405```
406
673dceeb 407<!-- Or with the optional git submodules:
6f0ec20e 408
81ed2a48 409```shell
bfcad885 410make SUBMODULES_INIT=true
673dceeb 411``` -->
6f0ec20e
JB
412
413## OCPP-J commands supported
c94a349a
JB
414
415### Version 1.6
416
c56d42f1 417#### Core Profile
6f0ec20e 418
778f7924
JB
419- :white_check_mark: Authorize
420- :white_check_mark: BootNotification
421- :white_check_mark: ChangeAvailability
422- :white_check_mark: ChangeConfiguration
423- :white_check_mark: ClearCache
91a7d3ea 424- :white_check_mark: DataTransfer
778f7924
JB
425- :white_check_mark: GetConfiguration
426- :white_check_mark: Heartbeat
427- :white_check_mark: MeterValues
428- :white_check_mark: RemoteStartTransaction
429- :white_check_mark: RemoteStopTransaction
430- :white_check_mark: Reset
431- :white_check_mark: StartTransaction
432- :white_check_mark: StatusNotification
433- :white_check_mark: StopTransaction
434- :white_check_mark: UnlockConnector
6f0ec20e 435
c56d42f1 436#### Firmware Management Profile
6f0ec20e 437
b652b0c3 438- :white_check_mark: GetDiagnostics
d50343bd 439- :white_check_mark: DiagnosticsStatusNotification
c9a4f9ea
JB
440- :white_check_mark: FirmwareStatusNotification
441- :white_check_mark: UpdateFirmware
6f0ec20e 442
c56d42f1 443#### Local Auth List Management Profile
6f0ec20e 444
9e1b12e4
JB
445- :x: GetLocalListVersion
446- :x: SendLocalList
6f0ec20e 447
c56d42f1 448#### Reservation Profile
6f0ec20e 449
24578c31
JB
450- :white_check_mark: CancelReservation
451- :white_check_mark: ReserveNow
6f0ec20e 452
c56d42f1 453#### Smart Charging Profile
6f0ec20e 454
778f7924 455- :white_check_mark: ClearChargingProfile
e1d9a0f4 456- :white_check_mark: GetCompositeSchedule
778f7924 457- :white_check_mark: SetChargingProfile
6f0ec20e 458
c56d42f1 459#### Remote Trigger Profile
6f0ec20e 460
802cfa13 461- :white_check_mark: TriggerMessage
7dde0b73 462
d4371252
JB
463### Version 2.x.x
464
465#### Provisioning
466
467- :white_check_mark: BootNotification
468
bc950df1 469#### Authorization
d4371252
JB
470
471- :white_check_mark: ClearCache
472
473#### Availability
474
475- :white_check_mark: StatusNotification
476- :white_check_mark: Heartbeat
477
7e1dc878
JB
478## OCPP-J standard parameters supported
479
3a28512c 480All kind of OCPP parameters are supported in charging station configuration or charging station configuration template file. The list here mention the standard ones also handled automatically in the simulator.
7e1dc878
JB
481
482### Version 1.6
483
c56d42f1 484#### Core Profile
7e1dc878
JB
485
486- :white_check_mark: AuthorizeRemoteTxRequests (type: boolean) (units: -)
487- :x: ClockAlignedDataInterval (type: integer) (units: seconds)
291cb255 488- :white_check_mark: ConnectionTimeOut (type: integer) (units: seconds)
7e1dc878
JB
489- :x: GetConfigurationMaxKeys (type: integer) (units: -)
490- :white_check_mark: HeartbeatInterval (type: integer) (units: seconds)
491- :x: LocalAuthorizeOffline (type: boolean) (units: -)
492- :x: LocalPreAuthorize (type: boolean) (units: -)
493- :x: MeterValuesAlignedData (type: CSL) (units: -)
494- :white_check_mark: MeterValuesSampledData (type: CSL) (units: -)
495- :white_check_mark: MeterValueSampleInterval (type: integer) (units: seconds)
496- :white_check_mark: NumberOfConnectors (type: integer) (units: -)
497- :x: ResetRetries (type: integer) (units: times)
498- :white_check_mark: ConnectorPhaseRotation (type: CSL) (units: -)
499- :x: StopTransactionOnEVSideDisconnect (type: boolean) (units: -)
500- :x: StopTransactionOnInvalidId (type: boolean) (units: -)
501- :x: StopTxnAlignedData (type: CSL) (units: -)
502- :x: StopTxnSampledData (type: CSL) (units: -)
36f6a92e 503- :white_check_mark: SupportedFeatureProfiles (type: CSL) (units: -)
7e1dc878
JB
504- :x: TransactionMessageAttempts (type: integer) (units: times)
505- :x: TransactionMessageRetryInterval (type: integer) (units: seconds)
506- :x: UnlockConnectorOnEVSideDisconnect (type: boolean) (units: -)
36f6a92e 507- :white_check_mark: WebSocketPingInterval (type: integer) (units: seconds)
7e1dc878 508
c56d42f1 509#### Firmware Management Profile
7e1dc878 510
e7aeea18 511- _none_
7e1dc878 512
c56d42f1 513#### Local Auth List Management Profile
7e1dc878 514
36f6a92e 515- :white_check_mark: LocalAuthListEnabled (type: boolean) (units: -)
7e1dc878
JB
516- :x: LocalAuthListMaxLength (type: integer) (units: -)
517- :x: SendLocalListMaxLength (type: integer) (units: -)
518
c56d42f1 519#### Reservation Profile
7e1dc878 520
66dd3447 521- :white_check_mark: ReserveConnectorZeroSupported (type: boolean) (units: -)
7e1dc878 522
c56d42f1 523#### Smart Charging Profile
7e1dc878
JB
524
525- :x: ChargeProfileMaxStackLevel (type: integer) (units: -)
526- :x: ChargingScheduleAllowedChargingRateUnit (type: CSL) (units: -)
527- :x: ChargingScheduleMaxPeriods (type: integer) (units: -)
528- :x: MaxChargingProfilesInstalled (type: integer) (units: -)
529
c56d42f1 530#### Remote Trigger Profile
7e1dc878 531
e7aeea18 532- _none_
7e1dc878 533
d4371252
JB
534### Version 2.x.x
535
e35d61ad 536## UI Protocol
32de5a57 537
6ca7a41d 538Protocol to control the simulator via a Websocket or HTTP server:
32de5a57 539
5d8bbc63
JB
540```mermaid
541sequenceDiagram
542Client->>UI Server: request
543UI Server->>Client: response
738acbf7 544Note over UI Server,Client: HTTP or Websocket
5d8bbc63
JB
545```
546
02cde3b7 547### Websocket Protocol
32de5a57 548
02cde3b7 549SRPC protocol over Websocket. PDU stands for 'Protocol Data Unit'.
32de5a57 550
03ebf4c1
JB
551- Request:
552 [`uuid`, `ProcedureName`, `PDU`]
553 `uuid`: String uniquely representing this request
554 `ProcedureName`: The procedure to run on the simulator
555 `PDU`: The parameters for said procedure
32de5a57 556
03ebf4c1
JB
557- Response:
558 [`uuid`, `PDU`]
559 `uuid`: String uniquely linking the response to the request
02cde3b7 560 `PDU`: Response parameters to requested procedure
32de5a57 561
c03dea88 562To learn how to use the Websocket protocol to pilot the simulator, an [Insomnia](https://insomnia.rest/) Websocket requests collection is available in [src/assets/ui-protocol](./src/assets/ui-protocol) directory.
97c19696 563
d3140adc 564#### Version 0.0.1
4e3ff94d 565
02cde3b7 566Set the Websocket header _Sec-Websocket-Protocol_ to `ui0.0.1`.
4e3ff94d 567
d3140adc 568##### Procedures
32de5a57 569
a997fb63
JB
570###### Simulator State
571
572- Request:
573 `ProcedureName`: 'simulatorState'
574 `PDU`: {}
575
576- Response:
577 `PDU`: {
df893e68 578 `status`: 'success' | 'failure',
a997fb63 579 `state`: {
df893e68
JB
580 `version`: string,
581 `started`: boolean,
a997fb63
JB
582 `templateStatistics`: Record<string, TemplateStatistics>
583 }
584 }
585
d3140adc 586###### Start Simulator
5612b691 587
03ebf4c1
JB
588- Request:
589 `ProcedureName`: 'startSimulator'
590 `PDU`: {}
5612b691 591
03ebf4c1
JB
592- Response:
593 `PDU`: {
6ca7a41d 594 `status`: 'success' | 'failure'
03ebf4c1 595 }
5612b691 596
d3140adc 597###### Stop Simulator
5612b691 598
03ebf4c1
JB
599- Request:
600 `ProcedureName`: 'stopSimulator'
601 `PDU`: {}
5612b691 602
03ebf4c1
JB
603- Response:
604 `PDU`: {
6ca7a41d
JB
605 `status`: 'success' | 'failure'
606 }
607
608###### List Charging Station Templates
609
610- Request:
611 `ProcedureName`: 'listTemplates'
612 `PDU`: {}
613
614- Response:
615 `PDU`: {
616 `status`: 'success' | 'failure',
617 `templates`: string[]
618 }
619
620###### Add Charging Stations
621
622- Request:
623 `ProcedureName`: 'addChargingStations'
624 `PDU`: {
625 `template`: string,
95c7658e
JB
626 `numberOfStations`: number,
627 `options?`: {
6eb63615 628 `supervisionUrls?`: string | string[],
9a08f38e 629 `persistentConfiguration?`: boolean,
52c58949 630 `autoStart?`: boolean,
43e04bb7
JB
631 `autoRegister?`: boolean,
632 `enableStatistics?`: boolean,
1feac591
JB
633 `ocppStrictCompliance?`: boolean,
634 `stopTransactionsOnStopped?`: boolean
95c7658e 635 }
6ca7a41d
JB
636 }
637
638- Response:
639 `PDU`: {
640 `status`: 'success' | 'failure'
3b09e788
JB
641 `hashIdsSucceeded`: charging station unique identifier strings array (optional),
642 `hashIdsFailed`: charging station unique identifier strings array (optional)
03ebf4c1 643 }
5612b691 644
09e5a7a8
JB
645###### Delete Charging Stations
646
647- Request:
648 `ProcedureName`: 'deleteChargingStations'
649 `PDU`: {
650 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
651 `deleteConfiguration?`: boolean
652 }
653
654- Response:
655 `PDU`: {
656 `status`: 'success' | 'failure',
657 `hashIdsSucceeded`: charging station unique identifier strings array,
658 `hashIdsFailed`: charging station unique identifier strings array (optional),
659 `responsesFailed`: failed responses payload array (optional)
660 }
661
1e534dab
JB
662###### Set Charging Station Supervision Url
663
664- Request:
665 `ProcedureName`: 'setSupervisionUrl'
666 `PDU`: {
667 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
a66bbcfe 668 `url`: string
1e534dab
JB
669 }
670
671- Response:
672 `PDU`: {
673 `status`: 'success' | 'failure',
674 `hashIdsSucceeded`: charging station unique identifier strings array,
675 `hashIdsFailed`: charging station unique identifier strings array (optional),
676 `responsesFailed`: failed responses payload array (optional)
677 }
678
a66bbcfe
JB
679###### Performance Statistics
680
681- Request:
682 `ProcedureName`: 'performanceStatistics'
683 `PDU`: {}
684
685- Response:
686 `PDU`: {
df893e68 687 `status`: 'success' | 'failure',
a66bbcfe
JB
688 `performanceStatistics`: Statistics[]
689 }
690
d3140adc 691###### List Charging Stations
32de5a57 692
03ebf4c1
JB
693- Request:
694 `ProcedureName`: 'listChargingStations'
695 `PDU`: {}
32de5a57 696
03ebf4c1
JB
697- Response:
698 `PDU`: {
6ca7a41d
JB
699 `status`: 'success' | 'failure',
700 `chargingStations`: ChargingStationData[]
03ebf4c1 701 }
32de5a57 702
d3140adc 703###### Start Charging Station
80a3704c 704
03ebf4c1
JB
705- Request:
706 `ProcedureName`: 'startChargingStation'
707 `PDU`: {
6ca7a41d 708 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
03ebf4c1 709 }
80a3704c 710
03ebf4c1
JB
711- Response:
712 `PDU`: {
6ca7a41d
JB
713 `status`: 'success' | 'failure',
714 `hashIdsSucceeded`: charging station unique identifier strings array,
715 `hashIdsFailed`: charging station unique identifier strings array (optional),
716 `responsesFailed`: failed responses payload array (optional)
03ebf4c1 717 }
80a3704c 718
d3140adc 719###### Stop Charging Station
80a3704c 720
03ebf4c1
JB
721- Request:
722 `ProcedureName`: 'stopChargingStation'
723 `PDU`: {
6ca7a41d 724 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
03ebf4c1 725 }
80a3704c 726
03ebf4c1
JB
727- Response:
728 `PDU`: {
6ca7a41d
JB
729 `status`: 'success' | 'failure',
730 `hashIdsSucceeded`: charging station unique identifier strings array,
731 `hashIdsFailed`: charging station unique identifier strings array (optional),
732 `responsesFailed`: failed responses payload array (optional)
03ebf4c1 733 }
80a3704c 734
d3140adc 735###### Open Connection
e4df816e 736
03ebf4c1
JB
737- Request:
738 `ProcedureName`: 'openConnection'
739 `PDU`: {
6ca7a41d 740 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
03ebf4c1 741 }
e4df816e 742
03ebf4c1
JB
743- Response:
744 `PDU`: {
6ca7a41d
JB
745 `status`: 'success' | 'failure',
746 `hashIdsSucceeded`: charging station unique identifier strings array,
747 `hashIdsFailed`: charging station unique identifier strings array (optional),
748 `responsesFailed`: failed responses payload array (optional)
03ebf4c1 749 }
e4df816e 750
d3140adc 751###### Close Connection
e4df816e 752
03ebf4c1
JB
753- Request:
754 `ProcedureName`: 'closeConnection'
755 `PDU`: {
6ca7a41d 756 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
03ebf4c1
JB
757 }
758
759- Response:
760 `PDU`: {
6ca7a41d
JB
761 `status`: 'success' | 'failure',
762 `hashIdsSucceeded`: charging station unique identifier strings array,
763 `hashIdsFailed`: charging station unique identifier strings array (optional),
764 `responsesFailed`: failed responses payload array (optional)
853ed24a
JB
765 }
766
767###### Start Automatic Transaction Generator
768
769- Request:
770 `ProcedureName`: 'startAutomaticTransactionGenerator'
771 `PDU`: {
6ca7a41d
JB
772 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
773 `connectorIds`: connector id integer array (optional, default: all connectors)
853ed24a
JB
774 }
775
776- Response:
777 `PDU`: {
6ca7a41d
JB
778 `status`: 'success' | 'failure',
779 `hashIdsSucceeded`: charging station unique identifier strings array,
780 `hashIdsFailed`: charging station unique identifier strings array (optional),
781 `responsesFailed`: failed responses payload array (optional)
853ed24a
JB
782 }
783
784###### Stop Automatic Transaction Generator
785
786- Request:
787 `ProcedureName`: 'stopAutomaticTransactionGenerator'
788 `PDU`: {
6ca7a41d
JB
789 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
790 `connectorIds`: connector id integer array (optional, default: all connectors)
853ed24a
JB
791 }
792
793- Response:
794 `PDU`: {
6ca7a41d
JB
795 `status`: 'success' | 'failure',
796 `hashIdsSucceeded`: charging station unique identifier strings array,
797 `hashIdsFailed`: charging station unique identifier strings array (optional),
798 `responsesFailed`: failed responses payload array (optional)
03ebf4c1
JB
799 }
800
91a7d3ea 801###### OCPP commands trigger
a9ed42b2 802
82cbef8d
JB
803- Request:
804 `ProcedureName`: 'commandName' (the OCPP command name in camel case)
805 `PDU`: {
806 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
807 ...`commandPayload`
1e534dab 808 } (the OCPP command payload with some optional fields added to target the simulated charging stations)
10db00b2 809
82cbef8d 810- Response:
7f9d5299 811 `PDU`: {
82cbef8d
JB
812 `status`: 'success' | 'failure',
813 `hashIdsSucceeded`: charging station unique identifier strings array,
814 `hashIdsFailed`: charging station unique identifier strings array (optional),
815 `responsesFailed`: failed responses payload array (optional)
1e534dab 816 }
10db00b2 817
91a7d3ea 818Examples:
10db00b2 819
91a7d3ea 820- **Start Transaction**
a9ed42b2 821
91a7d3ea
JB
822 - Request:
823 `ProcedureName`: 'startTransaction'
824 `PDU`: {
6ca7a41d
JB
825 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
826 `connectorId`: connector id integer,
827 `idTag`: RFID tag string
91a7d3ea
JB
828 }
829
830 - Response:
831 `PDU`: {
6ca7a41d
JB
832 `status`: 'success' | 'failure',
833 `hashIdsSucceeded`: charging station unique identifier strings array,
834 `hashIdsFailed`: charging station unique identifier strings array (optional),
835 `responsesFailed`: failed responses payload array (optional)
91a7d3ea
JB
836 }
837
838- **Stop Transaction**
839
840 - Request:
841 `ProcedureName`: 'stopTransaction'
842 `PDU`: {
6ca7a41d
JB
843 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
844 `transactionId`: transaction id integer
91a7d3ea
JB
845 }
846
847 - Response:
848 `PDU`: {
1e534dab 849 `status`: 'success' | 'failure',
6ca7a41d
JB
850 `hashIdsSucceeded`: charging station unique identifier strings array,
851 `hashIdsFailed`: charging station unique identifier strings array (optional),
852 `responsesFailed`: failed responses payload array (optional)
91a7d3ea
JB
853 }
854
855- **Status Notification**
856
857 - Request:
82cbef8d 858 `ProcedureName`: 'statusNotification'
91a7d3ea 859 `PDU`: {
6ca7a41d
JB
860 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
861 `connectorId`: connector id integer,
862 `errorCode`: connector error code,
863 `status`: connector status
91a7d3ea
JB
864 }
865
866 - Response:
867 `PDU`: {
6ca7a41d
JB
868 `status`: 'success' | 'failure',
869 `hashIdsSucceeded`: charging station unique identifier strings array,
870 `hashIdsFailed`: charging station unique identifier strings array (optional),
871 `responsesFailed`: failed responses payload array (optional)
91a7d3ea
JB
872 }
873
874- **Heartbeat**
875
876 - Request:
82cbef8d 877 `ProcedureName`: 'heartbeat'
91a7d3ea 878 `PDU`: {
6ca7a41d 879 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
91a7d3ea
JB
880 }
881
882 - Response:
883 `PDU`: {
6ca7a41d
JB
884 `status`: 'success' | 'failure',
885 `hashIdsSucceeded`: charging station unique identifier strings array,
886 `hashIdsFailed`: charging station unique identifier strings array (optional),
887 `responsesFailed`: failed responses payload array (optional)
91a7d3ea 888 }
a9ed42b2 889
6ca7a41d
JB
890### HTTP Protocol
891
892To learn how to use the HTTP protocol to pilot the simulator, an [Insomnia](https://insomnia.rest/) HTTP requests collection is available in [src/assets/ui-protocol](./src/assets/ui-protocol) directory.
893
251fff5c 894## Support, Feedback, Contributing
7dde0b73 895
f80e9e18 896This project is open to feature requests/suggestions, bug reports etc. via [GitHub issues](https://github.com/SAP/e-mobility-charging-stations-simulator/issues). Contribution and feedback are encouraged and always welcome. For more information about how to contribute, the project structure, as well as additional contribution information, see our [Contribution Guidelines](./CONTRIBUTING.md).
7dde0b73 897
251fff5c
JB
898## Code of Conduct
899
f80e9e18 900We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone. By participating in this project, you agree to abide by its [Code of Conduct](./CODE_OF_CONDUCT.md) at all times.
251fff5c
JB
901
902## Licensing
903
f80e9e18 904Copyright 2020-2024 SAP SE or an SAP affiliate company and e-mobility-charging-stations-simulator contributors. Please see our [LICENSE](./LICENSE) for copyright and license information. Detailed information including third-party components and their licensing/copyright information is available [via the REUSE tool](https://api.reuse.software/info/github.com/SAP/e-mobility-charging-stations-simulator).