Heartbeat

Keeps the connection alive and returns the CSMS clock. Unchanged in substance from 1.6.

Version
OCPP 2.0.1
Direction
Charge Point → CSMS
Functional block
Availability

Heartbeat also exists in OCPP 1.6, with a different payload. See the OCPP 1.6 version.

The simplest message in 2.0.1, and essentially identical to its 1.6 counterpart: an empty request, and a response carrying the server's time.

The interval comes from BootNotification, and is afterwards a device model variable rather than a flat configuration key — HeartbeatInterval on the OCPPCommCtrlr component.

Request

No fields — the payload is an empty object {}.

json
[2, "19223201", "Heartbeat", {}]

Response

FieldTypeRequiredDescription
currentTimedateTimeRequiredThe CSMS's current time, in UTC.
json
[3, "19223201", {
  "currentTime": "2026-09-09T10:20:30Z"
}]

Implementation notes

Any other message resets the heartbeat timer — a station sending transaction data does not also need to send Heartbeat.

As in 1.6, this is not a NAT keepalive. WebSocket ping/pong at a shorter interval is what keeps carrier-grade NAT from dropping an idle connection.