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

malarz wrote: Tue Mar 18, 2025 7:12 pm
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.
Tak, ściezka jest od razu pod "host" , a na konsoli pojawia sie to

Code: Select all

20:14:36.671 -> httpCode : -1
20:14:36.671 -> JSON  : 
20:14:36.671 -> odczyt linku : 0.00
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: Tue Mar 18, 2025 6:29 pm
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źć ?
Nie bardzo wiem o co pytasz?:

- Czy źle zrozumiałem tytuł tego wątku?
- Czy nie widzisz funkcji czytającej w moim szkicu?
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
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 7:17 pm
shimano73 wrote: Tue Mar 18, 2025 6:29 pm
SOYER wrote: Tue Mar 18, 2025 6:17 pm

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źć ?
Nie bardzo wiem o co pytasz?:

- Czy źle zrozumiałem tytuł tego wątku?
- Czy nie widzisz funkcji czytającej w moim szkicu?
Odp 2 - Czy nie widzisz funkcji czytającej w moim szkicu? :)
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

No serio? Orzecież na tym opiera się cały program.
To:

Code: Select all

  boolean reconnect() {
  if (WiFi.status() == WL_CONNECTED) {
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
      USBSerial.println("!!connected to MQTT!!");
      if(num_of_counter==1){
        client.subscribe(top1.c_str());
      }
      else if(num_of_counter==2){
        client.subscribe(top1.c_str());
        client.subscribe(top2.c_str());
      }
      else if(num_of_counter==3){
        client.subscribe(top1.c_str());
        client.subscribe(top2.c_str());
        client.subscribe(top3.c_str());
      }
    } else {
      USBSerial.print("failed, rc=");
      USBSerial.print(client.state());
    }
  }
  return client.connected();
}
void mqttConfig() {
  USBSerial.println("MQTT config...");
  client1.setInsecure();
  client.setServer(mqtt_server, 8883);
  client.setCallback(callback);
}

void callback(char* topic, byte* payload, unsigned int length) {
  USBSerial.print("Message arrived [");
  USBSerial.print(topic);
  USBSerial.print("] ");
  for (int i = 0; i < length; i++) {
    USBSerial.print((char)payload[i]);
  }
  USBSerial.println();
  if (strcmp(topic, top1.c_str()) == 0) {
    payload[length] = '\0';
    counter_1 = atof((char*)payload);
    if(first_run1){
      tempCounter_1 = counter_1;
      tempCounterNight_1 = counter_1;
      first_run1=false;
    }
    USBSerial.print("COUNTER1:......................");
    USBSerial.println(counter_1);
  }
  if (strcmp(topic, top2.c_str()) == 0) {
    payload[length] = '\0';
    counter_2 = atof((char*)payload);
    if(first_run2){
      tempCounter_2 = counter_2;
      tempCounterNight_2 = counter_2;
      first_run2=false;
    }
    USBSerial.print("COUNTER2:......................");
    USBSerial.println(counter_2);
  }
  if (strcmp(topic, top3.c_str()) == 0) {
    payload[length] = '\0';
    counter_3 = atof((char*)payload);
    if(first_run3){
      tempCounter_3 = counter_3;
      tempCounterNight_3 = counter_3;
      first_run3=false;
    }
    USBSerial.print("COUNTER3:......................");
    USBSerial.println(counter_3);
  }
}
 
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
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 7:28 pm No serio? Orzecież na tym opiera się cały program.
To:

Code: Select all

  boolean reconnect() {
  if (WiFi.status() == WL_CONNECTED) {
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
      USBSerial.println("!!connected to MQTT!!");
      if(num_of_counter==1){
        client.subscribe(top1.c_str());
      }
      else if(num_of_counter==2){
        client.subscribe(top1.c_str());
        client.subscribe(top2.c_str());
      }
      else if(num_of_counter==3){
        client.subscribe(top1.c_str());
        client.subscribe(top2.c_str());
        client.subscribe(top3.c_str());
      }
    } else {
      USBSerial.print("failed, rc=");
      USBSerial.print(client.state());
    }
  }
  return client.connected();
}
void mqttConfig() {
  USBSerial.println("MQTT config...");
  client1.setInsecure();
  client.setServer(mqtt_server, 8883);
  client.setCallback(callback);
}

void callback(char* topic, byte* payload, unsigned int length) {
  USBSerial.print("Message arrived [");
  USBSerial.print(topic);
  USBSerial.print("] ");
  for (int i = 0; i < length; i++) {
    USBSerial.print((char)payload[i]);
  }
  USBSerial.println();
  if (strcmp(topic, top1.c_str()) == 0) {
    payload[length] = '\0';
    counter_1 = atof((char*)payload);
    if(first_run1){
      tempCounter_1 = counter_1;
      tempCounterNight_1 = counter_1;
      first_run1=false;
    }
    USBSerial.print("COUNTER1:......................");
    USBSerial.println(counter_1);
  }
  if (strcmp(topic, top2.c_str()) == 0) {
    payload[length] = '\0';
    counter_2 = atof((char*)payload);
    if(first_run2){
      tempCounter_2 = counter_2;
      tempCounterNight_2 = counter_2;
      first_run2=false;
    }
    USBSerial.print("COUNTER2:......................");
    USBSerial.println(counter_2);
  }
  if (strcmp(topic, top3.c_str()) == 0) {
    payload[length] = '\0';
    counter_3 = atof((char*)payload);
    if(first_run3){
      tempCounter_3 = counter_3;
      tempCounterNight_3 = counter_3;
      first_run3=false;
    }
    USBSerial.print("COUNTER3:......................");
    USBSerial.println(counter_3);
  }
}
 
