Remove string literal from log messages
[e-mobility-charging-stations-simulator.git] / README.md
1 # [charging-stations-simulator](https://github.com/jerome-benoit/charging-stations-simulator)
2
3 ## Summary
4
5 Simple [node.js](https://nodejs.org/) program to simulate a set of charging stations based on the OCPP-J 1.6 protocol.
6
7 ## Prerequisites
8
9 ### Windows
10
11 * [Chocolatey](https://chocolatey.org/):
12
13 ```powershell
14 choco install -y nodejs-lts
15 ```
16
17 ### MacOSX
18
19 * [Homebrew](https://brew.sh/):
20
21 ```shell
22 brew install node@14
23 ```
24
25 ### GNU/Linux:
26
27 * [NodeSource](https://github.com/nodesource/distributions) Node.js Binary Distributions for version 14.X
28
29 ## Configuration syntax
30
31 All configuration files are in the JSON standard format.
32
33 The charging stations simulator's main configuration parameters must be within the `src/assets/config.json` file. A configuration template file is available at [src/assets/config-template.json](src/assets/config-template.json).
34
35 All charging station templates are in the directory [src/assets/station-templates](src/assets/station-templates).
36
37 A list of RFID tags must be defined for the automatic transaction generator with the 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).
38
39 The charging stations simulator have an automatic configuration files reload feature at change for:
40 * main configuration;
41 * charging station templates;
42 * authorization RFID tags.
43
44 But 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.
45
46 ### Main configuration
47
48 **src/assets/config.json**:
49
50 Key | Value(s) | Default Value | Value type | Description
51 --- | -------| --------------| ---------- | ------------
52 supervisionUrls | | [] | string \| string[] | string or array of global connection URIs to OCPP-J servers
53 supervisionUrlDistribution | round-robin/random/sequential | round-robin | boolean | supervision urls distribution policy to simulated charging stations
54 workerProcess | workerSet/staticPool/dynamicPool | workerSet | string | worker threads process type
55 workerStartDelay | | 500 | integer | milliseconds to wait at worker threads startup (only for workerSet threads process type)
56 elementStartDelay | | 0 | integer | milliseconds to wait at charging station startup
57 workerPoolMinSize | | 4 | integer | worker threads pool minimum number of threads
58 workerPoolMaxSize | | 16 | integer | worker threads pool maximum number of threads
59 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
60 chargingStationsPerWorker | | 1 | integer | number of charging stations per worker threads for the `workerSet` process type
61 logStatisticsInterval | | 60 | integer | seconds between charging stations statistics output in the logs
62 logConsole | true/false | false | boolean | output logs on the console
63 logFormat | | simple | string | winston log format
64 logRotate | true/false | true | boolean | enable daily log files rotation
65 logMaxFiles | | 7 | integer | maximum number of log files to keep
66 logLevel | emerg/alert/crit/error/warning/notice/info/debug | info | string | winston logging level
67 logFile | | combined.log | string | log file relative path
68 logErrorFile | | error.log | string | error log file relative path
69 uiWebSocketServer | | { "enabled": true, "options": { "host: "localhost", "port": 8080 } } | { enabled: boolean; options: ServerOptions; } | UI WebSocket server configuration section
70 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
71 stationTemplateUrls | | {}[] | { file: string; numberOfStations: number; }[] | array of charging station templates URIs configuration section (template file name and number of stations)
72
73 #### Worker process model:
74
75 - **workerSet**:
76 Worker set executing each a static number (chargingStationsPerWorker) of simulated charging stations from the total
77
78 - **staticPool**:
79 Statically sized worker pool executing a static total number of simulated charging stations
80
81 - **dynamicPool**:
82 Dynamically sized worker pool executing a static total number of simulated charging stations
83
84 ### Charging station template
85
86 Key | Value(s) | Default Value | Value type | Description
87 --- | -------| --------------| ---------- | ------------
88 supervisionUrls | | '' | string\|string[] | string or array of connection URIs to OCPP-J servers. It has priority over the global configuration parameter
89 supervisionUser | | '' | string | basic HTTP authentication user to OCPP-J server
90 supervisionPassword | | '' | string | basic HTTP authentication password to OCPP-J server
91 supervisionUrlOcppConfiguration | true/false | false | boolean | Allow supervision URL configuration via a vendor OCPP parameter key
92 supervisionUrlOcppKey | | 'ConnectionUrl' | string | The vendor string that will be used as a vendor OCPP parameter key to set the supervision URL
93 ocppVersion | 1.6 | 1.6 | string | OCPP version
94 ocppProtocol | json | json | string | OCPP protocol
95 ocppStrictCompliance | true/false | true | boolean | Strict adherence to the OCPP version and protocol specifications
96 wsOptions | | {} | ClientOptions & ClientRequestArgs | [ws](https://github.com/websockets/ws) and node.js [http](https://nodejs.org/api/http.html) clients options intersection
97 authorizationFile | | '' | string | RFID tags list file relative to src/assets path
98 baseName | | '' | string | base name to build charging stations name
99 nameSuffix | | '' | string | name suffix to build charging stations name
100 fixedName | true/false | false | boolean | use the baseName as the charging stations unique name
101 chargePointModel | | '' | string | charging stations model
102 chargePointVendor | | '' | string | charging stations vendor
103 chargeBoxSerialNumberPrefix | | '' | string | charging stations serial number prefix
104 firmwareVersion | | '' | string | charging stations firmware version
105 power | | | float\|float[] | charging stations maximum power value(s)
106 powerSharedByConnectors | true/false | false | boolean | charging stations power shared by its connectors
107 powerUnit | W/kW | W | string | charging stations power unit
108 currentOutType | AC/DC | AC | string | charging stations current out type
109 voltageOut | | AC:230/DC:400 | integer | charging stations voltage out
110 numberOfPhases | 0/1/3 | AC:3/DC:0 | integer | charging stations number of phase(s)
111 numberOfConnectors | | | integer\|integer[] | charging stations number of connector(s)
112 useConnectorId0 | true/false | true | boolean | use connector id 0 definition from the template
113 randomConnectors | true/false | false | boolean | randomize runtime connector id affectation from the connector id definition in template
114 resetTime | | 60 | integer | seconds to wait before the charging stations come back at reset
115 autoRegister | true/false | false | boolean | set the charging station as registered at boot notification for testing purpose
116 autoReconnectMaxRetries | | -1 (unlimited) | integer | connection retries to the OCPP-J server
117 reconnectExponentialDelay | true/false | false | boolean | connection delay retry to the OCPP-J server
118 registrationMaxRetries | | -1 (unlimited) | integer | charging stations boot notification retries
119 enableStatistics | true/false | true | boolean | enable charging stations statistics
120 mayAuthorizeAtRemoteStart | true/false | true | boolean | always send authorize at remote start transaction when AuthorizeRemoteTxRequests is enabled
121 beginEndMeterValues | true/false | false | boolean | enable Transaction.{Begin,End} MeterValues
122 outOfOrderEndMeterValues | true/false | false | boolean | send Transaction.End MeterValues out of order. Need to relax OCPP specifications strict compliance ('ocppStrictCompliance' parameter)
123 meteringPerTransaction | true/false | true | boolean | enable metering history on a per transaction basis
124 transactionDataMeterValues | true/false | false | boolean | enable transaction data MeterValues at stop transaction
125 mainVoltageMeterValues | true/false | true | boolean | include charging station main voltage MeterValues on three phased charging stations
126 phaseLineToLineVoltageMeterValues | true/false | true | boolean | include charging station line to line voltage MeterValues on three phased charging stations
127 Configuration | | | ChargingStationConfiguration | charging stations OCPP parameters configuration section
128 AutomaticTransactionGenerator | | | AutomaticTransactionGenerator | charging stations ATG configuration section
129 Connectors | | | Connectors | charging stations connectors configuration section
130
131 #### Configuration section
132
133 ```json
134 "Configuration": {
135 "configurationKey": [
136 ...
137 {
138 "key": "StandardKey",
139 "readonly": false,
140 "value": "StandardValue",
141 "visible": true,
142 "reboot": false
143 },
144 ...
145 {
146 "key": "VendorKey",
147 "readonly": false,
148 "value": "VendorValue",
149 "visible": false,
150 "reboot": true
151 },
152 ...
153 ]
154 }
155 ```
156
157 #### AutomaticTransactionGenerator section
158
159 ```json
160 "AutomaticTransactionGenerator": {
161 "enable": false,
162 "minDuration": 60,
163 "maxDuration": 80,
164 "minDelayBetweenTwoTransactions": 15,
165 "maxDelayBetweenTwoTransactions": 30,
166 "probabilityOfStart": 1,
167 "stopAfterHours": 0.3,
168 "stopOnConnectionFailure": true,
169 "requireAuthorize": true
170 }
171 ```
172 #### Connectors section
173
174 ```json
175 "Connectors": {
176 "0": {},
177 "1": {
178 "bootStatus": "Available",
179 "MeterValues": [
180 ...
181 {
182 "unit": "W",
183 "measurand": "Power.Active.Import",
184 "phase": "L1-N",
185 "value": "5000",
186 "fluctuationPercent": "10"
187 },
188 ...
189 {
190 "unit": "A",
191 "measurand": "Current.Import"
192 },
193 ...
194 {
195 "unit": "Wh"
196 },
197 ...
198 ]
199 }
200 },
201 ```
202
203 ## Start
204
205 To start the program, run: `npm start`.
206
207 ## Docker
208
209 In the [docker](./docker) folder:
210
211 ```bash
212 make
213 ```
214
215 Or with the optional git submodules:
216
217 ```bash
218 make SUBMODULES_INIT=true
219 ```
220
221 ## OCPP-J commands supported
222
223 ### Version 1.6
224
225 #### Core Profile
226
227 - :white_check_mark: Authorize
228 - :white_check_mark: BootNotification
229 - :white_check_mark: ChangeAvailability
230 - :white_check_mark: ChangeConfiguration
231 - :white_check_mark: ClearCache
232 - :x: DataTransfer
233 - :white_check_mark: GetConfiguration
234 - :white_check_mark: Heartbeat
235 - :white_check_mark: MeterValues
236 - :white_check_mark: RemoteStartTransaction
237 - :white_check_mark: RemoteStopTransaction
238 - :white_check_mark: Reset
239 - :white_check_mark: StartTransaction
240 - :white_check_mark: StatusNotification
241 - :white_check_mark: StopTransaction
242 - :white_check_mark: UnlockConnector
243
244 #### Firmware Management Profile
245
246 - :white_check_mark: GetDiagnostics
247 - :white_check_mark: DiagnosticsStatusNotification
248 - :x: FirmwareStatusNotification
249 - :x: UpdateFirmware
250
251 #### Local Auth List Management Profile
252
253 - :x: GetLocalListVersion
254 - :x: SendLocalList
255
256 #### Reservation Profile
257
258 - :x: CancelReservation
259 - :x: ReserveNow
260
261 #### Smart Charging Profile
262
263 - :white_check_mark: ClearChargingProfile
264 - :white_check_mark: GetCompositeSchedule
265 - :white_check_mark: SetChargingProfile
266
267 #### Remote Trigger Profile
268
269 - :white_check_mark: TriggerMessage
270
271 ## OCPP-J standard parameters supported
272
273 All kind of OCPP parameters are supported in a charging station template. The list here mention the standard ones also handled automatically in the simulator.
274
275 ### Version 1.6
276
277 #### Core Profile
278
279 - :white_check_mark: AuthorizeRemoteTxRequests (type: boolean) (units: -)
280 - :x: ClockAlignedDataInterval (type: integer) (units: seconds)
281 - :white_check_mark: ConnectionTimeOut (type: integer) (units: seconds)
282 - :x: GetConfigurationMaxKeys (type: integer) (units: -)
283 - :white_check_mark: HeartbeatInterval (type: integer) (units: seconds)
284 - :x: LocalAuthorizeOffline (type: boolean) (units: -)
285 - :x: LocalPreAuthorize (type: boolean) (units: -)
286 - :x: MeterValuesAlignedData (type: CSL) (units: -)
287 - :white_check_mark: MeterValuesSampledData (type: CSL) (units: -)
288 - :white_check_mark: MeterValueSampleInterval (type: integer) (units: seconds)
289 - :white_check_mark: NumberOfConnectors (type: integer) (units: -)
290 - :x: ResetRetries (type: integer) (units: times)
291 - :white_check_mark: ConnectorPhaseRotation (type: CSL) (units: -)
292 - :x: StopTransactionOnEVSideDisconnect (type: boolean) (units: -)
293 - :x: StopTransactionOnInvalidId (type: boolean) (units: -)
294 - :x: StopTxnAlignedData (type: CSL) (units: -)
295 - :x: StopTxnSampledData (type: CSL) (units: -)
296 - :white_check_mark: SupportedFeatureProfiles (type: CSL) (units: -)
297 - :x: TransactionMessageAttempts (type: integer) (units: times)
298 - :x: TransactionMessageRetryInterval (type: integer) (units: seconds)
299 - :x: UnlockConnectorOnEVSideDisconnect (type: boolean) (units: -)
300 - :white_check_mark: WebSocketPingInterval (type: integer) (units: seconds)
301
302 #### Firmware Management Profile
303
304 - *none*
305
306 #### Local Auth List Management Profile
307
308 - :white_check_mark: LocalAuthListEnabled (type: boolean) (units: -)
309 - :x: LocalAuthListMaxLength (type: integer) (units: -)
310 - :x: SendLocalListMaxLength (type: integer) (units: -)
311
312 #### Reservation Profile
313
314 - *none*
315
316 #### Smart Charging Profile
317
318 - :x: ChargeProfileMaxStackLevel (type: integer) (units: -)
319 - :x: ChargingScheduleAllowedChargingRateUnit (type: CSL) (units: -)
320 - :x: ChargingScheduleMaxPeriods (type: integer) (units: -)
321 - :x: MaxChargingProfilesInstalled (type: integer) (units: -)
322
323 #### Remote Trigger Profile
324
325 - *none*
326
327 ## License
328
329 This file and all other files in this repository are licensed under the Apache Software License, v.2 and copyrighted under the copyright in [NOTICE](NOTICE) file, except as noted otherwise in the [LICENSE](LICENSE) file or the code source file header.
330
331 Please note that Docker images can contain other software which may be licensed under different licenses. This LICENSE and NOTICE files are also included in the Docker image. For any usage of built Docker images please make sure to check the licenses of the artifacts contained in the images.