[gelöst]Daten vom ESP8266/1 und DHT11 an FHEM übergeben

Begonnen von Larusso, 20 Dezember 2017, 17:53:51

Vorheriges Thema - Nächstes Thema

Larusso

Hallo Community,

ich versuche gerade meinen DHT11 der an einem ESP8266/1 hängt über FHEM aus zulesen und bräuchte eure Hilfe. Ich habe einen Webserver auf dem ESP8266 laufen und bekomme über die IP 192.168.178.60:80 im Webbrowser die Ausgabe der Temperatur (ja....da steht noch Farenheit, das muss ich noch ändern ::) ) und der Luftfeuchtigkeit, soweit so gut. Nun wollte ich über HTTPMOD in FHEM die Messwerte in FHEM anzeigen lassen. bekomme aber folgenden Fhelerlog:

2017.12.20 17:34:59 3: TestArduino: Read response to update didn't match any Reading
2017.12.20 17:35:09 3: TestArduino: Read response to update didn't match any Reading
2017.12.20 17:35:19 3: TestArduino: Read response to update didn't match any Reading
2017.12.20 17:35:29 3: TestArduino: Read response to update didn't match any Reading
2017.12.20 17:35:41 3: TestArduino: Read callback: Error: read from http://192.168.178.60:80 timed out
2017.12.20 17:35:49 3: TestArduino: Read response to update didn't match any Reading
2017.12.20 17:35:59 3: TestArduino: Read response to update didn't match any Reading
2017.12.20 17:36:09 3: TestArduino: Read response to update didn't match any Reading


mein Sketch auf dem ESP8266, den ich im Web gefunden habe sieht folgendermaßen aus:

// SimpleDHT als Library einbinden
// Ggfs. vorher von der URL holen
// http://arduino.esp8266.com/stable/package_esp8266com_index.json
// DHT11
//GND-GND
//VCC - 3.3 V
//Data - Pin/GPIO 2 - D4

#include <SimpleDHT.h>

// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>

// Replace with your network details
const char* ssid = "";
const char* password = "";

// Web Server on port 80
WiFiServer server(80);

// DHT Sensor
int pinDHT11 = 2;
// Initialize DHT sensor.
SimpleDHT11 dht11;

// Temporary variables
static char celsiusTemp[7];
static char fahrenheitTemp[7];
static char humidityTemp[7];

// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);
 
  // Connecting to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Starting the web server
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP...");
  delay(10000);
 
  // Printing the ESP IP address
  Serial.println(WiFi.localIP());
}

// runs over and over again
void loop()
{
  // Listenning for new clients
  WiFiClient client = server.available();
    // read without samples.
  byte temperature = 0;
  byte humidity = 0;
    if (client)
  {
    if (dht11.read(pinDHT11, &temperature, &humidity, NULL))
    {
      Serial.print("Read DHT11 failed.");
      return;
    }
    String remote_ip = client.remoteIP().toString(); // IP Adresse des Client
     
    Serial.println("Neuer Zugriff von : " + remote_ip);
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
                if (c == '\n' && blank_line)
        {
          // Computes temperature values in Celsius + Fahrenheit and Humidity
          // You can delete the following Serial.print's, it's just for debugging purposes
          Serial.print((int)temperature); Serial.print(" *C, ");
          Serial.print((int)humidity); Serial.println(" %");
        }
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println("Connection: close");
        client.println();
        // your actual web page that displays temperature and humidity
        client.println("<!DOCTYPE HTML>");
        client.println("<html>");
        client.println("<head></head><body><h1>ESP8266 - Temperature and Humidity</h1><h3>Temperature in Celsius: ");
        client.println((int)temperature);
        client.println("*F</h3><h3>Humidity: ");
        client.println((int)humidity);
        client.println("%</h3><h3>");
        client.println("<hr>" + remote_ip + "<br>");
        client.println("</body></html>");     
        break;
       
        if (c == '\n')
        {
          // when starts reading a new line
          blank_line = true;
        }
        else if (c != '\r')
        {
          // when finds a character on the current line
          blank_line = false;
        }
      }
    } 
    // closing the client connection
    delay(1);
    client.stop();
    Serial.println("Client disconnected.");
     
  }   
  }


