Mateusz Mazurek – programista z pasją

Blog o Pythonie i kilku innych technologiach. Od developera dla wszystkich.

Smart-Home-Illustration
Felietony/inne Inne

Jak samemu zrobiłem sobie SmartHome?

Cześć,

jakiś czas temu chwaliłem się na Instagramie swoimi osiągnięciami w temacie inteligentnego domu. Wywiązało się z tego kilkanaście ciekawych rozmów, które pokazały, że nie tylko mnie ten temat interesuje. Obiecałem sobie, że jak już potwierdzę stabilność mojej sieci, to napiszę artykuł o tym, co zrobiłem, jak i po co. Właśnie wywiązuję się z tej obietnicy, aapraszam.

Jak to się zaczęło?

Wszystko zaczęło się od remontu mieszkania. Projekt zakładał zabudowę grzejnika, ale drobna zmiana (pomyłka?) sprawiła, że grzejnik prawie w całości znalazł się za panelami stanowiącymi oparciem łóżka i pod półką na książki. Udało się to nieco poprawić, wykonując otwory umożliwiające oddawanie ciepła udało się. Niestety dostęp do termostatu wciąż był ograniczony. Problemem był głównie fakt, że zabudowany termostat ma cieplej niż jest faktycznie w pokoju, grzeje się, co powoduje złe odczyty temperatury i w efekcie szybsze zakręcanie zaworu przez co w pokoju było zimno. Zacząłem szukać sposobu na rozwiązanie tego problemu. Możliwości jest kilka, najciekawsze wydawało mi się podejście z wymianą termostatu na jego inteligentny odpowiednik. Zakupiłem więc zestaw podobny do tego:

Zainstalowałem głowicę przy kaloryferach, a na telefon ściągnąłem aplikacje Tuya Smart Life. W aplikacji połączyłem się z centralą, połączyłem ją z WiFi i sparowałem z termostatem. To umożliwiło mi przekalibrowanie odczytu. Mogłem cieszyć się zdalnie sterowanym termostatem!

Wraz z biegiem czasu okazało się, że świat IoT posiada naprawdę fajnie urządzenia, jak np. żarówki w których możesz zmienić kolor czy natężenie światła. Uważam, że to super sprawa, np. czytając wolę inna barwę światła od tej, którą mam pracując. Do tego jakieś czujniki temperatury, listwa ledowa czy w końcu robot sprzątający.

Brzmi fajnie, ale nie wszystko jest takie bezproblemowe. Każde urządzenie ma swojego producenta i każdy producent dostarcza aplikację do sterowania tymi urządzeniami. Do tego w aplikacjach można tworzyć automatyzacje typu „gdy telefon znajdzie się poza ustalonym położeniem GPS, to zmniejsz docelową temperaturę na termostacie”. Ale nie można łączyć w ten sposób ze sobą urządzeń różnych producentów. Ponadto, każdy producent zbiera na swoich serwerach dane z tych urządzeń, a trochę to dziwne, że jakaś chińska korporacja wie, kiedy jesteś w domu a kiedy nie.

Postanowiłem więc zrobić rewolucję!

Ale zanim nastąpi rewolucja, trochę teorii

Zacznijmy od tego, jak to wszystko działa. Wcześniej wspomniałem, że zamówiłem centralę i termostat. Termostat łączy się z centralą po protokole o nazwie zigbee. Zigbee to lekki protokół bezprzewodowy, idealnie nadający się do IoT. Z Wifi ma tylko tyle wspólnego, że i jeden i drugi jako medium transmisyjne wykorzystują fale radiowe. Centrala łączy się z telefonem (albo przez WiFi bezpośrednio albo przez API konkretnego producenta, nie badałem zbyt dogłębnie), który przez aplikacje pozwala sterować termostatem, wysyłając i odbierając komunikaty z centrali. Czyli gdy na telefonie kliknąłem „zakręć zawór”, to aplikacja wygenerowała specjalny komunikat, który poszedł do centrali, a ona przesłała go do termostatu. Jak widzisz, jest tu pewna translacja protokołów. Centrala zamienia komunikaty z termostatu (np. „wykryłem otwarcie okna, zakręcam zawór”) które przychodzą do niej po protokole zigbee na dane, które potem możesz odczytać w aplikacji. Odwrotnie zachodzi podobny proces tłumaczenia.

