Radiowy odczyt wodomierzy

By | Grudzień 31, 2020

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&param=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.