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.
Ma ktoś jakiś pomysł jak to “oprogramować” że jak jest taka sytuacja to ma np spróbować za 1-5 min ponownie?
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
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.
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.
Dzięki, działa
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
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()
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?
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.