Mamy już zainstalowanego domoticza, to teraz czas na skonfigurowanie w nim czujników i urządzeń wykonawczych. Na pierwszy ogień pójdą popularne termometry Xiaomi Mija z bluetooth, wyświetlaczem LCD i funkcją pomiaru wilgotności.
Obecna wersja Domoticza (4.11478) nie posiada wbudowanej obsługi termometrów / higrometrów Xiaomi Mijia (kod produktu LYWSDCGQ), ale wystarczy prosty skrypt, chwila konfiguracji i już działa. Mój Domoticz stoi na Raspberry 3 z wbudowanym Bluetooth, także nie muszę nawet wpinać dodatkowego modułu do portu USB.
W Domoticzu przechodzimy do Konfiguracja (Config), dalej Sprzęt (Hardware). Wpisujemy dowolną nazwę (u mnie Mi sensor Temp & Hum disp) a jako Typ wybieramy Dummy (Does nothing, use for virtual switches only), dokładnie wygląda to tak:
Wciskamy Dodaj (Add). Sprzęt pojawi się na górze z przyciskiem Utwórz wirtualne czujniki. Wciskamy go i w nowym okienku w polu Nazwa podajemy nazwę czujnika, oraz jego Typ: Temp+Wilg:
Operację powtarzamy tyle razy ile mamy czujników i spisujemy sobie ich indeksy – kolumna IDX na początku tabeli. Aha, czujniki znajdziesz w Konfiguracja -> Sprzęt oraz w głównej zakładce Temperatura. Teraz czas na resztę konfiguracji.
Skrypt do domoticza znajduje się na githubie. A dokładniej tu: https://github.com/pFenners/mijia-sensor-domoticz. Instalacja to poprostu sklonowanie repozytorium. Najlepiej (dla porządku), zrobić to w folderze /domoticz/scripts/python za pomocą polecenia:
git clone https://github.com/pFenners/mijia-sensor-domoticz
W folderze głównym domoticza, dalej scripts/python/ pojawił się nowy katalog mijia_sensor_domoticz:
Teraz fajny bajer – zeskanujemy sobie otoczenie w poszukiwaniu urządzeń bluetooth:
sudo hcitool lescan
Prócz telewizorów sąsiadów, powinniśmy znaleźć nasze termometry Xiaomi Mijia, ich mac adres zaczyna się od 4C:65 i nazwa MJ_HT_V1:
Jak widać wyżej, moje 2 termometry Xiaomi zostały odnalezione. Niektóre urządzenia zostały wykryte dwukrotnie. To co nas interesuje to adresy mac, które zaraz wpiszemy do skryptu, warto więc je zanotować.
Będąc nadal w katalogu /domoticz/scripts/python, wpisujemy:
nano mijia-sensor-domoticz/domoticz_mijia.py
Otworzy to nam skrypt z możliwością edycji:
Przechodzimy na koniec pliku i w miejsce 3 przykładowych adresów mac wpisujemy nasze, dalej wpisujemy numer indeksu (IDX) identyczny z wirtualnymi sensorami z zakładki Konfiguracja -> Urządzenia. W moim przypadku są to kolejno 1 i 2:
Po zapisaniu możemy sprawdzić czy wszystko działa., uruchamiając skrypt:
/usr/bin/python3 mijia-sensor-domoticz/domoticz_mijia.py
U mnie wszystko zadziałało zgodnie z oczekiwaniami, czyli czujniki zostały odpytane, a domoticz zasilony danymi:
Sprawdźmy jak wygląda zakładka Konfiguracja -> Urządzenia:
Jak widać, prócz temperatury i wilgotności mamy też stan baterii czujnika. To teraz zautomatyzujmy całość.
Najprostszą metodą automatycznego odczytywania danych z termometrów Xiaomi Mijia będzie użycie cron’a. który co jakiś, zdefiniowany czas będzie uruchamiał skrypt domoticz_mijia.py. W tym celu wpisujemy:
crontab -e
i dopisujemy czas co jaki ma się uruchamiać skrypt, oraz ścieżkę do niego. Ja wybrałem odpytywanie co 20 minut:
W zakładce Temperatura możemy zobaczyć nasze czujniki i ich statusy:
Po wciśnięciu Logi zobaczymy wykresy – dobowy, miesięczny i roczny:
Co nam daje pomiar temperatury? Po pierwsze możemy zoptymalizować ogrzewanie w mieszkaniu. Stosując urządzenia wykonawcze, np. głowice termostatyczne w grzejnikach, możemy utrzymywać stabilną temperaturę, bez niedogrzania i przegrzewania mieszkania. W bardziej rozbudowanych systemach można sterować kotłem, pompą ciepła czy wentylacją.
W kolejnej części opiszę jak podpiąć czujniki fizycznie do Raspberry i odczytywać ich wskazania przez Domoticz.
Przypominam też o pierwszym wpisie dotyczącym inteligentnego domu: Domoticz#1 – Instalacja na RPi.
Mega tanie, bezprzewodowe moduły Internet of Things na dobre zadomowiły się w naszych sieciach. Od…
Pewnie nie każdy posiadacz tytułowej stacji lutowniczej wie, że posiada ona możliwość aktualizacji firmware'u. Producent…
Jakiś czas temu, przeglądając Aliexpress natknąłem się na ciekawy shield do Arduino Nano. Według opisu…
W mailach i komentarzach kilka razy przewijała się prośba o ten wpis. Chodzi o aktualizację…
Dziś tematyka audio, a nawet audiofilska. Uznany wzmacniacz słuchawkowy Lehmann Black Cube Linear o dość…
Tradycyjnie w styczniu, publikuję podsumowanie minionego roku na stronie grylewicz.pl. Poniżej trochę liczb, lista najpopularniejszych…
Zobacz komentarze
Rozumiem, iż co 20 min pobierasz paczkę danych z 20 minut? Czy co 20 min jest dokonywany jeden pomiar?
Co 20 minut dokonywany jest jeden pomiar.
Witam, mam problem. niestety u mnie nie wszystko poszło dobrze. Mianowicie dane odczytuje prawidłowo, ale jest błąd i nie widzę nic w domoticzu. Poniżej wklejam jak to u mnie wygląda:
pi@raspberrypi:~/domoticz/scripts/python $ /usr/bin/python3 mijia-sensor-domoticz/domoticz_mijia.py
mijia-sensor-domoticz/domoticz_mijia.py:23: DeprecationWarning: encodestring() is a deprecated alias since 3.1, use encodebytes()
base64string = base64.encodestring(('%s:%s' % (domoticzusername, domoticzpassword)).encode()).decode().replace('\n', '')
1: updating
Mi Sensor: 58:2D:34:31:09:8B
Firmware: 00.00.66
Name: MJ_HT_V1
Temperature: 22.0°C
Humidity: 49.6%
Battery: 37%
http://127.0.0.1:8000/json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=22.0;49.6;1&battery=37
Traceback (most recent call last):
File "/usr/lib/python3.7/urllib/request.py", line 1317, in do_open
encode_chunked=req.has_header('Transfer-encoding'))
File "/usr/lib/python3.7/http/client.py", line 1244, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.7/http/client.py", line 1290, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.7/http/client.py", line 1239, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.7/http/client.py", line 1026, in _send_output
self.send(msg)
File "/usr/lib/python3.7/http/client.py", line 966, in send
self.connect()
File "/usr/lib/python3.7/http/client.py", line 938, in connect
(self.host,self.port), self.timeout, self.source_address)
File "/usr/lib/python3.7/socket.py", line 727, in create_connection
raise err
File "/usr/lib/python3.7/socket.py", line 716, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "mijia-sensor-domoticz/domoticz_mijia.py", line 92, in
update("58:2D:34:31:09:8B","12")
File "mijia-sensor-domoticz/domoticz_mijia.py", line 88, in update
domoticzrequest("http://" + domoticzserver + "/json.htm?type=command¶m=udevice&idx=" + idx_temp + "&nvalue=0&svalue=" + val_temp + ";" + val_hum + ";"+ val_comfort + "&battery=" + val_bat)
File "mijia-sensor-domoticz/domoticz_mijia.py", line 29, in domoticzrequest
response = urllib.request.urlopen(request)
File "/usr/lib/python3.7/urllib/request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.7/urllib/request.py", line 525, in open
response = self._open(req, data)
File "/usr/lib/python3.7/urllib/request.py", line 543, in _open
'_open', req)
File "/usr/lib/python3.7/urllib/request.py", line 503, in _call_chain
result = func(*args)
File "/usr/lib/python3.7/urllib/request.py", line 1345, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/lib/python3.7/urllib/request.py", line 1319, in do_open
raise URLError(err)
urllib.error.URLError:
Sprawdź czy w pliku domoticz_mijia.py wskazujesz właściwy adres:port domoticza w zmiennej domoticzserver
Dziękuję za pomoc. Nie wiem jak ja to zrobiłem, ale chyba ze 10 razy sprawdzałem czy wszystko jest ok i nie zauważyłem że port zły wpisałem. Jeszcze raz bardzo dziękuję wszystko teraz śmiga.
Witam,
Postąpiłem zgodnie z Pana tutorialem, ale po uruchomieniu skryptu otrzymuje komunikat
pi@raspberrypi:~/domoticz/scripts/python $ /usr/bin/python3 mijia-sensor-domoticz/domoticz_mijia.py
mijia-sensor-domoticz/domoticz_mijia.py:23: DeprecationWarning: encodestring() is a deprecated alias since 3.1, use encodebytes()
base64string = base64.encodestring(('%s:%s' % (domoticzusername, domoticzpassword)).encode()).decode().replace('\n', '')
1: updating
Characteristic Write Request failed: Attribute can't be written
Error reading value retry after 5 seconds...
Czujniki wykryte poprzez sudo hcitool lescan.
z góry dziękuję za pomoc
Posiadam czujnik LYWSD03MMC i widzę że ten skrypt z tym nie działa.
Właśnie miałem pytać, czy masz czujniki okrągłe, czy kwadratowe. Obsługę kwadratowych opiszę za jakiś czas. Na dniach pojawi się opis bramki DIY ZigBee do domoticza, dzięki której będzie można obsługiwać dziesiątki czujników.
Cześć, dzięki wielkie za ten poradnik. Szukałem tego od jakiegoś czasu :) Mam taki kłopot, RPi nie robi update automatycznie. Przy próbie wywołania skryptu ręcznie zamiast z crona dostaję
connect error: Device or resource busy (16)
connect error: Device or resource busy (16)
connect error: Device or resource busy (16)
connect error: Device or resource busy (16)
Error reading value retry after 5 seconds...
Nie wiem o co chodzi bo to wygląda jakby BT był cały czas zajęty? Będę wdzięczny za pomoc.
Małe uzupełnienie do mojego komentarza. Przy ręcznym uruchomieniu dostaję "DeprecationWarning: decodestring() is a deprecated alias since 3.1, use decodebytes()base64string = base64.encodestring(('%s:%s' % (domoticzusername, domoticzpassword)).encode()).decode().replace('\n', '')"
To jest ostrzeżenie dotyczące zmian w instrukcjach Pythona i na tą chwilę nie ma znaczenia. Używasz jeszcze do czegoś Bluetootha? Informacja "connect error: Device or resource busy (16)" nie pochodzi ze skryptu, jest generowana przez Raspbiana. Może masz uruchomione w innym procesie skanowanie urządzeń blutetooh? Po restarcie też to dostajesz?
@Wojtek,
Dzięki za odpowiedź. Robiłem wczoraj wieczorem kilka prób na tym skrypcie i finalnie wróciłem do wersji podstawowej.
Nie używam BT do niczego innego. Po restarcie RPi to również występowało. Spróbowałem zrobić update firmware czujników (3 szt.). Dziwne jest to że po update firmware i ponownym sprawdzeniu czy są dostępne nowe wersje w aplikacji Xiaomi Home i cały czas otrzymuję że jest dostępna nowa (ta sama!!!) aktualizacja.
Po tym jak zrestartowałem czujniki, RPi, i Domoticza oraz update firmware na 3 czujnikach po kolejno, udaje się pobierać cyklicznie dane z czujników.
Aby pozbyć się ostrzeżenia:
mijia-sensor-domoticz/domoticz_mijia.py:23: DeprecationWarning: encodestring() is a deprecated alias since 3.1, use encodebytes()
Zmieńcie w skrypcie linie zawierającą:
base64string = base64.encodestring
na
base64string = base64.encodebytes
Dokładnie, dzięki za opis.