• Hallo liebe Bastelfreunde,
    ich versucher vergebens einen ESP8266 mit DHT22 Sensor + Akku und Deepsleep in Homebridge zu integrieren.

    Ich habe dank dieser Anleitung einen DS18B20 Sensor in Homebridge eingefügt mit Http Webhooks

    und

    dank dieser Anleitung einen DHT22 aber mit dauerhafter USB Verbindung, Wifi-Server eingerichtet.

    Leider bekomme ich den DS18B20 Sensor nicht mit dem DHT22 getauscht weil ich es schlicht und einfach nicht verstehe wie alle Bibilotheken zusammen agieren.

    Wichtig ist halt das es per Http Webhooks funktioniert da sonst die Akkulösung mit DeepSleep nicht lange funktioniert.

    Kann mir da zufällig einer weiterhelfen?

    Ich hoffe, ich durfte fremde Seiten hier Verlinken, da es sich leichter erkären lässt.

    MfG Daniel


  • Also vom @Gauweiler42 kannst du gerne was verlinken. 😄

    Ansonsten, hier wäre mal ein Code, wie du die Daten von einem DHT22 bekommst.

    Beide Codes verwenden den Pin D4 also GPIO 2 als Datenpin.

    /*
        DHT22 Basic Code
        Temperatur und Luftfeuchtigkeit auslesen mit einem DHT22 Shield
        Created by cooper, 2020
        my.makesmart.net/user/cooper
    */
    
    #include "DHT.h"
    #define sensor DHT22
    
    int dataPin = 2; // PIN D4 = GPIO 2
                   
    // DHT22 initialisieren
    DHT dht(dataPin, sensor);                
    
    // Temperatur
    float temperature;
    // Luftfeuchtigkeit
    float humidity;
    //Gefühlte Temperatur
    float heatindex;
     
    void setup() {
      Serial.begin(115200);
      delay(100);
      
      pinMode(dataPin, INPUT);
      dht.begin();              
    }
    
    
    
    void loop() {
      
      temperature = dht.readTemperature(); // Die Temperatur des Sensors
      humidity = dht.readHumidity(); // Die Luftfeuchtigkeit des Sensors
      
      // Gefühlte Temperatur wird errechnet aus temperature und humidity
      heatindex = dht.computeHeatIndex(temperature, humidity, false);
    
      Serial.println("##############################");
      Serial.println("Temperatur: " + String(temperature) + " °C");
      Serial.println("Feuchtigkeit: " + String(humidity) + " %");
      Serial.println("Gefühlte Temperatur: " + String(heatindex) + " °C");
    
      
      delay(3500);
      
    }
    

    Das einige was du machen musst, ist alles von Dallas und DS18B20 zu entfernen und stattdessen dann die im oberen Code ausgelesenen Werte mit der API-Request zu senden.

    Hier ist der Code von @Gauweiler42 mal gekürzt, sodass du dann die Werte vom DHT22 übergeben kannst.

    #include <ESP8266HTTPClient.h>
    #include <ESP8266WiFi.h>
    #include "DHT.h"
    #define sensor DHT22
    
    HTTPClient sender;
    
    const char* ssid = "Wifi Name";
    const char* password = "Wifi_Passwort";
    
    
    int dataPin = 2; // PIN D4 = GPIO 2
                   
    // DHT22 initialisieren
    DHT dht(dataPin, sensor);  
    
    // Temperatur
    float temperature;
    // Luftfeuchtigkeit
    float humidity;
    //Gefühlte Temperatur
    float heatindex;
    
    void setup() {
      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());
    
    }
    
    void loop() {
    
    
       temperature = dht.readTemperature(); // Die Temperatur des Sensors
       humidity = dht.readHumidity(); // Die Luftfeuchtigkeit des Sensors
       heatindex = dht.computeHeatIndex(temperature, humidity, false);
      
    
      // Hier die IP-Adresse der Homebridge und den Port von Http Webhooks einfügen
      apiSend("http://192.168.178.24:1837/?accessoryId=tempPool&value=", String(temperature));
    
      // Deep Sleep schalten
      ESP.deepSleep(900e6);
    }
    
    void apiSend(String path, String state) {
      String temp = path + state;
      if (sender.begin(temp)) {
    
        // HTTP-Code der Response speichern
        int httpCode = sender.GET();
       
    
        if (httpCode > 0) {
          
          // Anfrage wurde gesendet und Server hat geantwortet
          // Info: Der HTTP-Code für 'OK' ist 200
          if (httpCode == HTTP_CODE_OK) {
    
            // Hier wurden die Daten vom Server empfangen
    
            // String vom Webseiteninhalt speichern
            String payload = sender.getString();
    
            // Hier kann mit dem Wert weitergearbeitet werden
           // ist aber nicht unbedingt notwendig
            Serial.println(payload);
          }
        }else{
          // Falls HTTP-Error
          Serial.printf("HTTP-Error: ", sender.errorToString(httpCode).c_str());
        }
    
        // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet
        sender.end();
        
      } else {
        Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!");
      }
    

    Habs jetzt nicht getestet, aber sollte so funktionieren. Wichtig ist, dass hier halt auch nur die Temperatur übergeben wird, nicht die Luftfeuchtigkeit.


  • Hallo @cooper
    Vielen dank für die schelle Hilfe.
    Ich habe deinen Code ausprobiert und erfolgreich in Homekit integriert. Mir war nicht bewusst dass man die Luftfeuchte nicht hinzufügen kann. Oder geht das irgendwie? Ich habe die API im Folgenden hinzugefügt und auch in Homebridge den erforderlichen Sensor angelegt aber wie du sagtest, geht es leider nicht.
    Das war mir gerade wichtig dass ich einen Mobilen Homekit-Sensor habe (gibt es zu kaufen, will aber gerne selber Basteln und 3D Drucken 😄 ).
    Gibt es irgendwie eine möglichkeit den Luftfeuchtewert zu integrieren?
    LG Daniel

    #include <ESP8266HTTPClient.h>
    
    #include <ESP8266WiFi.h>
    
    #include "DHT.h"
    
    #define sensor DHT22
    
     
    
    HTTPClient sender;
    
     
    
    const char* ssid = "****";
    
    const char* password = "****";
    
     
    
     
    
    int dataPin = 2; // PIN D4 = GPIO 2
    
                   
    
    // DHT22 initialisieren
    
    DHT dht(dataPin, sensor);  
    
     
    
    // Temperatur
    
    float temperature;
    
    // Luftfeuchtigkeit
    
    float humidity;
    
    //Gefühlte Temperatur
    
    float heatindex;
    
     
    
    void setup() {
    
      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());
    
     
    
    }
    
     
    
    void loop() {
    
     
    
     
    
       temperature = dht.readTemperature(); // Die Temperatur des Sensors
    
       humidity = dht.readHumidity(); // Die Luftfeuchtigkeit des Sensors
    
       heatindex = dht.computeHeatIndex(temperature, humidity, false);
    
      
    
     
    
      // Hier die IP-Adresse der Homebridge und den Port von Http Webhooks einfügen
    
      apiSend("http://192.168.178.112:1837/?accessoryId=tempPool&value=", String(temperature));
    
     *apiSend("http://192.168.178.112:1837/?accessoryId=Humidity&value=", String(humidity));
    
      // Deep Sleep schalten
    
      ESP.deepSleep(9e6);
    
    }
    
     
    
    void apiSend(String path, String state) {
    
      String temp = path + state;
    
      if (sender.begin(temp)) {
    
     
    
        // HTTP-Code der Response speichern
    
        int httpCode = sender.GET();
    
       
    
     
    
        if (httpCode > 0) {
    
          
    
          // Anfrage wurde gesendet und Server hat geantwortet
    
          // Info: Der HTTP-Code für 'OK' ist 200
    
          if (httpCode == HTTP_CODE_OK) {
    
     
    
            // Hier wurden die Daten vom Server empfangen
    
     
    
            // String vom Webseiteninhalt speichern
    
            String payload = sender.getString();
    
     
    
            // Hier kann mit dem Wert weitergearbeitet werden
    
           // ist aber nicht unbedingt notwendig
    
            Serial.println(payload);
    
          }
    
        }else{
    
          // Falls HTTP-Error
    
          Serial.printf("HTTP-Error: ", sender.errorToString(httpCode).c_str());
    
        }
    
     
    
        // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet
    
        sender.end();
    
        
    
      } else {
    
        Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!");
    
      }
    }
    

  • Naja, dann musst du erstmal ein neues Gerät in deiner Homebridge anlegen, falls du dieses Plugin verwendest:

    https://www.npmjs.com/package/@kellojo/homebridge-http-webhooks

    Humidity sensor

    For humidity sensors the value for NEWVALUE is the new relative humidity percentage reading.

    {
       "id": "sensor6",
       "name": "Sensor name 6",
       "type": "humidity"
    }
    

    Und dann kannst du mit der URL arbeiten:

    http://yourHomebridgeServerIp:webhook_port/?accessoryId=theAccessoryIdToUpdate&value=NEWVALUE
    
    http://192.168.178.112:1837/?accessoryId=sensor6&value=NEWVALUE
    
    apiSend("http://192.168.178.112:1837/?accessoryId=sensor6&value=", String(humidity));
    

    Hast es ja eigentlich schon geschrieben. Musst den Sensor halt noch in Homebridge hinzufügen und die passende ID für den Sensor angeben.


  • Hallo @cooper,

    nur der DHT Temperatursensor funktioniert. Mit Luftfeuchte bekomme ich in Homebridge eine Fehlermeldung welche am Plugin liegen wird denke ich. Siehe Fotos:
    Screenshot 2023-04-25 223433.jpg

    Lt. Arduino wird es abgesendet:
    Screenshot 2023-04-25 223501.jpg

    Bekomme demnach also keinen Wert in Homebridge/Homekit
    Screenshot 2023-04-25 223357.jpg

    Ich habe auch schon ein verändertes HTTP Plugin installiert ohne Erfolg
    Screenshot 2023-04-25 223944.jpg

    Hast du noch eine Idee?

    #include <ESP8266HTTPClient.h>
    
    #include <ESP8266WiFi.h>
    
    #include "DHT.h"
    
    #define sensor DHT22
    
     
    
    HTTPClient sender;
    
     
    
    const char* ssid = "****";
    
    const char* password = "****";
    
     
    
     
    
    int dataPin = 2; // PIN D4 = GPIO 2
    
                   
    
    // DHT22 initialisieren
    
    DHT dht(dataPin, sensor);  
    
     
    
    // Temperatur
    
    float temperature;
    
    // Luftfeuchtigkeit
    
    float humidity;
    
    //Gefühlte Temperatur
    
    
     
    
    void setup() {
    
      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());
    
     
    
    }
    
     
    
    void loop() {
    
     
    
     
    
       temperature = dht.readTemperature(); // Die Temperatur des Sensors
    
       humidity = dht.readHumidity(); // Die Luftfeuchtigkeit des Sensors
     
    
     
    
      // Hier die IP-Adresse der Homebridge und den Port von Http Webhooks einfügen
    
      apiSend("http://192.168.178.112:1837/?accessoryId=sensor5&value=", String(temperature));
      apiSend("http://192.168.178.112:1837/?accessoryId=sensor6&value=", String(humidity));
     
    
      // Deep Sleep schalten
    
      ESP.deepSleep(9e6);
    
    }
    
     
    
    void apiSend(String path, String state) {
    
      String temp = path + state;
    
      if (sender.begin(temp)) {
    
     
    
        // HTTP-Code der Response speichern
    
        int httpCode = sender.GET();
    
       
    
     
    
        if (httpCode > 0) {
    
          
    
          // Anfrage wurde gesendet und Server hat geantwortet
    
          // Info: Der HTTP-Code für 'OK' ist 200
    
          if (httpCode == HTTP_CODE_OK) {
    
     
    
            // Hier wurden die Daten vom Server empfangen
    
     
    
            // String vom Webseiteninhalt speichern
    
            String payload = sender.getString();
    
     
    
            // Hier kann mit dem Wert weitergearbeitet werden
    
           // ist aber nicht unbedingt notwendig
    
            Serial.println(payload);
    
          }
    
        }else{
    
          // Falls HTTP-Error
    
          Serial.printf("HTTP-Error: ", sender.errorToString(httpCode).c_str());
    
        }
    
     
    
        // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet
    
        sender.end();
    
        
    
      } else {
    
        Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!");
    
      }
    }
    

  • NaN steht normalerweise für “Not a number”. Wenn du dir die beiden Werte über den Seriellen Monitor am ESP8266 anzeigen lässt, werden diese denn richtig ausgegeben?

    Ansonsten könnte es daran liegen, dass am ESP8266 für die Werte ein Float verwendet wird also eine Kommazahl: 21.2, 45.5, …

    Das kannst du manuell prüfen, in dem du die URL einfach mal im Browser eingibst, und schaust, ob die Werte in Homebridge aktualisiert werden. Also einfach mal
    http://192.168.178.112:1837/?accessoryId=sensor6&value=22.2
    und
    http://192.168.178.112:1837/?accessoryId=sensor6&value=22
    aufrufen. Um zu checken ob es evtl. doch am Float liegt.

    Wenn es wirklich daran liegt, dass die Werte am ESP8266 nicht richtig ausgelesen werden, also jetzt vom DHT22, dann einfach nochmal mit der Anleitung ohne das andere Gedöns aufsetzen:

    https://my.makesmart.net/topic/130/der-dht22-am-d1-mini-temperatur-und-luftfeuchtigkeit-messen-tutorial

    Und dann die API Request hinzufügen. 🙂


  • Moin,
    es ist echt komisch. Sende ich die HTTP Zeilen manuell über den Browser, funktioniert es so wie es soll.
    Screenshot 2023-04-26 112904.jpg Screenshot 2023-04-26 112842.jpg

    Ab 11:25Uhr habe ich manuell eingegeben und er gibt die werte in % in vollen stellen aus und bei der Temperatur eine stelle nach dem Komma. Ohne Fehlermeldung in Homebridge.

    Der DHT22 funktioniert lt. deinem Sketch hervorragend im Seriellen Monitor.
    Screenshot 2023-04-26 112813.jpg

    Sobald ich den Sketch von meinem Vorhaben hochlade geht es nicht mehr.

    Ich habe ebenfalls ein delay eingefügt um zu prüfen ob die Homebridge durcheinander kommt oder der ESP beim absenden.

    void loop() {
    
     
    
     
    
       temperature = dht.readTemperature(); // Die Temperatur des Sensors
    
       humidity = dht.readHumidity(); // Die Luftfeuchtigkeit des Sensors
     
    
     
    
      // Hier die IP-Adresse der Homebridge und den Port von Http Webhooks einfügen
    
      apiSend("http://192.168.178.112:1837/?accessoryId=sensor5&value=", String(temperature));
      
        delay(5000);                // waits for a second
      apiSend("http://192.168.178.112:1837/?accessoryId=sensor6&value=", String(humidity));
     
    delay(5000);
      // Deep Sleep schalten
    
      ESP.deepSleep(9e6);
    
    }
    

    Bis hier hin schonmal vielen dank für deine Hilfe. Ich hoffe das wir das irgendwie hinbekommen können.

    LG Daniel


  • Lass dir in apiSend() mal den String ausgeben, der gesendet wird:

    void apiSend(String path, String state) {
     
      String temp = path + state;
      Serial.println(temp);
      [... ]
    }
    

    Passt das? Was wird da denn ausgegeben?


  • Hallo @cooper,
    scheint so als wenn der Wert nicht ausgegeben wird.

    Screenshot 2023-04-26 150044.jpg

    Neue Info. Nachdem der ESP länger lag und die RST schleife für DeepSleep nicht verbunden war hat er Werte angesendet. Leider keine brauchbaren werte da es definitiv wärmer und mehr Luftfeuchte war. Screenshot 2023-04-26 164758.jpg

    Nach dem manuellen drücken des RST wieder keine werte “nan”.


  • Es fehlt glaub einfach nur

    dht.begin();

    im setup() kann des sein?


  • Es FUNKTIONIERT!!! Screenshot 2023-04-26 181138.jpg Screenshot 2023-04-26 181308.jpg
    Mega Danke,

    dht.begin();
    

    hat wirklich gefehlt.

    Wenn ich mein Projekt fertig habe werde ich es im Anschluss hier einstellen. Vielleicht möchte ja doch noch jemand ähnliches durchführen.

    @cooper Ich werde mich auf jedenfall erkenntlich zeigen auf deinem PP-Konto!

    Noch eine kleine Frage. Gäbe es eine Möglichkeit per LED sich anzeigen zu lassen wann die Batterie/Akku geladen werden sollte? Hatte da mal wa gelesen das es möglich wäre wenn zwei Pinns auf dem ESP8266 verbunden werden mit dem Erforderlichen sketch. Die Frage ist natürlich, ob es sich jetzt noch integrieren lässt.

    Anbei noch mal mein Sketch falls ihn jemand möchte.

    #include <ESP8266HTTPClient.h>
    
    #include <ESP8266WiFi.h>
    
    #include "DHT.h"
    
    #define sensor DHT22
    
     
    
    HTTPClient sender;
    
     
    
    const char* ssid = "WLAN-*******";
    
    const char* password = "*******";
    
     
    
     
    
    int dataPin = 2; // PIN D4 = GPIO 2
    
                   
    
    // DHT22 initialisieren
    
    DHT dht(dataPin, sensor);  
    
     
    
    // Temperatur
    
    float temperature;
    
    // Luftfeuchtigkeit
    
    float humidity;
    
    //Gefühlte Temperatur
    float heatindex;
    
     
    
    void setup() {
    
      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());
    
     dht.begin();
    
    }
    
     
    
    void loop() {
    
    
       temperature = dht.readTemperature(); // Die Temperatur des Sensors
    
       humidity = dht.readHumidity(); // Die Luftfeuchtigkeit des Sensors
      
       heatindex = dht.computeHeatIndex(temperature, humidity, false);
    
      // Hier die IP-Adresse der Homebridge und den Port von Http Webhooks einfügen
    
      apiSend("http://192.168.178.112:1837/?accessoryId=sensor5&value=", String(temperature));
      
        delay(1000);                // waits for a second
    
      apiSend("http://192.168.178.112:1837/?accessoryId=sensor6&value=", String(humidity));
        
        delay(1000);                // waits for a second
    
      apiSend("http://192.168.178.112:1837/?accessoryId=sensor7&value=", String(heatindex)); 
    
      delay(1000);                // waits for a second
    
      // Deep Sleep schalten
      ESP.deepSleep(900e6);
    
    }
    
     
    
    void apiSend(String path, String state) {
    
      String temp = path + state;
    Serial.println(temp);
      if (sender.begin(temp)) {
    
     
    
        // HTTP-Code der Response speichern
    
        int httpCode = sender.GET();
    
       
    
     
    
        if (httpCode > 0) {
    
          
    
          // Anfrage wurde gesendet und Server hat geantwortet
    
          // Info: Der HTTP-Code für 'OK' ist 200
    
          if (httpCode == HTTP_CODE_OK) {
    
     
    
            // Hier wurden die Daten vom Server empfangen
    
     
    
            // String vom Webseiteninhalt speichern
    
            String payload = sender.getString();
    
     
    
            // Hier kann mit dem Wert weitergearbeitet werden
    
           // ist aber nicht unbedingt notwendig
    
            Serial.println(payload);
    
          }
    
        }else{
    
          // Falls HTTP-Error
    
          Serial.printf("HTTP-Error: ", sender.errorToString(httpCode).c_str());
    
        }
    
     
    
        // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet
    
        sender.end();
    
        
    
      } else {
    
        Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!");
    
      }
    }
    

    LG Daniel


  • Damit wärst du dann der erste, der jemals den Link benutzt hat. 😄

    Also ja theoretisch könntest du das über den A0 Pin machen.

    Hier mal ein Beispiel in der Anwendung:
    https://my.makesmart.net/topic/115/der-msp-107-helligkeitssensor-am-esp8266-d1-mini-tutorial

    Der verträgt halt max. 3.3V als Input und liefert dabei dann einen Wert von 0 - 1023.

    Wenn dein Akku mehr Spannung hat, müsstest du irgendwie mit nem Spannungsteiler arbeiten.
    Aber theoretisch kannst du anhand des Wertes dann erkennen wann mal wieder eine Ladung nötig wäre. Ich weiß nicht ob das von 0 - 1023 linear verläuft, dann könnte man sich das vielleicht ausrechnen. Man könnte den Status ja dann auch gleich an HomeKit senden, sodass man weiß, wie die Batterie aussieht.

    Wenn du es doch mit der LED machen willst, hilft dir vielleicht mein Grundlagen-Video weiter:

    Und noch als kleinen Tipp. Deine delay() zwischen den einzelnen Request kannst du eigentlich entfernen, da das alles eh von oben nach unten synchron abgearbeitet wird. Eigentlich kann da nichts durcheinander kommen. Und so sparst du dir nochmal ein paar Sekunden was du an der Akku-Laufzeit am Ende definitiv merken wirst.

      apiSend("http://192.168.178.112:1837/?accessoryId=sensor5&value=", String(temperature));
      apiSend("http://192.168.178.112:1837/?accessoryId=sensor6&value=", String(humidity));
      apiSend("http://192.168.178.112:1837/?accessoryId=sensor7&value=", String(heatindex)); 
      ESP.deepSleep(900e6);
    

Ähnliche Themen

  • 1
  • 1
  • 9
  • 1
  • 2