Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Hardware
    4. [gelöst] WemoD1 + DHT22 +simpleAPI Adapter

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] WemoD1 + DHT22 +simpleAPI Adapter

    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      booehmemaik last edited by

      Hallo,

      nach dem ich aus dem Thema http://forum.iobroker.net/viewtopic.php?f=34&t=3226 und aus dem https://homematic-forum.de/forum/viewto … start=2200

      meine Einbindung des WemoD1+DHT22 in iobroker erfolgreich geschaft habe, habe ich jedoch immer noch ein Problem mit der Zeit der Meldung der Luftfeuchtigkeit und Temperatur an den IoBroker. Derzeitig werden alle 5s die Daten auch ohne Änderung an den iobroker geschickt.

      ! 000:44:55 Luftfeuchtigkeitsaenderung: Werte an iOBroker gemeldet
      ! 000:45:00 Temperatursaenderung: Werte an iOBroker gemeldet
      ! 000:45:05 Luftfeuchtigkeitsaenderung: Werte an iOBroker gemeldet
      ! 000:45:10 Temperatursaenderung: Werte an iOBroker gemeldet
      ! 000:45:15 Luftfeuchtigkeitsaenderung: Werte an iOBroker gemeldet
      ! 000:45:20 Temperatursaenderung: Werte an iOBroker gemeldet
      ! 000:45:26 Luftfeuchtigkeitsaenderung: Werte an iOBroker gemeldet
      ! 000:45:31 Temperatursaenderung:

      Ich würde jedoch gerne die Zeitanpassen können bzw nur bei Änderung die Daten schicken lassen wollen.

      Für die CCU ist der Code implementiert (nutze ich jedoch nicht) . Bei dem Code schnippsel für iobroker scheint das jedoch nicht der fall zu sein.

      Hat jemand die Möglichkeit mal darüber zu schauen und mich in die richtige Richtung zu schupsen ?

      ! /*
      ! * WeMos Temperatur-/Luftfeuchtesensor (Prototyp)
      ! *
      ! * verbindet sich mit dem vorhandenen WLAN als Server
      ! * und bei Bedarf mit der CCU als Client
      ! *
      ! * Steuerung über HTTP-Befehle:
      ! * "<ip-adresse>" gibt eine Status- und Befehlsübersicht aus
      ! * "<ip-adresse>/temp" gibt die zuletzt gemessene Temperatur aus (Grad Celsius)
      ! * "<ip-adresse>/feucht" gibt die zuletzt gemessene Luftfeuchtigkeit aus (in Prozent)
      ! * "<ip-adresse>/zeit" gibt den CCU-Zeitstempel aus, an dem die letzte Meldung an die CCU erfolgte
      ! * "<ip-adresse>/temp?delta=<wert>" setzt den Temperatur-Differenzwert, der eine CCU-Meldung ausloest
      ! * "<ip-adresse>/temp?korr=<wert>" setzt den Korrekturwert fuer die Temperaturmessung
      ! * "<ip-adresse>/feucht?delta=<wert>" setzt den Feuchtigkeits-Differenzwert, der eine CCU-Meldung ausloest
      ! * "<ip-adresse>/feucht?korr=<wert>" setzt den Korrekturwert fuer die Feuchtigkeitsmessung
      ! * "<ip-adresse>/zeit?delta=<wert>" setzt die Zeitspanne (in Sekunden), nach der spaetestens eine CCU-Meldung erfolgt
      ! * "<ip-adresse>/zeit?mess=<wert>" definiert das Messintervall (in Sekunden)
      ! *
      ! * Getesteter Aufbau:
      ! * WeMos D1 mini
      ! * DHT Shield mini
      ! * Pin-Belegung:
      ! * D4: Datenleitung DHT-Sensor
      ! *
      ! * DHT sensor library by Adafruit v.1.2.3
      ! *
      ! * 9.Februar 2016 —m.yoda
      ! /
      ! #include <esp8266wifi.h>#include <wificlient.h>#include <esp8266webserver.h>#include "DHT.h"
      ! // ******* Netzwerkeinstellungen, bitte anpassen! *******
      ! const char
      ssid = "xxxxxxxx"; // SSID des vorhandenen WLANs
      ! const char* password = "xxxxxxx"; // Passwort für das vorhandene WLAN
      ! //IPAddress gateway(xxx,xxx,xxx,xxx); // IP-Adresse des WLAN-Gateways
      ! //IPAddress subnet(255,255,255,0); // Subnetzmaske
      ! //IPAddress ip(xxx,xxx,xxx,xxx); // feste IP-Adresse für den WeMos
      ! const char* host = "xxx.xxx.xxx.xxx"; // IP-Adresse der CCU (mit Punkten!)
      ! ESP8266WebServer server(80); // Webserver initialisieren auf Port 80
      ! // ******* Sensoreinstellungen, bitte anpassen! *******
      ! DHT dht(D4, DHT22); // verwendeter Datenpin des Sensors, bei WeMos mini Shields = D4
      ! // verwendeter Sensortyp, unterstützt werden DHT11 DHT21 DHT22
      ! // WeMos mini DHT Shield = DHT11
      ! // WeMos mini DHT Pro Shield = DHT22
      ! unsigned long deltaMessungSekunden = 360; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
      ! float korrTemp = -2; // Korrekturwert fuer die Temperaturmessung
      ! float korrFeucht = 0; // Korrekturwert fuer die Feuchtigkeitsmessung
      ! // ******* Einstellungen fuer Meldungen an die CCU, bitte anpassen! *******
      ! String tempCCUname = "temp"; // Bezeichnung der CCU-Systemvariable für die gemessene Temperatur
      ! String feuchtCCUname = "feucht"; // Bezeichnung der CCU-Systemvariable für die gemessene Luftfeuchtigkeit
      ! unsigned long deltaMeldungSekunden = 3600; // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
      ! float deltaTemp = 1; // Temperaturaenderung (C) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
      ! float deltaFeucht = 5; // Luftfeuchteaenderung (%) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
      ! float feucht = 0, feuchtCCU = 0, temp = 0, tempCCU = 0;
      ! unsigned long jetztMillis = 0;
      ! unsigned long deltaMessungMillis = deltaMessungSekunden * 1000, letzteMessungMillis = 0;
      ! unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000, letzteMeldungMillis = 0;
      ! String antwort = "", meldung = "",letzteMeldungCCUzeit = "";
      ! // ******* Einstellungen fuer ioBroker, bitte anpassen! *******
      ! String apiDeviceName = "Wemos"; // Bezeichnung des ioBroker.SimpleApi Devise
      ! String tempIOBname = "Wemos_Temp"; // Bezeichnung der ioBroker Variable für die gemessene Temperatur
      ! String feuchtIOBname = "Wemos_Hum"; // Bezeichnung der ioBroker Variable für die gemessene Luftfeuchtigkeit
      ! const char
      hostIOBroker = "xxxxxxxxxx"; // IP-Adresse des ioBroker
      ! const int httpPortBroker = 8087; //eingetragener Port des simpleApi Adapters
      ! String zeitstempel() { // Betriebszeit als Stunde:Minute:Sekunde
      ! char stempel[10];
      ! int lfdStunden = millis()/3600000;
      ! int lfdMinuten = millis()/60000-lfdStunden60;
      ! int lfdSekunden = millis()/1000-lfdStunden
      3600-lfdMinuten*60;
      ! sprintf (stempel,"%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
      ! return stempel;
      ! }
      ! void messung() { // Sensor abfragen
      ! feucht = dht.readHumidity() + korrFeucht;
      ! temp = dht.readTemperature() + korrTemp;
      ! if (isnan(feucht) || isnan(temp)) {
      ! Serial.println(zeitstempel() + " Fehler: Sensor konnte nicht abgefragt werden");
      ! delay(100);
      ! return;
      ! }
      ! letzteMessungMillis = jetztMillis;
      ! Serial.println(zeitstempel() + " Messung Luftfeuchtigkeit: " + feucht + " % Temperatur: " + temp + " * C");
      ! }
      ! void melde_ioBroker() { // Werte an ioBroker melden
      ! WiFiClient client;
      ! if (!client.connect(hostIOBroker, httpPortBroker)) {
      ! return;
      ! }
      ! //String url = "/set/system.adapter.simple-api.0.'" + String(tempIOBname) + "'?value='" + String(temp) + "'&prettyPrint";
      ! String url = "/setBulk?system.adapter.simple-api.0." + apiDeviceName + "." + tempIOBname + "=" + String(temp) + "&system.adapter.simple-api.0." +
      ! apiDeviceName + "." + feuchtIOBname + "=" + String(feucht) + "&prettyPrint";
      ! // Serial.print("Requesting URL: ");
      ! // Serial.println(url);
      ! // This will send the request to the server
      ! client.print(String("GET ") + url + " HTTP/1.1\r\n" +
      ! "Host: " + host + "\r\n" +
      ! "Connection: close\r\n\r\n");
      ! delay(100);
      ! // Read all the lines of the reply from server and print them to Serial
      ! while (client.available()) {
      ! String line = client.readStringUntil('\r');
      ! }
      ! Serial.println("Werte an iOBroker gemeldet");
      ! }
      ! void melde_CCU() { // Werte an die CCU melden
      ! WiFiClient client;
      ! const int httpPort = 80;
      ! if (!client.connect(host, httpPort)) {
      ! return;
      ! }
      ! String url = "/xy.exe?antwort1=dom.GetObject('" + feuchtCCUname + "').State('" + feucht + "')"
      ! "&antwort2=dom.GetObject('" + tempCCUname + "').State('" + temp + "')";
      ! // Serial.print("Requesting URL: ");
      ! // Serial.println(url);
      ! // This will send the request to the server
      ! client.print(String("GET ") + url + " HTTP/1.1\r\n" +
      ! "Host: " + host + "\r\n" +
      ! "Connection: close\r\n\r\n");
      ! delay(100);
      ! // Read all the lines of the reply from server and print them to Serial
      ! while (client.available()) {
      ! String line = client.readStringUntil('\r');
      ! }
      ! Serial.println("Werte an CCU gemeldet, " + letzteMeldungCCUzeit);
      ! letzteMeldungMillis = jetztMillis; // gemeldete Daten merken
      ! feuchtCCU = feucht;
      ! tempCCU = temp;
      ! }
      ! void wurzel_behandlung() { // bei Aufruf des Root-Verzeichnisses
      ! String betriebszeit = zeitstempel();
      ! antwort = "WeMos Temperatur-/Luftfeuchtesensor\n";
      ! antwort = antwort + "\tBetriebszeit: " + betriebszeit + " (Std:Min:Sek)\n";
      ! antwort = antwort + "\tVerbunden mit: " + ssid + "\n";
      ! int rssi = WiFi.RSSI();
      ! antwort = antwort + "\tSignalstaerke: " + String(rssi) + " dBm\n\n";
      ! antwort = antwort + "Letzte Messwerte\n\tTemperatur: " + String(temp) + " * C\n";
      ! antwort = antwort + "\tLuftfeuchtigkeit: " + String(feucht) + " %\n\n";
      ! antwort = antwort + "Korrekturwerte\n\tTemperatur: " + String(korrTemp) + " * C\n";
      ! antwort = antwort + "\tLuftfeuchtigkeit: " + String(korrFeucht) + " %\n\n";
      ! antwort = antwort + "Letzte Datenuebertragung CCU\n\t" + letzteMeldungCCUzeit;
      ! antwort = antwort + "\tGemeldete Temperatur: " + String(tempCCU) + " * C\n";
      ! antwort = antwort + "\tGemeldete Luftfeuchtigkeit: " + String(feuchtCCU) + " %\n\n";
      ! antwort = antwort + "Ausloeser fuer Datenuebertragung CCU\n";
      ! antwort = antwort + "\tZeitintervall: " + String(deltaMeldungSekunden) + " Sekunden\n";
      ! antwort = antwort + "\tTemperaturdifferenzwert: " + String(deltaTemp) + " * C\n";
      ! antwort = antwort + "\tFeuchtigkeitsdifferenzwert: " + String(deltaFeucht) + " %\n\n";
      ! antwort = antwort + "HTTP-Befehlsuebersicht:\n";
      ! antwort = antwort + ""<ip-adresse>/temp"\n\tgibt die zuletzt gemessene Temperatur aus (Grad Celsius)\n";
      ! antwort = antwort + ""<ip-adresse>/feucht"\n\tgibt die zuletzt gemessene Luftfeuchtigkeit aus (in Prozent)\n";
      ! antwort = antwort + ""<ip-adresse>/zeit"\n\tgibt den CCU-Zeitstempel aus, an dem die letzte Meldung an die CCU erfolgte\n";
      ! antwort = antwort + ""<ip-adresse>/temp?delta=<wert>"\n\tsetzt den Temperatur-Differenzwert, der eine CCU-Meldung ausloest\n";
      ! antwort = antwort + ""<ip-adresse>/temp?korr=<wert>"\n\tsetzt den Korrekturwert fuer die Temperaturmessung\n";
      ! antwort = antwort + ""<ip-adresse>/feucht?delta=<wert>"\n\tsetzt den Feuchtigkeits-Differenzwert, der eine CCU-Meldung ausloest\n";
      ! antwort = antwort + ""<ip-adresse>/feucht?korr=<wert>"\n\tsetzt den Korrekturwert fuer die Feuchtigkeitsmessung\n";
      ! antwort = antwort + ""<ip-adresse>/zeit?delta= <wert "\n\tsetzt/die/zeitspanne/(in/sekunden),/nach/der/spaetestens/eine/ccu-meldung/erfolgt\n";<br="">antwort = antwort + ""<ip-adresse>/zeit?mess=<wert>"\n\tdefiniert das Messintervall (in Sekunden)\n";
      ! server.send(300, "text/plain", antwort);
      ! delay(150);
      ! Serial.println(zeitstempel() + " unspezifische HTTP-Anfrage");
      ! }
      ! void melde_feucht() { // bei Aufruf von "…/feucht"
      ! String delta = server.arg("delta");
      ! String korr = server.arg("korr");
      ! if (delta != "") {
      ! deltaFeucht = delta.toFloat();
      ! server.send(200, "text/plain", "Feuchtigkeitsdifferenzwert fuer CCU-Meldungen auf " + delta + " % gesetzt.");
      ! delay(100);
      ! Serial.println(zeitstempel() + " Feuchtigkeitsdifferenzwert ueber HTTP geaendert: " + delta + " %");
      ! }
      ! else if (korr != "") {
      ! korrFeucht = korr.toFloat() * 1000;
      ! server.send(200, "text/plain", "Korrekturwert fuer Feuchtigkeitsmessung auf " + korr + " % gesetzt.");
      ! delay(100);
      ! Serial.println(zeitstempel() + " Feuchtigkeitskorrekturwert ueber HTTP geaendert: " + korr + " %");
      ! }
      ! else {
      ! server.send(200, "text/plain", String(feucht));
      ! delay(100);
      ! Serial.println(zeitstempel() + " Luftfeuchtigkeit ueber HTTP gemeldet");
      ! }
      ! }
      ! void melde_temp() { // bei Aufruf von ".../temp"
      ! String delta = server.arg("delta");
      ! String korr = server.arg("korr");
      ! if (delta != "") {
      ! deltaTemp = delta.toFloat();
      ! server.send(200, "text/plain", "Temperaturdifferenzwert fuer CCU-Meldungen auf " + delta + " * C gesetzt.");
      ! delay(100);
      ! Serial.println(zeitstempel() + " Temperaturdifferenzwert ueber HTTP geaendert: " + delta + " * C");
      ! }
      ! else if (korr != "") {
      ! korrTemp = korr.toFloat() * 1000;
      ! server.send(200, "text/plain", "Korrekturwert fuer Temperaturmessung auf " + korr + " * C gesetzt.");
      ! delay(100);
      ! Serial.println(zeitstempel() + " Temperaturkorrekturwert ueber HTTP geaendert: " + korr + " Sekunden");
      ! }
      ! else {
      ! server.send(200, "text/plain", String(temp));
      ! delay(100);
      ! Serial.println(zeitstempel() + " Temperatur ueber HTTP gemeldet");
      ! }
      ! }
      ! void melde_zeit() { // bei Aufruf von ".../zeit"
      ! String delta = server.arg("delta");
      ! String mess = server.arg("mess");
      ! if (delta != "") {
      ! deltaMeldungSekunden = delta.toInt();
      ! deltaMeldungMillis = deltaMeldungSekunden * 1000;
      ! server.send(200, "text/plain", "Zeitintervall fuer CCU-Meldungen auf " + delta + " Sekunden gesetzt.");
      ! delay(100);
      ! Serial.println(zeitstempel() + " Zeitintervall fuer CCU-Meldungen ueber HTTP geaendert: " + delta + " Sekunden");
      ! }
      ! else if (mess != "") {
      ! deltaMessungMillis = mess.toInt() * 1000;
      ! server.send(200, "text/plain", "Zeitintervall fuer Sensorabfrage auf " + mess + " Sekunden gesetzt.");
      ! delay(100);
      ! Serial.println(zeitstempel() + " Zeitintervall fuer Sensorabfrage ueber HTTP geaendert: " + mess + " Sekunden");
      ! }
      ! else {
      ! server.send(200, "text/plain", "Letzte Aktualisierung der CCU\n" + letzteMeldungCCUzeit);
      ! delay(100);
      ! Serial.println(zeitstempel() + " Letzte Aktualisierung der CCU ueber HTTP Status gemeldet");
      ! }
      ! }
      ! void setup() {
      ! dht.begin(); // Sensor initialisieren
      ! // Seriellen Monitor für Kontrollausgaben öffnen
      ! Serial.begin(115200);
      ! Serial.println("");
      ! Serial.println("WeMos Temperatur-/Luftfeuchtesensor");
      ! // WLAN-Verbindung herstellen
      ! // WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
      ! WiFi.mode(WIFI_STA);
      ! WiFi.begin(ssid, password);
      ! Serial.print("Verbindungsaufbau");
      ! // Verbindungsaufbau abwarten
      ! while (WiFi.status() != WL_CONNECTED) {
      ! delay(500);
      ! Serial.print(".");
      ! }
      ! Serial.println(" erfolgreich!");
      ! Serial.println("");
      ! Serial.print("Verbunden mit: ");
      ! Serial.println(ssid);
      ! Serial.print("Signalstaerke: ");
      ! int rssi = WiFi.RSSI();
      ! Serial.print(rssi);
      ! Serial.println(" dBm");
      ! Serial.print("IP-Adresse: ");
      ! Serial.println(WiFi.localIP());
      ! Serial.println("");
      ! // HTTP-Anfragen bearbeiten
      ! server.on("/", wurzel_behandlung);
      ! server.on("/temp", melde_temp);
      ! server.on("/feucht", melde_feucht);
      ! server.on("/zeit", melde_zeit);
      ! // HTTP-Server starten
      ! server.begin();
      ! Serial.println(zeitstempel() + " HTTP-Server gestartet");
      ! // Startwerte fuer Zeittrigger
      ! letzteMessungMillis = millis();
      ! letzteMeldungMillis = millis();
      ! }
      ! void loop() {
      ! // auf HTTP-Anfragen warten
      ! server.handleClient();
      ! jetztMillis = millis();
      ! // neue Messung falls Zeitintervall erreicht
      ! if(jetztMillis - letzteMessungMillis > deltaMessungMillis) {
      ! messung();
      ! }
      ! // neue Meldung an die CCU falls Zeitintervall erreicht
      ! if(!deltaMeldungMillis == 0 && jetztMillis - letzteMeldungMillis > deltaMeldungMillis) {
      ! Serial.print(zeitstempel() + " Zeitintervall erreicht: ");
      ! melde_CCU();
      ! melde_ioBroker();
      ! }
      ! // neue Meldung an die CCU falls Luftfeuchtigkeitsaenderung den Schwellwert erreicht
      ! if(!deltaFeucht == 0 && abs(feucht - feuchtCCU) >= deltaFeucht) {
      ! Serial.print(zeitstempel() + " Luftfeuchtigkeitsaenderung: ");
      ! melde_CCU();
      ! melde_ioBroker();
      ! }
      ! // neue Meldung an die CCU falls Temperaturaenderung den Schwellwert erreicht
      ! if(!deltaTemp == 0 && abs(temp - tempCCU) >= deltaTemp) { // Neue Meldung wg. Temperaturaenderung?
      ! Serial.print(zeitstempel() + " Temperatursaenderung: ");
      ! melde_CCU();
      ! melde_ioBroker();
      ! }
      ! }</wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></ip-adresse></ip-adresse></ip-adresse></esp8266webserver.h></wificlient.h></esp8266wifi.h></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></ip-adresse></ip-adresse></ip-adresse></ip-adresse>

      Viele Grüße

      Maik

      1 Reply Last reply Reply Quote 0
      • T
        Transylvanier last edited by

        @booehmemaik:

        gelöst ` Hallo Maik,

        da bin in such gerade dran.

        Würdest Du bitte auch die Lösung posten. Danke

        1 Reply Last reply Reply Quote 0
        • B
          booehmemaik last edited by

          hi,

          was genau benötigst du?

          Ich hab jetzt meinen Sketch so das er auch in den Deepsleep geht unzwar zweimal…einmal nach jedem Connect und Messung und einmal wenn keine Verbindung zustande kommt, das ist Nachts bei mir der Fall wenn mein Wlan abgeschaltet wird:

          Achso, meine Laufen inzwischen auf Akkubetrieb mit BatterieShield. Nach folgender Vorgabe https://www.thingiverse.com/thing:2813140

          Hier der Sketch. Du musst nur noch im IoBrocker die Objekte definieren.

          3916_simpleapi_wemod1.jpg

          
          /*
              WeMos Temperatur-/Luftfeuchtesensor (Prototyp)
          
              verbindet sich mit dem vorhandenen WLAN als Server
              und bei Bedarf mit der CCU als Client 
          
              Steuerung über HTTP-Befehle:
                 "<ip-adresse>" gibt eine Status- und Befehlsübersicht aus
                 "<ip-adresse>/temp" gibt die zuletzt gemessene Temperatur aus (Grad Celsius)
                 "<ip-adresse>/feucht" gibt die zuletzt gemessene Luftfeuchtigkeit aus (in Prozent)
                 "<ip-adresse>/zeit" gibt den CCU-Zeitstempel aus, an dem die letzte Meldung an die CCU erfolgte
                 "<ip-adresse>/temp?delta=<wert>" setzt den Temperatur-Differenzwert, der eine CCU-Meldung ausloest
                 "<ip-adresse>/temp?korr=<wert>" setzt den Korrekturwert fuer die Temperaturmessung
                 "<ip-adresse>/feucht?delta=<wert>" setzt den Feuchtigkeits-Differenzwert, der eine CCU-Meldung ausloest
                 "<ip-adresse>/feucht?korr=<wert>" setzt den Korrekturwert fuer die Feuchtigkeitsmessung
                 "<ip-adresse>/zeit?delta=<wert>" setzt die Zeitspanne (in Sekunden), nach der spaetestens eine CCU-Meldung erfolgt
                 "<ip-adresse>/zeit?mess=<wert>" definiert das Messintervall (in Sekunden)
          
              Getesteter Aufbau:
                 WeMos D1 mini
                 DHT Shield mini
                 Pin-Belegung:
                    D4: Datenleitung DHT-Sensor
          
                 DHT sensor library by Adafruit v.1.2.3
          
              *  
           *  erweitert 08.2017 TomT
           *  - FIX Einstellungen über Website Zeitenänderung in ms
           *  - FIX CCU2 Aufruf html Header neue Version
           *  - UPGRADE ioBroker simple.api Anbindung
           *  
           *   Änderungen für deepsleep 12.April 2018 - Maik
          */
          
          #include <esp8266wifi.h>#include <wificlient.h>#include <esp8266webserver.h>#include "DHT.h"
          
            unsigned long wifiConnectStart = millis();
          
          // ******* Netzwerkeinstellungen, bitte anpassen! *******
          const char* ssid = "eingabe SSID"; // SSID des vorhandenen WLANs
          const char* password = "eingabe Password"; // Passwort für das vorhandene WLAN
          //IPAddress gateway(xxx,xxx,xxx,xxx); // IP-Adresse des WLAN-Gateways
          //IPAddress subnet(255,255,255,0); // Subnetzmaske
          //IPAddress ip(xxx,xxx,xxx,xxx); // feste IP-Adresse für den WeMos
          const char* host = "xxx.xxx.xxx.xxx"; // IP-Adresse der CCU (mit Punkten!)
          ESP8266WebServer server(80); // Webserver initialisieren auf Port 80
          
          // Time to sleep (in seconds):
          const int sleepTimeS = 1800;
          
          // ******* Sensoreinstellungen, bitte anpassen! *******
          DHT dht(D4, DHT22); // verwendeter Datenpin des Sensors, bei WeMos mini Shields = D4
          // verwendeter Sensortyp, unterstützt werden DHT11 DHT21 DHT22
          // WeMos mini DHT Shield = DHT11
          // WeMos mini DHT Pro Shield = DHT22
          unsigned long deltaMessungSekunden = 60; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
          float korrTemp = -1; // Korrekturwert fuer die Temperaturmessung
          float korrFeucht = 0; // Korrekturwert fuer die Feuchtigkeitsmessung
          
          // ******* Einstellungen fuer Meldungen an die CCU, bitte anpassen! *******
          String tempCCUname = "temp"; // Bezeichnung der CCU-Systemvariable für die gemessene Temperatur
          String feuchtCCUname = "feucht"; // Bezeichnung der CCU-Systemvariable für die gemessene Luftfeuchtigkeit
          unsigned long deltaMeldungSekunden = 60; // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
          float deltaTemp = 1; // Temperaturaenderung (*C) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
          float deltaFeucht = 0; // Luftfeuchteaenderung (%) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
          
          float feucht = 0, feuchtCCU = 0, temp = 0, tempCCU = 0;
          unsigned long jetztMillis = 0;
          unsigned long deltaMessungMillis = deltaMessungSekunden * 1000, letzteMessungMillis = 0;
          unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000, letzteMeldungMillis = 0;
          String antwort = "", meldung = "", letzteMeldungCCUzeit = "";
          
          // ******* Einstellungen fuer ioBroker, bitte anpassen! *******
          String apiDeviceName = "Wemos2"; // Bezeichnung des ioBroker.SimpleApi Devise
          String tempIOBname = "Wemost4h4_Temp"; // Bezeichnung der ioBroker Variable für die gemessene Temperatur
          String feuchtIOBname = "Wemost4h4_Hum"; // Bezeichnung der ioBroker Variable für die gemessene Luftfeuchtigkeit
          const char* hostIOBroker = "192.168.xxx.xxx"; // IP-Adresse des ioBroker
          const int httpPortBroker = 8087; //eingetragener Port des simpleApi Adapters
          
          String zeitstempel() { // Betriebszeit als Stunde:Minute:Sekunde
            char stempel[10];
            int lfdStunden = millis() / 3600000;
            int lfdMinuten = millis() / 60000 - lfdStunden * 60;
            int lfdSekunden = millis() / 1000 - lfdStunden * 3600 - lfdMinuten * 60;
            sprintf (stempel, "%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
            return stempel;
          }
          
          void messung() { // Sensor abfragen
            feucht = dht.readHumidity() + korrFeucht;
            temp = dht.readTemperature() + korrTemp;
            if (isnan(feucht) || isnan(temp)) {
              Serial.println(zeitstempel() + "  Fehler: Sensor konnte nicht abgefragt werden");
              delay(100);
              return;
            }
            letzteMessungMillis = jetztMillis;
            Serial.println(zeitstempel() + "  Messung Luftfeuchtigkeit: " + feucht + " %  Temperatur: " + temp + " * C");
          }
          
          void melde_ioBroker() { // Werte an ioBroker melden
            WiFiClient client;
            if (!client.connect(hostIOBroker, httpPortBroker)) {
              return;
            }
          
            //String url = "/set/system.adapter.simple-api.0.'" + String(tempIOBname) + "'?value='" + String(temp) + "'&prettyPrint";
            String url = "/setBulk?system.adapter.simple-api.0." + apiDeviceName + "." + tempIOBname + "=" + String(temp) + "&system.adapter.simple-api.0." +
                         apiDeviceName + "." + feuchtIOBname + "=" + String(feucht) + "&prettyPrint";
            // Serial.print("Requesting URL: ");
            // Serial.println(url);
            // This will send the request to the server
            client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                         "Host: " + host + "\r\n" +
                         "Connection: close\r\n\r\n");
            delay(100);
          
            // Read all the lines of the reply from server and print them to Serial
            while (client.available()) {
              String line = client.readStringUntil('\r');
            }
            Serial.println("Werte an iOBroker gemeldet");
          // Sleep
          Serial.println("ESP8266 in sleep mode");
          ESP.deepSleep(sleepTimeS*1000000, WAKE_RF_DEFAULT); // Sleep for 60 seconds
          delay(100);
          }
          void melde_CCU() { // Werte an die CCU melden
            WiFiClient client;
            const int httpPort = 80;
            if (!client.connect(host, httpPort)) {
              return;
            }
          
            String url = "/xy.exe?antwort1=dom.GetObject('" + feuchtCCUname + "').State('" + feucht + "')"
                         "&antwort2=dom.GetObject('" + tempCCUname + "').State('" + temp + "')";
          
            // Serial.print("Requesting URL: ");
            // Serial.println(url);
            // This will send the request to the server
            client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                         "Host: " + host + "\r\n" +
                         "Connection: close\r\n\r\n");
            delay(100);
          
            // Read all the lines of the reply from server and print them to Serial
            while (client.available()) {
              String line = client.readStringUntil('\r');
            }
            Serial.println("Werte an CCU gemeldet, " + letzteMeldungCCUzeit);
            letzteMeldungMillis = jetztMillis; // gemeldete Daten merken
            feuchtCCU = feucht;
            tempCCU = temp;
          }
          
          void wurzel_behandlung() { // bei Aufruf des Root-Verzeichnisses
            String betriebszeit = zeitstempel();
            antwort = "Gewaechshaus t1h1 WeMos Temperatur-/Luftfeuchtesensor\n";
            antwort = antwort + "\tBetriebszeit: " + betriebszeit + " (Std:Min:Sek)\n";
            antwort = antwort + "\tVerbunden mit: " + ssid + "\n";
            int rssi = WiFi.RSSI();
            antwort = antwort + "\tSignalstaerke: " + String(rssi) + " dBm\n\n";
            antwort = antwort + "Letzte Messwerte\n\tTemperatur: " + String(temp) + " * C\n";
            antwort = antwort + "\tLuftfeuchtigkeit: " + String(feucht) + " %\n\n";
            antwort = antwort + "Korrekturwerte\n\tTemperatur: " + String(korrTemp) + " * C\n";
            antwort = antwort + "\tLuftfeuchtigkeit: " + String(korrFeucht) + " %\n\n";
            antwort = antwort + "Letzte Datenuebertragung CCU\n\t" + letzteMeldungCCUzeit;
            antwort = antwort + "\tGemeldete Temperatur: " + String(tempCCU) + " * C\n";
            antwort = antwort + "\tGemeldete Luftfeuchtigkeit: " + String(feuchtCCU) + " %\n\n";
            antwort = antwort + "Ausloeser fuer Datenuebertragung CCU\n";
            antwort = antwort + "\tZeitintervall: " + String(deltaMeldungSekunden) + " Sekunden\n";
            antwort = antwort + "\tZeitintervall: " + String(deltaMessungSekunden) + " Sekunden\n";
            antwort = antwort + "\tTemperaturdifferenzwert: " + String(deltaTemp) + " * C\n";
            antwort = antwort + "\tFeuchtigkeitsdifferenzwert: " + String(deltaFeucht) + " %\n\n";
            antwort = antwort + "HTTP-Befehlsuebersicht:\n";
            antwort = antwort + "\"<ip-adresse>/temp\"\n\tgibt die zuletzt gemessene Temperatur aus (Grad Celsius)\n";
            antwort = antwort + "\"<ip-adresse>/feucht\"\n\tgibt die zuletzt gemessene Luftfeuchtigkeit aus (in Prozent)\n";
            antwort = antwort + "\"<ip-adresse>/zeit\"\n\tgibt den CCU-Zeitstempel aus, an dem die letzte Meldung an die CCU erfolgte\n";
            antwort = antwort + "\"<ip-adresse>/temp?delta=<wert>\"\n\tsetzt den Temperatur-Differenzwert, der eine CCU-Meldung ausloest\n";
            antwort = antwort + "\"<ip-adresse>/temp?korr=<wert>\"\n\tsetzt den Korrekturwert fuer die Temperaturmessung\n";
            antwort = antwort + "\"<ip-adresse>/feucht?delta=<wert>\"\n\tsetzt den Feuchtigkeits-Differenzwert, der eine CCU-Meldung ausloest\n";
            antwort = antwort + "\"<ip-adresse>/feucht?korr=<wert>\"\n\tsetzt den Korrekturwert fuer die Feuchtigkeitsmessung\n";
            antwort = antwort + "\"<ip-adresse>/zeit?delta= <wert>\"\n\tsetzt die Zeitspanne (in Sekunden), nach der spaetestens eine CCU-Meldung erfolgt\n";
            antwort = antwort + "\"<ip-adresse>/zeit?mess=<wert>\"\n\tdefiniert das Messintervall (in Sekunden)\n";
            server.send(300, "text/plain", antwort);
            delay(150);
            Serial.println(zeitstempel() + "  unspezifische HTTP-Anfrage");
          }
          
          void melde_feucht() { // bei Aufruf von ".../feucht"
            String delta = server.arg("delta");
            String korr = server.arg("korr");
            if (delta != "") {
              deltaFeucht = delta.toFloat();
              server.send(200, "text/plain", "Feuchtigkeitsdifferenzwert fuer CCU-Meldungen auf " + delta + " % gesetzt.");
              delay(100);
              Serial.println(zeitstempel() + "  Feuchtigkeitsdifferenzwert ueber HTTP geaendert: " + delta + " %");
            }
            else if (korr != "") {
              korrFeucht = korr.toFloat() * 1000;
              server.send(200, "text/plain", "Korrekturwert fuer Feuchtigkeitsmessung auf " + korr + " % gesetzt.");
              delay(100);
              Serial.println(zeitstempel() + "  Feuchtigkeitskorrekturwert ueber HTTP geaendert: " + korr + " %");
            }
            else {
              server.send(200, "text/plain", String(feucht));
              delay(100);
              Serial.println(zeitstempel() + "  Luftfeuchtigkeit ueber HTTP gemeldet");
            }
          }
          
          void melde_temp() { // bei Aufruf von ".../temp"
            String delta = server.arg("delta");
            String korr = server.arg("korr");
            if (delta != "") {
              deltaTemp = delta.toFloat();
              server.send(200, "text/plain", "Temperaturdifferenzwert fuer CCU-Meldungen auf " + delta + " * C gesetzt.");
              delay(100);
              Serial.println(zeitstempel() + "  Temperaturdifferenzwert ueber HTTP geaendert: " + delta + " * C");
            }
            else if (korr != "") {
              korrTemp = korr.toFloat() * 1000;
              server.send(200, "text/plain", "Korrekturwert fuer Temperaturmessung auf " + korr + " * C gesetzt.");
              delay(100);
              Serial.println(zeitstempel() + "  Temperaturkorrekturwert ueber HTTP geaendert: " + korr + " Sekunden");
            }
            else {
              server.send(200, "text/plain", String(temp));
              delay(100);
              Serial.println(zeitstempel() + "  Temperatur ueber HTTP gemeldet");
            }
          
          }
          
          void melde_zeit() { // bei Aufruf von ".../zeit"
            String delta = server.arg("delta");
            String mess = server.arg("mess");
            if (delta != "") {
              deltaMeldungSekunden = delta.toInt();
              deltaMeldungMillis = deltaMeldungSekunden * 1000;
              server.send(200, "text/plain", "Zeitintervall fuer CCU-Meldungen auf " + delta + " Sekunden gesetzt.");
              delay(100);
              Serial.println(zeitstempel() + "  Zeitintervall fuer CCU-Meldungen ueber HTTP geaendert: " + delta + " Sekunden");
            }
            else if (mess != "") {
              deltaMessungMillis = mess.toInt() * 1000;
              server.send(200, "text/plain", "Zeitintervall fuer Sensorabfrage auf " + mess + " Sekunden gesetzt.");
              delay(100);
              Serial.println(zeitstempel() + "  Zeitintervall fuer Sensorabfrage ueber HTTP geaendert: " + mess + " Sekunden");
            }
            else {
              server.send(200, "text/plain", "Letzte Aktualisierung der CCU\n" + letzteMeldungCCUzeit);
              delay(100);
              Serial.println(zeitstempel() + "  Letzte Aktualisierung der CCU ueber HTTP Status gemeldet");
            }
          }
          
          void setup() {
            dht.begin(); // Sensor initialisieren
          
            // Seriellen Monitor für Kontrollausgaben öffnen
            Serial.begin(115200);
            Serial.println("");
            Serial.println("WeMos Temperatur-/Luftfeuchtesensor");
          
            // WLAN-Verbindung herstellen
            //  WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
            WiFi.mode(WIFI_STA);
            WiFi.begin(ssid, password);
            Serial.print("Verbindungsaufbau");
          
            // Verbindungsaufbau abwarten
             while (WiFi.status() != WL_CONNECTED) {
              // Check to see if
              if (WiFi.status() == WL_CONNECT_FAILED) {
                Serial.println("Failed to connect to WiFi. Please verify credentials: ");
                delay(10000);
          
              }
          
              delay(500);
              Serial.println("...");
              // Only try for 5 seconds.
              if (millis() - wifiConnectStart > 15000) {
                Serial.println("Failed to connect to WiFi");
                 // Sleep
          Serial.println("ESP8266 in sleep mode");
          ESP.deepSleep(sleepTimeS*1000000, WAKE_RF_DEFAULT); // Sleep for 60 seconds
          delay(100);
                return;
          
                    }
            }
            Serial.println(" erfolgreich!");
            Serial.println("");
            Serial.print("Verbunden mit: ");
            Serial.println(ssid);
            Serial.print("Signalstaerke: ");
            int rssi = WiFi.RSSI();
            Serial.print(rssi);
            Serial.println(" dBm");
            Serial.print("IP-Adresse: ");
            Serial.println(WiFi.localIP());
            Serial.println("");
          
            // HTTP-Anfragen bearbeiten
            server.on("/", wurzel_behandlung);
            server.on("/temp", melde_temp);
            server.on("/feucht", melde_feucht);
            server.on("/zeit", melde_zeit);
          
            // HTTP-Server starten
            server.begin();
            Serial.println(zeitstempel() + "  HTTP-Server gestartet");
          
            // Startwerte fuer Zeittrigger
            letzteMessungMillis = millis();
            letzteMeldungMillis = millis();
          
          }
          
          void loop() {
            // auf HTTP-Anfragen warten
            server.handleClient();
          
            jetztMillis = millis();
          
            // neue Messung falls Zeitintervall erreicht
            if (jetztMillis - letzteMessungMillis > deltaMessungMillis) {
              messung();
            }
          
            // neue Meldung an die CCU falls Zeitintervall erreicht
            if (!deltaMeldungMillis == 0 && jetztMillis - letzteMeldungMillis > deltaMeldungMillis) {
              Serial.print(zeitstempel() + "  Zeitintervall erreicht: ");
              melde_CCU();
              melde_ioBroker();
            }
          
            // neue Meldung an die CCU falls Luftfeuchtigkeitsaenderung den Schwellwert erreicht
            if (!deltaFeucht == 0 && abs(feucht - feuchtCCU) >= deltaFeucht) {
              Serial.print(zeitstempel() + "  Luftfeuchtigkeitsaenderung: ");
              melde_CCU();
              melde_ioBroker();
            }
          
            // neue Meldung an die CCU falls Temperaturaenderung den Schwellwert erreicht
            if (!deltaTemp == 0 && abs(temp - tempCCU) >= deltaTemp) { // Neue Meldung wg. Temperaturaenderung?
              Serial.print(zeitstempel() + "  Temperatursaenderung: ");
              melde_CCU();
              melde_ioBroker();
          
            }
           // ESP.deepSleep(sleepTimeS*1000000, WAKE_RF_DEFAULT); // Sleep for 60 seconds
          }</wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></ip-adresse></ip-adresse></ip-adresse></esp8266webserver.h></wificlient.h></esp8266wifi.h></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></wert></ip-adresse></ip-adresse></ip-adresse></ip-adresse></ip-adresse> 
          

          Achtung für den DeepSleep mode ist noch eine Brücke zwischen D0 und RST nötig. Ich hab diese auf dem DHT angebracht um notfalls dem Wemo ohne die Brücke zu nutzen oder speziell flashen zu können.

          Gruss

          Maik

          1 Reply Last reply Reply Quote 0
          • P
            pix last edited by

            Hallo Maik,
            @booehmemaik:

            Achso, meine Laufen inzwischen auf Akkubetrieb mit BatterieShield. Nach folgender Vorgabe https://www.thingiverse.com/thing:2813140 `
            kannst du was zur Laufzeit sagen? Wie lange hält der Akku?

            Gruß

            Pix

            1 Reply Last reply Reply Quote 0
            • TomT
              TomT last edited by

              Hallo Maik,

              damit es bei Fragen zu dem Quelltext von dir nicht an m.yoda (Homematic Forum) Fragen hagelt, die er nicht in den Code eingebaut hat, bitte ändere deinen Codeheader ab und ergänze unter

              *  9.Februar 2016 —m.yoda
              

              folgenden Text :

              *  
               *  erweitert 08.2017 TomT
               *  - FIX Einstellungen über Website Zeitenänderung in ms
               *  - FIX CCU2 Aufruf html Header neue Version
               *  - UPGRADE ioBroker simple.api Anbindung
               *  
              

              Danke dir 🙂

              Grüße

              Tom

              1 Reply Last reply Reply Quote 0
              • B
                booehmemaik last edited by

                @pix:

                kannst du was zur Laufzeit sagen? Wie lange hält der Akku?

                Gruß

                Pix `

                Da das ganze erst seit Ostern läuft, sind es bis jetzt 2 Wochen…aber sie laufen noch. Ohne Deepsleep waren die Akkus innerhalb eines Tages leer.

                Gruss

                Maik

                1 Reply Last reply Reply Quote 0
                • B
                  booehmemaik last edited by

                  @TomT:

                  Danke dir 🙂

                  Grüße

                  Tom `

                  Erledigt.

                  1 Reply Last reply Reply Quote 0
                  • P
                    pix last edited by

                    @booehmemaik:

                    @pix:

                    kannst du was zur Laufzeit sagen? Wie lange hält der Akku?

                    Gruß

                    Pix `

                    Da das ganze erst seit Ostern läuft, sind es bis jetzt 2 Wochen…aber sie laufen noch. Ohne Deepsleep waren die Akkus innerhalb eines Tages leer.

                    Gruss

                    Maik `
                    Danke Dir, läuft es immer noch?

                    Gruß

                    Pix

                    1 Reply Last reply Reply Quote 0
                    • B
                      booehmemaik last edited by

                      ja , ich komme so auf 2 moante.

                      Gruss

                      Maik

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      800
                      Online

                      31.7k
                      Users

                      79.8k
                      Topics

                      1.3m
                      Posts

                      4
                      9
                      1418
                      Loading More Posts
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes
                      Reply
                      • Reply as topic
                      Log in to reply
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                      The ioBroker Community 2014-2023
                      logo