NEWS
[gelöst] WemoD1 + DHT22 +simpleAPI Adapter
-
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-lfdStunden3600-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
-
gelöst ` Hallo Maik,
da bin in such gerade dran.
Würdest Du bitte auch die Lösung posten. Danke
-
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.
/* 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
-
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
-
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
-
@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
-
-
@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
-
ja , ich komme so auf 2 moante.
Gruss
Maik