Napisz do mnie

Wyślij prywatną wiadomość

NODE-RED - CO TO JEST I JAK TO UGRYŹĆ?

opublikowano: 24 paź 2018 wyświetleń: 44 komentarzy: 0

#DARIA #dariahomesystem #Node-RED #dom inteligentny #node.js #JSOn

Spośród wielu systemów do automatyzacji i obsługi tzw. Internetu rzeczy (IoT) wybrałem Node-red. Zobacz dlaczego.

Czym jest Node-Red?

Node-Red jest ciekawym środowiskiem do modelowania procesów, poprzez wizualne definiowanie przepływów informacji. Jest to moduł pracujący w środowisku node.js. Zanim się przestraszysz i uciekniesz, powiem Ci, że ja również nie miałem żadnego doświadczenia ani wiedzy z zakresu tego czym jest node.js i jego moduły.

Czym jest zatem node.js?

Node.js jest to środowisko uruchomieniowe dla programów pisanych w języku JavaScript, oparte obecnie na silniku Chrome V8. O ile do tej pory JavaScript kojarzył mi się tylko ze skryptami do animowanych galerii na stronach www, o tyle po naprawdę krótkim okresie nauki dostrzegam ogromne zalety wykorzystania JS jako języka tworzenia programów uruchamianych poza przeglądarką. Programy uruchamiane w node.js działają w tle, w konsoli, czy wręcz mają swoje własne UI z normalnymi oknami w systemie Windows, macOS czy Linux.

Wracając jednak do sedna… dlaczego zdecydowałem się na tę platformę?

Podczas testów różnych systemów obrałem sobie za cel stworzenie plugina do danego systemu, który byłby w stanie obsłużyć urządzenia działające w sieci HAPCAN. Próbowałem stworzyć taki plugin w HomeGenie (C#), potem w OpenHab2 (Java). O ile w C# czuję się w miarę swobodnie, to jednak niezbyt przemyślana architektura pluginów spowodowała, że napisanie własnego jest dosyć ciężkim zadaniem. Zwłaszcza, że dokumentacja kuleje.

Jeszcze gorzej było z pluginem do OpenHab2, który bardzo dobrze rokował, jako system — ze względu na sporą liczbę gotowych integracji, czy fajny edytor panelu dotykowego. Jednak próg wejścia do programowania w Javie jest na tyle duży, że sporo trzeba by się było nauczyć. Spędziłem nad nim około 2 tygodni, po czym stwierdziłem, że sprawdzę jeszcze Node-red. I to był strzał w dziesiątkę.

JavaScript jest językiem generalnie i prostym i skomplikowanym. Próg wejścia, aby zacząć cokolwiek w nim pisać jest bardzo niski, kłopoty mogą zacząć się później ;). Na wstępie przerobiłem jeden tutorial na temat tworzenia modułów w samym node.js, oraz instrukcję (relatywnie krótką) odnośnie pracy, programowania i tworzenia własnych pluginów do Node-reda. I już po dwóch dniach miałem gotowy plugin do łączenia z HAPCANem. Porównując stopień skomplikowania Javy i JavaScriptu różnica jest wręcz kolosalna — zwłaszcza dla osoby, która z obu języków korzysta w zasadzie sporadycznie lub wcale.

Instalacja środowiska

Node.js

Na początek idzie środowisko uruchomieniowe. Proponuję sprawdzić, czy nie jest już przypadkiem zainstalowany na Twoim systemie. W tym celu otwórz wiersz poleceń CMD i wpisz:

node -v

v8.9.4

Jeśli w odpowiedzi pojawi się numer wersji, tzn. że środowisko jest już zainstalowane. Instalkę można pobrać ze strony node.js. wersję LTS.

Jeśli wersja Twojego środowiska jest starsza niż v8, polecam zainstalować wersję 8. W przeciwnym wypadku nie będą działać pluginy, o których będzie w jednym z kolejnych artykułów.

NPM

Kolejnym istotnym programem, jest menadżer modułów, zwany NPMem. Dzięki niemu można łatwo i szybko zainstalować dowolny moduł działający w node.js, ponieważ wszystkie biblioteki publiczne znajdują się w globalnym repozytorium (tzw. rejestrze) modułów. Na początek warto sprawdzić wersję npm (jest on instalowany razem z node.js).

