WeMos D1 mini als WLAN-Sensor/-Aktor

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Benutzeravatar
TomT
Beiträge: 565
Registriert: 19.11.2014, 15:13
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von TomT » 12.01.2018, 15:38

So sieht der void melde_CCU() Code korrekt aus :

Code: Alles auswählen

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;
}   

ronnymann
Beiträge: 28
Registriert: 11.01.2018, 16:50
Wohnort: Wuppertal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von ronnymann » 12.01.2018, 15:44

@ TomT

PERFEKT - Danke !

Daten aus der CCU2

15:41:46 12.01.2018 feucht 45.000000 %
15:41:47 12.01.2018 temp 19.000000 *C

Gruß Ronny.
NanoPC-T4 mit pivCCU3 und ioBroker

dondaik
Beiträge: 12886
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1584 Mal
Danksagung erhalten: 221 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von dondaik » 12.01.2018, 16:15

na dann ... weitermachen...
schau mal über das textfenster wenn du schreibst ..... "code" darüber wird der prg-code in ein fenster eingetragen .....
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

Günni
Beiträge: 231
Registriert: 03.10.2013, 00:20
Wohnort: Nordstemmen
Danksagung erhalten: 1 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von Günni » 18.01.2018, 21:10

Hallo,
ich habe einen WeMos mit DHT11 im Einsatz. Temparatur und Feuchtigkeit werden auch an die CCU geschickt.
Jetzt habe ich grade gesehen das der Wemos ein eigenes wLan Netzwerk hat "FaryLink_877364" was nicht verschlüsselt ist .
Wie kann ich das ausstellen.
Danke

Code: Alles auswählen

    /*
     *  WeMos Temperatur-/Luftfeuchtesensor (Prototyp)
     *  
     * Geht auch mit ESP 
     *
     *
     *  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 = "FRITZ!***********"; // SSID des vorhandenen WLANs
    const char* password = "********************"; // Passwort für das vorhandene WLAN
    IPAddress gateway(192,168,2,1); // IP-Adresse des WLAN-Gateways
    IPAddress subnet(255,255,255,0); // Subnetzmaske
    IPAddress ip(192,168,2,223); // feste IP-Adresse für den WeMos             
    const char* host = "192.168.2.103"; // IP-Adresse der CCU (mit Punkten!)
    ESP8266WebServer server(80); // Webserver initialisieren auf Port 80

    // ******* Sensoreinstellungen, bitte anpassen! *******
    DHT dht(D4, DHT11); // 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 = 10; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
    float korrTemp = - 2; // Korrekturwert fuer die Temperaturmessung
    float korrFeucht = 13; // Korrekturwert fuer die Feuchtigkeitsmessung

    // ******* Einstellungen fuer Meldungen an die CCU, bitte anpassen! *******
    String tempCCUname = "WeMos_01_Temp"; // Bezeichnung der CCU-Systemvariable für die gemessene Temperatur
    String feuchtCCUname = "WeMos_01_Feucht"; // Bezeichnung der CCU-Systemvariable für die gemessene Luftfeuchtigkeit
    unsigned long deltaMeldungSekunden = 120; // 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 = 1; // 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 = "";

    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_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";
      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.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();
      }
       
       // neue Meldung an die CCU falls Luftfeuchtigkeitsaenderung den Schwellwert erreicht
       if(!deltaFeucht == 0 && abs(feucht - feuchtCCU) >= deltaFeucht) {
        Serial.print(zeitstempel() + "  Luftfeuchtigkeitsaenderung: ");
        melde_CCU();
      }

      // 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();
      }
    }
Gruß Günni

dondaik
Beiträge: 12886
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1584 Mal
Danksagung erhalten: 221 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von dondaik » 18.01.2018, 21:13

suche mal nach WiFi.mode(m)
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

Günni
Beiträge: 231
Registriert: 03.10.2013, 00:20
Wohnort: Nordstemmen
Danksagung erhalten: 1 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von Günni » 18.01.2018, 21:21

WIfi. mode kommt im Sketch nicht vor
Gruß Günni

dondaik
Beiträge: 12886
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1584 Mal
Danksagung erhalten: 221 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von dondaik » 18.01.2018, 21:35

eben, ist aber mal in dem thema beschrieben worden ... tante G hilft auch. ( kann da im moment auch nicht unterstützen :-(.... esp-pause :-( )
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

Günni
Beiträge: 231
Registriert: 03.10.2013, 00:20
Wohnort: Nordstemmen
Danksagung erhalten: 1 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von Günni » 18.01.2018, 21:59

Habs gefunden :oops:
hier "WiFi.mode(WIFI_STA);" eingefügt

Code: Alles auswählen

  // WLAN-Verbindung herstellen
     WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
     WiFi.mode(WIFI_STA); //           Eingefügt
      WiFi.begin(ssid, password);
      Serial.print("Verbindungsaufbau");
Danke für den Tip
Gruß Günni

dondaik
Beiträge: 12886
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1584 Mal
Danksagung erhalten: 221 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von dondaik » 19.01.2018, 04:20

kein thema,
viel erfolg beim weiterentwickeln !
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

renmet
Beiträge: 287
Registriert: 02.02.2015, 06:09
Danksagung erhalten: 5 Mal

Re: WeMos D1 mini als WLAN-Sensor/-Aktor

Beitrag von renmet » 13.02.2018, 13:17

dixi hat geschrieben:Leider.
Vielleicht meldet sich renmet hier noch.
Schade um seine gute Sammlung
Hallo,

nach langer Abwesenheit habe ich mal wieder vorbeigeschaut. Ja leider ist mein Server und damit auch mein WIKI tot. Ich habe aber "webwalker2001" eine Kopie des Wikis zukommen lassen. Wie da jetzt aber der Status dazu ist müsste man bei ihm hinterfragen.

LG

PS: Im PDF Format kann ich aber alle WIKI Beiträge gerne noch zur Verfügung stellen. Auch habe ich noch alle Sketches irgendwo abgelegt.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“