Odczyt wartości z linku bezpośredniego

User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

Witajcie , czy ktoś podpowie jak odczytać wartość z linku bezpośredniego np wodomierza. Przeglądałem inne projekty np viewtopic.php?t=15048 ale jakoś tego nie czuje a w zamieszczonym przykładzie nie ma supli, a gui-generic to taka kobyła że nie potrafię tego tam znaleźć. Chciałbym do szkicu webinterface.ino dodać wartość z licznika wody jako zmienna. nie chcę tworzyć kanału , potrzebna jest mi tylko jego wartość.
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
malarz
Posts: 506
Joined: Wed Jan 27, 2021 4:04 pm
Been thanked: 2 times

Post

shimano73 wrote: Sun Mar 16, 2025 4:45 pm Witajcie , czy ktoś podpowie jak odczytać wartość z linku bezpośredniego np wodomierza. Przeglądałem inne projekty np viewtopic.php?t=15048 ale jakoś tego nie czuje a w zamieszczonym przykładzie nie ma supli, a gui-generic to taka kobyła że nie potrafię tego tam znaleźć. Chciałbym do szkicu webinterface.ino dodać wartość z licznika wody jako zmienna. nie chcę tworzyć kanału , potrzebna jest mi tylko jego wartość.
Trochę jak w
https://github.com/malarz-supla/supla-d ... ronius.cpp (po https://...)
https://github.com/malarz-supla/supla-d ... aredge.cpp (po https://....)

W skrócie: łączysz się z hostem, ściągasz stronę, czytasz (z opisu wynika, że będzie pewnie kilka(naście) znaków a nie cały json), konwertujesz napis na wartość i ... koniec. Trochę podobne jak wysyłanie danych stacji pogodowej, tylko zapytanie prostsze, ale trzeba odczytać odpowiedź.

Napisz trochę więc (link, skopiuj wynik z przeglądarki, ...) bo ciężko więcej podpowiedzieć
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

malarz wrote: Sun Mar 16, 2025 5:37 pm
shimano73 wrote: Sun Mar 16, 2025 4:45 pm Witajcie , czy ktoś podpowie jak odczytać wartość z linku bezpośredniego np wodomierza. Przeglądałem inne projekty np viewtopic.php?t=15048 ale jakoś tego nie czuje a w zamieszczonym przykładzie nie ma supli, a gui-generic to taka kobyła że nie potrafię tego tam znaleźć. Chciałbym do szkicu webinterface.ino dodać wartość z licznika wody jako zmienna. nie chcę tworzyć kanału , potrzebna jest mi tylko jego wartość.
Trochę jak w
https://github.com/malarz-supla/supla-d ... ronius.cpp (po https://...)
https://github.com/malarz-supla/supla-d ... aredge.cpp (po https://....)

W skrócie: łączysz się z hostem, ściągasz stronę, czytasz (z opisu wynika, że będzie pewnie kilka(naście) znaków a nie cały json), konwertujesz napis na wartość i ... koniec. Trochę podobne jak wysyłanie danych stacji pogodowej, tylko zapytanie prostsze, ale trzeba odczytać odpowiedź.

Napisz trochę więc (link, skopiuj wynik z przeglądarki, ...) bo ciężko więcej podpowiedzieć
Dzięki bardzo, w przypadku licznika wody jakiej szukać nazwy w json'ie z wartością -> " calculatedValue" ?
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

Otwórz sobie link w przeglądarce w formacie json i będziesz wszystko widział
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

Napisałem sobie coś procedurę na podstawie softu kolegi roman106. Wywołuje ją w sekcji loop po uzyskaniu statusdevice=17 no i nie działa, no i nie wiem dlaczego .

Code: Select all


void ReadDirectLink() {
  std::unique_ptr<BearSSL::WiFiClientSecure> client(new BearSSL::WiFiClientSecure);
  client->setInsecure();
  HTTPClient https;
  https.begin(*client, host1);  // HTTPS
  int httpCode = https.GET();
  Serial.print("httpCode : ");Serial.println(httpCode);
  String json = https.getString();
  Serial.print("JSON  : ");Serial.println(json);
  JsonDocument doc;
  deserializeJson(doc, json);
  https.end();
  ValueDirectLink = doc["calculatedValue"];
  Serial.print("odczyt linku : ");Serial.println(ValueDirectLink);

}


W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

shimano73 wrote: Sun Mar 16, 2025 4:45 pm Witajcie , czy ktoś podpowie jak odczytać wartość z linku bezpośredniego np wodomierza. Przeglądałem inne projekty np viewtopic.php?t=15048 ale jakoś tego nie czuje a w zamieszczonym przykładzie nie ma supli, a gui-generic to taka kobyła że nie potrafię tego tam znaleźć. Chciałbym do szkicu webinterface.ino dodać wartość z licznika wody jako zmienna. nie chcę tworzyć kanału , potrzebna jest mi tylko jego wartość.
Czemu nie zaglądniesz tu:

viewtopic.php?t=16698

potem tu:

https://github.com/Soyer79/waterMeterX3 ... 3valve.ino

tam masz między innymi to:

Code: Select all

  top1 = "supla/"+String(mqtt_user)+"/devices/"+String(dv_id_1)+"/channels/"+String(chann_id_1)+"/state/calculated_value";
  top2 = "supla/"+String(mqtt_user)+"/devices/"+String(dv_id_2)+"/channels/"+String(chann_id_2)+"/state/calculated_value";
  top3 = "supla/"+String(mqtt_user)+"/devices/"+String(dv_id_3)+"/channels/"+String(chann_id_3)+"/state/calculated_value"; 
