Smart Charging Flows - CSMS Developer Guide
Based on OCPP 2.1 Edition 2 Specification (Part 2), Section K (Smart Charging). This guide covers all smart charging flows (K01–K22), including charging profiles, composite schedules, load balancing, external constraints, ISO 15118 charging needs, and priority charging from the CSMS perspective using OCPP-J (JSON over WebSocket).
1. Overview & Concepts
IntroductionSmart Charging in OCPP 2.1 enables the CSMS to influence the charging power or current drawn from a specific EVSE or the entire Charging Station over a period of time. The CSMS can set, update, and clear charging profiles to manage energy distribution across stations.
Types of Smart Charging
| Type | Description | CSMS Role |
|---|---|---|
| Internal Load Balancing | CS controls current/power per EVSE internally | Set known physical grid connection limits via ChargingStationMaxProfile |
| Central Smart Charging | CSMS controls per-EV or per-station limits | Actively send TxProfile / TxDefaultProfile per transaction |
| Local Smart Charging | A Local Controller manages a group of stations | Set max limit on Local Controller; LC distributes among stations |
| External Smart Charging | External actor (DSO, EMS) sets limits | CS reports external limits to CSMS via NotifyChargingLimitRequest |
Charging Profile Purposes
| Purpose | Description | evseId | Persistence |
|---|---|---|---|
ChargingStationMaxProfile | Overall max power/current limit for the entire CS | Always 0 | Persistent |
TxDefaultProfile | Default schedule for new transactions | 0 = all, >0 = specific | Persistent |
TxProfile | Transaction-specific profile (overrules TxDefaultProfile) | >0 only | Not required |
ChargingStationExternalConstraints | Limits from external systems (EMS/DSO) — CSMS SHALL NOT set this | 0 or >0 | Not required |
PriorityCharging | Overrules Tx/TxDefault with max possible power, charging only | >0 only | Persistent |
LocalGeneration | Adds local generation capacity on top of other limits | 0 or >0 | Not required |
Important: The CSMS SHALL NOT set ChargingStationExternalConstraints — this purpose is reserved for external actors (EMS/DSO) setting limits directly on the Charging Station.
Charging Profile Kind
| Kind | Description | startSchedule |
|---|---|---|
Absolute | Periods relative to an absolute point in time | Required |
Recurring | Restarts periodically (Daily/Weekly) | Required |
Relative | Starts when EVSE ready to deliver energy | Must be absent |
Dynamic | Single period, updated dynamically by CSMS or external actor | N/A |
Operation Modes (New in 2.1)
| Mode | Direction | Description |
|---|---|---|
ChargingOnly | Unidirectional | Default. Only limit field used |
ExternalSetpoint | Unidirectional | setpoint determined by external actor (EMS) |
ExternalLimits | Unidirectional | limit determined by external actor |
CentralSetpoint | Bidirectional | setpoint set by CSMS |
CentralFrequency | Bidirectional | Frequency-watt curve based |
LocalFrequency | Bidirectional | Local frequency response |
LocalLoadBalancing | Bidirectional | Local load balancing |
Idle | Bidirectional | EVSE sleep mode |
Stack Level & Profile Precedence
- Higher
stackLevelvalues have precedence over lower values within the samechargingProfilePurpose. - The Composite Schedule is calculated by taking the lowest
limitandsetpointacross the leading profiles from each purpose (ChargingStationMaxProfile, ChargingStationExternalConstraints, TxDefaultProfile/TxProfile/PriorityCharging). LocalGenerationcapacity is added on top of the calculated composite schedule.PriorityChargingoverrules TxProfile and TxDefaultProfile.
2. K01 — SetChargingProfile
CSMS-Initiated| Use Case ID | K01 |
| Direction | CSMS → Charging Station |
| Objective | Set or update a charging profile on the Charging Station to influence charging power/current |
| OCPP Messages | SetChargingProfileRequest / SetChargingProfileResponse |
Sequence Diagram
CSMS Charging Station
| |
| SetChargingProfileRequest(evseId, |
| chargingProfile) |
|------------------------------------------>|
| |
| SetChargingProfileResponse(status) |
|<------------------------------------------|Request: SetChargingProfileRequest
CSMS sends this message to set/update a charging profile on the CS.
| Field | Type | Required | Description |
|---|---|---|---|
evseId | integer (>=0) | Yes | Target EVSE. 0 = entire station (for TxDefaultProfile applies to all EVSEs; for ChargingStationMaxProfile = overall limit) |
chargingProfile | ChargingProfileType | Yes | The charging profile to install |
ChargingProfileType
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Unique ID within the CS. Can be negative (useful to distinguish from external-actor profiles) |
stackLevel | integer (>=0) | Yes | Priority level. Higher = more precedence |
chargingProfilePurpose | enum | Yes | ChargingStationMaxProfile, TxDefaultProfile, TxProfile, PriorityCharging, LocalGeneration (NOT ChargingStationExternalConstraints) |
chargingProfileKind | enum | Yes | Absolute, Recurring, Relative, Dynamic |
recurrencyKind | enum | No | Daily or Weekly. Required only when kind = Recurring |
validFrom | dateTime | No | When profile becomes valid. If absent, valid immediately |
validTo | dateTime | No | When profile expires. If absent, valid until replaced |
transactionId | string (max 36) | Conditional | Required when purpose = TxProfile. Matches profile to a specific transaction |
maxOfflineDuration | integer | No | Seconds the profile remains valid while CS is offline. 0 = immediately invalid offline |
invalidAfterOfflineDuration | boolean | No | If true, profile becomes permanently invalid after offline timeout. Default: false |
chargingSchedule | ChargingScheduleType[] | Yes | 1 to 3 charging schedules |
dynUpdateInterval | integer | No | For Dynamic profiles: seconds between update requests |
dynUpdateTime | dateTime | No | For Dynamic profiles: last update time |
ChargingScheduleType
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Unique schedule ID |
chargingRateUnit | enum | Yes | W (Watts) or A (Amperes) |
chargingSchedulePeriod | Period[] | Yes | 1 to 1024 periods, ordered by startPeriod |
startSchedule | dateTime | Conditional | Required for Absolute and Recurring kinds. Must be absent for Relative |
duration | integer | No | Duration in seconds. If omitted, last period continues indefinitely |
minChargingRate | number | No | Minimum efficient charging rate (for local smart charging optimization) |
useLocalTime | boolean | No | If true, treat startSchedule as local time (ignoring timezone offset) |
randomizedDelay | integer (>=0) | No | Max random delay (seconds) for period starts. Only for TxProfile/TxDefaultProfile |
limitAtSoC | LimitAtSoCType | No | Cap limit/setpoint when EV SoC exceeds threshold |
salesTariff | SalesTariffType | No | ISO 15118-2 tariff information |
absolutePriceSchedule | AbsolutePriceScheduleType | No | ISO 15118-20 price schedule |
priceLevelSchedule | PriceLevelScheduleType | No | ISO 15118-20 price levels |
LimitAtSoCType (New in 2.1)
| Field | Type | Required | Description |
|---|---|---|---|
soc | integer (0-100) | Yes | SoC threshold percentage |
limit | number | Yes | Charging rate limit to apply when SoC >= threshold |
ChargingSchedulePeriodType
| Field | Type | Required | Description |
|---|---|---|---|
startPeriod | integer | Yes | Start of period in seconds from schedule start. First period MUST be 0 |
limit | number | Conditional | Max charging rate (W or A). Required for ChargingOnly mode |
limit_L2 | number | No | Per-phase limit for L2 |
limit_L3 | number | No | Per-phase limit for L3 |
numberPhases | integer (0-3) | No | Number of phases. Default: 3 for AC. Omit for DC |
phaseToUse | integer (1-3) | No | Specific phase when numberPhases=1 and EVSE supports phase switching |
dischargeLimit | number (<=0) | No | Max discharge rate (negative value) |
dischargeLimit_L2 | number (<=0) | No | Per-phase discharge limit L2 |
dischargeLimit_L3 | number (<=0) | No | Per-phase discharge limit L3 |
setpoint | number | No | Target charge/discharge rate (negative = discharge) |
setpoint_L2 | number | No | Per-phase setpoint L2 |
setpoint_L3 | number | No | Per-phase setpoint L3 |
setpointReactive | number | No | Reactive power setpoint (+inductive, -capacitive) |
setpointReactive_L2 | number | No | Per-phase reactive setpoint L2 |
setpointReactive_L3 | number | No | Per-phase reactive setpoint L3 |
operationMode | enum | No | Operation mode for this period. Default: ChargingOnly |
evseSleep | boolean | No | If true, EVSE turns off power electronics. Only valid with operationMode = Idle |
preconditioningRequest | boolean | No | Request EV to keep BMS preconditioned |
Response: SetChargingProfileResponse
The CS responds with acceptance or rejection.
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | Accepted or Rejected |
statusInfo | StatusInfoType | No | Additional status details |
Known Rejection Reason Codes
| reasonCode | Condition |
|---|---|
TxNotFound | TxProfile sent but no active transaction on the specified EVSE |
UnknownEVSE | The specified evseId does not exist |
UnsupportedRateUnit | chargingRateUnit not supported by CS |
DuplicateProfile | Duplicate stackLevel-purpose-evseId combination with different id |
InvalidSchedule | Various schedule validation failures (e.g., useLocalTime/randomizedDelay/limitAtSoC not supported) |
InvalidProfile | dynUpdateInterval/dynUpdateTime on non-Dynamic profile |
InvalidProfileId | Profile ID <= MaxExternalConstraintsId when that config var is set |
InvalidOperationMode | Operation mode not valid for the profile purpose or not supported |
UnsupportedPurpose | Profile purpose (PriorityCharging, LocalGeneration) not in SupportedAdditionalPurposes |
PhaseConflict | Conflicting phaseToUse between profiles |
NoPhaseForDC | numberPhases/phaseToUse on DC EVSE without DCInputPhaseControl |
RateLimitExceeded | Too many frequent updates threatening persistent memory |
CSMS Implementation Rules
- NEVER set
chargingProfilePurposetoChargingStationExternalConstraints(K01.FR.22). - ALWAYS include
transactionIdwhen setting aTxProfile(K01.FR.03). - Do not create duplicate
stackLevel-chargingProfilePurpose-evseIdcombinations with differentidwhen purpose is NOT TxProfile (K01.FR.06). - Do not create duplicate
stackLevel-transactionIdcombinations with differentidwhen purpose IS TxProfile (K01.FR.39). - TxProfile can only be used with
evseId> 0 (K01.FR.16). - ChargingStationMaxProfile must NOT use
chargingProfileKind=Relative(K01.FR.38). - Do not set
phaseToUsewhennumberPhasesis other than 1 (K01.FR.19). - For PriorityCharging: do NOT add
durationto any chargingSchedule (K01.FR.73), andoperationModemust beChargingOnly(K01.FR.71). - When
MaxExternalConstraintsIdis configured, choose profileidvalues higher than that value (K01.FR.80). - Support
maxOfflineDuration> 0 andinvalidAfterOfflineDuration= true/false (K01.FR.104). - Support
limitAtSoCin charging schedules (K01.FR.105). - Support
useLocalTime= true andrandomizedDelay> 0 (K01.FR.96). - Only provide
limit_L2/limit_L3in TxProfile and only after receivingNotifyEVChargingNeedsRequestwith per-phase max power values (K01.FR.142-145). - If CS responds with
RateLimitExceeded, use the delay fromstatusInfo.additionalInfobefore retrying (K01.FR.58-59).
Examples
{
"evseId": 0,
"chargingProfile": {
"id": 100,
"stackLevel": 0,
"chargingProfilePurpose": "TxDefaultProfile",
"chargingProfileKind": "Recurring",
"recurrencyKind": "Daily",
"chargingSchedule": [{
"id": 1,
"startSchedule": "2013-01-01T00:00:00Z",
"duration": 86400,
"chargingRateUnit": "W",
"chargingSchedulePeriod": [
{ "startPeriod": 0, "limit": 11000, "numberPhases": 3 },
{ "startPeriod": 28800, "limit": 6000, "numberPhases": 3 },
{ "startPeriod": 72000, "limit": 11000, "numberPhases": 3 }
]
}]
}
}{
"evseId": 1,
"chargingProfile": {
"id": 200,
"stackLevel": 0,
"chargingProfilePurpose": "TxProfile",
"chargingProfileKind": "Relative",
"transactionId": "TX-ABC-12345",
"chargingSchedule": [{
"id": 1,
"chargingRateUnit": "A",
"chargingSchedulePeriod": [
{ "startPeriod": 0, "limit": 32, "numberPhases": 3 }
]
}]
}
}3. K02 — Central Smart Charging
CSMS-Initiated| Use Case ID | K02 |
| Direction | CSMS → Charging Station (ongoing transaction management) |
| Objective | CSMS dynamically adjusts charging limits per transaction based on grid constraints, energy prices, etc. |
| OCPP Messages | SetChargingProfileRequest / SetChargingProfileResponse |
Sequence Diagram
EV Driver EV Charging Station CSMS
| | | |
| plugin | | |
|--------->| | |
| | auth | |
| |--------->| |
| | | TransactionEventRequest(Started) |
| | |----------------------------------->|
| | | TransactionEventResponse(...) |
| | |<-----------------------------------|
| | | |
| | charge | |
| |<---------| |
| | | [CSMS decides to change] |
| | | |
| | | SetChargingProfileRequest(TxProfile)|
| | |<-----------------------------------|
| | | SetChargingProfileResponse(Accepted)|
| | |----------------------------------->|CSMS Implementation Steps
- Receive
TransactionEventRequestwitheventType=Startedfrom the CS. - Decide whether to set charging limits for this transaction.
- Send
SetChargingProfileRequestwith:chargingProfilePurpose=TxProfiletransactionId= the transaction ID from the TransactionEventRequestchargingProfileKind=Relative(recommended — starts when charging begins)
- Process
SetChargingProfileResponse. - Repeat step 3 any time limits need to change during the transaction.
CSMS Requirements
| Requirement | Description |
|---|---|
K02.FR.01 | Use charging profiles that stay within limits imposed by any external system |
K02.FR.03 | Set chargingProfilePurpose to TxProfile for transaction-specific profiles |
K02.FR.07 | Do NOT set chargingProfilePurpose to ChargingStationExternalConstraints |
Recommendations
- Check the
offlineflag inTransactionEventRequestbefore sending a charging profile (the transaction might have been cached while offline). - Omit
durationinTxProfileso the profile lasts for the entire transaction.
4. K03 — Local Smart Charging
Local Controller| Use Case ID | K03 |
| Objective | Illustrate local load-balancing by a Local Controller |
| CSMS Role | Limited — set max limit on Local Controller, optionally set TxDefaultProfile |
CSMS Role
The CSMS's role in local smart charging is limited:
- Set the maximum current for the Local Controller cluster by sending a
SetChargingProfileRequestwithchargingProfilePurpose=ChargingStationMaxProfileto the Local Controller (LC). - Optionally set
TxDefaultProfileon the LC for default per-transaction limits. - Forward
TransactionEventRequestmessages from stations in the cluster (received via the LC). - Set
chargingPriorityinTransactionEventResponseif certain transactions should be prioritized.
CSMS Requirements
| Requirement | Description |
|---|---|
K03.FR.05 | If chargingPriority is given in TransactionEventResponse that differs from the IdToken's priority, use the response value for that transaction only |
K03.FR.06 | Default chargingPriority = 0 when unknown |
5. K04 — Internal Load Balancing
CSMS-Initiated| Use Case ID | K04 |
| Objective | CS handles internal load balancing; CSMS sets the overall limit |
| CSMS Role | Set ChargingStationMaxProfile with the grid connection limit |
CSMS Role
Send SetChargingProfileRequest with:
evseId= 0chargingProfilePurpose=ChargingStationMaxProfilelimit= maximum current/power of the grid connection
CSMS Requirements
| Requirement | Description |
|---|---|
K04.FR.03 | ChargingStationMaxProfile can only be set at evseId = 0 |
K04.FR.05 | Combined energy flow of all EVSEs SHALL NOT exceed ChargingStationMaxProfile + LocalGeneration |
6. K05 — Remote Start Transaction with Charging Profile
CSMS-Initiated| Use Case ID | K05 |
| Direction | CSMS → Charging Station |
| Objective | Remotely start a transaction with a pre-set charging profile |
| OCPP Messages | RequestStartTransactionRequest / RequestStartTransactionResponse |
Sequence Diagram
External Trigger CSMS Charging Station
| | |
| remote start | |
|-------------->| |
| | RequestStartTransactionRequest |
| | (idToken, chargingProfile, |
| | remoteStartId=123) |
| |--------------------------------->|
| | RequestStartTransactionResponse |
| | (status=Accepted) |
| |<---------------------------------|
| | |
| | [EV plugs in, auth, start] |
| | |
| | TransactionEventRequest(Started, |
| | remoteStartId=123) |
| |<---------------------------------|CSMS Implementation
- Include a
ChargingProfilein theRequestStartTransactionRequest. - The profile's
chargingProfilePurposeMUST beTxProfile(K05.FR.02). transactionIdcannot be provided in the ChargingProfile (it's not known yet at request time).- The CS will apply the profile once the transaction starts.
CSMS Requirements
| Requirement | Description |
|---|---|
K05.FR.01 | CSMS MAY include a ChargingProfile in the remote start request |
K05.FR.02 | Purpose SHALL always be TxProfile |
7. K06 — Offline Behavior During Transaction
CS BehaviorUse Case ID: K06 — Ensure CS continues using the charging profile when it goes offline during a transaction. This is primarily a CS behavior. The CSMS should pre-configure profiles for offline scenarios.
CSMS Role
- Pre-set charging profiles before the CS might go offline.
- Use
maxOfflineDurationto control how long the profile remains valid while offline. - Set
invalidAfterOfflineDuration=trueif the profile should be permanently invalidated after the offline timeout. - After reconnection, consider sending updated profiles to replace any that may have expired.
Offline Duration Settings
maxOfflineDuration= 0 — profile is immediately invalid when offlinemaxOfflineDurationabsent — no offline timeout, profile always validinvalidAfterOfflineDuration=true— permanently invalid after timeoutinvalidAfterOfflineDuration=false(default) — becomes valid again when back online
8. K07 — Offline Behavior at Start of Transaction
CS BehaviorUse Case ID: K07 — Ensure transactions started while offline use appropriate charging profiles.
CSMS Role
- Pre-install
TxDefaultProfileon stations that may go offline. The CS will use these profiles for any transaction started while offline. - These profiles are persistent across reboots (K01.FR.27).
Important: TxDefaultProfile is the only way to ensure transactions started while offline have appropriate charging limits. Make sure to pre-install these profiles on all stations that may experience connectivity issues.
9. K08 — Get Composite Schedule
CSMS-Initiated| Use Case ID | K08 |
| Direction | CSMS → Charging Station |
| Objective | Request the CS to report its calculated composite charging schedule |
| OCPP Messages | GetCompositeScheduleRequest / GetCompositeScheduleResponse |
Sequence Diagram
CSMS Charging Station
| |
| GetCompositeScheduleRequest(evseId, |
| duration, [chargingRateUnit]) |
|------------------------------------------>|
| | [calculate]
| GetCompositeScheduleResponse(status, |
| [schedule]) |
|<------------------------------------------|Request: GetCompositeScheduleRequest
| Field | Type | Required | Description |
|---|---|---|---|
duration | integer | Yes | Requested schedule length in seconds |
evseId | integer (>=0) | Yes | Target EVSE. 0 = total expected grid consumption |
chargingRateUnit | enum | No | W or A. Forces the unit of the response |
Response: GetCompositeScheduleResponse
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | Accepted or Rejected |
statusInfo | StatusInfoType | No | Additional info |
schedule | CompositeScheduleType | No | The computed schedule (present when status = Accepted) |
CompositeScheduleType
| Field | Type | Required | Description |
|---|---|---|---|
evseId | integer (>=0) | Yes | The EVSE this schedule applies to |
duration | integer | Yes | Duration of the schedule in seconds |
scheduleStart | dateTime | Yes | Start time of the schedule |
chargingRateUnit | enum | Yes | W or A |
chargingSchedulePeriod | Period[] | Yes | The computed periods |
CSMS Implementation Notes
- The composite schedule represents the merged result of all active profiles and local limits.
- K08.FR.04: The schedule always reports the lowest
limitandsetpointwhen charging, and the highestdischargeLimitandsetpointwhen discharging. - When
evseId= 0, the CS calculates total expected grid consumption. - The schedule is only indicative for that point in time and may change.
- CS may respond
Rejectedif theevseIdis unknown or thechargingRateUnitis not supported.
10. K09 — Get Charging Profiles
CSMS-Initiated| Use Case ID | K09 |
| Direction | CSMS → CS (request), then CS → CSMS (reports) |
| Objective | Retrieve charging profiles installed on a CS |
| OCPP Messages | GetChargingProfilesRequest / GetChargingProfilesResponse, then ReportChargingProfilesRequest / ReportChargingProfilesResponse |
Sequence Diagram
CSMS Charging Station
| |
| GetChargingProfilesRequest(requestId, |
| chargingProfile filter, [evseId]) |
|------------------------------------------>|
| |
| GetChargingProfilesResponse(status) |
|<------------------------------------------|
| |
| [loop while tbc = true] |
| ReportChargingProfilesRequest( |
| requestId, profiles, tbc, evseId) |
|<------------------------------------------|
| |
| ReportChargingProfilesResponse() |
|------------------------------------------>|Request: GetChargingProfilesRequest
| Field | Type | Required | Description |
|---|---|---|---|
requestId | integer | Yes | Reference ID to correlate with ReportChargingProfilesRequest |
evseId | integer (>=0) | No | 0 = station-level profiles only. Omitted = all profiles. >0 = specific EVSE |
chargingProfile | CriterionType | Yes | Filter criteria |
ChargingProfileCriterionType
| Field | Type | Required | Description |
|---|---|---|---|
chargingProfilePurpose | enum | No | Filter by purpose |
stackLevel | integer (>=0) | No | Filter by stack level |
chargingProfileId | integer[] | No | Filter by specific profile IDs |
chargingLimitSource | string[] (max 4) | No | Filter by limit source (e.g., "CSO", "EMS", "SO", "Other") |
Response: GetChargingProfilesResponse
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | Accepted (will send reports) or NoProfiles (nothing matches) |
CSMS Implementation Notes
- Specify filter criteria using either
chargingProfileIdlist OR one or more ofstackLevel,chargingLimitSource,chargingProfilePurpose(K09.FR.03). - After receiving
Accepted, wait forReportChargingProfilesRequestmessages. - Process each
ReportChargingProfilesRequestand respond withReportChargingProfilesResponse. - Continue collecting until
tbc=false(or omitted) in the last report.
11. K10 — Clear Charging Profile
CSMS-Initiated| Use Case ID | K10 |
| Direction | CSMS → Charging Station |
| Objective | Clear one or more charging profiles from the CS |
| OCPP Messages | ClearChargingProfileRequest / ClearChargingProfileResponse |
Sequence Diagram
CSMS Charging Station
| |
| ClearChargingProfileRequest( |
| [chargingProfileId], |
| [chargingProfileCriteria]) |
|------------------------------------------>|
| |
| ClearChargingProfileResponse(status) |
|<------------------------------------------|Request: ClearChargingProfileRequest
All fields are optional, but the CSMS SHALL specify either chargingProfileId OR at least one field in chargingProfileCriteria (K10.FR.02).
| Field | Type | Required | Description |
|---|---|---|---|
chargingProfileId | integer | No | Specific profile ID to clear |
chargingProfileCriteria | ClearChargingProfileType | No | Criteria-based clearing |
ClearChargingProfileType
| Field | Type | Required | Description |
|---|---|---|---|
evseId | integer (>=0) | No | 0 = station-level. Absent = all EVSEs |
chargingProfilePurpose | enum | No | Filter by purpose |
stackLevel | integer (>=0) | No | Filter by stack level |
Response: ClearChargingProfileResponse
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | Accepted (profiles cleared) or Unknown (no matching profiles) |
statusInfo | StatusInfoType | No | Additional info |
CSMS Implementation Rules
| Requirement | Description |
|---|---|
K10.FR.02 | CSMS SHALL specify either chargingProfileId OR at least one field in chargingProfileCriteria |
K10.FR.06 | CSMS SHALL NOT set chargingProfilePurpose to ChargingStationExternalConstraints or LocalGeneration |
K10.FR.07 | When clearing TxDefaultProfile, active transactions continue as if no TxDefaultProfile was ever set |
K10.FR.08/09 | CS will respond Unknown if only external constraint profiles match |
12. K11 — Notify Charging Limit
CS-Initiated| Use Case ID | K11 |
| Direction | Charging Station → CSMS |
| Objective | CS informs CSMS about charging limits set by an external source (EMS, DSO) |
| OCPP Messages | NotifyChargingLimitRequest / NotifyChargingLimitResponse |
Sequence Diagram
Charging Station CSMS
| |
| NotifyChargingLimitRequest( |
| chargingLimit, [chargingSchedule],|
| [evseId]) |
|----------------------------------->|
| |
| NotifyChargingLimitResponse() |
|<-----------------------------------|Request: NotifyChargingLimitRequest (received by CSMS)
| Field | Type | Required | Description |
|---|---|---|---|
chargingLimit | ChargingLimitType | Yes | Information about the charging limit source |
chargingSchedule | ChargingScheduleType[] | No | The actual charging schedules/limits |
evseId | integer (>=0) | No | Which EVSE. 0 or absent = entire station |
ChargingLimitType
| Field | Type | Required | Description |
|---|---|---|---|
chargingLimitSource | string (max 20) | Yes | Source identifier: "CSO", "EMS", "SO", "Other" |
isLocalGeneration | boolean | No | true if reporting local generation capacity (not a limitation) |
isGridCritical | boolean | No | true if the limit is critical for grid stability |
Response: Empty response (only optional customData). The CSMS simply acknowledges receipt.
{}CSMS Implementation
- Store the reported external limits for the charging station.
- Use this information when calculating charging profiles to send to the station.
- Consider
isGridCritical=trueas requiring immediate attention. - Consider
isLocalGeneration=trueas additional available capacity. - Small changes in limit/setpoint below the
LimitChangeSignificanceconfig variable threshold may not be reported.
13. K12 — Cleared Charging Limit
CS-Initiated| Use Case ID | K12 |
| Direction | Charging Station → CSMS |
| Objective | CS informs CSMS that an externally imposed charging limit has been cleared |
| OCPP Messages | ClearedChargingLimitRequest / ClearedChargingLimitResponse |
Request: ClearedChargingLimitRequest (received by CSMS)
| Field | Type | Required | Description |
|---|---|---|---|
chargingLimitSource | string (max 20) | Yes | Source that was cleared: "CSO", "EMS", "SO", "Other" |
evseId | integer (>=0) | No | EVSE from which the limit was cleared |
Response: Empty response (only optional customData).
{}CSMS Implementation
- Update internal state to reflect that the external limit from the specified source is no longer active.
- Optionally send updated charging profiles to the station if the CSMS was accounting for those external limits.
14. K13 — Notify EV Charging Schedule
CS-Initiated| Use Case ID | K13 |
| Direction | Charging Station → CSMS |
| Objective | CS reports the charging schedule that the EV has communicated (via ISO 15118) |
| OCPP Messages | NotifyEVChargingScheduleRequest / NotifyEVChargingScheduleResponse |
Request: NotifyEVChargingScheduleRequest (received by CSMS)
| Field | Type | Required | Description |
|---|---|---|---|
timeBase | dateTime | Yes | Reference time for the schedule periods |
evseId | integer (>=1) | Yes | The EVSE to which this schedule applies |
chargingSchedule | ChargingScheduleType | Yes | The EV's charging schedule (only duration, chargingSchedulePeriod with startPeriod, limit, limit_L2, limit_L3 are relevant; chargingRateUnit must be W) |
selectedChargingScheduleId | integer (>=0) | No | ID of the schedule the EV selected from the provided ChargingProfile |
powerToleranceAcceptance | boolean | No | true if EV accepts the power tolerance |
Response: NotifyEVChargingScheduleResponse
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | Accepted or Rejected |
statusInfo | StatusInfoType | No | Additional details |
CSMS Implementation
- Acknowledge with
Acceptedto confirm the message was processed. - Use this information to understand the EV's intended charging behavior.
- Optionally adjust charging profiles based on the EV's schedule.
- If the EV indicates it will use less energy than the limit allows, the composite schedule should report the EV's amount (SC.04).
15. K15/K16/K17 — Notify EV Charging Needs
CS-Initiated ISO 15118| Use Case IDs | K15 (ISO 15118 based smart charging), K16 (updated needs), K17 (multi-schedule) |
| Direction | Charging Station → CSMS |
| Objective | CS reports EV charging needs received via ISO 15118 so CSMS can compute an optimal charging profile |
| OCPP Messages | NotifyEVChargingNeedsRequest / NotifyEVChargingNeedsResponse |
Request: NotifyEVChargingNeedsRequest (received by CSMS)
| Field | Type | Required | Description |
|---|---|---|---|
evseId | integer (>=1) | Yes | The EVSE the EV is connected to |
chargingNeeds | ChargingNeedsType | Yes | The EV's charging requirements |
maxScheduleTuples | integer (>=0) | No | Max number of schedule entries the EV supports |
timestamp | dateTime | No | When the needs were received (useful if CS was offline) |
ChargingNeedsType
| Field | Type | Required | Description |
|---|---|---|---|
requestedEnergyTransfer | enum | Yes | AC_single_phase, AC_two_phase, AC_three_phase, DC, AC_BPT, AC_BPT_DER, AC_DER, DC_BPT, DC_ACDP, DC_ACDP_BPT, WPT |
departureTime | dateTime | No | Estimated departure time |
acChargingParameters | ACChargingParametersType | No | ISO 15118-2 AC parameters |
dcChargingParameters | DCChargingParametersType | No | ISO 15118-2 DC parameters |
v2xChargingParameters | V2XChargingParametersType | No | ISO 15118-20 V2X parameters |
derChargingParameters | DERChargingParametersType | No | ISO 15118-20 DER parameters |
evEnergyOffer | EVEnergyOfferType | No | EV's energy offer for V2X |
availableEnergyTransfer | enum[] | No | Other available energy transfer modes |
controlMode | enum | No | ScheduledControl or DynamicControl |
mobilityNeedsMode | enum | No | EVCC or EVCC_SECC |
ACChargingParametersType (ISO 15118-2)
| Field | Type | Required | Description |
|---|---|---|---|
energyAmount | number | Yes | Requested energy in Wh |
evMinCurrent | number | Yes | Min current per phase (A) |
evMaxCurrent | number | Yes | Max current per phase (A), including cable |
evMaxVoltage | number | Yes | Max voltage (V) |
DCChargingParametersType (ISO 15118-2)
| Field | Type | Required | Description |
|---|---|---|---|
evMaxCurrent | number | Yes | Max current (A) |
evMaxVoltage | number | Yes | Max voltage (V) |
evMaxPower | number | No | Max power (W) |
evEnergyCapacity | number | No | Battery capacity (Wh) |
energyAmount | number | No | Requested energy (Wh) |
stateOfCharge | integer (0-100) | No | Current SoC % |
fullSoC | integer (0-100) | No | SoC considered fully charged |
bulkSoC | integer (0-100) | No | SoC where fast charging ends |
V2XChargingParametersType (ISO 15118-20) — Key Fields
| Field | Description |
|---|---|
maxChargePower / _L2 / _L3 | Max charge power per phase (W) |
minChargePower / _L2 / _L3 | Min charge power per phase (W) |
maxDischargePower / _L2 / _L3 | Max discharge power per phase (W) |
minDischargePower / _L2 / _L3 | Min discharge power per phase (W) |
maxChargeCurrent / maxDischargeCurrent | DC current limits (A) |
minChargeCurrent / minDischargeCurrent | DC current minimums (A) |
minVoltage / maxVoltage | Voltage range (V) |
evTargetEnergyRequest | Target energy (Wh) |
evMinEnergyRequest | Min energy (Wh) |
evMaxEnergyRequest | Max energy (Wh) |
evMinV2XEnergyRequest | Min V2X cycling energy (Wh) |
evMaxV2XEnergyRequest | Max V2X cycling energy (Wh) |
targetSoC | Target departure SoC (0-100) |
Response: NotifyEVChargingNeedsResponse
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | Accepted, Rejected, Processing, NoChargingProfile |
statusInfo | StatusInfoType | No | Additional details |
Status Values
| Status | Meaning |
|---|---|
Accepted | CSMS can meet the EV's needs. Will send a charging profile. |
Processing | CSMS is computing the schedule, will send profile later. |
Rejected | CSMS cannot meet the needs (e.g., departure time too soon). |
NoChargingProfile | CSMS accepted but will not send a charging profile. |
CSMS Implementation
- Receive the EV charging needs.
- Compute an optimal charging schedule considering:
- EV's energy requirements and departure time
- Grid constraints and external limits
- Energy prices and availability
maxScheduleTuples(don't exceed this in your response profile)
- Respond with status indicating whether you can accommodate the needs.
- Send a
SetChargingProfileRequestwith purposeTxProfile(possibly with up to 3ChargingScheduleTypeelements for ISO 15118-20 multi-schedule support). - If
controlMode=DynamicControl, usechargingProfileKind=Dynamicwith a single period that is updated dynamically.
16. K21/K22 — Use Priority Charging
CSMS-Initiated| Use Case IDs | K21 (activate), K22 (deactivate) |
| Direction | CSMS → Charging Station |
| Objective | Request a Charging Station to apply priority charging for a specific transaction |
| OCPP Messages | UsePriorityChargingRequest / UsePriorityChargingResponse |
Sequence Diagram
CSMS Charging Station
| |
| UsePriorityChargingRequest( |
| transactionId, activate) |
|------------------------------------------>|
| |
| UsePriorityChargingResponse(status) |
|<------------------------------------------|Request: UsePriorityChargingRequest
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string (max 36) | Yes | The transaction to prioritize |
activate | boolean | Yes | true = enable priority charging, false = disable |
Response: UsePriorityChargingResponse
| Field | Type | Required | Description |
|---|---|---|---|
status | enum | Yes | Accepted, Rejected, NoProfile |
statusInfo | StatusInfoType | No | Additional details |
Status Values
| Status | Meaning |
|---|---|
Accepted | Priority charging activated/deactivated |
Rejected | Request denied |
NoProfile | No PriorityCharging profile is available on the CS |
CSMS Implementation
- Pre-install a
PriorityChargingprofile on the CS usingSetChargingProfileRequest(K01.FR.72). - When priority is needed, send
UsePriorityChargingRequestwithactivate=true. - The CS will activate the pre-installed
PriorityChargingprofile which overrules TxProfile/TxDefaultProfile. PriorityChargingprovides maximum possible power and only allows charging (no discharge).- To deactivate, send with
activate=false.
PriorityCharging Profile Rules
operationModemust beChargingOnlyonly (K01.FR.71).- No
durationin thechargingSchedule(K01.FR.73). It lasts until end of transaction. - The CS must support
PriorityChargingpurpose (checkSupportedAdditionalPurposes).
17. ReportChargingProfiles
CS-Initiated| Trigger | Response to GetChargingProfilesRequest (K09) |
| Direction | Charging Station → CSMS |
| Objective | CS reports installed charging profiles to the CSMS |
| OCPP Messages | ReportChargingProfilesRequest / ReportChargingProfilesResponse |
Request: ReportChargingProfilesRequest (received by CSMS)
| Field | Type | Required | Description |
|---|---|---|---|
requestId | integer | Yes | Correlates with the GetChargingProfilesRequest |
chargingLimitSource | string (max 20) | Yes | Source that installed the profile |
evseId | integer (>=0) | Yes | EVSE the profiles are installed on |
chargingProfile | ChargingProfileType[] | Yes | Array of charging profiles |
tbc | boolean | No | true = more reports coming. false/absent = this is the last report |
Response: Empty response (only optional customData).
{}CSMS Implementation
- Collect all
ReportChargingProfilesRequestmessages with the matchingrequestId. - Continue collecting until a message arrives with
tbc=falseortbcabsent. - Store the reported profiles for internal state management.
- Respond with an empty
ReportChargingProfilesResponsefor each received message.
18. Shared Data Types Reference
ReferenceStatusInfoType
Used in most responses to provide additional detail about the status.
{
"reasonCode": "string (max 20, required)",
"additionalInfo": "string (max 1024, optional)"
}CustomDataType is available in all request/response types for vendor extensions:
{
"vendorId": "string (max 255, required)"
}ChargingRateUnitEnumType
| Value | Description |
|---|---|
W | Watts — represents total power across all phases (or per-phase if L2/L3 specified) |
A | Amperes — represents current per phase |
Important: When using W with AC charging, the CS calculates per-phase current as: Current per phase = limit / (Line Voltage × numberPhases).
When using A, limits are per-phase (not the sum).
ChargingLimitSourceEnumStringType
| Value | Description |
|---|---|
CSO | Charging Station Operator |
EMS | Energy Management System |
SO | System Operator (DSO/TSO) |
Other | Other source |
19. Charging Profile Concepts & Rules
ReferenceComposite Schedule Calculation
The Composite Schedule at any point in time is determined by:
- For each profile purpose, find the leading schedule (highest
stackLevelthat has a valid period). - Take the minimum of
limitandsetpointacross all purposes (ChargingStationMaxProfile, ChargingStationExternalConstraints, TxDefaultProfile or TxProfile or PriorityCharging). - If
LocalGenerationis active, add its capacity on top. - When
PriorityChargingis activated, it overrules TxProfile/TxDefaultProfile. - For
numberPhases, use the lowest value from all applicable profiles.
Stacking Profiles
Multiple profiles with the same purpose can be stacked using different stackLevel values:
- Higher
stackLeveloverrides lower within the same purpose. - Useful for complex calendars (e.g., peak hours + weekend exceptions + holiday exceptions).
Phase Conflict Avoidance
- Do not set conflicting
phaseToUsevalues between ChargingStationMaxProfile and TxProfile. phaseToUsecan only be set whennumberPhases= 1.- The CS will reject profiles that cause phase conflicts with
reasonCode=PhaseConflict.
Randomized Delays
For TxDefaultProfile and TxProfile only:
- Set
randomizedDelayto spread load changes across multiple stations. - The first period (
startPeriod= 0) is NOT delayed. - The delay is calculated once at transaction start or profile submission.
Offline Validity
| Setting | Behavior |
|---|---|
maxOfflineDuration = N (seconds) | Profile stays valid for N seconds while offline |
maxOfflineDuration absent | No offline timeout, profile always valid |
invalidAfterOfflineDuration = true | Profile is permanently invalid after timeout |
invalidAfterOfflineDuration = false (default) | Profile becomes valid again when back online |
Profile Persistence
| Purpose | Must Persist Across Reboots |
|---|---|
ChargingStationMaxProfile | Yes |
TxDefaultProfile | Yes |
PriorityCharging | Yes |
TxProfile | No (but MAY be) |
LocalGeneration | No (but MAY be) |
ChargingStationExternalConstraints | No (but MAY be) |
20. Message Direction Summary
ReferenceOutgoing from CSMS (CSMS → Charging Station)
| Message | CSMS Action | Use Cases |
|---|---|---|
SetChargingProfileRequest | Send request to set/update a charging profile | K01, K02, K04, K05 |
ClearChargingProfileRequest | Send request to clear charging profiles | K10 |
GetCompositeScheduleRequest | Send request to get composite schedule | K08 |
GetChargingProfilesRequest | Send request to retrieve installed profiles | K09 |
UsePriorityChargingRequest | Send request to activate/deactivate priority charging | K21, K22 |
Incoming to CSMS (Charging Station → CSMS)
| Message | CSMS Action | Use Cases |
|---|---|---|
NotifyChargingLimitRequest | Receive and store external charging limits | K11 |
ClearedChargingLimitRequest | Receive and update cleared external limits | K12 |
NotifyEVChargingScheduleRequest | Receive and process EV charging schedule | K13 |
NotifyEVChargingNeedsRequest | Receive, compute profile, send back | K15, K16, K17 |
ReportChargingProfilesRequest | Receive and collect reported profiles | K09 |
Responses (CSMS sends back)
| Response Message | Content | Trigger |
|---|---|---|
SetChargingProfileResponse | Process Accepted/Rejected status | K01 response |
ClearChargingProfileResponse | Process Accepted/Unknown status | K10 response |
GetCompositeScheduleResponse | Process schedule data | K08 response |
GetChargingProfilesResponse | Process Accepted/NoProfiles status | K09 response |
UsePriorityChargingResponse | Process Accepted/Rejected/NoProfile status | K21/K22 response |
NotifyChargingLimitResponse | Send empty response | K11 response |
ClearedChargingLimitResponse | Send empty response | K12 response |
NotifyEVChargingScheduleResponse | Send Accepted/Rejected status | K13 response |
NotifyEVChargingNeedsResponse | Send Accepted/Rejected/Processing/NoChargingProfile | K15 response |
ReportChargingProfilesResponse | Send empty response | K09 report |