Terrariumüberwachung mit Home Assistant, ESP8266 (JSON) und zwei DHT22 Sensoren

Terrairum mit ESP8266, zwei DHT22 und Home Assistant überwachen

Wie ich Temperatur und Luftfechtigkeit mit einem NodeMCU V3 (ESP8266 ESP-12E) und zwei DHT 22 Sensoren in meinem Home Assistant über JSON eingerichtet habe, erfahrt ihr im folgenden.

Ich gebe zu mein Start mit der NodeMCU war alles andere als einfach und schnell. Nach mittlerweile einem Tag ergaben sich dann aber ziemlich schnell die ersten Erfolge und positive Überraschungen, wie einfach sich Rest-Sensoren über Home Assistant einrichten und abfragen lassen.

Homeassistant fragt nun über JSON die Messwerte vom ESP8266 ab.

Aber fangen wir erst mal von vorne an, mit der NodeMCU V3 (ESP8266) und dem Setup und dem Code.

ESP8266 mit zwei DHT22 Sensoren und JSON betreiben

Node MCU V3 (ESP8266)DHT22 Sensor 1DHT22 Sensor 1
Stromlinker Pin
D4zweiter Pin von links
GND
Stromlinker Pin
D7zweiter Pin von links
GNDrechter Pin


/* funktioniert mit Lolin NodeMCU V3 (Az Delivery)
NodeMCU 1.0 (ESP-12 E)
Baudrate 115200, 9600 OK

http://nodemcu1.fritz.box/status
{"hostname":"nodemcu1","temp1":"22.50","humi1":"56.40","gtempt1":"22.28","temp2":"22.50","humi2":"56.40","gtempt2":"22.28"}
*/
#include <ESP8266WiFi.h>
#include "DHT.h"
#include <SoftwareSerial.h>
#include <Arduino_JSON.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#define DHT1_PIN 2 // D4 auf Lolin NodeMCU == 2 (GPIO 2)
#define DHT2_PIN 13 // D7 auf Lolin NodeMCU == 13 (GPIO 13)
#define DHT_TYPE DHT22 

DHT dht1(DHT1_PIN, DHT_TYPE);
DHT dht2(DHT2_PIN, DHT_TYPE);

const char* ssid     = "xxx";
const char* password = "XXXXXXXXXXXXXXXXX";
const char* hostname = "nodemcu1";

ESP8266WebServer server(80);

void handleRoot() {

  server.send(200, "text/plain", "hello from esp8266!\r\n");

}

void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; }
  server.send(404, "text/plain", message);
}

void setup() {

  Serial.begin(9600);
  Serial.setDebugOutput(false);
  Serial.println(F("DHT22 test!"));

  pinMode(DHT1_PIN, INPUT);
  pinMode(DHT2_PIN, INPUT);
  dht1.begin();
  dht2.begin();

  WiFi.setHostname(hostname);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println(F("ESP is ready"));

  Serial.println(WiFi.status());

  server.on("/", handleRoot);

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

    ////////////////
      float h1 = dht1.readHumidity();
      float t1 = dht1.readTemperature();
      float g1_temp = dht1.computeHeatIndex(t1, h1, false);// Gefühlte Temperatur wird errechnet aus temperature und humidity

      float h2 = dht1.readHumidity();
      float t2 = dht1.readTemperature();
      float g2_temp = dht1.computeHeatIndex(t2, h2, false);// Gefühlte Temperatur wird errechnet aus temperature und humidity

      if (isnan(h1) || isnan(t1)) {
        Serial.println(F("Failed to read from DHT sensor!"));
        delay(5000);
        return;
      }

      if (isnan(h2) || isnan(t2)) {
        Serial.println(F("Failed to read from DHT sensor!"));
        delay(5000);
        
      }

      //Serial.println("Temperatur (1): " + String(t1) +"C / Luftfeuchtigkeit: " + String(h1) +"% / gefuehlte Temp.:" + String(g1_temp) +"C ");

      //Serial.println("Temperatur (2): " + String(t2) +"C / Luftfeuchtigkeit: " + String(h2) +"% / gefuehlte Temp.:" + String(g2_temp) +"C ");

      JSONVar myArray;
      
      myArray["hostname"] = hostname;
      myArray["temp1"] = String(t1);
      myArray["humi1"]= String(h1);
      myArray["gtempt1"] = String(g1_temp);

      myArray["temp2"] = String(t2);
      myArray["humi2"]= String(h2);
      myArray["gtempt2"] = String(g2_temp);
      String jsonString = JSON.stringify(myArray);

      Serial.println(jsonString);

      //ESP.deepSleep(10 * 10 * 1000000); 

    ////////////////
    server.send(200, "text/plain", jsonString);
  });
  
 server.begin();
  Serial.println("HTTP server started");

}

void loop() {

   server.handleClient();

}

Fotos vom Testaufbau

Einrichtung einer Restful Sensors in Home Assistant

Auf meiner Homeassistant Instanz habe ich mich per SSH verbunden und die configuration.yaml wie folgt erweitert. Die Zeilen sollten selbsterklärend sein.

sensor:
  - platform: rest
    resource: http://nodemcu1.fritz.box/status
    name: Schildi Temperatur 1
    unique_id: schildi_t1
    value_template: "{{ value_json.temp1 }}"
    unit_of_measurement: "°C"
  - platform: rest
    resource: http://nodemcu1.fritz.box/status
    name: Schildi Temperatur 2
    unique_id: schildi_t2
    value_template: "{{ value_json.temp2 }}"
    unit_of_measurement: "°C"
  - platform: rest
    resource: http://nodemcu1.fritz.box/status
    name: Schildi Luftfeuchtigkeit 1
    unique_id: schildi_f1
    value_template: "{{ value_json.humi1 }}"
    unit_of_measurement: "%"
  - platform: rest
    resource: http://nodemcu1.fritz.box/status
    name: Schildi Luftfeuchtigkeit 2
    unique_id: schildi_f2
    value_template: "{{ value_json.humi2 }}"
    unit_of_measurement: "%"
  - platform: rest
    resource: http://nodemcu1.fritz.box/status
    name: Schildi Temperatur gefuehlt 1
    unique_id: schildi_tg1
    value_template: "{{ value_json.humi1 }}"
    unit_of_measurement: "%"
  - platform: rest
    resource: http://nodemcu1.fritz.box/status
    name: Schildi Temperatur gefuehlt 2
    unique_id: schildi_tg2
    value_template: "{{ value_json.humi2 }}"
    unit_of_measurement: "%"

Nach dem die Configuration.yaml erweitert und gespeichert wurde, muss die Konfiguration in Home Assistant neu eingelesen werden.

Dokumentation: https://www.home-assistant.io/integrations/sensor.rest

Dashboard

Anschließend kann können die neue Sensoren in das Dashboard eingebaut werden

Und der Stromverbrauch?

Wenn mir nun der Stromverbrauch egal wäre, dann wäre ich nun fertig. Ich wollte eine autarke Lösung die durch drei LR6 Batterien mit Strom versorgt wird.

In dem jetztigen Setup stellte sich schnell raus, dass die Batterien innerhalb von 3-5 Stunden komplett leer waren.

Also ging es nun weiter die Lösung weiterzuentwickeln, hin zu Deepsleep, Aufwachen, Daten an Homeassistent über MQTT senden und dann wieder Deepsleep von 15 Minuten.

weitere Beiträge zu NodeMCU, ESP8266, Arduino und Co.