a także całą obsługę czytania linku bezpośredniego.
Last edited by SOYER on Tue Mar 18, 2025 6:27 pm, edited 2 times in total.
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
User avatar
malarz
Posts: 506
Joined: Wed Jan 27, 2021 4:04 pm
Been thanked: 2 times

Post

Nie chciałem (ze względu na pamięć) korzystać z httpclient'a i mam coś takiego

Code: Select all

      char output2[1000];
      WiFiClientSecure client;
      client.setInsecure();
      if (client.connect("adres.internetowy.pl", 443)) {
        client.println("GET /sciezka/do/strony.php?parametr=wartsc HTTP/1.1");
        client.println("Host: adres.internetowy.pl");
        client.println("Connection: close");
        client.println();

        for (int i=0; client.available(); i++) {
          output2[i] = client.read();
        }
        SUPLA_LOG_DEBUG(output2);
      }
Jak nie wyciąłem za dużo to powinno działać. Jakbyś podał log swojego rozwiązania to łatwiej byłoby szukać błędu. Bo nie wiadomo na którym etapie jest ten błąd. Podejrzane wydaje mi się

Code: Select all

  int httpCode = https.GET();
Tam raczej powinno być coś w nawiasie (przynajmniej "/").
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

SOYER wrote: Tue Mar 18, 2025 6:17 pm
shimano73 wrote: Sun Mar 16, 2025 4:45 pm Witajcie , czy ktoś podpowie jak odczytać wartość z linku bezpośredniego np wodomierza. Przeglądałem inne projekty np viewtopic.php?t=15048 ale jakoś tego nie czuje a w zamieszczonym przykładzie nie ma supli, a gui-generic to taka kobyła że nie potrafię tego tam znaleźć. Chciałbym do szkicu webinterface.ino dodać wartość z licznika wody jako zmienna. nie chcę tworzyć kanału , potrzebna jest mi tylko jego wartość.
Czemu nie zaglądniesz tu:

viewtopic.php?t=16698

potem tu:

https://github.com/Soyer79/waterMeterX3 ... 3valve.ino

tam masz między innymi to:

Code: Select all

  top1 = "supla/"+String(mqtt_user)+"/devices/"+String(dv_id_1)+"/channels/"+String(chann_id_1)+"/state/calculated_value";
  top2 = "supla/"+String(mqtt_user)+"/devices/"+String(dv_id_2)+"/channels/"+String(chann_id_2)+"/state/calculated_value";
  top3 = "supla/"+String(mqtt_user)+"/devices/"+String(dv_id_3)+"/channels/"+String(chann_id_3)+"/state/calculated_value"; 
a także całą obsługę czytania linku bezpośredniego.
A w którym momencie jest coś o czytaniu linków bezpośrednich bo nie umiem znaleźć ?
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

malarz wrote: Tue Mar 18, 2025 6:20 pm Nie chciałem (ze względu na pamięć) korzystać z httpclient'a i mam coś takiego

Code: Select all

      char output2[1000];
      WiFiClientSecure client;
      client.setInsecure();
      if (client.connect("adres.internetowy.pl", 443)) {
        client.println("GET /sciezka/do/strony.php?parametr=wartsc HTTP/1.1");
        client.println("Host: adres.internetowy.pl");
        client.println("Connection: close");
        client.println();

        for (int i=0; client.available(); i++) {
          output2[i] = client.read();
        }
        SUPLA_LOG_DEBUG(output2);
      }
Jak nie wyciąłem za dużo to powinno działać. Jakbyś podał log swojego rozwiązania to łatwiej byłoby szukać błędu. Bo nie wiadomo na którym etapie jest ten błąd. Podejrzane wydaje mi się

Code: Select all

  int httpCode = https.GET();
Tam raczej powinno być coś w nawiasie (przynajmniej "/").
Z tym "/" program sie nie kompiluje wywala bład

Code: Select all

C:\Users\user\OneDrive\Dokumenty\Arduino\WebInterface_SP111\WebInterface_SP111.ino: In function 'void ReadDirectLink()':
C:\Users\user\OneDrive\Dokumenty\Arduino\WebInterface_SP111\WebInterface_SP111.ino:132:31: error: no matching function for call to 'HTTPClient::GET(const char [2])'
  132 |   int httpCode = https.GET("/");
      |                               ^
In file included from C:\Users\user\OneDrive\Dokumenty\Arduino\WebInterface_SP111\WebInterface_SP111.ino:58:
C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266HTTPClient\src/ESP8266HTTPClient.h:190:9: note: candidate: 'int HTTPClient::GET()'
  190 |     int GET();
      |         ^~~
C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266HTTPClient\src/ESP8266HTTPClient.h:190:9: note:   candidate expects 0 arguments, 1 provided

exit status 1

Compilation error: no matching function for call to 'HTTPClient::GET(const char [2])'


Ta moja metoda wstawiona do projektu viewtopic.php?t=15048 z którego zaczerpnąłem - działa prawidłowo ale tam nie ma supli
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
malarz
Posts: 506
Joined: Wed Jan 27, 2021 4:04 pm
Been thanked: 2 times

Post

shimano73 wrote:
Czyli masz ścieżkę podaną od razu w "host".

A co się wyświetla na konsoli po liniach:

Code: Select all

  Serial.print("httpCode : ");Serial.println(httpCode);
  Serial.print("JSON  : ");Serial.println(json);
  Serial.print("odczyt linku : ");Serial.println(ValueDirectLink);
To pozwoli wyłapać miejsce błędu.
Próbuję przerobić pomysły na działające projekty w ArduinoIDE.

Return to “Pomoc”