Temperatur ins Netzwerk senden

Hallo,

ich habe gestern meinen ersten Wemos D1 mini bekommen und natürlich gleich losgebastelt :slight_smile:

Dabei messe ich Temperatur und Luftfeuchtigkeit mit einem DHT11 und lasse sie im Browser anzeigen. Den Sketch habe ich mir aus Beispielen zusammengesetzt, funktioniert wunderbar:

/* DHTServer - ESP8266 Webserver with a DHT sensor as an input
     
       Based on ESP8266Webserver, DHTexample, and BlinkWithoutDelay (thank you)
     
       Version 1.0  5/3/2014  Version 1.0   Mike Barela for Adafruit Industries
    */
    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <ESP8266WebServer.h>
    #include <DHT.h>
    #define DHTTYPE DHT11
    #define DHTPIN  2
  
     
    const char* ssid     = "***";
    const char* password = ":-)";
     
    ESP8266WebServer server(80);
    EthernetClient client;
     
    // Initialize DHT sensor 
    // NOTE: For working with a faster than ATmega328p 16 MHz Arduino chip, like an ESP8266,
    // you need to increase the threshold for cycle counts considered a 1 or 0.
    // You can do this by passing a 3rd parameter for this threshold.  It's a bit
    // of fiddling to find the right value, but in general the faster the CPU the
    // higher the value.  The default for a 16mhz AVR is a value of 6.  For an
    // Arduino Due that runs at 84mhz a value of 30 works.
    // This is for the ESP8266 processor on ESP-01 
    DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266
     
    float humidity, temp_f;  // Values read from sensor
    int temp_c;
    String webString="";     // String to display
    // Generally, you should use "unsigned long" for variables that hold time
    unsigned long previousMillis = 0;        // will store last temp was read
    const long interval = 2000;              // interval at which to read sensor
     
    void handle_root() {
      server.send(200, "text/plain", "Hello from the weather esp8266, read from /temp or /humidity");
      delay(100);
    }
     
    void setup(void)
    {
      // You can open the Arduino IDE Serial Monitor window to see what the code is doing
      Serial.begin(115200);  // Serial connection from ESP-01 via 3.3v console cable
      dht.begin();           // initialize temperature sensor
     
      // Connect to WiFi network
      WiFi.begin(ssid, password);
      Serial.print("\n\r \n\rWorking to connect");
     
      // Wait for connection
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("DHT Weather Reading Server");
      Serial.print("Connected to ");
      Serial.println(ssid);
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());
       
      server.on("/", handle_root);
      

      if (client.connect(HomematicIP,80)) {
         Serial.println(temp_c);
         client.print("GET /config/xmlapi/statechange.cgi?ise_id=6014&new_value=");
         client.print(temp_c);
         client.println(" HTTP/1.0");
       }


     
      server.on("/humidity", [](){  // if you add this subdirectory to your webserver call, you get text below :)
        gettemperature();           // read sensor
        webString="Humidity: "+String((int)humidity)+"%";
        server.send(200, "text/plain", webString);               // send to someones browser when asked
      });
      
      server.begin();
      Serial.println("HTTP server started");
    }
     
    void loop(void)
    {
      server.handleClient();
    } 
     
    void gettemperature() {
      // Wait at least 2 seconds seconds between measurements.
      // if the difference between the current time and last time you read
      // the sensor is bigger than the interval you set, read the sensor
      // Works better than delay for things happening elsewhere also
      unsigned long currentMillis = millis();
     
      if(currentMillis - previousMillis >= interval) {
        // save the last time you read the sensor 
        previousMillis = currentMillis;   
     
        // Reading temperature for humidity takes about 250 milliseconds!
        // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
        humidity = dht.readHumidity();          // Read humidity (percent)
        temp_f = dht.readTemperature(true);     // Read temperature as Fahrenheit
        temp_c = (temp_f-32)*5/9;
        // Check if any reads failed and exit early (to try again).
        if (isnan(humidity) || isnan(temp_f)) {
          Serial.println("Failed to read from DHT sensor!");
          return;
        }
      }
    }

Nun möchte ich die Temperatur auch gern zu meiner Homematic CCU2 senden, dort kann sie gespeichert und als chart ausgegeben werden. Dazu kann ich folgende Zeile im Browser eingeben:"192.168.178.4/config/xmlapi/statechange.cgi?ise_id=6014&new_value=50 HTTP/1.0"

Nur bekomme ich es nicht hin, das in Arduino -Code umzusetzen. Im Forum habe ich eigentlich schon eine Lösung gefunden:

https://forum.arduino.cc/index.php?topic=491624.0

Aber bei mir kommen nur Fehlermeldungen, selbst wenn ich SPI.h und Ethernet.h mit einbinde. client oder connect mochte die IDE beim kompilieren nicht, ich habe es Mitternacht genervt wieder verworfen.

