Modyfikacja przykładu WebInterface Arduino

petione
Posts: 121
Joined: Sat Jul 21, 2018 4:26 pm

Post

klew wrote: Fri Jan 24, 2025 8:35 am
petione wrote: Fri Jan 24, 2025 7:04 am Koledzy podpowiecie...
Jak, skąd pozyskać informację o tym że naciśnięto przycisk Save w WebInterfejs. Potrzebuję jednym słowem uruchamiać jednorazowo jakąś akcję po naciśnięciu tego przycisku. Chyba że jest jakiś inny sposób na jednorazowe wykonanie dowolnej akcji po wykryciu zmian np w polu tekstowym.
Możesz stworzyć klasę dziedziczącą po "Supla::HtmlElement" i nadpisać jedną z poniższych metod:

Code: Select all

  virtual bool handleResponse(const char *key, const char *value);
  virtual void onProcessingEnd();
handleResponse odpala się dla każdego przetwarzanego pola przesłanego w formularzu (tylko to idzie po kolei na wszystkich zarejestrowanych HtmlElement i działa dopóki nie trafi na klasę obsługującą dane pole).
onProcessingEnd urucahmia się na końcu po przetworzeniu całego formularza.
Rozumiem ze to o czym piszesz to wykrywanie zmian w polach? A wykrywanie naciśnięcia przycisku Save czyli generalnie zapisu do pamięci nie było by prostsze?
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

petione wrote: Fri Jan 24, 2025 9:12 am
Rozumiem ze to o czym piszesz to wykrywanie zmian w polach? A wykrywanie naciśnięcia przycisku Save czyli generalnie zapisu do pamięci nie było by prostsze?
Przycisk "save" w formularzu www, wysyła forumlarz z przeglądarki do urządzenia.
Przycisk nic sam z siebie nie zapisuje.

Mógłbym dodać generowanie "eventów" gdy w Config coś się zmieni i będzie zapis, ale ogólnie tego może być więcej, bo zapis może się zdarzyć przy starcie urządzenia, po połączeniu z Cloudem, itp. Natomiast tutaj pytałeś o przycisk "save" w www urządzenia.
Najlepsze suple dla Twojego domu :mrgreen:
petione
Posts: 121
Joined: Sat Jul 21, 2018 4:26 pm

Post

klew wrote: Fri Jan 24, 2025 9:32 am
petione wrote: Fri Jan 24, 2025 9:12 am
Rozumiem ze to o czym piszesz to wykrywanie zmian w polach? A wykrywanie naciśnięcia przycisku Save czyli generalnie zapisu do pamięci nie było by prostsze?
Przycisk "save" w formularzu www, wysyła forumlarz z przeglądarki do urządzenia.
Przycisk nic sam z siebie nie zapisuje.

Mógłbym dodać generowanie "eventów" gdy w Config coś się zmieni i będzie zapis, ale ogólnie tego może być więcej, bo zapis może się zdarzyć przy starcie urządzenia, po połączeniu z Cloudem, itp. Natomiast tutaj pytałeś o przycisk "save" w www urządzenia.
Sorki że tak cię ciągnę za język ale to po prostu wynika z braku wiedzy... Domyślam się przycisk Save nic nie zapisuje ale pojawia się właśnie reakcja po jego naciśnięciu w postaci wysyłania formularza z przeglądarki do urządzenia, zresztą reakcja przycisk Save to tylko pomysł na rozwiązanie problemu. No ale dalej nie wiem jak się dobrać do tego "eventu". Może jest jakiś inny prosty sposób/przycisk...

Generalnie problem polega na tym że odczytuje sobie przez ESP jakiś tam parametr z otoczenia i wybierając element z listy rozwijanej w WWW mogę zapisać jego aktualną wartość w wybranej zmiennej (a później albo od razu w EEPROMIE). No ale ten zapis powinien być tylko wtedy gdy ja zdecyduję o tym czyli np kliknę chyba najprościej przycisk Save.
O ile dobrze rozumiem działanie biblioteki jeśli w WWW będzie wybrana jakaś pozycja z listy rozwijanej to fragment kodu
np

Code: Select all

