Modyfikacja przykładu WebInterface Arduino

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

Post

iM@rek wrote: Sun Aug 11, 2024 8:21 pm Proszę o pomoc w powyżej opisanym problemie.
Ta metoda printAddress chyba ma błąd. Tzn. tam deklarujesz loklaną zmienną String sSensAdrFull w momencie gdy dodajesz ekstra zero.
Zamiast tego użyj sobie metody:

Code: Select all

int generateHexString(const void *input, char *output, int inputLength, char separator = 0);
z <supla/tools.h>

Tutaj przykładowe użycie do generowania GUID z bajtów:

Code: Select all

  char buf[SUPLA_GUID_SIZE * 2 + 1] = {};
  generateHexString(Supla::RegisterDevice::getGUID(), buf, SUPLA_GUID_SIZE);
  SUPLA_LOG_INFO("GUID: %s", buf);
Najlepsze suple dla Twojego domu :mrgreen:
iM@rek
Posts: 376
Joined: Thu Feb 09, 2023 1:25 pm

Post

Dziękuję za odpowiedzi.
Popróbuję i dam znać.
iM@rek
Posts: 376
Joined: Thu Feb 09, 2023 1:25 pm

Post

Podczas logowania pojawiają się dane jak poniżej:

Code: Select all

Send: [53 55 50 4C 41 15 BB 00 00 00 67 00 00 00 0E 00 00 00 03 00 00 00 00 00 00 00 00 E0 A3 70 40 40 ]
Send: [53 55 50 4C 41 ]
Send: [53 55 50 4C 41 15 BC 00 00 00 67 00 00 00 0E 00 00 00 04 00 00 00 00 00 00 00 00 00 20 08 46 40 ]
Send: [53 55 50 4C 41 ]
Send: [53 55 50 4C 41 15 BD 00 00 00 67 00 00 00 0E 00 00 00 05 00 00 00 00 00 00 00 00 20 F1 67 90 40 ]
Send: [53 55 50 4C 41 ]
Który moduł je wysyła?
Chcę je wyłączyć, żeby mieć mniej danych w logach przy analizie.
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

iM@rek wrote: Thu Aug 15, 2024 11:53 am Podczas logowania pojawiają się dane jak poniżej:

Code: Select all

Send: [53 55 50 4C 41 15 BB 00 00 00 67 00 00 00 0E 00 00 00 03 00 00 00 00 00 00 00 00 E0 A3 70 40 40 ]
Send: [53 55 50 4C 41 ]
Send: [53 55 50 4C 41 15 BC 00 00 00 67 00 00 00 0E 00 00 00 04 00 00 00 00 00 00 00 00 00 20 08 46 40 ]
Send: [53 55 50 4C 41 ]
Send: [53 55 50 4C 41 15 BD 00 00 00 67 00 00 00 0E 00 00 00 05 00 00 00 00 00 00 00 00 20 F1 67 90 40 ]
Send: [53 55 50 4C 41 ]
Który moduł je wysyła?
Chcę je wyłączyć, żeby mieć mniej danych w logach przy analizie.

Code: Select all

SuplaDevice.setProtoVerboseLog(false);
https://www.facebook.com/groups/supladiy
https://www.facebook.com/groups/suplazamel
https://www.facebook.com/groups/suplaauraton
https://smartnerzeczy.pl
iM@rek
Posts: 376
Joined: Thu Feb 09, 2023 1:25 pm

Post

lukfud wrote: SuplaDevice.setProtoVerboseLog(false);[/code]
Dziękuję, to było to.
iM@rek
Posts: 376
Joined: Thu Feb 09, 2023 1:25 pm

Post

