Storage - czyli przechowywanie danych w urządzeniach

Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

lukfud pisze: pn gru 28, 2020 12:40 pm Gdyby na urządzeniu oprócz rolety pojawił się inny element, dla którego chcielibyśmy ustawić interwał np. 2h, to dla rolety mógłby być on już za długi.
Przykład? :)

Można to rozbudowywać, tylko w zasadzie nie wiem po co. Do przechowywania danych najlpiej dołożyć sobie kostkę FRAM, a wtedy częstotliwość zapisu nie stanowi żadnego problemu.

Poza tym zapis i tak jest wykonywany tylko dla elementów, których stan się zmienił. Jeśli masz coś co przez długi okres czasu nie zmienia stanu, to zapis i tak się nie wykona.
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posty: 5186
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

klew pisze: pn gru 28, 2020 10:22 am Dodam metodę, która taki zapis wymusi. Ręcznie musiałbyś wykonać tą sekwencję:

Kod: Zaznacz cały

 Supla::Storage::PrepareState();
    for (auto element = Supla::Element::begin(); element != nullptr;
         element = element->next()) {
      element->onSaveState();
    }
    Supla::Storage::FinalizeSaveState();
 
Dzięki działa :)

@klew Czy dałbyś radę dodać możliwość definiowania rożnych czasów zapisu w zależności od rodzaju kanału? np. zapis stanu przekaźnika robić co 30s a dla licznika energii co 15min :)
https://gui-generic-builder.supla.io/
Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

klew pisze: pn gru 28, 2020 12:51 pm Przykład? :)
W sumie przykład podrzucił wyżej @krycha88.
Jak już przy licznikach energii, chciałbym aby zapis był robiony tylko wtedy, kiedy włączony jest przekaźnik, włączona jest dioda, cokolwiek, jakiś "if". Jest taka możliwość?
https://www.facebook.com/groups/supladiy/
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

lukfud pisze: pn gru 28, 2020 8:46 pm
klew pisze: pn gru 28, 2020 12:51 pm Przykład? :)
W sumie przykład podrzucił wyżej @krycha88.
Jak już przy licznikach energii, chciałbym aby zapis był robiony tylko wtedy, kiedy włączony jest przekaźnik, włączona jest dioda, cokolwiek, jakiś "if". Jest taka możliwość?
Zapis wykonuje się tylko wtedy, gdy zmieni się wartość licznika ;). "if" już jest :P
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

klew pisze: pn gru 28, 2020 11:11 pm Zapis wykonuje się tylko wtedy, gdy zmieni się wartość licznika ;). "if" już jest :P
Dobrze wiesz o co mi chodzi :D
https://www.facebook.com/groups/supladiy/
krycha88
Posty: 5186
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

A co z moją propozycją? Nie warta uwagi ? :roll:
https://gui-generic-builder.supla.io/
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

krycha88 pisze: wt gru 29, 2020 1:17 am A co z moją propozycją? Nie warta uwagi ? :roll:
Zastanawiam się nad tym. Nie chciałbym dodawać do każdej klasy zapisującej dane oddzielnego czasu, bo wtedy do każdej instancji trzeba by dodać timestamp ostatniego zapisu oraz czas po którym ma być zrobiony kolejny zapis. A to dodatkowe bajty pamięci w każdej klasie (a pamięć oszczędzamy ze względu na Arduino Mega).
Alternatywnie można by zrobić "Storage dwóch prędkości" i wtedy możnaby określić osobne interwały dla "szybkich" i "wolnych" kanałów - z tym , że nie byłoby mozliwości decydowania samemu, który kanał jest szybki, a który wolny, tylko byłoby to zaszyte w kodzie.

Alternatywnie mniej pamięciożerne rozwiązanie względem pierwszego wariantu, polegałoby na określeniu że dana instancja ma robić zapis na co N-tej próbie zapisu. Wtedy do każdej klasy dołożylibyśmy 2 bajty (jeden by liczył ile zapisów pominęliśmy, a drugi by pamiętał ile mamy ustawione do pomijania). Wtedy np. przy 30 s interwale, moglibyśmy powiedzieć "zapisuj co 30 prób zapisu" i zapis byłby robiony co 15 min.

Niestety za bardzo mi te pomysły się nie podobają ;).
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posty: 5186
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

może nie warto być aż tak precyzyjnym z tymi czasami?

Zawsze działa interwały który jest najdłuższy ustawiony za pomocą setStateSavePeriod. Jeżeli wywoła się jakaś akcja np. przełączenia przekaźnika to czas się restartuje i wykonuje się ten czas ustawiony dla przekaźnika po wykonaniu zapisu dalej by działał interwał długi. Nie trzeba by było rozróżniać rodzaju kanału.
https://gui-generic-builder.supla.io/
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

krycha88 pisze: wt gru 29, 2020 9:18 am może nie warto być aż tak precyzyjnym z tymi czasami?

Zawsze działa interwały który jest najdłuższy ustawiony za pomocą setStateSavePeriod. Jeżeli wywoła się jakaś akcja np. przełączenia przekaźnika to czas się restartuje i wykonuje się ten czas ustawiony dla przekaźnika po wykonaniu zapisu dalej by działał interwał długi. Nie trzeba by było rozróżniać rodzaju kanału.
To chyba dobry kierunek. Zrobię tak, że klasy przekaźników i rolet będą po zmianie stanu (albo po zakończeniu ruchu) dodawać "zaplanowany" zapis za 5 s. Jeśli interwałowy zapis będzie szybciej, to on się wykona, a jeśli nie, to po 5 s wykona się zapis.

Będzie to wyglądało w kodzie tak, że dojdzie metoda:

Kod: Zaznacz cały

Supla::Storage::ScheduleSave(czas_w_ms);
Można będzie też tej metody użyć, aby wymusić "natychmiastowy" zapis. Dałem w cudzysłowie, bo zapis wykona się przy następnej iteracji SuplaDevice.
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posty: 5186
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

już czekam na implementację :)
https://gui-generic-builder.supla.io/
ODPOWIEDZ

Wróć do „Arduino IDE”