WeMos D1 mini als WLAN-Sensor/-Aktor

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

Moderator: Co-Administratoren

klassisch
Beiträge: 3974
Registriert: 24.03.2011, 04:32
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 110 Mal
Danksagung erhalten: 71 Mal

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

Beitrag von klassisch » 20.08.2017, 14:33

Ja, alter Code. Passt nicht mehr zu neuen CCU-FW. Die sind pingeliger, was die http-Behandlung angeht. Mir (und anderen) hat das geholfen:
viewtopic.php?p=350204#p350204

Ardubert Homedu
Beiträge: 142
Registriert: 17.07.2016, 10:40
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

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

Beitrag von Ardubert Homedu » 20.08.2017, 15:59

Hallo,

Ich hab meine wemos damit wieder zum Übertragen bekommen...
Die laufen auch mit der Grad aktuellen Firmware
Mit dem Gruppen Fehler...
Kannst ja die analog Messung ausklammern...

viewtopic.php?f=31&t=29321&start=1570


MFG. Flo

Gunter1710
Beiträge: 4
Registriert: 20.08.2017, 14:02

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

Beitrag von Gunter1710 » 20.08.2017, 17:08

Super!!
Vielen Dank @klassisch & @Ardubert Homedu
Nun funktioniert es wie es soll.

Anbei noch mal der Sketch "nur" mit der RaspberryMatic Anpassung

Code: Alles auswählen

/*
 *  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
 *  23.03.2017 - Ardubert Homedu     - ceerix Code angepasst für CCU FW 2.27.7
 *  20. August 2017 - Gunter170 - Anpassung für RaspberryMatic
 */

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "DHT.h"

// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid = "abc123"; // SSID des vorhandenen WLANs
const char* password = "geheim"; // 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, 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 = 0; // 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 = 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 = "";

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 = 8181;
  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);
