Napisz do mnie

Wyślij prywatną wiadomość

NODE-RED-CONTRIB-HAPCAN, CZYLI OBSŁUGA HAPCANA PRZEZ NODE-RED

opublikowano: 11 lis 2018 wyświetleń: 87 komentarzy: 0

#HAPCAN #Node-RED #node.js #plugin #JSON #dariahomesystem #IoT #automatyka domowa #home automation

Jak łatwo i przyjemnie obsługiwać system Hapcan z wykorzystaniem platformy Node-RED?

Komunikacja z Hapcanem

Najprostszy sposób komunikacji komputera z Hapcanem polega na wysyłaniu i odbieraniu ramek poprzez moduł Ethernet. Moduł ten posiada, prócz dwóch gniazd magistrali Hapcan, dodatkowe gniazdo umożliwiające podłączenie go do sieci LAN.

I tak też jest u mnie, moduł Ethernet podłączony jest do rutera domowego. Aby sterować dowolnym urządzeniem wystarczy w dowolnym języku programowania utworzył połączenie z modułem Ethernet, na odpowiednim porcie i wysłać odpowiednio spreparowaną ramkę sterującą.

Same ramki Hapcana są dosyć dobrze opisane, ale mimo wszystko posługiwanie się surowymi tablicami 15 bajtów nie są najprostszym zadaniem. Nawet, jeśli sklecisz odpowiednią ramkę to za miesiąc nie będziesz już pamiętał, co oznaczały poszczególne bajty i znów konieczne będzie wertowanie dokumentacji.

Pluginy

Naturalnie, aby ułatwić komunikację pomiędzy systemem sterującym a sprzętem, tworzone są pluginy. Niektóre z nich, jak OpenHab2 czy Domoticz mają dosyć pokaźną liczbę integracji. Podczas testów różnych systemów jako zadanie postawiłem sobie napisanie plugina do obsługi Hapcana. Był to zarazem test na łatwość tworzenia pluginów — bo o to również chodzi, aby nie trzeba było mieć doktoratu z danego systemu czy języka :).

Generalnie niemal każdy system miał próg wejścia dosyć wysoki. Raz, że trzeba nauczyć się platformy, dwa, że język programowania też nierzadko najłatwiejszy nie jest, a trzy… dokumentacja często mija się z aktualnym stanem i wiele godzin poświęca się na dotarcie do informacji po różnych forach itp.

Node-RED na ratunek ;)

Mój prywatny pojedynek systemów wygrał jednoznacznie Node-RED. Dokumentacja jest dosyć krótka, opisuje to co trzeba. Bardzo szybko stworzyłem plugin oraz bloczki do obsługi Hapcana i o nich dzisiaj trochę opowiem.

Node-red-contrib-hapcan

Tak właśnie nazywa się zestaw bloczków stworzonych przeze mnie. Bloczki są oczywiście open-source a kody źródłowe umieszczone są na githubie. Jest to biblioteka środowiska NodeJS więc instalacja bloczków podlega prawom tegoż środowiska. Można je zatem zainstalować korzystając z narzędzia npm.

Instalacja

Dla użytkowników Node-RED najprościej skorzystać z instalacji wewnątrz panelu zarządzania. Biblioteka jest dostępna w specjalnym zbiorze rozwiązań dla Node-RED.

Instalacja Hapcan w Node-RED

Po chwili plugin jest gotowy do pracy.

Konfiguracja

Pierwsza sprawa, to skonfigurowanie bramki — czyli w praktyce podanie namiarów na moduł Ethernet. wystarczy wybrać do tego jeden z bloczków (dowolny) i przejść do konfiguracji bramki (Gateway).

node-red-contrib-hapcan configuration

Po każdej zmianie należy użyć przycisku Deploy aby zmiany zostały uruchomione. Przy okazji, zwróć uwagę, że można wybrać jeden z trzech typów deployowania: tylko zmienione nody, tylko zmienione flow oraz wszystko. Przy testach najczęściej używam deploya wszystkiego, ponieważ niektóre funkcje wymagają restartu również innych nodów. Aczkolwiek, to też trzeba mieć na uwadze, że wtedy startują wszystkie nody od początku, zaczną się inicjalizować itp :).

