To start the program, run: `npm start`.
-To start the program with a UI controller, run: `npm run start:server`.
-Then, 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.
+## Start Web UI
+
+See Web UI [README.md](src/ui/web/README.md) for more information.
## Configuration files syntax
| logFile | | combined.log | string | log file relative path |
| logErrorFile | | error.log | string | error log file relative path |
| worker | | {<br />"processType": "workerSet",<br />"startDelay": 500,<br />"elementStartDelay": 0,<br />"elementsPerWorker": 1,<br />"poolMinSize": 4,<br />"poolMaxSize": 16,<br />"poolStrategy": "ROUND_ROBBIN"<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 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 |
-| uiServer | | {<br />"enabled": true,<br />"options": {<br />"host: "localhost",<br />"port": 8080<br />}<br />} | {<br />enabled: boolean;<br />options: ServerOptions;<br />} | UI WebSocket server configuration section |
+| uiServer | | {<br />"enabled": true,<br />"type": "ws",<br />"options": {<br />"host: "localhost",<br />"port": 8080<br />}<br />} | {<br />enabled: boolean;<br />type: ApplicationProtocol;<br />options: ServerOptions;<br />} | UI server configuration section |
| 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 |
| 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) |
| 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 |
| amperageLimitationUnit | A/cA/dA/mA | A | string | charging stations amperage limit unit |
| enableStatistics | true/false | true | boolean | enable charging stations statistics |
-| mayAuthorizeAtRemoteStart | true/false | true | boolean | always send authorize at remote start transaction when AuthorizeRemoteTxRequests is enabled |
-| payloadSchemaValidation | true/false | true | boolean | validate OCPP commands PDU against OCA JSON schemas |
+| mustAuthorizeAtRemoteStart | true/false | true | boolean | always send authorize at remote start transaction when AuthorizeRemoteTxRequests is enabled |
+| payloadSchemaValidation | true/false | true | boolean | validate OCPP commands PDU against [OCA](https://www.openchargealliance.org/) JSON schemas |
| beginEndMeterValues | true/false | false | boolean | enable Transaction.{Begin,End} MeterValues |
| outOfOrderEndMeterValues | true/false | false | boolean | send Transaction.End MeterValues out of order. Need to relax OCPP specifications strict compliance ('ocppStrictCompliance' parameter) |
| meteringPerTransaction | true/false | true | boolean | enable metering history on a per transaction basis |
## UI protocol
-Protocol to control the simulator via a Websocket protocol
+Protocol to control the simulator via a Websocket or HTTP server.
+
+### WebSocket Protocol
+
+PDU stands for Protocol Data Unit.
+
+- Request:
+ [`uuid`, `ProcedureName`, `PDU`]
+ `uuid`: String uniquely representing this request
+ `ProcedureName`: The procedure to run on the simulator
+ `PDU`: The parameters for said procedure
+
+- Response:
+ [`uuid`, `PDU`]
+ `uuid`: String uniquely linking the response to the request
+ `PDU`: Response data to requested procedure
### Version 0.0.1
-Set the HTTP header Sec-Websocket-Protocol to `ui0.0.1`
+Set the WebSocket header _Sec-Websocket-Protocol_ to `ui0.0.1`.
-#### Protocol
+#### Procedures
-Request:
-[`uuid`, `ProcedureName`, `PDU`]
+##### Start Simulator
-`uuid`: String uniquely representing this request
-`ProcedureName`: The procedure to run on the simulator
-`PDU (for Protocol Data Unit)`: The parameters (if any) for said procedure
+- Request:
+ `ProcedureName`: 'startSimulator'
+ `PDU`: {}
-Response:
-[`uuid`, `PDU`]
+- Response:
+ `PDU`: {
+ `status`
+ }
-`uuid`: String uniquely linking the response to the request
-`PDU`: Response data to requested procedure
+##### Stop Simulator
-#### Procedures
+- Request:
+ `ProcedureName`: 'stopSimulator'
+ `PDU`: {}
-##### List Charging stations
+- Response:
+ `PDU`: {
+ `status`
+ }
-Request:
-`ProcedureName`: 'listChargingStation'
-`PDU`: {}
+##### List Charging Stations
-Response:
-`PDU`: {
-`status`,
-An array of ChargingStationData as described in `ChargingStationWorker.ts` file
-}
+- Request:
+ `ProcedureName`: 'listChargingStations'
+ `PDU`: {}
+
+- Response:
+ `PDU`: {
+ `status`,
+ `index`: ChargingStationData,
+ ...
+ `index`: ChargingStationData
+ }
##### Start Transaction
-Request:
-`ProcedureName`: 'startTransaction'
-`PDU`: {
-`hashId`: the unique identifier of a chargingStation
-`connectorId`: the id of the connector (start at 1)
-`idTag`: An allowed badge authetification ID
-}
+- Request:
+ `ProcedureName`: 'startTransaction'
+ `PDU`: {
+ `hashId`: charging station unique identifier string (deprecated) | `hashIds`: charging station unique identifier strings array,
+ `connectorId`: connector id integer,
+ `idTag`: RFID tag string
+ }
-Response:
-`PDU`: {
-`status`,
-**null**
-}
+- Response:
+ `PDU`: {
+ `status`
+ }
##### Stop Transaction
-Request:
-`ProcedureName`: 'stopTransaction'
-`PDU`: {
-`hashId`: the unique identifier of a chargingStation
-`transactionId`: the id of the transaction
-}
-
-Response:
-`PDU`: {
-`status`,
-**null**
-}
+- Request:
+ `ProcedureName`: 'stopTransaction'
+ `PDU`: {
+ `hashId`: charging station unique identifier string (deprecated) | `hashIds`: charging station unique identifier strings array,
+ `transactionId`: transaction id integer
+ }
+
+- Response:
+ `PDU`: {
+ `status`
+ }
+
+##### Start Charging Station
+
+- Request:
+ `ProcedureName`: 'startChargingStation'
+ `PDU`: {
+ `hashId`: charging station unique identifier string (deprecated) | `hashIds`: charging station unique identifier strings array
+ }
+
+- Response:
+ `PDU`: {
+ `status`
+ }
+
+##### Stop Charging Station
+
+- Request:
+ `ProcedureName`: 'stopChargingStation'
+ `PDU`: {
+ `hashId`: charging station unique identifier string (deprecated) | `hashIds`: charging station unique identifier strings array
+ }
+
+- Response:
+ `PDU`: {
+ `status`
+ }
+
+##### Open Connection
+
+- Request:
+ `ProcedureName`: 'openConnection'
+ `PDU`: {
+ `hashId`: charging station unique identifier string (deprecated) | `hashIds`: charging station unique identifier strings array
+ }
+
+- Response:
+ `PDU`: {
+ `status`
+ }
+
+##### Close Connection
+
+- Request:
+ `ProcedureName`: 'closeConnection'
+ `PDU`: {
+ `hashId`: charging station unique identifier string (deprecated) | `hashIds`: charging station unique identifier strings array
+ }
+
+- Response:
+ `PDU`: {
+ `status`
+ }
+
+### HTTP Protocol
+
+A Postman or [Insomnia](https://insomnia.rest/) collection, to learn how to use the HTTP protocol to pilot the simulator, is available.
## Support, Feedback, Contributing