Storage - czyli przechowywanie danych w urządzeniach

User avatar
vajera
Posts: 7285
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 288 times
Been thanked: 161 times

Post

nebraska wrote: Tue Dec 09, 2025 3:35 pm Dokładnie tat robie. Jeszcze mam ostatnie pytanie. Ostatnio czytam o konstruktorach. Czy taki zapis jest poprwany?

Code: Select all

class MojaKlasa {

private:
uint8_t zmiennaNr1;
uint8_t zmiennaNr2;

MojaKlasa(uint8_t zmiennaNr1 = 0, uint8_t zmiennaNr2 = -1) 
: zmiennaNr1(zmiennaNr1), zmiennaNr2(zmiennaNr2) {

}
};
Jeszcze jedna uwaga:

Code: Select all

uint8_t zmiennaNr2 = -1
uint8_t = unsigned int (8 bit) = wartości z zakresu 0..255.
Zapis uint8_t zmiennaNr2 = -1 spowoduje, że zmiennaNr2 == 255, oczywiście C pozwala na takie kombinacje (w przypadku unsigned), więc porównania:

Code: Select all

zmiennaNr2 == -1
zmiennaNr2  == 255
zwrócą true w obu przypadkach, ale powinieneś być świadomy tego faktu.

Alternatywnie użyj int8_t lub int16_t
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

vajera wrote: Tue Dec 09, 2025 3:51 pm
nebraska wrote: Tue Dec 09, 2025 3:35 pm Dokładnie tat robie. Jeszcze mam ostatnie pytanie. Ostatnio czytam o konstruktorach. Czy taki zapis jest poprwany?

Code: Select all

class MojaKlasa {

private:
uint8_t zmiennaNr1;
uint8_t zmiennaNr2;

MojaKlasa(uint8_t zmiennaNr1 = 0, uint8_t zmiennaNr2 = -1) 
: zmiennaNr1(zmiennaNr1), zmiennaNr2(zmiennaNr2) {

}
};
Jeszcze jedna uwaga:

Code: Select all

uint8_t zmiennaNr2 = -1
uint8_t = unsigned int (8 bit) = wartości z zakresu 0..255.
Zapis uint8_t zmiennaNr2 = -1 spowoduje, że zmiennaNr2 == 255, oczywiście C pozwala na takie kombinacje (w przypadku unsigned), więc porównania:

Code: Select all

zmiennaNr2 == -1
zmiennaNr2  == 255
zwrócą true w obu przypadkach, ale powinieneś być świadomy tego faktu.

Alternatywnie użyj int8_t lub int16_t
Tak, wiem o tym. Właśnie zastanawiałem się jaka forma będzie najlepsza. Dziękuję za przykład.
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

Hej ponownie
Używam sobie takiej klasy dimmera do sterowania serwami wszystko jest ok, tylko dlaczego nie zapamietuje stanu po utracie zasilania?
Myślałem że wystarczy jak w setup dodam myDimmer->setDefaultStateRestore(); ?
Wiem że można zrobić to inaczej wywołując metode na wskaznik bez tej całej klasy ale potrzebuje tego przykładu.

Code: Select all

#include <Arduino.h>
#include <SuplaDevice.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/button.h>
#include <supla/control/relay.h>
#include <supla/control/rgbw_base.h>

#define STORAGE_OFFSET 100             //
#include <supla/storage/eeprom.h>      //
Supla::Eeprom eeprom(STORAGE_OFFSET);  //


const char* host = "svr.supla.org";
const char* ssid = "";
const char* pass = "";

Supla::ESPWifi wifi(ssid, pass);

Supla::Control::RGBWBase* myDimmer = nullptr;


class virtualDimm : public Supla::Control::RGBWBase {
public:
  virtualDimm() {
    channel.setType(SUPLA_CHANNELTYPE_DIMMERANDRGBLED);
    channel.setDefault(SUPLA_CHANNELFNC_DIMMERANDRGBLIGHTING);
    channel.setFlag(SUPLA_CHANNEL_FLAG_RGBW_COMMANDS_SUPPORTED);
  }
  void setRGBWValueOnDevice(uint32_t red,
                            uint32_t green,
                            uint32_t blue,
                            uint32_t colorBrightness,
                            uint32_t brightness) {
  }
};



void setup() {

  Serial.begin(115200);

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {  };

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {  };

  auto button = new Supla::Control::Button(SWITCH, true, true);  // GPIOO - D3 Przycisk
  button->setMulticlickTime(500, false);                         // Multiklik przerwa miedzy klikami.
  button->setHoldTime(500);
  button->repeatOnHoldEvery(60);

  myDimmer = new virtualDimm();
  myDimmer->setStep(1);
  myDimmer->setFadeEffectTime(1);
  myDimmer->setMinMaxIterationDelay(1200);
  myDimmer->setDefaultStateRestore();


  SuplaDevice.setName("SUPLA Servo");          // name to be displayed in the Supla cloud
  SuplaDevice.begin(GUID,                           // Global Unique Identifier
                    host,                           // SUPLA server address
                    "@gmail.com",  // Email address used to login to Supla Cloud
                    AUTHKEY);                       // Authorization key
}
User avatar
klew
Posts: 13905
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

nebraska wrote: Sun Dec 28, 2025 10:47 pm
Pokaż logi ze startu urządzenia.
Dobrze by było też pokazać pełny kod jakiego używasz. W tym co wkleiłeś, wg mnie powinno działać poprawnie.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
veeroos
Posts: 1081
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów
Has thanked: 1 time
Been thanked: 9 times

Post

