Chargestation Configuration

Introduction

eDRV now supports configuring available chargestation settings directly via APIs. Here are some scenarios when you can use these APIs.

  • Changing allowed chargestation OCPP settings
  • Updating any vendor-specific configuration settings

Warnings

❗️

CAUTION: Changing settings can severely affect your chargestation

Changing chargestation settings should only be attempted:

  • In consultation with your hardware vendor
  • After verifying how/if your hardware vendor implements changes in settings
  • By admins with an advanced understanding of OCPP settings

❗️

CAUTION: Changing multiple settings too fast can severely affect your chargestation

Chargestation firmware needs time to process each setting change. For e.g. some changes may require a hard reset from the chargestation before the next settings change can be applied.

Developers MUST verify each change has been successfully applied by the chargestation before sending the next change request.

DO NOT loop through a list of change settings. This is a surefire way to brick your chargestation.

🚧

Software Support Void Warning

eDRV APIs assume that your chargestation has been configured as per standard OCPP settings. By changing your chargestation's settings you may de-stabilize the way eDRV OCPP servers and APIs interact with your chargestation.

Please consult with eDRV before changing chargestation settings and request an Acceptance Test of the new settings (may incur testing costs) before rolling out your new settings across the network.

Webhooks based programming model

Chargestation configuration via eDRV APIs must be done in the following steps:

  1. Call the relevant v1.1 API for configurations
  2. Listen to Webhook Events
    Please check the List Of Webhook Events for more details.

Updating Chargestation Configuration

Updating the configuration of a chargestation can be done by calling /v1.1/chargestations/{id}/configurations API endpoint with the proper body.

{
  "key": "HeartbeatInterval",
  "value": "901"
}
{
  "ok": true,
  "message": "",
  "result": {
    "_id": "645e58b1a448ff6e42285ceb",
    "type": "chargestation.update_configuration",
    "status": "requested",
    "chargestation": "5fb24edb64345616b6f3198d",
    "data": {
      "key": "HeartbeatInterval",
      "value": "901"
    },
    "createdAt": "2023-05-12T15:18:09.613Z",
    "updatedAt": "2023-05-12T15:18:09.613Z"
  }
}

Updates via Webhooks

After executing the above-mentioned API with the specified body, you can expect a Webhook for Actions response. You can track the progress of this configuration change by tracking the Webhook (id = result._id above).

  1. Update Requested

chargestation.update_configuration.requested webhook with data.status : "requested" informs your application that a configuration change request was sent to your chargestation

{
  "_id": "645e58b7ae617200083acdc8",
  "data": {
    "_id": "645e58b1a448ff6e42285ceb",
    "type": "chargestation.update_configuration",
    "status": "requested",
    "chargestation": "5fb24edb64345616b6f3198d",
    "data": {
      "key": "HeartbeatInterval",
      "value": "901"
    },
    "createdAt": "2023-05-12T15:18:09.613Z",
    "updatedAt": "2023-05-12T15:18:09.613Z"
  },
  "object": "action",
  "type": "chargestation.update_configuration.requested",
  "createdAt": "2023-05-12T15:18:15.446Z"
}
  1. Update confirmation from the chargestation

chargestation.update_configuration.accepted webhook with data.status : "completed" is a confirmation that the chargestation accepted the change configuration request. The field response_data contains futher info sent by the chargestation.

{
  "_id": "645e58b3ae617200083acdbc",
  "data": {
    "_id": "645e58b1a448ff6e42285ceb",
    "type": "chargestation.update_configuration",
    "status": "completed",
    "chargestation": "5fb24edb64345616b6f3198d",
    "data": {
      "key": "HeartbeatInterval",
      "value": "901"
    },
    "response_data": {
      "status": "Accepted"
    },
    "createdAt": "2023-05-12T15:18:09.613Z",
    "updatedAt": "2023-05-12T15:18:10.738Z"
  },
  "object": "action",
  "type": "chargestation.update_configuration.accepted",
  "createdAt": "2023-05-12T15:18:11.936Z"
}
  1. Config change rejected

chargestation.update_configuration.rejected webhook with data.status : "rejected" means that the chargestation rejected your change request. The field response_data may contain more information about the cause of rejection.