Was mache ich falsch?

Vielen Dank
Thomas

Tequilamixer:
Was mache ich falsch?

Du musst schon drauf achten, dass du das richtig Board verwendest.

Der Sketch in deinem Link ist für das Ethernet-Board, nicht für den ESP.

Jetzt ist der code auch noch durcheinander gekommen! Der Absatz mit der Zeile

if (client.connect(HomematicIP,80)) {

gehört da natürlich nicht hin.

Tequilamixer:
Jetzt ist der code auch noch durcheinander gekommen! Der Absatz mit der Zeile

if (client.connect(HomematicIP,80)) {

gehört da natürlich nicht hin.

Das hast sicher du so gemacht, nicht der Sketch selbstständig.

Das ist der richtige sketch:

/* DHTServer - ESP8266 Webserver with a DHT sensor as an input
     
       Based on ESP8266Webserver, DHTexample, and BlinkWithoutDelay (thank you)
     
       Version 1.0  5/3/2014  Version 1.0   Mike Barela for Adafruit Industries
    */
    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <ESP8266WebServer.h>
    #include <DHT.h>
    #define DHTTYPE DHT11
    #define DHTPIN  2
  
     
    const char* ssid     = "***";
    const char* password = ":-)";
     
    ESP8266WebServer server(80);
     
    // Initialize DHT sensor 
    // NOTE: For working with a faster than ATmega328p 16 MHz Arduino chip, like an ESP8266,
    // you need to increase the threshold for cycle counts considered a 1 or 0.
    // You can do this by passing a 3rd parameter for this threshold.  It's a bit
    // of fiddling to find the right value, but in general the faster the CPU the
    // higher the value.  The default for a 16mhz AVR is a value of 6.  For an
    // Arduino Due that runs at 84mhz a value of 30 works.
    // This is for the ESP8266 processor on ESP-01 
    DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266
     
    float humidity, temp_f;  // Values read from sensor
    int temp_c;
    String webString="";     // String to display
    // Generally, you should use "unsigned long" for variables that hold time
    unsigned long previousMillis = 0;        // will store last temp was read
    const long interval = 2000;              // interval at which to read sensor
     
    void handle_root() {
      server.send(200, "text/plain", "Hello from the weather esp8266, read from /temp or /humidity");
      delay(100);
    }
     
    void setup(void)
    {
      // You can open the Arduino IDE Serial Monitor window to see what the code is doing
      Serial.begin(115200);  // Serial connection from ESP-01 via 3.3v console cable
      dht.begin();           // initialize temperature sensor
     
      // Connect to WiFi network
      WiFi.begin(ssid, password);
      Serial.print("\n\r \n\rWorking to connect");
     
      // Wait for connection
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("DHT Weather Reading Server");
      Serial.print("Connected to ");
      Serial.println(ssid);
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());
       
      server.on("/", handle_root);
      

     
      server.on("/humidity", [](){  // if you add this subdirectory to your webserver call, you get text below :)
        gettemperature();           // read sensor
        webString="Humidity: "+String((int)humidity)+"%";
        server.send(200, "text/plain", webString);               // send to someones browser when asked
      });

   
      server.on("/temp", [](){  // if you add this subdirectory to your webserver call, you get text below :)
        gettemperature();           // read sensor
        webString="Temperatur: "+String((int)temp_c)+"*C";
        server.send(200, "text/plain", webString);               // send to someones browser when asked
      });
      
      server.begin();
      Serial.println("HTTP server started");
    }
     
    void loop(void)
    {
      server.handleClient();
    } 
     
    void gettemperature() {
      // Wait at least 2 seconds seconds between measurements.
      // if the difference between the current time and last time you read
      // the sensor is bigger than the interval you set, read the sensor
      // Works better than delay for things happening elsewhere also
      unsigned long currentMillis = millis();
     
      if(currentMillis - previousMillis >= interval) {
        // save the last time you read the sensor 
        previousMillis = currentMillis;   
     
        // Reading temperature for humidity takes about 250 milliseconds!
        // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
        humidity = dht.readHumidity();          // Read humidity (percent)
        temp_f = dht.readTemperature(true);     // Read temperature as Fahrenheit
        temp_c = (temp_f-32)*5/9;
        // Check if any reads failed and exit early (to try again).
        if (isnan(humidity) || isnan(temp_f)) {
          Serial.println("Failed to read from DHT sensor!");
          return;
        }
      }
    }

Ok, also kann ich den Sketch aus dem link nicht verwenden.

Wie sende ich dann mit dem ESP an eine bestimmte IP-Adresse eine Nachricht?

Typische Programmierer- (oder Juristen-)Antwort: Das kommt darauf an. :wink:

Was hast Du auf der Gegenseite im Netz? Wie kannst Du dort programmieren?

Es gibt viele Möglichkeiten. Einige sind (nicht vollständig):

a) per HTTP-Client auf dem ESP an einen Webserver
b) per UDP an ein anderes UDP-Programm
c) per Websocket an einen Browser
d) Der ESP ist der Webserver und er wird von einem Client abgefragt