Podłączę się do tematu, mam pytanie bardzo laickie, jak często mogę zapisywać dane do Storage w ESP32, potrzebuję jak najczęściej, ale nie chciałbym układu zamordować po miesiącu.
Zamel Mew-01, Zamel PEW-01, Zamel SBW-01, Zamel THW-01, Zamel SRW-01, Zamel mSLW-02, Auraton BOX + Indor Sensor, Airly Gate By Veeroos, Zigbee to Supla Gateway + sensors, Zamel SGW-01 and more

https://github.com/v33r005
User avatar
klew
Posts: 13905
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

veeroos wrote: Mon Jan 05, 2026 7:29 pm Podłączę się do tematu, mam pytanie bardzo laickie, jak często mogę zapisywać dane do Storage w ESP32, potrzebuję jak najczęściej, ale nie chciałbym układu zamordować po miesiącu.
Raczej bym nie przesadzał z ilością zapisów. W tym przypadku Supla nie robi żadnej optymalizacji. Ewentualny wear leveling zależy od tego od biblioteki pod spodem.
Lepsze mechanizmy są przygotowane na esp-idf
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
veeroos
Posts: 1081
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów
Has thanked: 1 time
Been thanked: 9 times

Post

klew wrote: Mon Jan 05, 2026 7:51 pm Raczej bym nie przesadzał z ilością zapisów. W tym przypadku Supla nie robi żadnej optymalizacji. Ewentualny wear leveling zależy od tego od biblioteki pod spodem.
Lepsze mechanizmy są przygotowane na esp-idf
Dzięki za odpowiedź. Potrzebuję jedną zmienną typu float zapisywać co parę sekund do pamięci, odczyt zmiennej tylko był by po restarcie urządzenia, trochę wczytałem się w temat wear levelingu i to może być strzał w dziesiątkę, tylko nie wiem czy nie będzie się to gryzło z zapisem danych przez biblioteki Supli, nie chciałbym nadpisywać tych danych, żeby urządzenie mi się nie wysypało.
Zamel Mew-01, Zamel PEW-01, Zamel SBW-01, Zamel THW-01, Zamel SRW-01, Zamel mSLW-02, Auraton BOX + Indor Sensor, Airly Gate By Veeroos, Zigbee to Supla Gateway + sensors, Zamel SGW-01 and more

https://github.com/v33r005
User avatar
klew
Posts: 13905
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

veeroos wrote: Mon Jan 05, 2026 9:25 pm
Dzięki za odpowiedź. Potrzebuję jedną zmienną typu float zapisywać co parę sekund do pamięci, odczyt zmiennej tylko był by po restarcie urządzenia, trochę wczytałem się w temat wear levelingu i to może być strzał w dziesiątkę, tylko nie wiem czy nie będzie się to gryzło z zapisem danych przez biblioteki Supli, nie chciałbym nadpisywać tych danych, żeby urządzenie mi się nie wysypało.
Jeśli będziesz pisał co 2-3 s do jednego miejsca, to flash padnie po kilku dniach.

Odczytywać możesz miliony razy na sekundę :P

Jeśli chcesz samemu implementować zapis do flasha z jakimś wear levelingiem, to musisz znaleźć sobie obszar flasha, który jest nieużywany i tam to robić. Kilkaset kB daje nawet po 100 lat trwałości ciągłych zapisów jak się do tego dobrze podejdzie.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
veeroos
Posts: 1081
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów
Has thanked: 1 time
Been thanked: 9 times

Post

klew wrote: Mon Jan 05, 2026 9:45 pm Jeśli będziesz pisał co 2-3 s do jednego miejsca, to flash padnie po kilku dniach.
No właśnie zdaje sobie z tego sprawę, wcześniej wszystko załatwiałem przez Preferences, było to dla mnie wygodne, ale nie potrzebowałem częstego zapisu, czasami to było raz dziennie, czasami parę razy, w jednym przypadku dane zapisywały się wyłącznie do zewnętrznej konfiguracji i prawdopodobnie miesiącami byłby tylko odczyt. No chyba że da się wyciągnąć jakoś ostatnią wartość wysłaną do Clouda, choć pewnie nie jest to możliwe,.bo zapis w Cloudzie jest co 10 minut, więc ostatniej danej też nie da się wyciągnąć, wtedy nie musiałbym się martwić o zapis danych wewnątrz urządzenia.
Zamel Mew-01, Zamel PEW-01, Zamel SBW-01, Zamel THW-01, Zamel SRW-01, Zamel mSLW-02, Auraton BOX + Indor Sensor, Airly Gate By Veeroos, Zigbee to Supla Gateway + sensors, Zamel SGW-01 and more

https://github.com/v33r005
User avatar
klew
Posts: 13905
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

veeroos wrote: Mon Jan 05, 2026 9:53 pm No właśnie zdaje sobie z tego sprawę, wcześniej wszystko załatwiałem przez Preferences, było to dla mnie wygodne, ale nie potrzebowałem częstego zapisu, czasami to było raz dziennie, czasami parę razy, w jednym przypadku dane zapisywały się wyłącznie do zewnętrznej konfiguracji i prawdopodobnie miesiącami byłby tylko odczyt. No chyba że da się wyciągnąć jakoś ostatnią wartość wysłaną do Clouda, choć pewnie nie jest to możliwe,.bo zapis w Cloudzie jest co 10 minut, więc ostatniej danej też nie da się wyciągnąć, wtedy nie musiałbym się martwić o zapis danych wewnątrz urządzenia.
Preferences działa chyba na NVS w esp-idf. Tam jest wear leveling, ale odradzają częste zapisy.

Do czego Ci takie częste zapisy potrzebne?
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Arduino IDE”