Raspberry i Banana Pi

Domoticz #5 – obsługa termometrów Xiaomi Mijia LYWSD03MMC Bluetooth

W drugiej części opisu moich doświadczeń z Domoticzem – Domoticz #2 opisałem obsługę sensorów temperatury i wilgotności Xiaomi Mijia LYWSDCGQ, popularnie zwanych czujnikami okrągłymi, lub v1. Dziś przedstawię sposób integracji z Domoticzem jakby nowszej wersji – czujników kwadratowych v2, Xiaomi Mijia LYWSD03MMC.

Czujniki okrągłe LYWSDCGQ kontra kwadratowe LYWSD03MMC

Zacznę od tego, że czujniki starsze okrągłe i nowsze kwadratowe komunikują się za pomocą Bluetooth. Jednak są między nimi spore różnice. Najważniejsza to inny format wysyłanych danych. Dlatego metoda obsługi czujników okrągłych opisana przeze mnie we wpisie Domoticz #2 nie działa z czujnikami kwadratowymi. Dostałem sporo informacji, że przedstawiony tam sposób nie działa, a po analizie okazywało się, że próbowano odczytywać nowsze kwadratowe czujniki, stąd problem. Inne różnice to m.in czujnik okrągły / czujnik kwadratowy:

  • bateria AAA / CR2032
  • zakres temperatur 0 – 60ºC / -9,9ºC – 60ºC
  • ekran 1,69″ kwadrat / 1,78″ okrągły

Nowsze, kwadratowe czujniki LYWSD03MMC stały się ostatnio bardzo popularne. Do tego są sporo tańsze od “starszych” okrągłych braci. Można je kupić w pakietach po 2-3 sztuki i cena jest jeszcze bardziej atrakcyjna. Mój sensor kupowałem w promocji na Bangggod za 5,99$ (ale można spotkać taniej), linki poniżej:

Skrypt do odczytu danych z sensorów Xiaomi Mijia LYWSD03MMC

Tradycyjnie już, na github, można znaleźć skrypt do obsługi czujników LYWSD03MMC, a dokładniej tutaj: https://github.com/JsBergbau/MiTemperature2

Do zadziałania całości potrzebujemy w systemie python3, bluez, python3-pip oraz bluepy. Na początek instalacja 3 pierwszych:

sudo apt update && sudo apt install python3 bluez python3-pip

I instalujemy bluepy

pip3 install bluepy

Przechodzimy do folderu scripts/python w domoticzu (cd domoticz/scripts/python/) i klonujemy skrypt do obsługi termometrów Xiaomi:

git clone https://github.com/JsBergbau/MiTemperature2 

Potrzebny nam będzie MAC Address naszego termometru, który odczytamy za pomocą znanego już polecenia:

sudo hcitool lescan

Trzecie urządzenie od dołu to mój kwadratowy termometr Xiaomi

No to próba odpalenia odczytów w konsoli. Wchodzimy do folderu ze skryptem (cd MiTemperature2) i wpisujemy:

python3 ./LYWSD03MMC.py -d <MAC ADRES termometru>

Odczyty lecą cały czas, by je zatrzymać, trzeba wcisnąć CTRL+C. Spróbujmy uzyskać jeden odczyt, z dokładnością jednego miejsca po przecinku:

python3 ./LYWSD03MMC.py -d <MAC ADRES termometru> -r -deb -b -c 1

Użyte parametry to kolejno:

  • -d –device – mac adres urządzenia;
  • -r –round – zaokrąglanie pomiaru do jednego miejsca po przecinku
  • -deb –debaunce – pobieranie dokładniejszego wyniku, wymaga parametru -r
  • -b –battery – pobieranie napięcia baterii
  • -c N –count N – gdzie N to liczba naturalna – ilość pomiarów

Wszystkie powyższe parametry są dokładnie opisane na stronie projektu na githubie https://github.com/JsBergbau/MiTemperature2.

Obsługa Xiaomi Mijia LYWSD03MMC przez Domoticza

