☁ 10 milionów urządzeń - skalowanie systemu do sterowania automatyką domową

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

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

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:

  1. 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 :slight_smile: i oczywiście będziemy widzieli jego status oraz będziemy mogli nim sterować z każdej naszej bramki

  2. 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 :wink:


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 :rocket: kosmos.

Miłego weekendu :wave:

3 polubienia