MQTT to wspólny język lokalnych urządzeń inteligentnego domu. Zigbee2MQTT, Tasmota, Shelly, płytki ESP i wiele samodzielnie zbudowanych czujników potrafi publikować wiadomości w brokerze działającym w domowej sieci. Node-RED to narzędzie graficzne, które odbiera te wiadomości i na nie reaguje. Razem tworzą mały, niezależny od producentów system automatyki, który działa na Raspberry Pi albo dowolnym komputerze z Debianem lub Ubuntu, bez chmury. Poniżej instalujemy oba programy, porządnie je zabezpieczamy i budujemy jeden przydatny przepływ: czujnik ruchu włącza światło i gasi je dwie minuty po ostatnim wykrytym ruchu.

Jak to się ze sobą łączy

  • Mosquitto to broker. Urządzenia publikują wiadomości w tematach (na przykład zigbee2mqtt/hall_motion) i subskrybują tematy, które je interesują. Broker przekazuje wiadomości i nic więcej nie robi.
  • Node-RED jest klientem brokera. Przepływ subskrybuje temat, przetwarza dane i publikuje polecenie w innym temacie.
  • Urządzenia nigdy nie komunikują się ze sobą bezpośrednio. Właśnie o to chodzi: czujnik albo lampę wymienisz bez zmian w czymkolwiek poza nazwą tematu.

Krok 1: zainstaluj Mosquitto

Na Raspberry Pi OS, Debianie lub Ubuntu:

sudo apt update
sudo apt install mosquitto mosquitto-clients

Jeśli teraz uruchomisz broker i spróbujesz połączyć się z innego komputera, nic z tego nie wyjdzie. Od wersji 2.0 Mosquitto bez skonfigurowanego nasłuchu przyjmuje połączenia tylko z interfejsu pętli zwrotnej, czyli wyłącznie od programów na tym samym komputerze. To rozsądne ustawienie domyślne, a nie błąd. Zanim udostępnisz broker w sieci, musisz jawnie wybrać sposób uwierzytelniania klientów.

Krok 2: dodaj użytkowników i otwórz nasłuch

Utwórz plik haseł z osobnym użytkownikiem dla każdego urządzenia lub usługi. Opcja -c tworzy plik i nadpisuje istniejący, więc używaj jej tylko przy pierwszym użytkowniku:

sudo mosquitto_passwd -c /etc/mosquitto/passwd nodered
sudo mosquitto_passwd /etc/mosquitto/passwd zigbee2mqtt
sudo mosquitto_passwd /etc/mosquitto/passwd tasmota
sudo chown mosquitto: /etc/mosquitto/passwd
sudo chmod 600 /etc/mosquitto/passwd

Następnie utwórz plik /etc/mosquitto/conf.d/local.conf:

listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd

Uruchom broker ponownie i sprawdź działanie na tym samym komputerze:

sudo systemctl restart mosquitto
mosquitto_sub -h localhost -u nodered -P 'haslo' -t 'test/#' -v
# w drugim terminalu:
mosquitto_pub -h localhost -u nodered -P 'haslo' -t test/hello -m 'działa'

Kilka nawyków, które później się opłacą:

  • Osobne konto dla każdego klienta. Jeśli tanie gniazdko kiedyś padnie ofiarą ataku, zablokujesz jedno konto bez zmian w konfiguracji reszty.
  • Ograniczaj dostęp do tematów, jeśli to możliwe. Plik ACL (acl_file) określa, który użytkownik może czytać lub zapisywać które tematy, na przykład topic readwrite tasmota/# tylko dla konta Tasmoty. Nowsza dokumentacja Mosquitto zaleca wtyczkę do obsługi plików ACL zamiast starej opcji acl_file, więc sprawdź podręcznik dla swojej wersji.
  • Nie wypuszczaj brokera poza domową sieć. Port 1883 nie jest szyfrowany. Nie przekierowuj go na routerze. Jeśli potrzebujesz dostępu z zewnątrz, użyj VPN zamiast wystawiać broker.
  • Po zmianie pliku haseł przeładuj broker (sudo systemctl reload mosquitto albo sygnał SIGHUP), żeby wczytał zmiany.

Krok 3: zainstaluj Node-RED

Twórcy Node-RED udostępniają skrypt instalacyjny dla systemów opartych na Debianie, w tym Raspberry Pi OS:

bash <(curl -sL https://github.com/node-red/linux-installers/releases/latest/download/install-update-nodered-deb)

Skrypt instaluje Node.js 22 LTS, jeśli w systemie nie ma Node.js (albo sprawdza, czy zainstalowana wersja to co najmniej v20), instaluje Node-RED przez npm i konfiguruje go jako usługę. Przed uruchomieniem możesz przejrzeć skrypt na GitHubie. Z oficjalnej dokumentacji warto zapamiętać dwie rzeczy: czasem trzeba najpierw wykonać sudo apt install build-essential git curl, a od Node.js 24 nie ma już wersji 32-bitowych, więc płytki armv6, takie jak pierwsze Raspberry Pi Zero, nie są już obsługiwane.

Włącz uruchamianie przy starcie systemu i uruchom usługę:

sudo systemctl enable nodered.service
node-red-start

Edytor znajdziesz pod adresem http://<adres-pi>:1880.

Krok 4: zabezpiecz edytor

Domyślnie edytor Node-RED nie ma hasła. Każdy w sieci, kto trafi na port 1880, może zmienić przepływy, a przepływ potrafi uruchamiać polecenia w systemie. Napraw to, zanim cokolwiek zbudujesz:

  1. Wygeneruj skrót hasła: node-red admin hash-pw.
  2. W pliku ~/.node-red/settings.js usuń znaczniki komentarza z sekcji adminAuth i wklej skrót:
adminAuth: {
  type: "credentials",
  users: [{
    username: "admin",
    password: "$2b$08$...skrot-hasla...",
    permissions: "*"
  }]
},
  1. Uruchom Node-RED ponownie poleceniem node-red-restart.

W tym samym pliku jest też zakomentowana sekcja https do udostępniania edytora przez HTTPS z własnym certyfikatem.

Krok 5: połącz Node-RED z brokerem

Przeciągnij węzeł mqtt in na obszar roboczy i otwórz jego ustawienia. Dodaj nowy broker: serwer localhost, port 1883, a na karcie Security użytkownika nodered z hasłem. Jako temat wpisz zigbee2mqtt/hall_motion (albo temat swojego czujnika), a jako wynik wybierz przetworzony obiekt JSON. Podłącz węzeł debug, kliknij Deploy i pomachaj przed czujnikiem. W panelu debugowania powinno się pojawić coś w rodzaju {"occupancy": true, "battery": 97, ...}.

Krok 6: przepływ ze światłem sterowanym ruchem

Wystarczą cztery węzły:

  1. mqtt in: temat zigbee2mqtt/hall_motion, wynik jako przetworzony JSON.
  2. switch: właściwość msg.payload.occupancy, reguła „is true”. Wiadomości z occupancy: false zatrzymują się w tym miejscu. To ważne, bo czas do wyłączenia ma liczyć się od ostatniego ruchu, a nie od chwili, w której czujnik zgłosi brak ruchu.
  3. trigger: wyślij {"state":"ON"} jako JSON, odczekaj 2 minuty, a potem wyślij {"state":"OFF"}. Zaznacz opcję wydłużania opóźnienia po nadejściu nowej wiadomości. Każdy kolejny ruch odlicza dwie minuty od nowa.
  4. mqtt out: temat zigbee2mqtt/hall_light/set. Zigbee2MQTT odbiera polecenia w temacie <urządzenie>/set.

Wdróż przepływ, przejdź obok czujnika, a światło powinno się zapalić i zgasnąć dwie minuty po twoim wyjściu. Tryb nocny dodasz, wstawiając przed węzeł trigger drugi węzeł switch sprawdzający godzinę albo węzeł z zakresem czasu z biblioteki węzłów.

Po co Node-RED obok platformy automatyki?

Jeśli korzystasz już z Home Assistanta lub openHAB, Node-RED nie jest konieczny. Sprawdza się tam, gdzie logikę łatwiej zobaczyć niż opisać w YAML-u, przy łączeniu systemów bez wspólnej integracji i przy przekształcaniu danych MQTT z jednego formatu na inny. Wiele osób trzyma proste automatyzacje w głównej platformie, a te kłopotliwe w Node-RED. Niezależnie od wyboru broker powinien być jedynym punktem styku, żeby urządzenia nie zależały od jednego programu.

Najczęstsze błędy

  • Edytor bez hasła. Niezabezpieczony Node-RED na porcie 1880 to zdalna powłoka dla każdego w sieci.
  • Dwukrotne użycie -c w mosquitto_passwd. Ta opcja nadpisuje plik i usuwa wszystkich wcześniejszych użytkowników.
  • Jedno wspólne konto MQTT dla wszystkiego. Działa do momentu, gdy trzeba odciąć jedno urządzenie.
  • Polecenia z flagą retain. Jeśli opublikujesz polecenie set z flagą retain, broker odtworzy je przy każdym ponownym połączeniu urządzenia i światło zapali się po zaniku zasilania. Flagę retain stosuj dla tematów ze stanem, nie dla poleceń.
  • Brak kopii zapasowych. Przepływy są zapisane w ~/.node-red/flows.json (w starszych instalacjach nazwa pliku może zawierać nazwę hosta), a konfiguracja brokera w /etc/mosquitto. Skopiuj jedno i drugie w inne miejsce.