Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. [gelöst] WemoD1 + DHT22 +simpleAPI Adapter

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

[gelöst] WemoD1 + DHT22 +simpleAPI Adapter

Scheduled Pinned Locked Moved Hardware
9 Posts 4 Posters 1.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    booehmemaik
    wrote on last edited by
    #1

    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
    0
    • T Offline
      T Offline
      Transylvanier
      wrote on last edited by
      #2

      @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
      0
      • B Offline
        B Offline
        booehmemaik
        wrote on last edited by
        #3

        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
        0
        • P Offline
          P Offline
          pix
          wrote on last edited by
          #4

          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

          ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

          1 Reply Last reply
          0
          • TomTT Offline
            TomTT Offline
            TomT
            wrote on last edited by
            #5

            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

            PI3B > Raspimatic / Opi+2 > ioBroker / ESP8266
            if (System == "running") {finger = "weg";} else {lastAction = "Rückgängig";}

            1 Reply Last reply
            0
            • B Offline
              B Offline
              booehmemaik
              wrote on last edited by
              #6

              @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
              0
              • B Offline
                B Offline
                booehmemaik
                wrote on last edited by
                #7

                @TomT:

                Danke dir 🙂

                Grüße

                Tom `

                Erledigt.

                1 Reply Last reply
                0
                • P Offline
                  P Offline
                  pix
                  wrote on last edited by
                  #8

                  @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

                  ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                  1 Reply Last reply
                  0
                  • B Offline
                    B Offline
                    booehmemaik
                    wrote on last edited by
                    #9

                    ja , ich komme so auf 2 moante.

                    Gruss

                    Maik

                    1 Reply Last reply
                    0
                    Reply
                    • Reply as topic
                    Log in to reply
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    576

                    Online

                    32.4k

                    Users

                    81.4k

                    Topics

                    1.3m

                    Posts
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                    ioBroker Community 2014-2025
                    logo
                    • Login

                    • Don't have an account? Register

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • Recent
                    • Tags
                    • Unread 0
                    • Categories
                    • Unreplied
                    • Popular
                    • GitHub
                    • Docu
                    • Hilfe