Merge branch 'main' into reservation-feature
authorJérôme Benoit <jerome.benoit@sap.com>
Mon, 5 Jun 2023 15:36:45 +0000 (17:36 +0200)
committerGitHub <noreply@github.com>
Mon, 5 Jun 2023 15:36:45 +0000 (17:36 +0200)
1  2 
README.md
src/charging-station/ChargingStation.ts
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/charging-station/ocpp/1.6/OCPP16ResponseService.ts
src/charging-station/ocpp/OCPPConstants.ts

diff --combined README.md
index 7ed5d2672d75d8871e064624bbd5b769e02da3b2,e3a202ea7226121850ab5060f091b162188ca3bf..04771de2ff6647df14b63ec162a88ec675766dba
+++ b/README.md
@@@ -7,7 -7,7 +7,7 @@@
  
  ## Summary
  
- Simple [node.js](https://nodejs.org/) software to simulate and scale a set of charging stations based on the OCPP-J 1.6 protocol as part of SAP e-Mobility solution.
+ Simple [node.js](https://nodejs.org/) software to simulate and scale a set of charging stations based on the OCPP-J protocol as part of [SAP e-Mobility](https://www.sap.com/products/scm/e-mobility.html) solution.
  
  ## Prerequisites
  
@@@ -78,7 -78,7 +78,7 @@@ The charging stations simulator's confi
  
  All charging station configuration templates are in the directory [src/assets/station-templates](src/assets/station-templates).
  
- A list of RFID tags must be defined for the automatic transaction generator in a file with a default location and name: `src/assets/idtags.json`. A template file is available at [src/assets/idtags-template.json](src/assets/idtags-template.json).
+ A list of RFID tags must be defined for the automatic transaction generator in a file with the default location and name: `src/assets/idtags.json`. A template file is available at [src/assets/idtags-template.json](src/assets/idtags-template.json).
  
  **Configuration files hierarchy and priority**:
  
  2. charging station configuration template: [src/assets/station-templates](src/assets/station-templates);
  3. charging stations simulator configuration: [src/assets/config.json](src/assets/config.json).
  
- The charging stations simulator have an automatic configuration files reload feature at change for:
+ The charging stations simulator has an automatic configuration files reload feature at change for:
  
  - charging stations simulator configuration;
  - charging station configuration templates;
  - charging station authorization RFID tags lists.
  
- But the modifications to test have to be done to the files in the build target 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.
+ But the modifications to test have to be done to the files in the build target directory [dist/assets](dist/assets). Once the modifications are done, they have to be reported to the matching files in the build source directory [src/assets](src/assets) to ensure they will be taken into account at next build.
  
  ### Charging stations simulator configuration
  
  | supervisionUrls            |                                                  | []                                                                                                                                                                                                            | string \| string[]                                                                                                                                                                                                                  | string or array of global connection URIs to OCPP-J servers                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
  | supervisionUrlDistribution | round-robin/random/charging-station-affinity     | charging-station-affinity                                                                                                                                                                                     | boolean                                                                                                                                                                                                                             | supervision urls distribution policy to simulated charging stations                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
  | logStatisticsInterval      |                                                  | 60                                                                                                                                                                                                            | integer                                                                                                                                                                                                                             | seconds between charging stations statistics output in the logs                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
+ | logEnabled                 | true/false                                       | true                                                                                                                                                                                                          | boolean                                                                                                                                                                                                                             | enable logging                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
  | logConsole                 | true/false                                       | false                                                                                                                                                                                                         | boolean                                                                                                                                                                                                                             | output logs on the console                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
  | logFormat                  |                                                  | simple                                                                                                                                                                                                        | string                                                                                                                                                                                                                              | [winston](https://github.com/winstonjs/winston) log format                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
  | logRotate                  | true/false                                       | true                                                                                                                                                                                                          | boolean                                                                                                                                                                                                                             | enable daily log files rotation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
  
  **src/assets/station-templates/\<name\>.json**:
  
- | Key                                | Value(s)      | Default Value                                                                                                                       | Value type                                                                                                                                                               | Description                                                                                                                                                                                                                         |
- | ---------------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
- | supervisionUrls                    |               | []                                                                                                                                  | string \| string[]                                                                                                                                                       | string or array of connection URIs to OCPP-J servers                                                                                                                                                                                |
- | supervisionUser                    |               | undefined                                                                                                                           | string                                                                                                                                                                   | basic HTTP authentication user to OCPP-J server                                                                                                                                                                                     |
- | supervisionPassword                |               | undefined                                                                                                                           | string                                                                                                                                                                   | basic HTTP authentication password to OCPP-J server                                                                                                                                                                                 |
- | supervisionUrlOcppConfiguration    | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | allow supervision URL configuration via a vendor OCPP parameter key                                                                                                                                                                 |
- | supervisionUrlOcppKey              |               | 'ConnectionUrl'                                                                                                                     | string                                                                                                                                                                   | the vendor string that will be used as a vendor OCPP parameter key to set the supervision URL                                                                                                                                       |
- | ocppVersion                        | 1.6/2.0/2.0.1 | 1.6                                                                                                                                 | string                                                                                                                                                                   | OCPP version                                                                                                                                                                                                                        |
- | ocppProtocol                       | json          | json                                                                                                                                | string                                                                                                                                                                   | OCPP protocol                                                                                                                                                                                                                       |
- | ocppStrictCompliance               | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | strict adherence to the OCPP version and protocol specifications                                                                                                                                                                    |
- | 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](dist/assets/configurations)                        |
- | 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](dist/assets/configurations) |
- | wsOptions                          |               | {}                                                                                                                                  | ClientOptions & ClientRequestArgs                                                                                                                                        | [ws](https://github.com/websockets/ws) and node.js [http](https://nodejs.org/api/http.html) clients options intersection                                                                                                            |
- | idTagsFile                         |               | undefined                                                                                                                           | string                                                                                                                                                                   | RFID tags list file relative to src/assets path                                                                                                                                                                                     |
- | baseName                           |               | undefined                                                                                                                           | string                                                                                                                                                                   | base name to build charging stations id                                                                                                                                                                                             |
- | nameSuffix                         |               | undefined                                                                                                                           | string                                                                                                                                                                   | name suffix to build charging stations id                                                                                                                                                                                           |
- | fixedName                          | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | use the baseName as the charging stations unique name                                                                                                                                                                               |
- | chargePointModel                   |               | undefined                                                                                                                           | string                                                                                                                                                                   | charging stations model                                                                                                                                                                                                             |
- | chargePointVendor                  |               | undefined                                                                                                                           | string                                                                                                                                                                   | charging stations vendor                                                                                                                                                                                                            |
- | chargePointSerialNumberPrefix      |               | undefined                                                                                                                           | string                                                                                                                                                                   | charge point serial number prefix                                                                                                                                                                                                   |
- | chargeBoxSerialNumberPrefix        |               | undefined                                                                                                                           | string                                                                                                                                                                   | charge box serial number prefix (deprecated in OCPP 1.6)                                                                                                                                                                            |
- | firmwareVersionPattern             |               | Semantic versionning regular expression: https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string | string                                                                                                                                                                   | charging stations firmware version pattern                                                                                                                                                                                          |
- | firmwareVersion                    |               | undefined                                                                                                                           | string                                                                                                                                                                   | charging stations firmware version                                                                                                                                                                                                  |
- | power                              |               |                                                                                                                                     | float \| float[]                                                                                                                                                         | charging stations maximum power value(s)                                                                                                                                                                                            |
- | powerSharedByConnectors            | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | charging stations power shared by its connectors                                                                                                                                                                                    |
- | powerUnit                          | W/kW          | W                                                                                                                                   | string                                                                                                                                                                   | charging stations power unit                                                                                                                                                                                                        |
- | currentOutType                     | AC/DC         | AC                                                                                                                                  | string                                                                                                                                                                   | charging stations current out type                                                                                                                                                                                                  |
- | voltageOut                         |               | AC:230/DC:400                                                                                                                       | integer                                                                                                                                                                  | charging stations voltage out                                                                                                                                                                                                       |
- | numberOfPhases                     | 0/1/3         | AC:3/DC:0                                                                                                                           | integer                                                                                                                                                                  | charging stations number of phase(s)                                                                                                                                                                                                |
- | numberOfConnectors                 |               |                                                                                                                                     | integer \| integer[]                                                                                                                                                     | charging stations number of connector(s)                                                                                                                                                                                            |
- | useConnectorId0                    | true/false    | true                                                                                                                                | boolean                                                                                                                                                                  | use connector id 0 definition from the charging station configuration template                                                                                                                                                      |
- | randomConnectors                   | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | randomize runtime connector id affectation from the connector id definition in charging station configuration template                                                                                                              |
- | resetTime                          |               | 60                                                                                                                                  | integer                                                                                                                                                                  | seconds to wait before the charging stations come back at reset                                                                                                                                                                     |
- | autoRegister                       | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | set charging stations as registered at boot notification for testing purpose                                                                                                                                                        |
- | autoReconnectMaxRetries            |               | -1 (unlimited)                                                                                                                      | integer                                                                                                                                                                  | connection retries to the OCPP-J server                                                                                                                                                                                             |
- | reconnectExponentialDelay          | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | connection delay retry to the OCPP-J server                                                                                                                                                                                         |
- | registrationMaxRetries             |               | -1 (unlimited)                                                                                                                      | integer                                                                                                                                                                  | charging stations boot notification retries                                                                                                                                                                                         |
- | 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    | false                                                                                                                               | boolean                                                                                                                                                                  | enable charging stations statistics                                                                                                                                                                                                 |
- | 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                                                                                                                                                                                  |
- | transactionDataMeterValues         | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | enable transaction data MeterValues at stop transaction                                                                                                                                                                             |
- | mainVoltageMeterValues             | true/false    | true                                                                                                                                | boolean                                                                                                                                                                  | include charging stations main voltage MeterValues on three phased charging stations                                                                                                                                                |
- | phaseLineToLineVoltageMeterValues  | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | include charging stations line to line voltage MeterValues on three phased charging stations                                                                                                                                        |
- | customValueLimitationMeterValues   | true/false    | true                                                                                                                                | boolean                                                                                                                                                                  | enable limitation on custom fluctuated value in MeterValues                                                                                                                                                                         |
- | firmwareUpgrade                    |               | {<br />"versionUpgrade": {<br />"step": 1<br />},<br />"reset": true<br />}                                                         | {<br />versionUpgrade: {<br />patternGroup: number;<br />step: number;<br />};<br />reset: boolean;<br />failureStatus: 'DownloadFailed' \| 'InstallationFailed';<br />} | Configuration section for simulating firmware upgrade support.                                                                                                                                                                      |
- | commandsSupport                    |               | {<br />"incomingCommands": {},<br />"outgoingCommands": {}<br />}                                                                   | {<br /> incomingCommands: Record<IncomingRequestCommand, boolean>;<br />outgoingCommands?: Record<RequestCommand, boolean>;<br />}                                       | Configuration section for OCPP commands support. Empty section or subsections means all implemented OCPP commands are supported                                                                                                     |
- | messageTriggerSupport              |               | {}                                                                                                                                  | Record<MessageTrigger, boolean>                                                                                                                                          | Configuration section for OCPP commands trigger support. Empty section means all implemented OCPP trigger commands are supported                                                                                                    |
- | Configuration                      |               |                                                                                                                                     | ChargingStationOcppConfiguration                                                                                                                                         | charging stations OCPP parameters configuration section                                                                                                                                                                             |
- | AutomaticTransactionGenerator      |               |                                                                                                                                     | AutomaticTransactionGeneratorConfiguration                                                                                                                               | charging stations ATG configuration section                                                                                                                                                                                         |
- | Connectors                         |               |                                                                                                                                     | Record<string, ConnectorStatus>                                                                                                                                          | charging stations connectors configuration section                                                                                                                                                                                  |
- | Evses                              |               |                                                                                                                                     | Record<string, EvseTemplate>                                                                                                                                             | charging stations EVSEs configuration section                                                                                                                                                                                       |
+ | Key                                                  | Value(s)      | Default Value                                                                                                                       | Value type                                                                                                                                                               | Description                                                                                                                                                                                                                                |
+ | ---------------------------------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+ | supervisionUrls                                      |               | []                                                                                                                                  | string \| string[]                                                                                                                                                       | string or array of connection URIs to OCPP-J servers                                                                                                                                                                                       |
+ | supervisionUser                                      |               | undefined                                                                                                                           | string                                                                                                                                                                   | basic HTTP authentication user to OCPP-J server                                                                                                                                                                                            |
+ | supervisionPassword                                  |               | undefined                                                                                                                           | string                                                                                                                                                                   | basic HTTP authentication password to OCPP-J server                                                                                                                                                                                        |
+ | supervisionUrlOcppConfiguration                      | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | allow supervision URL configuration via a vendor OCPP parameter key                                                                                                                                                                        |
+ | supervisionUrlOcppKey                                |               | 'ConnectionUrl'                                                                                                                     | string                                                                                                                                                                   | the vendor string that will be used as a vendor OCPP parameter key to set the supervision URL                                                                                                                                              |
+ | ocppVersion                                          | 1.6/2.0/2.0.1 | 1.6                                                                                                                                 | string                                                                                                                                                                   | OCPP version                                                                                                                                                                                                                               |
+ | ocppProtocol                                         | json          | json                                                                                                                                | string                                                                                                                                                                   | OCPP protocol                                                                                                                                                                                                                              |
+ | ocppStrictCompliance                                 | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | strict adherence to the OCPP version and protocol specifications                                                                                                                                                                           |
+ | 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](dist/assets/configurations)                               |
+ | 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](dist/assets/configurations)        |
+ | automaticTransactionGeneratorPersistentConfiguration | true/false    | true                                                                                                                                | boolean                                                                                                                                                                  | enable persistent automatic transaction generator configuration storage by charging stations 'hashId'. The persistency is ensured by the charging stations configuration files in [dist/assets/configurations](dist/assets/configurations) |
+ | wsOptions                                            |               | {}                                                                                                                                  | ClientOptions & ClientRequestArgs                                                                                                                                        | [ws](https://github.com/websockets/ws) and node.js [http](https://nodejs.org/api/http.html) clients options intersection                                                                                                                   |
+ | idTagsFile                                           |               | undefined                                                                                                                           | string                                                                                                                                                                   | RFID tags list file relative to [src/assets](src/assets) path                                                                                                                                                                              |
+ | baseName                                             |               | undefined                                                                                                                           | string                                                                                                                                                                   | base name to build charging stations id                                                                                                                                                                                                    |
+ | nameSuffix                                           |               | undefined                                                                                                                           | string                                                                                                                                                                   | name suffix to build charging stations id                                                                                                                                                                                                  |
+ | fixedName                                            | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | use the baseName as the charging stations unique name                                                                                                                                                                                      |
+ | chargePointModel                                     |               | undefined                                                                                                                           | string                                                                                                                                                                   | charging stations model                                                                                                                                                                                                                    |
+ | chargePointVendor                                    |               | undefined                                                                                                                           | string                                                                                                                                                                   | charging stations vendor                                                                                                                                                                                                                   |
+ | chargePointSerialNumberPrefix                        |               | undefined                                                                                                                           | string                                                                                                                                                                   | charge point serial number prefix                                                                                                                                                                                                          |
+ | chargeBoxSerialNumberPrefix                          |               | undefined                                                                                                                           | string                                                                                                                                                                   | charge box serial number prefix (deprecated in OCPP 1.6)                                                                                                                                                                                   |
+ | firmwareVersionPattern                               |               | Semantic versionning regular expression: https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string | string                                                                                                                                                                   | charging stations firmware version pattern                                                                                                                                                                                                 |
+ | firmwareVersion                                      |               | undefined                                                                                                                           | string                                                                                                                                                                   | charging stations firmware version                                                                                                                                                                                                         |
+ | power                                                |               |                                                                                                                                     | float \| float[]                                                                                                                                                         | charging stations maximum power value(s)                                                                                                                                                                                                   |
+ | powerSharedByConnectors                              | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | charging stations power shared by its connectors                                                                                                                                                                                           |
+ | powerUnit                                            | W/kW          | W                                                                                                                                   | string                                                                                                                                                                   | charging stations power unit                                                                                                                                                                                                               |
+ | currentOutType                                       | AC/DC         | AC                                                                                                                                  | string                                                                                                                                                                   | charging stations current out type                                                                                                                                                                                                         |
+ | voltageOut                                           |               | AC:230/DC:400                                                                                                                       | integer                                                                                                                                                                  | charging stations voltage out                                                                                                                                                                                                              |
+ | numberOfPhases                                       | 0/1/3         | AC:3/DC:0                                                                                                                           | integer                                                                                                                                                                  | charging stations number of phase(s)                                                                                                                                                                                                       |
+ | numberOfConnectors                                   |               |                                                                                                                                     | integer \| integer[]                                                                                                                                                     | charging stations number of connector(s)                                                                                                                                                                                                   |
+ | useConnectorId0                                      | true/false    | true                                                                                                                                | boolean                                                                                                                                                                  | use connector id 0 definition from the charging station configuration template                                                                                                                                                             |
+ | randomConnectors                                     | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | randomize runtime connector id affectation from the connector id definition in charging station configuration template                                                                                                                     |
+ | resetTime                                            |               | 60                                                                                                                                  | integer                                                                                                                                                                  | seconds to wait before the charging stations come back at reset                                                                                                                                                                            |
+ | autoRegister                                         | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | set charging stations as registered at boot notification for testing purpose                                                                                                                                                               |
+ | autoReconnectMaxRetries                              |               | -1 (unlimited)                                                                                                                      | integer                                                                                                                                                                  | connection retries to the OCPP-J server                                                                                                                                                                                                    |
+ | reconnectExponentialDelay                            | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | connection delay retry to the OCPP-J server                                                                                                                                                                                                |
+ | registrationMaxRetries                               |               | -1 (unlimited)                                                                                                                      | integer                                                                                                                                                                  | charging stations boot notification retries                                                                                                                                                                                                |
+ | 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    | false                                                                                                                               | boolean                                                                                                                                                                  | enable charging stations statistics                                                                                                                                                                                                        |
+ | 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                                                                                                                                                                                         |
+ | transactionDataMeterValues                           | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | enable transaction data MeterValues at stop transaction                                                                                                                                                                                    |
+ | mainVoltageMeterValues                               | true/false    | true                                                                                                                                | boolean                                                                                                                                                                  | include charging stations main voltage MeterValues on three phased charging stations                                                                                                                                                       |
+ | phaseLineToLineVoltageMeterValues                    | true/false    | false                                                                                                                               | boolean                                                                                                                                                                  | include charging stations line to line voltage MeterValues on three phased charging stations                                                                                                                                               |
+ | customValueLimitationMeterValues                     | true/false    | true                                                                                                                                | boolean                                                                                                                                                                  | enable limitation on custom fluctuated value in MeterValues                                                                                                                                                                                |
+ | firmwareUpgrade                                      |               | {<br />"versionUpgrade": {<br />"step": 1<br />},<br />"reset": true<br />}                                                         | {<br />versionUpgrade: {<br />patternGroup: number;<br />step: number;<br />};<br />reset: boolean;<br />failureStatus: 'DownloadFailed' \| 'InstallationFailed';<br />} | Configuration section for simulating firmware upgrade support.                                                                                                                                                                             |
+ | commandsSupport                                      |               | {<br />"incomingCommands": {},<br />"outgoingCommands": {}<br />}                                                                   | {<br /> incomingCommands: Record<IncomingRequestCommand, boolean>;<br />outgoingCommands?: Record<RequestCommand, boolean>;<br />}                                       | Configuration section for OCPP commands support. Empty section or subsections means all implemented OCPP commands are supported                                                                                                            |
+ | messageTriggerSupport                                |               | {}                                                                                                                                  | Record<MessageTrigger, boolean>                                                                                                                                          | Configuration section for OCPP commands trigger support. Empty section means all implemented OCPP trigger commands are supported                                                                                                           |
+ | Configuration                                        |               |                                                                                                                                     | ChargingStationOcppConfiguration                                                                                                                                         | charging stations OCPP parameters configuration section                                                                                                                                                                                    |
+ | AutomaticTransactionGenerator                        |               |                                                                                                                                     | AutomaticTransactionGeneratorConfiguration                                                                                                                               | charging stations ATG configuration section                                                                                                                                                                                                |
+ | Connectors                                           |               |                                                                                                                                     | Record<string, ConnectorStatus>                                                                                                                                          | charging stations connectors configuration section                                                                                                                                                                                         |
+ | Evses                                                |               |                                                                                                                                     | Record<string, EvseTemplate>                                                                                                                                             | charging stations EVSEs configuration section                                                                                                                                                                                              |
  
  #### Configuration section syntax example
  
@@@ -338,6 -340,10 +340,10 @@@ The syntax is similar to charging stati
  
  The syntax is similar to the charging station configuration template 'Configuration' section.
  
+ #### automaticTransactionGenerator section
+ The syntax is similar to the charging station configuration template 'AutomaticTransactionGenerator' section.
  ## Docker
  
  In the [docker](./docker) folder:
@@@ -389,8 -395,8 +395,8 @@@ make SUBMODULES_INIT=tru
  
  #### Reservation Profile
  
 -- :x: CancelReservation
 -- :x: ReserveNow
 +- :white_check_mark: CancelReservation
 +- :white_check_mark: ReserveNow
  
  #### Smart Charging Profile
  
  
  ## OCPP-J standard parameters supported
  
- All 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.
+ All kind of OCPP parameters are supported in charging station configuration or charging station configuration template file. The list here mention the standard ones also handled automatically in the simulator.
  
  ### Version 1.6
  
  
  #### Reservation Profile
  
 -- _none_
 +- :white_check_mark: ReserveConnectorZeroSupported (type: boolean) (units: -)
  
  #### Smart Charging Profile
  
index 82ed3b8c0da8ad579e767e6695010352a66b1343,9a8f468b37bee455378b890a2392a4e02a9dfefb..a3f6769607c5b01bb9774bf614a71f31a80a5afe
@@@ -67,11 -67,9 +67,12 @@@ import 
    PowerUnits,
    RegistrationStatusEnumType,
    RequestCommand,
 +  type Reservation,
 +  ReservationFilterKey,
 +  ReservationTerminationReason,
    type Response,
    StandardParametersKey,
+   type Status,
    type StatusNotificationRequest,
    type StatusNotificationResponse,
    StopTransactionReason,
@@@ -91,14 -89,16 +92,16 @@@ import 
    Configuration,
    Constants,
    DCElectricUtils,
-   ErrorUtils,
-   FileUtils,
-   MessageChannelUtils,
    Utils,
    buildChargingStationAutomaticTransactionGeneratorConfiguration,
    buildConnectorsStatus,
    buildEvsesStatus,
+   buildStartedMessage,
+   buildStoppedMessage,
+   buildUpdatedMessage,
+   handleFileException,
    logger,
+   watchJsonFile,
  } from '../utils';
  
  export class ChargingStation {
    private readonly sharedLRUCache: SharedLRUCache;
    private webSocketPingSetInterval!: NodeJS.Timeout;
    private readonly chargingStationWorkerBroadcastChannel: ChargingStationWorkerBroadcastChannel;
 +  private reservationExpiryDateSetInterval?: NodeJS.Timeout;
  
    constructor(index: number, templateFile: string) {
      this.started = false;
        );
      } else {
        logger.error(
 -        `${this.logPrefix()} Heartbeat interval set to ${this.getHeartbeatInterval()}, not starting the heartbeat`
 +        `${this.logPrefix()} Heartbeat interval set to ${this.getHeartbeatInterval()},
 +          not starting the heartbeat`
        );
      }
    }
      }
      if (!this.getConnectorStatus(connectorId)) {
        logger.error(
 -        `${this.logPrefix()} Trying to start MeterValues on non existing connector id ${connectorId.toString()}`
 +        `${this.logPrefix()} Trying to start MeterValues on non existing connector id
 +          ${connectorId.toString()}`
        );
        return;
      }
      if (this.getConnectorStatus(connectorId)?.transactionStarted === false) {
        logger.error(
 -        `${this.logPrefix()} Trying to start MeterValues on connector id ${connectorId} with no transaction started`
 +        `${this.logPrefix()} Trying to start MeterValues on connector id ${connectorId}
 +          with no transaction started`
        );
        return;
      } else if (
        Utils.isNullOrUndefined(this.getConnectorStatus(connectorId)?.transactionId)
      ) {
        logger.error(
 -        `${this.logPrefix()} Trying to start MeterValues on connector id ${connectorId} with no transaction id`
 +        `${this.logPrefix()} Trying to start MeterValues on connector id ${connectorId}
 +          with no transaction id`
        );
        return;
      }
          if (this.getEnableStatistics() === true) {
            this.performanceStatistics?.start();
          }
 +        if (this.hasFeatureProfile(SupportedFeatureProfiles.Reservation)) {
 +          this.startReservationExpiryDateSetInterval();
 +        }
          this.openWSConnection();
          // Monitor charging station template file