Jeśli Node-RED został uruchomiony z konsoli, to powinny w niej pojawić się odbierane ramki Hapcana (np, ramka czasu, przycisku itp).

Ramki Hapcan widoczne w konsoli Node-RED

Konfiguracja bramki wymagana jest tylko raz. Wszystkie używane bloczki korzystają z tego samego połączenia.

Sterowanie światłem

No więc na początek, może by coś włączyć. Ja posłużę się tutaj bloczkiem Relay output sterującym modułem przekaźników, do którego mam podpięte lampy w pomieszczeniach.

Dla użytkowników systemu Hapcan parametry Node oraz Group są w miarę oczywiste. Trzeba tutaj podać adres odpowiedniego modułu. Plugin w wersji 1.1, który jest dostępny w momencie pisania tego artykułu nie ma jeszcze zaimplementowanego odkrywania modułów, więc trzeba się tutaj posłużyć programem Hapcan Programmer, aby ustalić adres modułu.

W polu Name polecam wpisać informację co dokładnie robi bloczek, dzięki temu łatwiej będzie rozczytać flow Node-REDa.

Pole Default action zawiera listę funkcji, jakie moduł może wykonać i tak w przypadku przekaźnika są to:

  • Do nothing — nie rób nic
  • Turn OFF — wyłącz wybrany przekaźnik
  • Turn ON — włącz wybrany przekaźnik
  • Toggle — przełącz wybrany przekaźnik

Trzy ostatnie funkcje nie budzą wątpliwości, zaś pierwsza — nie rób nic — może wydać się lekko podejrzana :). Ale spokojnie, zaraz do niej dojdę.

Ja ustawiłem tutaj przełączanie, gdyż w ten sposób steruję zazwyczaj światłami w domu.

Pole wyboru Channels składa się z 6 pstryczków, którymi można wybrać przekaźniki, których dana akcja ma dotyczyć — u mnie jest to przekaźnik 2, do którego mam podłączone tzw. światło 4.

Dodatkowo, na samym końcu można jeszcze wybrać typ modułu (stary UNIV 1) bądź też nowy UNIV 3. Informacje o rodzaju modułu również dostarcza Hapcan Programmer.

No to przydało by się teraz wzbudzić nasz bloczek aby ten przełączył światło. Do celów testowych użyję noda inject dostępnego w standardzie Node-REDa. Jego wyjście podłączam do wejścia przekaźnika, wciskam Deploy… i po kliknięciu w przycisk timestamp odpowiedni przekaźnik zostanie przełączony.

Flow przełączający światło modułu przekaźnik Hapcan

Zwróć uwagę, że w bloczku Hapcana prócz nadanej mu nazwy pojawiają się specyficzne dla modułów Hapcana adresy (2,1) — czyli node i group, zaś w nawiasie kwadratowym wyświetla się lista wybranych przekaźników.

Nie ma również potrzeby znać dokumentacji modułów Hapcan, ramek, parametrów, gdyż są one dostępne wprost w oknie konfiguracji bloczka.

Do nothing

Wspomniana wcześniej akcja pt. nie rób nic, wbrew pozorom jest bardzo przydatna. Node-RED daje bardzo wiele możliwości, zatem i z samego bloczka można skorzystać na wiele sposobów. Przykładowo sterując 6 przekaźnikami osobno, trzeba by (w teorii) podłączyć 6 osobnych bloczków typu Relay output. A jeszcze jakby ktoś chciał osobno włączać i wyłączać to już bloczków 12. Otóż, można tak.. ale po co :)

Sterowanie zaawansowane… trochę bardziej

Połączenie bloczków w Node-RED oznacza, że fizycznie pod spodem bloczki te przekazują pomiędzy sobą dane. W powyższym przykładzie daną tą jest timestamp, czyli aktualny czas w formacie UNIX. Jako, że bloczek Relay output miał skonfigurowaną domyślną akcję typu toggle to taką akcję wykona, po odebraniu dowolnej wiadomości na swoim wejściu.

W bloczkach zaimplementowany został również tryb sterujący nimi w zależności od danych wejściowych.

