Encja niedostępna obejście w NR

Witajcie.

Steruje ogrzewaniem w domu teściowej z użyciem dwóch źródeł ciepła. Mam flow w NR który działa całkiem dobrze ALE jest zawsze jakieś.

Mianowicie sterowanie włączenie i wyłączenie pieca na pellet realizuje z użyciem przekaźnika podłączonego do esp32 które działa pod kontrolą esphome.

Niestety czasem “encja” wypada nie wiadomo czemu. Problemem jest jak "wypadnie kiedy ma się wykonać skrypt NR związany z włączeniem lub wyłączeniem. Flow dochodzi do encji która ma stan “niedostępny” i tyle.

image

Ma ktoś jakiś pomysł jak to “oprogramować” że jak jest taka sytuacja to ma np spróbować za 1-5 min ponownie?

Zmienić noda “Termostat salon ON/OFF” z event na state i napędzać to cyklicznie np. co 1min.

Też o tym myślałem ale czy koniecznie musze zaśmiecać HA uruchomieniem co chwile kiedy to nie jest niezbędne? Chciałem poznać inne rozwiązanie kłopotu bo może sie to przydać w innych sytuacjach :slight_smile:

Na początku też tak myślałem, że nody odpytują HA.
Jednak kopia “całego HA” trzymany jest w zmiennej globalnej i jest odświeżana czy korzystasz z jakiś encji czy też nie. Możesz nawet bezpośrednio ze zmiennej homeassistant odczytywać stany nie używając niebieskich nodów.

Nie bardzo rozumiem co chcesz mi przekazać :slight_smile:

To, że nod dla odczytu state wcale nie odwołuje się do HA tylko odczytuje z NR zmienną, więc nie “zaśmiecasz” HA.
Jeśli sobie sprawdzisz w contex>global to znajdziesz dane, który w ogóle nie używasz w procesach. Można więc do woli odczytywać stany bez wpływu na obciążenie HA.

1 polubienie

Jak dobrać się do takiej danej - Możesz wkleić jakiś przykład składni?

msg.payload= global.get('homeassistant.homeAssistant.states["person.robert"].state');
return msg;

Ze zmiennych “contex”>“global” robisz “copy path” tego co cię interesuje.
Z przodu trzeba tylko dopisać " homeassistant. "

Dzięki, działa :slight_smile:
próbowałem właśnie ze ścieżka, ale bez tego prefixu homeassistant. Pytanie - czy ten prefix związany jest z lokalizacją plików HA? Pewnie to pytanie retoryczne bo zapewne tak jest. Czyli jak dojdzie do podobnej sytuacji jak kilka tygodni temu, w której katalog z plikami HA zmienił się z config na homeassistant - trzeba będzie to zmodyfikować w skryptach …

Nie wiem, dzisiaj zaktualizuję HA to sprawdzę. Skoro mam starą wersję a Ty nową i to działa to pewnie nic się nie zmieni. Przedrostek prawdopodobnie pochodzi od nazwy “serwera”, użytej w NR.
Ten sposób przydaje się gdy w funkcji musisz znać stan wielu encji jednocześnie.

P.S.

Po aktualizacji nic takiego nie nastąpiło, config jest bez zmian?

Dzieki,
Co do problemów z katalogami, to chodziło o coś takiego, opisanego tu:

Początkowo dyskusja tyczy sie przywracania backupu ale potem właśnie wspomnianych lokalizacji.
Nigdy nie korzystałem z rozwiązania które Podpowiedziałeś i dlatego nie wiem jak było poprzednio (jaka była ścieżka do tych zmiennych globalnych). Co do samego odwoływania się do contextu - super temat, jeszcze raz dzięki.
Pozdrawiam
Tomek

W ramach uzupełnienia:

i:
https://nodered.org/docs/api/context/store/memory

Cześć, podrążę jeszcze temat. Poszukuję sposobu na pobranie ostatniego stanu (wartości) encji. W moim HA dane encji zapisuję do bazy mysql (pewnie bez znaczenia, domyślnie też jest o baza tylko że prostsza). Jak dobrze pamiętam, baza zachowuje dane z dwóch tygodni.
Z tego co udało się rozpoznać, to z encjami sprawa wygląda tak, ze są to byty, które po restarcie HA (lub przeładowaniu konfiguracji) musza być zainicjowane, aby zaistnieć dla HA. W przypadku, kiedy nie zostały zainicjowane to zarówno “niebieskie kontrolki” (curent_state czy get entities) jak i zmienne w global odpowiedzą statusem “unknown” lub podobnie bezużytecznym. Jedynie Kontrolka get history zwraca tablicę wartości z podanego zakresu. No i tu widać, że jak np pobiorę dane z okresu, w którym dane nie były uzupełniane, to tablica będzie “zeroelementowa”. Jeżeli natomiast wybiorę zakres w którym dane są zapisane - to je dostanę. No i tu pytanie - jak z poziomu kodu funkcji zapytać HA o ostatnią zapisaną wartość dla danej encji.
Dodam, ze tablica wyników też wygląda “różnie” - przykładowo mam encję do której zapisuję wartości zmiennoprzecinkowe. No i jak patrzę w wyniki z get history, to ostatni wynik ma wartość state: “unknown” , przedostatni: “” (czyli pusty) i dopiero następny ma wartość oczekiwaną.
Oczywiście można napisać funkcję, która pobierze x ostatnich minut(godzin) i sprawdzi ilość wyników i na tej podstawie oceni kiedy był ostatni użyteczny zapis, ale może istnieje prostszy i bardziej elegancki sposób, jakiś magiczny get_last() :slight_smile:

Dziękuję, teraz jest nieco jaśniej:) choć nadal mgła dosyć gęsta - czy Mógłbyś podać przykład jak do zmiennej pobrać ostatni stan encji?
Wiem jak to zrobić pobierając go z cache (global). Ale nie poradziłem sobie z pobraniem ich ze źródła.
Sprawdziłem za pomocą kontrolki get entities - w zwróconym obiekcie mam między innymi interesujące mnie daty last_changed i last_updated a także ilość ms która upłynęła od ostatniej zmiany. Ponadto mam też context, w którym zawarto między innymi id, który pewnie wskazuje na rekord zawierający ostatnią sensowną wartość.
Tylko jak z tego wyłuskać te informacje (czyli ostatnią sensowną wartość encji)?

Jeszcze jedno - przy okazji wskazanego przez Ciebie drugiego linku - czy jest możliwość bezpośredniego użycia SQL-a w kodzie funkcji?

Skontaktuj się z @RobinI30 on tu jest :man_mage: od kodu

SQL:
https://youtu.be/w1SRebmR_NY?si=8ddUCIhTY-lOlz8i

Czytałem kilka razy i nie czuję istoty problemu. Prawdopodobnie nie mam wystarczającej wiedzy, tym bardziej aby coś doradzić.

Dzięki wielkie za pomoc i nakierowanie (kiedyś już chyba korzystałem z tych klocków DB, ale z powodu “pesel” jakoś umknęło).
Dzieki raz jeszcze

Edit:

Dzięki @RobinI30 Robinl30, przepraszam za chaos, spróbuję wyjaśnić:
Pobranie stanów encji w trybie, kiedy są one dostępne w cache - ok, działa super,
fajnie że te dane są “bezwysiłkowo” dla HA dostępne “tu i teraz”. Problem się robi w momencie restartu HA (lub przeładowania konfiguracji) - kiedy te dane są jeszcze niedostępne w cache. Mam potrzebę, aby przed zapisaniem nowego stanu konkretnej encji znać ostatni jej stan (konkretnie wartość liczbową). No i tu pojawia się potrzeba zapytania HA o ten stan (zapisany w przeszłości). Jak to zrobić?
Tomek

Mam takie przypadki, że muszę znać poprzedni stan.
Zapamiętuję wtedy odczytaną daną dla kolejnej iteracji, a cały proces zaczyna właściwie działać od drugiej próbki.
Inną metodą jest zapisanie jej w mqtt z falgą retain. Po resecie i połączeniu do mqtt, ostatnia wartość jest automatycznie odtwarzana. Ta metoda w porównaniu do pierwszej nie zapewnia jednak tego czy zapamiętana dana jest odpowiednio świeża.
Może to wszystko to tylko łatka ale się sprawdza.

Zapamiętuję wtedy odczytaną daną dla kolejnej iteracji, a cały proces zaczyna właściwie działać od drugiej próbki.

Jasne, też tak robiłem, ale w tym przypadku mam licznik, który ma określone dane i na ich podstawie generowane są nowe. Zatem stan muszę wydobyć z historii.

Inną metodą jest zapisanie jej w mqtt z falgą retain

Kiedyś się na tym sparzyłem. Wtedy zapisywałem dane po prostu do pliku. mam system którego uptime jest w granicach 1300 dni:) i nadal działa (na Raspberym, dane zapisuję do dysku SSD podpiętego przez usb.

W tej konkretnej sytuacji albo ogarnę temat przez plik, albo popróbuję z SQL. ciekawe co bardziej obciąży HA. Pewnie zapis do pliku, bo o ile sam odczyt nastąpi tylko raz po restarcie, to zapis muszę mieć każdy, bo nigdy nie wiem który będzie ostatni. Ale w sumie te zapisy będą dosyć “rzadkie”, bo mam 12 liczników z odświeżaniem co ok minutę. Do przemyślenia.

Inna opcja - skoro nie ma fajnej metody na pobranie ostatniej “dobrej” wartości to można by pobierać historię encji (tylko jak się do tego zabrać od strony kodu - jak ją wywołać - Wiesz może?) i sprawdzać kilka ostatnich zwróconych obiektów pod kątem występowania wartości, która jest liczbą. I dopiero jak jej nie ma - zainicjowanie od zera.