-         this.templateFileWatcher = FileUtils.watchJsonFile(
+         this.templateFileWatcher = watchJsonFile(
            this.templateFile,
            FileType.ChargingStationTemplate,
            this.logPrefix(),
            }
          );
          this.started = true;
-         parentPort?.postMessage(MessageChannelUtils.buildStartedMessage(this));
+         parentPort?.postMessage(buildStartedMessage(this));
          this.starting = false;
        } else {
          logger.warn(`${this.logPrefix()} Charging station is already starting...`);
          delete this.bootNotificationResponse;
          this.started = false;
          this.saveConfiguration();
-         parentPort?.postMessage(MessageChannelUtils.buildStoppedMessage(this));
+         parentPort?.postMessage(buildStoppedMessage(this));
          this.stopping = false;
        } else {
          logger.warn(`${this.logPrefix()} Charging station is already stopping...`);
        terminateOpened: false,
      }
    ): void {
-     options.handshakeTimeout = options?.handshakeTimeout ?? this.getConnectionTimeout() * 1000;
+     options = { handshakeTimeout: this.getConnectionTimeout() * 1000, ...options };
      params = { ...{ closeOpened: false, terminateOpened: false }, ...params };
      if (this.started === false && this.starting === false) {
        logger.warn(
 -        `${this.logPrefix()} Cannot open OCPP connection to URL ${this.wsConnectionUrl.toString()} on stopped charging station`
 +        `${this.logPrefix()} Cannot open OCPP connection to URL ${this.wsConnectionUrl.toString()}
 +          on stopped charging station`
        );
        return;
      }
  
      if (this.isWebSocketConnectionOpened() === true) {
        logger.warn(
 -        `${this.logPrefix()} OCPP connection to URL ${this.wsConnectionUrl.toString()} is already opened`
 +        `${this.logPrefix()} OCPP connection to URL ${this.wsConnectionUrl.toString()}
 +          is already opened`
        );
        return;
      }
        | undefined;
      const automaticTransactionGeneratorConfigurationFromFile =
        this.getConfigurationFromFile()?.automaticTransactionGenerator;
-     if (automaticTransactionGeneratorConfigurationFromFile) {
+     if (
+       this.getAutomaticTransactionGeneratorPersistentConfiguration() &&
+       automaticTransactionGeneratorConfigurationFromFile
+     ) {
        automaticTransactionGeneratorConfiguration =
          automaticTransactionGeneratorConfigurationFromFile;
      } else {
      };
    }
  
+   public getAutomaticTransactionGeneratorStatuses(): Status[] | undefined {
+     return this.getConfigurationFromFile()?.automaticTransactionGeneratorStatuses;
+   }
    public startAutomaticTransactionGenerator(connectorIds?: number[]): void {
      this.automaticTransactionGenerator = AutomaticTransactionGenerator.getInstance(this);
      if (Utils.isNotEmptyArray(connectorIds)) {
      } else {
        this.automaticTransactionGenerator?.start();
      }
-     this.saveChargingStationAutomaticTransactionGeneratorConfiguration();
-     parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(this));
+     this.saveAutomaticTransactionGeneratorConfiguration();
+     parentPort?.postMessage(buildUpdatedMessage(this));
    }
  
    public stopAutomaticTransactionGenerator(connectorIds?: number[]): void {
      } else {
        this.automaticTransactionGenerator?.stop();
      }
