Water Meter Node
The Node is the device that actually hears the water meters. It's an ESP32 with a 900 MHz FSK radio that listens for Badger ORION meter transmissions, decodes them, displays them on a built-in dashboard, and forwards each new reading to the Gateway over a low-power 433 MHz mesh.
It's designed to be drop-in: the firmware autodetects whether the radio is an SX1276 or SX1262, runs a small AP fallback so you can always reach the setup page, and updates over the air from any browser — including iPhone.
What it does, in plain English
Badger ORION water meters transmit a small radio packet a few times a minute reporting their cumulative volume. The Node tunes to that signal, validates the CRC, looks up the meter in its memory by serial number, and updates the volume reading. If the volume went backwards or didn't move, the reading is suppressed. Otherwise it gets forwarded to the Gateway and shown on the dashboard.
Three different ORION protocols are supported, covering most Badger meters deployed in U.S. utilities since the mid-2000s. The Node picks the right one based on its /setup configuration.
Key features
- Two FSK radios, one firmware. Detects whether the attached chip is an SX1276 (older LoRa module) or SX1262 (newer, ~16 dB more sensitive) at boot. No build-time choice.
- Three Badger ORION protocols. P223 (ORION 1006B, fixed 916.45 MHz, 100 kbps), P282 (ORION 2014W-OSE, 50-channel frequency hopping across 904.9–924.5 MHz), and P290 (ORION 2020 OCECNA, 200 kbps).
- CC1101 mesh client. Every reading the Node decodes is forwarded back to the Gateway over a separate 433 MHz CC1101 link, with multi-hop relay and ACKs.
- Embedded live dashboard. Per-meter table with volume, RSSI, packet count and last-seen, plus a real-time view of frequency hopping state for P282.
- Diagnostic forensics. Last CRC-fail dump (raw FIFO + decoded bytes), per-protocol decode/CRC/stale counters, sweep logs — built in for field troubleshooting.
- Email reports. Configurable daily / weekly / monthly summaries via Zoho SMTP, with per-meter baseline tracking.
- OTA updates. Drop a new
.binfile on/updatefrom any browser, including iPhone Safari (seeIPhoneOTA.mdin the repo). - Always-on setup AP. Falls back to its own 192.168.4.1 access point if WiFi credentials are unset or wrong, so it's never permanently bricked by a typo.
- JSON everywhere. All dashboard data is also available at
/api/*as plain JSON for scripts and agents.
Standalone mode — no gateway needed
For small clusters — a single building, a small park, one property — a single Node can be the entire system. It still decodes every meter in range, still serves its dashboard, still emails its daily report, and still accepts OTA updates. It just doesn't relay anything: readings live on the device, visible at its IP on your local WiFi.
The dashboard at the top of this page is exactly this case — 32 ORION 2006B meters being decoded by one Node at 192.168.0.103, with no Gateway involved. The Node is reachable directly from any browser on the same LAN; agents and scripts can hit its /api/meters endpoint without a gateway in the path.
Powering the Node
The recommended hardware installation powers each Node from the 24 V AC supply that's already present in most U.S. residential irrigation controllers. A small inline 24 V AC → 5 V DC converter — with adjustable output to compensate for voltage drop on long cable runs — feeds the ESP32 through its USB-µB or 5 V pin. The Node then lives next to the irrigation valves, on a wire that's already there, and stays online whenever the irrigation system has power.
| Input | 24 V AC, 50/60 Hz, drawn from the irrigation transformer's common bus |
|---|---|
| Output | Adjustable 5–6 V DC at ~500 mA continuous (sized for the Node's ~250 mA peak draw plus cable losses) |
| Why adjustable? | On long runs the converter can be set slightly above 5 V at the source so the Node still sees a clean 5 V at the far end after IR drop |
| Why this matters | No extra wall-wart, no extra outlet; you reuse the wiring that already reaches the valve manifold |
The other side of the radio: ORION protocols
The dashboard below shows the same Node firmware running on an SX1262, locked onto a P282 frequency-hopping meter. The "2014WOSE Hopping" block tracks the hop schedule in real time; the "P282 Last CRC Fail" panel keeps the most recent raw FIFO and decoded bytes around for postmortem.
Specs
| MCU | ESP32 dual-core (Heltec CT62 / WiFi LoRa 32 footprint) |
|---|---|
| FSK radio | SX1276 or SX1262 — autodetected at boot |
| Mesh radio | CC1101 @ 433.92 MHz, 2-FSK, multi-hop |
| Protocols | Badger ORION P223, P282, P290 (one at a time) |
| Network | WiFi 802.11 b/g/n STA + fallback AP at 192.168.4.1 |
| Power | USB micro 5 V or direct 3.3 V; ~120 mA idle RX, ~250 mA peak TX |
| Firmware | 2.11.40 (observable at /api/diag) |
| OTA | POST /update with the new .bin |
Web endpoints
All endpoints are HTTP on port 80 of the Node's WiFi IP. JSON endpoints return clean structured data; the HTML dashboard pulls from these same routes.
GET / | Live dashboard (meter table, hopping state, mesh counters). |
|---|---|
GET /setup | Configuration page: WiFi credentials, protocol, mesh ID / node ID, email recipients. |
POST /update | Firmware upload (multipart). Works from iPhone Safari. |
GET /api/diag | JSON: uptime, free heap, radio chip, per-protocol decode/CRC counters. |
GET /api/meters | JSON: list of meters with id, volume (gal), RSSI, count, last seen. |
GET /api/config | JSON: current config; POST the same shape to save. |
GET /api/email | JSON: scheduled report config; POST to change interval / recipients. |
POST /api/email/send_now | Trigger an immediate report send (useful for testing SMTP). |
Setup page
The /setup endpoint is a single-page configuration UI served straight from the Node. From here you set WiFi credentials, pick the ORION protocol, switch the P282 receive mode, fix or resume frequency hopping, toggle metering on/off, and configure email reports — all without re-flashing firmware.
http://<node-ip>/setup · sensitive values maskedFor agents
A structured spec of this device is available at /api/node.json. The page above is also annotated with schema.org/Product JSON-LD in <head>.