Skalowanie systemu do sterowania automatyką domową - 🌉 most MQTT pomiędzy bramkami

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ń:

  1. Wydać mocniejszą wersję bramki (PRO - dla profesjonalistów) - skalować system pionowo.
  2. Łącznie bramek - skalować system poziomo.

image

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 :wink: 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 :bridge_at_night: 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

:construction_worker_man: 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ą :wink:
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ń! :tada:

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.

8 polubień

Super rozwiązanie - gratuluję pomysłu. Poprawcie tylko w cytowanym tekście nr IP, bo w dalszej części posta wpisujecie IP 192.168.6.220

1 polubienie

dzięki, miło wiedzieć, że ktoś przeczytał i to dokładnie :slight_smile:
już poprawione :+1:

Ktoś już próbował zrobić mostek Jolki z HA na innej maszynie?

2 polubienia

Taaaaa z HA
dodajesz do pliku:
# Most do AIS dom 2
connection most-do-HA
address 192.168.1.100:1883

remote_clientid homeassistant
remote_username Login
remote_password Hasło
topic # in 0
topic # out 0

Login i Hasło to dane do logowania do HA
IP oczywiście naszego HA

4 polubienia

Zrobiłem mostek z Jolki do HA, pokazały się wszystkie urządzenia z Tasmotą.
Na HA mogę odczytywać np. temperaturę, zasięg ale nie mogę przełączać switch/light.
Przełącznik zmienia na chwile stan ale zaraz wraca na OFF i nie zapala się światło.
Też tak masz?

Mam to samo. Myślałem, że coś namieszałem i nie chciało mi się już z tym bawić, ale wygląda, że coś nie tak mamy w configu. @jolka pomożesz?

A w drugą stronę czyli z HA na AIS próbowałeś?

@Cino111, @Tomasz - czy coś się zmieniło w kwestii komunikacji pomiędzy HA? Jest sens stawiać most?

To musi działać, tylko nie chciało nam się posiedzieć. Powiem tak - właśnie wczoraj postawiłem Mosquitoo na synology i jakoś na dniach będę się zabierał za most. Tym razem musi się udać :slight_smile:
Prawdopodobnie w HA był inny prefix, albo topic. Trzeba na spokojnie usiąść i porównać konfiguracje na obu brokerach. Przy połączeniu 2 bramek AIS zapewne nie ma problemu bo mają identyczne konfiguracje.

1 polubienie

Mam postawionego drugiego brokera MQTT na NUCu. Wszystko śmiga.

Zmieniałeś konfigurację na brokerze na NUCu, czy tylko wprowadzałeś wpis odnośnie mostu w konfiguracji brokera na IAS?

Wpis w AIS że chce synchro w obu kierunkach (topic both 0)

Szkoda że kiedyś nie było takiej opcji zakupu

Bo dziś zauważyłem że nowsza wersja bramki dev By na allegro i jest lepsza od poprzedniej bez bluetooth bo ma opcję wifi 2,4 i 5 GHz oraz jest w wariancie 2/16 w przeciwieństwie do poprzedniej wersji 1/8 i z wifi tylko 2,4 GHz jak dev1

Słuchajcie - czy mogę do jednego brokera mqtt podpiąć kilka instancji HA? Brokera mam na Synology i podpiętą do niego Jolkę. Mam testowy HA na wirtualce też na Synology i tak się właśnie zastanawiam, czy podpinając HA nie będzie to stwarzało problemu?

Hej, możesz i nie będzie to problem. Każdy HA jest takim samym klientem MQTT jak gniazdko czy przełącznik.
Każdy klient MQTT subskrybuje(nasłuchuje) tematy i publikuje wiadomości na jakimś temacie.
Jedyna różnica pomiędzy gniazdkiem a HA jest taka że gniazdko subskrybuje tylko jeden temat a HA wszystkie. Ale dla brokera MQTT to nie problem

2 polubienia

Hmmm.
Taki wpis mam w Jolce i taki sam wpisałem do testowego HA.

mqtt:
  broker: 192.168.1.80
  port: 1883
  client_id: home-assistant
  discovery: true
  discovery_prefix: homeassistant
  birth_message:
   topic: "tele/hass1/LWT"
   payload: "Online"
   qos: 1
   retain: true
  will_message:
   topic: "tele/hass1/LWT"
   payload: "Offline"
   qos: 1
   retain: true

W Jolce i w HA wszystkie urządzenia które komunikują się po mqtt sekundę są a kolejną sekundę niedostępny i tak cały czas. Tak ja by w jednej sekundzie dane idą do HA a w drugiej do Jolki. :thinking:

Pierwsze co rzuciło mi się w oczy to czy zmieniłeś client_id dla drugiej instancji?

2 polubienia

I tu mnie masz :shushing_face:
Teraz działa.

2 polubienia

Również chciałbym połączyć AIS z HA, czy mogę całą konfigurację mieć na HA, a AIS dołączyć tylko do sterowania głosowego i multimediów?

Czy zadziała połączenie między ASI a HA poprzez Remote Home-Assistant