-     this.saveChargingStationAutomaticTransactionGeneratorConfiguration();
-     parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(this));
+     this.saveAutomaticTransactionGeneratorConfiguration();
+     parentPort?.postMessage(buildUpdatedMessage(this));
    }
  
    public async stopTransactionOnConnector(
      );
    }
  
 +  public getReservationOnConnectorId0Enabled(): boolean {
 +    return Utils.convertToBoolean(
 +      ChargingStationConfigurationUtils.getConfigurationKey(
 +        this,
 +        StandardParametersKey.ReserveConnectorZeroSupported
 +      ).value
 +    );
 +  }
 +
 +  public async addReservation(reservation: Reservation): Promise<void> {
 +    const [exists, reservationFound] = this.doesReservationExists(reservation);
 +    if (exists) {
 +      await this.removeReservation(reservationFound);
 +    }
 +    const connectorStatus = this.getConnectorStatus(reservation.connectorId);
 +    connectorStatus.reservation = reservation;
 +    connectorStatus.status = ConnectorStatusEnum.Reserved;
 +    if (reservation.connectorId === 0) {
 +      return;
 +    }
 +    await this.ocppRequestService.requestHandler<
 +      StatusNotificationRequest,
 +      StatusNotificationResponse
 +    >(
 +      this,
 +      RequestCommand.STATUS_NOTIFICATION,
 +      OCPPServiceUtils.buildStatusNotificationRequest(
 +        this,
 +        reservation.connectorId,
 +        ConnectorStatusEnum.Reserved
 +      )
 +    );
 +  }
 +
 +  public async removeReservation(
 +    reservation: Reservation,
 +    reason?: ReservationTerminationReason
 +  ): Promise<void> {
 +    const connector = this.getConnectorStatus(reservation.connectorId);
 +    switch (reason) {
 +      case ReservationTerminationReason.TRANSACTION_STARTED: {
 +        delete connector.reservation;
 +        if (reservation.connectorId === 0) {
 +          connector.status = ConnectorStatusEnum.Available;
 +        }
 +        break;
 +      }
 +      case ReservationTerminationReason.CONNECTOR_STATE_CHANGED: {
 +        delete connector.reservation;
 +        break;
 +      }
 +      default: {
 +        // ReservationTerminationReason.EXPIRED, ReservationTerminationReason.CANCELED
 +        connector.status = ConnectorStatusEnum.Available;
 +        delete connector.reservation;
 +        await this.ocppRequestService.requestHandler<
 +          StatusNotificationRequest,
 +          StatusNotificationResponse
 +        >(
 +          this,
 +          RequestCommand.STATUS_NOTIFICATION,
 +          OCPPServiceUtils.buildStatusNotificationRequest(
 +            this,
 +            reservation.connectorId,
 +            ConnectorStatusEnum.Available
 +          )
 +        );
 +        break;
 +      }
 +    }
 +  }
 +
 +  public getReservationBy(key: string, value: number | string): Reservation {
 +    if (this.hasEvses) {
 +      for (const evse of this.evses.values()) {
 +        for (const connector of evse.connectors.values()) {
 +          if (connector?.reservation?.[key] === value) {
 +            return connector.reservation;
 +          }
 +        }
 +      }
 +    } else {
 +      for (const connector of this.connectors.values()) {
 +        if (connector?.reservation?.[key] === value) {
 +          return connector.reservation;
 +        }
 +      }
 +    }
 +  }
 +
 +  public doesReservationExists(reservation: Partial<Reservation>): [boolean, Reservation] {
 +    const foundReservation = this.getReservationBy(
 +      ReservationFilterKey.RESERVATION_ID,
 +      reservation?.id
 +    );
 +    return Utils.isUndefined(foundReservation) ? [false, null] : [true, foundReservation];
 +  }
 +
 +  public startReservationExpiryDateSetInterval(customInterval?: number): void {
 +    const interval =
 +      customInterval ?? Constants.DEFAULT_RESERVATION_EXPIRATION_OBSERVATION_INTERVAL;
 +    logger.info(
 +      `${this.logPrefix()} Reservation expiration date interval is set to ${interval}
 +        and starts on CS now`
 +    );
 +    // eslint-disable-next-line @typescript-eslint/no-misused-promises
 +    this.reservationExpiryDateSetInterval = setInterval(async (): Promise<void> => {
 +      if (this.hasEvses) {
 +        for (const evse of this.evses.values()) {
 +          for (const connector of evse.connectors.values()) {
 +            if (connector?.reservation?.expiryDate.toString() < new Date().toISOString()) {
 +              await this.removeReservation(connector.reservation);
 +            }
 +          }
 +        }
 +      } else {
 +        for (const connector of this.connectors.values()) {
 +          if (connector?.reservation?.expiryDate.toString() < new Date().toISOString()) {
 +            await this.removeReservation(connector.reservation);
 +          }
 +        }
 +      }
 +    }, interval);
 +  }
 +
 +  public restartReservationExpiryDateSetInterval(): void {
 +    this.stopReservationExpiryDateSetInterval();
 +    this.startReservationExpiryDateSetInterval();
 +  }
 +
 +  public validateIncomingRequestWithReservation(connectorId: number, idTag: string): boolean {
 +    const reservation = this.getReservationBy(ReservationFilterKey.CONNECTOR_ID, connectorId);
 +    return !Utils.isUndefined(reservation) && reservation.idTag === idTag;
 +  }
 +
 +  public isConnectorReservable(
 +    reservationId: number,
 +    idTag?: string,
 +    connectorId?: number
 +  ): boolean {
 +    const [alreadyExists] = this.doesReservationExists({ id: reservationId });
 +    if (alreadyExists) {
 +      return alreadyExists;
 +    }
 +    const userReservedAlready = Utils.isUndefined(
 +      this.getReservationBy(ReservationFilterKey.ID_TAG, idTag)
 +    )
 +      ? false
 +      : true;
 +    const notConnectorZero = Utils.isUndefined(connectorId) ? true : connectorId > 0;
 +    const freeConnectorsAvailable = this.getNumberOfReservableConnectors() > 0;
 +    return !alreadyExists && !userReservedAlready && notConnectorZero && freeConnectorsAvailable;
 +  }
 +
 +  private getNumberOfReservableConnectors(): number {
 +    let reservableConnectors = 0;
 +    if (this.hasEvses) {
 +      for (const evse of this.evses.values()) {
 +        reservableConnectors = this.countReservableConnectors(evse.connectors);
 +      }
 +    } else {
 +      reservableConnectors = this.countReservableConnectors(this.connectors);
 +    }
 +    return reservableConnectors - this.getNumberOfReservationsOnConnectorZero();
 +  }
 +
 +  private countReservableConnectors(connectors: Map<number, ConnectorStatus>) {
 +    let reservableConnectors = 0;
 +    for (const [id, connector] of connectors) {
 +      if (id === 0) {
 +        continue;
 +      }
 +      if (connector.status === ConnectorStatusEnum.Available) {
 +        ++reservableConnectors;
 +      }
 +    }
 +    return reservableConnectors;
 +  }
 +
 +  private getNumberOfReservationsOnConnectorZero(): number {
 +    let numberOfReservations = 0;
 +    if (this.hasEvses) {
 +      for (const evse of this.evses.values()) {
 +        if (evse.connectors.get(0)?.reservation) {
 +          ++numberOfReservations;
 +        }
 +      }
 +    } else if (this.connectors.get(0)?.reservation) {
 +      ++numberOfReservations;
 +    }
 +    return numberOfReservations;
 +  }
 +
    private flushMessageBuffer(): void {
      if (this.messageBuffer.size > 0) {
        for (const message of this.messageBuffer.values()) {
      return this.stationInfo.supervisionUrlOcppConfiguration ?? false;
    }
  
 +  private stopReservationExpiryDateSetInterval(): void {
 +    if (this.reservationExpiryDateSetInterval) {
 +      clearInterval(this.reservationExpiryDateSetInterval);
 +    }
 +  }
 +
    private getSupervisionUrlOcppKey(): string {
      return this.stationInfo.supervisionUrlOcppKey ?? VendorParametersKey.ConnectionUrl;
    }
          this.templateFileHash = template.templateHash;
        }
      } catch (error) {
-       ErrorUtils.handleFileException(
+       handleFileException(
          this.templateFile,
          FileType.ChargingStationTemplate,
          error as NodeJS.ErrnoException,
      return this.stationInfo?.stationInfoPersistentConfiguration ?? true;
    }
  
+   private getAutomaticTransactionGeneratorPersistentConfiguration(): boolean {
+     return this.stationInfo?.automaticTransactionGeneratorPersistentConfiguration ?? true;
+   }
    private handleUnsupportedVersion(version: OCPPVersion) {
 -    const errorMsg = `Unsupported protocol version '${version}' configured in template file ${this.templateFile}`;
 +    const errorMsg = `Unsupported protocol version '${version}' configured
 +      in template file ${this.templateFile}`;
      logger.error(`${this.logPrefix()} ${errorMsg}`);
      throw new BaseError(errorMsg);
    }
        `${ChargingStationUtils.getHashId(this.index, stationTemplate)}.json`
      );
      const chargingStationConfiguration = this.getConfigurationFromFile();
-     const featureFlag = false;
      if (
-       featureFlag &&
+       chargingStationConfiguration?.stationInfo?.templateHash === stationTemplate?.templateHash &&
        (chargingStationConfiguration?.connectorsStatus || chargingStationConfiguration?.evsesStatus)
      ) {
        this.initializeConnectorsOrEvsesFromFile(chargingStationConfiguration);
      if (stationTemplate?.Evses) {
        const evsesConfigHash = crypto
          .createHash(Constants.DEFAULT_HASH_ALGORITHM)
-         .update(`${JSON.stringify(stationTemplate?.Evses)}`)
+         .update(JSON.stringify(stationTemplate?.Evses))
          .digest('hex');
        const evsesConfigChanged =
          this.evses?.size !== 0 && this.evsesConfigurationHash !== evsesConfigHash;
            this.configurationFileHash = configuration.configurationHash;
          }
        } catch (error) {
-         ErrorUtils.handleFileException(
+         handleFileException(
            this.configurationFile,
            FileType.ChargingStationConfiguration,
            error as NodeJS.ErrnoException,
      return configuration;
    }
  
-   private saveChargingStationAutomaticTransactionGeneratorConfiguration(): void {
-     this.saveConfiguration();
+   private saveAutomaticTransactionGeneratorConfiguration(): void {
+     if (this.getAutomaticTransactionGeneratorPersistentConfiguration()) {
+       this.saveConfiguration();
+     }
    }
  
    private saveConnectorsStatus() {
            Utils.cloneObject<ChargingStationConfiguration>(this.getConfigurationFromFile()) ?? {};
          if (this.getStationInfoPersistentConfiguration() && this.stationInfo) {
            configurationData.stationInfo = this.stationInfo;
+         } else {
+           delete configurationData.stationInfo;
          }
          if (this.getOcppPersistentConfiguration() && this.ocppConfiguration?.configurationKey) {
            configurationData.configurationKey = this.ocppConfiguration.configurationKey;
+         } else {
+           delete configurationData.configurationKey;
          }
          configurationData = merge<ChargingStationConfiguration>(
            configurationData,
            buildChargingStationAutomaticTransactionGeneratorConfiguration(this)
          );
+         if (
+           !this.getAutomaticTransactionGeneratorPersistentConfiguration() ||
+           !this.getAutomaticTransactionGeneratorConfiguration()
+         ) {
+           delete configurationData.automaticTransactionGenerator;
+         }
          if (this.connectors.size > 0) {
            configurationData.connectorsStatus = buildConnectorsStatus(this);
+         } else {
+           delete configurationData.connectorsStatus;
          }
          if (this.evses.size > 0) {
            configurationData.evsesStatus = buildEvsesStatus(this);
+         } else {
+           delete configurationData.evsesStatus;
          }
          delete configurationData.configurationHash;
          const configurationHash = crypto
            .createHash(Constants.DEFAULT_HASH_ALGORITHM)
-           .update(JSON.stringify(configurationData))
+           .update(
+             JSON.stringify({
+               stationInfo: configurationData.stationInfo,
+               configurationKey: configurationData.configurationKey,
+               automaticTransactionGenerator: configurationData.automaticTransactionGenerator,
+             } as ChargingStationConfiguration)
+           )
            .digest('hex');
          if (this.configurationFileHash !== configurationHash) {
            AsyncLock.acquire(AsyncLockType.configuration)
                this.configurationFileHash = configurationHash;
              })
              .catch((error) => {
-               ErrorUtils.handleFileException(
+               handleFileException(
                  this.configurationFile,
                  FileType.ChargingStationConfiguration,
                  error as NodeJS.ErrnoException,
            );
          }
        } catch (error) {
-         ErrorUtils.handleFileException(
+         handleFileException(
            this.configurationFile,
            FileType.ChargingStationConfiguration,
            error as NodeJS.ErrnoException,
        }
        this.wsConnectionRestarted = false;
        this.autoReconnectRetryCount = 0;
-       parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(this));
+       parentPort?.postMessage(buildUpdatedMessage(this));
      } else {
        logger.warn(
          `${this.logPrefix()} Connection to OCPP server through ${this.wsConnectionUrl.toString()} failed`
          this.started === true && (await this.reconnect());
          break;
      }
-     parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(this));
+     parentPort?.postMessage(buildUpdatedMessage(this));
    }
  
    private getCachedRequest(messageType: MessageType, messageId: string): CachedRequest | undefined {
              logger.error(`${this.logPrefix()} ${errorMsg}`);
              throw new OCPPError(ErrorType.PROTOCOL_ERROR, errorMsg);
          }
-         parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(this));
+         parentPort?.postMessage(buildUpdatedMessage(this));
        } else {
          throw new OCPPError(ErrorType.PROTOCOL_ERROR, 'Incoming message is not an array', null, {
            request,
index bfbe1232756dae8a34d456b8a6f62e417a71286e,f01034a30029b31e40bbcbb8808326d72203a716..27045c89617c023da1b85d17ee6b8c4b9713e95f
@@@ -24,7 -24,6 +24,7 @@@ import 
    type ClearChargingProfileRequest,
    type ClearChargingProfileResponse,
    type ConnectorStatus,
 +  ConnectorStatusEnum,
    ErrorType,
    type GenericResponse,
    GenericStatus,
    type JsonObject,
    type JsonType,
    OCPP16AuthorizationStatus,
 -  type OCPP16AuthorizeRequest,
 -  type OCPP16AuthorizeResponse,
    OCPP16AvailabilityType,
    type OCPP16BootNotificationRequest,
    type OCPP16BootNotificationResponse,
 +  type OCPP16CancelReservationRequest,
 +  type OCPP16CancelReservationResponse,
    OCPP16ChargePointErrorCode,
    OCPP16ChargePointStatus,
    type OCPP16ChargingProfile,
@@@ -49,7 -48,6 +49,6 @@@
    type OCPP16ClearCacheRequest,
    type OCPP16DataTransferRequest,
    type OCPP16DataTransferResponse,
-   OCPP16DataTransferStatus,
    OCPP16DataTransferVendorId,
    OCPP16DiagnosticsStatus,
    type OCPP16DiagnosticsStatusNotificationRequest,
@@@ -64,8 -62,6 +63,8 @@@
    OCPP16IncomingRequestCommand,
    OCPP16MessageTrigger,
    OCPP16RequestCommand,
 +  type OCPP16ReserveNowRequest,
 +  type OCPP16ReserveNowResponse,
    OCPP16StandardParametersKey,
    type OCPP16StartTransactionRequest,
    type OCPP16StartTransactionResponse,
    OCPPVersion,
    type RemoteStartTransactionRequest,
    type RemoteStopTransactionRequest,
 +  ReservationFilterKey,
 +  ReservationTerminationReason,
    type ResetRequest,
    type SetChargingProfileRequest,
    type SetChargingProfileResponse,
 +  type StartTransactionRequest,
    type UnlockConnectorRequest,
    type UnlockConnectorResponse,
  } from '../../../types';
  import { Constants, Utils, logger } from '../../../utils';
 +import { OCPPConstants } from '../OCPPConstants';
  import { OCPPIncomingRequestService } from '../OCPPIncomingRequestService';
  
  const moduleName = 'OCPP16IncomingRequestService';
@@@ -145,11 -137,6 +144,11 @@@ export class OCPP16IncomingRequestServi
        [OCPP16IncomingRequestCommand.TRIGGER_MESSAGE, this.handleRequestTriggerMessage.bind(this)],
        [OCPP16IncomingRequestCommand.DATA_TRANSFER, this.handleRequestDataTransfer.bind(this)],
        [OCPP16IncomingRequestCommand.UPDATE_FIRMWARE, this.handleRequestUpdateFirmware.bind(this)],
 +      [OCPP16IncomingRequestCommand.RESERVE_NOW, this.handleRequestReserveNow.bind(this)],
 +      [
 +        OCPP16IncomingRequestCommand.CANCEL_RESERVATION,
 +        this.handleRequestCancelReservation.bind(this),
 +      ],
      ]);
      this.jsonSchemas = new Map<OCPP16IncomingRequestCommand, JSONSchemaType<JsonObject>>([
        [
            'constructor'
          ),
        ],
 +      [
 +        OCPP16IncomingRequestCommand.RESERVE_NOW,
 +        OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16ReserveNowRequest>(
 +          'assets/json-schemas/ocpp/1.6/ReserveNow.json',
 +          moduleName,
 +          'constructor'
 +        ),
 +      ],
 +      [
 +        OCPP16IncomingRequestCommand.CANCEL_RESERVATION,
 +        OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16CancelReservationRequest>(
 +          'assets/json-schemas/ocpp/1.6/CancelReservation.json',
 +          moduleName,
 +          'constructor'
 +        ),
 +      ],
      ]);
      this.validatePayload = this.validatePayload.bind(this) as (
        chargingStation: ChargingStation,
          } catch (error) {
            // Log
            logger.error(
 -            `${chargingStation.logPrefix()} ${moduleName}.incomingRequestHandler: Handle incoming request error:`,
 +            `${chargingStation.logPrefix()} ${moduleName}.incomingRequestHandler:
 +              Handle incoming request error:`,
              error
            );
            throw error;
        );
      }
      logger.warn(
 -      `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema found for command '${commandName}' PDU validation`
 +      `${chargingStation.logPrefix()} ${moduleName}.validatePayload: No JSON schema found
 +        for command '${commandName}' PDU validation`
      );
      return false;
    }
      logger.info(
        `${chargingStation.logPrefix()} ${
          commandPayload.type
 -      } reset command received, simulating it. The station will be back online in ${Utils.formatDurationMilliSeconds(
 -        chargingStation.stationInfo.resetTime
 -      )}`
 +      } reset command received, simulating it. The station will be
 +        back online in ${Utils.formatDurationMilliSeconds(chargingStation.stationInfo.resetTime)}`
      );
      return OCPP16Constants.OCPP_RESPONSE_ACCEPTED;
    }
      const connectorId = commandPayload.connectorId;
      if (chargingStation.hasConnector(connectorId) === false) {
        logger.error(
 -        `${chargingStation.logPrefix()} Trying to unlock a non existing connector id ${connectorId.toString()}`
 +        `${chargingStation.logPrefix()} Trying to unlock a non existing
 +          connector id ${connectorId.toString()}`
        );
        return OCPP16Constants.OCPP_RESPONSE_UNLOCK_NOT_SUPPORTED;
      }
      }
      if (chargingStation.hasConnector(commandPayload.connectorId) === false) {
        logger.error(
 -        `${chargingStation.logPrefix()} Trying to set charging profile(s) to a non existing connector id ${
 -          commandPayload.connectorId
 -        }`
 +        `${chargingStation.logPrefix()} Trying to set charging profile(s) to a
 +          non existing connector id ${commandPayload.connectorId}`
        );
        return OCPP16Constants.OCPP_SET_CHARGING_PROFILE_RESPONSE_REJECTED;
      }
            false)
      ) {
        logger.error(
 -        `${chargingStation.logPrefix()} Trying to set transaction charging profile(s) on connector ${
 -          commandPayload.connectorId
 -        } without a started transaction`
 +        `${chargingStation.logPrefix()} Trying to set transaction charging profile(s)
 +          on connector ${commandPayload.connectorId} without a started transaction`
        );
        return OCPP16Constants.OCPP_SET_CHARGING_PROFILE_RESPONSE_REJECTED;
      }
      }
      if (chargingStation.hasConnector(commandPayload.connectorId) === false) {
        logger.error(
 -        `${chargingStation.logPrefix()} Trying to get composite schedule to a non existing connector id ${
 -          commandPayload.connectorId
 -        }`
 +        `${chargingStation.logPrefix()} Trying to get composite schedule to a
 +          non existing connector id ${commandPayload.connectorId}`
        );
        return OCPP16Constants.OCPP_RESPONSE_REJECTED;
      }
      }
      if (chargingStation.hasConnector(commandPayload.connectorId) === false) {
        logger.error(
 -        `${chargingStation.logPrefix()} Trying to clear a charging profile(s) to a non existing connector id ${
 -          commandPayload.connectorId
 -        }`
 +        `${chargingStation.logPrefix()} Trying to clear a charging profile(s) to
 +          a non existing connector id ${commandPayload.connectorId}`
        );
        return OCPP16Constants.OCPP_CLEAR_CHARGING_PROFILE_RESPONSE_UNKNOWN;
      }
      const connectorId: number = commandPayload.connectorId;
      if (chargingStation.hasConnector(connectorId) === false) {
        logger.error(
 -        `${chargingStation.logPrefix()} Trying to change the availability of a non existing connector id ${connectorId.toString()}`
 +        `${chargingStation.logPrefix()} Trying to change the availability of a
 +          non existing connector id ${connectorId.toString()}`
        );
        return OCPP16Constants.OCPP_AVAILABILITY_RESPONSE_REJECTED;
      }
      chargingStation: ChargingStation,
      commandPayload: RemoteStartTransactionRequest
    ): Promise<GenericResponse> {
 -    const transactionConnectorId = commandPayload.connectorId;
 +    const { connectorId: transactionConnectorId, idTag, chargingProfile } = commandPayload;
 +    const reserved =
 +      chargingStation.getConnectorStatus(transactionConnectorId).status ===
 +      OCPP16ChargePointStatus.Reserved;
 +    const reservedOnConnectorZero =
 +      chargingStation.getConnectorStatus(0).status === OCPP16ChargePointStatus.Reserved;
 +    if (
 +      (reserved &&
 +        !chargingStation.validateIncomingRequestWithReservation(transactionConnectorId, idTag)) ||
 +      (reservedOnConnectorZero && !chargingStation.validateIncomingRequestWithReservation(0, idTag))
 +    ) {
 +      return OCPP16Constants.OCPP_RESPONSE_REJECTED;
 +    }
      if (chargingStation.hasConnector(transactionConnectorId) === false) {
        return this.notifyRemoteStartTransactionRejected(
          chargingStation,
          transactionConnectorId,
 -        commandPayload.idTag
 +        idTag
        );
      }
      if (
 -      chargingStation.isChargingStationAvailable() === false ||
 -      chargingStation.isConnectorAvailable(transactionConnectorId) === false
 +      !chargingStation.isChargingStationAvailable() ||
 +      !chargingStation.isConnectorAvailable(transactionConnectorId)
      ) {
        return this.notifyRemoteStartTransactionRejected(
          chargingStation,
          transactionConnectorId,
 -        commandPayload.idTag
 +        idTag
        );
      }
 -    const remoteStartTransactionLogMsg = `${chargingStation.logPrefix()} Transaction remotely STARTED on ${
 +    const remoteStartTransactionLogMsg = `
 +      ${chargingStation.logPrefix()} Transaction remotely STARTED on ${
        chargingStation.stationInfo.chargingStationId
 -    }#${transactionConnectorId.toString()} for idTag '${commandPayload.idTag}'`;
 +    }#${transactionConnectorId.toString()} for idTag '${idTag}'`;
      await OCPP16ServiceUtils.sendAndSetConnectorStatus(
        chargingStation,
        transactionConnectorId,
      );
      const connectorStatus = chargingStation.getConnectorStatus(transactionConnectorId);
      // Check if authorized
 -    if (chargingStation.getAuthorizeRemoteTxRequests() === true) {
 -      let authorized = false;
 +    if (
 +      chargingStation.getAuthorizeRemoteTxRequests() &&
 +      (await OCPP16ServiceUtils.isIdTagAuthorized(chargingStation, transactionConnectorId, idTag))
 +    ) {
 +      // Authorization successful, start transaction
        if (
 -        chargingStation.getLocalAuthListEnabled() === true &&
 -        chargingStation.hasIdTags() === true &&
 -        Utils.isNotEmptyString(
 -          chargingStation.idTagsCache
 -            .getIdTags(ChargingStationUtils.getIdTagsFile(chargingStation.stationInfo))
 -            ?.find((idTag) => idTag === commandPayload.idTag)
 -        )
 +        this.setRemoteStartTransactionChargingProfile(
 +          chargingStation,
 +          transactionConnectorId,
 +          chargingProfile
 +        ) === true
        ) {
 -        connectorStatus.localAuthorizeIdTag = commandPayload.idTag;
 -        connectorStatus.idTagLocalAuthorized = true;
 -        authorized = true;
 -      } else if (chargingStation.getMustAuthorizeAtRemoteStart() === true) {
 -        connectorStatus.authorizeIdTag = commandPayload.idTag;
 -        const authorizeResponse: OCPP16AuthorizeResponse =
 -          await chargingStation.ocppRequestService.requestHandler<
 -            OCPP16AuthorizeRequest,
 -            OCPP16AuthorizeResponse
 -          >(chargingStation, OCPP16RequestCommand.AUTHORIZE, {
 -            idTag: commandPayload.idTag,
 -          });
 -        if (authorizeResponse?.idTagInfo?.status === OCPP16AuthorizationStatus.ACCEPTED) {
 -          authorized = true;
 +        connectorStatus.transactionRemoteStarted = true;
 +        const startTransactionPayload: Partial<StartTransactionRequest> = {
 +          connectorId: transactionConnectorId,
 +          idTag: idTag,
 +        };
 +        if (reserved || reservedOnConnectorZero) {
 +          const reservation = chargingStation.getReservationBy(
 +            ReservationFilterKey.CONNECTOR_ID,
 +            reservedOnConnectorZero ? 0 : transactionConnectorId
 +          );
 +          startTransactionPayload.reservationId = reservation.id;
 +          await chargingStation.removeReservation(
 +            reservation,
 +            ReservationTerminationReason.TRANSACTION_STARTED
 +          );
          }
 -      } else {
 -        logger.warn(
 -          `${chargingStation.logPrefix()} The charging station configuration expects authorize at remote start transaction but local authorization or authorize isn't enabled`
 -        );
 -      }
 -      if (authorized === true) {
 -        // Authorization successful, start transaction
          if (
 -          this.setRemoteStartTransactionChargingProfile(
 -            chargingStation,
 -            transactionConnectorId,
 -            commandPayload.chargingProfile
 -          ) === true
 +          (
 +            await chargingStation.ocppRequestService.requestHandler<
 +              OCPP16StartTransactionRequest,
 +              OCPP16StartTransactionResponse
 +            >(chargingStation, OCPP16RequestCommand.START_TRANSACTION, startTransactionPayload)
 +          ).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED
          ) {
 -          connectorStatus.transactionRemoteStarted = true;
 -          if (
 -            (
 -              await chargingStation.ocppRequestService.requestHandler<
 -                OCPP16StartTransactionRequest,
 -                OCPP16StartTransactionResponse
 -              >(chargingStation, OCPP16RequestCommand.START_TRANSACTION, {
 -                connectorId: transactionConnectorId,
 -                idTag: commandPayload.idTag,
 -              })
 -            ).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED
 -          ) {
 -            logger.debug(remoteStartTransactionLogMsg);
 -            return OCPP16Constants.OCPP_RESPONSE_ACCEPTED;
 -          }
 -          return this.notifyRemoteStartTransactionRejected(
 -            chargingStation,
 -            transactionConnectorId,
 -            commandPayload.idTag
 -          );
 +          logger.debug(remoteStartTransactionLogMsg);
 +          return OCPP16Constants.OCPP_RESPONSE_ACCEPTED;
          }
          return this.notifyRemoteStartTransactionRejected(
            chargingStation,
            transactionConnectorId,
 -          commandPayload.idTag
 +          idTag
          );
        }
        return this.notifyRemoteStartTransactionRejected(
          chargingStation,
          transactionConnectorId,
 -        commandPayload.idTag
 +        idTag
        );
      }
      // No authorization check required, start transaction
        this.setRemoteStartTransactionChargingProfile(
          chargingStation,
          transactionConnectorId,
 -        commandPayload.chargingProfile
 +        chargingProfile
        ) === true
      ) {
        connectorStatus.transactionRemoteStarted = true;
              OCPP16StartTransactionResponse
            >(chargingStation, OCPP16RequestCommand.START_TRANSACTION, {
              connectorId: transactionConnectorId,
 -            idTag: commandPayload.idTag,
 +            idTag,
            })
          ).idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED
        ) {
        return this.notifyRemoteStartTransactionRejected(
          chargingStation,
          transactionConnectorId,
 -        commandPayload.idTag
 +        idTag
        );
      }
      return this.notifyRemoteStartTransactionRejected(
        chargingStation,
        transactionConnectorId,
 -      commandPayload.idTag
 +      idTag
      );
    }
  
        );
      }
      logger.warn(
 -      `${chargingStation.logPrefix()} Remote starting transaction REJECTED on connector id ${connectorId.toString()}, idTag '${idTag}', availability '${
 +      `${chargingStation.logPrefix()} Remote starting transaction REJECTED on connector id
 +        ${connectorId.toString()}, idTag '${idTag}', availability '${
          chargingStation.getConnectorStatus(connectorId)?.availability
        }', status '${chargingStation.getConnectorStatus(connectorId)?.status}'`
      );
      if (cp && cp.chargingProfilePurpose === OCPP16ChargingProfilePurposeType.TX_PROFILE) {
        OCPP16ServiceUtils.setChargingProfile(chargingStation, connectorId, cp);
        logger.debug(
 -        `${chargingStation.logPrefix()} Charging profile(s) set at remote start transaction on connector id ${connectorId}: %j`,
 +        `${chargingStation.logPrefix()} Charging profile(s) set at remote start transaction
 +          on connector id ${connectorId}: %j`,
          cp
        );
        return true;
        }
      }
      logger.warn(
 -      `${chargingStation.logPrefix()} Trying to remote stop a non existing transaction with id: ${transactionId.toString()}`
 +      `${chargingStation.logPrefix()} Trying to remote stop a non existing transaction with id:
 +        ${transactionId.toString()}`
      );
      return OCPP16Constants.OCPP_RESPONSE_REJECTED;
    }
        ) === false
      ) {
        logger.warn(
 -        `${chargingStation.logPrefix()} ${moduleName}.handleRequestUpdateFirmware: Cannot simulate firmware update: feature profile not supported`
 +        `${chargingStation.logPrefix()} ${moduleName}.handleRequestUpdateFirmware:
 +          Cannot simulate firmware update: feature profile not supported`
        );
        return OCPP16Constants.OCPP_RESPONSE_EMPTY;
      }
        chargingStation.stationInfo.firmwareStatus !== OCPP16FirmwareStatus.Installed
      ) {
        logger.warn(
 -        `${chargingStation.logPrefix()} ${moduleName}.handleRequestUpdateFirmware: Cannot simulate firmware update: firmware update is already in progress`
 +        `${chargingStation.logPrefix()} ${moduleName}.handleRequestUpdateFirmware:
 +          Cannot simulate firmware update: firmware update is already in progress`
        );
        return OCPP16Constants.OCPP_RESPONSE_EMPTY;
      }
        if (runningTransactions > 0) {
          const waitTime = 15 * 1000;
          logger.debug(
 -          `${chargingStation.logPrefix()} ${moduleName}.updateFirmwareSimulation: ${runningTransactions} transaction(s) in progress, waiting ${
 +          `${chargingStation.logPrefix()} ${moduleName}.updateFirmwareSimulation:
 +            ${runningTransactions} transaction(s) in progress, waiting ${
              waitTime / 1000
            } seconds before continuing firmware update simulation`
          );
        ) === false
      ) {
        logger.warn(
 -        `${chargingStation.logPrefix()} ${moduleName}.handleRequestGetDiagnostics: Cannot get diagnostics: feature profile not supported`
 +        `${chargingStation.logPrefix()} ${moduleName}.handleRequestGetDiagnostics:
 +          Cannot get diagnostics: feature profile not supported`
        );
        return OCPP16Constants.OCPP_RESPONSE_EMPTY;
      }
                })
                .catch((error) => {
                  logger.error(
 -                  `${chargingStation.logPrefix()} ${moduleName}.handleRequestGetDiagnostics: Error while sending '${
 -                    OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION
 -                  }'`,
 +                  `${chargingStation.logPrefix()} ${moduleName}.handleRequestGetDiagnostics:
 +                    Error while sending '${OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION}'`,
                    error
                  );
                });
    ): OCPP16DataTransferResponse {
      try {
        if (Object.values(OCPP16DataTransferVendorId).includes(commandPayload.vendorId)) {
-         return {
-           status: OCPP16DataTransferStatus.ACCEPTED,
-         };
+         return OCPP16Constants.OCPP_DATA_TRANSFER_RESPONSE_ACCEPTED;
        }
-       return {
-         status: OCPP16DataTransferStatus.UNKNOWN_VENDOR_ID,
-       };
+       return OCPP16Constants.OCPP_DATA_TRANSFER_RESPONSE_UNKNOWN_VENDOR_ID;
      } catch (error) {
        return this.handleIncomingRequestError(
          chargingStation,
        );
      }
    }
 +
 +  private async handleRequestReserveNow(
 +    chargingStation: ChargingStation,
 +    commandPayload: OCPP16ReserveNowRequest
 +  ): Promise<OCPP16ReserveNowResponse> {
 +    if (
 +      !OCPP16ServiceUtils.checkFeatureProfile(
 +        chargingStation,
 +        OCPP16SupportedFeatureProfiles.Reservation,
 +        OCPP16IncomingRequestCommand.RESERVE_NOW
 +      )
 +    ) {
 +      return OCPPConstants.OCPP_RESERVATION_RESPONSE_REJECTED;
 +    }
 +    const { reservationId, idTag, connectorId } = commandPayload;
 +    let response: OCPP16ReserveNowResponse;
 +    try {
 +      if (!chargingStation.isConnectorAvailable(connectorId) && connectorId > 0) {
 +        return OCPPConstants.OCPP_RESERVATION_RESPONSE_REJECTED;
 +      }
 +      if (connectorId === 0 && !chargingStation.getReservationOnConnectorId0Enabled()) {
 +        return OCPPConstants.OCPP_RESERVATION_RESPONSE_REJECTED;
 +      }
 +      if (!(await OCPP16ServiceUtils.isIdTagAuthorized(chargingStation, connectorId, idTag))) {
 +        return OCPPConstants.OCPP_RESERVATION_RESPONSE_REJECTED;
 +      }
 +      switch (chargingStation.getConnectorStatus(connectorId).status) {
 +        case ConnectorStatusEnum.Faulted:
 +          response = OCPPConstants.OCPP_RESERVATION_RESPONSE_FAULTED;
 +          break;
 +        case ConnectorStatusEnum.Occupied:
 +          response = OCPPConstants.OCPP_RESERVATION_RESPONSE_OCCUPIED;
 +          break;
 +        case ConnectorStatusEnum.Unavailable:
 +          response = OCPPConstants.OCPP_RESERVATION_RESPONSE_UNAVAILABLE;
 +          break;
 +        case ConnectorStatusEnum.Reserved:
 +          if (!chargingStation.isConnectorReservable(reservationId, idTag, connectorId)) {
 +            response = OCPPConstants.OCPP_RESERVATION_RESPONSE_OCCUPIED;
 +            break;
 +          }
 +        // eslint-disable-next-line no-fallthrough
 +        default:
 +          if (!chargingStation.isConnectorReservable(reservationId, idTag)) {
 +            response = OCPPConstants.OCPP_RESERVATION_RESPONSE_OCCUPIED;
 +            break;
 +          }
 +          await chargingStation.addReservation({
 +            id: commandPayload.reservationId,
 +            ...commandPayload,
 +          });
 +          response = OCPPConstants.OCPP_RESERVATION_RESPONSE_ACCEPTED;
 +          break;
 +      }
 +      return response;
 +    } catch (error) {
 +      chargingStation.getConnectorStatus(connectorId).status = ConnectorStatusEnum.Available;
 +      return this.handleIncomingRequestError(
 +        chargingStation,
 +        OCPP16IncomingRequestCommand.RESERVE_NOW,
 +        error as Error,
 +        { errorResponse: OCPPConstants.OCPP_RESERVATION_RESPONSE_FAULTED }
 +      );
 +    }
 +  }
 +
 +  private async handleRequestCancelReservation(
 +    chargingStation: ChargingStation,
 +    commandPayload: OCPP16CancelReservationRequest
 +  ): Promise<OCPP16CancelReservationResponse> {
 +    if (
 +      !OCPP16ServiceUtils.checkFeatureProfile(
 +        chargingStation,
 +        OCPP16SupportedFeatureProfiles.Reservation,
 +        OCPP16IncomingRequestCommand.CANCEL_RESERVATION
 +      )
 +    ) {
 +      return OCPPConstants.OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED;
 +    }
 +    try {
 +      const { reservationId } = commandPayload;
 +      const [exists, reservation] = chargingStation.doesReservationExists({ id: reservationId });
 +      if (!exists) {
 +        logger.error(
 +          `${chargingStation.logPrefix()} Reservation with ID ${reservationId}
 +            does not exist on charging station`
 +        );
 +        return OCPPConstants.OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED;
 +      }
 +      await chargingStation.removeReservation(reservation);
 +      return OCPPConstants.OCPP_CANCEL_RESERVATION_RESPONSE_ACCEPTED;
 +    } catch (error) {
 +      return this.handleIncomingRequestError(
 +        chargingStation,
 +        OCPP16IncomingRequestCommand.CANCEL_RESERVATION,
 +        error as Error,
 +        { errorResponse: OCPPConstants.OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED }
 +      );
 +    }
 +  }
  }