if( pozycja_z _listy_rowijanej==1){EEPROM=odczytana wartość}
będzie wykonywany z cały czas dopuki nie zmieni się aktualnie wybrany element na liście ?



Dobrze kombinuję?
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

petione wrote: Fri Jan 24, 2025 10:32 am Sorki że tak cię ciągnę za język ale to po prostu wynika z braku wiedzy... Domyślam się przycisk Save nic nie zapisuje ale pojawia się właśnie reakcja po jego naciśnięciu w postaci wysyłania formularza z przeglądarki do urządzenia, zresztą reakcja przycisk Save to tylko pomysł na rozwiązanie problemu. No ale dalej nie wiem jak się dobrać do tego "eventu". Może jest jakiś inny prosty sposób/przycisk...

Generalnie problem polega na tym że odczytuje sobie przez ESP jakiś tam parametr z otoczenia i wybierając element z listy rozwijanej w WWW mogę zapisać jego aktualną wartość w wybranej zmiennej (a później albo od razu w EEPROMIE). No ale ten zapis powinien być tylko wtedy gdy ja zdecyduję o tym czyli np kliknę chyba najprościej przycisk Save.
O ile dobrze rozumiem działanie biblioteki jeśli w WWW będzie wybrana jakaś pozycja z listy rozwijanej to fragment kodu
np

Code: Select all

if( pozycja_z _listy_rowijanej==1){EEPROM=odczytana wartość}
będzie wykonywany z cały czas dopuki nie zmieni się aktualnie wybrany element na liście ?

Dobrze kombinuję?
Chyba nie. Ogólnie to co widzisz na www urządzenia zostało wygenerowane przez urządzenie w momencie otwarcia strony i urządzenie nic nie wie o tym, co się dzieje na tej stronie (co tam przełączasz/wpisujesz itp). Dopiero po wysłąniu formularza (save) dane trafiają na urządzenie.

To nie są trywialne tematy, na zasadzie: "użyj metody A z klasy B".

Przykład WebInterface zawiera opis tego jak dodawać własne pola i jak jest potem sobie z flasha odczytywać (na esp nie ma eepromu i nie ma sensu dublować zapisu do flasha, skoro to samo już ogarnia Tobie Supla::Config).

Ogólnie nie rozumiem co chcesz zrobić i do czego to jest potrzebne.
Najlepsze suple dla Twojego domu :mrgreen:
petione
Posts: 121
Joined: Sat Jul 21, 2018 4:26 pm

Post


Chyba nie. Ogólnie to co widzisz na www urządzenia zostało wygenerowane przez urządzenie w momencie otwarcia strony i urządzenie nic nie wie o tym, co się dzieje na tej stronie (co tam przełączasz/wpisujesz itp). Dopiero po wysłąniu formularza (save) dane trafiają na urządzenie.
Tak wiem, ale to akurat do niczego nie jest potrzebne. Strona WWW ma tylko umożliwić zapis do wybranej "zmiennej" wybieranej z rozwijanego pola i w efekcie do EEPROMU (tak wiem ze brak, to jest skrót myślowy, zamierzam użyć Preferencess).

Moze jeszcze raz już konkretnie, ale tak to jest jeśli nie zna się fachowych określeń z dziedziny programowania :)

Robię urządzono kopiujące kod z pilota IR (coś na wzór projektu kolegi kolegi Elmaya)
https://en-forum.supla.org/viewtopic.php?t=6404

1.Zczytuje kod pilota i jest on w jakiejś tam zmiennej w RAM
2.Wybieram z listy rozwijanej Button1, Button2... i zapisuje w pamięci nieulotnej kod IR pod wybranym "Buttonem"
3.Stosuję virtualRelay_1 i przypisuje do jego niego procedurę wysłania zapisanego w pamięci nieulotnej kodu pod "zmienną" Button1
4. Z poziomu aplikacji włączam virtualRelay_1 i w efekcie wysyłam kod IR ze " zmiennej" Button1

Wiec cały mój problem polega na tym jak zrobić poprawnie zapis kodu IR do wybieranej z listy rozwijanej na www zmiennej, Wiem jak zrobić odpowiednie pola na www, wiem jak zapisywać dane za wykorzystaniem Preferencess, wiem jak odesłać sklonowany ale mam właśnie problem jak zapisać kod IR w pamięci dopiero po naciśnięciu przycisku Save
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

