Your water meter already talks. AquaBridge listens.
A ~10 € receiver that picks up the encrypted radio telegrams of your wireless M-Bus water meter,
decrypts them locally and hands clean sensors to Home Assistant. No cloud, no gateway, no subscription.
ESP32 + CC1101 · ESPHome · tested on a Diehl Hydrus 2.0 (Type 173) · works with most wM-Bus meters that wmbusmeters knows
Quick start · Parts · Wiring · Flashing · Home Assistant · Troubleshooting · How it works · Deutsch · Support
A lot of water meters installed in the last years have a radio inside. Twice a minute they shout their reading into the air on 868 MHz so the utility can collect it once a year by driving past the house. The telegram is encrypted, but the key belongs to your meter, and most utilities hand it out if you ask nicely.
With that key and about 10 € of hardware you get your own water consumption in Home Assistant: every litre, every hour, every day. You see when the toilet keeps running, you get a push when a pipe bursts, and the Energy dashboard finally shows water next to electricity.
I built this for the Diehl Hydrus in my basement. It took one evening and a few surprises, all of which are written down here so it takes you less.
| 💧 Meter reading | the register of the meter, 1 litre resolution, updated every ~20 seconds |
| 📈 Consumption | today / this month / this year, plus long-term statistics and the Energy dashboard |
| 🚿 Flow | litres per minute, derived from the register (the meter does not send it) |
| 🌡️ Water temperature | measured inside the meter, handy as a frost warning |
| 🔋 Battery life | remaining years reported by the meter |
| 📅 Billing date | reading at the last billing date and usage since then |
| 🚨 Leak alarm | burst pipe, water running for hours, usage all night, frost. Push to your phone |
| 📡 Watchdog | push when the receiver is offline or the meter goes silent |
| 🔐 Local & encrypted | AES decryption on the ESP32, encrypted API to Home Assistant, nothing leaves your network |
You need three things:
- A wireless M-Bus meter on 868 MHz sending in mode T1 or C1. Most European water meters do. Look for "wM-Bus", "OMS", "868 MHz" or a little radio symbol on the display.
- A driver in wmbusmeters. The ESPHome component uses its drivers: Diehl Hydrus / IZAR, Kamstrup Multical 21, Apator, Itron, Sensus, Zenner, Techem and many more.
- The AES key if the telegrams are encrypted (almost always). See docs/03-aes-key.md, including a letter template for your utility.
| Tested | Result |
|---|---|
| Diehl Hydrus 2.0, Type 173, version 0x76, T1, AES mode 7 | ✅ every telegram decoded, total / billing date / temperature / battery |
If you get it running with another meter, open an issue or a PR and I'll add it to the table.
| Part | What I bought | Price (Nov 2026) |
|---|---|---|
| ESP32 board | diymore ESP32 NodeMCU, USB-C, CH340, pack of 2 | 11.98 € |
| 868 MHz radio | CC1101 868 MHz wireless transceiver, pack of 2 | 6.99 € |
| Case (optional) | ESP32 + CC1101 Case (USB-C Devkit) by danoman, CC0 | ~1 € filament |
| Power | any decent USB charger 5 V / ≥ 1 A and a short cable | – |
Why exactly these parts, what to watch out for and alternatives: docs/01-hardware.md.
Important
Buy the 868 MHz version of the CC1101. The 433 MHz modules look identical but are tuned for the wrong band and will hear almost nothing.
1. Get the AES key of your meter from the utility -> docs/03-aes-key.md
2. Wire the CC1101 to the ESP32 (8 wires, 3.3 V!) -> docs/02-wiring.md
3. Install ESPHome: pipx install esphome
4. Clone this repo: git clone https://github.com/Secoolioo/AquaBridge.git
5. cd AquaBridge/esphome && cp secrets.example.yaml secrets.yaml (fill it in)
6. Set your meter ID in aquabridge.yaml (label "8 DME76 1234 5678" -> 0x12345678)
7. Plug the ESP32 into USB: esphome run aquabridge.yaml --device /dev/ttyUSB0
8. Put the receiver close to the meter, watch the logs -> docs/04-flashing.md
9. Home Assistant finds it: Settings -> Devices & services -> ESPHome -> Configure
10. Add helpers, automations and the dashboard -> docs/05-home-assistant.md
The whole thing, step by step, with every command and the log output you should see: docs/04-flashing.md.
| CC1101 | ESP32 | Purpose |
|---|---|---|
| VCC | 3V3 | power, 3.3 V only |
| GND | GND | ground |
| SI / MOSI | GPIO13 | SPI data to the radio |
| SO / MISO | GPIO12 | SPI data from the radio |
| SCK | GPIO14 | SPI clock |
| CSN | GPIO2 | chip select |
| GDO0 | GPIO5 | "FIFO has data" interrupt, required |
| GDO2 | GPIO4 | not used, can stay connected |
More photos, soldering tips and the antenna: docs/02-wiring.md.
pipx install esphome
cd AquaBridge/esphome
cp secrets.example.yaml secrets.yaml # WiFi, AES key, API key
esphome config aquabridge.yaml # must say "Configuration is valid!"
esphome run aquabridge.yaml --device /dev/ttyUSB0The first build downloads the ESP-IDF toolchain (a few GB, 10–20 minutes). After that a build takes a minute. On the first boot you should see:
[C][wmbus.transceiver]: Transceiver: CC1101
[C][wmbus_meter]: ID: 0x12345678
[C][wmbus_meter]: Driver: hydrus
[I][wmbus]: Receiver task created
Everything about the first boot, finding your meter in the air and reading the decrypted JSON: docs/04-flashing.md.
The included dashboard, shown with example values.
The ESP32 shows up as a new ESPHome device. Enter the API key from your secrets.yaml and you get:
| Entity | Example |
|---|---|
sensor.water_meter_total |
1234.567 m³ |
sensor.water_meter_total_at_billing_date |
1136.137 m³ |
sensor.water_meter_usage_since_billing_date |
98.430 m³ |
sensor.water_meter_water_temperature |
13.8 °C |
sensor.water_meter_battery_life |
10.4 a |
sensor.water_meter_meter_signal |
-37 dBm |
sensor.water_meter_last_telegram |
12 seconds ago |
binary_sensor.water_meter_meter_reception |
Connected |
On top of that this repository ships ready-to-use Home Assistant configuration:
| File | What it does |
|---|---|
homeassistant/packages/aquabridge.yaml |
water today / month / year, flow in m³/h, "water running" and "used without a break" |
homeassistant/automations/leak_alarm.yaml |
burst pipe, running for 2 h, night usage, frost. Critical push on iPhone |
homeassistant/automations/reception_watchdog.yaml |
receiver offline / meter silent / back again |
homeassistant/dashboard/water-dashboard.yaml |
complete dashboard with 3 views, built-in cards only |
All of it explained, including the Energy dashboard and the UI way without YAML: docs/05-home-assistant.md.
- Distance matters more than you think. On my desk two floors up the receiver caught the meter, but every frame had a few bit errors and was silently dropped. In the basement, half a metre from the meter, 100 % of the telegrams arrive at -32 to -40 dBm.
meter_idmust be hex.0x12345678, not12345678. The decimal version becomes a different ID and nothing ever matches.- Cheap ESP32 boards can have flaky flash chips. Mine has an XTX XT25F32B. On a weak USB charger, over-the-air updates corrupted the flash and once even wiped the bootloader. On the PC's USB port everything is fine. Details and the 1-minute fix in troubleshooting.
version_4of the component no longer works with current ESPHome (boot loop). Use themainbranch, pinned to a commit, as inaquabridge.yaml.- "UNKNOWN_80" is not an error. Diehl uses vendor-specific status bits. The leak detection here works with the flow instead.
The CC1101 is tuned to 868.95 MHz and listens for the wM-Bus sync word. Each T1 frame is 3-of-6
encoded; the ESP32 decodes it, checks the CRCs, verifies the CMAC and decrypts the payload with AES-128.
The wmbusmeters driver then turns the DIF/VIF records into named values like total_m3.
The long version: docs/07-how-it-works.md.
AquaBridge/
├── esphome/
│ ├── aquabridge.yaml # the firmware configuration
│ ├── secrets.example.yaml # copy to secrets.yaml
│ └── debug-snippets.yaml # raw frames + decoded JSON for commissioning
├── homeassistant/
│ ├── packages/aquabridge.yaml # helpers as YAML package
│ ├── automations/ # leak alarm, reception watchdog
│ └── dashboard/ # water dashboard
├── docs/ # the full guide, 01 to 07
└── images/
- SzczepanLeon/esphome-components: the wM-Bus radio and meter components for ESPHome. AquaBridge is a configuration and a guide built on top of it.
- wmbusmeters: the meter drivers and the decryption.
- ESPHome and Home Assistant.
- Case: ESP32 + CC1101 Case (USB-C Devkit) by danoman (CC0).
MIT. Use it, change it, sell your water meter receivers at the flea market.
Your AES key and your meter data stay yours: never commit secrets.yaml.
AquaBridge is free and open source. If it saved you an evening (or a flooded basement), a small tip is appreciated.
Solana (SOL):
71ZN1AtBvFASLmbnh7WkfhzYYBC35h9tAm7Awvvk9FPt
A ⭐ on the repository helps too.