{
  "_id": "645e561ceba89e00081c53fe",
  "data": {
    "_id": "645e5619317c0d60ab8ff433",
    "type": "chargestation.update_configuration",
    "status": "rejected",
    "chargestation": "5fb24edb64345616b6f3198d",
    "data": {
      "key": "BlinkRepeat",
      "value": "3"
    },
    "response_data": {
      "status": "NotSupported"
    },
    "createdAt": "2023-05-12T15:07:05.255Z",
    "updatedAt": "2023-05-12T15:07:06.596Z"
  },
  "object": "action",
  "type": "chargestation.update_configuration.rejected",
  "createdAt": "2023-05-12T15:07:08.887Z"
}

Requesting a Chargestation's Configuration

  1. Requesting the configuration of any physical chargestation can be done by calling the /v1.1/chargestations/{id}/configurations API endpoint.
  2. Read the uploaded configurations via GET chargestations/{id}

On a successful chargestation.get_configuration.accepted webhook with status = completed please use the GET /v1.1/chargestations/{id}/configurations/details to read the configuration parameters.

{
  "ok": true,
  "result": [
    {
      "category": "core",
      "description": "Size (in seconds) of the clock-aligned data interval. This is the size (in seconds) of the set of evenly spaced aggregation intervals per day, starting at 00:00:00 (midnight). For example, a value of 900 (15 minutes) indicates that every day should be broken into 96 15-minute intervals. When clock aligned data is being transmitted, the interval in question is identified by the start time and (optional) duration interval value, represented according to the ISO8601 standard. All \"per-period\" data (e.g. energy readings) should be accumulated (for \"flow\" type measurands such as energy), or averaged (for other values) across the entire interval (or partial interval, at the beginning or end of a charging session), and transmitted (if so enabled) at the end of each interval, bearing the interval start time timestamp. A value of \"0\" (numeric zero), by convention, is to be interpreted to mean that no clock-aligned data should be transmitted.",
      "name": "ClockAlignedDataInterval",
      "desiredValue": 0,
      "value": "0",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "Clock-aligned measurand(s) to be included in a MeterValues.req PDU, every ClockAlignedDataInterval seconds",
      "name": "MeterValuesAlignedData",
      "value": "",
      "writable": true,
      "editable": true
    },
    {
      "category": "core",
      "description": "Clock-aligned periodic measurand(s) to be included in the TransactionData element of StopTransaction.req MeterValues.req PDU for every ClockAlignedDataInterval of the charging session",
      "name": "StopTxnAlignedData",
      "value": "",
      "writable": true,
      "editable": true
    },
    {
      "category": "core",
      "description": "If this key exists, the Charge Point supports Unknown Offline Authorization.If this key reports a value of true, Unknown Offline Authorization is enabled.",
      "name": "AllowOfflineTxForUnknownId",
      "desiredValue": false,
      "value": "False",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "Whether a remote request to start a transaction in the form of a RemoteStartTransaction.req message should be authorized beforehand like a local action to start a transaction.",
      "name": "AuthorizeRemoteTxRequests",
      "desiredValue": false,
      "value": "False",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "Whether the Charge Point, when offline, will start a transaction for locally authorized identifiers.",
      "name": "LocalAuthorizeOffline",
      "desiredValue": true,
      "value": "True",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "Whether the Charge Point, when online, will start a transaction for locally authorized identifiers without waiting for or requesting an Authorize.conf from the Central System",
      "name": "LocalPreAuthorize",
      "desiredValue": false,
      "value": "False",
      "writable": true,
      "editable": true
    },
    {
      "category": "core",
      "description": "If this key exists, the Charge Point supports an Authorization Cache. If this key reports a value of true, the Authorization Cache is enabled.",
      "name": "AuthorizationCacheEnabled",
      "desiredValue": false,
      "value": "True",
      "writable": true,
      "editable": false
    },
    {
      "category": "Unknown",
      "description": "Unknown",
      "name": "SupportedFileTransferProtocols",
      "desiredValue": "Not Defined",
      "value": "FTP",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "Interval of inactivity (no OCPP exchanges) with central system after which the Charge Point should send a Heartbeat.req PDU",
      "name": "HeartbeatInterval",
      "desiredValue": 900,
      "value": "901",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "How often the Charge Point should try to submit a transaction-related message when the Central System fails to process it.",
      "name": "TransactionMessageAttempts",
      "desiredValue": 3,
      "value": "0",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "How often the Charge Point should try to submit a transaction-related message when the Central System fails to process it.",
      "name": "TransactionMessageRetryInterval",
      "desiredValue": 30,
      "value": "60",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "When set to true, the Charge Point SHALL unlock the cable on Charge Point side when the cable is unplugged at the EV.",
      "name": "UnlockConnectorOnEVSideDisconnect",
      "desiredValue": true,
      "value": "True",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "Only relevant for websocket implementations. 0 disables client side websocket Ping/Pong. In this case there is either no ping/pong or the server initiates the ping and client responds with Pong. Positive values are interpreted as number of seconds between pings. Negative values are not allowed. ChangeConfiguration is expected to return a REJECTED result.",
      "name": "WebSocketPingInterval",
      "desiredValue": 10,
      "value": "120",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "Number of times to retry an unsuccessful reset of the Charge Point.",
      "name": "ResetRetries",
      "value": "0",
      "writable": true,
      "editable": true
    },
    {
      "category": "local_auth",
      "description": "Whether the Local Authorization List is enabled.",
      "name": "LocalAuthListEnabled",
      "desiredValue": "default",
      "value": "True",
      "writable": true,
      "editable": true
    },
    {
      "category": "local_auth",
      "description": "If this configuration key is present and set to true: Charge Point support reservations on connector 0.",
      "name": "ReserveConnectorZeroSupported",
      "value": "True",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "Sampled measurands to be included in the TransactionData element of StopTransaction.req PDU, every MeterValueSampleInterval seconds from the start of the charging session",
      "name": "StopTxnSampledData",
      "desiredValue": [
        "Voltage",
        "Power.Active.Import",
        "Energy.Active.Import.Register",
        "Energy.Active.Import.Interval",
        "Current.Import"
      ],
      "value": "",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "Sampled measurands to be included in a MeterValues.req PDU, every MeterValueSampleInterval seconds. Where applicable, the Measurand is combined with the optional phase; for instance: Voltage.L1 Default: Energy.Active.Import.Register",
      "name": "MeterValuesSampledData",
      "desiredValue": [
        "Voltage",
        "Power.Active.Import",
        "Energy.Active.Import.Register",
        "Energy.Active.Import.Interval",
        "Current.Import"
      ],
      "value": "Energy.Active.Import.Register",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "Interval between sampling of metering (or other) data, intended to be transmitted by MeterValues PDUs. For charging session data (ConnectorId>0), samples are acquired and transmitted periodically at this interval from the start of the charging transaction. A value of \"0\" (numeric zero), by convention, is to be interpreted to mean that no sampled data should be transmitted.",
      "name": "MeterValueSampleInterval",
      "desiredValue": 30,
      "value": "30",
      "writable": true,
      "editable": false
    },
    {
      "category": "Unknown",
      "description": "Unknown",
      "name": "RegisterMeterValuesIncludePhases",
      "desiredValue": "Not Defined",
      "value": "False",
      "writable": true,
      "editable": true
    },
    {
      "category": "Unknown",
      "description": "Unknown",
      "name": "Identity",
      "desiredValue": "Not Defined",
      "value": "edrv03",
      "writable": true,
      "editable": true
    },
    {
      "category": "Unknown",
      "description": "Unknown",
      "name": "CpoName",
      "desiredValue": "Not Defined",
      "value": "",
      "writable": true,
      "editable": true
    },
    {
      "category": "Unknown",
      "description": "Unknown",
      "name": "SecurityProfile",
      "desiredValue": "Not Defined",
      "value": "0",
      "writable": true,
      "editable": true
    },
    {
      "category": "smart_charging",
      "description": "Max StackLevel of a ChargingProfile. The number defined also indicates the max allowed number of installed charging schedules per Charging Profile Purposes.",
      "name": "ChargeProfileMaxStackLevel",
      "value": "15",
      "writable": false,
      "editable": true
    },
    {
      "category": "smart_charging",
      "description": "If defined and true, this Charge Point support switching from 3 to 1 phase during a charging session.",
      "name": "ConnectorSwitch3to1PhaseSupported",
      "value": "False",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "Interval (from successful authorization) until incipient charging session is automatically canceled due to failure of EV user to (correctly) insert the charging cable connector(s) into the appropriate connector(s).",
      "name": "ConnectionTimeOut",
      "desiredValue": 285,
      "value": "285",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "When set to true, the Charge Point SHALL administratively stop the transaction when the cable is unplugged from the EV.",
      "name": "StopTransactionOnEVSideDisconnect",
      "desiredValue": true,
      "value": "True",
      "writable": true,
      "editable": false
    },
    {
      "category": "core",
      "description": "Maximum energy in Wh delivered when an identifier is invalidated by the Central System after start of a transaction.",
      "name": "MaxEnergyOnInvalidId",
      "value": "0",
      "writable": true,
      "editable": true
    },
    {
      "category": "core",
      "description": "When set to true, the Charge Point SHALL administratively stop the transaction when the cable is unplugged from the EV.",
      "name": "StopTransactionOnInvalidId",
      "value": "False",
      "writable": true,
      "editable": true
    },
    {
      "category": "core",
      "description": "The phase rotation per connector in respect to the connector's energy meter (or if absent, the grid connection). Possible values per connector are: NotApplicable (for Single phase or DC Charge Points)",
      "name": "ConnectorPhaseRotation",
      "value": "0.RST",
      "writable": true,
      "editable": true
    },
    {
      "category": "core",
      "description": "Maximum number of items in a ConnectorPhaseRotation Configuration Key.",
      "name": "ConnectorPhaseRotationMaxLength",
      "value": "0",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "Maximum number of requested configuration keys in a GetConfiguration.req PDU.",
      "name": "GetConfigurationMaxKeys",
      "value": "35",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "Percentage of maximum intensity at which to illuminate Charge Point lighting.",
      "name": "LightIntensity",
      "value": "100",
      "writable": true,
      "editable": true
    },
    {
      "category": "core",
      "description": "Maximum number of items in a MeterValuesAlignedData Configuration Key.",
      "name": "MeterValuesAlignedDataMaxLength",
      "value": "9",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "Maximum number of items in a MeterValuesSampledData Configuration Key.",
      "name": "MeterValuesSampledDataMaxLength",
      "value": "9",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "The number of physical charging connectors of this Charge Point.",
      "name": "NumberOfConnectors",
      "value": "1",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "Maximum number of items in a StopTxnAlignedData Configuration Key.",
      "name": "StopTxnAlignedDataMaxLength",
      "value": "0",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "Maximum number of items in a StopTxnSampledData Configuration Key.",
      "name": "StopTxnSampledDataMaxLength",
      "value": "0",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "A list of supported Feature Profiles. Possible profile identifiers: Core, FirmwareManagement, LocalAuthListManagement, Reservation, SmartCharging and RemoteTrigger.",
      "name": "SupportedFeatureProfiles",
      "desiredValue": [],
      "value": "Core,FirmwareManagement,Reservation,LocalAuthListManagement,RemoteTrigger,SmartCharging",
      "writable": false,
      "editable": true
    },
    {
      "category": "core",
      "description": "Maximum number of items in a SupportedFeatureProfiles Configuration Key.",
      "name": "SupportedFeatureProfilesMaxLength",
      "value": "6",
      "writable": false,
      "editable": true
    }
  ],
  "message": "Success"
}

📘

Chargestation Configuration Object

The response will have standard OCPP-supported configurations as well as many vendor-specific configurations.

Please note that you can only configure keys for which the readonly property is set to false.

The list of configurations you receive in the webhook response is implemented by the chargestation manufacturer and eDRV can only request to fetch or change a particular configuration but does not guarantee that the configuration update will always get successfully executed by the chargestation.

If you see a setting that is not getting applied by the chargestation, please contact your manufacturer. Unfortunately, vendors will often claim to support a setting in theory while in practice it is not implemented in a particular version of firmware.


Recommended Chargestation Configuration

eDRV highly recommends keeping the following charge station configuration settings for the proper functioning of the central system and API's.

  • AllowOfflineTxForUnknownId - false
  • AuthorizationCacheEnabled - false
  • AuthorizeRemoteTxRequests - false
  • ClockAlignedDataInterval - 0
  • ConnectionTimeOut - 300
  • HeartbeatInterval - 900
  • LocalAuthorizeOffline - true
  • MeterValuesSampledData - 'Voltage', 'Power.Active.Import', 'Energy.Active.Import.Register', 'Energy.Active.Import.Interval', 'Current.Import'
  • MeterValueSampleInterval - 30
  • MinimumStatusDuration - 5
  • StopTransactionOnEVSideDisconnect - true
  • StopTxnSampledData - 'Voltage', 'Power.Active.Import', 'Energy.Active.Import.Register', 'Energy.Active.Import.Interval', 'Current.Import'
  • TransactionMessageAttempts - 3
  • TransactionMessageRetryInterval - 30
  • UnlockConnectorOnEVSideDisconnect - true
  • WebSocketPingInterval - 10