npm -v

5.6.0

Jeśli masz starszą wersję, konieczna może być aktualizacja npm, a robi się to… również poprzez npm ;)

npm install -g npm

Node-red

Również node-red jest dostępny w tym rejestrze, a do jego instalacji wystarczy poniższe polecenie:

npm install -g --unsafe-perm node-red

Używając przy instalacji przełącznika -g node-red instaluje się w przestrzeni globalnej. W systemie Windows folder roboczy modułów npm znajduje się w folderze Roaming. Najszybciej dotrzeć tam wpisując w CMD:

C:\>cd %appdata%\npm

C:\Users\Bartosz\AppData\Roaming\npm>

Sam node.js zainstalowany jest w C:\Program Files. Po zainstalowaniu node-red można odnaleźć w folderze roboczym npm/node-modules/node-red. Znajdują się tam również takie pliki jak settings.js, umożliwiające wstępną konfigurację node-red, ale jego zmiana nic nie da. Aby zmienić ustawienia należy się udać w inne miejsce, do folderu użytkownika, czyli w moim przypadku C:\Users\Bartosz\.node-red\. Tutaj będą zapisywane wszystkie dane związane z node-red — więc i tutaj można zadbać o backup tego folderu.

Uruchomienie

Aby uruchomić node-red zainstalowany globalnie, wystarczy w konsoli wpisać

C:\Users\Bartosz\AppData\Roaming\npm>node-red

24 Oct 21:27:25 - [info]

Welcome to Node-RED
===================

24 Oct 21:27:25 - [info] Node-RED version: v0.19.4
24 Oct 21:27:25 - [info] Node.js  version: v8.9.4
24 Oct 21:27:25 - [info] Windows_NT 10.0.17134 x64 LE
24 Oct 21:27:25 - [info] Loading palette nodes
24 Oct 21:27:28 - [info] Dashboard version 2.9.4 started at /ui
24 Oct 21:27:28 - [warn] ------------------------------------------------------
24 Oct 21:27:28 - [warn] [node-red/tail] Not currently supported on Windows.
24 Oct 21:27:28 - [warn] ------------------------------------------------------
24 Oct 21:27:28 - [info] Settings file  : \Users\Bartosz\.node-red\settings.js
24 Oct 21:27:28 - [info] HTTP Static    : C:\Users\Bartosz\AppData\Roaming\npm\node-red-static
24 Oct 21:27:28 - [info] Context store  : 'default' [module=memory]
24 Oct 21:27:28 - [info] User directory : \Users\Bartosz\.node-red
24 Oct 21:27:28 - [warn] Projects disabled : set editorTheme.projects.enabled=true to enable
24 Oct 21:27:28 - [info] Flows file     : \Users\Bartosz\.node-red\flows_pel8.json
24 Oct 21:27:28 - [info] Server now running at http://127.0.0.1:1880/

Na początku logu pojawiają się ciekawe informacje, które warto przeanalizować jeśli pogubisz się w folderach, z których ładowane są przepływy, ustawienia itp.

Jak widać, nasz serwer uruchomił się a pod adresem localhost:1880 znajdziemy panel Node-red — oczywiście w przeglądarce internetowej.

Pulpit Node-red dashboard

Na zdjęciu powyżej widać fragment jednego z przepływów (Flow), który u mnie umożliwia sterowanie światłami z panelu dotykowego.

Jak działa Node-red?

Zasada działania jest relatywnie prosta. Wizualnie łączymy różne bloczki pełniące określone funkcje. Poprzez połączenia Node-red przesyła wiadomości, które są w zasadzie obiektem JavaScriptowym, składającym się z różnych danych. Domyślnie zalecane jest aby każda wiadomość zawierała dwie wartości:

{
  topic: "jakiś temat",
  payload: "Jakaś wartość"
}

