Podczas planowej wymiany wodomierzy w moim bloku, zauważyłem że nowe wodomierze instalowane przez spółdzielnię wyposażone są w nakładki radiowe do zdalnego odczytu stanu licznika. Postanowiłem że skorzystam z okazji i wrzucę odczyt wodomierzy do domoticza.
Monter instalujący nowe liczniki niestety nie posiadał żadnych informacji wiec pozostało mi poszukanie pomocy w sieci. Po krótkich poszukiwaniach znalazłem na stronie hejdom.pl artykuł szczegółowo opisujący sposób odczytu z liczników które mi zainstalowano.
Odczyt liczników realizowany jest poprzez odbiór transmisji danych na częstotliwości 868,9MHz gdzie pracują liczniki. Realizowane jest to za pomocą dongla DVB-T na chipsecie RTL. Odebrane dane są dekodowane przez oprogramowanie rtl-wmbus. A następnie obrabiane za pomocą wmbusmeter, który zapisuje odebrane dane w formacie JSON na dysku.
A stąd już prosta droga do wrzucenia tego do domoticza.
Prace zaczynam od ściągnięcia i zainstalowania pakietów do obsługi radia.
sudo apt install rtl-sdr
W kolejnym kroku ściągam pakiet GIT jeśli jeszcze niema zainstalowanego który będzie potrzebny do ściągnięcia oprogramowania z serwisu github.
sudo apt install git
Po skompletowaniu narzędzi możemy ściągnąć pakiet rtl-wmbus z serwisu github, robimy to komendą:
git clone https://github.com/xaelsouth/rtl-wmbus.git
Teraz możemy przystąpić do kompilacji ściągniętego oprogramowania. Wchodzimy do katalogu z wmbus i wydajemy komendy do kompilacji:
cd rtl-wmbus make
Po zakonczonej kompilacji przenosimy skompilowany plik do odpowiedniego katalogu.
sudo cp build/rtl_wmbus /usr/bin/rtl_wmbus
Teraz możemy sprawdzić czy odbiornik działa i czy odbieramy i dekodujemy jakieś dane:
/usr/bin/rtl_sdr -f 868.9M -s 1.6e6 - | /usr/bin/rtl_wmbus
Powinniśmy zobaczyć coś jak na zrzucie ekranu poniżej, przy czym należy pamiętać że ilość danych i częstotliwość odbioru zależy od ilości liczników w zasięgu odbioru.
Na powyższym zrzucie widać ze odbieram sporo danych, są to liczniki moje i okolicznych sąsiadów, teraz należy zainstalować program wmbusmeters i skonfigurować go do odczytu moich liczników. W tym celu posłużę się numerem seryjnym nakładki który można znaleźć na naklejce na nakładce licznika.
Przechodzimy do katalogu /home/pi i za pomocą git-a ściągamy paczkę z plikami wmbusmasters:
cd git clone https://github.com/weetmuts/wmbusmeters.git
Po ściągnięciu źródeł wchodzimy do katalogu i przygotowujemy program do kompilacji:
cd wmbusmeters ./configure
I tutaj mała uwaga po wydaniu komendy konfigure obserwujemy odpowiedź i w razie potrzeby doinstalowujemy zasugerowane pakiety. W moim przypadku były to dodatkowe polecenia:
sudo apt install librtlsdr-dev sudo apt install libncurses-dev
Gdy wydanie komendy configure zakonczy się bez błędów i sugestii możemy przystąpić do kompilowania i instalacji oporogramowania komendy kolejno jak poniżej:
make sudo make install sudo systemctl daemon-reload
Większa część praca za nami, teraz przystępujemy do przygotowania plików konfiguracyjnych. Ja mam w domu cztery liczniki więc muszę przygotować odpowiednią konfigurację. Zaczynam od globalnego pliku konfiguracyjnego:
sudo pico /etc/wmbusmeters.conf
Wewnątrz pliku musi się znaleźć taki zapis:
loglevel=normal device=rtlwmbus:868.9M logtelegrams=false format=json meterfiles=/var/log/wmbusmeters/meter_readings meterfilesaction=overwrite logfile=/var/log/wmbusmeters/wmbusmeters.log
Następnie przechodzimy do katalogu w którym utworzymy konfiguracje poszczególnych liczników:
cd /etc/wmbusmeters.d/
W środku utworzyłem cztery pliki zawierające konfigurację moich liczników każdy plik musi być skonstruowany jak poniżej:
name=Kuchnia_CW type=apator162 id=02977724 key=00000000000000000000000000000000
Name to przyjazna nazwa licznika a id to numer seryjny nakładki. Po utworzeniu plików konfiguracyjnych uruchamiamy usługę i czekamy aż dane zostaną odebrane i w katalogu /var/log/wmbusmeters/meter_readings/ zostaną utworzone pliki z odczytem liczników.
Komenda do uruchomienia odbioru:
sudo systemctl start wmbusmeters.service
Możemy sprawdzić czy wszystko działa za pomocą:
sudo systemctl status wmbusmeters.service
Jak napisano na hejdom.pl dane są przesyłane w godzinach pracy inkasentów częściej, a poza godzinami ich pracy, by oszczędzić baterię raz na pół godziny. Należy więc cierpliwie czekać aż pojawią się wszystkie pliki z odczytami liczników.
Zawartość plików odczytów to wszystkie interesujące nas dane:
{"media":"water","meter":"apator162","name":"Kuchnia_CW","id":"02777124","total_m3":0.081,"timestamp":"2020-12-31T10:06:52Z","device":"rtlwmbus[00000001]","rssi_dbm":120} {"media":"water","meter":"apator162","name":"Kuchnia_ZW","id":"03777491","total_m3":0.155,"timestamp":"2020-12-31T10:08:24Z","device":"rtlwmbus[00000001]","rssi_dbm":140} {"media":"water","meter":"apator162","name":"Lazienka_CW","id":"02777294","total_m3":0.415,"timestamp":"2020-12-31T10:08:04Z","device":"rtlwmbus[00000001]","rssi_dbm":127} {"media":"water","meter":"apator162","name":"Lazienka_ZW","id":"03777702","total_m3":0.607,"timestamp":"2020-12-31T10:08:18Z","device":"rtlwmbus[00000001]","rssi_dbm":129}
Ostatni etap pracy to skrypt w pythonie który odczytuje dane z plików w katalogu /var/log/wmbusmeters/meter_readings/
Zawartość tego skryptu znajduje się poniżej:
#!/usr/bin/python import requests import json import urllib domoti_ip = '10.9.48.3' kuchnia_CW_file = "/var/log/wmbusmeters/meter_readings/Kuchnia_CW" kuchnia_ZW_file = "/var/log/wmbusmeters/meter_readings/Kuchnia_ZW" lazienka_CW_file = "/var/log/wmbusmeters/meter_readings/Lazienka_CW" lazienka_ZW_file = "/var/log/wmbusmeters/meter_readings/Lazienka_ZW" kuchnia_CW_idx = '132' kuchnia_ZW_idx = '133' lazienka_CW_idx = '134' lazienka_ZW_idx = '135' def read_and_set_data(input_file,idx): with open(input_file) as json_file: data = json.load(json_file) urllib.urlopen('http://' + domoti_ip + '/json.htm?type=command¶m=udevice&idx=' + str(idx) + '&svalue=' + str(data['total_m3']*1000)) print(data['total_m3']) try: read_and_set_data(kuchnia_CW_file,kuchnia_CW_idx) except: print("b/d") try: read_and_set_data(kuchnia_ZW_file,kuchnia_ZW_idx) except: print("b/d") try: read_and_set_data(lazienka_CW_file,lazienka_CW_idx) except: print("b/d") try: read_and_set_data(lazienka_ZW_file,lazienka_ZW_idx) except: print("b/d")
Jak widać odpowiednie odczyty są przesyłane do utworzonych w domoticzu obiektów liczników. Konfigurując liczniki, ustawiamy typ na wodomierz. Powyższy skrypt wysyła do domoticza dane w litrach, dzięki temu wykresy w domoticzu będą działać poprawnie.
Finalnie efekt wygląda jak poniżej:
Teraz po stronie domoticza mogę generować raporty ze zużycia wody, ustawić alarmy wycieku wody itd…
R.