OCPP 2.0.1 Edition 4 Section B

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.

6 Sections
12 Use Cases
B01 – B12

1. Overview

Introduction

The 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 – B04
B01

Cold 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

BootNotificationRequest Schema
{
  "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

BootNotificationResponse Schema
{
  "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 status

After Accepting a CS:

  • The CS will send StatusNotificationRequest for each connector with current state
  • The CS will begin sending periodic HeartbeatRequest messages at the specified interval
  • The CSMS should respond to each HeartbeatRequest with HeartbeatResponse containing currentTime
StatusNotificationRequest (received from CS)
{
  "timestamp": "<dateTime>",                // REQUIRED
  "connectorStatus": "<ConnectorStatusEnumType>", // REQUIRED
  "evseId": "<integer>",                    // REQUIRED
  "connectorId": "<integer>"                // REQUIRED
}
// ConnectorStatusEnumType: Available, Occupied, Reserved, Unavailable, Faulted
HeartbeatResponse (sent to CS)
{
  "currentTime": "<dateTime>"  // REQUIRED - current CSMS time
}
B02

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: SecurityError

Important: The CSMS must NOT close the WebSocket while status is Pending.

B03

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 Reject

Note: 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.

B04

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.
CSMS Implementation Notes
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 offline

3. Variable Management

B05 – B08
B05

Set Variables

CSMS changes configuration variables on a Charging Station.

Flow Sequence:

CSO                   CSMS                        CS
 |  -- request -->     |                            |
 |                     |  --- SetVariablesRequest ->|
 |                     |  <-- SetVariablesResponse -|
SetVariablesRequest (CSMS → CS)
{
  "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
SetVariablesResponse (CS → CSMS)
{
  "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.
CSMS Implementation Notes
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 Actual
B06

Get Variables

CSMS reads configuration variables from a Charging Station.

Flow Sequence:

CSO                   CSMS                        CS
 |  -- request -->     |                            |
 |                     |  --- GetVariablesRequest ->|
 |                     |  <-- GetVariablesResponse -|
 |  <-- notification-  |                            |
GetVariablesRequest (CSMS → CS)
{
  "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>"
      }
    }
  ]
}
GetVariablesResponse (CS → CSMS)
{
  "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.
CSMS Implementation Notes
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)
B07

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 ---------------> |
GetBaseReportRequest (CSMS → CS)
{
  "requestId": "<integer>",         // REQUIRED - correlates NotifyReport messages
  "reportBase": "<ReportBaseEnumType>" // REQUIRED
}
GetBaseReportResponse (CS → CSMS)
{
  "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
NotifyReportRequest (CS → CSMS, async)
{
  "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, MemberList

Requirements (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).
CSMS Implementation Notes
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 NotifyReportResponse

Recommendation: Request FullInventory on first connection to build a complete device model knowledge of the Charging Station.

B08

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 >|
GetReportRequest (CSMS → CS)
{
  "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.
CSMS Implementation Notes
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 limit

4. Network & Reset

B09 – B12
B09

Setting 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 ----------  |
SetNetworkProfileRequest (CSMS → CS)
{
  "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
SetNetworkProfileResponse (CS → CSMS)
{
  "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").
CSMS Implementation Notes
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.

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
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 attempts
B11

Reset – 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 ---------->  |
ResetRequest (CSMS → CS)
{
  "type": "<ResetEnumType>",     // REQUIRED
  "evseId": "<integer>"          // optional - specific EVSE to reset
}
// ResetEnumType: Immediate | OnIdle
ResetResponse (CS → CSMS)
{
  "status": "<ResetStatusEnumType>",  // REQUIRED
  "statusInfo": {                      // optional
    "reasonCode": "<string, max 20>",
    "additionalInfo": "<string, max 512>"
  }
}
// ResetStatusEnumType: Accepted | Rejected | Scheduled

ResetEnumType 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.
CSMS Implementation Notes
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 flow
B12

Reset – 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.
CSMS Implementation Notes
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 EVSE

5. Quick Reference

CSMS Message Handlers

Messages 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 != Accepted and 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

6. Shared Types

Common Structures

StatusInfoType

Used as an optional field in many responses to provide additional context about the status.

StatusInfoType
{
  "reasonCode": "<string, max 20>",     // REQUIRED
  "additionalInfo": "<string, max 512>" // optional
}

ComponentType

Used in B05, B06, B07, B08 to identify a component on the Charging Station.

ComponentType
{
  "name": "<string, max 50>",           // REQUIRED - case insensitive
  "instance": "<string, max 50>",       // optional
  "evse": {                             // optional
    "id": "<integer>",                  // REQUIRED (> 0)
    "connectorId": "<integer>"          // optional
  }
}

VariableType

Used in B05, B06, B07, B08 to identify a variable within a component.

VariableType
{
  "name": "<string, max 50>",           // REQUIRED - case insensitive
  "instance": "<string, max 50>"        // optional
}

CustomDataType

Present in all messages as an always-optional extension field for vendor-specific data.

CustomDataType
{
  "vendorId": "<string, max 255>"       // REQUIRED within CustomData
}

OCPP 2.0.1 Provisioning Flows - CSMS Developer Guide. Based on OCPP 2.0.1 Edition 4 Specification (Part 2), Section B.