Klamry w tym zapisie oznaczają obiekt, nazwy i wartości są oddzielone przecinkami. Bloczki (węzły, z ang. nodes) dostępne do wyboru po lewej stronie pełnią określone funkcje. Operują one na obiektach (wiadomościach) przesyłanych połączeniami. I tak wyróżnić można bloczki input, które jedynie emitują wiadomości, output — które przyjmują wiadomości, oraz funkcje, które przetwarzają wiadomości (mają wejście i wyjście).

Działanie każdego bloczka opisane jest na zakładce info po prawej stronie, tak więc pomoc do każdego bloczka dostępna jest pod ręką. Dwuklik na bloczku powoduje otwarcie okna konfiguracji danego bloczka.

Każda zmiana w konfiguracji wymaga wykonania Deploy, po prawej na górze i w mgnieniu oka zmieniony kod jest podmieniany w wykonywanym programie. Zmiana niektórych ustawień, zwłaszcza w tzw. bloczkach konfiguracyjnych (są one niewidoczne, zazwyczaj konfiguruje się tam połączenie z zewnętrznymi serwerami itp.) mogą wymagać restartu całego node-reda, więc jeśli coś nie do końca działa, a powinno, polecam Ctrl+C w konsoli i ponowne uruchomienie Node-reda.

Własne funkcje

Jeśli bloczki istniejące w tzw. palecie (to po lewej stronie) nie są wystarczające do realizacji zadania, albo po prostu trzeba by wykorzystać ich bardzo dużo, opłaca się zastosować bloczek function, który umożliwia pisanie kodu JavaScript wprost w edytorze.

Własna funkcja w Node-red

Jak widać, funkcja dostaje na wejściu obiekt msg, który zawiera to co wysłał do niego inny bloczek na wejście. W powyższym kodzie nadpisuję wartość payload nowym obiektem o atrybutach name oraz location. I tutaj widać największą zaletę języka JavaScript, który zarazem jest jego największą słabością :). Obiekty tworzone są dynamicznie, nie ma potrzeby ich wcześniejszego definiowania. Potrzebujemy przesłać dodatkową wartość to ją po prostu wstawiamy do obiektu, np. msg.time = new Date(); i już w obiekcie msg na wyjściu prócz topic i payload znajdzie się jeszcze wartość time, zawierająca aktualną godzinę.

W niektórych przypadkach nie chcemy wysłać wiadomości, wtedy wystarczy zwrócić null (return null). Przepływ zatrzyma się i dalej nie pójdzie.

Własne bloczki

Istnieje również możliwość tworzenia własnych bloczków wykonujących określone funkcje. Wszystko jest ładnie opisane w dokumentacji do node-red, która znajduje się tutaj. Polecam przeczytać wszystkie rozdziały, nie ma tego dużo a wszystko stanie się jasne.

Zalety Node-red

Główna zaleta, to szybkość dodawania nowych funkcji. Nie trzeba zagłębiać się gdzieś głęboko w kod programu aby podłączyć np. powiadomienie mailowe o jakimś zdarzeniu czy aby zrobić sterowanie światłem poprzez e-mail, Slacka czy Twitera :). Podłączanie i odłączanie jest tak proste i szybkie, że nawet użytkownik niebędący programistą może dodać swój przepływ i w mgnieniu oka zmienić działanie systemu. Z drugiej strony, programista nie ma tutaj praktycznie żadnych ograniczeń.

Biblioteka rozwiązań

Na stronie https://flows.nodered.org/ znaleźć można bloczki oraz przepływy stworzone przez użytkowników Node-reda, realizujące różne funkcje. Opcja przeszukiwania i instalowania nowych bloczków dostępna jest w Node-red (Hamburger po prawej stronie > Manage palette). Również i w tym miejscu znaleźć można moje bloczki do obsługi Hapcana. Ale o nich w kolejnym wpisie.

Również przesłanie komuś własnego rozwiązania jest banalnie proste, bo wybrane bloczki, cały flow można skopiować do schowka i wysłać innej osobie jako treść w formacie JSON.


ZOBACZ RÓWNIEŻ POLECANE WPISY


Comments (0)


Allowed tags: <b><i><br>


PODOBAŁO SIĘ?

PODOBAŁO SIĘ?


0 like voting
is closed
thanks
for your vote

PODZIEL SIĘ

PODZIEL SIĘ