feat: make ocppStrictCompliance define payloadSchemaValidation default
[e-mobility-charging-stations-simulator.git] / README.md
1 <!-- markdownlint-disable-file MD033 MD024 -->
2
3 # [e-mobility charging stations simulator](https://github.com/sap/e-mobility-charging-stations-simulator)
4
5 [![CI worklow](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)
6 [![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)
7
8 ## Summary
9
10 Simple [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.
11
12 ## Prerequisites
13
14 Install the [node.js](https://nodejs.org/) current LTS or superior version runtime environment:
15
16 ### Windows
17
18 - [Chocolatey](https://chocolatey.org/):
19
20 ```powershell
21 choco install -y nodejs
22 ```
23
24 ### MacOSX
25
26 - [Homebrew](https://brew.sh/):
27
28 ```shell
29 brew install node
30 ```
31
32 ### GNU/Linux
33
34 - [NodeSource](https://github.com/nodesource/distributions) Node.js Binary Distributions for version >= 16.X
35
36 ## Installation
37
38 Enable corepack if not already done and install latest pnpm version:
39
40 ```shell
41 corepack enable
42 corepack prepare pnpm@latest --activate
43 ```
44
45 In the repository root, run the following command:
46
47 ```shell
48 pnpm install
49 ```
50
51 ## Initial configuration
52
53 Copy the configuration template file [src/assets/config-template.json](src/assets/config-template.json) to [src/assets/config.json](src/assets/config.json).
54 Copy the RFID tags template file [src/assets/idtags-template.json](src/assets/idtags-template.json) to [src/assets/idtags.json](src/assets/idtags.json).
55
56 Tweak them to your needs by following the section [configuration files syntax](README.md#configuration-files-syntax): OCPP server supervision URL(s), charging station templates, etc.
57
58 ## Start
59
60 To start the program, run: `pnpm start`.
61
62 ## Start Web UI
63
64 See Web UI [README.md](ui/web/README.md) for more information.
65
66 ## Configuration files syntax
67
68 All configuration files are in the JSON standard format.
69
70 **Configuration files locations**:
71
72 - charging stations simulator configuration: [src/assets/config.json](src/assets/config.json);
73 - charging station configuration templates: [src/assets/station-templates](src/assets/station-templates);
74 - charging station configurations: [dist/assets/configurations](dist/assets/configurations);
75 - charging station RFID tags lists: [src/assets](src/assets).
76
77 The 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).
78
79 All charging station configuration templates are in the directory [src/assets/station-templates](src/assets/station-templates).
80
81 A 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).
82
83 **Configuration files hierarchy and priority**:
84
85 1. charging station configuration: [dist/assets/configurations](dist/assets/configurations);
86 2. charging station configuration template: [src/assets/station-templates](src/assets/station-templates);
87 3. charging stations simulator configuration: [src/assets/config.json](src/assets/config.json).
88
89 The charging stations simulator has an automatic configuration files reload feature at change for:
90
91 - charging stations simulator configuration;
92 - charging station configuration templates;
93 - charging station authorization RFID tags lists.
94
95 But 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.
96
97 ### Charging stations simulator configuration
98
99 **src/assets/config.json**:
100
101 | Key | Value(s) | Default Value | Value type | Description |
102 | -------------------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
103 | supervisionUrls | | [] | string \| string[] | string or strings array containing global connection URIs to OCPP-J servers |
104 | supervisionUrlDistribution | round-robin/random/charging-station-affinity | charging-station-affinity | string | supervision urls distribution policy to simulated charging stations |
105 | 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 |
106 | worker | | {<br />"processType": "workerSet",<br />"startDelay": 500,<br />"elementStartDelay": 0,<br />"elementsPerWorker": 1,<br />"poolMinSize": 4,<br />"poolMaxSize": 16,<br />"poolStrategy": "ROUND_ROBIN"<br />} | {<br />processType: WorkerProcessType;<br />startDelay: number;<br />elementStartDelay: number;<br />elementsPerWorker: number;<br />poolMinSize: number;<br />poolMaxSize: number;<br />poolStrategy: WorkerChoiceStrategy;<br />} | Worker configuration section:<br />- _processType_: worker threads process type (`workerSet`/`staticPool`/`dynamicPool`)<br />- _startDelay_: milliseconds to wait at worker threads startup (only for `workerSet` worker threads process type)<br />- _elementStartDelay_: milliseconds to wait at charging station startup<br />- _elementsPerWorker_: number of charging stations per worker threads for the `workerSet` process type<br />- _poolMinSize_: worker threads pool minimum number of threads</br >- _poolMaxSize_: worker threads pool maximum number of threads<br />- _poolStrategy_: worker threads pool [poolifier](https://github.com/poolifier/poolifier) worker choice strategy |
107 | uiServer | | {<br />"enabled": false,<br />"type": "ws",<br />"options": {<br />"host": "localhost",<br />"port": 8080<br />}<br />} | {<br />enabled: boolean;<br />type: ApplicationProtocol;<br />options: ServerOptions;<br />authentication: {<br />enabled: boolean;<br />type: AuthenticationType;<br />username: string;<br />password: string;<br />}<br />} | UI server configuration section |
108 | performanceStorage | | {<br />"enabled": false,<br />"type": "jsonfile",<br />"file:///performanceRecords.json"<br />} | {<br />enabled: boolean;<br />type: string;<br />URI: string;<br />}<br />where type can be 'jsonfile' or 'mongodb' | performance storage configuration section |
109 | 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) |
110
111 #### Worker process model
112
113 - **workerSet**:
114 Worker set executing each a static number (elementsPerWorker) of simulated charging stations from the total
115
116 - **staticPool**:
117 Statically sized worker pool executing a static total number of simulated charging stations
118
119 - **dynamicPool**:
120 Dynamically sized worker pool executing a static total number of simulated charging stations
121
122 ### Charging station configuration template
123
124 **src/assets/station-templates/\<name\>.json**:
125
126 | Key | Value(s) | Default Value | Value type | Description |
127 | ---------------------------------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
128 | supervisionUrls | | [] | string \| string[] | string or strings array containing connection URIs to OCPP-J servers |
129 | supervisionUser | | undefined | string | basic HTTP authentication user to OCPP-J server |
130 | supervisionPassword | | undefined | string | basic HTTP authentication password to OCPP-J server |
131 | supervisionUrlOcppConfiguration | true/false | false | boolean | allow supervision URL configuration via a vendor OCPP parameter key |
132 | supervisionUrlOcppKey | | 'ConnectionUrl' | string | the vendor string that will be used as a vendor OCPP parameter key to set the supervision URL |
133 | ocppVersion | 1.6/2.0/2.0.1 | 1.6 | string | OCPP version |
134 | ocppProtocol | json | json | string | OCPP protocol |
135 | ocppStrictCompliance | true/false | false | boolean | strict adherence to the OCPP version and protocol specifications |
136 | 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) |
137 | 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) |
138 | 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) |
139 | wsOptions | | {} | ClientOptions & ClientRequestArgs | [ws](https://github.com/websockets/ws) and node.js [http](https://nodejs.org/api/http.html) clients options intersection |
140 | idTagsFile | | undefined | string | RFID tags list file relative to [src/assets](src/assets) path |
141 | baseName | | undefined | string | base name to build charging stations id |
142 | nameSuffix | | undefined | string | name suffix to build charging stations id |
143 | fixedName | true/false | false | boolean | use the baseName as the charging stations unique name |
144 | chargePointModel | | undefined | string | charging stations model |
145 | chargePointVendor | | undefined | string | charging stations vendor |
146 | chargePointSerialNumberPrefix | | undefined | string | charge point serial number prefix |
147 | chargeBoxSerialNumberPrefix | | undefined | string | charge box serial number prefix (deprecated in OCPP 1.6) |
148 | firmwareVersionPattern | | Semantic versionning regular expression: https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string | string | charging stations firmware version pattern |
149 | firmwareVersion | | undefined | string | charging stations firmware version |
150 | power | | | float \| float[] | charging stations maximum power value(s) |
151 | powerSharedByConnectors | true/false | false | boolean | charging stations power shared by its connectors |
152 | powerUnit | W/kW | W | string | charging stations power unit |
153 | currentOutType | AC/DC | AC | string | charging stations current out type |
154 | voltageOut | | AC:230/DC:400 | integer | charging stations voltage out |
155 | numberOfPhases | 0/1/3 | AC:3/DC:0 | integer | charging stations number of phase(s) |
156 | numberOfConnectors | | | integer \| integer[] | charging stations number of connector(s) |
157 | useConnectorId0 | true/false | true | boolean | use connector id 0 definition from the charging station configuration template |
158 | randomConnectors | true/false | false | boolean | randomize runtime connector id affectation from the connector id definition in charging station configuration template |
159 | resetTime | | 60 | integer | seconds to wait before the charging stations come back at reset |
160 | autoRegister | true/false | false | boolean | set charging stations as registered at boot notification for testing purpose |
161 | autoReconnectMaxRetries | | -1 (unlimited) | integer | connection retries to the OCPP-J server |
162 | reconnectExponentialDelay | true/false | false | boolean | connection delay retry to the OCPP-J server |
163 | registrationMaxRetries | | -1 (unlimited) | integer | charging stations boot notification retries |
164 | 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 |
165 | amperageLimitationUnit | A/cA/dA/mA | A | string | charging stations amperage limit unit |
166 | enableStatistics | true/false | false | boolean | enable charging stations statistics |
167 | mustAuthorizeAtRemoteStart | true/false | true | boolean | always send authorize at remote start transaction when AuthorizeRemoteTxRequests is enabled |
168 | payloadSchemaValidation | true/false | true if ocppStrictCompliance is true/false if ocppStrictCompliance is false | boolean | validate OCPP commands PDU against [OCA](https://www.openchargealliance.org/) JSON schemas |
169 | beginEndMeterValues | true/false | false | boolean | enable Transaction.{Begin,End} MeterValues |
170 | outOfOrderEndMeterValues | true/false | false | boolean | send Transaction.End MeterValues out of order. Need to relax OCPP specifications strict compliance ('ocppStrictCompliance' parameter) |
171 | meteringPerTransaction | true/false | true | boolean | enable metering history on a per transaction basis |
172 | transactionDataMeterValues | true/false | false | boolean | enable transaction data MeterValues at stop transaction |
173 | mainVoltageMeterValues | true/false | true | boolean | include charging stations main voltage MeterValues on three phased charging stations |
174 | phaseLineToLineVoltageMeterValues | true/false | false | boolean | include charging stations line to line voltage MeterValues on three phased charging stations |
175 | customValueLimitationMeterValues | true/false | true | boolean | enable limitation on custom fluctuated value in MeterValues |
176 | 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. |
177 | 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 |
178 | messageTriggerSupport | | {} | Record<MessageTrigger, boolean> | Configuration section for OCPP commands trigger support. Empty section means all implemented OCPP trigger commands are supported |
179 | Configuration | | | ChargingStationOcppConfiguration | charging stations OCPP parameters configuration section |
180 | AutomaticTransactionGenerator | | | AutomaticTransactionGeneratorConfiguration | charging stations ATG configuration section |
181 | Connectors | | | Record<string, ConnectorStatus> | charging stations connectors configuration section |
182 | Evses | | | Record<string, EvseTemplate> | charging stations EVSEs configuration section |
183
184 #### Configuration section syntax example
185
186 ```json
187 "Configuration": {
188 "configurationKey": [
189 ...
190 {
191 "key": "StandardKey",
192 "readonly": false,
193 "value": "StandardValue",
194 "visible": true,
195 "reboot": false
196 },
197 ...
198 {
199 "key": "VendorKey",
200 "readonly": false,
201 "value": "VendorValue",
202 "visible": false,
203 "reboot": true
204 },
205 ...
206 ]
207 }
208 ```
209
210 #### AutomaticTransactionGenerator section syntax example
211
212 ##### Type definition:
213
214 ```ts
215 type AutomaticTransactionGeneratorConfiguration = {
216 enable: boolean;
217 minDuration: number;
218 maxDuration: number;
219 minDelayBetweenTwoTransactions: number;
220 maxDelayBetweenTwoTransactions: number;
221 probabilityOfStart: number;
222 stopAfterHours: number;
223 stopOnConnectionFailure: boolean;
224 requireAuthorize?: boolean;
225 idTagDistribution?: 'random' | 'round-robin' | 'connector-affinity';
226 };
227 ```
228
229 ##### Example:
230
231 ```json
232 "AutomaticTransactionGenerator": {
233 "enable": false,
234 "minDuration": 60,
235 "maxDuration": 80,
236 "minDelayBetweenTwoTransactions": 15,
237 "maxDelayBetweenTwoTransactions": 30,
238 "probabilityOfStart": 1,
239 "stopAfterHours": 0.3,
240 "stopOnConnectionFailure": true,
241 "requireAuthorize": true,
242 "idTagDistribution": "random"
243 }
244 ```
245
246 #### Connectors section syntax example
247
248 ```json
249 "Connectors": {
250 "0": {},
251 "1": {
252 "bootStatus": "Available",
253 "MeterValues": [
254 ...
255 {
256 "unit": "W",
257 "measurand": "Power.Active.Import",
258 "phase": "L1-N",
259 "value": "5000",
260 "fluctuationPercent": "10"
261 },
262 ...
263 {
264 "unit": "A",
265 "measurand": "Current.Import",
266 "minimum": "0.5"
267 },
268 ...
269 {
270 "unit": "Wh"
271 },
272 ...
273 ]
274 }
275 },
276 ```
277
278 #### Evses section syntax example
279
280 ```json
281 "Evses": {
282 "0": {
283 "Connectors": {
284 "0": {}
285 }
286 },
287 "1": {
288 "Connectors": {
289 "1": {
290 "bootStatus": "Available",
291 "MeterValues": [
292 ...
293 {
294 "unit": "W",
295 "measurand": "Power.Active.Import",
296 "phase": "L1-N",
297 "value": "5000",
298 "fluctuationPercent": "10"
299 },
300 ...
301 {
302 "unit": "A",
303 "measurand": "Current.Import",
304 "minimum": "0.5"
305 },
306 ...
307 {
308 "unit": "Wh"
309 },
310 ...
311 ]
312 }
313 }
314 }
315 },
316 ```
317
318 ### Charging station configuration
319
320 **dist/assets/configurations/\<hashId\>.json**:
321
322 The charging station configuration file is automatically generated at startup from the charging station configuration template file and is persistent.
323
324 The 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.
325
326 #### stationInfo section
327
328 The syntax is similar to charging station configuration template with some added fields like the charging station id (name) and the 'Configuration' section removed.
329
330 #### configurationKey section
331
332 The syntax is similar to the charging station configuration template 'Configuration' section.
333
334 #### automaticTransactionGenerator section
335
336 The syntax is similar to the charging station configuration template 'AutomaticTransactionGenerator' section.
337
338 ## Docker
339
340 In the [docker](./docker) folder:
341
342 ```bash
343 make
344 ```
345
346 Or with the optional git submodules:
347
348 ```bash
349 make SUBMODULES_INIT=true
350 ```
351
352 ## OCPP-J commands supported
353
354 ### Version 1.6
355
356 #### Core Profile
357
358 - :white_check_mark: Authorize
359 - :white_check_mark: BootNotification
360 - :white_check_mark: ChangeAvailability
361 - :white_check_mark: ChangeConfiguration
362 - :white_check_mark: ClearCache
363 - :white_check_mark: DataTransfer
364 - :white_check_mark: GetConfiguration
365 - :white_check_mark: Heartbeat
366 - :white_check_mark: MeterValues
367 - :white_check_mark: RemoteStartTransaction
368 - :white_check_mark: RemoteStopTransaction
369 - :white_check_mark: Reset
370 - :white_check_mark: StartTransaction
371 - :white_check_mark: StatusNotification
372 - :white_check_mark: StopTransaction
373 - :white_check_mark: UnlockConnector
374
375 #### Firmware Management Profile
376
377 - :white_check_mark: GetDiagnostics
378 - :white_check_mark: DiagnosticsStatusNotification
379 - :white_check_mark: FirmwareStatusNotification
380 - :white_check_mark: UpdateFirmware
381
382 #### Local Auth List Management Profile
383
384 - :x: GetLocalListVersion
385 - :x: SendLocalList
386
387 #### Reservation Profile
388
389 - :white_check_mark: CancelReservation
390 - :white_check_mark: ReserveNow
391
392 #### Smart Charging Profile
393
394 - :white_check_mark: ClearChargingProfile
395 - :x: GetCompositeSchedule
396 - :white_check_mark: SetChargingProfile
397
398 #### Remote Trigger Profile
399
400 - :white_check_mark: TriggerMessage
401
402 ### Version 2.x.x
403
404 #### Provisioning
405
406 - :white_check_mark: BootNotification
407
408 #### Authorization
409
410 - :white_check_mark: ClearCache
411
412 #### Availability
413
414 - :white_check_mark: StatusNotification
415 - :white_check_mark: Heartbeat
416
417 ## OCPP-J standard parameters supported
418
419 All 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.
420
421 ### Version 1.6
422
423 #### Core Profile
424
425 - :white_check_mark: AuthorizeRemoteTxRequests (type: boolean) (units: -)
426 - :x: ClockAlignedDataInterval (type: integer) (units: seconds)
427 - :white_check_mark: ConnectionTimeOut (type: integer) (units: seconds)
428 - :x: GetConfigurationMaxKeys (type: integer) (units: -)
429 - :white_check_mark: HeartbeatInterval (type: integer) (units: seconds)
430 - :x: LocalAuthorizeOffline (type: boolean) (units: -)
431 - :x: LocalPreAuthorize (type: boolean) (units: -)
432 - :x: MeterValuesAlignedData (type: CSL) (units: -)
433 - :white_check_mark: MeterValuesSampledData (type: CSL) (units: -)
434 - :white_check_mark: MeterValueSampleInterval (type: integer) (units: seconds)
435 - :white_check_mark: NumberOfConnectors (type: integer) (units: -)
436 - :x: ResetRetries (type: integer) (units: times)
437 - :white_check_mark: ConnectorPhaseRotation (type: CSL) (units: -)
438 - :x: StopTransactionOnEVSideDisconnect (type: boolean) (units: -)
439 - :x: StopTransactionOnInvalidId (type: boolean) (units: -)
440 - :x: StopTxnAlignedData (type: CSL) (units: -)
441 - :x: StopTxnSampledData (type: CSL) (units: -)
442 - :white_check_mark: SupportedFeatureProfiles (type: CSL) (units: -)
443 - :x: TransactionMessageAttempts (type: integer) (units: times)
444 - :x: TransactionMessageRetryInterval (type: integer) (units: seconds)
445 - :x: UnlockConnectorOnEVSideDisconnect (type: boolean) (units: -)
446 - :white_check_mark: WebSocketPingInterval (type: integer) (units: seconds)
447
448 #### Firmware Management Profile
449
450 - _none_
451
452 #### Local Auth List Management Profile
453
454 - :white_check_mark: LocalAuthListEnabled (type: boolean) (units: -)
455 - :x: LocalAuthListMaxLength (type: integer) (units: -)
456 - :x: SendLocalListMaxLength (type: integer) (units: -)
457
458 #### Reservation Profile
459
460 - :white_check_mark: ReserveConnectorZeroSupported (type: boolean) (units: -)
461
462 #### Smart Charging Profile
463
464 - :x: ChargeProfileMaxStackLevel (type: integer) (units: -)
465 - :x: ChargingScheduleAllowedChargingRateUnit (type: CSL) (units: -)
466 - :x: ChargingScheduleMaxPeriods (type: integer) (units: -)
467 - :x: MaxChargingProfilesInstalled (type: integer) (units: -)
468
469 #### Remote Trigger Profile
470
471 - _none_
472
473 ### Version 2.x.x
474
475 ## UI protocol
476
477 Protocol to control the simulator via a Websocket or HTTP server.
478
479 ### HTTP Protocol
480
481 To 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.
482
483 ### Websocket Protocol
484
485 SRPC protocol over Websocket. PDU stands for 'Protocol Data Unit'.
486
487 - Request:
488 [`uuid`, `ProcedureName`, `PDU`]
489 `uuid`: String uniquely representing this request
490 `ProcedureName`: The procedure to run on the simulator
491 `PDU`: The parameters for said procedure
492
493 - Response:
494 [`uuid`, `PDU`]
495 `uuid`: String uniquely linking the response to the request
496 `PDU`: Response parameters to requested procedure
497
498 An [Insomnia](https://insomnia.rest/) WebSocket requests collection is available in [src/assets/ui-protocol](./src/assets/ui-protocol) directory.
499
500 #### Version 0.0.1
501
502 Set the Websocket header _Sec-Websocket-Protocol_ to `ui0.0.1`.
503
504 ##### Procedures
505
506 ###### Start Simulator
507
508 - Request:
509 `ProcedureName`: 'startSimulator'
510 `PDU`: {}
511
512 - Response:
513 `PDU`: {
514 `status`: 'success' | 'failure'
515 }
516
517 ###### Stop Simulator
518
519 - Request:
520 `ProcedureName`: 'stopSimulator'
521 `PDU`: {}
522
523 - Response:
524 `PDU`: {
525 `status`: 'success' | 'failure'
526 }
527
528 ###### List Charging Stations
529
530 - Request:
531 `ProcedureName`: 'listChargingStations'
532 `PDU`: {}
533
534 - Response:
535 `PDU`: {
536 `status`: 'success' | 'failure',
537 `chargingStations`: ChargingStationData[]
538 }
539
540 ###### Start Charging Station
541
542 - Request:
543 `ProcedureName`: 'startChargingStation'
544 `PDU`: {
545 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
546 }
547
548 - Response:
549 `PDU`: {
550 `status`: 'success' | 'failure',
551 `hashIdsSucceeded`: charging station unique identifier strings array,
552 `hashIdsFailed`: charging station unique identifier strings array (optional)
553 `responsesFailed`: failed responses payload array (optional)
554 }
555
556 ###### Stop Charging Station
557
558 - Request:
559 `ProcedureName`: 'stopChargingStation'
560 `PDU`: {
561 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
562 }
563
564 - Response:
565 `PDU`: {
566 `status`: 'success' | 'failure',
567 `hashIdsSucceeded`: charging station unique identifier strings array,
568 `hashIdsFailed`: charging station unique identifier strings array (optional),
569 `responsesFailed`: failed responses payload array (optional)
570 }
571
572 ###### Open Connection
573
574 - Request:
575 `ProcedureName`: 'openConnection'
576 `PDU`: {
577 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
578 }
579
580 - Response:
581 `PDU`: {
582 `status`: 'success' | 'failure',
583 `hashIdsSucceeded`: charging station unique identifier strings array,
584 `hashIdsFailed`: charging station unique identifier strings array (optional),
585 `responsesFailed`: failed responses payload array (optional)
586 }
587
588 ###### Close Connection
589
590 - Request:
591 `ProcedureName`: 'closeConnection'
592 `PDU`: {
593 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
594 }
595
596 - Response:
597 `PDU`: {
598 `status`: 'success' | 'failure',
599 `hashIdsSucceeded`: charging station unique identifier strings array,
600 `hashIdsFailed`: charging station unique identifier strings array (optional),
601 `responsesFailed`: failed responses payload array (optional)
602 }
603
604 ###### Start Automatic Transaction Generator
605
606 - Request:
607 `ProcedureName`: 'startAutomaticTransactionGenerator'
608 `PDU`: {
609 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
610 `connectorIds`: connector id integer array (optional, default: all connectors)
611 }
612
613 - Response:
614 `PDU`: {
615 `status`: 'success' | 'failure',
616 `hashIdsSucceeded`: charging station unique identifier strings array,
617 `hashIdsFailed`: charging station unique identifier strings array (optional),
618 `responsesFailed`: failed responses payload array (optional)
619 }
620
621 ###### Stop Automatic Transaction Generator
622
623 - Request:
624 `ProcedureName`: 'stopAutomaticTransactionGenerator'
625 `PDU`: {
626 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
627 `connectorIds`: connector id integer array (optional, default: all connectors)
628 }
629
630 - Response:
631 `PDU`: {
632 `status`: 'success' | 'failure',
633 `hashIdsSucceeded`: charging station unique identifier strings array,
634 `hashIdsFailed`: charging station unique identifier strings array (optional),
635 `responsesFailed`: failed responses payload array (optional)
636 }
637
638 ###### OCPP commands trigger
639
640 - Request:
641 `ProcedureName`: 'commandName' (the OCPP command name in camel case)
642 `PDU`: {
643 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
644 ...`commandPayload`
645 } (the OCPP command payload with some optional fields added to target the simulated charging stations)
646
647 - Response:
648 `PDU`: {
649 `status`: 'success' | 'failure',
650 `hashIdsSucceeded`: charging station unique identifier strings array,
651 `hashIdsFailed`: charging station unique identifier strings array (optional),
652 `responsesFailed`: failed responses payload array (optional)
653 }
654
655 Examples:
656
657 - **Start Transaction**
658
659 - Request:
660 `ProcedureName`: 'startTransaction'
661 `PDU`: {
662 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
663 `connectorId`: connector id integer,
664 `idTag`: RFID tag string
665 }
666
667 - Response:
668 `PDU`: {
669 `status`: 'success' | 'failure',
670 `hashIdsSucceeded`: charging station unique identifier strings array,
671 `hashIdsFailed`: charging station unique identifier strings array (optional),
672 `responsesFailed`: failed responses payload array (optional)
673 }
674
675 - **Stop Transaction**
676
677 - Request:
678 `ProcedureName`: 'stopTransaction'
679 `PDU`: {
680 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
681 `transactionId`: transaction id integer
682 }
683
684 - Response:
685 `PDU`: {
686 `status`: 'success' | 'failure',
687 `hashIdsSucceeded`: charging station unique identifier strings array,
688 `hashIdsFailed`: charging station unique identifier strings array (optional),
689 `responsesFailed`: failed responses payload array (optional)
690 }
691
692 - **Status Notification**
693
694 - Request:
695 `ProcedureName`: 'statusNotification'
696 `PDU`: {
697 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
698 `connectorId`: connector id integer,
699 `errorCode`: connector error code,
700 `status`: connector status
701 }
702
703 - Response:
704 `PDU`: {
705 `status`: 'success' | 'failure',
706 `hashIdsSucceeded`: charging station unique identifier strings array,
707 `hashIdsFailed`: charging station unique identifier strings array (optional),
708 `responsesFailed`: failed responses payload array (optional)
709 }
710
711 - **Heartbeat**
712
713 - Request:
714 `ProcedureName`: 'heartbeat'
715 `PDU`: {
716 `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
717 }
718
719 - Response:
720 `PDU`: {
721 `status`: 'success' | 'failure',
722 `hashIdsSucceeded`: charging station unique identifier strings array,
723 `hashIdsFailed`: charging station unique identifier strings array (optional),
724 `responsesFailed`: failed responses payload array (optional)
725 }
726
727 ## Support, Feedback, Contributing
728
729 This 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).
730
731 ## Code of Conduct
732
733 We 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.
734
735 ## Licensing
736
737 Copyright 2020-2023 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).