No dobra, ale co daje mi wiedza o tym jak to działa?

Moja mała rewolucja miała przede wszystkim pozwolić mi uniezależnić się od konkretnych producentów, tak by bez przeszkód móc łączyć ze sobą różne urządzenia, a tym samym oszczędzać – bo np. włączniki jednego producenta są tańsze od innego. Jak widać po opisie wyżej, każdy producent wykorzystuje dobrze znane protokoły, opakowując je dodatkowymi zabezpieczeniami i sprzedając pod własną marką. Nic w tym złego. Ale daje nam to pewne pole do popisu. No bo skoro komunikacja pomiędzy termostatem a centralą jest po protokole zigbee, to co by się stało, gdyby centrala nie miała opakowania konkretnego producenta?

Początek rewolucji

Zacząłem zgłębiać temat dalej i okazało się, że jest sposób by zamiast bramek (to znacznie lepsza nazwa niż „centrala”, więc od teraz będę jej używał) producenta stworzyć własną bramkę i z wykorzystaniem rozwiązań opensource móc sterować urządzeniami sparowanymi z tą bramką.

Aby móc to zrobić, kupiłem:

  • Raspberry 4
  • Stick USB CC2531 z antenką (co się potem okazało słabym wyborem!)
  • Kartę SD 32GB
  • Kabel hdmi -> minihdmi
  • Czytnik kart SD (do wgrania na nią systemu, w laptopie nie miałem)

Koszt całości to okolice 800zł.

Raspberry ze stickiem CC2531

Kartę SD włożyłem do Rasbberry, kablem podłączyłem go do monitora i zainstalowałem system (jakaś dedykowana dystrybucja Debiana). Skonfigurowałem ssh i VPNa (TailScale), odciąłem dostęp z zewnątrz i na koniec zainstalowałem aplikację HomeAssistant (supervised).

HomeAssistant

HomeAssistant to wolnoźródłowa aplikacja do zarządzania smarthome’em. Co ciekawe – napisana w Pythonie. Pozwala ona, przy pomocy kilku pluginów i tego sticka CC2531, stworzyć sieć Zigbee. Technologicznie sieć Zigbee obsługuje trzy typy urządzeń:

  • koordynator – jeden na sieć, do niego parują się nowe urządzenia
  • router – urządzenie podłączone na stałe do gniazdka. Poza tym, że działa zgodnie z głównym przeznaczeniem (czyli jeśli to byłby termometr to mierzyłby temperaturę), to jeszcze pozwala rozszerzać zasięg sieci, którą tworzy koordynator. Po prostu te urządzenia, które będą miały lepszą jakość połączenia z routerem niż z koordynatorem, będą wysyłały dane przez router, a ten dostarczy je do koordynatora.
  • urządzenie końcowe – zasilane baterią. Łączy się do routera lub koordynatora. Nie rozszerza zasięgu sieci.

Sytuacja z samego początku artykułu, ta z termostatem i centralą, to po prostu kooordynator (czyli centrala) i urządzenie końcowe (czyli termostat).

Moja mała rewolucja po prostu (albo aż!) wymieniła koordynatora. Z tego dedykowanego dla urządzeń konkretnego producenta na własnego.

Żeby HomeAssistant mógł zacząć zarządzać siecią Zigbee musi mieć doinstalowane dwa pluginy:

  • Zigbee2mqtt
  • Mosquitto broker

Pierwszy z nich łączy się do tego sticka CC2531 i zczytuje dane, które po protokole zigbee wysyłają do niego urządzenia i zgodnie z nazwą zamienia je na protokół MQTT. MQTT to protokół typu publish-subscribe, gdzie jego klienci subskrybują się na konkretne kanały i odbierają z nich wiadomości albo analogicznie – wysyłają wiadomości na konkretne kanały.

Natomiast Mosquitto broker to po prostu implementacja tego protokołu. Czyli aplikacja, która faktycznie przerzuca te wiadomości.

