MeterValues
Meter readings for a connector outside a transaction. In-transaction readings ride in TransactionEvent instead.
- Version
- OCPP 2.0.1
- Direction
- Charge Point → CSMS
- Functional block
- Meter Values
MeterValues also exists in OCPP 1.6, with a different payload. See the OCPP 1.6 version.
MeterValues survives in 2.0.1 but its role shrank considerably. Readings that belong to a running session now travel inside TransactionEvent; this message is for readings that do not — an idle EVSE, or a station-level meter.
The sample structure also changed: value is a decimal rather than a string, and unit moves into a nested unitOfMeasure object with an optional multiplier.
Request
| Field | Type | Required | Description |
|---|---|---|---|
evseId | integer | Required | The EVSE being measured. 0 refers to the station as a whole. |
meterValue | MeterValue[] | Required | One or more timestamped sample groups. |
[2, "19223201", "MeterValues", {
"evseId": 1,
"meterValue": [{
"timestamp": "2026-09-09T10:32:00Z",
"sampledValue": [{
"value": 1206300,
"measurand": "Energy.Active.Import.Register",
"context": "Sample.Periodic",
"unitOfMeasure": { "unit": "Wh" }
}]
}]
}]Response
No fields — the payload is an empty object {}.
[3, "19223201", {}]Implementation notes
`value` is a number now, not a string. This is the opposite of 1.6, where it was defined as text. Code ported directly from a 1.6 implementation will be parsing a type that is no longer there.
`unit` moved. It is unitOfMeasure.unit in 2.0.1, and unitOfMeasure.multiplier applies a power of ten. The default is still Wh.
If you are looking for in-session meter data, it is in TransactionEvent's meterValue field, not here.