zevOS

01Technology

Meter values: the numbers your invoices are made of

Every billing dispute resolves to what the meter said and when. What to sample, what to store and the rounding rule that prevents drift.

ENzevOS Engineering · Platform engineering
16 December 2025 · 2 min read

A charging invoice is one subtraction: meter at stop minus meter at start. Everything else is presentation. Which is why it is remarkable how many platforms compute the amount from something else — elapsed time multiplied by reported power, or a running total accumulated in application memory — and then cannot explain a disputed bill.

Store the readings, not the total

The session record should carry the actual meterStart and meterStop values as the charger reported them, permanently, alongside the derived energy. When a driver disputes a session eight months later, those two numbers are the evidence. A stored total is an assertion.

Keep the intermediate MeterValues too. They are what tells you the shape of the session — whether the vehicle tapered, whether the charger derated, whether there was a gap in the middle where nothing was delivered.

What to sample, and how often

MeasurandWhyInterval
Energy.Active.Import.RegisterThe billing number — non-negotiableEvery 60s
Power.Active.ImportDerating and taper detectionEvery 60s
SoCDriver experience, taper explanationWhere the vehicle reports it
Current and voltageDiagnosing poor deliveryEvery 60s where cheap to carry
TemperatureThermal deratingWhere available

Sixty seconds is a reasonable default. Shorter intervals multiply storage across a network without improving the invoice, since the invoice depends only on the endpoints. Longer intervals lose the diagnostic value.

The rounding rule

Round once, at the end. Compute the energy delta at full precision, apply the rate at full precision, then round the final amount to two decimals. Rounding at each intermediate step introduces drift that is small per session, systematic across a network, and impossible to explain to a site partner reconciling a settlement.

Missing and impossible values

Chargers send readings that go backwards, jump implausibly, or stop arriving mid-session. Each needs a defined handling rather than an exception in a log:

  • A decreasing register almost always means the meter reset. Treat the session as unbillable and flag it rather than computing a negative.
  • A delta larger than the connector could physically have delivered in the elapsed time is impossible. Cap it, flag it, and do not bill it silently.
  • No meterStop — the charger disconnected before reporting — means falling back to the last MeterValues reading, and recording that you did.
  • Every one of these should reach a queue. A session that cannot be billed correctly is a defect, and defects that only exist in logs are defects nobody fixes.

The test

Pick a completed session at random and reconstruct the invoice from stored values alone — meter start, meter stop, the tariff snapshot, the tax rule. If you can do that without querying anything else, the billing is trustworthy. If you cannot, it is trustworthy only until somebody checks.

billingOCPPaccuracy

Get the next one by email

One email a month. Operations notes, unit economics and policy changes that affect your tariff.