Wert aus einer URL auslesen und an einem String übergeben

Hallo Zusammen,

ich möchte mit einen ESP32 einen Wert in einer URL speichern, anschließend soll dieser Wert mit einem anderen ESP32 auslesen und Verarbeitet werden. Als Beispiel würde ich sagen eine Temperatur die bei bestimmten Wert ein Ereignis auslösen soll.

Vielleicht machen ich auch was falsch also für Tipps wäre ich dankbar. :slight_smile:

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h> 
#include <HTTPClient.h>
#include <Arduino.h>



WebServer server(80); 
HTTPClient sender;
#define Heizung 12
#define Schalter 21

int data; 
int Temperatur = 15;

void setup()
{

  pinMode(Heizung, OUTPUT);
  pinMode(Schalter, INPUT);
  Serial.begin(115200);
  Serial.println("ESP Gestartet");

  WiFi.begin(ssid, password);

  Serial.print("Verbindung wird hergestellt ...");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Verbunden! IP-Adresse: ");
  Serial.println(WiFi.localIP());
  
  server.onNotFound([](){
    server.send(404, "text/plain", "Link wurde nicht gefunden!");  
  });

  server.on("/", []() {
    server.send(200, "text/plain", "ESP-Startseite!");
  });

  server.on("/set_data", [](){

    set_Data();
    
  });

  server.on("/state",[]()
  {
    server.send(200,"text/plain",String(Temperatur));
  });

  server.begin();
  Serial.println("Webserver gestartet.");
}

void loop() {
  server.handleClient(); 
  
if((digitalRead(Schalter) == HIGH))
  {
    sender.begin("http://192.168.43.15/state");
int httpCode = sender.GET();
sender.GET();
    String re_data = sender.getString();
Serial.println("re_data" + (re_data));
Serial.println(sender.errorToString(httpCode));

  }
  delay(2000);
  sender.end();
}




}


void get_Data(){
  int Werte_uebergeben = 0;
  Werte_uebergeben = server.args();
  
  for (int i = 0; i < Werte_uebergeben; i++) {
    

    if(server.argName(i) == "Temperatur"){
        data = digitalRead(Temperatur);
        server.send(200, "text/plain", String(data));
    }


    
  }
}

derzeitig habe ich einen Fehlercode “Read Timeout”

Serial.println(sender.errorToString(httpCode));

Vielleicht mache ich was einfaches Falsch…

Gruß, Skayler

Eigentlich benötige ich nur Hilfe dabei den Wert aus der Website in meinem fall "http://192.168.43.15/state" auszulesen und an einem String zu übergeben.

wenn du die richtigen Beispiele in der IDE durchgehst, kommst du auf zwei wichtige Methoden:

server.argName(i) und server.arg(i).toInt();

quasi einen Parameter abfragen und den Wert eines Parameters ausgeben, bzw. in int wandeln. Das heißt am ESP gibt es eigentlich keinen Grund das zu Fuß zumachen.

ich habe mal beschrieben wie man mittels HTTP von einem ESP8266 an einen anderen Daten überträgt. hier zum nachlesen http://werner.rothschopf.net/201809_arduino_esp8266_server_client_0.htm

Lesezeit >60 min aber da sollte sich auch für dich was finden lassen.

Ich möchte ausdem Programm herraus eine Wert an der URL geben und die dann auch nur im Programm klein Stückeln und dann verarbeiteten eine Web Varaiante habe ich schon Funktionsfähig…

das ich bei der URL die Temperatur entnehme, habe jetzt schon erfahren das ich das nicht mit einem “GET” machen kann da mein Wert nicht in der URL ist sondern auf der Website hinterlegt habe mich da mal durchgeguckt und nichts gefunden… (vll habe ich das auch übersehen)

Gibt es diesen Text auch in einer verständlichen Version? Meinst Du, dass der sender die Variable versenden soll? Warum soll das nicht mit get gehen? Warum rufst Du 2 Mal get auf?

Gruß Tommy

ich versuchs mal :smiley:

bei den Seiten die ich zulesen bekommen habe wurde desagt das bei “get” die URL ausgewertet wird also müssten die Werte in der URL hinterlegt sein…

ich schreibe bei “state” den Wert einfach auf die Website und möchte diese extraieren.

das 2 x get kommt warscheinlich daher das ich schon mehrere Sachen ausprobiert habe und ich vergessen habe 1 get zu löschen…

mit dem httpCode habe ich die Fehlermeldung raus gefiltert Fehler -11 (read Timeout)

Ich möchte die 15 Grad (selbst erzeugt)aus der Webseite extraieren.
Nun möchte ich immer auf der Seite 192.168.43.15/state gucken ob da ein anderer Wert hinterlegt wird
bei GET müsste das dann ja 192.168.42.15/state=15 heißen glaube ich zumindestens.

skayler: Nun möchte ich immer auf der Seite 192.168.43.15/state gucken ob da ein anderer Wert hinterlegt wird bei GET müsste das dann ja 192.168.42.15/state=15 heißen glaube ich zumindestens.

Das kommt auf dieWebsite an. Mit GET .../state=15 setzt Du einen Wert auf 15.

So wirklich verstehe ich immer noch nicht, was Du genau willst. Wennn der ESP nur einen [u]anderen[/u] Webserver abfragen soll, was soll dann dessen Werbserver machen?

Gruß Tommy

