
Poniżej tania integracja (ok. 50PLN) odczytu bieżącego zużycia wody z licznika Multical 21. Aby uruchomić tą integracja trzeba:
- spore umiejętności przy lutowaniu oraz
- kontakt z firmą, która obsługuje rozliczenie wody i trochę cierpliwości, aby otrzymać kod deszyfrujący AES dla licznika
Licznik Multial 21 może wysyłać dane bezprzewodowo przy użyciu protokołu Wireless M-Bus. Multical21 zapewnia następujące dane:
- licznik całkowity – całkowite zużycie wody w m³
- licznik docelowy – zużycie wody do 1. dnia bieżącego miesiąca
- temperatura średnia – w °C
- temperatura otoczenia – w °C
- kody informacyjne – BURST, LEAK, DRY, REVERSE, TAMPER, RADIO OFF
Kod informacyjny wyświetlany na wyświetlaczu | Znaczenie |
---|---|
LEAK | W ciągu ostatniej doby nie zanotowano zatrzymania przepływu przez wodomierz przez minimum jedną godzinę. Może to świadczyć o nieszczelności kranu lub zbiornika toalety. |
BURST | Stałe wysokie zużycie wody w ciągu pół godziny, co oznacza pęknięcie rury. |
TAMPER | Próba oszustwa. Wodomierz nie nadaje się do celów rozliczeniowych. |
DRY | Brak wody w wodomierzu. Pomiar nie jest prowadzony. |
REVERSE | Woda przepływa przez wodomierz w nieprawidłowym kierunku. |
RADIO OFF | RADIO OFF wyświetlany ciągle. Nadajnik radiowy jest permanentnie wyłączony. |
Hardware
- Wemos D1 mini (lub ESP32) – koszt ok 12 PLN
- moduł radiowy CC1101 868 MHz z anteną (ja zamówiłem tu) – koszt ok 30 PLN
- 7 przewodów
Software
Połączenie
Trzeba sporo wprawy, aby zlutować połączenia do CC1101 – raster jest mniejszy niż standardowy goldpin.

CC1101 | ESP8266 |
---|---|
VCC | 3V3 |
GND | GND |
CSN | D8 |
MOSI | D7 |
MISO | D6 |
SCK | D5 |
GDO0 | D2 |
Poniżej jak mi to wyszło:





Uruchomienie
Polecam najpierw złożyć, uruchomić bez kodu deszyfrującego – zweryfikować, czy działa komunikacja . A następnie ponowne programowanie Wemos D1 mini już z kluczem AES. W moim przypadku odczyt następuje z ok 10 metrów przez kilka ścian.
Aby uzyskać klucz deszyfrujący AES należy skontaktować się ze spółką rozliczającą wodę. W moim przypadku wystarczyło pismo ogólne zgłoszone przez platformę EPUAP (w tym wypadku nie musiałem poświadczać swojej tożsamości) i plik z kluczem oraz hasłem dostałem bezpośrednio na emaila. (podziękowania dla pana Piotra ze Spółki Komunalnej Żukowo).
Przykładowe pismo znajduje się tu.
Plik ZIP z plikiem KEM zawiera kluczem AES, Aby odczytać klucz AES konieczne jest hasło i należy użyć dodatkowego programu w python.
Programowanie
Na PlatformIO zaimportuj projekt esp-multical21.
Zmiany w kodzie
Należy zmienić nazwę pliku config_template.h na config.h oraz w pliku wprowadzić zmiany
Ustawić numer licznika
//numer seryjny licznika
#define SERIAL_NUMBER 0x65, 0x00, 0x05, 0x43
Ustawić sieć WiFi, adres serwera MQTT
std::vector<CREDENTIAL> const credentials = {
{ "sid_sieci_wifi", "haslo_sieci_wifi", "", "", ""} // no MQTT
, { "sid_sieci_wifi", "haslo_sieci_wifi", "adres_IP_serwera_mqtt", "login_serwera_mqtt", "haslo_serwera_mqtt"} // MQTT with auth
};
Ustawić klucz AES (najlepiej po sprawdzeniu, czy odbiera się ramki z licznika
#define ENCRYPTION_KEY 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0x10, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
Weryfikacja logów na porcie COM z prędkością 115200. Podczas wyszukiwania sieci mruga dioda na chipie Wemos D1.
Dekodowanie pliku KEM
Aby odczytać klucz AES należy uruchomić program kem-decryptor.py w pythonie ze strony:
https://gist.github.com/mbursa/caa654a01b9e804ad44d1f00208a2490
kem-decryptor.py nazwa_pliku_ZIP_lub_KEM hasło
Na ekranie oraz w pliku etc\wmbusmeters.d\<numer_Licznika> będzie klucz który przepisujemy do pliku config.h, ponownie kompilujemy i wgrywamy oprogramowanie do Wemos D1 mini.
Konfiguracja HA
W moim przypadku Wemos przesyła informacje do serwera MQTT uruchomionego jako dodatek w HA.
Konfiguracja dla sekcji mqtt:
Plik configuration,xml
mqtt: !include mqtt.yaml
Plik mqtt.xml
- state_topic: "watermeter/0/total"
name: "watermeter_total"
unit_of_measurement: "m³"
device_class: water
state_class: total_increasing
icon: mdi:water
- state_topic: "watermeter/0/target"
name: "watermeter_target"
unit_of_measurement: "m³"
device_class: water
state_class: total_increasing
icon: mdi:water
- state_topic: "watermeter/0/infocode"
name: "watermeter_infocode"
- state_topic: "watermeter/0/flowtemp"
name: "watermeter_flowtemp"
unit_of_measurement: '°C'
device_class: temperature
- state_topic: "watermeter/0/ambienttemp"
name: "watermeter_ambienttemp"
unit_of_measurement: '°C'
device_class: temperature
A tak to wygląda w HomeAssistant:


Dodaj komentarz