Całość działa dość prosto, są możliwe dwa scenariusze:

  • termostat wysyła informację np. „wykryłem otwarcie okna, zakręcam zawór”. Wiadomość odbiera stick CC2531. Z niego wiadomość odczytuje wtyczka zigbee2mqtt i wysyła do Mosquitto protokołem MQTT na konkretny kanał. Z tego kanału czyta HomeAssistant i prezentuje nam informacje „hej, termostat zamknął zawór!”
  • w HomeAssistant klikasz „ustaw temperaturę docelową na 21 stopni”. HomeAssistant wysyła wiadomość na Mosquitto protokołem MQTT. Wiadomość odbiera wtyczka zigbee2mqtt i tłumaczy ją na zigbee, wysyła ja do sticka CC2531, a ta już fizycznie wysyła je do urządzenia, urządzenie ją odbiera i ustawia zadaną temperaturę.

Nie daję tutoriala jak wszystko skonfigurować, bo jest w ich w Internecie mnóstwo.

Nie ma, że łatwo, czyli początek problemów

Sama konfiguracja wszystkiego przeszła bez większych problemów. Niestety sam stick USB CC2531 okazał się po pierwsze bardzo awaryjny, a po drugie nie był w stanie pokryć zasięgiem mojego mieszkania. Tego drugiego problemu się nie spodziewałem, bo mieszkanko jest małe. Uzbrojony w wiedzę o tym, że urządzenia, które są na stałe podłączone do prądu, zwiększają zasięg sieci, kupiłem czujnik jakości powietrza. Po sparowaniu go z centralą sieć faktycznie się przekonfigurowała i było widać, że te urządzenia, które są bliżej routera niż koonrdynatora, łączą się do niego, przez router. Nie udało mi się jednak poprawić stabilności CC2531.

Kolejnym problemem, już po dołączeniu routera była obsługa jednego z termostatów. Nagminnie pojawiały się w logach błędy MAC transaction expired (240) lub No network route (205), a sama manipulacja ustawieniami termostatu nie działała. Odkrycie, gdzie leży problem zajęło mi sporo czasu. Wyszedłem z założenia, że skoro termostat działa z aplikacja od Tuya, to znaczy, że problem nie leży w termostacie, a sam HomeAssistant wskazywał wysoką jakość połączenia. Zacząłem ostry debug. Podglądałem co dokładnie stick wysyła i odbiera z CC2531. Po kilku godzinach, okazało się, że stick wysyła poprawnie żądanie zmiany stanu urządzenia, ale nie otrzymuje potwierdzenia owej zmiany. Czyli wykluczyliśmy też problem ze stickiem. Kolejnym osiągnięciem było udowodnienie, że komunikacja z termostatem szwankuje tylko w jednym kierunku. Tzn. ja nie mogę nic na nim zmienić, ale on mi swoje zmiany (tzn. odczyt temperatury) wysyła bez problemów. To rzuciło cień na router. Wcześniej nie był podejrzany, ze względu na wysoką jakość połączenia i fakt, że poza termostatem również termometr łączył się tym routerem. Przy czym termometr z założenia nie ma komunikacji „do niego”, no bo co niby zmieniać na termometrze? Zacząłem dłubać dalej i odkryłem, że router zachowuje się zupełnie inaczej niż wszystkie inne urządzenia – zmianę swojego stanu wysyła bardzo często – co najmniej kilka razy na sekundę. Usunąłem router z sieci, przeniosłem termostat bliżej CC2531 i bingo – działa bez problemów!

Pozbyłem się więc tego czujnika jakości powietrza, ale pozostał problem z zasięgiem CC2531. Postanowiłem, że wymienię go na nowszy (i trzykrotnie droższy) model czyli na CC2652P. Jest on dokładnie tym samym co CC2531, ale jest znacznie stabilniejszy i ma większy zasięg. To okazało się strzałem w dziesiątkę. Teraz koordynator pokrywa zasięgiem cały dom. Odsunąłem go też przedłużaczem USB od samego Raspberry, co powinno zmniejszyć ewentualnie zakłócenia pomiędzy Zigbee a WiFi. Zasięg to kolumna LQI i im wartość większa, tym lepiej:

Streściłem te problemy w trzech akapitach, ale niech to Cie nie zwiedzie – łatwo nie było.

Nie każde smart urządzenie działa po Zigbee

