Tinycontrol Lan Kontroler v2.5 - Integracja z Home Assistant

Witam wszystkich.
Ponieważ projekt który realizuje cieszy się zainteresowaniem coraz większej liczby użytkowników forum, postanowiłem opisać go w formie poradnika od samego początku do samego końca (za rączkę) w kwestii integracji Lan Controllera z Home Assistantem za pośrednictwem Node-RED’a.

Oto efekt, do którego dążymy:

Zanim zaczniesz.
Lan Controller, to niewielkie urządzenie podłączone do interfejsu LAN sieci domowej, które pozwala na gromadzenie informacji z liczników impulsowych (np. liczników zużycia energii elektrycznej), czujników temperatury, oraz do pomiaru natężenia prądu. Posiada wbudowany w siebie jeden przekaźnik i ma możliwość po podłączeniu dodatkowego modułu sterowanie kolejnymi czterema. Zarządza się nim za pomocą wysyłania odpowiednio spreparowanych zapytań GET po protokole http
Instrukcja obsługi dostępna jest tutaj.
Ja osobiście korzystam z LM z zmienionym oprogramowaniem, dostosowanym do komunikacji i rejestracji parametrów pracy w serwisie pvmonitor.pl Twórcy projektu udostępniają taką instrukcje obslugi

Instalacja:
Aby móc mieć stabilną komunikacje między LM a HA, należy LM nadać stały adres IP w własnym routerze/serwerze DHCP, jak to zrobić nie napiszę, bo każdy ma inny router itd…

image
Jak widać urządzenie nie jest rozpoznawane
Na zakładce z rezerwacją adresów widoczne jest jako:

Jak już się z tym uporacie, odłączcie na chwile (około 10s) zasilanie od LM, by przy starcie pobrał nowy adres IP.

Przechodzimy do Home Assistanta:

  1. Dodajemy “Pomocników”
    Pomocnicy w HA to takie twory w postaci sztucznych Encji, które przechowują dla nas dane w postaci liczb, łańcucha znaków (tekstu) czy inne…
    W zależności od tego co będziemy chcieli prezentować, czy rejestrować w interfejsie HA takich pomocników musimy utworzyć.
    Jak to zrobić?
    image
    image
    image
    Wybieramy typ pomocnika do utworzenia:

    Uzupełniamy dane wg. naszych preferencji:

    Klikamy UTWÓRZ

Od tej pory mamy do dyspozycji nowego pomocnika, którego wartości możemy prezentować na kartach.

Ja dla potrzeb projektu systemu centralnego ogrzewania utworzyłem następujących pomocników:











w następnym artykule pokaże jak to ugryźć w NR, tak aby pobrać dane z LM i przekazać je do POMOCNIKÓW, czyli sztucznie utworzonych przez nas encji.

3 polubienia

Przechodzimy do NR

Etap 1
Odczytanie danych z Lan Kontroler’a (LK)

realizujemy to poprzez wysłanie zapytania http://xxx.xxx.xxx.xxx/st0.xml gdzie xxx.xxx.xxx.xxx to adres IP Lan Kontrolera.
image
image
jeśli wszytko pójdzie OK otrzymamy zwrotnie w msg następującą strukturę danych:
image
wynik (http) zapisany zostanie w zmiennej msg.payload

możemy jednak trafić na błędy w komunikacji między HA i LK i wtedy proces się nam wykrzaczy.
Dzieje się to dlatego, że LK ma w sobie mechanizm auto restartu co określony interwał czasowy i jeśli trafimy z zapytaniem http, na czas w którym się restartuje to możemy doprowadzić do zawieszenia LK. Dlatego dla bezpieczeństwa wprowadzamy ograniczenie, które zatrzyma wszystkie zapytania do LK przez okres 30s. Zrealizujemy to za pomocą 4 nodów:
image


image
image
image

image
image
spinamy to w całość:
image
i mamy załatwioną obsługę błędów w komunikacji :slight_smile:

Etap II
Konwersja z formatu XML na JSON wykorzystywany w msg do dalszego procesu obróbki danych.
wstawiamy nod:
image
on przekonwertuje wynik XML na strukture JSON


klikając na miejsce wskazane myszką otrzymujemy ścieżkę dostępu do danego wyniku:
“payload.response.ia7[0]” - trzeba pamiętać, że jeśli chcemy skorzystać z zapisanej wartości w funkcjach to musimy dodać przedrostek msg. - czyli odwołanie do wartości będzie wyglądać w funkcji następująco: “msg.payload.response.ia7[0]”

co do struktury otrzymanego pliku XML opisze go w osobnym poście, bo sam go do końca nie znam. Odczytane wartości z czujników temperatury trzeba podzielić przez 10

Omawiany przykład: LM Pobieranie danych.json (2,5 KB)

Kolejny artykuł będzie poświęcony odczytaniu z HA wartości “pomocników” i zapisaniu ich w NR, oraz zapisie otrzymanych wyników z LM do pomocników w HA.

1 polubienie

Import i Export danych z NR do HA

