Dziękuję Wam wszystkim za uznanie, staram się pomagać jak tylko coś wiem lub wiem gdzie poszukać. Takiego też podejścia do forum oczekiwałbym od wszystkich i faktycznie wtedy będzie łatwiej.
P.S. Przesiadłem się na LTS i Darka - nie było lekko przy mojej ilości integracji instalacja paczek python’owych trwała “wieki”. Ale finalnie mogę się pochwalić, że obyło się bez pełnego restartu aplikacji, czyli mój licznik pełnych restartów aplikacji = 0.
P.S.2 Czy ktoś kto jest na LTS używa integracji InfluxDB? To jedyna integracja która mi nie wstała.
3. Pamięć nie używana to pamięć zmarnowana - krok 1.
Tak jak wyjaśnialiśmy na początku wpisu system Linux/Android w przypadku gdy kończy mu się pamięć “nie cacka” się z programami tylko je kill-uje.
Dlatego jeżeli ktoś ma logowanie zdarzeń do pamięci i generuje dużo zdarzeń to może skończyć się pamięć i system zabije usługę która zajmuje pamięć.
Nie jest to nic nadzwyczajnego tak to działa wszędzie, tzn. w każdym systemie który nie pokazuje Blue Screen of Death
Oczywiście nam zależy na tym żeby taka sytuacja jak restart naszej aplikacji z powodu braku pamięci nie miała miejsca. Do tej pory ustawialiśmy naszej aplikacji priorytety w systemie, tak żeby była ostatnia do zabicia. W dokumentacji wyjaśniamy też, że w przypadku generowania większej ilości zdarzeń zalecamy zapis nie w pamięci ale na zewnętrznym dysku lub zdalnej bazie (oczywiście wiemy, że nie jest to proste i są z tym problemy - ten temat rozwiążemy w przyszłości).
Z drugiej strony wyznajemy zasadę (taką jak w systemie Linux/Android), że nie używane zasoby pamięci są zmarnowane i należało by wykorzystać maksymalnie całą dostępną pamięć. Pracujemy nad sprzętem który będzie miał sporo pamięci i aż się będzie prosił żeby do tej pamięci pisać więcej
W tym kierunku teraz właśnie idziemy i dodaliśmy pierwsze zabezpieczenie przed restartowaniem serwisu Asystent domowy na bramce w przypadku małej ilości pamięci.
A dokładnie zaimplementowaliśmy metodę onTrimMemory z interfejsu Android ComponentCallbacks2
Gdy system operacyjny ustali, że jest to dobry moment, aby nasz proces usunął zbędne rzeczy z pamięci (bo nie jest w stanie utrzymać tyle procesów w tle, ile byśmy chcieli). To wyśle nam wiadomość → trim_memory z informacją o poziomie zajętości pamięci. Jeżeli poziom jest TRIM_MEMORY_RUNNING_CRITICAL to zalogujemy informacje w Asystent domowy i sprawimy czy użytkownik ma bazę w pamięci urządzenia. Jeżeli tak to wyczyścimy tą bazę i zwolnimy pamięć. Dzięki temu system będzie nadal działał bez restartu naszego serwisu.
W tej wersji zrobimy tylko krok 1. - czyszczenie bazy w pamięci.
W przyszłości, być może zdecydujemy się na kolejny krok 2. (który widać w kodzie a który teraz nic jeszcze nie robi tylko loguje). Ten kolejny krok to zabijanie procesów z poziomu Asystenta domowego, które zużywają pamięć a które nie są naszymi procesami. Chodzi tu np. on Node-RED, serwery, usługi czy inne rzeczy które użytkownicy instalują na bramce i dziwią się, że coś im się serwis AIS restartuje z “niewyjaśnionych przyczyn”.
Zanim dojedzie do kroku 2. to oczywiście wyjaśnimy jak będzie działał ten mechanizm. Żeby była jasność - na tą chwilę my nic nie zabijamy (to system operacyjny zabija procesy jak mu brakuje pamięci), my staramy się zwolnić pamięć, tak żeby system nie zabił naszego procesu.
Jeszcze jedna uwaga dla osób które myślą, że na mocnym sprzęcie można robić wszystko i ich problemy spowodowane są za małymi zasobami.
Na mocniejszym sprzęcie na pewno da się robić więcej i szybciej ale jeżeli program robi “coś głupiego” to nie pomoże więcej procesora czy pamięci efekt będzie taki sam.
Czyli jeżeli jakiś program będzie zjadał pamięć to zawsze będzie jej za mało i zawsze będzie prowadziło to do tego samego - zabicie/restart procesu z powodu braku pamięci w systemie.
1. Łatwiejsze przywracanie ustawień z kopii zapasowej po pełnym restarcie
Szykujemy się do wymuszenia aktualizacji do LTS, ech ten Darek ;)… to będzie długo zapamiętana wersja.
Ale żeby osłodzić przejście na Darka i uprościć przywracanie ustawień z kopii po pełnym resecie aplikacji (to może być najszybsza droga do LTS), dodaliśmy łatwiejszy sposób na przywrócenie ustawień z kopii.
Teraz region do przywracania ustawień jest na pierwszym ekranie (nie trzeba się już logować żeby przywrócić ustawienia).
Istotne jest tu to, że my hasła które było użyte do szyfrowania kopii nie znamy. To Wy robiąc kopie szyfrujecie ją hasłem (które nigdy nie jest do nas przesyłane), taki jest sens tego szyfrowania inaczej mogli byśmy rozpakować wasze konfiguracje i zobaczyć hasła itd…
Czyli tylko użytkownik który zna hasło, może rozpakować swoją kopię podając hasło. My tu możemy pokazać tylko logi z procesu przywracania ustawień z kopii, żeby było wiadomo czy wszystko poszło OK.
2. Integracja SUPLA
Potwierdziliśmy z Przemkiem z SUPLA, że MQTT wchodzi u nich na produkcje, instalacja trwa od wczoraj.
Oficjalnie zaznaczamy wcześniejszą integrację jako przestarzałą i dostarczamy nową/oficjalną, która lada chwila powinna działać z produkcyjnymi serwerami SUPLA.
A w Logach
Logger: homeassistant.components.ais_updater
Source: components/ais_updater/init.py:612
Integration: AIS Updater (documentation, issues)
First occurred: 14:07:17 (2 occurrences)
Last logged: 14:07:46
następnie wrócić do aplikacji i aktualizacja będzie już OK
W kolejnej wersji dodaliśmy zabezpieczenie przed taką sytuacją.
2. Dodaliśmy komunikat o konieczności aktualizacji do LTS
to się pojawi każdemu kto będzie próbował aktualizować bramkę nie mając Pythona w wersji 3.9
3. Integracja z SUPLA MQTT
Aktualizacja serwerów SUPLA jeszcze trwa, ale jeżeli Twój serwer został już zaktualizowany to powinna już działać integracja z produkcyjnymi serwerami SUPLA.
Widać tam ilość otrzymanych od SUPL-a wiadomości, te pierwsze wiadomości to komunikaty które opisują urządzenia - MQTT discovery.
Na podstawie tych komunikatów w systemie dodadzą się urządzenia MQTT SUPLA.
Przełączniki i czujniki z SUPLA Cloud pojawią się w integracji MQTT:
@jolka sprawdźcie proszę co się stało z serwerem ftp. Nie mogę się połączyć lokalnie, a klient ftp pokazuje, że bramka jest offline. Sprawdziłem już wszystko, router, zaporę sieciową na Windows i oprogramowaniu antywirusowym bez powodzenia.
sprawdziliśmy na kilku bramkach - działa OK
zarówno bez portu (na standardowym 21) i na 1024
inna sprawa, że to z Linux-a robimy, był kiedyś jakiś problem z Windows i zostało to dokładnie opisane w dokumentacji - upewnij się, że robisz tak jak w opisie: