+### Version 2.x.x
+
+## UI protocol
+
+Protocol to control the simulator via a Websocket or HTTP server.
+
+### HTTP Protocol
+
+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.
+
+### Websocket Protocol
+
+SRPC protocol over Websocket. 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 parameters to requested procedure
+
+An [Insomnia](https://insomnia.rest/) WebSocket requests collection is available in [src/assets/ui-protocol](./src/assets/ui-protocol) directory.
+
+#### Version 0.0.1
+
+Set the Websocket header _Sec-Websocket-Protocol_ to `ui0.0.1`.
+
+##### Procedures
+
+###### Start Simulator
+
+- Request:
+ `ProcedureName`: 'startSimulator'
+ `PDU`: {}
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure'
+ }
+
+###### Stop Simulator
+
+- Request:
+ `ProcedureName`: 'stopSimulator'
+ `PDU`: {}
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure'
+ }
+
+###### List Charging Stations
+
+- Request:
+ `ProcedureName`: 'listChargingStations'
+ `PDU`: {}
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `chargingStations`: ChargingStationData[]
+ }
+
+###### Start Charging Station
+
+- Request:
+ `ProcedureName`: 'startChargingStation'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
+ }
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional)
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+###### Stop Charging Station
+
+- Request:
+ `ProcedureName`: 'stopChargingStation'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
+ }
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+###### Open Connection
+
+- Request:
+ `ProcedureName`: 'openConnection'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
+ }
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+###### Close Connection
+
+- Request:
+ `ProcedureName`: 'closeConnection'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations)
+ }
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+###### Start Automatic Transaction Generator
+
+- Request:
+ `ProcedureName`: 'startAutomaticTransactionGenerator'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
+ `connectorIds`: connector id integer array (optional, default: all connectors)
+ }
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+###### Stop Automatic Transaction Generator
+
+- Request:
+ `ProcedureName`: 'stopAutomaticTransactionGenerator'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
+ `connectorIds`: connector id integer array (optional, default: all connectors)
+ }
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+###### OCPP commands trigger
+
+- Request:
+ `ProcedureName`: 'commandName' (the OCPP command name in camel case)
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
+ ...`commandPayload`
+ } (the OCPP command payload with some optional fields added to target the simulated charging stations)
+
+- Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+Examples:
+
+- **Start Transaction**
+
+ - Request:
+ `ProcedureName`: 'startTransaction'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
+ `connectorId`: connector id integer,
+ `idTag`: RFID tag string
+ }
+
+ - Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+- **Stop Transaction**
+
+ - Request:
+ `ProcedureName`: 'stopTransaction'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
+ `transactionId`: transaction id integer
+ }
+
+ - Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+- **Status Notification**
+
+ - Request:
+ `ProcedureName`: 'statusNotification'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
+ `connectorId`: connector id integer,
+ `errorCode`: connector error code,
+ `status`: connector status
+ }
+
+ - Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+
+- **Heartbeat**
+
+ - Request:
+ `ProcedureName`: 'heartbeat'
+ `PDU`: {
+ `hashIds`: charging station unique identifier strings array (optional, default: all charging stations),
+ }
+
+ - Response:
+ `PDU`: {
+ `status`: 'success' | 'failure',
+ `hashIdsSucceeded`: charging station unique identifier strings array,
+ `hashIdsFailed`: charging station unique identifier strings array (optional),
+ `responsesFailed`: failed responses payload array (optional)
+ }
+