Odnośnie pokazywania na stronie configa zmiennej z programu (pisał o tym zrrr, ukasz pomógł.
Próbuję zrobić to samo, utworzyłem plik readonly.h i zapisałem do folderu "include" w drzewie projektu.
Do głownego programu dołożyłem include i
new Supla::Html::ReadOnly; w setupie.
Przy kompilacji wyrzuca błąd deklaracji zmiennej, którą chcę wyświetlić na stronie configa WebInterface:

Code: Select all

Compiling .pio/build/E32/src/ZAP-240819-1730.ino.cpp.o
In file included from /Volumes/HD2/!!-Szkice/PIO/1-Zapad/src/ZAP-240819-1730.ino:71:
include/readonly.h: In member function 'virtual void Supla::Html::ReadOnly::send(Supla::WebSender*)':
include/readonly.h:17:18: error: 'oSFTWverT' was not declared in this scope
     sender->send(oSFTWverT);
                  ^~~~~~~~~
a readonly.h jest następujący:

Code: Select all

#ifndef READONLY_H_
#define READONLY_H_

namespace Supla {
namespace Html {

class ReadOnly : public Supla::HtmlElement {
 public:
  ReadOnly() : HtmlElement(HTML_SECTION_FORM) {}

  void send(Supla::WebSender* sender) {
    sender->send("<div class=\"form-field\">");
    sender->sendLabelFor("read_only", "Read only");
    sender->send("<input type=\"text\" readonly");
    sender->sendNameAndId("read_only");
    sender->send("placeholder=\"");
    sender->send(oSFTWverT);
    sender->send("\">");
    sender->send("</div>");
  }

  bool handleResponse(const char* key, const char* value) {
    return true;
  }
  
  void onProcessingEnd() {}

 protected:

}; // ReadOnly

}; // namespace Html
}; // namespace Supla

#endif
zmienna to "oSFTWverT" - wstawiona bez cudzysłowów.
i jeszcze w readonly.h podkreśla kilka miejsc, np:
linia 7: Supla::HTMLlement
komentarz: przestrzeń nazw "Supla" nie ma klasy składowej "HtmlElement" - faktycznie nie ma.
Skąd ją wziąć?
[email protected]
Posts: 1584
Joined: Mon Feb 06, 2023 8:56 am
Has thanked: 18 times
Been thanked: 26 times

Post

iM@rek wrote: Tue Aug 20, 2024 9:21 pm Odnośnie pokazywania na stronie configa zmiennej z programu (pisał o tym zrrr, ukasz pomógł.
Próbuję zrobić to samo, utworzyłem plik readonly.h i zapisałem do folderu "include" w drzewie projektu.
Do głownego programu dołożyłem include i
new Supla::Html::ReadOnly; w setupie.
Przy kompilacji wyrzuca błąd deklaracji zmiennej, którą chcę wyświetlić na stronie configa WebInterface:

Code: Select all

Compiling .pio/build/E32/src/ZAP-240819-1730.ino.cpp.o
In file included from /Volumes/HD2/!!-Szkice/PIO/1-Zapad/src/ZAP-240819-1730.ino:71:
include/readonly.h: In member function 'virtual void Supla::Html::ReadOnly::send(Supla::WebSender*)':
include/readonly.h:17:18: error: 'oSFTWverT' was not declared in this scope
     sender->send(oSFTWverT);
                  ^~~~~~~~~
a readonly.h jest następujący:

Code: Select all

#ifndef READONLY_H_
#define READONLY_H_

namespace Supla {
namespace Html {

class ReadOnly : public Supla::HtmlElement {
 public:
  ReadOnly() : HtmlElement(HTML_SECTION_FORM) {}

  void send(Supla::WebSender* sender) {
    sender->send("<div class=\"form-field\">");
    sender->sendLabelFor("read_only", "Read only");
    sender->send("<input type=\"text\" readonly");
    sender->sendNameAndId("read_only");
    sender->send("placeholder=\"");
    sender->send(oSFTWverT);
    sender->send("\">");
    sender->send("</div>");
  }

  bool handleResponse(const char* key, const char* value) {
    return true;
  }
  
  void onProcessingEnd() {}

 protected:

}; // ReadOnly

}; // namespace Html
}; // namespace Supla

#endif
zmienna to "oSFTWverT" - wstawiona bez cudzysłowów.
i jeszcze w readonly.h podkreśla kilka miejsc, np:
linia 7: Supla::HTMLlement
komentarz: przestrzeń nazw "Supla" nie ma klasy składowej "HtmlElement" - faktycznie nie ma.
Skąd ją wziąć?
https://github.com/SUPLA/supla-device/b ... _element.h

A co do brakującej zmiennej "oSFTWverT" no to bierze się tam znikąd , więc nie będzie działać, kopiowałeś to skądś, pokaż oryginał, bo wg mnie to metoda send powinna przyjąć parametr char * oSFTWverT
iM@rek
Posts: 376
Joined: Thu Feb 09, 2023 1:25 pm

Post

[email protected] wrote: Wed Aug 21, 2024 4:22 am https://github.com/SUPLA/supla-device/b ... _element.h

A co do brakującej zmiennej "oSFTWverT" no to bierze się tam znikąd , więc nie będzie działać, kopiowałeś to skądś, pokaż oryginał, bo wg mnie to metoda send powinna przyjąć parametr char * oSFTWverT
Może po kolei:

Co do zmiennej: Zmieniłem jej nazwę na "AnyVar" żeby mi z niczym nie kolidowała,
jest zadeklarowana w głównym kodzie na początku programu (przed sekcją Setup) jako:

Code: Select all

extern char* AnyVar[] = {}; 
Potem w sekcji Setup jest:

Code: Select all

new Supla::Html::ReadOnly;
Kod sam pisałem na bazie WebInterface. Póki co, chcę wyeliminować te błędy.

Readonly.h jest w folderze "Include" - chyba tam ma być?

Przy kompilacji dostaję TYLKO taki błąd dot. deklaracji zmiennej. Nie zgłasza błędów dot. Readonly.h. Po usunięciu Raedonly.h z okna edytora VSC, w drzewie projektu, przy pliku Readonly.h widać tylko czerwoną "1" - czyli w sumie tylko chodzi o tę zmienną, a reszta wydaje się być ok.

Code: Select all

YEL:
In file included from /Volumes/HD2/!!-Szkice/PIO/1-Zapad2408/src/ZAP-240819-1730.ino:71:
include/readonly.h: In member function 'virtual void Supla::Html::ReadOnly::send(Supla::WebSender*)':
RED: 
include/readonly.h:17:18: error: 'AnyVar' was not declared in this scope
     sender->send(AnyVar);
                  ^~~~~~
YEL:
/Volumes/HD2/!!-Szkice/PIO/1-Zapad2408/src/ZAP-240819-1730.ino: At global scope:
/Volumes/HD2/!!-Szkice/PIO/1-Zapad2408/src/ZAP-240819-1730.ino:161:27: warning: 'AnyVar' initialized and declared 'extern'
       extern char* AnyVar[] = {};
                           ^
Czyli może pytanie się sprowadza do tego, jak poprawnie zadeklarować i przekazać zmienną do Readonly.h?

I reszta - poniżej - nie ma znaczenia?

Pobrałem z GH SD2408 i zrobiłem nowy folder z tym SD2408, (na wszelki wypadek - poprzednio miałem 2312).
Widzę w folderach SD, że "html_element.h" jest w /supla/network, a deklaracje:

Code: Select all

namespace Supla {
namespace Html {
chcą lokować html.element.h w /supla/html/ - czy to ma znaczenie?
Skopiowałem html_element.h i *.cpp do /supla/html, ale niczego to nie zmieniło, dalej podkreśla brakujący HtmlElement w linii 7:
KOMENTARZ: przestrzeń nazw "Supla" nie ma klasy składowej "HtmlElement"

Code: Select all

7: class ReadOnly : public Supla::HtmlElement {
Poniżej, w linii 9: ponownie podkreśla HtmlElement:
KOMENTARZ: element "HtmlElement" nie jest niestatycznym elementem członkowskim danych ani klasą bazową klasy "Supla::Network::ReadOnly"

Code: Select all

9: ReadOnly() : HtmlElement(HTML_SECTION_FORM) {} 
i dalej w linii 11: podkreśla WebSender informując, że:
KOMENTARZ: element przestrzeń nazw "Supla" nie ma składowej "WebSender"

Code: Select all

11: void send(Supla::WebSender* sender) {
User avatar
lukfud
Posts: 2480
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa
Has thanked: 13 times
Been thanked: 11 times

Post

iM@rek wrote: Wed Aug 21, 2024 10:38 am
Podrzuć mi cały szkic.
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: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

iM@rek wrote: Wed Aug 21, 2024 10:38 am Może po kolei:
Kompilator c++ będzie brał każdy plik .cpp (oraz .ino) i kompilował go osobno. Proces kompilacji w skrócie polega na tym, że kompilator bierze plik (cpp lub ino) i idzie linjka po linijce. Każda linijka musi być zrozumiała w kontekście tego, co pojawiło się wcześniej w tym pliku (czyli kolejność ma znaczenie).
W pliku są linie "#include", które tak jakby wstawiają zawartość pliku w miejscu "#include".

Plik "read_only.h" nie jest osobną jednostką kompilacji (bo to .h, a nie .cpp). Także on jest kompilowany w miejscu gdzie go include'ujesz - pewnie gdzieś w pliku .ino.

Ogólnie kompilacja plików .h nie powinna polegać na tym gdzie w kodzie będzie wstawiony "#include" do tego pliku. Czyli plik powinien być zrozumiały dla kompilatora "sam w sobie" (z uwzględnieniem #include, które sam zawiera).
iM@rek wrote: Wed Aug 21, 2024 10:38 am Co do zmiennej: Zmieniłem jej nazwę na "AnyVar" żeby mi z niczym nie kolidowała,
jest zadeklarowana w głównym kodzie na początku programu (przed sekcją Setup) jako:

Code: Select all

extern char* AnyVar[] = {}; 
Potem w sekcji Setup jest:

Code: Select all

new Supla::Html::ReadOnly;
"extern" oznacza, że obiecujesz kompilatorowi, że na etapie linkowania wszystkich "jednostek kompilacji" (czyli plików .cpp i .ino), linker odnajdzie symbol typu char* o nazwie AnyVar. "extern" samo w sobie nie deklaruje zmiennej.
iM@rek wrote: Wed Aug 21, 2024 10:38 am Readonly.h jest w folderze "Include" - chyba tam ma być?
[/code]
Nie ma to znaczenia. Plik powinien być w takim miejscu, aby kompilator go znalazł. Robiąc "#include" możesz użyć dalej znaków "" lub <>. W pierwszym przypadku kompilator najpierw szuka plików w ścieżce relatywnie do obecnie kompilowanego pliku, a potem w ogólnych ścieżkach zdefiniowanych w środowisku. Użycie <> powoduje, że szukane są tylko te ogólne ścieżki.
iM@rek wrote: Wed Aug 21, 2024 10:38 am Czyli może pytanie się sprowadza do tego, jak poprawnie zadeklarować i przekazać zmienną do Readonly.h?
Najlepiej nie używać zmiennych globalnych, tylko po prostu przekazać wskaźnik na tą zmienną do konsutrkora klasy Readonly i go zapamiętać w kodzie.

iM@rek wrote: Wed Aug 21, 2024 10:38 am Widzę w folderach SD, że "html_element.h" jest w /supla/network, a deklaracje:

Code: Select all

namespace Supla {
namespace Html {
chcą lokować html.element.h w /supla/html/ - czy to ma znaczenie?
[/code]

Namespace oraz faktyczna ścieżka nie mają ze sobą nic wspólnego i nie ma to znaczenia jak są określone. Dobrą praktyką jest trzymanie plików w folderach, które odzwierciedlają namespace, bo to pomaga odnaleźć odpowiednie pliki.
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Pomoc”