MeterValues

Sends periodic or clock-aligned meter readings, either for a running transaction or for an idle connector.

Version
OCPP 1.6
Direction
Charge Point → CSMS
Feature profile
Core

MeterValues also exists in OCPP 2.0.1, with a different payload. See the OCPP 2.0.1 version.

MeterValues carries the actual measurements: energy, power, current, voltage, temperature, state of charge. Each sample is a timestamp plus a list of sampledValue entries, and each of those is a reading tagged with what it measures and in which unit.

The structure is deeply nested and the defaults are where the bugs live — every attribute of sampledValue is optional, and each has a default that is easy to assume wrongly.

Request

FieldTypeRequiredDescription
connectorIdintegerRequiredThe connector being measured. 0 refers to the charge point as a whole.
meterValueMeterValue[]RequiredOne or more timestamped sample groups.
transactionIdintegerOptionalPresent when the readings belong to a running transaction.
json
[2, "19223201", "MeterValues", {
  "connectorId": 1,
  "transactionId": 8814,
  "meterValue": [{
    "timestamp": "2026-09-09T10:32:00.000Z",
    "sampledValue": [
      { "value": "1206300", "measurand": "Energy.Active.Import.Register", "unit": "Wh", "context": "Sample.Periodic" },
      { "value": "7360",    "measurand": "Power.Active.Import",           "unit": "W"  },
      { "value": "32.0",    "measurand": "Current.Import", "phase": "L1",  "unit": "A"  }
    ]
  }]
}]

Response

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

json
[3, "19223201", {}]

Values

sampledValue defaults

ValueMeaning
measurandDefaults to Energy.Active.Import.Register when omitted.
contextDefaults to Sample.Periodic.
formatDefaults to Raw. The alternative is SignedData.
locationDefaults to Outlet.
unitDefaults to Wh. Not kWh — a reading in kWh with the unit omitted is out by a factor of 1000.

Implementation notes

`value` is a string, always. It is defined as text so that signed meter data and high-precision decimals survive transport. Parsing it as a number is fine; assuming the JSON type is a number is not.

The default unit is Wh. The most expensive MeterValues bug is a charger reporting kWh without setting unit, which a conformant CSMS reads as Wh.

Which measurands a charger sends is configuration, not spec: MeterValuesSampledData and MeterValuesAlignedData control it, and MeterValueSampleInterval controls the rate.

context distinguishes Transaction.Begin, Sample.Periodic, Sample.Clock and Transaction.End. Billing logic that ignores it will double-count the boundary samples.