index 543e2eda6e84e0a98dc8862c25c36c3d92b2dd93,117c36863beefe8184a2bec5e94c7b3d97fbd494..9e8a2d5f7636a33aba59c198a8a7e337cea8f0bf
@@@ -25,7 -25,6 +25,7 @@@ import 
    type OCPP16AuthorizeRequest,
    type OCPP16AuthorizeResponse,
    type OCPP16BootNotificationResponse,
 +  type OCPP16CancelReservationResponse,
    OCPP16ChargePointStatus,
    type OCPP16DataTransferResponse,
    type OCPP16DiagnosticsStatusNotificationResponse,
@@@ -36,7 -35,6 +36,7 @@@
    type OCPP16MeterValuesRequest,
    type OCPP16MeterValuesResponse,
    OCPP16RequestCommand,
 +  type OCPP16ReserveNowResponse,
    OCPP16StandardParametersKey,
    type OCPP16StartTransactionRequest,
    type OCPP16StartTransactionResponse,
@@@ -51,7 -49,7 +51,7 @@@
    type SetChargingProfileResponse,
    type UnlockConnectorResponse,
  } from '../../../types';
- import { Constants, MessageChannelUtils, Utils, logger } from '../../../utils';
+ import { Constants, Utils, buildUpdatedMessage, logger } from '../../../utils';
  import { OCPPResponseService } from '../OCPPResponseService';
  
  const moduleName = 'OCPP16ResponseService';