Na początek trzeba dodać w Domoticzu wirtualne urządzenie (czujnik). Wchodzimy w Sprzęt i w typie Dummy (a o nazwie nadanej przez nas) wciskamy Utwórz wirtualne czujniki.

W nowo otwartym oknie podajemy nazwę, która pozwoli nam zlokalizować czujnik i jako typ czujnika ustawiamy Temp & Wilg.

Po utworzeniu najważniejsze – odczytujemy sobie Idx nowo utworzonego czujnika. U mnie jest to 20 (trzecia kolumna).

W folderze domoticz/scripts/python/MiTemperature2 otwieramy do edycji plik sendToDomoticz.py

I wpisujemy Idx naszego czujnika w miejscu idx_temp = “xx” oraz zmieniamy inne wartości wg potrzeb.

No to teraz próba – wpiszmy linijkę komend tak, jakbyśmy mieli ją podać w cronie i zobaczmy czy zadziała:

/usr/bin/python3 /home/pi/domoticz/scripts/python/MiTemperature2/LYWSD03MMC.py -d <MAC ADRES termometru> -r -deb -b -c 1 -call ./sendToDomoticz.py

Jeśli zadziała jak wyżej (dane zostaną przekazane do czujnika w domoticzu), to można linijkę wkleić do crona. Czyli

crontab -e

i wysyłanie danych co 10 minut, czyli całość wygląda jak druga linijka na poniższym screenie:

Na koniec tradycyjnie sudo service cron reload.

Podsumowanie

Cała konfiguracja czujnika Xiaomi Mijia v2 jest bardzo podobna do wcześniej opisywanej obsługi Xiaomi Mijia v1. Całość opiera się na cyklicznie wywoływanych przez crona skryptach, które wysyłają dane do domoticza. Efektem są dane historyczne w postaci znanych już wykresów:

jak i bieżące odczyty

Co dalej można z tym zrobić? Tradycyjnie możliwości jest wiele. Można uzależnić temperaturę czy wilgotność od włączania lub wyłączania urządzeń – grzejnika, klimatyzatora lub wentylatora np. w łazience, by zmniejszyć wilgotność po kąpieli. Obsługa jest dość prosta, a same czujniki są tanie i wygodne w użyciu.

Wojtek