Aby skorzystać z tego trybu, należy wysłać do bloczka wiadomość o temacie control (msg.topic = „control“). Spowoduje to, że bloczek postara się zintepretować payload wiadomości (msg.payload) jako informacje sterujące jego pracą.

Przypomnę domyślną strukturę wiadomości przesyłanej między bloczkami (JSON):

{
  topic: "control",
  payload: ...
}

Bloczek potrafi zinterpretować różne typy danych przesłanych jako payload, i tak:

string

Wysyłając teksty w stylu on, off, toggle wywołujemy odpowiednią funkcję dla zdefiniowanego przekaźnika. Bloczek akceptuje wielkie i małe litery. Inne słowa są ignorowane i bloczek nie zrobi nic. Tutaj widać, po co przydatna jest akcja Do nothing — jeśli zawsze chcemy sterować bloczkiem podając mu dane kontrolujące akcja taka zabezpiecza przed wywołaniem domyślnej akcji w przypadku gdy do bloczka trafi jakaś wiadomość niesterująca (temat inny niż control).

{
  topic: "control",
  payload: "TOGGLE"
}

number

Number, czyli liczba, w szczególności chodzi o liczbę naturalną. Tutaj bloczek reaguje na podanie wartości typowych dla instrukcji w ramce sterującej Hapcan. 0=OFF, 1=ON, 2=TOGGLE. Inne wartości są ignorowane.

{
  topic: "control",
  payload: 2
}

boolean

Zmienna typu bool, czyli true=ON, false=OFF. Nie się takim parametrem wywołać funkcji Toggle, gdyż bool może przyjmować tylko dwa stany.

{
  topic: "control",
  payload: true
}

Dlaczego tyle typów? Często łącząc bloczki różnych typów otrzymujemy dane w różnej postaci. Dzięki temu niektóre z nich można wprost wykorzystać do sterowania bloczkiem, bez potrzeby konwertowania danych.

Sterowanie jeszcze bardziej zaawansowane

Oczywiście ktoś może poczuć niedosyt, ja taki poczułem :), zatem jeszcze jednym sposobem sterowania jest przekazanie do bloczka całego obiektu w polu payload (w formacie JSON). Można wtedy sterować wieloma jego parametrami.

{
  topic: "control",
  payload: {
             channels: number | array,
             action: string | number | bool
  }
}

Można tutaj ustawić kanały jak i akcję do wykonana, posługując się wskazanymi typami danych, a więc np.:

{
  topic: "control",
  payload: {
             channels: [1,3,5],
             action: "OFF"
  }
}

spowoduje wyłączenie przekaźników 1, 3 oraz 5.

Dobra, ale jak takie dane wysłać?

Tutaj sposobów jest również wiele. Najprościej wejść w edycję bloczka inject, który w przykładzie powyżej zwraca timestamp i zmienić topic oraz typ zwracanych danych.

Poniżej przedstawione ustawienie dla zmiennej typu string, z akcją toggle.

Node-RED payload typu string

W ten sposób można również ustawić payload typu obiekt i sterować cały bloczkiem. Z listy rozwijanej należy wtedy wybrać typ JSON i w polu edycyjnym otworzyć edytor tekstowy [...]

Wiadomość sterująca bloczkiem Hapcan typu JSON

Można również posłużyć się bloczkiem change lub function i ustawić payload programowo:

msg.topic = "control";
msg.payload = {
    channels: [1,3,5],
    action: "off"
};

return msg;
 

Skąd wiedzieć jakie wartości i typy danych można przekazać?

Każdy bloczek stworzony w ramach biblioteki node-red-contrib-hapcan ma opis w języku angielskim, wystarczy kliknąć na bloczek w edytorze a po prawej stronie w zakładce info, wyświetlona zostania informacja o tym co robi bloczek, jakie ma parametry i do czego one służą.


CZYTAJ DALEJ POZOSTAŁE CZĘŚCI TEGO ARTYKUŁU


ZOBACZ RÓWNIEŻ POLECANE WPISY


Comments (0)


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


PODOBAŁO SIĘ?

PODOBAŁO SIĘ?


5 like voting
is closed
thanks
for your vote

PODZIEL SIĘ

PODZIEL SIĘ