A utility meter reader on AWS for a few dollars a month
The electricity bill jumps forty per cent in March and somebody spends a fortnight looking for what changed. Nothing changed in March. The previous four bills were estimates and this one was a real reading, so March is carrying the difference for four months of under-estimation. This post walks through a small system that would have said so in a sentence.

Key takeaways
- Estimated readings must be marked and never compared against actual ones.
- Overnight baseload is the most useful single number and the cheapest to reduce.
- Gas consumption has to be weather-normalised before any comparison means anything.
- A saving is not real until it has been verified against the meter.
- Designed on AWS for about $2 a month.
The whole system on one page
Before any code, here is the shape of what we are designing.
- Compute
- Database
- Management
- Analytics
- People
Two adjustments, or nothing works
The first is estimates. A bill labelled as an estimate is a guess by the supplier based on history, and the moment a real reading arrives the difference lands in one period. Comparing periods without knowing which were estimated produces spikes and troughs that correspond to nothing that happened in the building.
The second is time and weather. February has fewer days than January, and last January may have been three degrees colder than this one. Comparing raw totals across periods measures the calendar and the weather considerably more than it measures the building.
What runs (the inside)
- The collector. Takes readings from whatever source exists and records whether each is actual or estimated. Part 2.
- The normaliser. Adjusts for days in the period and, for gas, for how cold it was. Part 4.
- The findings. Baseload, drift, and whether a change actually saved anything. Parts 3 and 5.
One finding, end to end
- Compute
- Machine learning
- Management
- Analytics
In plain words
Half-hourly electricity data shows the site drawing eighteen kilowatts at three in the morning, every night, including weekends and the Christmas shutdown. Somebody who knows the building says it should be about four: refrigeration, a couple of servers, emergency lighting.
Fourteen kilowatts of unexplained overnight draw is roughly a hundred and twenty thousand kilowatt-hours a year, which is a substantial bill. Tracing it takes an afternoon with a clamp meter and finds an air compressor whose timer was set to twenty-four hours during a maintenance visit in 2022 and never set back.
The timer is changed, and the crucial step is the last one: two weeks later the overnight baseload is measured again and is five kilowatts. The saving is verified against the meter rather than calculated from a specification, which is the difference between a real saving and one that exists in a spreadsheet.
Design rules that shaped every decision
- Mark every value as actual or estimated, and never compare across the two.
- Normalise for days in the period, always, and for weather where it applies.
- Baseload is measured over a window of nights, not from one night.
- A saving is unverified until the meter shows it.
- Never act on the building automatically. Produce findings.
- Say which meter and which period every number came from.
Why this shape
Energy management at small scale suffers from a specific problem: the data is available and nobody has time to look at it, so the analysis happens once, in a burst, when a bill is alarming. That is exactly the wrong moment, because the alarming bill is usually a billing artefact and the real waste is a steady drip nobody has ever noticed.
So the design does the small number of things that reliably find money — baseload, weather-normalised comparison, verification — on a schedule, and stays quiet the rest of the time. There is no dashboard, because a dashboard is a thing nobody opens.
The next four posts walk through each piece: how a reading becomes a usable number, what the overnight baseload tells you, why gas needs the weather, and how a finding becomes a verified saving. One diagram per post, a cost breakdown, and an engineering reference at the end.
All posts