1 # [charging-stations-simulator](https://github.com/jerome-benoit/charging-stations-simulator)
5 Simple [node.js](https://nodejs.org/) program to simulate a set of charging stations based on the OCPP-J 1.6 protocol.
11 * [Chocolatey](https://chocolatey.org/):
14 choco install -y nodejs-lts
19 * [Homebrew](https://brew.sh/):
27 * [NodeSource](https://github.com/nodesource/distributions) Node.js Binary Distributions for version 14.X
29 ## Configuration syntax
31 All configuration files are in the JSON standard format.
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).
35 All charging station templates are in the directory [src/assets/station-templates](src/assets/station-templates).
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).
39 The charging stations simulator have an automatic configuration files reload feature at change for:
41 * charging station templates;
42 * authorization RFID tags.
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.
46 ### Main configuration
48 **src/assets/config.json**:
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)
73 #### Worker process model:
76 Worker set executing each a static number (chargingStationsPerWorker) of simulated charging stations from the total
79 Statically sized worker pool executing a static total number of simulated charging stations
82 Dynamically sized worker pool executing a static total number of simulated charging stations
84 ### Charging station template
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
131 #### Configuration section
135 "configurationKey": [
138 "key": "StandardKey",
140 "value": "StandardValue",
148 "value": "VendorValue",
157 #### AutomaticTransactionGenerator section
160 "AutomaticTransactionGenerator": {
164 "minDelayBetweenTwoTransactions": 15,
165 "maxDelayBetweenTwoTransactions": 30,
166 "probabilityOfStart": 1,
167 "stopAfterHours": 0.3,
168 "stopOnConnectionFailure": true,
169 "requireAuthorize": true
172 #### Connectors section
178 "bootStatus": "Available",
183 "measurand": "Power.Active.Import",
186 "fluctuationPercent": "10"
191 "measurand": "Current.Import"
205 To start the program, run: `npm start`.
209 In the [docker](./docker) folder:
215 Or with the optional git submodules:
218 make SUBMODULES_INIT=true
221 ## OCPP-J commands supported
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
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
244 #### Firmware Management Profile
246 - :white_check_mark: GetDiagnostics
247 - :white_check_mark: DiagnosticsStatusNotification
248 - :x: FirmwareStatusNotification
251 #### Local Auth List Management Profile
253 - :x: GetLocalListVersion
256 #### Reservation Profile
258 - :x: CancelReservation
261 #### Smart Charging Profile
263 - :white_check_mark: ClearChargingProfile
264 - :white_check_mark: GetCompositeSchedule
265 - :white_check_mark: SetChargingProfile
267 #### Remote Trigger Profile
269 - :white_check_mark: TriggerMessage
271 ## OCPP-J standard parameters supported
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.
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)
302 #### Firmware Management Profile
306 #### Local Auth List Management Profile
308 - :white_check_mark: LocalAuthListEnabled (type: boolean) (units: -)
309 - :x: LocalAuthListMaxLength (type: integer) (units: -)
310 - :x: SendLocalListMaxLength (type: integer) (units: -)
312 #### Reservation Profile
316 #### Smart Charging Profile
318 - :x: ChargeProfileMaxStackLevel (type: integer) (units: -)
319 - :x: ChargingScheduleAllowedChargingRateUnit (type: CSL) (units: -)
320 - :x: ChargingScheduleMaxPeriods (type: integer) (units: -)
321 - :x: MaxChargingProfilesInstalled (type: integer) (units: -)
323 #### Remote Trigger Profile
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.
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.