Opis ten ma na celu pokazać, w jaki sposób możemy radzić sobie z rosnącą ilością urządzeń w naszym domu i jak możemy skalować system.
Motywacją do tego posta jest e-mail od naszego klienta, który podłączył do bramki, cytuje:
“po wifi ok. 80 urządzeń ( w tym proste sonoff do świateł), Zigbee 60 urządzeń - czujniki +światła, monitoring 6 kamer, multimedia po IR i RF 5 pomieszczeń”
Przy tej ilości urządzeń Klient zauważył spowolnienie systemu na bramce i zapytał nas, czy mamy w ofercie mocniejszy sprzęt, np. NUC Intela.
W którą stronę skalować?
Dało nam to do myślenia i doszliśmy do wniosku, że mamy dwa sposoby na rozwiązanie problemu ze skalowaniem systemu i obsługą wiekszej ilości urządzeń:
- Wydać mocniejszą wersję bramki (PRO - dla profesjonalistów) - skalować system pionowo.
- Łącznie bramek - skalować system poziomo.
Jak widać na powyższej grafice → skalowanie pionowe (scale-up)/ w górę / wertykalne to po prostu wymiana urządzenia na “większe”.
Przy modelu skalowalności poziomej (scale-out) / w bok / horyzontalnie nie trzeba wymieniać urządzeń na nowe, a rozwój systemu odbywa się przez dodawanie kolejnych urządzeń.
Łączenie urządzeń - skalowanie poziome
W tym poście będzie o tym jak wykonać skalowanie poziome - most mqtt (mqtt bridge) pomiędzy bramkami AIS dom.
W ten sposób możemy wykonać coś w rodzaju sieci mesh. W tym poście opiszemy krok po kroku, jak połączyć dwie instancje (podwoić ilość obsługiwanych urządzeń) i osiągnąć następujący scenariusz:
Dlaczego poziomo?
Łatwo dojść do wniosku, że nasze poziome skalowanie ma pewnie na celu sprzedanie większej ilości bramek ktoś pewnie dojdzie do wniosku, że lepiej jest kupić jedno urządzenie typu Intel NUC które ogarnie wszystko.
Każdy ma swoją ekonomię i wybiera najlepsze dla siebie rozwiązanie. Faktycznie łatwiej się sprzedaje urządzenie za 200 zł niż za 2000 i ekonomia jest jednym z powodów naszego modelu skalowania.
Inny powód to produkt, nad którym pracujemy - inteligentny głośnik. Docelowo łączenie instancji Asystenta domowego będzie wyglądało tak:
Oczywiście w ten sam sposób można wykonać most pomiędzy bramką AIS dom a dowolną inną instancją Home Assistant działającą na dowolnej maszynie (nie musi to być bramka AIS dom).
MQTT broker
Na każdej bramce działa broker MQTT Mosquitto. Broker ten pełni rolę serwera dla urządzeń/klientów, urządzenia za pośrednictwem brokera publikują informacje do systemu Asystent domowy i odbierają komunikaty sterujące z systemu.
Mosquitto to mały, lekki, otwarty broker MQTT napisany w języku C / C ++. Dostarczamy najnowszą wersję Mosquitto, która w pełni obsługuje protokoły MQTT w wersji 5.0 i 3.1.1.
MQTT bridge
Broker Mosquiito na bramce można skonfigurować do pracy jako most MQTT.
Most pozwala połączyć ze sobą brokery MQTT co pozwala na udostępnianie wiadomości między systemami.
Istotne jest to, że po skonfigurowaniu brokera Mosquitto jako mostu stanie się on klientem MQTT w drugim brokerze. Klient ten będzie publikował i odbierał komunikaty do wszystkich urządzeń które ma dołączone. Czyli drugiemu brokerowi (bramce 2) doszedł tylko jeden klient, a może znać status i sterować wszystkimi urządzeniami dołączonymi do innego brokera (bramki 1).
Pokaż mi kod
Na tę chwilę konfiguracja mostu wymaga dodania odpowiednich wpisów do konfiguracji brokera MQTT na bramce. Czyli tylko bardziej zaawansowani użytkownicy są w stanie to wykonać. Ale jeżeli ktoś podłączył kilkadziesiąt urządzeń po wifi i zigbee to poradzi sobie z taką konfiguracją
W przyszłości dodamy możliwość łączenia bramek z interfejsu użytkownika.
Konfiguracja brokera mqtt na bramce jest dostępna w pliku:
/data/data/pl.sviete.dom/files/usr/etc/mosquitto/mosquitto.conf
Zakładając, że nasza brmka AIS dom 1
ma adres IP: 192.168.6.100
a bramka AIS dom 2
ma adres IP: 192.168.6.220
to żeby uruchomić most pomiędzy tymi bramkami wykonujemy:
- uruchamiamy konsole na bramce
AIS dom 1
- otwieramy do edycji plik
/data/data/pl.sviete.dom/files/usr/etc/mosquitto/mosquitto.conf
nano /data/data/pl.sviete.dom/files/usr/etc/mosquitto/mosquitto.conf
- do mosquitto.conf dodajemy taką konfigurację
# Most do AIS dom 2
connection most-do-bramki-2
address 192.168.6.220:1883
remote_clientid bramka-ais-dom-1
topic # in 0
topic # out 0
i to już wszystko.
Wyjaśnijmy cała konfigurację linijka po linijce:
-
connection most-do-bramki-2
to jest nazwa połączenia pomiędzy bramkami -
address 192.168.6.220:1883
tu podajemy adres do brokera mqtt z którym chcemy się połączyć -
remote_clientid bramka-ais-dom-1
to unikalna nazwa naszego klienta który pojawi się w brokerze na bramce 2 -
topic # in 0
tu deklarujemy, że chcemy subskrybować (in) wszystkie (#) wiadomości z brokera na bramce 2 i że chcemy je otrzymywać co najwyżej raz (0) -
topic # out 0
tu deklarujemy, że chcemy publikować (out) wszystkie (#) wiadomości z brokera na bramce 2 i że chcemy je publikować co najwyżej raz (0)
Na koniec zapisujemy plik i restartujemy usługę mqtt
pm2 restart mqtt
To wszystko, urządzenia komunikujące się po mqtt z bramki ais dom 1 pojawią się na na bramce ais dom 2 i odwrotnie. Oczywiście przy odpowiedniej konfiguracji topic
możemy określać jaki komunikaty chcemy otrzymywać a jakie publikować. Pokażemy to w kolejnym przykładzie w którym opiszemy jak sterować milionem urządzeń!
Co z urządzeniami które nie komunikują się po MQTT?
Dodatkowo możemy włączyć na bramce publikowanie zdarzeń:
oraz publikowanie statusów:
Natępnie te dane zostaną przekazane za pomocą mostu mqtt do innych bramek. W ten sposób możemy przekazać status i sterowanie do dowolnego urządzenia (komunikującym się dowolnym protokołem) z bramki X do innych bramek.