WeMos D1 mini als WLAN-Sensor/-Aktor

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

Moderator: Co-Administratoren

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

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

Beitrag von dondaik » 29.11.2018, 19:57

:-)
nur die eine: hau die dinger in die tonne... ich habe mal welche zum test auf dem tisch gehabt -... lohnt nicht kann man hier auch mehrfach nachlesen!
sie haben mehrere schwachstellen .
-------
!!! 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: 12925
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1599 Mal
Danksagung erhalten: 222 Mal

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

Beitrag von dondaik » 30.11.2018, 07:02

am rande, ggf mag ja einer so einfacher verdrahten, ich habe den draht auch vor einigen tagen im keller wiedergefunden - nur das werkzeug war weg .. :-( .. wurde jetzt neu bestellt .

hier wird eine alte technik der verdrahtung neu zum leben erweckt !

YOUTUBE.COM
Better than Dupont Wires: Wire Wrapping for our Projects (Arduino, ESP8266, ESP32)
Several technologies exist to connect electronic components. In this video, I want to add a nearly…
-------
!!! 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.

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 » 02.12.2018, 18:00

Hallo zusammen,

Ich hab da ein Problem mit meinen Wemos Steckdosen,, für die Weihnachtsbeleuchtung.. :mrgreen:

Letztes Jahr hab ich einfach verwendet

Code: Alles auswählen

string url="'http://192.168.0.216/cmd?R1=1'";
dom.GetObject("CUxD.CUX2801004:9.CMD_SETS").State("wget -q -O /dev/null " # url);
dom.GetObject("CUxD.CUX2801004:9.CMD_RUNS").State("1");
zum einschalten.
aber das geht nicht mehr.. komme nicht dahinter warum
im Browser geht natürlich http://192.168.0.216/cmd?R1=1 für ein
bzw. http://192.168.0.216/cmd?R1=0 für aus..

hat sich da seit letzten jahr was verändert?? :?:

Danke
mfg.
Flo

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

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

Beitrag von dondaik » 02.12.2018, 18:12

wenn die ccu ein update erhalten hat die sicherheitseinstellungen ...

( deshalb braucht meine ccu kein update ... :-) )
-------
!!! 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.

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 » 02.12.2018, 18:32

Sicherheitseinstellungen beim Senden ?

Wo wäre das was zum Einstellen?

Mfg.

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

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

Beitrag von dondaik » 02.12.2018, 19:18

suche mal hier im thema 8181

( bin hier im stress :-( )
-------
!!! 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.

DJDieter
Beiträge: 312
Registriert: 11.01.2008, 14:41
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 33 Mal
Danksagung erhalten: 19 Mal

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

Beitrag von DJDieter » 31.12.2018, 11:50

Hallo Zusammen.

Nach zwei Tagen vergeblicher Mühe bräuchte ich mal Euere Hilfe bei der Fehlersuche in meinem Sktech. Es funktioniert alles prima - bis auf die CCU-Meldung bei Druckänderung.

Ändert sich der Duck um 0.1 bar soll eine Meldung an die CCU erfolgen - passiert aber nicht. Die Meldung alle 600 Sekunden wird durchgeführt.

Hier mal der Sktech:

Code: Alles auswählen

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "Wire.h"
#define SENSOR_ADDRESS 0x6D
#define SENSOR_REG 0x06

// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid = "xx"; // SSID des vorhandenen WLANs
const char* password = "xx"; // Passwort für das vorhandene WLAN
IPAddress gateway(xx); // IP-Adresse des WLAN-Gateways
IPAddress subnet(255,255,255,0); // Subnetzmaske
IPAddress ip(xx); // feste IP-Adresse für den WeMos
const char* host = "xx"; // IP-Adresse der CCU (mit Punkten!)
ESP8266WebServer server(80); // Webserver initialisieren auf Port 80

// ******* Sensoreinstellungen, bitte anpassen! *******
unsigned long deltaMessungSekunden = 10; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
float korrDruck = 1; // Korrekturwert fuer die Druckmessung
float fadc;

// ******* Einstellungen fuer Meldungen an die CCU, bitte anpassen! *******
String druckCCUname = "CUxD.CUX9000015:1.SET_STATE"; // CUxD-Gerät "Brauchwasserdruck"
unsigned long deltaMeldungSekunden = 600; // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
float deltaDruck = 0.1; // Druckänderung bei der eine CCU-Meldung erfolgt (0 bedeutet nie)

float druck = 0, druckCCU = 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
{
  uint32_t low, med, high;
  uint32_t wert;
  Wire.beginTransmission(SENSOR_ADDRESS);
  Wire.write(SENSOR_REG);
  Wire.endTransmission(false);
  Wire.requestFrom(SENSOR_ADDRESS, 3);
  if(Wire.available() == 3 )
  {
    high = Wire.read();
    med = Wire.read();
    low = Wire.read();
    wert = (high<<16) | (med<<8) | low;
  }
  Wire.endTransmission();

  if(wert & 0x800000)
  {
  fadc = wert - 16777216.0;
  }
  else
  {
  fadc = wert;
  }
  druck = 500 * ((3.3 * wert / 8388608.0)-0.5) / 200.0 * korrDruck;

    if (isnan(druck))
    {
     Serial.println(zeitstempel() + "  Fehler: Brauchwasserdrucksensor konnte nicht abgefragt werden");
     delay(100);
     return;
    }
  letzteMessungMillis = jetztMillis;
  Serial.println(zeitstempel() + "  Druck: " + druck + " bar");
}

void melde_CCU()// Werte an die CCU melden
  {
  WiFiClient client; // Webclient initialisieren
  const int httpPort = 8181;
  if (!client.connect(host, httpPort)) // mit dem CCU-Port 8181 verbinden
  {
    Serial.println(zeitstempel() + "  Fehler: Verbindung zur CCU konnte nicht aufgebaut werden");
     delay(100);
    return;
  }
  String url = "/xy.exe?antwort1=dom.GetObject('" + druckCCUname + "').State('" + druck + "')";
  client.println(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); // Daten an CCU melden
  delay(100);
  
  int i = 0;
//  String zeile = "";
  while(client.available()) // Antwort der CCU zeilenweise auslesen
    {
    i ++;
    String zeile = client.readStringUntil('\r'); // Zeitstempel der CCU ausfiltern und merken
    if (i == 7)
    {
      letzteMeldungCCUzeit = zeile;
    }
  }
  Serial.println("Werte an CCU gemeldet, " + letzteMeldungCCUzeit);
  letzteMeldungMillis = jetztMillis; // gemeldete Daten merken
  druckCCU = druck;
}   

void wurzel_behandlung()// bei Aufruf des Root-Verzeichnisses
{
  String betriebszeit = zeitstempel();
  antwort = "WeMos Brauchwasserdrucksensor\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\tDruck: " + String(druck) + " bar\n";
  antwort = antwort + "Korrekturwerte\n\tDruck: " + String(korrDruck) + "\n\n";
  antwort = antwort + "Letzte Datenuebertragung CCU: " + letzteMeldungCCUzeit + "\n";
  antwort = antwort + "\tGemeldeter Druck: " + String(druckCCU) + " bar\n\n";
  antwort = antwort + "Ausloeser fuer Datenuebertragung CCU\n";
  antwort = antwort + "\tZeitintervall: " + String(deltaMeldungSekunden) + " Sekunden\n";
  antwort = antwort + "\tDruckdifferenzwert: " + String(deltaDruck) + " bar\n\n";
  antwort = antwort + "HTTP-Befehlsuebersicht:\n";
  antwort = antwort + "\"192.168.178.69/druck\"              gibt den zuletzt gemessenen Brauchwasserdruck aus (Bar)\n";
  antwort = antwort + "\"192.168.178.69/zeit\"               gibt den CCU-Zeitstempel aus, an dem die letzte Meldung an die CCU erfolgte\n";
  antwort = antwort + "\"192.168.178.69/druck?delta=<wert>\" setzt den Brauchwasserdruck-Differenzwert, der eine CCU-Meldung ausloest\n";
  antwort = antwort + "\"192.168.178.69/druck?korr=<wert>\"  setzt den Korrekturwert fuer die Brauchwasserdruckmessung\n";
  antwort = antwort + "\"192.168.178.69/zeit?delta=<wert>\"  setzt die Zeitspanne (in Sekunden), nach der spaetestens eine CCU-Meldung erfolgt\n";
  antwort = antwort + "\"192.168.178.69/zeit?mess=<wert>\"   definiert das Messintervall (in Sekunden)\n";
  server.send(300, "text/plain", antwort);
  delay(150);
  Serial.println(zeitstempel() + "  unspezifische HTTP-Anfrage");
}

void melde_druck() // bei Aufruf von ".../druck"
{
  String delta = server.arg("delta");
  String korr = server.arg("korr");
  if (delta != "")
  {
    deltaDruck = delta.toFloat();
    server.send(200, "text/plain", "Brauchwasserdruckdifferenzwert fuer CCU-Meldungen auf " + delta + " bar gesetzt.");
    delay(100);
    Serial.println(zeitstempel() + "  Druckdifferenzwert ueber HTTP geaendert: " + delta + " bar");
  }
  else if (korr != "")
  {
    korrDruck = korr.toFloat();
    server.send(200, "text/plain", "Korrekturwert fuer Brauchwasserdruckmessung auf " + korr + " gesetzt.");
    delay(100);
    Serial.println(zeitstempel() + "  Druckkorrekturwert ueber HTTP geaendert: " + korr + " Sekunden");
  }
  else {
    server.send(200, "text/plain", String(druck));
    delay(100);
    Serial.println(zeitstempel() + "  Brauchwasserdruck 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()
{
// Seriellen Monitor für Kontrollausgaben öffnen
  Serial.begin(9600);
  Serial.println("");
  Serial.println("WeMos Brauchwasserdrucksensor");
// I2C starten mit SDA = D2 und SCL = D3
  Wire.begin(D2,D3);
  delay(100);
  
// 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("/druck", melde_druck);
  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 Druckänderung den Schwellwert erreicht
  if(!deltaDruck == 0 && abs(druck - druckCCU) >= deltaDruck)
  {
    Serial.print(zeitstempel() + "  Brauchwasserdruckaenderung: "); 
    melde_CCU();
  }
}

EDIT: Kaum gepostet, Fehler gefunden. Es lag an der Kommazahl. Das Script mag wohl nur ganze Zahlen.
Raspberry PI 4 mit RaspberryMatic, 4 LAN-Gateways, zwei HmIP-HAP und 248 Geräte
CUxD mit 357 Kanälen auf 64 Geräten
Zusatzsoftware: XML-API, CUxD-Highcharts, NEO-Server, Programmedrucken, CUxD, E-Mail, Philips Hue, Messenger, CCU-Historian, JB-HP-Devices, HomeKit HomeMatic
Anbindungen: Wolf eBus; NodeMCU-Ultraschall-Füllstandsmessung mit Temperatureinfluß; Fußbodenheizung mit Rücklauftemperaturbegrenzer (RTL)

boardrunner
Beiträge: 22
Registriert: 11.02.2018, 10:32

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

Beitrag von boardrunner » 04.01.2019, 17:23

jp112sdl hat geschrieben:
11.09.2018, 17:48
Probiers mal damit: https://github.com/jp112sdl/WemosD1_HomeMatic_PIR
Asche auf mein Haupt. Ich habe versagt. Einfach nur zu doof zum Lesen. Es funktioniert nun, nachdem ich gemacht habe, was da steht.

segelwinni
Beiträge: 23
Registriert: 01.10.2015, 17:48

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

Beitrag von segelwinni » 09.01.2019, 05:44

Hallo zusammen,
ich habe vor 2 Tagen mit dem WeMos angefangen zu "spielen". Bin also Anfänger mit Arduino und Co.
Ich habe mir den Schaltaktor vom m.yoda nachgebaut und das klappt wunderbar.
Lässt sich von der Zentrale aus steuern.
Nun möchte ich gerne nach einem Schaltvorgang den Zustand des Relais an die Homematic senden.
Dazu habe ich in der CCU die Systemvariable D1mini als Textvariable angelegt und rufe die Funktion melde_CCU im Sketch auf.
URL der CCU ist auch richtig eingetragen.
Die Variable wird nicht gesetzt. Hab ich da einen Fehler eingebaut?
Wäre schön wenn mal jemand drüber schauen könnte.
Danke.

Code: Alles auswählen

  void melde_CCU()
{ // Werte an die CCU melden
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) 
  {   return;  }
  
 Zustand = "----";
  if (digitalRead(D1) == HIGH)
   Zustand = "eingeschaltet";
   else
    Zustand = "ausgeschaltet";

  String url = "/xy.exe?antwort1=dom.GetObject('" + CCU_variable + "').State('" + Zustand + "')";
  // 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); 
Als es dem Kapitän zu dumm wurde, lies er das ganze Schiff über Bord werfen.

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 » 09.01.2019, 07:43

Code: Alles auswählen

String url = "/xy.exe?antwort1=dom.GetObject('" + CCU_variable + "').State('" + Zustand + "')";
müsste in deinem Falle

Code: Alles auswählen

String url = "/xy.exe?antwort1=dom.GetObject('" + D1mini + "').State('" + Zustand + "')";
heißen....
Ausserdem Groß-Kleinschreibung beim Variablennamen beachtet?

Grüße
Tom

Antworten

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