Zobacz komentarze

  • Witam, mam problem na RPi B3+ Stretch, nie chce wysłać danych:
    Traceback (most recent call last):
    File "/home/pi/domoticz/scripts/python/MiTemperature2/./sendToDomoticz.py", line 5, in
    import requests
    ModuleNotFoundError: No module named 'requests'
    Data couln't be send to Callback, retrying...

  • Ok zrobiłem:
    pip install requests
    i poszło bez błędu ale nadal nie mam danych w domoticzu?

  • Dzięki - zadziałało zgodnie z oczekiwaniami, dokładnie tak, jak pisałeś :)

  • Kilka słów uzupełnienia:

    python musi być w wersji minimum 3.7 (u mnie aktualizacja nie chciała iść - musiałem ręcznie...)
    w pliku sendToDomoticz.py adres IP serwera należy podać wraz z portem...
    jeżeli chcesz podłączyć więcej niż jeden termometr, zrób kilka plików sendToDomoticz.py - np. sendToDomoticz1.py, sendToDomoticz2.py

    To rzeczy z którymi musiałem "powalczyć" zanim zadziałało :-)

  • Mogę prosić o nakierowanie gdzie szukać problemu:
    próba odpytania czujnika w konsoli jednym razem przechodzi bez problemu, innym razem kilka razy z rzędu "connection lost" i dopiero po kilku następnych próbach zaskakuje, brak zależności.
    Wcześniej z poprzedniego wpisu dodałem czujnik okrągły i działa bezbłędnie. Oba czujniki miałem wcześniej dodane do RPIeasy i też działały.
    Wydaje mi się że przez te problemy z połączeniem nie mogę też przesłać pobranych danych (gdy już w końcu się uda) do domoticza (wpisywałem też adres domoticza wraz z portem)

    Czujnik kwadratowy, resetowałem też sam czujnik, python w wersji 3.7.3

  • Zauważyłem problem polegajacy na obciążeniu procesora.
    Po restarcie RBPi3b+ z domoticzem obciążenie procesora wynosi do 5%. Odczyt czujników co 20min.
    Po następnych 20 już jest ok 10%, następnie rośnie x2 co odczyt (4 czujniki LYWSD03MMC).
    Dodam ze czujniki są odczytywane bez problemów, i wartości w domoticzu aktualizowane (odpada problem z zasięgiem).
    No i dochodzi prawie do 100%, co powoduje ze muszę zrestartować malinkę.
    Tak jakby sie cos zapętlało, wszystko zrobione zgodnie z instrukcja w tym artykule.

    Czy są jakieś pomysły co to może być ?

  • No i problem rozwiązany.

    Dotyczy błędów w "bluepy" jak to autor projektu opisuje tutaj:

    https://github.com/JsBergbau/MiTemperature2

    Wystarczy się wczytać (np. użyć translatora :), i jest tam rozwiązanie:

    killall bluepy-helper

    W skrypcie jest to zahashowane (#) wiec nie ruszałem skryptu tylko dorzuciłem do crontab, że ma 2min po odczycie "skilować" bluepy. Jak na razie 3 dzień odczyty 4 czujników kwadratowych LYWSD03MMC co 15min działają (oprócz tego co 15min są też czytane 6x czujniki okrągłe LYWSDCGQ) bez restartu.
    Obciążenie procesora 5 do 7 %.

  • zielony jestem,
    jak to zrobiles w cronie bo mam ten sam problem co Ty, przy 4 czujnikach

  • Witam
    Mi przy 4 czujnikach co kilka godzin pojawiały się kolejne bluepy-helper . Średnio po dobie miałem już cztery procesy i procesor na 100% przy odpytywaniu czujników co 20 minut. Jako , że też jestem zielony w linuxie samo "odhaszowanie" wyrzucało błedy skryptu tak z pomocą google ;) utworzylem plik .sh z zawartosćią :

    #!/bin/bash
    killall bluepy-helper

    W cronie uruchamia się co godzinę i problem znikł .

  • Witam,

    u mnie tak przygotowany skrypt nie działa.
    Zwraca tylko komunikat:

    SyntaxError: invalid syntax

    Czy macie może jakieś sugestie, jak rozwiązać problem?
    Malina 100% jak odpytuje 2 czujniki co 10 minut.

Ostatnie posty

Tani moduł IoT z kamerką ESP32 CAM – pierwsze uruchomienie

Mega tanie, bezprzewodowe moduły Internet of Things na dobre zadomowiły się w naszych sieciach. Od…

1 tydzień temu

Aktualizacja oprogramowania w stacji lutowniczej AiXun T3A

Pewnie nie każdy posiadacz tytułowej stacji lutowniczej wie, że posiada ona możliwość aktualizacji firmware'u. Producent…

3 tygodnie temu

Programator USB AVR ISP z Arduino Nano

Jakiś czas temu, przeglądając Aliexpress natknąłem się na ciekawy shield do Arduino Nano. Według opisu…

1 miesiąc temu

Tester elementów elektronicznych na atmega – aktualizacja firmware’u

W mailach i komentarzach kilka razy przewijała się prośba o ten wpis. Chodzi o aktualizację…

2 miesiące temu

Wzmacniacz słuchawkowy Lovely Cube – popularny klon Lehmanna

Dziś tematyka audio, a nawet audiofilska. Uznany wzmacniacz słuchawkowy Lehmann Black Cube Linear o dość…

2 miesiące temu

Podsumowanie 2023 roku

Tradycyjnie w styczniu, publikuję podsumowanie minionego roku na stronie grylewicz.pl. Poniżej trochę liczb, lista najpopularniejszych…

3 miesiące temu