Podczas pracy nad zwiększeniem inteligencji mojego domu, okazało się, że część moich urządzeń wcale nie wykorzystuje Zigbee. Dotyczy to przede wszystkim oświetlenia i odkurzacza. One działają po WiFi. I to był kolejny ogromny problem. Zacznijmy od żarówek. Skoro nie działają ono po Zigbee, to integracje HomeAssistanta z nimi nie dotyka CC2652P. W teorii Raspberry jest podłączony do tej samej sieci co owe urządzenia, więc powinno udać się je zintegrować. I udało się, ale… To nie było proste. Po pierwsze, protokół Zigbee implementuje tzw. interview, czyli mechanizm w którym urządzenia parując się z koordynatorem, przedstawiają mu się, mówiąc mu jakim są urządzeniem i jakiego elementy można modyfikować. Przy WiFi tego nie mamy.

Pierwsza próba integracji HomeAssistanta z oświetleniem Tuya była przez wtyczkę, która po prostu wysyła żądania do API Tuya, a bliżej nieokreślony serwer Tuya włączał oświetlenie. Żeby absurd sytuacji był jasny: z mojego domu szło żądanie do Chin po to, by Chiny wysłały żądanie do oświetlenia, które jest u mnie w domu, powodujące zapalenie się żarówki. Działa, ale może można szybciej? I bez wysyłania żądania w świat? Można, ale to sprawia więcej trudności.

Trzeba użyć innej wtyczki, a dokładniej wtyczki LocalTuya, która umie wykryć adresy IP urządzeń w sieci. Ale żeby poprawnie skonfigurować całość musisz wiedzieć jaki lokalny adres IP ma Twoja żarówka. Pomijając śmieszność tego zdania, odpowiedź znajdziesz przez… API Chińskiego giganta. Musisz wysłać konkretne żądanie, żeby Tuya Ci odpowiedziała, jakie IP ma Twoja żarówka. Dodatkowo musisz wygrzebać z ich API informacje o kluczach zabezpieczających (nie pamiętam, co to były za klucze ale chyba localKey i deviceKey) i je również wkleić w konfigurację LocalTuya. Ale to nie koniec problemów. Bo o ile możesz po prostu wskazać, że pod tym IP leży żarówka to przecież wtyczka nie wie co ta żarówka potrafi. Tzn, że nie wie czy można ją ściemniać czy można zmienić kolor, czy może migać i tak dalej. Musisz to jej powiedzieć. I tutaj to już totalny rollercoaster. Na szczęście oryginalnych smart urządzeń jest ograniczona liczba, a większość to kopia kopii kopii. Przeszukując internet łatwo znaleźć wpisy ludzi, któryz dzielą się konfiguracją swoich żarówek. Pozostaje więc wyszukiwać, wprowadzać w LocalTuya i sprawdzać czy jest ok. U mnie się udało za chyba 6tym razem. A cierpliwość już traciłem.

Na szczęście odkurzacz od Xioami szybko udało się zintegrować poprzez wtyczkę Xioami Miot. Podobnie trzeba było wyszukać klucze zabezpieczające, ale reszta poszła praktycznie sama.

I znów – nie daję tutoriali, bo jest tego mnóstwo w Internecie.

Automatyzacje

Teraz mam działającego HomeAssistanta który pozwala w pełni sterować zarówno urządzaniami Zigbee jak i WiFi. W sklepie Play jest aplikacja która po wprowadzeniu adresu HomeAssistanta pozwala nam sterować domem z telefonu. Oczywiście u mnie potrzebna jest jeszcze druga aplikacja, żeby włączyć na telefonie VPNa.

Siłą połączenia wszystkiego w jednym miejscu jest możliwość tworzenia automatyzacji. Np. co 10 minut zczytuję z termometrów temperaturę, następnie zczytuję ją również z termostatów i koryguję odczyt termostatu o wskazania z termometru. Dzięki czemu fakt, że mam zabudowany termostat przestał mieć znacznie – bo efektywna temperaturę i tak ma z termometrów. Super sprawa. Tak samo jak automatyczne zmniejszanie temperatury docelowej na noc i zwiększanie w dzień. Poluję również na sterownik do rolet, co pozwoli mi automatycznie odsłaniać okna. Automatyzacje praktycznie dają nieskończenie wiele możliwości – jedynym ograniczeniem jest wyobraźnia.