- pomocnicy i stworzony za ich pomocą panel sterowania:



Sterowanie1.json (1,0 KB)

Sterowanie2.json (266 bajtów)

Home Assistant pozwala nam nie tylko na utworzenie panelu sterującego, ale również służy jako rejestrator danych:

Do pobrania danych z HA
służy nam nod: “current state”
image
przykładowe użycie:


w przedstawionym przykładzie, przekazanie wartości pomocnika z HA do zmiennej flow, daje nam możliwość odczytania jej w każdym z nodów jaki postawimy w ramach karty procesu (flow). Nie ginie ona wraz ze zakończeniem ścieżki msg, przechodzącej przez kolejne nody. Zostanie zresetowana (usunięta) dopiero w momencie restartu Node-Red lub po naciśnięciu przycisku: image

Do zapisania danych w encjach HA
służy nam nod:
image
przykładowe użycie:


w przypadku gdy wartość przekazana do HA będzie inna niż obecna w danym nodzie, zobaczymy rejestracje zmiany nie tylko w historii samej encji, ale również w dzienniku:
image

W kolejnej części postaram się przybliżyć strukturę zwracanych danych przez Lan Kontrolera na przykładzie odczytanego pliku XML.

Co to za kocioł gazowy węglowy?

Może warto przerzucić ten wątek do działu Integracje?

1 polubienie

warto :slight_smile: już zrobione

Po dłuższej przerwie…

Struktura danych zwracanych przez nod’a XML:
image
w zmiennej msg.payload.response otrzymujemy obiekt typu tablica w którym zwracane są aktualne parametry zapisane w Lan Kontrolerze.

Ich struktura ma się następująco wg. moich doświadczeń:
// - jestem pewien
?/ - domyślam się (nie mam potwierdzenia)

