7.3. How To: OCPP1.6 in EVerest¶
EVerest provides a complete implementation of OCPP1.6J, supporting all feature profiles including Plug&Charge and the Security Extensions. Find the repository of libocpp here: https://github.com/EVerest/libocpp This is a tutorial about how to setup and configure OCPP1.6 in EVerest.
This tutorial includes:
How the libocpp is integrated into everest-core
How to run EVerest with the default OCPP1.6J configuration connecting to SteVe
How to configure OCPP within EVerest
How to connect to different CSMS
What’s relevant when configuring the OCPP module
Where to find and how to configure the OCPP logging
7.3.1. Prerequesites¶
If you’re new to EVerest start with our Quick Start Guide to get a simulation in EVerest running for the first time. It is important that you have set up the required docker containers for Mosquitto and SteVe, which we will use as an example CSMS. If you have done that successfully, you can move on with this tutorial.
7.3.2. Integration of libocpp into everest-core¶
The actual OCPP1.6J implementation is located in https://github.com/EVerest/libocpp . This library is then used within the OCPP module of everest-core. The OCPP module within everest-core handles the integration of OCPP into the EVerest framework. The module registers callbacks that are then triggered by the libocpp, like a callback for a pausing charging or unlocking a connector. In addition the module calls the event handlers of the libocpp so that it can track the state of the charging station and trigger OCPP messages accordingly (e.g. MeterValues.req , StatusNotification.req).
7.3.3. Run EVerest with SteVe¶
EVerest’s everest-core repository provides a configuration that you can use to run EVerest with OCPP. By default this configuration is connecting to the Open Source CSMS SteVe. Simply run
./run-scripts/run-sil-ocpp.sh
to start EVerest with OCPP1.6J. Don’t forget to add the default chargepoint id cp001 to SteVe.
7.3.4. Configuring OCPP¶
In order to connect to a different CSMS, you have to modify the connection details within the ocpp configuration file. The ocpp config is a separate file in which all configuration keys of OCPP1.6 plus some internal parameters can be configured. This is an example for a ocpp configuration:
{
"Internal": {
"ChargePointId": "cp001",
"CentralSystemURI": "127.0.0.1:8180/steve/websocket/CentralSystemService/cp001",
"ChargeBoxSerialNumber": "cp001",
"ChargePointModel": "Yeti",
"ChargePointVendor": "Pionix",
"FirmwareVersion": "0.1"
},
"Core": {
"AuthorizeRemoteTxRequests": false,
"ClockAlignedDataInterval": 900,
"ConnectionTimeOut": 30,
"ConnectorPhaseRotation": "0.RST,1.RST",
"GetConfigurationMaxKeys": 100,
"HeartbeatInterval": 86400,
"LocalAuthorizeOffline": false,
"LocalPreAuthorize": false,
"MeterValuesAlignedData": "Energy.Active.Import.Register",
"MeterValuesSampledData": "Energy.Active.Import.Register",
"MeterValueSampleInterval": 60,
"NumberOfConnectors": 1,
"ResetRetries": 1,
"StopTransactionOnEVSideDisconnect": true,
"StopTransactionOnInvalidId": true,
"StopTxnAlignedData": "Energy.Active.Import.Register",
"StopTxnSampledData": "Energy.Active.Import.Register",
"SupportedFeatureProfiles": "Core,FirmwareManagement,RemoteTrigger,Reservation,LocalAuthListManagement,SmartCharging",
"TransactionMessageAttempts": 1,
"TransactionMessageRetryInterval": 10,
"UnlockConnectorOnEVSideDisconnect": true,
"WebsocketPingInterval": 0
},
"FirmwareManagement": {
"SupportedFileTransferProtocols": "FTP"
},
"Security": {
"SecurityProfile": 1,
"CpoName": "Pionix",
"AuthorizationKey": "DEADBEEFDEADBEEF"
},
"LocalAuthListManagement": {
"LocalAuthListEnabled": true,
"LocalAuthListMaxLength": 42,
"SendLocalListMaxLength": 42
},
"SmartCharging": {
"ChargeProfileMaxStackLevel": 42,
"ChargingScheduleAllowedChargingRateUnit": "Current,Power",
"ChargingScheduleMaxPeriods": 42,
"MaxChargingProfilesInstalled": 42
},
"PnC": {
"ISO15118PnCEnabled": true,
"ContractValidationOffline": true
}
}
The configuration keys are split up into the feature profiles that are specified in OCPP1.6 plus the extra profiles Internal, Security and PnC. Here’s a short overview of the purpose of each profile in the configuration file:
Internal: Used for internal configuration keys that are not specified in OCPP1.6
Core: Includes Core configuration keys of OCPP1.6
FirmwareManagement: Includes configuration keys that apply when the feature profile FirmwareManagement is implemented
Security: Includes configuration parameters that have been introduced within the OCPP1.6J Security Whitepaper
LocalAuthListManagement: Includes configuration parameters that apply when the feature profile LocalAuthListManagement is implemented
SmartCharging: Includes configuration parameters that apply when the feature profile SmartCharging is implemented
PnC: Used for Plug&Charge and includes configuration parameters that have been introduced within the OCPP1.6J Plug&Charge Whitepaper
EVerest’s libocpp supports all configuration parameters that are specified within OCPP1.6. Despite that, it is possible to omit configuration parameters that are not required and it is even possible to omit a whole feature profile in the configuration file if it is not supported. This means that the configuration of the libocpp provides maximum flexibility and can be tailored to your specific charging station.
You can specify the path to this configuration file inside the everest configuration file using the configuration parameter ChargePointConfigPath of the OCPP module within everest-core. This defaults to ocpp-config.json. If this path is relative the default path for the ocpp configuration dist/share/everest/modules/OCPP will be prepended.
7.3.5. Connect to a different CSMS¶
To connect to a different CSMS, you have to modify the connection details of the ocpp configuration file. This includes the parameter CentralSystemURI and it might also include to change the parameters AuthorizationKey and SecurityProfile. Here’s a short overview of the purpose of the parameters:
- CentralSystemURI: Specifies the endpoint of the CSMS.
Must not include ws:// or wss:// (this will be prepended based on the SecurityProfile setting)
Must include the ChargePointId in the end
- SecurityProfile: Specifies the SecurityProfile which defines type of transport layer connection between ChargePoint and CSMS
Can have the value 0, 1, 2 or 3
SecurityProfile 0: Unsecure transport without Basic Authentication (ws://)
SecurityProfile 1: Unsecure transport with Basic Authentication (ws://)
SecurityProfile 2: TLS with Basic authentication (wss://)
SecurityProfile 3: TLS with client side certificates (wss://)
- AuthorizationKey: Specifies the password used for HTTP Basic Authentication
Must be set if SecurityProfile is 1 or 2, can be omitted if SecurityProfile is 0 or 3
Minimal length: 16 bytes
Modify these parameters according to the connection requirements of the CSMS. Find all available configuration keys and their descriptions in here
7.3.6. Configuring OCPP within EVerest¶
To be able to follow the further explanations, you should be familiar with the configuration of EVerest modules. Take a look into EVerest Module Concept for that.
To configure the OCPP module of everest-core, find the available configuration parameters in the manifest of the module.
To start OCPP within EVerest, you have to load the OCPP module by including this in the everest configuration file. As you can see in the manifest of the OCPP module, it provides the following EVerest interfaces:
main: This interface is used to stop and restart the OCPP module
auth_validator: This interface is used to validate authorization requests against the CSMS (e.g. request from RFID-Reader).
If an authorization is requested within EVerest, OCPP will validate this request using the OCPP Authorize message - auth_provider: This interface is used when OCPP requests authorization using a RemoteStartTransaction.req by the CSMS
To summarize, the OCPP module provides (RemoteStartTransaction.req initiated by CSMS) and validates (Authorize.req initiated by ChargePoint) authorization requests. Take a look at the Auth module of everest-core to dive deeper into how authorization is handled within EVerest.
In addtion, OCPP requires connection(s) to the following interfaces: - evse_manager: This connection is used to listen to events and to be able to control the EVSE - connector_zero_sink: This connection is used to report SmartCharging limits set for connector 0 - reservation: This connection is used to handle reservation requests of OCPP - auth: This connection is used to be able to listen to authorization requests and provide authorization requests - system: This connection is used to be able to handle system wide operations like diagnostics uploads, resets, etc.
You have to make sure that OCPP is correctly wired with other modules within the everest configuration. This is how the configuration of OCPP and relevant modules could look like.
active_modules:
token_provider_rfid:
module: JsDummyTokenProviderManual
system:
module: System
ocpp:
module: OCPP
config_module:
ChargePointConfigPath: ocpp-config.json
connections:
evse_manager:
- module_id: evse_manager
implementation_id: evse
reservation:
- module_id: auth
implementation_id: reservation
auth:
- module_id: auth
implementation_id: main
system:
- module_id: system
implementation_id: main
auth:
module: Auth
config_module:
connection_timeout: 30
selection_algorithm: PlugEvents
connections:
token_provider:
- module_id: ocpp
implementation_id: auth_provider
- module_id: token_provider_rfid
implementation_id: main
token_validator:
- module_id: ocpp
implementation_id: auth_validator
evse_manager:
- module_id: evse_manager
implementation_id: evse
Please note that this is not a complete configuration but it is only showing modules that are relevant for OCPP.
Let’s break this configuration down step by step. We can see the configuration of four modules within the everest configuration file (ocpp, system, auth, token_provider_rfid). The System and the JsDummyTokenProviderManual modules are simply loaded and need no configuration. For OCPP, the ChargePointConfigPath is specified and it has connections to:
evse_manager (not present in this config for reasons of clarity)
system
auth - main: to provide and validate authorization requests - reservation: to handle reservations
For the Auth module, the connection_timeout and the selection_algorithm is configured and it has connections
ocpp - auth_provider: to handle RemoteStartTransaction.req - auth_validator: to trigger Authorize.req
token_provider_rfid
evse_manager :to provide authorization when provided token was validated
This configuration will start EVerest with OCPP1.6. Authorization requests can be published by OCPP (using RemoteStartTransaction.req) or by a manual token provider (e.g. RFID-Reader). Authorization requests are received and forwarded by the Auth module. The only token validator that is configured is the OCPP module, which will use the Authorize.req as well as AuthorizationCache and LocalAuthListManagement to validate the requests.
7.3.7. Logging¶
The implementation allows to log all OCPP messages in different formats
The default logging path is /tmp/everest_ocpp_logs but can be set using the configuration parameter MessageLogPath of the OCPP module of everest-core. Within the ocpp configuration file, you can configure LogMessages, to enable or disable logging and LogMessagesFormat to specify to one or more log formats. For the latter, you can specify the following values:
console: Logs all OCPP messages
log: Logs all OCPP messages in a text file
html: Logs all OCPP messages using a html format (recommended)
session_logging: Logs all OCPP messages in html format into a path that is optionally provided by the EvseManager at the start of a session