@@@ -163,22 -161,6 +163,22 @@@ export class OCPP16ResponseService exte
            'constructor'
          ),
        ],
 +      [
 +        OCPP16RequestCommand.RESERVE_NOW,
 +        OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16ReserveNowResponse>(
 +          'assets/json-schemas/ocpp/1.6/ReserveNowResponse.json',
 +          moduleName,
 +          'constructor'
 +        ),
 +      ],
 +      [
 +        OCPP16RequestCommand.CANCEL_RESERVATION,
 +        OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16CancelReservationResponse>(
 +          'assets/json-schemas/ocpp/1.6/CancelReservationResponse.json',
 +          moduleName,
 +          'constructor'
 +        ),
 +      ],
      ]);
      this.jsonIncomingRequestResponseSchemas = new Map([
        [
    ): Promise<void> {
      ChargingStationUtils.resetConnectorStatus(chargingStation.getConnectorStatus(connectorId));
      chargingStation.stopMeterValues(connectorId);
-     parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(chargingStation));
+     parentPort?.postMessage(buildUpdatedMessage(chargingStation));
      if (
        chargingStation.getConnectorStatus(connectorId)?.status !== OCPP16ChargePointStatus.Available
      ) {
        chargingStation.getConnectorStatus(transactionConnectorId)
      );
      chargingStation.stopMeterValues(transactionConnectorId);
-     parentPort?.postMessage(MessageChannelUtils.buildUpdatedMessage(chargingStation));
+     parentPort?.postMessage(buildUpdatedMessage(chargingStation));
      const logMsg = `${chargingStation.logPrefix()} Transaction with id ${requestPayload.transactionId.toString()} STOPPED on ${
        chargingStation.stationInfo.chargingStationId
      }#${transactionConnectorId?.toString()} with status '${
index 2d2a34a0a22a25afc95c8e2fd8fb7b5f6e46a3d2,e82b7d70a6704110df3950baeb059e01df9ce28a..b3f4dd3208315681d616f10cacfafa8bfb29ea77
@@@ -9,7 -9,6 +9,7 @@@ import 
    TriggerMessageStatus,
    UnlockStatus,
  } from '../../types';
 +import { ReservationStatus } from '../../types/ocpp/Responses';
  import { Constants } from '../../utils';
  
  export class OCPPConstants {
      status: TriggerMessageStatus.NOT_IMPLEMENTED,
    });
  
+   static readonly OCPP_DATA_TRANSFER_RESPONSE_ACCEPTED = Object.freeze({
+     status: DataTransferStatus.ACCEPTED,
+   });
    static readonly OCPP_DATA_TRANSFER_RESPONSE_REJECTED = Object.freeze({
      status: DataTransferStatus.REJECTED,
    });
 -
++  
+   static readonly OCPP_DATA_TRANSFER_RESPONSE_UNKNOWN_VENDOR_ID = Object.freeze({
+     status: DataTransferStatus.UNKNOWN_VENDOR_ID,
+   });
  
 +  static readonly OCPP_RESERVATION_RESPONSE_ACCEPTED = Object.freeze({
 +    status: ReservationStatus.ACCEPTED,
 +  }); // Reservation has been made
 +
 +  static readonly OCPP_RESERVATION_RESPONSE_FAULTED = Object.freeze({
 +    status: ReservationStatus.FAULTED,
 +  }); // Reservation has not been made, because of connector in FAULTED state
 +
 +  static readonly OCPP_RESERVATION_RESPONSE_OCCUPIED = Object.freeze({
 +    status: ReservationStatus.OCCUPIED,
 +  }); // Reservation has not been made, because all connectors are OCCUPIED
 +
 +  static readonly OCPP_RESERVATION_RESPONSE_REJECTED = Object.freeze({
 +    status: ReservationStatus.REJECTED,
 +  }); // Reservation has not been made, because CS is not configured to accept reservations
 +
 +  static readonly OCPP_RESERVATION_RESPONSE_UNAVAILABLE = Object.freeze({
 +    status: ReservationStatus.UNAVAILABLE,
 +  }); // Reservation has not been made, because connectors are spec. connector is in UNAVAILABLE state
 +
 +  static readonly OCPP_CANCEL_RESERVATION_RESPONSE_ACCEPTED = Object.freeze({
 +    status: GenericStatus.Accepted,
 +  }); // Reservation for id has been cancelled has been made
 +
 +  static readonly OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED = Object.freeze({
 +    status: GenericStatus.Rejected,
 +  }); // Reservation could not be cancelled, because there is no reservation active for id
 +
    protected constructor() {
      // This is intentional
    }