Po deseti letech se nám v bytovém družstvu vybyly baterie u radiátorových měřidel spotřeby tepla. Zároveň přišla povinnost mít pravidelný dálkový odečet spotřeby teplé vody. V družstvu tak nakoupili nové vodoměry i radiátorová měřidla s podporou dálkového odečtu. A tak mě napadlo: nebylo by pěkné napojit živá data o spotřebě do domácího systému?
Příjem
Z dokumentace měřidel jsem zjistil, že naměřené hodnoty se odesílají přes protokol wmbus. Je to úsporný protokol na posílání krátkých zpráviček v bezlicenčním frekvenčním pásmu. Tahle měřidla vše posílají na frekvenci 868.950Mhz.
Podle této specifikace jsem hledal hardwarové řešení. Napadlo mě, že by na příjem takových zpráviček mohl existovat nějaký Arduino modul, a že by místo arduina by šlo použít nějaký procesor z rodiny ESP. A že vůbec nejlepší by bylo, kdyby byl modul podporovaný softwarem ESPHome.
Hledání bylo v celku úspěšné: Existuje modul CC1101. Ten sice nemá přímou podporu v ESPHome, ale jakýsi uživatel
Objednal jsem tedy radiový modu CC1101 i vývojovou desku Nodemcu-32S, vše propojil a nahrál základní konfiguraci ESPHome s wmbus pluginem. Funguje! V logu vidím jednotlivé přijaté zprávičky.
Parsování
Dalším krokem je vydolovat ze zpráv naměřené hodnoty a dostat je do Home assistenta. Plugin zprávy parsuje knihovnou wmbusmeters, která zároveň má užitečný web https://wmbusmeters.org. Tam lze vložit přijaté datagramy z logu a zjistit co v nich je za data.
Aby ESPHome mohl parsovat musí se nastavit "senzory". K tomu potřebuju pro každý měřák zjistit následující:
ID měřidla
Každá zpráva obsahuje nešifrovaný identifikátor vysílajícího měřidla. To má každý měřák na sobě vyražený, jednoduše jsem tedy mohl párovat, které zprávy nesou hodnoty k mému bytu.
Klíč
Zpráva obsahuje výše zmíněné ID, typ měřidla (voda/hca = teplo) a pár dalších metadat. Naměřené hodnoty se ale posílají šifrovaně. Tady mi naštěstí vyšlo bytové družstvo vstříc a klíče k měřákům v mém bytě mi poskytlo.
Driver
Každý výrobce má formát naměřených hodnot trochu jiný, je tedy potřeba zjistit výrobce měřidla a nejlépe i verzi meřidla. Najít takhle detailní specifikaci měřidla se mi nepodařilo, ale když už jsem znal klíč k měřidlu, web wmbusmeters.org dokázal v "auto" režimu rozpoznat správný driver pro získání naměřených hodnot.
Má měřidla jsou asi nějaký novější model, protože detekovaný driver nefunguje na 100%. Ve zprávě je několik informací, které nelze přečíst. Ale to zásadní, čisté naměřené hodnoty spotřeby tepla a vody mi vyčíst jde.
Výsledek
Hodnoty se mi průběžně propisují do Home assistenta. Úspěch. Chvíli jsem hledal pro přijímač místo, kde bude dostatečný signál na příjem všech měřáků. Také jsem zjistil, že měřáky kvůli úspoře energie vysílají jen v pracovní dny a v pracovní době od 8 do 18 hodin. Sesbírané hodnoty proto nejsou tak kontinuální jak by mohly. Ale mimo to to funguje hezky.
Výsledná ESP Home konfigurace vypadá následovně:
substitutions:
id: wmbus1
esphome:
name: wmbus1
esp32:
board: nodemcu-32s
wifi:
ssid: !secret iot_wifi_ssid
password: !secret iot_wifi_password
api:
encryption:
key: !secret wmbus1_api_key
ota:
- platform: esphome
password: !secret wmbus1_ota_password
logger:
status_led:
pin: GPIO2
time:
- platform: sntp
id: time_sntp
button:
- platform: restart
internal: True
id: reset_button
name: "Reset button"
external_components:
- source: github://SzczepanLeon/esphome-components@version_4
refresh: 0d
components: [ wmbus ]
wmbus:
frequency: 868.950
mosi_pin: GPIO13
miso_pin: GPIO12
clk_pin: GPIO14
cs_pin: GPIO15
gdo0_pin: GPIO17
gdo2_pin: GPIO16
led_pin: GPIO21
sync_mode: false
all_drivers: false
log_all: true
sensor:
- platform: wmbus
meter_id: 0x24334557
key: !secret wmbus1_key_24334557
type: "iwmtx5"
sensors:
- field: "total"
name: Hot water
unit_of_measurement: "m³"
icon: "mdi:water-thermometer"
accuracy_decimals: 3
state_class: total_increasing
device_class: volume
- field: "rssi"
name: "Hot water RSSi"
unit_of_measurement: "dBm"
accuracy_decimals: 0
device_class: "signal_strength"
state_class: "measurement"
entity_category: "diagnostic"
- platform: wmbus
meter_id: 0x93098480
key: !secret wmbus1_key_93098480
type: "hydroclima"
sensors:
- field: "current_consumption"
name: Bedroom heat cost allocator
unit_of_measurement: "hca"
icon: "mdi:radiator"
state_class: total_increasing
accuracy_decimals: 0
- field: "rssi"
name: "Bedroom heat cost allocator RSSi"
unit_of_measurement: "dBm"
accuracy_decimals: 0
device_class: "signal_strength"
state_class: "measurement"
entity_category: "diagnostic"
- platform: wmbus
meter_id: 0x93098479
key: !secret wmbus1_key_93098479
type: "hydroclima"
sensors:
- field: "current_consumption"
name: Childroom heat cost allocator
unit_of_measurement: "hca"
icon: "mdi:radiator"
state_class: total_increasing
accuracy_decimals: 0
- field: "rssi"
name: "Childroom heat cost allocator RSSi"
unit_of_measurement: "dBm"
accuracy_decimals: 0
device_class: "signal_strength"
state_class: "measurement"
entity_category: "diagnostic"
- platform: wmbus
meter_id: 0x93098478
key: !secret wmbus1_key_93098478
type: "hydroclima"
sensors:
- field: "current_consumption"
name: Livingroom heat cost allocator
unit_of_measurement: "hca"
icon: "mdi:radiator"
state_class: total_increasing
accuracy_decimals: 0
- field: "rssi"
name: "Livingroom heat cost allocator RSSi"
unit_of_measurement: "dBm"
accuracy_decimals: 0
device_class: "signal_strength"
state_class: "measurement"
entity_category: "diagnostic"