Aus dem Forum hier wollte ich das ganze mal mit HTTPMOD versuchen
define TestArduino HTTPMOD http://192.168.178.60/ 10
attr TestArduino userattr reading01Name reading01Regex reading02Name reading02Regex
attr TestArduino reading01Name Temperature
attr TestArduino reading01Regex Temperature:.([\d\.]+)
attr TestArduino reading02Name Humidity
attr TestArduino reading02Regex Humidity:.([\d\.]+)
attr TestArduino stateFormat T: Temperature H: Humidity



Bitte um eure Unterstützung vielleicht hat jemand mal wider nen Codeschnipsel der zu meinem Problem passt. Mein Ziel ist es die Daten aus FHEM über Intervall vom Server zu holen, ein Log anlegen und das ganze in einen Plot zu geben um die Luftfeuchtigkeit und Temperatur in meinem Keller zu überwachen. Wenn die Hürde genommen ist soll ein notify bei überschreiten einer bestimmten Luftfeuchtigkeit mir eine Info über Telegram schicken.
nanoCul434MHz, nanoCul868MHz, HueBridge, shellyRolladenaktoren, Nuki, Homematic, RPI3, Homebridge, Sonoffbridge, Xiaomi Saugrobotter,

andies

Lösche erstmal dein Passwort aus dem Code da oben .



Gesendet vom iPhone mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

#2
Zitat von: Larusso am 20 Dezember 2017, 17:53:51
2017.12.20 17:34:59 3: TestArduino: Read response to update didn't match any Reading
2017.12.20 17:35:09 3: TestArduino: Read response to update didn't match any Reading

Das zeigt, dass die Daten auf dem Webserver des ESP8266 nicht zu dem passen, was Du laut FHEM erwartest. An der Stelle musst Du zuerst die Adresse in einem beliebigen Browser aufrufen um zu schauen, was eigentlich los ist. Nur so kannst Du den Fehler lokalisieren.

Nun zum Code selber. Du nimmst

#include <SimpleDHT.h>

aber da gibt es ein Problem mit dem timing. Das ist hier beschrieben: https://github.com/adafruit/DHT-sensor-library/issues/48 Ich habe von adafruit den Code genommen und ihn angepasst. Mir fällt auch auf, dass Du eine sehr umfangreiche Seite erzeugt, aber nur Feuchtigkeit und Temperatur willst. Ich zeige Dir mal, wie ich das gemacht habe (und dann können wir auch die Anpassung besprechen, wenn das überhaupt was ist). Also bei mir sieht der arduino-Code so aus:

/*
  Dieser ESP misst die Temperaturen und sendet sie an den Webserver.
*/

#include <DHT.h>    //adafruit library, https://learn.adafruit.com/dht/downloads
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

#define DHTPIN  3// ICH HABE DAS AM pin #3 (Rx), bei Dir anders, oder? (Wegen des Spannungsteilers konnte ich _weder_ GPIO 0 _noch_ GPIO 2 verwenden)
#define DHTTYPE DHT22 //ACHTUNG, ich habe DTH22, Du hattest DTH11 - oder?

DHT dht(DHTPIN, DHTTYPE);

unsigned long previousData = 0; // will store when last data were sent
float humidity, temp;  // Values read from sensor
String webString = String(140);   // dieser string wird gesendet
byte data[40] = {0}; //Daten vom DHT22
const char *ssid = "meineSSID";
const char *password = "meinPasswd";

ESP8266WebServer server ( 80 );

void setup() {
  WiFi.begin ( ssid, password );
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
  }
  WiFi.mode(WIFI_STA);
  server.on ( "/", handleRoot);
  server.onNotFound ( handleNotFound );
  server.begin();

  pinMode(DHTPIN, INPUT_PULLUP);
  dht.begin();
  previousData = millis();
}


void handleNotFound() { //in case we opened the wrong page
  server.send ( 404, "text/plain", "Not found, reacts only on root / showing temperature and the like");
}


void handleRoot() {
  server.send(200, "text/plain", webString);
}


void loop() {
  unsigned long currentData = millis();

    // Wait at least 2000 milliseconds seconds between measurements.
    // Reading temperature or humidity takes about 250 milliseconds!
  if (currentData - previousData > 40000 ) { //jede vierzig Sekunden (40.000 ms) Daten holen
    temp = dht.readTemperature();     // Read temperature as Celsius
    humidity = dht.readHumidity();          // Read humidity (percent)
    if (isnan(humidity) || isnan(temp)) {
      webString = "Failed to read from DHT sensor";
    } else {
      webString =  "Temperature: " + String(temp, 1) + "C Humidity " + String(humidity, 1) + "%";
    }

    previousData = millis();
  }

  server.handleClient();

  delay(5);
}


