Storage - czyli przechowywanie danych w urządzeniach

User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

lukfud wrote: Mon Dec 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.
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

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

Code: Select all

 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/
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

klew wrote: Mon Dec 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
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

lukfud wrote: Mon Dec 28, 2020 8:46 pm
klew wrote: Mon Dec 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
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

klew wrote: Mon Dec 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
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

A co z moją propozycją? Nie warta uwagi ? :roll:
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

krycha88 wrote: Tue Dec 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ą ;).
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

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/
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

krycha88 wrote: Tue Dec 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:

Code: Select all

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.
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

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

Return to “Arduino IDE”