Provisioning Flows - CSMS Developer Guide
Based on OCPP 2.0.1 Edition 4 Specification (Part 2), Section B (pages 43–74). This guide covers all provisioning flows from the CSMS (Charging Station Management System) perspective.
1. Overview
IntroductionThe Provisioning functional block (Section B) governs how a Charging Station registers with the CSMS, how configuration is retrieved and updated, and how a Charging Station can be reset or migrated to a new CSMS.
What Provisioning Covers
CS Registration
Permitting Charging Stations on the CSMS network via BootNotificationRequest. The CSMS decides to Accept, hold Pending, or Reject the CS.
Configuration Retrieval
Reading configuration from Charging Stations using GetVariablesRequest, GetBaseReportRequest,
and GetReportRequest.
Configuration Changes
Making changes to Charging Station configuration via SetVariablesRequest and SetNetworkProfileRequest.
Reset & Migration
Resetting a Charging Station or migrating it to a new CSMS using ResetRequest and the
network profile management flows.
Transactions Before Being Accepted
A Charging Station Operator MAY configure a Charging Station to accept transactions before
being accepted by the CSMS (via config variable TxBeforeAcceptedEnabled). However, it is usually advisable to deny all charging services at a Charging
Station if it has never been Accepted by the CSMS, since users cannot be authenticated and running
transactions could conflict with provisioning processes.
After any restart, the Charging Station MUST contact the CSMS and send a BootNotificationRequest. If the CSMS indicates a status other than Accepted for an extended period, the Charging Station may not have a valid date/time, making transaction
data unreliable.
2. Boot Flows
B01 – B04Cold Boot Charging Station
Charging Station powers up or reboots and registers with the CSMS.
Flow Sequence:
CS CSMS
| --- BootNotificationRequest -----------> |
| <-- BootNotificationResponse (Accepted)- |
| |
| --- StatusNotificationRequest ----------> | (for each Connector)
| <-- StatusNotificationResponse ---------- |
| |
| --- HeartbeatRequest ------------------> | (periodic)
| <-- HeartbeatResponse ------------------ |CSMS Receives: BootNotificationRequest
{
"reason": "<BootReasonEnumType>", // REQUIRED
"chargingStation": { // REQUIRED - ChargingStationType
"model": "<string, max 20>", // REQUIRED
"vendorName": "<string, max 50>", // REQUIRED
"serialNumber": "<string, max 25>", // optional
"firmwareVersion": "<string, max 50>", // optional
"modem": { // optional - ModemType
"iccid": "<string, max 20>", // optional
"imsi": "<string, max 20>" // optional
}
}
}BootReasonEnumType values:
| Value | Description |
|---|---|
ApplicationReset | Application was reset |
FirmwareUpdate | Reset due to firmware update |
LocalReset | Local reset command |
PowerUp | Powered up from off state |
RemoteReset | Remote reset command from CSMS |
ScheduledReset | Scheduled reset |
Triggered | Triggered by TriggerMessage |
Unknown | Unknown reason |
Watchdog | Watchdog timer triggered reset |
CSMS Sends: BootNotificationResponse
{
"currentTime": "<dateTime ISO 8601>", // REQUIRED - CSMS current time
"interval": "<integer>", // REQUIRED - heartbeat interval (seconds)
"status": "<RegistrationStatusEnumType>", // REQUIRED
"statusInfo": { // optional
"reasonCode": "<string, max 20>", // REQUIRED within StatusInfo
"additionalInfo": "<string, max 512>" // optional
}
}RegistrationStatusEnumType values:
| Value | Description |
|---|---|
Accepted | CS is accepted, normal operation begins |
Pending | CSMS wants to retrieve/set config before accepting (see B02) |
Rejected | CS is not accepted (see B03) |
Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B01.FR.02 | CSMS SHALL respond to indicate whether it will accept the Charging Station |
B01.FR.10 | If CSMS responded with status != Accepted and CS sends a CALL that is NOT a BootNotificationRequest or a message triggered by TriggerMessageRequest, GetBaseReportRequest, or GetReportRequest, the CSMS SHALL respond with CALLERROR: SecurityError |
B01.FR.11 | If Security Profile 3 is used, CSMS SHALL check the serialNumber in the BootNotificationRequest against the Serial Number in the Certificate Common Name |
B01.FR.12 | If B01.FR.11 and the serial numbers do NOT match, CSMS SHALL close the WebSocket connection |
B01.FR.13 | When an EVSE has been reserved, the Reserved state MUST be persistent across reboots |
CSMS Decision Logic:
On receiving BootNotificationRequest:
1. Identify the Charging Station (by WebSocket connection / security identity)
2. If Security Profile 3:
- Verify serialNumber matches Certificate Common Name
- If mismatch -> close WebSocket connection
3. Store/update CS metadata (model, vendor, firmware, modem info)
4. Decide registration status:
- Accepted: CS is known and authorized
- Pending: CS needs configuration before acceptance (proceed to B02)
- Rejected: CS is blacklisted or unknown (proceed to B03)
5. Respond with BootNotificationResponse:
- currentTime: current CSMS UTC time
- interval: heartbeat interval (if Accepted) or retry interval (if Pending/Rejected)
- status: the decided statusAfter Accepting a CS:
- The CS will send
StatusNotificationRequestfor each connector with current state - The CS will begin sending periodic
HeartbeatRequestmessages at the specified interval - The CSMS should respond to each
HeartbeatRequestwithHeartbeatResponsecontainingcurrentTime
{
"timestamp": "<dateTime>", // REQUIRED
"connectorStatus": "<ConnectorStatusEnumType>", // REQUIRED
"evseId": "<integer>", // REQUIRED
"connectorId": "<integer>" // REQUIRED
}
// ConnectorStatusEnumType: Available, Occupied, Reserved, Unavailable, Faulted{
"currentTime": "<dateTime>" // REQUIRED - current CSMS time
}Cold Boot Charging Station – Pending
CSMS responds to BootNotification with Pending to retrieve/set configuration before accepting.
Flow Sequence:
CS CSMS
| --- BootNotificationRequest -----------> |
| <-- BootNotificationResponse (Pending) - |
| |
| <-- GetVariablesRequest ---------------- | (optional)
| --- GetVariablesResponse --------------> |
| |
| <-- SetVariablesRequest ---------------- | (optional)
| --- SetVariablesResponse --------------> |
| |
| --- BootNotificationRequest -----------> | (after interval)
| <-- BootNotificationResponse (Pending/Accepted) |
| ... |Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B02.FR.01 | After sending Pending status, CSMS MAY send messages to retrieve info (B06, B07, B08) or change config (B05). The CS SHALL respond to these. |
B02.FR.05 | While in Pending status, if receiving RequestStartTransactionRequest or RequestStopTransactionRequest, CS SHALL respond with status Rejected. If CSMS wants to start a transaction, it SHALL first accept the CS. |
B02.FR.06 | When CSMS returns Pending, the communication channel SHALL NOT be closed by either side. |
B02.FR.09 | If CS sends a CALL that is NOT a BootNotificationRequest or a message triggered by TriggerMessageRequest, GetBaseReportRequest, or GetReportRequest, the CSMS SHALL respond with CALLERROR: SecurityError. |
CSMS Decision Logic for Pending:
On deciding to set status = Pending:
1. Set interval to a reasonable value (e.g., 30-60 seconds)
2. Keep WebSocket connection open
3. Optionally send GetVariablesRequest to read CS configuration
4. Optionally send SetVariablesRequest to configure CS
5. Optionally send GetBaseReportRequest to get full device model
6. When ready to accept, wait for the next BootNotificationRequest
and respond with status = Accepted
7. Reject any CALL from CS that is not BootNotificationRequest
(or triggered by TriggerMessage/GetBaseReport/GetReport)
with CALLERROR: SecurityErrorImportant: The CSMS must NOT close the WebSocket while status is Pending.
Cold Boot Charging Station – Rejected
CSMS decides to reject the Charging Station.
Flow Sequence:
CS CSMS
| --- BootNotificationRequest -----------> |
| <-- BootNotificationResponse (Rejected) - |
| |
| --- BootNotificationRequest -----------> | (after interval)
| <-- BootNotificationResponse (Rejected) - |
| ... |Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B03.FR.03 | When CSMS has Rejected the BootNotificationRequest, the CSMS SHALL NOT initiate any messages. |
B03.FR.07 | If CS sends a message that is not a BootNotificationRequest, CSMS SHALL respond with CALLERROR: SecurityError. |
CSMS Decision Logic for Rejected:
On deciding to Reject:
1. Respond with BootNotificationResponse:
- status: Rejected
- interval: retry interval in seconds (> 0 recommended)
- currentTime: current CSMS time
2. Do NOT send any messages to the CS
3. If CS sends any non-BootNotification message, respond with
CALLERROR: SecurityError
4. CSMS MAY close the connection to free resources
5. On each subsequent BootNotificationRequest, re-evaluate
whether to Accept, Pend, or RejectNote: Typical reasons for rejection: CS is blacklisted, unknown, or unauthorized. It is advised NOT to accept any transactions from a CS until BootNotification has been Accepted.
Offline Behavior Idle Charging Station
CS reconnects after a period of being offline.
Flow Sequence:
CS CSMS
| --- HeartbeatRequest ------------------> | (normal operation)
| <-- HeartbeatResponse ---------------- |
| |
| [connection loss] |
| |
| [connection restored] |
| |
| --- StatusNotificationRequest ---------> | (for connectors)
| <-- StatusNotificationResponse --------- |
| |
| --- HeartbeatRequest ------------------> | (resume normal)
| <-- HeartbeatResponse ------------------ |Requirements (CS-side — CSMS must handle):
| ID | Requirement |
|---|---|
B04.FR.01 | If offline period exceeds OfflineThreshold: CS sends StatusNotificationRequest for ALL connectors. CSMS should update all connector statuses. |
B04.FR.02 | If offline period does NOT exceed OfflineThreshold: CS only sends StatusNotificationRequest for connectors whose status changed during offline. CSMS should update only those connectors. |
On CS reconnection after offline period:
1. Accept and process StatusNotificationRequests
2. Update connector status records in database
3. Resume accepting HeartbeatRequests
4. Be prepared to receive queued TransactionEventRequests
for transactions that occurred while offline3. Variable Management
B05 – B08Set Variables
CSMS changes configuration variables on a Charging Station.
Flow Sequence:
CSO CSMS CS
| -- request --> | |
| | --- SetVariablesRequest ->|
| | <-- SetVariablesResponse -|{
"setVariableData": [ // REQUIRED, array, minItems: 1
{
"attributeType": "<AttributeEnumType>", // optional (default: "Actual")
"attributeValue": "<string, max 1000>", // REQUIRED
"component": { // REQUIRED
"name": "<string, max 50>", // REQUIRED
"instance": "<string, max 50>", // optional
"evse": { // optional
"id": "<integer>", // REQUIRED within EVSE
"connectorId": "<integer>" // optional
}
},
"variable": { // REQUIRED
"name": "<string, max 50>", // REQUIRED
"instance": "<string, max 50>" // optional
}
}
]
}AttributeEnumType values:
| Value | Description |
|---|---|
Actual | The actual value of the variable (default) |
Target | The target/desired value |
MinSet | The minimum allowed value |
MaxSet | The maximum allowed value |
{
"setVariableResult": [ // REQUIRED, array, minItems: 1
{
"attributeType": "<AttributeEnumType>", // optional (default: "Actual")
"attributeStatus": "<SetVariableStatusEnumType>", // REQUIRED
"attributeStatusInfo": { // optional
"reasonCode": "<string, max 20>",
"additionalInfo": "<string, max 512>"
},
"component": { ... }, // mirrors request
"variable": { ... } // mirrors request
}
]
}SetVariableStatusEnumType values:
| Value | Description |
|---|---|
Accepted | Variable was set successfully |
Rejected | Request to set was rejected (value out of range, read-only, etc.) |
UnknownComponent | The component is not known |
UnknownVariable | The variable is not known for this component |
NotSupportedAttributeType | The attribute type is not supported for this variable |
RebootRequired | Variable set, but requires reboot to take effect |
Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B05.FR.11 | CSMS SHALL NOT send more SetVariableData elements than reported by CS via ItemsPerMessageSetVariables. |
B05.FR.13 | CSMS SHALL NOT include multiple SetVariableData elements with the same Component, Variable and AttributeType combination in a single request. An omitted AttributeType counts as Actual. |
When setting variables:
1. Respect ItemsPerMessageSetVariables limit
2. Do not duplicate Component+Variable+AttributeType in one request
3. Process each SetVariableResult in the response:
- Accepted: Variable was set. Update internal records if maintained
- RebootRequired: Variable will take effect after reboot.
CSMS may need to send ResetRequest (B11/B12) for it to take effect
- Rejected: Check statusInfo for reason
- UnknownComponent/UnknownVariable: The CS doesn't recognize this
- NotSupportedAttributeType: This attribute type not supported
4. If attributeType was omitted in request, response will contain ActualGet Variables
CSMS reads configuration variables from a Charging Station.
Flow Sequence:
CSO CSMS CS
| -- request --> | |
| | --- GetVariablesRequest ->|
| | <-- GetVariablesResponse -|
| <-- notification- | |{
"getVariableData": [ // REQUIRED, minItems: 1
{
"attributeType": "<AttributeEnumType>", // optional
"component": { // REQUIRED
"name": "<string, max 50>",
"instance": "<string, max 50>",
"evse": {
"id": "<integer>",
"connectorId": "<integer>"
}
},
"variable": { // REQUIRED
"name": "<string, max 50>",
"instance": "<string, max 50>"
}
}
]
}{
"getVariableResult": [ // REQUIRED, minItems: 1
{
"attributeStatus": "<GetVariableStatusEnumType>", // REQUIRED
"attributeType": "<AttributeEnumType>", // optional
"attributeValue": "<string, max 2500>", // optional (when Accepted)
"attributeStatusInfo": { // optional
"reasonCode": "<string, max 20>",
"additionalInfo": "<string, max 512>"
},
"component": { ... }, // mirrors request
"variable": { ... } // mirrors request
}
]
}GetVariableStatusEnumType values:
| Value | Description |
|---|---|
Accepted | Variable value is returned in attributeValue |
Rejected | Variable is WriteOnly, cannot be read |
UnknownComponent | Component not known |
UnknownVariable | Variable not known for this component |
NotSupportedAttributeType | Attribute type not supported |
Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B06.FR.05 | CSMS SHALL NOT send more GetVariableData elements than reported by the CS via ItemsPerMessageGetVariables. |
When getting variables:
1. Respect ItemsPerMessageGetVariables limit
2. If attributeType omitted, CS will return Actual value
3. Process each GetVariableResult:
- Accepted: attributeValue contains the value
- Rejected: Variable is WriteOnly
- UnknownComponent/UnknownVariable: CS doesn't know this
- NotSupportedAttributeType: Attribute type not supported
4. Note: attributeValue may be empty string even when Accepted
(e.g., Target not yet set)Get Base Report
CSMS requests a predefined report of the device model. The CS responds asynchronously via NotifyReportRequest messages.
Flow Sequence:
CSMS CS
| --- GetBaseReportRequest --------------> |
| <-- GetBaseReportResponse (Accepted) --- |
| |
| <-- NotifyReportRequest (seqNo=0, tbc) - | (async, part 1)
| --- NotifyReportResponse ---------------> |
| |
| <-- NotifyReportRequest (seqNo=1, tbc) - | (async, part 2)
| --- NotifyReportResponse ---------------> |
| ... |
| <-- NotifyReportRequest (seqNo=N, !tbc) | (last part)
| --- NotifyReportResponse ---------------> |{
"requestId": "<integer>", // REQUIRED - correlates NotifyReport messages
"reportBase": "<ReportBaseEnumType>" // REQUIRED
}{
"status": "<GenericDeviceModelStatusEnumType>", // REQUIRED
"statusInfo": { // optional
"reasonCode": "<string, max 20>",
"additionalInfo": "<string, max 512>"
}
}ReportBaseEnumType values:
| Value | Description |
|---|---|
ConfigurationInventory | All component-variables that can be set by the operator, including their VariableCharacteristics |
FullInventory | ALL component-variables including their VariableCharacteristics |
SummaryInventory | Components/variables related to availability and existing problem conditions |
GenericDeviceModelStatusEnumType values:
| Value | Description |
|---|---|
Accepted | Report will be sent asynchronously via NotifyReportRequest |
Rejected | CS temporarily unable to execute the request |
NotSupported | The requested reportBase is not supported |
EmptyResultSet | No data to report |
{
"requestId": "<integer>", // REQUIRED - matches GetBaseReportRequest.requestId
"generatedAt": "<dateTime>", // REQUIRED - when report was generated at CS
"seqNo": "<integer>", // REQUIRED - sequence number, starts at 0
"tbc": "<boolean>", // optional (default: false) - true if more parts follow
"reportData": [ // optional - array of ReportDataType
{
"component": { ... },
"variable": { ... },
"variableAttribute": [ // REQUIRED, 1-4 items
{
"type": "<AttributeEnumType>", // optional (default: Actual)
"value": "<string, max 2500>", // optional (omitted if WriteOnly)
"mutability": "<MutabilityEnumType>", // optional (default: ReadWrite)
"persistent": "<boolean>", // optional (default: false)
"constant": "<boolean>" // optional (default: false)
}
],
"variableCharacteristics": { // optional
"dataType": "<DataEnumType>", // REQUIRED
"supportsMonitoring": "<boolean>", // REQUIRED
"unit": "<string, max 16>", // optional
"minLimit": "<number>", // optional
"maxLimit": "<number>", // optional
"valuesList": "<string, max 1000>" // optional - CSV of allowed values
}
}
]
}
// MutabilityEnumType: ReadOnly, WriteOnly, ReadWrite
// DataEnumType: string, decimal, integer, dateTime, boolean, OptionList, SequenceList, MemberListRequirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B07.FR.14 | CSMS SHOULD request GetBaseReportRequest with reportBase = FullInventory when a CS connects for the first time OR whenever CSMS suspects the device model has changed (e.g., after firmware update or hardware change). |
When requesting base reports:
1. Generate a unique requestId (integer) to correlate responses
2. Send GetBaseReportRequest with desired reportBase
3. On receiving GetBaseReportResponse:
- Accepted: Prepare to receive NotifyReportRequest messages
- Rejected: CS temporarily unable, retry later
- NotSupported: This reportBase not supported by CS
- EmptyResultSet: Nothing to report
4. Collect all NotifyReportRequest messages with matching requestId
5. Reassemble using seqNo (starts at 0, incremental)
6. Check tbc (to be continued):
- true: more messages coming
- false/absent: this is the last message
7. Store the full device model (components, variables, attributes,
characteristics) for the Charging Station
8. Respond to each NotifyReportRequest with empty NotifyReportResponseRecommendation: Request FullInventory on first connection to build a complete device model knowledge of the Charging Station.
Get Custom Report
CSMS requests a filtered report by criteria and/or specific components.
Flow Sequence:
CSO CSMS CS
| -- request --> | |
| | --- GetReportRequest ---> |
| | <-- GetReportResponse --- |
| | |
| | <-- NotifyReportRequest - | (loop for each part)
| | --- NotifyReportResponse >|{
"requestId": "<integer>", // REQUIRED
"componentCriteria": [ // optional, 1-4 items
"<ComponentCriterionEnumType>"
],
"componentVariable": [ // optional, array
{
"component": { // REQUIRED
"name": "<string, max 50>",
"instance": "<string, max 50>",
"evse": { "id": "<integer>", "connectorId": "<integer>" }
},
"variable": { // optional
"name": "<string, max 50>",
"instance": "<string, max 50>"
}
}
]
}ComponentCriterionEnumType values:
| Value | Description |
|---|---|
Active | Components with the Active variable set to true (or without the Active variable) |
Available | Components with the Available variable set to true (or without Available variable) |
Enabled | Components with the Enabled variable set to true (or without Enabled variable) |
Problem | Components with the Problem variable set to true |
The GetReportResponse and async NotifyReportRequest flow is identical to B07.
Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B08.FR.06 | CSMS SHALL NOT send more componentVariables in one GetReportRequest than configured by ItemsPerMessageGetReport. |
When requesting custom reports:
1. Set componentCriteria to filter by component state (logical OR if multiple)
2. Set componentVariable to filter by specific components/variables
3. Both can be combined - results are the intersection
4. If variable is omitted in componentVariable, CS reports every variable
of that component
5. If variable.instance is omitted, CS reports every instance
6. The response flow is identical to B07 (NotifyReportRequest messages)
7. Respect ItemsPerMessageGetReport limit4. Network & Reset
B09 – B12Setting a new NetworkConnectionProfile
CSO wants to update network connection details (e.g., in preparation for CSMS migration).
Flow Sequence:
CSMS CS
| --- SetNetworkProfileRequest ----------> |
| [validate & store]
| <-- SetNetworkProfileResponse ---------- |{
"configurationSlot": "<integer>", // REQUIRED - slot number
"connectionData": { // REQUIRED - NetworkConnectionProfileType
"ocppVersion": "<OCPPVersionEnumType>", // REQUIRED
"ocppTransport": "<OCPPTransportEnumType>", // REQUIRED
"ocppCsmsUrl": "<string, max 512>", // REQUIRED - URL of target CSMS
"messageTimeout": "<integer>", // REQUIRED - seconds
"securityProfile": "<integer>", // REQUIRED
"ocppInterface": "<OCPPInterfaceEnumType>", // REQUIRED
"apn": { // optional - APNType
"apn": "<string, max 512>", // REQUIRED
"apnAuthentication": "<APNAuthenticationEnumType>", // REQUIRED
"apnUserName": "<string, max 20>", // optional
"apnPassword": "<string, max 20>", // optional
"simPin": "<integer>", // optional
"preferredNetwork": "<string, max 6>", // optional
"useOnlyPreferredNetwork": "<boolean>" // optional (default: false)
},
"vpn": { // optional - VPNType
"server": "<string, max 512>", // REQUIRED
"user": "<string, max 20>", // REQUIRED
"password": "<string, max 20>", // REQUIRED
"key": "<string, max 255>", // REQUIRED
"type": "<VPNEnumType>", // REQUIRED
"group": "<string, max 20>" // optional
}
}
}
// OCPPVersionEnumType: OCPP12, OCPP15, OCPP16, OCPP20
// OCPPTransportEnumType: JSON, SOAP
// OCPPInterfaceEnumType: Wired0-Wired3, Wireless0-Wireless3
// APNAuthenticationEnumType: CHAP, NONE, PAP, AUTO
// VPNEnumType: IKEv2, IPSec, L2TP, PPTP{
"status": "<SetNetworkProfileStatusEnumType>", // REQUIRED
"statusInfo": { // optional
"reasonCode": "<string, max 20>",
"additionalInfo": "<string, max 512>"
}
}SetNetworkProfileStatusEnumType values:
| Value | Description |
|---|---|
Accepted | Profile was stored successfully |
Rejected | Profile was rejected (e.g., security downgrade, invalid content) |
Failed | Profile was valid but storing failed |
Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B09.FR.01 | CS validates content, stores data, responds Accepted if successful. |
B09.FR.02 | If content is invalid, CS responds Rejected with optional reasonCode (recommended: "InvalidNetworkConf"). |
B09.FR.03 | If storing a valid profile fails, CS responds Failed. |
B09.FR.04 | If AllowSecurityProfileDowngrade is not implemented or false, and profile contains lower securityProfile, CS responds Rejected (reasonCode: "NoSecurityDowngrade"). |
B09.FR.05 | If configurationSlot doesn't match an entry in NetworkConfigurationPriority valuesList, CS responds Rejected (reasonCode: "InvalidConfSlot"). |
When setting a network profile:
1. First use GetBaseReport or GetVariables to discover:
- Available configuration slots (NetworkConfigurationPriority valuesList)
- Active configuration slot (OCPPCommCtrlr.ActiveNetworkProfile)
- Current security profile
2. Choose a configurationSlot from the available slots
3. Build the connectionData with the new CSMS URL and settings
4. Send SetNetworkProfileRequest
5. Process response:
- Accepted: Profile stored. Changes won't take effect until reboot
or migration (B10)
- Rejected: Check statusInfo.reasonCode for details
- Failed: Storage issue, may retry
6. To activate: use B10 (Migrate to new CSMS) or B11/B12 (Reset)Important: Changes to NetworkConnectionProfile are NOT activated until a reboot occurs, as described in B10.
Migrate to new CSMS
CSO wants to migrate a Charging Station to a different CSMS.
Flow Sequence:
CSMS CS
| |
| [Step 1: Set new connection profile] |
| --- SetNetworkProfileRequest ----------> | (B09)
| <-- SetNetworkProfileResponse (Accepted) |
| |
| [Step 2: Update priority to use new slot] |
| --- SetVariablesRequest ---------------> | (NetworkConfigurationPriority)
| <-- SetVariablesResponse (Accepted/ |
| RebootRequired) ------------------ |
| |
| [Step 3: Trigger reboot] |
| --- ResetRequest (OnIdle) -------------> |
| <-- ResetResponse (Accepted) ----------- |
| |
| [Reboot]
| |
| [CS connects to new CSMS] |
| |
New CSMS CS
| <-- BootNotificationRequest ----------- |
| --- BootNotificationResponse ----------> |Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B10.FR.01 | CSMS sends SetNetworkProfileRequest with new connection data. |
B10.FR.02 | CSMS sends SetVariablesRequest for NetworkConfigurationPriority to make the new profile the highest priority. |
B10.FR.03 | CSMS sends ResetRequest to trigger reboot so CS connects to new CSMS. |
B10.FR.04 | After reboot, CS connects to the first entry of NetworkConfigurationPriority. |
B10.FR.05 | After successful migration, CS SHALL start using new NetworkConfigurationPriority. |
B10.FR.06 | If CS cannot connect to any of the new NetworkConfigurationPriority entries, CS SHALL try reconnecting using the old NetworkConfigurationPriority entries. |
B10.FR.07 | If CS fails to connect to any old entry, CS SHALL alternate between old and new entries. |
B10.FR.08 | If connection fails and retry mechanism (B10.FR.06/07) is not supported, CS SHALL try to reconnect using the old NetworkConnectionProfile. |
B10.FR.09 | CS SHOULD NOT stop trying to reconnect (to prevent becoming a stranded asset). |
Migration procedure:
1. Prepare new CSMS connection data
2. Send SetNetworkProfileRequest to store new profile in an available slot
3. Verify Accepted response
4. Send SetVariablesRequest for NetworkConfigurationPriority
to place new profile slot first in priority list
5. Send ResetRequest (type: OnIdle) to trigger reboot
6. CS will reboot and connect to new CSMS
Fallback behavior:
- If CS cannot reach new CSMS, it tries old connection profiles
- CS alternates between old/new if both fail
- CS should never permanently stop reconnection attemptsReset – Without Ongoing Transaction
CSO wants to reset a Charging Station or EVSE when no active transactions are running.
Flow Sequence:
CSMS CS
| --- ResetRequest ----------------------> |
| <-- ResetResponse (Accepted) ----------- |
| |
| [Reboot]
| |
| <-- BootNotificationRequest ----------- |
| --- BootNotificationResponse ----------> |{
"type": "<ResetEnumType>", // REQUIRED
"evseId": "<integer>" // optional - specific EVSE to reset
}
// ResetEnumType: Immediate | OnIdle{
"status": "<ResetStatusEnumType>", // REQUIRED
"statusInfo": { // optional
"reasonCode": "<string, max 20>",
"additionalInfo": "<string, max 512>"
}
}
// ResetStatusEnumType: Accepted | Rejected | ScheduledResetEnumType values:
| Value | Description |
|---|---|
Immediate | Reset immediately |
OnIdle | Reset when no transactions are active |
ResetStatusEnumType values:
| Value | Description |
|---|---|
Accepted | CS will reset |
Rejected | CS is unable to reset |
Scheduled | CS will reset when idle (response to OnIdle when transaction is active) |
Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B11.FR.01 | CSMS sends ResetRequest to CS. |
B11.FR.02 | If evseId is provided, only that EVSE should reset (not the whole CS). |
B11.FR.03 | For full CS reset (no evseId): type Immediate resets immediately, type OnIdle resets when no transactions active. |
B11.FR.04 | For EVSE-only reset: CS makes EVSE unavailable, resets it, sends StatusNotificationRequest with Unavailable, then Available after reset. |
B11.FR.06 | After a full CS reset, CS sends BootNotificationRequest to CSMS. |
B11.FR.09 | When the CSMS sends a ResetRequest with evseId AND the CS does not support resetting an individual EVSE, the CS SHALL respond with Rejected. |
When resetting a CS (no active transactions):
1. Determine scope:
- Full CS reset: omit evseId
- Single EVSE reset: include evseId
2. Determine urgency:
- Immediate: reset now (use when urgent)
- OnIdle: reset when no transactions (safer, preferred)
3. Send ResetRequest
4. Process response:
- Accepted: CS will reset. Expect:
* For full CS reset: BootNotificationRequest after reboot
* For EVSE reset: StatusNotificationRequest (Unavailable then Available)
- Rejected: CS cannot reset (e.g., EVSE reset not supported)
- Scheduled: CS will reset when idle (see B12)
5. After reboot, follow B01 flowReset – With Ongoing Transaction
CSO wants to reset a CS or EVSE that has active transactions.
Flow Sequence (Immediate Reset):
CSMS CS
| --- ResetRequest (Immediate) ----------> |
| <-- ResetResponse (Accepted) ----------- |
| |
| <-- TransactionEventRequest (Ended) ---- | (for each active transaction)
| --- TransactionEventResponse ----------> |
| |
| [Reboot]
| |
| <-- BootNotificationRequest ----------- |
| --- BootNotificationResponse ----------> |Flow Sequence (OnIdle Reset):
CSMS CS
| --- ResetRequest (OnIdle) -------------> |
| <-- ResetResponse (Scheduled) ---------- |
| |
| [CS waits for all transactions to end] |
| |
| <-- TransactionEventRequest (Ended) ---- | (as transactions end naturally)
| --- TransactionEventResponse ----------> |
| |
| [all transactions ended] |
| [Reboot]
| |
| <-- BootNotificationRequest ----------- |
| --- BootNotificationResponse ----------> |Requirements (CSMS-relevant):
| ID | Requirement |
|---|---|
B12.FR.01 | For Immediate reset with active transactions: CS SHALL stop transactions, send TransactionEventRequest with eventType=Ended and reason=ImmediateReset, then reboot. |
B12.FR.02 | For OnIdle reset with active transactions: CS responds Scheduled, stops accepting new transactions, waits for current ones to end, then reboots. |
B12.FR.03 | For EVSE-specific Immediate reset with active transaction: CS stops the transaction on that EVSE, sends TransactionEventRequest (Ended), makes EVSE unavailable, resets EVSE, then makes available again. |
B12.FR.04 | For EVSE-specific OnIdle reset: CS waits for transaction on that EVSE to end, then resets that EVSE. |
B12.FR.05 | After sending Scheduled response: CS SHALL NOT accept new transactions (for the scope of the reset - full CS or specific EVSE). |
B12.FR.06 | When a CS has received an OnIdle reset for the full CS and a transaction ends, the CS SHALL reset if there are no other active transactions. |
B12.FR.07 | When a CS has received an OnIdle reset for a specific EVSE and the transaction on that EVSE ends, the CS SHALL reset that EVSE. |
When resetting a CS with ongoing transactions:
For Immediate reset:
1. Send ResetRequest with type=Immediate
2. CS responds Accepted
3. Expect TransactionEventRequest(Ended, reason=ImmediateReset)
for each active transaction - handle transaction cleanup
4. Then expect BootNotificationRequest after reboot
5. Handle any meter values in the final TransactionEventRequest
For OnIdle reset:
1. Send ResetRequest with type=OnIdle
2. CS responds Scheduled (if transactions active)
3. CS stops accepting new transactions
4. Wait for TransactionEventRequest(Ended) as transactions
complete naturally
5. CS reboots when all transactions ended
6. Expect BootNotificationRequest after reboot
For EVSE-specific reset with transaction:
- Same logic but scoped to a single EVSE
- No full CS reboot needed
- Expect StatusNotification (Unavailable -> Available) for that EVSE5. Quick Reference
CSMS Message HandlersMessages the CSMS Receives (CS → CSMS)
| Message | Flow(s) | CSMS Action |
|---|---|---|
BootNotificationRequest | B01, B02, B03 | Decide Accept/Pending/Reject, respond with status + interval + currentTime |
StatusNotificationRequest | B01, B04, B11, B12 | Store connector status, respond with empty body |
HeartbeatRequest | B01, B04 | Respond with currentTime |
NotifyReportRequest | B07, B08 | Store report data, correlate by requestId, track seqNo/tbc, respond with empty body |
Messages the CSMS Sends (CSMS → CS)
| Message | Flow(s) | When to Send |
|---|---|---|
SetVariablesRequest | B05, B10 | To configure CS variables |
GetVariablesRequest | B06, B02 | To read CS variable values |
GetBaseReportRequest | B07 | To get predefined device model report |
GetReportRequest | B08 | To get filtered/custom report |
SetNetworkProfileRequest | B09, B10 | To set connection profile for migration |
ResetRequest | B10, B11, B12 | To reboot CS or reset individual EVSE |
Security: CALLERROR Responses
The CSMS must respond with CALLERROR: SecurityError when:
- CS has status Pending and sends a non-allowed CALL
(B02.FR.09) - CS has status Rejected and sends a non-BootNotification CALL
(B03.FR.07) - CS has status
!= Acceptedand sends a non-allowed CALL(B01.FR.10)
Allowed messages while Pending/Rejected:
BootNotificationRequest— always allowed- Messages triggered by
TriggerMessageRequest,GetBaseReportRequest,GetReportRequest— only while Pending