Bei mir erscheint dann beim Aufruf der Webseite folgendes
Temperature: 15.1C Humidity 47.5%
und das lässt sich wie folgt herauslesen (ACHTUNG, andere IP als bei Dir!)

defmod DEINNAME HTTPMOD http://192.168.2.21/ 900
attr DEINNAME userattr reading01Name reading01Regex reading02Name reading02Regex
attr DEINNAME group _Hydr_Abgleich
attr DEINNAME reading01Name Temperatur
attr DEINNAME reading01Regex Temperature: ([\.\d]*)C
attr DEINNAME reading02Name Humidity
attr DEINNAME reading02Regex Humidity ([\.\d]*)%
attr DEINNAME stateFormat {ReadingsVal($name, "myTemperatur", 0)."°C / ".ReadingsVal($name, "Humidity", 0)."%"}
attr DEINNAME timeout 15
attr DEINNAME userReadings myTemperatur {ReadingsVal($name, "Temperatur",0)-2.4;;;;}

Die 2,4 sind meine Anpassung, weil meine Temperatur konstruktionsbedingt um diesen Wert zu hoch angezeigt wird. Musst Du also auch evtl anpassen.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Larusso

Danke für die schnelle Antwort, ich werde den von dir zur Verfügung gestellten Sketch morgen mal aufspielen und das ganze testen. Sobald ich das gemacht habe gibt es ein reply  ;D
nanoCul434MHz, nanoCul868MHz, HueBridge, shellyRolladenaktoren, Nuki, Homematic, RPI3, Homebridge, Sonoffbridge, Xiaomi Saugrobotter,

Larusso

#4
Hallo andies,

ich habe mir den sketch mit der Library von adafruit (DHT.h) runtergeladen und mal auf den 8266 hochgeladen, aber ich bekomme meinen ESP8266 nicht gebootet. Mit dem alten Sketch ging das ohne Probleme. Hast du eine Idee was bei diesem Sketch für den Bootvorgang  anders sein könnte?. Ich boote den ESP8266 wie folgt:

CH-PD auf High 
VCC - 5V (lt.Hersteller verträgt der 5V)
Ground auf Ground

DHT11
GPIO 2 an den DHT11 Data
Ground auf Ground
VCC auf VCC 5V

das ganze ist auf einem Breadboard und wird mit 5V von USB versorgt (Netzstecker mit USB Anschluss), Ich bekomme den ESP8266 aber auch nicht vom Arduino aus gebootet, also wenn ich die Spannungsversorgung über den Nano am PC anschliese.
nanoCul434MHz, nanoCul868MHz, HueBridge, shellyRolladenaktoren, Nuki, Homematic, RPI3, Homebridge, Sonoffbridge, Xiaomi Saugrobotter,

andies

Du hast die Angaben in meinem Sketch angepasst (DHT11 statt 22, GPIO)? Was ist, wenn Du den Sensor trennst, bootet er dann?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Larusso

Hallo andiess,

ich habe den Sensor Typ geändert in DHT11, der ESP8266 bootet weder mit DHT11 noch ohne. Teilweise flackerte die blaue LED teilweise nicht.
nanoCul434MHz, nanoCul868MHz, HueBridge, shellyRolladenaktoren, Nuki, Homematic, RPI3, Homebridge, Sonoffbridge, Xiaomi Saugrobotter,

andies

Dann ist der sketch nicht (richtig) auf dem ESP. Sonst müsste der wenigstens "keine Verbindung zum Sensor" senden.

Mit dem alten Sketch geht das? Dann muss es an dem Code liegen oder am Flashen. Was erscheint im Log beim flashen?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Larusso

Upload abgeschlossen 100%. So wie das sein soll. Das funktioniert auch alles ohne Fehler aber er initialisiert nichts.
nanoCul434MHz, nanoCul868MHz, HueBridge, shellyRolladenaktoren, Nuki, Homematic, RPI3, Homebridge, Sonoffbridge, Xiaomi Saugrobotter,

andies

Was passiert, wenn Du ihn an 5V legst und die entsprechende IP aufrufst? Und was passiert, wenn Du SimpleDHT insallierst? Poste mal, was im Browser erscheint.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Larusso

Hallo andies,

