Heartbeat
Keeps the connection alive and lets the charge point synchronise its clock with the CSMS.
- Version
- OCPP 1.6
- Direction
- Charge Point → CSMS
- Feature profile
- Core
Heartbeat also exists in OCPP 2.0.1, with a different payload. See the OCPP 2.0.1 version.
Heartbeat is the simplest message in OCPP: an empty request, and a response carrying nothing but the server's current time.
Its purpose is twofold — it proves the charge point is still reachable, and it gives the charger a clock reference. A charge point only needs to send it when nothing else has been sent within the heartbeat interval; any other message resets the timer.
Request
No fields — the payload is an empty object {}.
[2, "19223201", "Heartbeat", {}]Response
| Field | Type | Required | Description |
|---|---|---|---|
currentTime | dateTime | Required | The CSMS's current time, in UTC. |
[3, "19223201", {
"currentTime": "2026-09-09T10:20:30.000Z"
}]Implementation notes
The interval comes from the BootNotification response, and can be changed afterwards with ChangeConfiguration on the HeartbeatInterval key.
Heartbeat is not a keepalive for NAT. Carrier NAT and load balancers often time out idle TCP connections well inside a 300-second heartbeat. If connections drop silently in the field, WebSocket ping/pong at a shorter interval is the fix, not a shorter heartbeat.
A charger that sends Heartbeat on a fixed timer regardless of other traffic is wasteful but conformant.