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 1 | DHT22 Sensor 1 |
Strom | linker Pin | |
D4 | zweiter Pin von links | |
GND | ||
Strom | linker Pin | |
D7 | zweiter Pin von links | |
GND | rechter 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.