EDIT: 2021-11-19 - dzięki za dane @rakon [Lan Controler v2.5 - Integracja z Home Assistant - #31 przez rakon]

"out0":["0"],           // Out0 - wbudowany przekaźnik w płytkę (0=OFF 1=ON)
"out1":["0"],           // Out1 - przekaźnik na płce rozszerzeń 1 (0=OFF, 1=ON)
"out2":["0"],           // Out2 - przekaźnik na płce rozszerzeń 2 (0=OFF, 1=ON)
"out3":["0"],           // Out3 - przekaźnik na płce rozszerzeń 3 (0=OFF, 1=ON)
"out4":["0"],           // Out4 - przekaźnik na płce rozszerzeń 4 (0=OFF, 1=ON)
"out5":["1"],           // przekaźniki - Reverse out state (1=OFF, 0=ON)
"ia0":["365"],          // Board Temperature (36,5 C)
"ia1":["151"],          // VCC SUPPLY (15,1 V)
"ia2":["0"],            ?/ Inp1 (0,0 V)
"ia3":["-22"],          // Inp2 (-2,2 V)
"ia4":["0"],            ?/ Inp3 (0,0 V)
"ia5":["4346"],         // Inp4 (434,6 C) PT1000
"ia6":["0"],            ?/ Inp5 (0,0 A)
"ia7":["233"],          // Inp6 (23,3 C) czujnik DS18B20
"ia8":["297"],          // Inp7 (29,7 C) czujnik DS18B20
"ia9":["225"],          // Inp8 (22,5 C) czujnik DS18B20
"ia10":["223"],         // Inp9 (22,3 C) czujnik DS18B20
"ia11":["-800"],        // Inp10 czujnik DS18B20 - nieprzypisany adres MAC czujnika lub odłączony
"ia12":["-800"],        // Inp11 czujnik DS18B20 - nieprzypisany adres MAC czujnika lub odłączony
"ia13":["220735"],      // Inp4D (34) (220,735 kWh) - całkowite zużycie - licznik 4
"ia14":["3"],           // Inp4D (35) (0,003 kWh) - chwilowe zużycie - licznik 4
"ia15":["0"],
"ia16":["0"],
"ia17":["0"],           //  (inpD3) całkowita produkcja licznik impulsów nr 3
"ia18":["0"],
"ia19":["8487"],        // Inp18 ?? (8,487 ADC)
"ia20":["0"],           //  (inpD1) całkowita produkcja licznik impulsów nr 1
"ia21":["0"],
"ia22":["0"],           //  (inpD2) całkowita produkcja licznik impulsów nr 2
"ia23":["0"],
"ia24":["0"],           // Chwilowy poziom przepływu przez licznik 1 - (0,00 kW)
"ia25":["0"],           // Chwilowy poziom przepływu przez licznik 2 - (0,00 kW)
"ia26":["0"],           // Chwilowy poziom przepływu przez licznik 3 - (0,00 kW)
"ia27":["17"],          // Chwilowy poziom przepływu przez licznik 4 - (0,17 kW)
"ia28":["-17"],         // Suma ia24, ia25, ia26, ia27
"ia29":["0"],
"ia30":["-800"],        // Inp12 czujnik DS18B20 - nieprzypisany adres MAC czujnika lub odłączony
"ia31":["-800"],        // Inp13 czujnik DS18B20 - nieprzypisany adres MAC czujnika lub odłączony
"ia32":["-800"],        // Inp14 czujnik DS18B20 - nieprzypisany adres MAC czujnika lub odłączony
"ia33":["-800"],        // Inp15 czujnik DS18B20 - nieprzypisany adres MAC czujnika lub odłączony
"ia34":["-800"],        // Inp16 czujnik DS18B20 - nieprzypisany adres MAC czujnika lub odłączony
"ia35":["-800"],        // Inp17 czujnik DS18B20 - nieprzypisany adres MAC czujnika lub odłączony
"sec0":["49"],
"sec1":["26"],
"sec2":["19"],
"sec3":["1"],
"sec4":["1598056271"]

Jeśli możesz to proszę wrzuć przykład jak zrobić czujnik lub podaj plik z przykładami “.json” .
Bo od dwóch dni walczę z tym i chyba mi na oczy padło ponieważ nie widzę jak stworzyć czujnik
z wartości “msg.payload.response.ia0[0]”.

Najpierw dodajesz encje w postaci pomocnika:
image
image
image
image
utworzony pomocnik:

Tworzymy widok Encji:
image


image

Tworzymy Proces (Flow) w NodeRed:


out0.json (7,3 KB)

Nie dopracowałem Ci warunku kiedy ma zmienić stan w LK, ale muszę pomyśleć nad warunkiem tak aby proces sam się nie zapętlił. Dziś już nie mam do tego głowy.
Na chwile obecną odczytuje stan z LK i zapisuje stan do pomocnika. Jutro postaram się opracować ustawianie stanu w LK z poziomu przycisku na “pulpicie” HA

image

Ze też sobie wybrałeś przełącznik (stycznik) zamiast czujnika temperatury :stuck_out_tongue_winking_eye:

1 polubienie

Dziękuje Ci za ogrom pracy jaki musiałeś w to włożyć na pewno przyda się wszystkim co mają LK i LM.
Z pomocnikami i przełącznikami to ogarnąłem ponieważ tak sterowałem w Domoticzu ale nie mogę złapać jaki sposób wskazać ten konkretny czujnik.
Jeśli nie zrobiłem literówki to u mnie “msg.payload.response.ia0[0]” to czujnik temp. LK
Moja wersja Lan kontrolera HW: 2.0 SW: 3.13 może to ułatwi nam zrozumienie.
Do pełnego szczęścia wystarczy mi pierwszy lepszy przykład z czujnikiem.

Zrób tak:


czyli z XML dodaj ścierzkę do noda debug:
image
wynik umieść jako odpowiedz lub załącz jako plik odp.json - bo w innym formacie forum nie przyjmie.
Wynik z debug wygląda mniej więcej tak:
image
jak klikniesz w ikonę wskazaną myszką to skopiuje Ci ścieżkę dostępu do danej.

Aby nod call service zadziałał (zielona kropka) musisz opóźnić start noda inject o bezpieczne 10s.
Lan Kontroler musi mieć wyłączoną autoryzacje:
image

Struktura XML u Twojej wersji LK może być inna niż przedstawiona przeze mnie:
image

@elektron81 daj znać czy działamy dalej bo temat trochę zastygł.

Nie wiem czy sobie poradziłeś, czy masz “wakacje” :stuck_out_tongue:

Cześć
na obecną chwilę mam za mało czasu na zabawę ponieważ jeżdżę w delegacjach i zostaje mi niedziela i to nie zawsze ( trójka małych szkrabów ).
Próbowałem ale mi się nie udało stworzyć czujnika.
Całą wiadomość odbieram w “debug” ( payload.response.ia3[0] “2753” )
A potrzebuję tylko odczyt czujnika.
Jedyne odczyty jakie chce robić to PT1000 i odczyt napięcia z paneli PV.
Dziękuję za pamięć pozdrawiam

Aby Ci pomóc potrzebuje cały obiekt response zwracany przez lm i jak by dało radę screenshot z strony lm z danymi z czujników (to mi mocno pomoże) Da mi to pełen obraz zwracanych parametrów z Twojego LM i będę w stanie zrobić proces.

image
image
image
image
image




// * Temperatury
var x=10; // dzielnik temperatura
msg.PT1000=Number(msg.payload.response.ia3[0])/x;
return msg;

Działa :grinning:
Super teraz mam to ogarnięte właśnie tego mi brakowało w całym programie.

Wielkie Dzięki za cierpliwość,wytrwałość i zrozumienie.

Po to jest to forum, by sobie pomagać. Każdy umie co innego :+1:

Witam, jestem nowy, próbuje zintegrować PVmonitor z HA. Wkleiłem json z opisu zmienilem ip na ip LK.
Wysyakuje mi taki błąd w debug, jak sprawdzić czy ha pobiera jakieś dane z LK?
Z góry dziękuję

LM nie może mieć nadanego dostępu na hasło

Dzięki, już wszystko działa.