Celem tego wpisu jest pokazanie na przykładzie w jaki sposób możemy wyskalować nasz system automatyki do obsługi ogromnej ilość urządzeń.
Zrobimy to na przykładzie trzech bramek połączonych do jednego brokera MQTT za pomocą mostu i komunikujących się ze sobą przez ten broker.
We wcześniejszym wpisie, opisaliśmy jak działa most pomiędzy brokerami MQTT i w jaki sposób możemy połączyć bramki i wykonać przepływ wiadomości pomiędzy nimi.
W tym opisie pójdziemy krok dalej i pokażemy jak rozszerzyć tą koncepcje na dużą skalę… tak dużą jak robi to Tuya czy Sonoff.
Na przykładzie pokażemy jak połączyć urządzenia z 3 bramek przez broker MQTT za pomocą mostów (mqtt bridge).
Broker MQTT na bramce AIS dom
Na naszej bramce dostarczamy lekki i kompaktowy broker MQTT Mosquitto, może on działać na dowolnym mikrokontrolerze bo ma bardzo małe wymagania odnośnie zasobów (nie wymaga mocy serwera). Taki broker to dobry wybór do komunikacji z urządzeniami brzegowymi/końcowymi w naszym domu. Wiadomości pomiędzy urządzeniami są przekazywane i przetwarzane lokalnie bez przekazywania do chmury. Działa to mniej więcej tak:
Jak to robią inni
Tuya też używa do komunikacji z urządzeniami brokera MQTT, z tą tylko różnicą, że ich broker jest umieszczony w klastrze serwerów w chmurze i potrafi obsłużyć 10 milionów podłączonych urządzeń.
Czyli Tuya cloud to taka wspólna bramka MQTT dla milionów klientów, która wymaga sporo serwerów, sieci i prądu. Nikt by nie chciał płacić ich rachunku za serwery w AWS
Istotne jest to, że mechanizm jest dokładnie taki sam, że używamy standardów w IoT… i że można taką architekturę skalować.
Opis koncepcji
Użyjemy brokera MQTT EMQ X (tak jak Tuya) do którego połączmy bramki AIS dom (brokery Mosquitto) za pomocą MQTT bridge , aby przekazywać wszystkie wiadomości na serwer EMQ i odbierać wiadomości sterujące z serwera EMQ X.
Instalacja brokera EMQ X
EMQ X jest otwarty i dostępny na Github, można go instalować na wielu platformach, sposób instalacji zależy od platformy systemowej i nie będziemy go opisywać
więcej o EMQ X na stronie producenta
Logowanie do EMQ Dashboard
Po instalacji możemy zalogować się do panelu sterowania brokerem EMQ X.
Jeżeli zainstalowaliśmy EMQ X na komputerze PC to panel sterowania będzie dostępny pod adresem http://127.0.0.1:18083 domyślny login to admin
a hasło public
Po zalogowaniu można rozpocząć korzystanie z panelu sterowania EMQ X. Pierwszą rzeczą, którą zobaczysz, jest przegląd konsoli EMQ X. Na tej stronie wyświetlane są informacje o systemie, informacje o dołączonych węzłach, statystyki itp.
Niektóre parametry brokera można skonfigurować z panelu sterowania ale większość wymaga edycji plików konfiguracyjnych. Dla naszego prostego przykładu zrobimy wszystko z poziomu panelu sterowania.
Włączenie autentykacji dla klientów MQTT
Ponieważ broker MQTT w chmurze obsługuje miliony klientów, a nie tylko urządzenia w naszej sieci domowej dlatego dodamy autentykację klientów MQTT. Możemy to wykonać z poziomu aplikacji, włączając odpowiednią wtyczkę do autentykacji. W naszym przykładzie włączmy autentykację przy pomocy nazwy użytkownika i hasła.
po włączeniu wtyczki emqx_auth_username
możemy skonfigurować login i hasło dla klienta mqtt (bramki ais dom):
Połączenie bramki AIS dom do EMQ X
We wcześniejszym wpisie, opisaliśmy jak działa most pomiędzy brokerami MQTT i w jaki sposób możemy połączyć bramki i wykonać przepływ wiadomości pomiędzy nimi.
Tu wykorzystamy dokładnie ten sam mechanizm tyle tylko, że podłączymy nasze bramki AIS dom przez brokera EMQ X (a nie bezpośrednio pomiędzy sobą).
W tym celu edytujemy konfigurację brokera MQTT na bramce która znajduje się w pliku:
nano /data/data/pl.sviete.dom/files/usr/etc/mosquitto/mosquitto.conf
i dodajemy tam połączenie mostkowe do brokera EMQ X, zakładając, że nasz broker EMQ X ma IP: 144.144.144.144 tak konfiguracja będzie wyglądała następująco:
# External EMQ X MQTT Broker
connection bramka-jolka-1
address 144.144.144.144:1883
bridge_protocol_version mqttv311
remote_clientid bramka-jolka-01
remote_username dom-jolka
remote_password sekret123
topic homeassistant/# in 0
topic zigbee2mqtt/# in 0
topic +/tele/# in 0
topic dom/cmnd/# out 0
topic cmnd/# out 0
topic +/cmnd/# out 0
topic zigbee2mqtt/# out 0
topic homeassistant/# out 0
taką samą konfigurację dodajemy do innych naszych bramek, jedyne co musimy zmienić do remote_clientid
bo identyfikator klienta musi być unikalny:
remote_clientid bramka-jolka-02
i analogicznie
remote_clientid bramka-jolka-03
w efekcie otrzymamy 3 bramki podłączone do zewnętrznego brokera MQTT
bramki te wymieniają się pomiędzy sobą komunikatami zgodnie z ustawieniami tematów → wpisy topic
. Istotne są tu dwie rzeczy:
-
Nie wszystkie wiadomości pobieramy ale tylko te które chcemy wymieniać z innymi bramkami.
dzięki tej przykładowej konfiguracji urządzenie dodane do jednej bramki pojawi się także na dwóch pozostałych i oczywiście będziemy widzieli jego status oraz będziemy mogli nim sterować z każdej naszej bramki -
w konfiguracji dodaliśmy subskrybcje tematu:
+/tele/#
w linijce
topic +/tele/# in 0
natomiast na brokerze EMQ X widzimy, że mamy subskrybcje do tematu
topic dom-jolka/+/tele/# in 0
Dzieje się to za pomocą mechanizmu montowania (mountpoint) dostępnego na brokerze EMQ - wszystkie tematy mogą być prefiksowane (w naszym przykładzie nazwą użytkownika). Dzięki temu mechanizmowi urządzenia użytkowników są od siebie izolowane - włączając światło w swojej kuchni w domu, mamy pewność, że nie zaświeci się nam światło na… całym świecie! No chyba, że będzie błąd w MQTT
Na takich mniej więcej technicznych rozwiązaniach działa wielki świat korporacji dostarczających do domów IoT. Dzięki temu opisowi każdy może sobie w weekend postawić na PC w domu taką infrastrukturę, dołączyć dowolną ilość urządzeń i wyskalować swój domowy system do automatyki w kosmos.
Miłego weekendu