Funkcja sprawdzająca stan różnych encji

Witam,
Jak poprawnie zapisać stan encji do zmiennej w funkcji, aby później jej użyć do instrukcji warunkowej if?
Próbuje zrobić automatyzacje, która będzie sprawdzać stan danego termostatu (generic_thermostat), i na podstawie tego, że jak choćby jeden ma stan ON uruchomi mi piec, a wyłączy jak wszystkie będą miały stan OFF. Niby proste, ale nie mogę sobie z tym poradzić. Próbowałem na contextach, zapisywać msg danego termostatu do zmiennej bezpośrednio ale nie działa mi to tak jak ma działąć. Na razie zrobiłem sobie szablon na testy z injectorem, funkcją oraz debagiem aby przetestować i przenieść to później do rzeczywistego działania.

autoonpiec

let kuchnia = context.get(msg.kuchnia);
let salon = context.get(msg.salon);
let pokoj = context.get(msg.pokoj);
let lazienka = context.get(msg.lazienka);
let garaz = context.get(msg.garaz);
let on = "on";
let off = "off";

if (kuchnia == on  || salon == on || pokoj == on || lazienka == on || garaz == on){
    let msg1 = {payload: "on"};
    return msg1;
}else{
    let msg2 = {payload: "off"};
    return msg2;
}

Bez contextu też próbowałem i nic z tego.

A czy takie coś nie da rady?
Przepraszam ale zrobiłem to na telefonie więc troszke nie dopracowane.
flows (5).json (3,2 KB)

1 polubienie

marcinwojciesz, dzieki za naprowadzenie. Dopiero zaczynam przygode z NR i trzeba sie troche przestawic zeby inaczej to sobie z obrazowac wzgledem standardowego programowania.
Sprawdze twoj flow, przetestuje i dam znac jakie sa wyniki.

Nie da rady… ten proces uruchamiany będzie tylko gdy zmieni się termostat1 i on będzie wiodący.

@djmaly… idziesz w dobrym kierunku, tylko jeszcze do końca nie połapałeś o co chodzi, przeczytaj i zadawaj bardziej “automowe” pytania. To co zrobiłeś jest całkowicie źle więc na początek ogranicz się do zapisu i odczytu jednej zmiennej.

1 polubienie

Właśnie przetestowałem rozwiązanie marcinwojciesz ale niestety nic, zero reakcji, podstawiam swoje dane wejściowe, wyjściowe i nic.
Wydaje mi się, że najlepiej było by to zrobić za pomocą noda event state, wysyłał by on stan podczas zmiany stanu w entity i trzeba ten stan zapisać do jakiejś zmiennej, która w funkcji będzie przyrównana do innych i na podstawie tego warunek if będzie wiedział co wystawić.

Muszę odszczekać przykład @marcinwojciesz będzie działać gdy proces będzie uruchamiany cylklicznie injectem.
@djmaly …co uruchamia Twój proces.
“technika” ze zmiennymi jest najbardziej poprawna.
Na początek naucz się zapisywać i odczytywać jedną zmienną wg podlinkowanego poradnika.
Na forum powinno być kilka moich przykładów.
flows (20).json (5,9 KB)

Ten akurat robi to za pomocą samych wyklikanych nodów.

2 polubienia

Właśnie testuje zapisywanie zmiennych z tego poradnika, ale od razu używam event state jako injectora ze stanem termostatu i zobaczymy co z tego wyjdzie.

:+1: naucz się tego, bo czas który teraz stracisz zwróci Ci się później i Twoje procesy będą prostsze i bardziej optymalne.
W NR jest narzędzie do sprawdzania stanu zmiennych … jakby co.

1 polubienie

Z przykładu marcinwojciesz nic nie miałem na wejściu pierwszego curent state. Myślę że injectorem trzeba uruchomić proces tylko jak go poprawnie ustawić jaką wysłać wiadomość inicjująca i jak ustawić czas wysyłki np. co 5s.

Ok, mimo wszystko spróbuje przećwiczyć zapis zmiennych i iść w tym kierunku.

A może ja to robię źle, bo event state wysyła mi wiadomość np. “on” lub “off” i ja tego nie mogę zapisać do zmiennej, więc musiałbym zamienić to na jakąś liczbę typu 1 lub 0? Dobrze kombinuje?

Nie idź w stronę światła :slight_smile:

w nodzie inject - repeat na interval i wybież czas powtórki

1 polubienie

No tak - mój proces trzeba czymś wywołać, może być jak napisał @RobinI30 cyklicznie injectem.
Nie sprawdzałem tego bo cały czas mam dostęp tylko z telefonu. Mój pomysł był taki na szybko. Myślę, że to co pisał @RobinI30 będzie bardziej odpowiednie - trudniejsze ale lepsze.
Nad moim pomysłem myślę, że też to zbudujesz odpowiednio go modyfikując.

…możesz zmienna może być dowolnego typ nawet on/off.

1 polubienie

Na szybko przetestowałem przykład marcinwojciesz i działa teraz ale nie dokońca, Wszystkie termostaty off a i tak uruchamia się piec i z automaty włącza dwa inne termostaty co nie powinno.