Efekt końcowy

Wszystko działa i jestem z efektu bardzo zadowolony. Zrobiłem sobie małe centrum sterowania:

HomeAssistant dostarcza pełną historię zmian jakie wprowadza, a także rysuje ładne wykresiki, które pozwalają na obserwację zachowania urządzeń, np dla temperatury konkretnego termometru:

Czy było warto?

Było! Pracy i pieniędzy poszło sporo, ale:

  • nauczyłem się naprawdę bardzo dużo. Wystarczająco dużo by dołożyć do tego systemu praktycznie każde urządzenie,
  • oderwałem się całkowicie od chmury, smarthome zaczyna się w domu i kończy się w domu, żaden chiński serwer nic już się o mnie nie dowie,
  • oderwałem się od konkretnego producenta – czyli nie jestem związany z żadną marką,
  • Raspberry może to i spora inwestycja, ale może służyć nie tylko jako host dla HomeAssistanta.

Osobiście – polecam!

Jeśli masz jakieś przemyślenia, pytania czy wątpliwości to zostaw komentarz. Odpowiem najlepiej jak będę umiał.

Dzięki za wizytę,
Mateusz Mazurek

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

18 komentarzy
Inline Feedbacks
View all comments
SpeX

Też się przymierzam to postawienia HA. Wszystkie części są, czekają na półce. Tylko czasu brakowało, więc może teraz w czasie przerwy świątecznej uda mi się postawić HA.

Krzysiek

Hej, dzięki za wpis :) U siebie planuję niemal dokładnie to samo i też niestety kupiłem CC2531… Chyba sprzedam i zamówię tego lepszego sticka, oszczędzę sobie trochę nerwów.

D74

Zamiast RPi4 -> Terminal Dell Wyse + SSD, zamiast CC2531 -> Sonoff ZBDongle-P (CC2652P) i zestaw działa znacznie stabilniej.

Adam

Hej. Jestem pod wrażeniem. Też chciałem u siebie kiedyś coś podobnego zrobić, ale na razie skończyło się na kilku sprzętach ogarnianych przez apkę MiHome.
Czy ta konfiguracja pójdzie na słabszej malince? Trochę szkoda mi inwestować w czwórkę a mam akurat wolną dwójkę. Co do sprzętów na wifi – wiesz może czy malinka musi mieć wifi żeby je obsłużyć? Nie wystarczy podłączenie kablem do routera i wspólna podsieć?

Bartek

Jak rozwiązałeś problem tego, że smart żarówka nie może tracić zasilania? Zmieniałeś łączniki na ścianie, czy jakoś inaczej rozwiązałeś ten problem?

Michał

Hej,
I ja zaczynam przygodę z iot:) czekam na bramkę i inteligentne gniazdko na początek. Mam też RPi, które chce potem wykorzystać ale zastanawiam się nad wyborem softu. i tu pytanie do Ciebie, dlaczego wybrałeś akurat HA ? a nie na przykład domoticz ? Widziałem przerobiony obraz (smarticz) ze wszystkimi potrzebnymi pakietami.

Ala

Ale czad! Gratuluję pomysłowości i nieustępowania w działaniu

Konrad

Dodam taki mały komentarz, że RaspberryPi kompletnie nie nadaje się jako system do HomeAssistant, z tego powodu, że karty microSD są tutaj najsłabszym punktem, wiem, że fajnie zacząć stawianie HA na malince, ale w przyszłości sam żałowałem tej decyzji. Imho leiej kupić jakiś tani terminal (tanszy w sumie od malinki :D) (coś w tym stylu: Terminal HP T620 Thin Client 4GB 16GB M.2 Zasilacz). Znam dużo przypadków jak cały system HA szlag trafił przez karty SD, nie wytrzymują dużej ilości zapisów i są strasznie mało pewne ;) BTW: sam się jeszcze nei przepiąłem na taki terminal ale planuje zrobić taką… Czytaj więcej »

Sebastian

Żeby unikać wysyłania danych na obce serwery warto wybierać takie urządzenia końcowe aby była w nich możliwość zmiany firmware na Tasmotę albo ESPHome.