Pomocna okazała się elektroda, gdzie dowiedziałem się, że informacje są transmitowane jako wireless M-BUS oraz, że do odbioru i dekodowania nadaje się program wmbusmeters.
Oto strona projektu: https://github.com/weetmuts/wmbusmeters
Odbiornik
Ponieważ z bezprzewodowym M-BUS nie miałem do czynienia najpierw należało się zaopatrzyć w jakiś odbiornik. Ogólnie są trzy rozwiązania:
- dedykowany odbiornik wireless M-BUS np. iM871A-USB (należy sprawdzić te urządzenia na stronie projektu wmbusmeters)
- układ typu CUL (właściwie nanoCUL) – konstrukcja oparta o Arduino Nano z układem FTDI i odbiornikiem CC1101
- układ oparty o odbiornik DVB-T
To ostatnie rozwiązanie jest najtańsze, jednak dekodowaniem sygnału musi zajmować się procesor komputera. Planowałem podłączenie układu do Pi i wolałem go nie męczyć takimi rzeczami, tym bardziej, że realizuje już inne funkcje (odbiór i dekodowanie temperatury z serii czujników INODE BT).
Rozwiązanie pierwsze wygląda na najprostsze, ale zdziwiła mnie cena tych odbiorników (ponad 300zł). Zdecydowałem się na rozwiązanie środkowe – nanoCUL. Jego zaletą jest zewnętrzna antena. Zakup na ebay był bezproblemowy:
Są też dostępne trochę tańsze wersje bez obudowy. Niestety, jak się później okazało ten odbiornik nie działa właściwie z wmbusmeters – ma inny firmware. Na stronach często jest informacja o możliwości wgrania odpowiedniego firmware do MBUS, czego wcześniej nie doczytałem. Na całe szczęście na stronie: Link jest firmware nanoCUL-MBUS.hex, który można pobrać i za pomocą XLOADERa Link wgrać.
Oprogramowanie
Oprogramowanie wmbusmeters instalowałem na Pi:
git clone https://github.com/weetmuts/wmbusmeters.git
cd wmbusmeters
sudo apt install librtlsdr-dev
sudo apt install libncurses-dev
./configure
make
sudo make install
Jak widać najpierw pobieramy źródła, dodatkowe aplikacje, a następnie kompilujemy i instalujemy.
Teraz możemy podłączyć nasz odbiornik MBUS.
Aby odczytać dane ze wszystkich widocznych liczników (skan) wydajemy komendę:
wmbusmeters auto:t1 MyWater auto '*' NOKEYi musimy trochę poczekać. Jeśli wszystko jest OK powinny być widoczne odczytane informacje. U mnie wskazania licznika mechanicznego i elektronicznego zgadzały się co do litra.
Tu drobna uwaga – w trybie „auto” wmbusters skanuje wszystkie porty. Niestety źle się to kończy dla BT na Pi – po prostu przestaje działać (BT na Pi działa na UART), a ja na BT mam odczyt temperatury. Długo szukałem przyczyny problemu, a winny okazał się tryb „auto” dlatego po jednorazowym rozpoznaniu lokalizacji naszego odbiornika MBUS możemy zrestartować Pi i od tego momentu więcej nie używać „auto” lecz podawać określony port. U mnie jest to /dev/ttyUSB0
Skanowanie dla urządzenia CUL wygląda zatem tak:
wmbusmeters /dev/ttyUSB0:cul:t1 MyWater auto '*' NOKEYPo więcej informacji odsyłam na stronę projektu.
Skanowanie umożliwia nam zlokalizowanie naszego licznika/liczników np. po numerze licznika lub po odczytanej wartości zużycia wody.
Gdy już zlokalizujemy nasze liczniki przystępujemy do ostatecznej konfiguracji.
W folderze etc powinien być wmbusmeters.conf. Oto moja zawartość tego pliku:
loglevel=normal
device=/dev/ttyUSB0:cul:t1
logtelegrams=false
format=json
#meterfiles=/var/log/wmbusmeters/meter_readings
#meterfilesaction=overwrite
logfile=/var/log/wmbusmeters/wmbusmeters.log
shell=curl -X POST 192.168.1.24/woda.php -d "$METER_JSON"
dane będą wysyłane w formacie json do mojego skryptu woda.php w postaci POST. Jak widać zakomentowane są dwie linie, gdyż zgodnie z opisem na stronie projektu:
„If you are running on a Raspberry PI with flash storage and you relay the data to another computer using a shell command (mosquitto_pub or curl or similar) then you might want to remove meterfiles and meterfilesaction to minimize the writes to the local flash file system.”
Oczywiście linie możemy usunąć/zakomentować później, gdyż na etapie testów zapisywane dane mogą być bardzo przydatne.
W folderze /etc/wmbusmeters.d mam dwa pliki (każdy dla jednego licznika) o nazwach zgodnych z parametrem „name”. Ich zawartość jest bardzo prosta:
name=glowny
id=210b1234
key=
oraz
name=ogrod
id=21401234
key=
W każdym pliku mamy: nazwę symboliczną, id (ustalone podczas skanowania), oraz klucz potrzebny do dekodowania. Na całe szczęście dla odbiorników IZAR nie ma klucza. Na stronie projektu jest jednak wymieniona cała lista nakładek, z którymi współpracuje wmbusmeter. Niektóre szyfrują algorytmem AES, ale jak można przeczytać na różnych stronach operatorzy sieci często nie zmieniają domyślnego klucza składającego się np. z samych zer
Gdy przygotujemy pliki oraz skrypt/program, który będzie odbierał dane możemy testować uruchamiając wmbusmeters z domyślną konfiguracją:
sudo wmbusmeters --useconfig=/Jeśli wszystko jest OK to możemy uruchamiać całość wraz ze startem systemu operacyjnego. W tym celu wydajemy komendę:
sudo systemctl enable wmbusmetersNa koniec jeszcze informacja jak odczytać dane POST wysłane do PHP:
Kod: PHP
Tak odczytane dane możemy zapisywać do bazy danych, obrobić i przesłać dalej lub po prostu zapisać do pliku. Dodatkowe informacje o integracji: https://weetmuts.github.io/wmbusmeterswiki/
Poniżej jeszcze kilka ciekawych linków, z których można się czegoś dowiedzieć:
https://github.com/zibous/ha-watermeter
https://github.com/ZeWaren/izar-prios-smart-meter-collector
Fajne? Ranking DIY
