Storage - czyli przechowywanie danych w urządzeniach

Awatar użytkownika
klew
Posty: 1309
Rejestracja: czw cze 27, 2019 12:16 pm

pt wrz 11, 2020 8:41 pm

Niedawno do biblioteki SuplaDevice na Arduino IDE zostały dodane klasy typu Supla::Storage. Na razie są tam dwie implementacje:

Kod: Zaznacz cały

#include <supla/storage/eeprom.h>
oraz

Kod: Zaznacz cały

#include <supla/storage/fram_spi.h>
Ta pierwsza pracuje na wbudowanej pamięci EEPROM (na Arduino Mega) oraz na pamięci flash (ESP8266, ESP32).
Ta druga wymaga zewnętrznego urządzenia Adafruit FRAM SPI (w google łatwo znaleźć instrukcję podłączenia).
W tej chwili zapis do EEPROM/Flash jest robiony co 10 s, ale zapisuje tylko, gdy jest taka potrzeba. Ten domyślny czas będzie wydłużony (pewnie na 3-5 min). EEPROM/Flash trzeba oszczędzać, bo z reguły działa do około 100 000 zapisów. Dlatego wszystkim polecam doinstalować sobie pamięć FRAM (aktualnie wspieramy Adafruit FRAM SPI - jeśli ktoś ma inną kostkę, to dajcie znać). FRAM jest praktycznie niezniszczalny i bardzo szybki. Dlatego tutaj zapis jest realizowany co 1 s (o ile jest taka potrzeba).

Podstawowa obsługa Storage jest bardzo prosta. Wystarczy dodać odpowiedni include (jeden z dwóch opisanych wyżej) i potem stworzyć instancję odpowiedniej klasy (jedna z poniższych):

Kod: Zaznacz cały

// Hardware SPI
Supla::FramSpi fram(FRAM_CS, SUPLA_STORAGE_OFFSET);
// Software SPI
Supla::FramSpi fram(24, 22, 23, FRAM_CS, SUPLA_STORAGE_OFFSET); // <- sofrware spi, piny (SCK, MISO, MOSI, CS)
// EEPROM / Flash
Supla::Eeprom eeprom(SUPLA_STORAGE_OFFSET);
OFFSET oznacza adres, od którego zaczynamy zapis (domyślnie 0, ale można ustawić inny).

Tak wyposażony program będzie sobie zapisywał różne dane do pamięci trwałej (np. liczniki impulsów - zapiszą ilość impulsów, rolety zapiszą czas otwierania/zamykania oraz pozycję rolety, kolejne rzeczy będą dodane wkrótce).

Obsługa Storage będzie w najbliższym czasie rozbudowywana (np. sprawdzanie CRC, duplikowanie niektórych zapisów, aby się zabezpieczyć przed utratą danych, dodawanie nowych urządzeń przechowujących stan).
lukfud
Posty: 559
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

czw paź 01, 2020 12:52 pm

Widzę, że dorzuciłeś zapis stanu przekaźników. Opiszesz w wolnej chwili?
lukfud
Posty: 559
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

śr paź 07, 2020 7:53 am

@klew, jeśli dodam metodę

Kod: Zaznacz cały

eeprom.setStateSavePeriod(0);
to wskoczy domyślne 3 minuty?
Awatar użytkownika
klew
Posty: 1309
Rejestracja: czw cze 27, 2019 12:16 pm

śr paź 07, 2020 7:54 am

lukfud pisze:
śr paź 07, 2020 7:53 am
@klew, jeśli dodam metodę

Kod: Zaznacz cały

eeprom.setStateSavePeriod(0);
to wskoczy domyślne 3 minuty?
Nie. Jeśli podasz wartość mniejszą od 1000, to ustawia 1000, czyli 1 s.
lukfud
Posty: 559
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

śr paź 07, 2020 7:59 am

klew pisze:
śr paź 07, 2020 7:54 am
lukfud pisze:
śr paź 07, 2020 7:53 am
@klew, jeśli dodam metodę

Kod: Zaznacz cały

