Apply dependencies update
[e-mobility-charging-stations-simulator.git] / README.md
CommitLineData
1ea2264a 1# [e-mobility charging stations simulator](https://github.com/sap/e-mobility-charging-stations-simulator)
7dde0b73 2
0a3d08ef
SW
3[![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)
4
7dde0b73
JB
5## Summary
6
ccb1d6e9 7Simple [node.js](https://nodejs.org/) software to simulate a set of charging stations based on the OCPP-J 1.6 protocol as part of SAP e-Mobility solution.
7dde0b73 8
696ce53a
JB
9## Prerequisites
10
11### Windows
12
e7aeea18 13- [Chocolatey](https://chocolatey.org/):
696ce53a
JB
14
15```powershell
16choco install -y nodejs-lts
17```
18
19### MacOSX
20
e7aeea18 21- [Homebrew](https://brew.sh/):
696ce53a
JB
22
23```shell
8f3d04b0 24brew install node@16
696ce53a
JB
25```
26
e7aeea18 27### GNU/Linux:
511780c3 28
11d8f3e9 29- [NodeSource](https://github.com/nodesource/distributions) Node.js Binary Distributions for version 16.X
511780c3 30
4d3821a2 31## Configuration files syntax
2c28fc83 32
e7aeea18 33All configuration files are in the JSON standard format.
2c28fc83 34
1816f743 35**Configuration files list**:
2c28fc83 36
170bec53 37- charging stations simulator configuration: [src/assets/config.json](src/assets/config.json);
1816f743 38- charging station configuration templates: [src/assets/station-templates](src/assets/station-templates);
1c51fd1d 39- charging station configurations: [dist/assets/configurations](dist/assets/configurations);
7f818162 40- charging station RFID tags lists: [src/assets](src/assets).
2c28fc83 41
1816f743
JB
42The 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).
43
44All charging station configuration templates are in the directory [src/assets/station-templates](src/assets/station-templates).
45
46A list of RFID tags must be defined for the automatic transaction generator with a default location and name: `src/assets/authorization-tags.json`. A template file is available at [src/assets/authorization-tags-template.json](src/assets/authorization-tags-template.json).
47
48**Configuration files hierarchy and priority**:
49
1c51fd1d 501. charging station configuration: [dist/assets/configurations](dist/assets/configurations);
1816f743 512. charging station configuration template: [src/assets/station-templates](src/assets/station-templates);
170bec53 523. charging stations simulator configuration: [src/assets/config.json](src/assets/config.json).
511780c3 53
e7aeea18 54The charging stations simulator have an automatic configuration files reload feature at change for:
511780c3 55
170bec53 56- charging stations simulator configuration;
1816f743 57- charging station configuration templates;
170bec53 58- charging station authorization RFID tags lists.
2c28fc83 59
e7aeea18
JB
60But the modifications to test have to be done to the files in the build result directory [dist/assets](dist/assets). Once the modifications are finished, they have to be reported or copied to the matching files in the build source directory [src/assets](src/assets) to ensure they will be taken into account at next build.
61
170bec53 62### Charging stations simulator configuration
2c28fc83 63
b1d6e944 64**src/assets/config.json**:
2c28fc83 65
1816f743
JB
66| Key | Value(s) | Default Value | Value type | Description |
67| -------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
68| supervisionUrls | | [] | string \| string[] | string or array of global connection URIs to OCPP-J servers |
69| supervisionUrlDistribution | round-robin/random/sequential | round-robin | boolean | supervision urls distribution policy to simulated charging stations |
70| workerProcess | workerSet/staticPool/dynamicPool | workerSet | string | worker threads process type |
71| workerStartDelay | | 500 | integer | milliseconds to wait at worker threads startup (only for workerSet threads process type) |
72| elementStartDelay | | 0 | integer | milliseconds to wait at charging station startup |
73| workerPoolMinSize | | 4 | integer | worker threads pool minimum number of threads |
74| workerPoolMaxSize | | 16 | integer | worker threads pool maximum number of threads |
75| workerPoolStrategy | ROUND_ROBIN/LESS_RECENTLY_USED/... | [poolifier](https://github.com/poolifier/poolifier) default: ROUND_ROBBIN | string | worker threads pool [poolifier](https://github.com/poolifier/poolifier) worker choice strategy |
76| chargingStationsPerWorker | | 1 | integer | number of charging stations per worker threads for the `workerSet` process type |
77| logStatisticsInterval | | 60 | integer | seconds between charging stations statistics output in the logs |
78| logConsole | true/false | false | boolean | output logs on the console |
79| logFormat | | simple | string | winston log format |
80| logRotate | true/false | true | boolean | enable daily log files rotation |
81| logMaxFiles | | 7 | integer | maximum number of log files to keep |
82| logLevel | emerg/alert/crit/error/warning/notice/info/debug | info | string | winston logging level |
83| logFile | | combined.log | string | log file relative path |
84| logErrorFile | | error.log | string | error log file relative path |
675fa8e3 85| uiServer | | { "enabled": true, "options": { "host: "localhost", "port": 8080 } } | { enabled: boolean; options: ServerOptions; } | UI WebSocket server configuration section |
1816f743
JB
86| performanceStorage | | { "enabled": false, "type": "jsonfile", "file:///performanceRecords.json" } | { enabled: boolean; type: string; URI: string; } where type can be 'jsonfile' or 'mongodb' | performance storage configuration section |
87| stationTemplateUrls | | {}[] | { file: string; numberOfStations: number; }[] | array of charging station configuration templates URIs configuration section (charging station configuration template file name and number of stations) |
e7aeea18
JB
88
89#### Worker process model:
a6b3c6c3
JB
90
91- **workerSet**:
92 Worker set executing each a static number (chargingStationsPerWorker) of simulated charging stations from the total
93
94- **staticPool**:
e7aeea18 95 Statically sized worker pool executing a static total number of simulated charging stations
a6b3c6c3
JB
96
97- **dynamicPool**:
e7aeea18 98 Dynamically sized worker pool executing a static total number of simulated charging stations
a6b3c6c3 99
1816f743
JB
100### Charging station configuration template
101
afccb423 102**src/assets/station-templates/\<name\>.json**:
1816f743 103
ccb1d6e9
JB
104| Key | Value(s) | Default Value | Value type | Description |
105| ---------------------------------- | ---------- | --------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
106| supervisionUrls | | '' | string \| string[] | string or array of connection URIs to OCPP-J servers |
107| supervisionUser | | '' | string | basic HTTP authentication user to OCPP-J server |
108| supervisionPassword | | '' | string | basic HTTP authentication password to OCPP-J server |
109| supervisionUrlOcppConfiguration | true/false | false | boolean | allow supervision URL configuration via a vendor OCPP parameter key |
110| supervisionUrlOcppKey | | 'ConnectionUrl' | string | the vendor string that will be used as a vendor OCPP parameter key to set the supervision URL |
111| ocppVersion | 1.6 | 1.6 | string | OCPP version |
112| ocppProtocol | json | json | string | OCPP protocol |
113| ocppStrictCompliance | true/false | false | boolean | strict adherence to the OCPP version and protocol specifications |
114| 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 |
115| 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 |
116| wsOptions | | {} | ClientOptions & ClientRequestArgs | [ws](https://github.com/websockets/ws) and node.js [http](https://nodejs.org/api/http.html) clients options intersection |
117| authorizationFile | | '' | string | RFID tags list file relative to src/assets path |
118| baseName | | '' | string | base name to build charging stations id |
119| nameSuffix | | '' | string | name suffix to build charging stations id |
120| fixedName | true/false | false | boolean | use the baseName as the charging stations unique name |
121| chargePointModel | | '' | string | charging stations model |
122| chargePointVendor | | '' | string | charging stations vendor |
123| chargePointSerialNumberPrefix | | '' | string | charge point serial number prefix |
124| chargeBoxSerialNumberPrefix | | '' | string | charge box serial number prefix (deprecated in OCPP 1.6) |
125| firmwareVersion | | '' | string | charging stations firmware version |
126| power | | | float \| float[] | charging stations maximum power value(s) |
127| powerSharedByConnectors | true/false | false | boolean | charging stations power shared by its connectors |
128| powerUnit | W/kW | W | string | charging stations power unit |
129| currentOutType | AC/DC | AC | string | charging stations current out type |
130| voltageOut | | AC:230/DC:400 | integer | charging stations voltage out |
131| numberOfPhases | 0/1/3 | AC:3/DC:0 | integer | charging stations number of phase(s) |
132| numberOfConnectors | | | integer \| integer[] | charging stations number of connector(s) |
133| useConnectorId0 | true/false | true | boolean | use connector id 0 definition from the charging station configuration template |
134| randomConnectors | true/false | false | boolean | randomize runtime connector id affectation from the connector id definition in charging station configuration template |
135| resetTime | | 60 | integer | seconds to wait before the charging stations come back at reset |
136| autoRegister | true/false | false | boolean | set charging stations as registered at boot notification for testing purpose |
137| autoReconnectMaxRetries | | -1 (unlimited) | integer | connection retries to the OCPP-J server |
138| reconnectExponentialDelay | true/false | false | boolean | connection delay retry to the OCPP-J server |
139| registrationMaxRetries | | -1 (unlimited) | integer | charging stations boot notification retries |
140| 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 |
141| amperageLimitationUnit | A/cA/dA/mA | A | string | charging stations amperage limit unit |
142| enableStatistics | true/false | true | boolean | enable charging stations statistics |
143| mayAuthorizeAtRemoteStart | true/false | true | boolean | always send authorize at remote start transaction when AuthorizeRemoteTxRequests is enabled |
144| beginEndMeterValues | true/false | false | boolean | enable Transaction.{Begin,End} MeterValues |
145| outOfOrderEndMeterValues | true/false | false | boolean | send Transaction.End MeterValues out of order. Need to relax OCPP specifications strict compliance ('ocppStrictCompliance' parameter) |
146| meteringPerTransaction | true/false | true | boolean | enable metering history on a per transaction basis |
147| transactionDataMeterValues | true/false | false | boolean | enable transaction data MeterValues at stop transaction |
148| mainVoltageMeterValues | true/false | true | boolean | include charging stations main voltage MeterValues on three phased charging stations |
149| phaseLineToLineVoltageMeterValues | true/false | true | boolean | include charging stations line to line voltage MeterValues on three phased charging stations |
150| customValueLimitationMeterValues | true/false | true | boolean | enable limitation on custom fluctuated value in MeterValues |
151| Configuration | | | ChargingStationConfiguration | charging stations OCPP parameters configuration section |
152| AutomaticTransactionGenerator | | | AutomaticTransactionGenerator | charging stations ATG configuration section |
153| Connectors | | | Connectors | charging stations connectors configuration section |
c94a349a
JB
154
155#### Configuration section
156
157```json
0302da79 158 "Configuration": {
c94a349a
JB
159 "configurationKey": [
160 ...
161 {
162 "key": "StandardKey",
163 "readonly": false,
164 "value": "StandardValue",
165 "visible": true,
166 "reboot": false
167 },
168 ...
169 {
170 "key": "VendorKey",
171 "readonly": false,
172 "value": "VendorValue",
173 "visible": false,
174 "reboot": true
175 },
176 ...
177 ]
178 }
179```
180
181#### AutomaticTransactionGenerator section
182
183```json
0302da79 184 "AutomaticTransactionGenerator": {
c94a349a
JB
185 "enable": false,
186 "minDuration": 60,
187 "maxDuration": 80,
188 "minDelayBetweenTwoTransactions": 15,
189 "maxDelayBetweenTwoTransactions": 30,
190 "probabilityOfStart": 1,
191 "stopAfterHours": 0.3,
192 "stopOnConnectionFailure": true,
e644918b 193 "requireAuthorize": true
c94a349a
JB
194 }
195```
e7aeea18 196
c94a349a
JB
197#### Connectors section
198
199```json
0302da79 200 "Connectors": {
c94a349a
JB
201 "0": {},
202 "1": {
203 "bootStatus": "Available",
204 "MeterValues": [
9bd87386
JB
205 ...
206 {
207 "unit": "W",
208 "measurand": "Power.Active.Import",
209 "phase": "L1-N",
210 "value": "5000",
211 "fluctuationPercent": "10"
212 },
c94a349a
JB
213 ...
214 {
215 "unit": "A",
216 "measurand": "Current.Import"
217 },
218 ...
219 {
220 "unit": "Wh"
221 },
222 ...
223 ]
224 }
225 },
226```
227
1816f743
JB
228### Charging station configuration
229
1c51fd1d 230**dist/assets/configurations/\<hashId\>.json**:
1816f743 231
a9ec2018 232The charging station configuration file is automatically generated at startup from the charging station configuration template file and is persistent.
1816f743
JB
233
234The 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.
235
236#### stationInfo section
237
238The syntax is similar to charging station configuration template with some added fields like the charging station id (name) and the 'Configuration' section removed.
239
240#### configurationKey section
241
242The syntax is similar to the charging station configuration template 'Configuration' section.
243
6f0ec20e
JB
244## Start
245
246To start the program, run: `npm start`.
247
175d4f46 248To start the program with a UI controller, run: `npm start:server`.
903becc3 249Then, start/stop the simulator by going to `https://<hostname:port>` in a browser. Localhost port will default to 8080. For Cloud Foundry, the port is assigned based on the `process.env.PORT` environment variable.
175d4f46 250
6f0ec20e
JB
251## Docker
252
253In the [docker](./docker) folder:
254
255```bash
256make
257```
258
bfcad885 259Or with the optional git submodules:
6f0ec20e
JB
260
261```bash
bfcad885 262make SUBMODULES_INIT=true
6f0ec20e
JB
263```
264
265## OCPP-J commands supported
c94a349a
JB
266
267### Version 1.6
268
c56d42f1 269#### Core Profile
6f0ec20e 270
778f7924
JB
271- :white_check_mark: Authorize
272- :white_check_mark: BootNotification
273- :white_check_mark: ChangeAvailability
274- :white_check_mark: ChangeConfiguration
275- :white_check_mark: ClearCache
9e1b12e4 276- :x: DataTransfer
778f7924
JB
277- :white_check_mark: GetConfiguration
278- :white_check_mark: Heartbeat
279- :white_check_mark: MeterValues
280- :white_check_mark: RemoteStartTransaction
281- :white_check_mark: RemoteStopTransaction
282- :white_check_mark: Reset
283- :white_check_mark: StartTransaction
284- :white_check_mark: StatusNotification
285- :white_check_mark: StopTransaction
286- :white_check_mark: UnlockConnector
6f0ec20e 287
c56d42f1 288#### Firmware Management Profile
6f0ec20e 289
b652b0c3 290- :white_check_mark: GetDiagnostics
d50343bd 291- :white_check_mark: DiagnosticsStatusNotification
9e1b12e4
JB
292- :x: FirmwareStatusNotification
293- :x: UpdateFirmware
6f0ec20e 294
c56d42f1 295#### Local Auth List Management Profile
6f0ec20e 296
9e1b12e4
JB
297- :x: GetLocalListVersion
298- :x: SendLocalList
6f0ec20e 299
c56d42f1 300#### Reservation Profile
6f0ec20e 301
9e1b12e4
JB
302- :x: CancelReservation
303- :x: ReserveNow
6f0ec20e 304
c56d42f1 305#### Smart Charging Profile
6f0ec20e 306
778f7924 307- :white_check_mark: ClearChargingProfile
68cb8b91 308- :x: GetCompositeSchedule
778f7924 309- :white_check_mark: SetChargingProfile
6f0ec20e 310
c56d42f1 311#### Remote Trigger Profile
6f0ec20e 312
802cfa13 313- :white_check_mark: TriggerMessage
7dde0b73 314
7e1dc878
JB
315## OCPP-J standard parameters supported
316
1816f743 317All kind of OCPP parameters are supported in a charging station configuration or a charging station configuration template file. The list here mention the standard ones also handled automatically in the simulator.
7e1dc878
JB
318
319### Version 1.6
320
c56d42f1 321#### Core Profile
7e1dc878
JB
322
323- :white_check_mark: AuthorizeRemoteTxRequests (type: boolean) (units: -)
324- :x: ClockAlignedDataInterval (type: integer) (units: seconds)
291cb255 325- :white_check_mark: ConnectionTimeOut (type: integer) (units: seconds)
7e1dc878
JB
326- :x: GetConfigurationMaxKeys (type: integer) (units: -)
327- :white_check_mark: HeartbeatInterval (type: integer) (units: seconds)
328- :x: LocalAuthorizeOffline (type: boolean) (units: -)
329- :x: LocalPreAuthorize (type: boolean) (units: -)
330- :x: MeterValuesAlignedData (type: CSL) (units: -)
331- :white_check_mark: MeterValuesSampledData (type: CSL) (units: -)
332- :white_check_mark: MeterValueSampleInterval (type: integer) (units: seconds)
333- :white_check_mark: NumberOfConnectors (type: integer) (units: -)
334- :x: ResetRetries (type: integer) (units: times)
335- :white_check_mark: ConnectorPhaseRotation (type: CSL) (units: -)
336- :x: StopTransactionOnEVSideDisconnect (type: boolean) (units: -)
337- :x: StopTransactionOnInvalidId (type: boolean) (units: -)
338- :x: StopTxnAlignedData (type: CSL) (units: -)
339- :x: StopTxnSampledData (type: CSL) (units: -)
36f6a92e 340- :white_check_mark: SupportedFeatureProfiles (type: CSL) (units: -)
7e1dc878
JB
341- :x: TransactionMessageAttempts (type: integer) (units: times)
342- :x: TransactionMessageRetryInterval (type: integer) (units: seconds)
343- :x: UnlockConnectorOnEVSideDisconnect (type: boolean) (units: -)
36f6a92e 344- :white_check_mark: WebSocketPingInterval (type: integer) (units: seconds)
7e1dc878 345
c56d42f1 346#### Firmware Management Profile
7e1dc878 347
e7aeea18 348- _none_
7e1dc878 349
c56d42f1 350#### Local Auth List Management Profile
7e1dc878 351
36f6a92e 352- :white_check_mark: LocalAuthListEnabled (type: boolean) (units: -)
7e1dc878
JB
353- :x: LocalAuthListMaxLength (type: integer) (units: -)
354- :x: SendLocalListMaxLength (type: integer) (units: -)
355
c56d42f1 356#### Reservation Profile
7e1dc878 357
e7aeea18 358- _none_
7e1dc878 359
c56d42f1 360#### Smart Charging Profile
7e1dc878
JB
361
362- :x: ChargeProfileMaxStackLevel (type: integer) (units: -)
363- :x: ChargingScheduleAllowedChargingRateUnit (type: CSL) (units: -)
364- :x: ChargingScheduleMaxPeriods (type: integer) (units: -)
365- :x: MaxChargingProfilesInstalled (type: integer) (units: -)
366
c56d42f1 367#### Remote Trigger Profile
7e1dc878 368
e7aeea18 369- _none_
7e1dc878 370
251fff5c 371## Support, Feedback, Contributing
7dde0b73 372
7f774a55 373This 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 374
251fff5c
JB
375## Code of Conduct
376
377We 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.
378
379## Licensing
380
7f774a55 381Copyright 2020-2022 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).