Weekly gas use from a pulse-counting ESP32 on our Landis+Gyr meter, mailed to finance every Monday
Plant manager, automotive paint shop. Finance wants a weekly gas figure for the paint ovens every Monday at 7, and right now someone reads the meter by hand on Sunday night. Not great.
The meter is a Landis+Gyr diaphragm meter with a reed pulse output, 1 pulse = 0.01 m³. One of our maintenance guys put an ESP32 on it that counts pulses on an interrupt and publishes the running total once a minute:
{"gas_m3": 18234.57}
That’s been in Hermetry for a month and the chart looks right. I assumed there’d be a scheduled report somewhere that mails a weekly total, but I’ve clicked through everything and can’t find one. What do people do for this? I’d rather not have a person export a CSV every Monday, that’s the thing I’m trying to get rid of.
I’d like to know too, same thing for our buildings’ gas meters.
Is the pulse total kept over a power cut? If the ESP32 starts from zero after an outage your weekly totals go wrong.
It’s stored in FRAM, survives power cuts. It only goes back to zero when we flash new firmware.
I thought there was a “send report” option on dashboards?
I don’t think so. The Exporting data page says there are no built-in scheduled or e-mailed reports. Cards have a CSV and Excel download, but that’s someone clicking.
Banerjee’s right, there’s no mailed report. We do this for about 20 energy meters with a small script on our own server, built on the history API. It’s half a day of work and has run untouched for a year.
Ask for the increase aggregate. For a counter like gas_m3 it gives you how much it rose per bucket, and it handles a counter restart (your firmware flash) by counting from zero instead of going negative.
import requests, time, smtplib
from email.message import EmailMessage
BASE = "https://<host>/tenant/<tenantId>"
KEY = "sk_live_..." # Read-only telemetry key, IP allowlist = this server
now = int(time.time() * 1000)
week_ago = now - 7 * 24 * 3600 * 1000
r = requests.get(BASE + "/api/telemetry/series", headers={"Authorization": "Bearer " + KEY},
params={"kind": "iot_device", "entityId": "<meter device id>", "keys": "gas_m3",
"from": week_ago, "to": now, "bucket": "1h", "agg": "increase"}, timeout=30)
r.raise_for_status()
# sum the hourly increases and mail the total to finance
Run it from cron at 07:00 on Mondays. A few things we learned:
- Day buckets are UTC days. If finance wants local days, ask for 1h and add them up yourself.
- Give the API key the Read-only preset and an IP allowlist with just that server. Keys expire after 90 days by default, so set a reminder or a longer expiry (max a year).
- At most 50 keys and 10,000 points per key per request, which is nothing for a weekly hourly read.
If you’d rather not run a server, a flow with a Schedule trigger and an HTTP request block can poke your own reporting service to build and send it. We went with the script.
Exporting data lists both options.
Running since last week on the reporting box that already does our shift reports. First Monday the figure was off a little because I used 1d buckets and we’d just moved to summer time, switched to 1h buckets and it matches the manual reading to 0.1 m³. Finance is happy, and nobody reads the meter on Sunday night anymore.
Same pattern works for water meters. increase saved us when a meter was swapped mid-month and the new one started at 0.
- You must be logged in to reply to this topic.
Join the conversation
Sign in to ask and answer, like helpful posts and mark the reply that solved your problem. Every contribution earns points and levels.