Poczytaj ten wątek: viewtopic.php?t=12068
Najlepsze suple dla Twojego domu :mrgreen:
petione
Posts: 121
Joined: Sat Jul 21, 2018 4:26 pm

Post

klew wrote: Fri Jan 24, 2025 11:59 am Poczytaj ten wątek: viewtopic.php?t=12068
Wierz mi, dzięki tamtemu wątkowi aż tu dotarłem choć na pewno nie wszystko zrozumiałem.

Na obecną chwilę zrobiłem to tak:

Code: Select all

...
auto Select_item = new Supla::Html::SelectInputParameter(POLE_ROZWIJANE, "Select button to store");
...
void setup()
{
... 


  Select_item->registerValue("Choose key", 0);
  Select_item->registerValue("Key1", 1);
  Select_item->registerValue("Key2", 2);
  Select_item->registerValue("Key3", 3);
  Select_item->registerValue("Key4", 4);
  Select_item->registerValue("Key5", 5);
...
void loop()
{
  SuplaDevice.iterate();
  static bool LOCAL_WEB_SERVER = false; //  zmienna do sprawdzenia czy serwer lokalny jest wlaczony
  if (!LOCAL_WEB_SERVER)
  {
    if (Supla::Network::IsReady())
    {
      LOCAL_WEB_SERVER = true;
      SuplaDevice.handleAction(0, Supla::START_LOCAL_WEB_SERVER);
    }
  }

 ...
-------------- poniższy fragment wykonywany jest co 1 sekundę oczywiście bez użycia Delay() ---------------------------

    Supla::Storage::ConfigInstance()->getInt32(POLE_ROZWIJANE, &int_wartosc_dla_pozycji_z_listy_rozwijanej);
    
      if (int_wartosc_dla_pozycji_z_listy_rozwijanej == 1) // sprawdzenie czy wybrano pozycje z listy rozwijanej
      {
        digitalWrite(LED1, !digitalRead(LED1));
        Supla::Storage::ConfigInstance()->setInt32(POLE_ROZWIJANE, 0); 
      }
    
I generalnie LED1 zmieni swój stan tylko wtedy gdy wybiorę Key1 i nacisnę przycisk Save.
Zerknij proszę czy takie podejście (chodź działa) jest sensowne celem oczywiscie nauki na wlasnych błedach
You do not have the required permissions to view the files attached to this post.
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

petione wrote: Fri Jan 24, 2025 3:54 pm Na obecną chwilę zrobiłem to tak:
Tak, to powinno działać.
Najlepsze suple dla Twojego domu :mrgreen:
petione
Posts: 121
Joined: Sat Jul 21, 2018 4:26 pm

Post

Dzięki.
Pojawil mi sie natomiast jeszcze jeden niespodziewany poroblem. A mianowicie zapis do pamieci wlasnych zmiennych.
Do zapisu stosuje Preferences. Teoretycznie nie powinny kolidowac z metodą zapisu Supli a jednak cos sie gryzie. Opinie opieram na podstawie;

https://forum.supla.org/viewtopic.php?t=12427

Wszystko dziala poprawnie do momentu przeladowania WWW lub naciśnięciu Save. Gdy strona sie przeladuje lub nacisne Save zapis juz jest nieprawidlowy.. Masz koze pomysl co moze kolidować?
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

petione wrote: Sat Jan 25, 2025 8:28 am Dzięki.
Pojawil mi sie natomiast jeszcze jeden niespodziewany poroblem. A mianowicie zapis do pamieci wlasnych zmiennych.
Do zapisu stosuje Preferences. Teoretycznie nie powinny kolidowac z metodą zapisu Supli a jednak cos sie gryzie. Opinie opieram na podstawie;

https://forum.supla.org/viewtopic.php?t=12427

Wszystko dziala poprawnie do momentu przeladowania WWW lub naciśnięciu Save. Gdy strona sie przeladuje lub nacisne Save zapis juz jest nieprawidlowy.. Masz koze pomysl co moze kolidować?
Jeśli mowa o tym samym preferences co w tamtym wątku to powinno być ok. Pokaż kod i logi
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Pomoc”