habe die Woche nicht so viel zeit, wenn ich es schaffe poste ich direkt die Info.
nanoCul434MHz, nanoCul868MHz, HueBridge, shellyRolladenaktoren, Nuki, Homematic, RPI3, Homebridge, Sonoffbridge, Xiaomi Saugrobotter,

Amenophis86

Ich denke wir bewegen uns langsam von einer Anfänger Frage weg, daher bitte ich zu prüfen, ob der Thread nicht langsam im ESP Board besser aufgehoben wäre.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

andies

Einer meiner ersten Beiträge handelte davon, wie viel man eigentlich wissen muss, um bei den Anfängerfragen überhaupt mitlesen zu können  ;)
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Also wenn wir schon mal so weit sind, kann ich gleich meine Gerber-Dateien hier hochladen. Ich habe da eine sehr schnell zusammengebastelte Konstruktion gewählt, bei der ich die Stromversorgung mit USB sicherstelle und der ESP mit 3.3V betrieben wird. Die Spannung wird durch einen LF33CV sicher gestellt, hier die Bestellliste mit USB-Steckern
Zitat1185795   IC REG LDO 3.3V 0.5A LF33CV TO-220-3 STM
774866   USB STECKER TYP A 90° PRINTMONTAGE   
Die Platine sieht dann so wie im Anhang aus.

Parallel zu 3.3V liegt ein 10muF Kondensator. Links oben ist der LF33CV, rechts unten der ESP01. Links der USB, rechts oben der DHT22.

Bestellt habe ich bei allpcb.com, zehn Stück zu 5€ inklusive Versand. Die Dinge sind in weniger als einer Woche da.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

#14
allpcb ist verrückt, die liefern stabil aus China innerhalb von drei, vier Tagen. Und das vor Weihnachten. Ich habe vier Platinen übrig (wieso liefern die 14, wenn ich zehn bestelle?!), die kann ich verschenken gegen Portoersatz.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

#15
Dafür sind die Chips (ESP8266) aus China wohl eher zum essen gedacht. Im Ernst: Ich kann sie nicht flashen und kriege dubiose Fehlermeldungen ("A fatal error occurred: Timed out waiting for packet header" und dergleichen). Angeblich liegt es an der Stromversorgung, aber ich messe stabile 3,38V beim hochladen. Dann ist mir aufgefallen, dass der Speicherchip auf dem ESP8266-01 ein anderer ist, vermutlich liegt da der Fehler. Man kann den sketch nur unkomprimiert hochladen, das klappt, aber dann funktioniert er nicht wie programmiert.

Es ist ein Kreuz mit diesen Aliexpress-Sachen - mal super billig, mal super Schrott. Ich wollte meine USB-Temperatur-Messgeräte über Weihnachten fertig machen und kann mir das nun schenken.

<edit> Jetzt habe ich es hinbekommen, es war mein letzter Versuch (zweiter Tag): Man muss mit Linux und nicht Mac oder Win flashen und das unkomprimiert (write_flash -u), dann klappt es. Verkabelung war immer dieselbe.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

#16
Ich habe anscheinend den Thread gekapert...

Jedenfalls geht es weiter, jetzt werden die Dinger kalibriert. Derzeit habe ich Messungenauigkeiten von ca 2 Grad Celsius.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Peter 72336

Hallo Larusso
Ich benutze auch den ESP8266 um die Temperatur auf meinem fhem zu Loggen und Übertrage die Daten über HTTPMOD funktioniert alles super.
Bin aber jetzt auf eine andere und bessere Lösung gestoßen an der ich gerade arbeite
Meine neue Übertragung ist MQTT
Mit MQTT werden die Daten bei jeder Änderung in 2sec in fhem angezeigt
Es gibt ein super Video Anleitung unter

https://haus-automatisierung.com/hardware/fhem/2017/02/13/fhem-tutorial-reihe-part-26-esp8266-arduino-mqtt-temperatur-an-fhem.html

Larusso

Hallo Peter,

MQTT habe ich mir auch schon überlegt, denke das eine Datenbank die bessere Lösung ist als ein Logfile in Txt Format, besonders bei der Auswertung und Darstellung. Habe jetzt endlich EasyESP auf meinem DHT11 drauf und darüber auch die Daten super an FHEM übergeben könne, nun funktioniert auch die Darstellung und das loggen, danke an alle die hier unterstützt haben  ;)
nanoCul434MHz, nanoCul868MHz, HueBridge, shellyRolladenaktoren, Nuki, Homematic, RPI3, Homebridge, Sonoffbridge, Xiaomi Saugrobotter,