Jak tworzyć automatyzacje Home Assistant za pomocą Node-RED?
Autor: Martin Szelcel • 9 min. czytania • AktualizacjaMimo tego że Home Assistant ma wbudowaną funkcjonalność do łatwego tworzenia automatyzacji wiele osób wciąż woli wykorzystać do tego nieco inne narzędzie, a mianowicie Node-RED.
Czym jest Node-RED?
Node-RED jest narzędziem opartym na Node.js pozwalającym na tworzenie graficznie pewnych procesów i automatyzacji. Całą automatyzacje składamy niejako z połączonych ze sobą klocków zwanych Node'ami, tworząc w ten sposób Flow, czyli jakiś przebieg zadań do wykonania. Node-RED nie wymaga znajmości żadnego języka programania, jeśli natomiast chcemy napisać coś bardziej zaawansowanego, czego nie możemy uzyskać za pomocą Nodów, Node-RED posiada również obsługę kodu w języku JavaScript. Cały system jest może być rozbudowywany o dodatkowe Nody pobierane z interentu.
Instalacja Node-RED przez Home Assistant
Instalacja dodatku
Najprostszym sposobem na zainstalowanie Node-RED i połączenie go z Home Assistantem jest zainstalowanie go za pomocą dodatków. Możesz to zrobić klikając w poniższy link:
Lub wchodząc następująco w Home Assistancie: Ustawienia > Dodatki > Sklep z dodatkami > Node-RED
Teraz wystarczy że naciśniesz przycisk zainstaluj.
Konfiguracja hasła
Po zainstalowaniu musimy przejść na zakładkę konfiguracja na której musimy ustalić hasło które będzie służyć do szyfrowania danych pomiędzy Home Assistantem a Node-RED. Uzupełniamy pole credential_secret hasłem.
Możesz tutaj skorzytać z jakiegoś hasła z generatora.
Dodatkowo jeśli nie masz certyfikatu szyfrującego musisz wyłączyć opcję ssl.
Następnie zapisz zmiany za pomocą przycisku na dole.
Pierwsze uruchomienie
Po skonfigurowaniu dodatku zaznacz wszystkie trzy opcję: aby dodatek uruchamiał się wraz z Home Assistantem, automatycznie się restartował jeśli coś pójdzie nie tak i pokazywał się na bocznym pasku. Następnie pozostało uruchomić dodatek za pomocą przycisku "Uruchom".
Odczekaj chwilę aż dodatek się uruchomi a następnie przejdź do interfejsu Node-RED za pomocą przycisku na pasku bocznym
Jeśli widzisz powyższy ekran to udało ci się poprawnie zainstalować Node-Red.
Pierwsza automatyzacja
Zacznijmy od najprostszej automatyzacji tak abyś mógł na własne oczy przekonać się jak działa Node-RED, a później stopniowo będziemy ją rozbudowywać tak aby poznać najważniejsze rodzaje Nodów.
Do tej automatyzacji użyje czujnika ruchu oraz światła.
Wykrycie zmiany stanu
Zacznijmy od zdarzenia które będzie naszą automatyzację wywoływać: wykrycie ruchu przez czujnik, czyli zmiana jego stanu. Przeciągamy więc z paska bocznego Noda o nazwie events: state
, zauważ że Nody wejściowe nie mają małego szarego kwadracika po lewej stronie. Za pomocą tych kwadracików łączymy Nody ze sobą. Dane zawsze wchodzą do Noda z lewej strony a dane wyjściowe są przekazywane z prawej.
Następnie naciskamy na Noda dwa razy, aby zmienić jego ustawienia.
Nadajemy mu odpowiednią nazwę, tak abyśmy wiedzieli co dany Node robi, w polu Entity
wybieramy naszą encję na której zmiany chcemy reagować, w moim przypadku jest to czujnik ruchu, następnie wybieramy na jaki stan chcemy reagować. Chcę wykonać moją automatyzacje po wykryciu ruchu, czyli ustawiam w polu If state
że chcemy reagować na moment w którym czujnik zmieni stan na on
.
Ten Node dodatkowo umożliwia nam na wybranie czasu po którym chcemy wykonać automatyzacje np. możemy ustawić że dzieje się to tylko gdy czujnik ruchu jest aktywny przez 2 minuty.
Wywołanie usługi
Po wykryciu ruchu chcemy oświecić światło musimy więc wywołać usługę wewnątrz Home Assistanta, która to za nas wykona. Potrzebujemy więc Noda o nazwie call service
.
Ponownie naciskamy dwukrotnie na Noda aby go skonfigurować. Nadajemy mu nazwę, wybieramy domenę i usługę chcemy wykonać (w przypadku oświecenia światła jest to light.turn_on
), a następnie dodajemy encję którą chcemy oświecić. Istnieje też możliwość oświecenia całego obszaru lub konkretnego urządzenia.
Połączenie Nodów i uruchomienie automatyzacji
Jeśli mamy już dwa skonfigurowane Nody możemy je ze sobą połączyć. Naciskamy w tym celu na pierwszy szary kwadrat z prawej strony Noda wejściowego i przeciągamy go do kwadratu po lewej stronie Noda wykonującego naszą akcję.
Zauważ że Node Wykryto ruch
ma dwa wyjścia, po najechaniu pojawia się ich opis.
- Wyjście u góry aktywuje się gdy czujnik ma stan
on
- Wyjście u dołu gdy czujnik nie ma stanu
on
, czyli w przeciwnym wypadku
Pozostało nam aktywować automatyzacje za pomocą czerwonego przycisku w prawym górnym rogu.
Teraz po wykryciu ruchu przez czujnik, światło powinno zostać oświecone. Super!
Wykorzystanie przeciwnego wypadku
Pewnie byłoby jeszcze lepiej gdyby światło było również automatycznie gaszone. Rozbudujmy więc nasz Flow. Kopiujemy nasz Node o nazwie Oświeć światło
i modyfikujemy konfiguracje tej kopii. Zmieniamy nazwę i usługę na light.turn_off
.
Pozostało połączyć tego Noda do przeciwnego wypadku Noda wejściowego, czyli chcemy aby światło zostało zagaszone zaraz po tym jak czujnik przestanie wykrywać ruch.
Teraz nasze światło jest automatycznie oświecane i gaszone. Coraz lepiej!
Opóźnienie w wykonaniu akcji
Co jeśli chcemy aby światło zgasiło się dopiero po 5 minutach? Możemy w tym celu użyć Noda delay
z następującymi ustawieniami:
I co prawda światło zgaśnie po 5 minutach od momentu gdy ruch przestanie być wykrywany, ale problem polega na tym że akcja zostanie wykonana niezależnie od tego czy ruch zostanie wykryty chwilę później. Przykładowa sytuacja:
- Ruch przestał być wykrywany, odliczamy 5 minut
- Po 3 minutach ruch został ponownie wykryty, ale Node
delay
o tym nie wie - Po 2 minutach światło zostaje zgaszone
Jak możemy rozwiązać tą sytuacje? Zamiast Noda delay
możemy użyć np. Noda wait until
. Będzie on czekał przez 5 minut na wykrycie ruchu i jeśli przez ten czas to się nie wydarzy, to dopiero wtedy zgasimy światło.
Teraz nasza automatyzacja jest już prawie idealna. Brakuje nam jeszcze tylko jednego szczegółu.
Nie gaszenie światła, gdy te zostało oświecone manualnie
Czy czasem nie irytuje Cię to gdy chcesz aby światło było oświecone cały czas a twoja automatyzacja ciągle je gasi? Jak możemy zapobiec takiej sytuacji? Pozwólmy automatyzacji tylko na gaszenie światła, gdy to ona je oświeciła.
Zacznijmy od sprawdzenia przed oświeceniem światła czy jest ono w tym momencie zgaszone, jeśli będzie już oświecone nie będziemy wykonywać dalszej automatyzacji. W tym celu użyjemy Noda current state
:
Następnie musimy przenieść dolną część naszego Flow zajmującą się gaszeniem światła na koniec górnej części. Nasza automatyzacja może więc być dużo bardziej liniowa:
Brakuje nam jeszcze jednego warunku, po oświeceniu światła najpierw musimy poczekać, aż ruch przestanie być wykrywany, a dopiero następnie czekamy na wykrycie ruchu przez 5 minut:
Idealnie! Myślę że już udało nam się stworzyć naprawdę dobrą automatyzacje zajmującą się światłami.
Importowanie i eksportowanie Flowów
Jeśli gdzieś się pogubiłeś podczas tworzenia Nodów w poprzednim przykładzie, albo chciałbyś przekazać swoje automatyzacje komuś innemu to mam dla ciebie dobrą wiadomość. Flowy mogą być łatwo eksportowane i importowane.
Eksportowanie Flow
Aby wyeksportować flow możesz użyć funkcji eksport znajdującej się w menu u góry po prawej stronie.
Mamy tutaj możliwość wyeksportowania wybranych Nodów, aktualnego Flow albo wszystkich Flowów, wynik eksportu możemy albo pobrać jako plik albo skopiować do schowka.
Importowanie Flow
Analogicznie w tym menu znajdziemy opcję do importowania Flowów
Wystarczy że wybierzemy wyeksportowany wcześniej plik lub wkleimy kod odpowiedzialny za Flow do czerwonej ramki i naciśniemy Import
Dla przykładu wrzucam tutaj kod utworzonej poprzednio automatyzacji. Możesz go teraz skopiować i spróbować zaimportować u siebie.
[{"id":"26a3080f59b1c9d3","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"c5448367a3e8b7e5","type":"server-state-changed","z":"26a3080f59b1c9d3","name":"Wykryto ruch","server":"53cb703c.77db4","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.kitchen_motion_sensor","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":130,"y":420,"wires":[["be2cade5204317ab"],[]]},{"id":"652be1772c36a38a","type":"api-call-service","z":"26a3080f59b1c9d3","name":"Oświeć światło","server":"53cb703c.77db4","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.kitchen"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":520,"y":420,"wires":[["7a9e08840636cb8e"]]},{"id":"bd5690408c1f0573","type":"api-call-service","z":"26a3080f59b1c9d3","name":"Zgaś światło","server":"53cb703c.77db4","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.kitchen"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1210,"y":420,"wires":[[]]},{"id":"fcf500a626019fff","type":"ha-wait-until","z":"26a3080f59b1c9d3","name":"Czekaj 5 minut na wykrycie ruchu","server":"53cb703c.77db4","version":2,"outputs":2,"entityId":"binary_sensor.kitchen_motion_sensor","entityIdFilterType":"exact","property":"","comparator":"is","value":"on","valueType":"str","timeout":"5","timeoutType":"num","timeoutUnits":"minutes","checkCurrentState":true,"blockInputOverrides":true,"outputProperties":[],"entityLocation":"data","entityLocationType":"none","x":980,"y":420,"wires":[[],["bd5690408c1f0573"]]},{"id":"be2cade5204317ab","type":"api-current-state","z":"26a3080f59b1c9d3","name":"Światło jest zgaszone?","server":"53cb703c.77db4","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.kitchen","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":320,"y":420,"wires":[["652be1772c36a38a"],[]]},{"id":"7a9e08840636cb8e","type":"ha-wait-until","z":"26a3080f59b1c9d3","name":"Czekaj na brak ruchu","server":"53cb703c.77db4","version":2,"outputs":2,"entityId":"binary_sensor.kitchen_motion_sensor","entityIdFilterType":"exact","property":"","comparator":"is","value":"off","valueType":"str","timeout":"5","timeoutType":"num","timeoutUnits":"minutes","checkCurrentState":true,"blockInputOverrides":true,"outputProperties":[],"entityLocation":"data","entityLocationType":"none","x":720,"y":420,"wires":[["fcf500a626019fff"],[]]},{"id":"53cb703c.77db4","type":"server","name":"Home Assistant","addon":true}]
Podsumowanie
Mam nadzieję że ten krótki poradnik pomógł ci zrozumieć jak działa Node-RED i w jaki sposób możesz go użyć do tworzenia własnych automatyzacji. Oczywiście zostało ci do odkrycia jeszcze wiele różnych Nodów których nie bylem w stanie poruszyć w tym wpisie. Jeśli jesteś zainteresowany innymi wpisami na temat Node-RED koniecznie zostaw komentarz. Chętnie się dowiem do czego chciałbyś użyć, albo co już udało Ci się zautomatyzować za pomocą Node-RED.