Jak tworzyć automatyzacje Home Assistant za pomocą Node-RED?

Autor: Martin Szelcel 9 min. czytania Jak tworzyć automatyzacje Home Assistant za pomocą Node-RED?

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

Open your Home Assistant instance and show the dashboard of a Supervisor add-on.

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:

  1. Ruch przestał być wykrywany, odliczamy 5 minut
  2. Po 3 minutach ruch został ponownie wykryty, ale Node delay o tym nie wie
  3. 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.