Für alles gibt es Beispiele.

Gruß Tommy

1 Like

Ich denke a. Meine Homematic-Zentrale (also die Gegenstelle) kann folgene Zeile empfangen:

"192.168.178.4/config/xmlapi/statechange.cgi?ise_id=6014&new_value=50 HTTP/1.0"

Wobei am Anfang die interne IP-Adresse steht und hinter "new_value=" mal 50 als Beispiel eingetragen ist. Soweit funktioniert auch das ändern von Werten per Browser.

soweit komme ich noch :

   client.print("GET /config/xmlapi/statechange.cgi?ise_id=6014&new_value=");
   client.print(temp_c);
   client.println(" HTTP/1.0");

Aber mir ist nicht klar, wo die IP hinkommt und wie ich enden muss.
Fehlen noch irgendwelche Bibliotheken?

Warum nimmst Du nicht die mitgelieferten Beispiele der Libs Deines ESP8266-Packets?
Die sind viel leistungsfähiger, als wenn Du das selbst zusammenstoppelst.

z.B. ESP8266HTTPClient.

Immer von den Beispielen der Lib ausgehen und von dort aus weiter entwickeln und immer die Returncodes auswerten/per Serial ausgeben.

Gruß Tommy

danke noiasca für den richtigen Ansatz. Wificlient habe ich auch gewählt, weil ich diese Bibliothek schon eingebunden habe. Mein fertiger Code sieht nun so aus:

   unsigned long aktuelleMillis2 = millis();
      if(aktuelleMillis2 - vergangeneMillis2 >= sollMillis2) {
        vergangeneMillis2 = aktuelleMillis2;
        SchleifeHoleTemperatur();
        Serial.println("-------------------------------");
        Serial.print(temp_c);Serial.println("*C");
        Serial.print(humidity);Serial.println(" %");
        Serial.println("-------------------------------");
        Serial.println("Übermittlung Daten an Homematic...");

        WiFiClient client;
        if (!client.connect(HomematicIP, httpPort)) {
          Serial.println("Verbindungsaufbau zu Homematic fehlgeschlagen");
          return;
        } else {
          Serial.println("Verbindung zu Homematic hergestellt");
        }
        // jetzt setzen wir die URL für die Datenübermittlung zusammen
        url = "/config/xmlapi/statechange.cgi?ise_id=6014&new_value=";
        url += temp_c;
        // jetzt senden wir die Anfrage an die Homematic
        client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + HomematicIP + "\r\n" + 
               "Connection: close\r\n\r\n");
        timeout = millis();
        while (client.available() == 0) {
          if (millis() - timeout > 5000) {
            Serial.println(">>> Homematic Timeout !");
            client.stop();
            return;
          } 
        }  
        // lese die Antwort von Homematic und gibt sie seriell aus
        while(client.available()){
          String line = client.readStringUntil('\r');
          Serial.print(line);
        } 
        Serial.println();
        Serial.println("closing connection");

... und dabei wieder etwas programmieren gelernt.
Durch die if-Bedingung zu Beginn werden die Daten alle 15 min gesendet.

Hi, ich probiere schon viele Stunden/Tage an dem gleichen Problem. Ich möchte Daten an eine Variable meiner HomeMatic senden. Fixe Daten, das geht schon, aber z. B. Den dht11 auslesen, die Daten in eine Variable Schreiben und dann den Wert der Variablen übergeben, das bekomme ich nicht gelöst
Könntest du mir helfen, hast du ein fertigen Sketch, wo ich nur noch die Daten meiner Wifi und CCU eintragen muss? Liebe Grüße

Du hättest mehr Helfer, wenn du deinen nicht funktionierenden Sketch hier posten ( in Code-Tags) würdest und genau dein Problem beschreibst.
Fertige Sketche werden hier selten geliefert, aber helfen werden alle gern.

Hi

Ein fertiger Sketch, Der Dir genau einen Wert an eine HomeMatic sendet, wird Dir, bis auf 'juhu, irgendwas klappt' nicht viel bringen, da Du Diesen nicht in Deinen Sketch übertragen bekommst.

Wenn feste Werte aber bereits funktionieren, verstehe ich nicht, wieso in Variablen stehende Werte NICHT funktionieren.

Dazu wäre, wie bereits gefordert, Dein Sketch aufschlussreich.

MfG