Tommy56: Das kommt auf dieWebsite an. Mit GET .../state=15 setzt Du einen Wert auf 15.

dann hab Ich das Falsch verstanden...

Ich habe einen Sender der beispielesweise ein Thermostat ist wo ich Temperaturen von 0-100 einstellen kann. Dieser Wert (der eingestellt worden ist) soll unter .../state alle 5 Sekunden abgelegt werden.

Ich möchte beim Empfänger .../state auslesen welche Temperatur bei dem Sender ausgewählt wurde und passende Ausgänge setzen.

In meinem fall wären Sender sowie Empfänger ESP32...

Hallo,

tut mir leid ich hab nicht verstande was Du vorhast.

  1. Warum eine Webseite ?
  2. Du willst mit einem Brauser auf die Webseite und die Temperatur soll in der URL ausgegeben werden ?
  3. Du willst mit einem Brauser auf die Webseite und hinten an die URL die Temperatur angeben ?
  4. wozu der zweite ESP ?

[u]Um Daten von einem ESP auf einen zweiten zu senden benötigt man keinen Webserver. Das geht mit UDP uder TCP viel einfacher.[/u]

Versuch doch mal zu beschreiben was du vorhast.

Heinz

Momentan machst Du aber beides in einem Sketch. Das geht schief. Bei dem einen ESP (Server) gibst Du die eingestellte Temperatur zurück:

server.on("/state",[]()
  {
    server.send(200,"text/plain",String(Temperatur));
  });

Der andere fragt sie mit GET ab und bekommt die Temperatur als Payload.

Zum Payload schau Dir doch einfach mal den BasicHttpClient in Deinen Beispielen zum ESP32 an.

Gruß Tommy

Hallo Heinz,

Rentner: 1. Warum eine Webseite ?

Die Überlegung war eine Funkverbindung auch über 2 ESP hinaus also zum Beispiel das 8 ESP den Wert verwenden können.

Rentner: 2. Du willst mit einem Brauser auf die Webseite und die Temperatur soll in der URL ausgegeben werden ?

Das muss nicht unbedingt geplant war das der Empfänger /state auswertet den Wert X erhält und ich einen Ausgang setze.

Rentner: 3. Du willst mit einem Brauser auf die Webseite und hinten an die URL die Temperatur angeben ?

Ich möchte einfach nur eine Zahl von der Webseite auslesen derzeitig schreibe Ich den Wert in die Website diese möchte ich dann als einfachen Wert haben also wenn es 5 Grad sind das Ich am Ende nur den Wert 5 habe.

Rentner: 4. wozu der zweite ESP ?

Ich möchte Mehrere sachen miteinander vernetzen ohne eine Kabelverbindung haben zu müssen.

hoffe ich habe es etwas deutlicher gemacht...

Ich möchte einen Wert an eine Website übergeben und diese an anderen Stellen verarbeiten also auf einen anderen ESP der immer auf /state zugreift

Tommy56: Momentan machst Du aber beides in einem Sketch. Das geht schief. Bei dem einen ESP (Server) gibst Du die eingestellte Temperatur zurück:

server.on("/state",[]()
  {
    server.send(200,"text/plain",String(Temperatur));
  });

Der andere fragt sie mit GET ab und bekommt die Temperatur als Payload.

Zum Payload schau Dir doch einfach mal den BasicHttpClient in Deinen Beispielen zum ESP32 an.

Gruß Tommy

Das mache ich derzeitig alles auf einem um es zu Testen also das Wert von Website auslesen.... Oder ist das zu scheintern verurteilt=?

Das habe ich noch nicht probiert, weil ich darin keinen Sinn sehe.

Gruß Tommy

Hallo,

ein anderer, sicher völlig blöder Vorschlag. Der Webserver schreibt den Temperaturwert in den Boddy Teil der Webseite , eine Zeile. Der client ließt die Seite und wertet den text aus.

ich hab sowas mal im Zusammenhang mit einem Projekt gesehen das wurde Datum/Zeit von einem Zeitserver als HTML abgerufen.

Heinz

Rentner: Hallo,

ein anderer, sicher völlig blöder Vorschlag. Der Webserver schreibt den Temperaturwert in den Boddy Teil der Webseite , eine Zeile. Der client ließt die Seite und wertet den text aus.

ich hab sowas mal im Zusammenhang mit einem Projekt gesehen das wurde Datum/Zeit von einem Zeitserver als HTML abgerufen.

Heinz

ich würde sagen das ich sowas ähniches haben möchte.

Würde sogar das grade so machen da ich die Temperatur zur Zeit auch in den body schreibe also auf der Website steht derzeitig dann der Wert den Ich übergeben möchte bekomme diesen aber derzeitg nicht ausgelesen.

Wenn Du ihn in einem html-Kontext überträgst ist er schwieriger auszulesen, als bei text/plain. Da ist er einfach da. Das hatten wir aber schon.

Gruß Tommy

oh ok ...

habe mir die Beispiele angeschaut aber so payload hatte ich kein Beispiel gefunden....

habe mir Post und so angeschaut, bin mir aber nicht sicher wie ich solche beispiele verarbeiten kann...

Bin vll auch schon bisschen blind nach 2 Wochen rum experimentieren...

skayler: habe mir die Beispiele angeschaut aber so payload hatte ich kein Beispiel gefunden....

Dann solltest Du lesen lernen. In dem von mir genannten Beispiel BasicHttpClient heißt die Variable sogar payload.

Gruß Tommy