skills/ocpp/SKILL.md
OCPP protocol reference for EV charging infrastructure development. Covers OCPP 2.0.1 and OCPP 1.6J. Use when working with OCPP messages, charging station code, CSMS/Central System backends, smart charging, transaction handling, or EV charging protocols. Activates on keywords: OCPP, charging station, charge point, CSMS, Central System, EVSE, charging profile, BootNotification, TransactionEvent, StartTransaction, StopTransaction, SetChargingProfile, or any OCPP message name.
npx skillsauth add alexeimoisseev/ocpp.md ocppInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
Detect the OCPP version from the developer's code:
StartTransaction, StopTransaction, RemoteStartTransaction, RemoteStopTransaction, Charge Point, Central System, idTag (string), connectorId without evseId, .req / .conf namingTransactionEvent, RequestStartTransaction, RequestStopTransaction, Charging Station, CSMS, IdTokenType (object), evseId, Request / Response namingIf unclear, ask the developer which version they're using.
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.
evseId and connectorId are 1-indexed. evseId=0 means the whole station.connectorId is 1-indexed. connectorId=0 means the whole Charge Point. No EVSE concept.Message Frame (both versions): JSON-RPC-like. Three types:
CALL — [2, messageId, action, payload]CALLRESULT — [3, messageId, payload]CALLERROR — [4, messageId, errorCode, errorDescription, errorDetails]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 stationAuthorize (CS→CSMS) — Validate ID tokenClearCache (CSMS→CS) — Clear authorization cacheSendLocalList (CSMS→CS) — Push local auth listGetLocalListVersion (CSMS→CS) — Query local auth list versionTransactionEvent (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 contextTriggerMessage (CSMS→CS) — Request CS to send a specific messageUnlockConnector (CSMS→CS) — Physically unlock connectorChangeAvailability (CSMS→CS) — Set EVSE operative/inoperativeSetChargingProfile (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)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 firmwareGet15118EVCertificate (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 eventGetLog (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 responseCostUpdated (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 responseReserveNow (CSMS→CS) — Create reservationCancelReservation (CSMS→CS) — Cancel reservationReservationStatusUpdate (CS→CSMS) — Reservation expired/removedDataTransfer (CS↔CSMS) — Bidirectional vendor extensionAuthorize (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 connectorSetChargingProfile (CS→CP) — Install charging profileClearChargingProfile (CS→CP) — Remove profilesGetCompositeSchedule (CS→CP) — Get effective scheduleGetDiagnostics (CS→CP) — Request diagnostic log uploadDiagnosticsStatusNotification (CP→CS) — Upload progressUpdateFirmware (CS→CP) — Trigger firmware updateFirmwareStatusNotification (CP→CS) — Update progressSendLocalList (CS→CP) — Push local authorization listGetLocalListVersion (CS→CP) — Query list versionReserveNow (CS→CP) — Reserve a connectorCancelReservation (CS→CP) — Cancel reservationTriggerMessage (CS→CP) — Request CP to send a specific messageWhen implementing OCPP behavior, you will encounter areas where the specification does not fully define what to do. These are categorized as:
The OCPP specification does not define behavior for this case. You MUST flag this to the developer. Do NOT silently pick a default.
Behavior depends on the Charging Station hardware or firmware. Ask which hardware/firmware is targeted.
Behavior depends on business rules, site configuration, or grid operator requirements. Ask about the business/operational context.
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:
// OCPP SPEC-SILENT: [description of assumption]. Verify this matches your requirements.
If no escalation preference is found in CLAUDE.md, default to strict.
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 |
If invoked with /ocpp <topic>, immediately read the relevant files:
OCPP 1.6J topics:
/ocpp 1.6 or /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 schemasOCPP 2.0.1 topics (default):
/ocpp smart-charging → read all 3 SmartCharging files/ocpp authorize or /ocpp authorization → read Authorization schemas/ocpp transactions → read Transaction schemas + Sequences/ocpp provisioning or /ocpp boot → read Provisioning schemas + Sequences/ocpp schemas → read all Schema files/ocpp sequences → read both Sequence files/ocpp types or /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 security or /ocpp certificates → read Security schemas/ocpp availability → read Availability schemasAlways 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 uses TransactionEvent, 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.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.
development
End-to-end Parallels smoke, upgrade, and rerun workflow for OpenClaw across macOS, Windows, and Linux guests. Use when Codex needs to run, rerun, debug, or interpret VM-based install, onboarding, gateway smoke tests, latest-release-to-main upgrade checks, fresh snapshot retests, or optional Discord roundtrip verification under Parallels.