eeprom.setStateSavePeriod(0);
to wskoczy domyślne 3 minuty?
Nie. Jeśli podasz wartość mniejszą od 1000, to ustawia 1000, czyli 1 s.
Fakt, patrzę na to i nie widzę :)
To może zmień na te domyślne 3 minuty.. będzie spójność.
Awatar użytkownika
klew
Posty: 1309
Rejestracja: czw cze 27, 2019 12:16 pm

śr paź 07, 2020 8:04 am

lukfud pisze:
śr paź 07, 2020 7:59 am
Fakt, patrzę na to i nie widzę :)
To może zmień na te domyślne 3 minuty.. będzie spójność.
Spójność z czym? ;)
lukfud
Posty: 559
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

śr paź 07, 2020 8:08 am

klew pisze:
śr paź 07, 2020 8:04 am
lukfud pisze:
śr paź 07, 2020 7:59 am
Fakt, patrzę na to i nie widzę :)
To może zmień na te domyślne 3 minuty.. będzie spójność.
Spójność z czym? ;)
Jeśli nie użyję metody

Kod: Zaznacz cały

setStateSavePeriod(SUPLA_EEPROM_WRITING_PERIOD);
zapis będzie co 3 min., a jeśli użyję z wpisanym zerem to minuta. Dlaczego tak? :)
Awatar użytkownika
Goral64
Posty: 622
Rejestracja: pt gru 27, 2019 6:22 pm

śr paź 07, 2020 8:33 am

lukfud pisze:
śr paź 07, 2020 8:08 am
Jeśli nie użyję metody

Kod: Zaznacz cały

setStateSavePeriod(SUPLA_EEPROM_WRITING_PERIOD);
zapis będzie co 3 min., a jeśli użyję z wpisanym zerem to minuta. Dlaczego tak? :)
Jeśli z zerem to sekunda.
Pytanie czy tu zero powinno ustawiać domyślną czy najmniejszą możliwą wartość? A może powinno generować błąd, że wartość minimalna to 1000?
RPi4: Supla Cloud + Supla Scripts + Proxy + Let's Encrypt
1x MEW-01, 1x LIW-01, 2x SBW-02, 2x PNW-01, 1x ROW-01, 1x ROW-02, 2x ROW-04m, 1x ROW-07,
2x Sonoff BRIDGE RF 433
This is only the beggining...
lukfud
Posty: 559
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

śr paź 07, 2020 9:02 am

Goral64 pisze:
śr paź 07, 2020 8:33 am
Jeśli z zerem to sekunda.
Pytanie czy tu zero powinno ustawiać domyślną czy najmniejszą możliwą wartość? A może powinno generować błąd, że wartość minimalna to 1000?
Tak, sekunda (o niej myślałem), dzięki.
Jeśli domyślnie @klew wstawił 3 minuty, to zero mogłoby wskazywać na tą właśnie wartość ;)
Awatar użytkownika
Goral64
Posty: 622
Rejestracja: pt gru 27, 2019 6:22 pm

śr paź 07, 2020 10:02 am

lukfud pisze:
śr paź 07, 2020 9:02 am
Jeśli domyślnie @klew wstawił 3 minuty, to zero mogłoby wskazywać na tą właśnie wartość ;)
Będę się upierał, że brak wartości powinien przywoływać wartość domyślną :) Podanie jakiejkolwiek innej wartości powinno ustawiać tę wartość pod warunkiem, że jest w prawidłowym przedziale.
Czyli:

Kod: Zaznacz cały

setStateSavePeriod(1000); // 1 sekunda
setStateSavePeriod(0); // błąd (lub też wyłączenie autozapisu statusu)
setStateSavePeriod(); // wartość domyślna 180000 czyli 3 min
RPi4: Supla Cloud + Supla Scripts + Proxy + Let's Encrypt
1x MEW-01, 1x LIW-01, 2x SBW-02, 2x PNW-01, 1x ROW-01, 1x ROW-02, 2x ROW-04m, 1x ROW-07,
2x Sonoff BRIDGE RF 433
This is only the beggining...
ODPOWIEDZ

Wróć do „Arduino IDE”