Ale widze, że termostaty łazienka i garaż masz “on” więc włącza piec, jeśli by były na off to powinno dojsc do wyłączenia pieca.

No tak, ale termostat powinien być wyłączony bo temperatura jest osiągnięta z dużym zapasem a mimo to samoczynnie przełącza je na on, nie wiem dlaczego.

Edit:

Dobra, chyba mam to tak jak wyobrażałem sobie to na początku, przykład kodu funkcji na jednej zmiennej:

context.set('kuchnia', msg.kuchnia);
let kuchnia = context.get('kuchnia');

if(kuchnia == "on"){
    let msg1 = { payload: "Włączony" };
    return msg1;
}else{
    let msg2 = { payload: "Wyłączony" };
    return msg2;
}

Działa już teraz jak ma działać, przeniosę to w odniesieniu do wszystkich termostatów i zobaczę jak się to będzie zachowywać.

Ciekawi mnie przykład marcinwojciesz dlaczego się to tak zachowuje. Wrzucam plik do weryfikacji flow, być może trzeba jeszcze coś ustawić.
flows.json (5,2 KB)

W sumie nie wiem po co robisz takie fikołki? Może docelowo będzie to czemuś służyć :slight_smile:

Używając context ograniczasz się zasięgiem tylko do samego tego jednego noda funkcyjnego.
Przeczytaj o różnicach zasięgu widzialności zmiennych context, flow, global.

1 polubienie

Fikołki tzn. w kodzie funkcji czy ogólnie w tym co chcę zrobić?

  1. W każdym pomieszczeniu znajduje się czujka temp/hum zigbee.
  2. Na podstawie czujek z danego pomieszczenia w HA zrobiony jest termostat generic_thermostat.
  3. Na każdej pętli ogrzewania podłogowego zamontowany siłownik elektryczny ON/OFF.
  4. Do sterowania siłownikami zostały użyte 2 przełączniku z 3 wyjściami napięciowymi zigbee. W sumie jest 6 wyjść napięciowych, z których 5 odpowiadają za sterowanie strefami kuchnia, salon, pokój, łazienka, garaż.
  5. Obsługę otwarcia danej strefy realizuje generic_thermostat. Ale 1 wyjście napięciowe, zostało przewidziane do funkcji włączenia pieca do ogrzewania, które jest przewodem podłączone pod piec za pomocą przekaźnika, który zwiera wejście bez napięciowe pieca.

Dlatego potrzebuje zrobić taką prosta automatyzację tego 1 wyjścia napięciowego, a zmienne maja i będą wykorzystane tylko w obrębie tej funkcji, nie potrzebuje ich nigdzie indziej (na dzień dzisiejszy :slight_smile: ). Identyczna funkcjonalność będzie zrobiona na poddaszu domu z taka sama ilością stref.

Dopisałem resztę termostatów i lipa. W podglądach context pokazuje mi tylko jedną zmienną, która akurat została zapisana, nie pokazuje wszystkich, tak jakby po odczycie danego stanu z termostatu zapisuje tylko go a reszta jest kasowana.
flows (1).json (5,9 KB)

Miałem na myśli raczej takie fikołki:
1.

context.set('kuchnia', msg.kuchnia);
let kuchnia = context.get('kuchnia');

po co w ogóle to pamiętać, nie lepiej wprost operować na msg.kuchnia.

if(kuchnia == "on"){
    let msg1 = { payload: "Włączony" };
    return msg1;

po co zminiać “on” na “włączony” i po co zapisywać to w jakimś szczególnym msg1 msg2 - po returnie i tak nie do odróżnienia. Jestem ciekaw co tam docelowo wymyślisz.

Każdy state termostatu zapisuj w osobnym flow.kuchnia (itp) przez proste połączenie events:state >set flow.kuchnia.
Każde zmiany na termostatach będą aktualizowane w zmiennych. Będzie się to działo “obok” procesu głównego.

Następnie cyklicznie uruchamiasz proces główny, który operuje na zapamiętanych wartościach.
Mniej więcej tak jak w załączonym przykładzie.

1 polubienie

Ponieważ po starcie nie istnieją, tworzone są dopiero wtedy gdy zmieni się stan.
Musisz je odczytać (warunki początkowe) raz na początku przez current state. Jednak na zmiennych typu contex nie uda ci się (bo niewidoczne są poza funkcją. W przykładzie służy do tego nod “test”.

edit …do części widzię, że już sam doszedłeś :slight_smile:

1 polubienie

Czyli rozumiem, że funkcja działa i operuje na aktualnych zmiennych, które dostała. W tym przypadku jeśli dostanie informacje i zapisze je do jednej zmiennej to na niej operuje bo reszta jest pusta. Musze zrobić coś co będzie od razu przesyłać stan wszystkich zmiennych do funkcji tej, jako głównej i ona już zdecyduje czy włączyć czy nie.

Domyślam się, że zamiast event_state zastosować curent_state wywoływane wszystkie cyklicznie, więc funkcja dostanie na raz informacje.

Muszę to na spokojnie sprawdzić bo na razie tego nie widzę.