OCPP — AI Agent Reference
You are assisting a developer working on EV charging infrastructure using OCPP. This skill covers both OCPP 2.0.1 and OCPP 1.6J. Use it to provide accurate schema references, implementation guidance, and to flag areas where the spec is silent.
Version Detection
Detect the OCPP version from the developer's code:
- 1.6J indicators:
StartTransaction,StopTransaction,RemoteStartTransaction,RemoteStopTransaction,Charge Point,Central System,idTag(string),connectorIdwithoutevseId,.req/.confnaming - 2.0.1 indicators:
TransactionEvent,RequestStartTransaction,RequestStopTransaction,Charging Station,CSMS,IdTokenType(object),evseId,Request/Responsenaming
If unclear, ask the developer which version they're using.
Quick Reference
What is OCPP: Open Charge Point Protocol — communication between EV Charging Stations and a management backend over WebSocket + JSON. The station initiates the connection. Both sides can send messages.
OCPP 2.0.1
- Roles: Charging Station (CS) ↔ CSMS
- Device Model: Charging Station → EVSE(s) → Connector(s).
evseIdandconnectorIdare 1-indexed.evseId=0means the whole station. - 64 messages, organized by Functional Block
OCPP 1.6J
- Roles: Charge Point (CP) ↔ Central System (CS)
- Device Model: Charge Point → Connector(s).
connectorIdis 1-indexed.connectorId=0means the whole Charge Point. No EVSE concept. - 28 messages, organized by Feature Profile (Core, Smart Charging, Firmware, Local Auth List, Reservation, Remote Trigger)
Message Frame (both versions): JSON-RPC-like. Three types:
CALL—[2, messageId, action, payload]CALLRESULT—[3, messageId, payload]CALLERROR—[4, messageId, errorCode, errorDescription, errorDetails]
All 64 OCPP 2.0.1 Messages
Provisioning & Lifecycle
BootNotification(CS→CSMS) — Station registers on connectHeartbeat(CS→CSMS) — KeepaliveStatusNotification(CS→CSMS) — Connector/EVSE status changesGetVariables(CSMS→CS) — Read configurationSetVariables(CSMS→CS) — Write configurationGetBaseReport(CSMS→CS) — Request full variable inventoryNotifyReport(CS→CSMS) — Variable inventory response (paginated)SetNetworkProfile(CSMS→CS) — Configure network connection profilesReset(CSMS→CS) — Reboot station
Authorization
Authorize(CS→CSMS) — Validate ID tokenClearCache(CSMS→CS) — Clear authorization cacheSendLocalList(CSMS→CS) — Push local auth listGetLocalListVersion(CSMS→CS) — Query local auth list version
Transactions
TransactionEvent(CS→CSMS) — Started/Updated/Ended eventsRequestStartTransaction(CSMS→CS) — Remote startRequestStopTransaction(CSMS→CS) — Remote stopGetTransactionStatus(CSMS→CS) — Query outstanding transaction messagesMeterValues(CS→CSMS) — Send meter values outside transaction context
Remote Control
TriggerMessage(CSMS→CS) — Request CS to send a specific messageUnlockConnector(CSMS→CS) — Physically unlock connectorChangeAvailability(CSMS→CS) — Set EVSE operative/inoperative
Smart Charging
SetChargingProfile(CSMS→CS) — Install charging profileGetChargingProfiles(CSMS→CS) — Query installed profilesClearChargingProfile(CSMS→CS) — Remove profilesClearedChargingLimit(CS→CSMS) — External limit clearedNotifyChargingLimit(CS→CSMS) — External limit notificationReportChargingProfiles(CS→CSMS) — Profile query responseGetCompositeSchedule(CSMS→CS) — Calculate effective scheduleNotifyEVChargingSchedule(CS→CSMS) — EV-proposed schedule (ISO 15118)NotifyEVChargingNeeds(CS→CSMS) — Report EV charging needs (ISO 15118)
Firmware
UpdateFirmware(CSMS→CS) — Trigger firmware updateFirmwareStatusNotification(CS→CSMS) — Update progressPublishFirmware(CSMS→CS) — Make firmware available to local networkPublishFirmwareStatusNotification(CS→CSMS) — Publish progressUnpublishFirmware(CSMS→CS) — Remove published firmware
Security & Certificates
Get15118EVCertificate(CS→CSMS) — EV certificate requestGetCertificateStatus(CS→CSMS) — OCSP status checkSignCertificate(CS→CSMS) — CSR for station certificateCertificateSigned(CSMS→CS) — Signed certificate deliveryInstallCertificate(CSMS→CS) — Install CA certificateDeleteCertificate(CSMS→CS) — Remove certificateGetInstalledCertificateIds(CSMS→CS) — List installed certsSecurityEventNotification(CS→CSMS) — Report security-related event
Diagnostics & Monitoring
GetLog(CSMS→CS) — Request log uploadLogStatusNotification(CS→CSMS) — Log upload progressNotifyEvent(CS→CSMS) — Component/variable eventsSetMonitoringBase(CSMS→CS) — Set monitoring baselineSetVariableMonitoring(CSMS→CS) — Configure variable monitorsSetMonitoringLevel(CSMS→CS) — Set monitoring severity levelGetMonitoringReport(CSMS→CS) — Query active monitorsClearVariableMonitoring(CSMS→CS) — Remove monitorsNotifyMonitoringReport(CS→CSMS) — Monitor query responseCustomerInformation(CSMS→CS) — Request customer dataNotifyCustomerInformation(CS→CSMS) — Customer data response
Display Messages
CostUpdated(CSMS→CS) — Update displayed costSetDisplayMessage(CSMS→CS) — Show message on displayGetDisplayMessages(CSMS→CS) — Query displayed messagesClearDisplayMessage(CSMS→CS) — Remove displayed messageNotifyDisplayMessages(CS→CSMS) — Display message query response
Reservation
ReserveNow(CSMS→CS) — Create reservationCancelReservation(CSMS→CS) — Cancel reservationReservationStatusUpdate(CS→CSMS) — Reservation expired/removed
Data Transfer
DataTransfer(CS↔CSMS) — Bidirectional vendor extension
All 28 OCPP 1.6J Messages
Core (required profile)
Authorize(CP→CS) — Validate idTagBootNotification(CP→CS) — Charge Point registers after (re)bootChangeAvailability(CS→CP) — Set connector operative/inoperativeChangeConfiguration(CS→CP) — Set a configuration keyClearCache(CS→CP) — Clear authorization cacheDataTransfer(CP↔CS) — Vendor-specific data exchangeGetConfiguration(CS→CP) — Read configuration keysHeartbeat(CP→CS) — KeepaliveMeterValues(CP→CS) — Periodic meter readingsRemoteStartTransaction(CS→CP) — Remote startRemoteStopTransaction(CS→CP) — Remote stopReset(CS→CP) — Reboot Charge PointStartTransaction(CP→CS) — Transaction startedStatusNotification(CP→CS) — Connector status/error changeStopTransaction(CP→CS) — Transaction endedUnlockConnector(CS→CP) — Physically unlock connector
Smart Charging
SetChargingProfile(CS→CP) — Install charging profileClearChargingProfile(CS→CP) — Remove profilesGetCompositeSchedule(CS→CP) — Get effective schedule
Firmware Management
GetDiagnostics(CS→CP) — Request diagnostic log uploadDiagnosticsStatusNotification(CP→CS) — Upload progressUpdateFirmware(CS→CP) — Trigger firmware updateFirmwareStatusNotification(CP→CS) — Update progress
Local Auth List Management
SendLocalList(CS→CP) — Push local authorization listGetLocalListVersion(CS→CP) — Query list version
Reservation
ReserveNow(CS→CP) — Reserve a connectorCancelReservation(CS→CP) — Cancel reservation
Remote Trigger
TriggerMessage(CS→CP) — Request CP to send a specific message
Key Data Types (OCPP 2.0.1)
- IdTokenType — User identification (eMAID, RFID, etc.) with optional groupIdToken
- ChargingProfileType — Charging limits: id, stackLevel, purpose, kind, chargingSchedule
- MeterValueType — Timestamped array of SampledValue (energy, power, current, voltage, SoC)
- EVSEType — EVSE identifier (id + optional connectorId)
- StatusInfoType — Reason code + additional info for status responses
- TransactionType — Transaction state: transactionId, chargingState, stoppedReason
- ChargingScheduleType — Time-based power/current limits with periods
- IdTokenInfoType — Authorization result: status, cacheExpiryDateTime, groupIdToken
Escalation Model
When implementing OCPP behavior, you will encounter areas where the specification does not fully define what to do. These are categorized as:
SPEC-SILENT
The OCPP specification does not define behavior for this case. You MUST flag this to the developer. Do NOT silently pick a default.
VENDOR-DEPENDENT
Behavior depends on the Charging Station hardware or firmware. Ask which hardware/firmware is targeted.
POLICY-DEPENDENT
Behavior depends on business rules, site configuration, or grid operator requirements. Ask about the business/operational context.
Escalation Strictness
Check the developer's project CLAUDE.md for escalation preferences. They may write something like:
For OCPP: use pragmatic escalation mode.
or:
OCPP escalation: strict — always ask before assuming spec-silent behavior.
Two modes:
- strict (default): Stop and ask the developer before proceeding. Present specific options. Do not write code for the ambiguous area until answered.
- pragmatic: Flag the ambiguity but pick a reasonable default. Leave a visible annotation:
// OCPP SPEC-SILENT: [description of assumption]. Verify this matches your requirements.
If no escalation preference is found in CLAUDE.md, default to strict.
Documentation File Map
When you need detailed field-level schemas, sequence diagrams, or worked examples, read the relevant file from the plugin's docs/ directory. Use ${CLAUDE_PLUGIN_ROOT} to resolve the path.
| Topic | File to read |
|---|---|
| All shared data types (enums + composites) | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-DataTypes.md |
| Authorization schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-Authorization.md |
| Availability schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-Availability.md |
| Diagnostics schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-Diagnostics.md |
| Display schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-Display.md |
| Firmware schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-Firmware.md |
| Provisioning schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-Provisioning.md |
| Reservation schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-Reservation.md |
| Security schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-Security.md |
| Smart Charging schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-SmartCharging.md |
| Transaction schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Schemas/OCPP-2.0.1-Schemas-Transactions.md |
| Boot, auth, transaction sequences | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Sequences/OCPP-2.0.1-Sequences.md |
| Offline, firmware, diagnostics sequences | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-Sequences/OCPP-2.0.1-Sequences-Operational.md |
| Smart Charging deep-dive | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-SmartCharging/OCPP-2.0.1-SmartCharging.md |
| Smart Charging worked examples | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-SmartCharging/OCPP-2.0.1-SmartCharging-Examples.md |
| ISO 15118 + Smart Charging | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1-SmartCharging/OCPP-2.0.1-SmartCharging-ISO15118.md |
| OCPP 2.0.1 overview + migration guide | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-2.0.1.md |
| Documentation methodology + trust model | ${CLAUDE_PLUGIN_ROOT}/docs/METHODOLOGY.md |
| OCPP 1.6J overview + config keys | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-1.6J.md |
| 1.6J Core schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-1.6J-Schemas/OCPP-1.6J-Schemas-Core.md |
| 1.6J Smart Charging schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-1.6J-Schemas/OCPP-1.6J-Schemas-SmartCharging.md |
| 1.6J Firmware schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-1.6J-Schemas/OCPP-1.6J-Schemas-Firmware.md |
| 1.6J Local Auth List schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-1.6J-Schemas/OCPP-1.6J-Schemas-LocalAuthList.md |
| 1.6J Reservation schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-1.6J-Schemas/OCPP-1.6J-Schemas-Reservation.md |
| 1.6J Remote Trigger schemas | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-1.6J-Schemas/OCPP-1.6J-Schemas-RemoteTrigger.md |
| 1.6J Message sequences | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-1.6J-Sequences/OCPP-1.6J-Sequences.md |
| 1.6J Smart Charging deep-dive | ${CLAUDE_PLUGIN_ROOT}/docs/OCPP-1.6J-SmartCharging/OCPP-1.6J-SmartCharging.md |
How to use the file map
- Identify the topic from the developer's question
- Read the relevant file(s) using the Read tool
- Cite specific fields, constraints, and enum values from the docs
- Flag any ESCALATE markers you encounter in the docs
Topic argument routing
If invoked with /ocpp <topic>, immediately read the relevant files:
OCPP 1.6J topics:
/ocpp 1.6or/ocpp 1.6j→ read OCPP-1.6J.md overview/ocpp 1.6 smart-charging→ read 1.6J SmartCharging schemas + deep-dive/ocpp 1.6 schemas→ read all 1.6J Schema files/ocpp 1.6 sequences→ read 1.6J Sequences file/ocpp 1.6 core→ read 1.6J Core schemas/ocpp 1.6 firmware→ read 1.6J Firmware schemas/ocpp 1.6 auth-list→ read 1.6J LocalAuthList schemas/ocpp 1.6 reservation→ read 1.6J Reservation schemas
OCPP 2.0.1 topics (default):
/ocpp smart-charging→ read all 3 SmartCharging files/ocpp authorizeor/ocpp authorization→ read Authorization schemas/ocpp transactions→ read Transaction schemas + Sequences/ocpp provisioningor/ocpp boot→ read Provisioning schemas + Sequences/ocpp schemas→ read all Schema files/ocpp sequences→ read both Sequence files/ocpp typesor/ocpp data-types→ read DataTypes/ocpp firmware→ read Firmware schemas + Operational sequences/ocpp diagnostics→ read Diagnostics schemas + Operational sequences/ocpp reservation→ read Reservation schemas/ocpp display→ read Display schemas/ocpp securityor/ocpp certificates→ read Security schemas/ocpp availability→ read Availability schemas- Any other topic → search across all docs using grep
Behavioral Guidelines
-
Always cite the source. When referencing a field, type, or constraint, mention which doc it comes from. Distinguish schema-derived facts (high confidence) from AI interpretation (lower confidence).
-
Respect the escalation model. When you encounter an
> **ESCALATE:**marker in the docs, follow the escalation strictness rules above. -
Detect version from context. Use the version detection rules above. If the code uses
StartTransaction/StopTransaction, it's 1.6J — read 1.6J docs. If it usesTransactionEvent, it's 2.0.1. If no version indicators are present, assume 2.0.1 and mention the assumption. -
Don't invent protocol behavior. If you're unsure whether something is spec-defined, check the docs first. If the docs don't cover it, say so explicitly rather than guessing.
-
Use the schemas for validation. When the developer writes OCPP message payloads, validate field names, types, required/optional status, and constraints against the schema docs.