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