No to chyba jestem tępa dzida ale nie wiem w którym miejscu wpisać link bezpośredni a gdzie będzie odpowiedź :?
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

Radzę to dzisiaj zostawić i usiąść do tego jutro.
Masz wszystko na tacy, treść topica, połączenie z mqtt, odczyt i zapisanie wartości do zmiennej.
Nie wiem jak bardziej mogę Ci pomóc.
Poczytaj jeszcze to:

https://randomnerdtutorials.com/esp32-m ... duino-ide/
Last edited by SOYER on Tue Mar 18, 2025 9:19 pm, edited 4 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
Zibi_007
Posts: 3985
Joined: Tue Oct 31, 2023 10:06 pm
Has thanked: 10 times
Been thanked: 31 times

Post

SOYER wrote: Tue Mar 18, 2025 7:50 pm Radzę to dzisiaj zostawić i usiąść do tego jutro.
Masz wszystko na tacy, treść linka, połączenie z mqtt, odczyt linka i zapisanie wartości do zmiennej.
Nie wiem jak bardziej mogę Ci pomóc.
Poczytaj jeszcze to:

https://randomnerdtutorials.com/esp32-m ... duino-ide/
Tomku, Ty na pewno o tym piszesz? https://gui-generic-builder.supla.io/gu ... zposrednie
Image Wiesz, że Supla obsługuje Zigbee? Wstąp do Klubu Promila: https://forum.supla.org/viewtopic.php?t=18018
Image Szukasz nowego GG? Jest tutaj: https://forum.supla.org/viewtopic.php?t=18036
Adamo28
Posts: 223
Joined: Sun Nov 08, 2020 2:54 pm

Post

Kolega shimano73 próbuje uskutecznić linki bezpośrednie a kolega SOYER próbuje go przekonać do zrobienia tego samego ale po mqtt. Trochę się nie spotkaliście w tym samym miejscu. Po wklejeniu linka w przeglądarkę można podejrzeć każdą zmienną którą on udostępnia.
Poniżej kawałek kodu który powinien coś rozjaśnić, kod testowy i z tego co pamiętam to działał ale bez gwarancji

Code: Select all

#include <Arduino.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
 
const char* ssid = "wifissid";
const char* password = "wifipass";

WiFiClientSecure client;

String serverName = "https://svrxx.supla.org/direct/xxxxxxxxxxx/read?format=json"; //Direct Link mew-01

unsigned long lastTime = 0;

// Set timer to 5 seconds (5000)
unsigned long timerDelay = 5000;

void setup() {
 Serial.begin(115200); 
 WiFi.begin(ssid, password);
 client.setInsecure();
 Serial.println("Connecting");
  
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
 Serial.println("");
 Serial.print("Connected to WiFi network with IP Address: ");
 Serial.println(WiFi.localIP());
 Serial.println("Timer set to 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading.");
}

void loop() {
  
  //Send an HTTP POST request every 10 minutes
  if ((millis() - lastTime) > timerDelay) {
    
    //Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      HTTPClient http;
      String serverPath = serverName;
      
      // Your Domain name with URL path or IP address with path
      http.begin(client, serverPath.c_str());
        
      // Send HTTP GET request
      int httpResponseCode = http.GET();
      
      if (httpResponseCode>0) {
        Serial.print("HTTP Response code: ");
        Serial.println(httpResponseCode);
        String json = http.getString();
        StaticJsonDocument<600> filter;
        filter["phases"][0]["totalForwardActiveEnergy"] = true;
        StaticJsonDocument<600> doc;
        deserializeJson(doc, json, DeserializationOption::Filter(filter));
        double val15 = doc["phases"][0]["totalForwardActiveEnergy"];
        double val16 = doc["phases"][1]["totalForwardActiveEnergy"];
        double val17 = doc["phases"][2]["totalForwardActiveEnergy"];

        Serial.println("Energia Czynna Pobrana:");
        Serial.println(val15);
        Serial.println(val16);
        Serial.println(val17);
        Serial.print("Razem:");
        Serial.print(val15 + val16 + val17);
        Serial.println(" kWh");
        Serial.println(" ");

      }
      else {
        Serial.print("Error code: ");
        Serial.println(httpResponseCode);
      }
      // Free resources
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}



Linki są trochę ospałe, po MQTT odświeżanie wartości jest porównywalne do tej w apce Supli.
You do not have the required permissions to view the files attached to this post.
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

Jak się kolega shimano uprze to zrobi odczyt po linku np przy pomocy tego tutoriala:
https://randomnerdtutorials.com/esp32-h ... t-arduino/

Jak chce często odpytywać serwer, albo nie przegapić żadnej zmiany licznika, to zdecydowanie lepsze mqtt. Nie odpytujesz serwera, tylko serwer sam Cię informuje o zmianie.
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

MQTT to link bezpośredni tak jak ka to rozumiem, nie trzymajmy się twardo definicji, idźmy raczej z duchem sposobu, a nie trzymajmy się kurczowo tego co zapisano. Teraz jest czas rozwiązań problemu, a nie kurczowego trzymania się zasad.
😂🤣😂
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79

Return to “Pomoc”