/*  Serial.println("Werte an CCU gemeldet, \n" + meldung + "\n" + 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();
  }
}

Ardubert Homedu
Beiträge: 142
Registriert: 17.07.2016, 10:40
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

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

Beitrag von Ardubert Homedu » 20.08.2017, 18:54

Dann hier noch meine Letzte Version ,,,

Die Analog Messung kann jetzt oben ausgeschalten werden..

Das Delta für Messung geht jetzt auch für Analog und löst somit auch die
Übertragung aus...
bisher wurde nur bei temp, oder feuchte ausgelöst...

viel Spaß damit

Code: Alles auswählen

/*
 *  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
 *     DHT22
 *     Pin-Belegung:
 *        D4: Datenleitung DHT-Sensor
 *        A0: Analog Eingang
 *     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 = "XXXXXXXXX"; // SSID des vorhandenen WLANs
const char* password = "XXXXXXXXX"; // 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 = "192.168.0.225"; // IP-Adresse der CCU
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
#define nein        // mit Analog Messung ist  - ja - 
                    // ohne Analog Messung ist - nein -
                    
unsigned long deltaMessungSekunden = 60; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt

float korrTemp = -2.7; // Korrekturwert fuer die Temperaturmessung
float korrFeucht = 0; // Korrekturwert fuer die Feuchtigkeitsmessung

int sensorPin = A0; // Definieren 
int sensorValue = 0; // Definieren 


// ******* Einstellungen fuer Meldungen an die CCU, bitte anpassen! *******
String tempCCUname = "W1temp"; // Bezeichnung der CCU-Systemvariable für die gemessene Temperatur
String feuchtCCUname = "W1feucht"; // Bezeichnung der CCU-Systemvariable für die gemessene Luftfeuchtigkeit
String analog = "W1analog" ; // Name der Var. auf der ccu

unsigned long deltaMeldungSekunden = 600; // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)

float deltaTemp = 0.3; // 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 deltaSensor = 5; // analog aenderung) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)      //---eingefügt

float feucht = 0, feuchtCCU = 0, temp = 0, tempCCU = 0, sensor = 0, analogWert = 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() { // Sensoren abfragen
  //*****************************************************************
                 // Analog
#if defined (ja)
  sensorValue = analogRead(sensorPin); // lesen 
  sensorValue = map(sensorValue ,0,1023,0,100 ); // skalieren
 Serial.println(sensorValue);                   // Anzeigen
#endif
 
  //******************************************************************
                     //  DHT
  feucht = dht.readHumidity() + korrFeucht;
  temp = dht.readTemperature() + korrTemp;
  //
    if (isnan(feucht) || isnan(temp)) {
     Serial.println(zeitstempel() + "  Fehler: Sensor konnte nicht abgefragt werden");
     delay(100);
       // lesen im bereich temp lesen

     return;
    }
 
  letzteMessungMillis = jetztMillis;
  Serial.println(zeitstempel() + "  Messung Luftfeuchtigkeit: " + feucht + " %  Temperatur: " + temp + " * C");

 #if defined (ja) 
  Serial.println(zeitstempel() + "  Analog: " + sensorValue);
 #endif 
}
//***************************************************************************************************
//***************************************************************************************************
void melde_CCU() { // Werte an die CCU melden
  WiFiClient client;
  const int httpPort = 8181;
  if (!client.connect(host, httpPort)) {
  return;
  }

 String 
  url = "/xy.exe?antwort1=dom.GetObject('" + feuchtCCUname + "').State('" + feucht + "')"
  "&antwort2=dom.GetObject('" + tempCCUname + "').State('" + temp + "')"
  "&antwort3=dom.GetObject('" + analog + "').State('" + sensorValue + "')";

  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;
  analogWert = sensorValue;
  }   

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-/Luftfeuchte-/Analogsensor");
  
  // 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");

  // 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();
  }
  
   // neue Meldung an die CCU falls analog aenderung den Schwellwert erreicht
  if(!deltaSensor == 0 && abs(sensorValue - analogWert) >= deltaSensor) { // Neue Meldung wg. Analog aenderung?
    Serial.print(zeitstempel() + "  Analog aenderung: "); 
    melde_CCU();
  }
}

mfg.

Flo

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

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

Beitrag von dondaik » 24.08.2017, 17:02

ich hatte ja nach dem Windrichtungs und W.-geschwindigkeitssensor TX 23 sensor gefragt...
gestern habe ich eine Lib dazu gefunden:

* https://www.john.geek.nz/2012/08/la-cro ... -protocol/
* https://github.com/egzumer/Arduino-LaCr ... 23-Library

am rande: der sensor wertet die Windrichtung nach "alter technik" aus - über 4 led´s ...

mal schauen wann ich im winter zeit finde den sensor zu testen , im schrank liegt er ja schon.
-------
!!! 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.

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

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

Beitrag von dondaik » 27.08.2017, 19:37

hat sich einer mal mit der BLYNK-App + lib für den arduino / esp beschäftigt ?
-------
!!! 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.

klassisch
Beiträge: 3974
Registriert: 24.03.2011, 04:32
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 110 Mal
Danksagung erhalten: 71 Mal

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

Beitrag von klassisch » 27.08.2017, 19:59

Nein, was kann die?

Habe heute die Umstellung meines BME280, SHT31, MLX90614, VEML6070, BH1750, Relay und Regensensor Monster auf ESP32 so weit gebracht, daß ich schon erste Tests durchführen konnte.
BME280, VEML6070, BH1750 und Relay scheinen zu funktionieren. In den letzten Tagen gab es einige hifreiche libs - zum Teil aber leider inoffizielle, die von der Community nicht weiter supportet werden.
Nach einem restart ist das Ding sofort im WLAN. Beim ESP8266 mußte ich eine 5 Sekunden-delay einbauen, um das WLAN-Log-in zu stabilisieren. Beim ESP32 warte ich gerade mal eine Sekunde (unoptimiert).
Ich denek fast, daß man mit ein paar Compilerschaltern den Sketch sowohl für ESP32 als auch für ESP8266 compilieren kann.
Mal schauen, was ich jetzt weiter mit mache. Vielleicht etwas RTOS? Oder eine FFT implementieren, damit ich meinem Radar-Regensensor ein paar false positives austreiben und vielleicht etwas zur Regenstärke sagen kann?
Wir werden sehen.
Derzeit verwende ich einen WeMos Lolin 32.
Aber ein D1-Mini kompatibler ESP32 ist unterwegs. Ist kleiner, etwas billiger und kommt hoffentlich nicht per Einschreiben wie die WeMos. Mal sehen.
P.S.: http://esp32.net/ schöne Seite u.a. auch mit Boardübersicht. Mehr Infos zum D1 mini kompatiblen ESP32.

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

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

Beitrag von dondaik » 27.08.2017, 20:31

hört sich nicht schlecht an ! hier ist eine esp32 bestellung erst an der reiche wenn der weatherman rennt..
blynk muss wohl eine "handy-steuerobfläche " für den esp sein ( habe nicht weiter nachgelesen nur gestern was bei YT gesehen )

ps.: der radarsensor ist nicht mal ausgepackt :-(
-------
!!! 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.

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

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

Beitrag von dondaik » 31.08.2017, 18:18

eigentlich sollte man ja mal ein neues thema aufmachen..

der "schweizer " hat gerade ein neues filmchen eingestellt: #156 ESP8266 New Release 2.4.0-rc1 out /
https://www.youtube.com/watch?v=URr5HuVMcsA

man sollte ggf die IDE mal updaten !
-------
!!! 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.

klassisch
Beiträge: 3974
Registriert: 24.03.2011, 04:32
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 110 Mal
Danksagung erhalten: 71 Mal

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

Beitrag von klassisch » 31.08.2017, 19:15

Guter Hinweis, danke!
IDE habe ich gerade dieser Tage upgedatet. Mein ESP32 tat so, als würde er das neue Programm flashen, lief aber mit dem alten los. strange.

Antworten

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