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ładtopic readwrite tasmota/#tylko dla konta Tasmoty. Nowsza dokumentacja Mosquitto zaleca wtyczkę do obsługi plików ACL zamiast starej opcjiacl_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 mosquittoalbo 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:
- Wygeneruj skrót hasła:
node-red admin hash-pw. - W pliku
~/.node-red/settings.jsusuń znaczniki komentarza z sekcjiadminAuthi wklej skrót:
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "$2b$08$...skrot-hasla...",
permissions: "*"
}]
},
- 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:
- mqtt in: temat
zigbee2mqtt/hall_motion, wynik jako przetworzony JSON. - switch: właściwość
msg.payload.occupancy, reguła „is true”. Wiadomości zoccupancy: falsezatrzymują 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. - 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. - 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
-cw 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
setz 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.