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 » 02.08.2018, 20:29

MathiasZ hat geschrieben:
02.08.2018, 18:57
Wenn man das Standard-Teil will, schließt man am Wemos einfach das dazugehöige Relais an, richtig?
Die Frage habe ich nicht verstanden.
Was für ein Standard-Teil?
Welche Art von Relais? und wie anschließen? Der ESP8266 kann ca. 10mA an den Ausgängen treiben. Das könnte zu wenig für eine Relaisspule sein. und eine Freilaufdiode sollte dann auch noch dazu.
MathiasZ hat geschrieben:
02.08.2018, 18:57
Was ist, wenn man statt des Relas einen Octocoupler anschließt?
Dann müßte das ganze doch potentialfrei ablaufen.
Ein Optokoppler ist wie ein Relais potentialfrei. Aber die LED braucht einen Vorwiderstand, man sollte sie nicht einfach so an einen Ausgang anschließen. Je nach Optokoppler ca. 180 bis 300 Ohm. Und man muß die Polarität beachten.
Und ein normaler Optokoppler hat einen Bipolartransistor auf der Ausgangsseite. Bei diesem muß man auch die Polarität beachten. Wenn man sich das ersparen möchte, nimmt man einen Photomos AQY 210, 211 oder 213. Je nach Spannungslage und Strom. Schöne Teile. Gibts teuer bei Conrad, Voelkner &Co oder billiger in China. Meiner Meinung nach für solche Kleinsignalanwendungen besser geeignet als Relais.

MathiasZ

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

Beitrag von MathiasZ » 09.08.2018, 04:56

Nun habe ich ein anders Problem:

Ich wollte ein ganz normales Relais schalten.
Aber

Code: Alles auswählen

string stdout;
string stderr;
string url="http://<IP-Adresse des WeMos>/ein";
system.Exec ("wget -q -O /dev/null " # url, &stdout, &stderr);
geht nicht so wie ich will.
Gruß,
Mathias

bibo09
Beiträge: 165
Registriert: 30.03.2015, 17:34

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

Beitrag von bibo09 » 11.09.2018, 11:33

Hi,
habe das Projekt auch soweit am laufen. Wemos D1 mini mit PIR.
Der PIR ändert auch seinen Status laut Serieller Monitor.
WLAN Verbindung steht. Eine Variable Bewegung wurde in der CCU angelegt doch leider ändert sich der Status der Variable
bei Bewegung nicht.
Auf meiner CCU ist die Firmwareversion -> 2.35.16.20180826

Verwendet wurde dieser "Code"

Code: Alles auswählen

/*
 *  WeMos-Schaltaktor (Prototyp)
 *  
 *  verbindet sich mit dem vorhandenen WLAN als Server
 *  Steuerung über HTTP-Befehle:
 *     "<IP-Adresse>" gibt eine Status- und Befehlsübersicht aus
 *     "<IP-Adresse>/aus" schaltet das Relais aus
 *     "<IP-Adresse>/ein" schaltet das Relais ein
 *     "<IP-Adresse>/status" gibt den Schaltzustand des Relais als Logikwert ("ein" oder "aus") zurück
 *
 *  Getesteter Aufbau:
 *     WeMos D1 mini
 *     Relay Shield mini
 *     Pin-Belegung:
 *        D1: Steuerleitung Relais
 *
 *  31.Januar 2016 —m.yoda
 */

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.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

ESP8266WebServer server(80); // Webserver initialisieren auf Port 80
String antwort = "";

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 wurzel_behandlung() { // bei Aufruf des Root-Verzeichnisses
  String temp = zeitstempel();
  antwort = "WeMos Schaltaktor\n\n";
  if (digitalRead(D1) == HIGH)
    antwort = antwort + "Status: eingeschaltet\n";
  else
    antwort = antwort + "Status: ausgeschaltet\n";
  antwort = antwort + "Betriebszeit: " + temp + " (Std:Min:Sek)\n";
  antwort = antwort + "Verbunden mit: " + ssid + "\n";
  int rssi = WiFi.RSSI();
  antwort = antwort + "Signalstaerke: " + String(rssi) + " dBm\n\n";
  antwort = antwort + "HTTP-Befehlsuebersicht:\n";
  antwort = antwort + "\"<IP-Adresse>/aus\" schaltet das Relais aus\n";
  antwort = antwort + "\"<IP-Adresse>/ein\" schaltet das Relais ein\n";
  antwort = antwort + "\"<IP-Adresse>/status\" gibt den Schaltzustand des\n  Relais als Logikwert (\"ein\" oder \"aus\") zurueck\n";
  server.send(300, "text/plain", antwort);
  delay(150);
  Serial.println(temp + " unspezifische HTTP-Anfrage");
}

void mach_an() {
  pinMode(D1, OUTPUT);
  digitalWrite(D1, HIGH);
  server.send(200, "text/plain", "WeMos-Schaltaktor ist eingeschaltet");
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP eingeschaltet");
}

void mach_aus() {
  pinMode(D1, OUTPUT);
  digitalWrite(D1, LOW);
  server.send(200, "text/plain", "WeMos-Schaltaktor ist ausgeschaltet");
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP ausgeschaltet");
}

void melde_status() {
  String temp = zeitstempel();
  if (digitalRead(D1) == HIGH)
    antwort = "ein";
  else
    antwort = "aus";
  server.send(200, "text/plain", antwort);
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP Status gemeldet");
}

void setup() {
  pinMode(D1, OUTPUT); // Relais-Pin als Ausgang setzen
  
  // Seriellen Monitor für Kontrollausgaben öffnen
  Serial.begin(9600);
  Serial.println("");
  Serial.println("WeMos-Schaltaktor");
  
  // 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("/ein", mach_an);
  server.on("/aus", mach_aus);
  server.on("/status", melde_status);
  
  // HTTP-Server starten
  server.begin();
  Serial.println(zeitstempel() + " HTTP-Server gestartet");
}

void loop() {
  server.handleClient(); // auf HTTP-Anfragen warten
}
Habt ihr eine idee?

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 » 11.09.2018, 17:38

Das scheint der Sketch für einen Aktor zu sein, nicht für einen Sensor.

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 » 11.09.2018, 17:47

ist es ..

--- >> pinMode(D1, OUTPUT); // Relais-Pin als Ausgang setzen
-------
!!! 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.

jp112sdl
Beiträge: 12108
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2148 Mal
Kontaktdaten:

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

Beitrag von jp112sdl » 11.09.2018, 17:48


VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

bibo09
Beiträge: 165
Registriert: 30.03.2015, 17:34

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

Beitrag von bibo09 » 12.09.2018, 06:24

Ok Danke

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 » 10.10.2018, 18:12

Hallo zusammen, möchte jemand hohe Temperaturen messen?

Ist ja ganz schön Lang geworden seit ich das letzte mal hier war :shock:

Auf jeden fall habe ich um die Abgastemperatur meines Kaminofens messen
zu können einen Sensor gesucht der mehr verträgt als die üblichen Sensoren.. NTC, ds18b20 usw..

Deswegen habe ich mir einen Scetch abgeändert um ein
MAX6675 Modul mit Passendem K Typ Sensor verwenden zu können.
Mein gewählter Sensor ist angegeben bis 800C°
optimal,, weil ich mir schon 2 teure ntc bis 280 Weggebruzelt hatte in der Anzünd fase :lol:

Da das gerät bei mir am Dachboden baumelt übertrage ich die Empfangs stärke gleich mit...
Das hab ich mittlerweile bei fast allen nachgerüstet...

wie sonst auch ..
messung einstellbar alle XX sec.
Delta einstellbar für beide Werte ( egal welches auslöst, es werden beide werte übertragen )
Zwangsübermittlung einstellbar alle XXX sec.
Name der Variablen auf der CCU einstellbar..

Da es für den Wemos keine Passende Lib gibt muss die von Adafruit etwas verändert werden..
die Datei max6675.cpp mit zb. Nodepad++ öffnen
und von
Bild

auf das ändern,, bzw, auskommentieren,, mehr ist es nicht..
Bild


Vielleicht kann das ja noch jemand brauchen,
viel Spaß damit :mrgreen:

mfg. Flo

Code: Alles auswählen

/*
 *  WeMos MAX6675  Ofen Abgastemp messen
 *  
 *  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
 *     MAX6675 Sensormodul mit passendem Sensor bis 800C
 *  */

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

#include "max6675.h"   //   MAX6675


// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid = "xxxxxxxxxxxxx"; // SSID des vorhandenen WLANs
const char* password = "xxxxxxxxxxx"; // 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 = "xxxxxxxxxxxxxxx"; // IP-Adresse der CCU
ESP8266WebServer server(80); // Webserver initialisieren auf Port 80


                    
unsigned long deltaMessungSekunden = 15; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt

//**********************************************************************
         //   MAX6675          MAX6675,
// hier sind einzutragen welche Pins für den MAX Verwendet werden sollen
int thermoDO = 12;   //ist D5 - SCK   --> auf MAX6675
int thermoCS = 13;   //ist  D6 - SO   --> auf MAX6675
int thermoCLK = 14;  //ist D7 - CS  --> auf MAX6675


//********************************************************************************************* 

// ******* Einstellungen fuer Meldungen an die CCU, bitte anpassen! *******
String max1 = "W5max6675" ; // Name der Var. auf der ccu  Temperatur des MAX6675
String rssi1 = "W5rssi" ; // Name der Var. auf der ccu   WLAN Signal dBm

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

float deltaMax = 1;   // max6675 aenderung) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)      //---eingefügt
float deltaRSSI = 1;  // rssi aenderung

float thermo_C = 0, maxWert = 0, rssiWert = 0, rssi = 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
  //*****************************************************************
                                 //MAX6675    

 MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); 
         thermo_C = thermocouple.readCelsius()  -0.1 ;   // Sensor Lesen und Korrekturwert

         letzteMessungMillis = jetztMillis;
Serial.print(" Temperatur = ");
Serial.print(thermo_C);
Serial.println(" C ");


 {
 rssi = WiFi.RSSI();

// letzteMessungMillis = jetztMillis;
  Serial.print(" Signalstärke = ");
     Serial.print(rssi);
      Serial.println(" dBm    ");
      
}
 } 
  //***************************************************************************************************
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('" + max1 + "').State('" + thermo_C + "')"
        "&antwort2=dom.GetObject('" + rssi1 + "').State('" + rssi + "')";
   

  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

   rssiWert = rssi;
   maxWert = thermo_C;
  
  }   


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 MAX6675 Sensor");
  
  // 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("/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 rssi aenderung den Schwellwert erreicht
  if(!deltaRSSI == 0 && abs(rssi - rssiWert) >= deltaRSSI) { // Neue Meldung wg. Analog aenderung?
    Serial.print(zeitstempel() + "  RSSI aenderung: "); 
    melde_CCU();
  } 
   // neue Meldung an die CCU falls MAX6675 aenderung den Schwellwert erreicht
  if(!deltaMax == 0 && abs(thermo_C - maxWert) >= deltaMax) { // Neue Meldung wg. MAX6675 aenderung?
    Serial.print(zeitstempel() + "  MAX6675 aenderung: "); 
    melde_CCU();
  }
    
}
Dateianhänge
nachher_grande.png
nachher_grande.png (6.36 KiB) 2379 mal betrachtet
vorher_grande.png
vorher_grande.png (8.62 KiB) 2379 mal betrachtet

Tequilamixer
Beiträge: 14
Registriert: 05.05.2017, 09:53

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

Beitrag von Tequilamixer » 26.10.2018, 11:06

Hallo,

ich bin seit Stunden im Internet auf der Suche und komme nicht so recht weiter. Ich hoffe, ihr könnt mit hier weiterhelfen!

Ich sende mit mehreren Wemos D1 mini Werte an meine CCU, dort werden diese mit CUxD gespeichert. Klappt soweit wunderbar.

Nun möchte ich mit einem anderen Wemos diese Werte auslesen. Die Anfrage dazu funktioniert im Browser wunderbar:
http://<IP der CCU>/addons/xmlapi/state.cgi?datapoint_id=7301

Also Antwort kommt:
<state><datapoint ise_id="7301" value="99.900000"/></state>

Nun benötige ich diesen "value" aber als Variable im Wemos. Dazu müsste ich die Antwort der CCU einlesen und den Wert nach "value" rausfiltern und in eine Variable schreiben.

Wie macht man sowas?????

1000 Dank im Voraus.
Thomas

jp112sdl
Beiträge: 12108
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2148 Mal
Kontaktdaten:

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

Beitrag von jp112sdl » 26.10.2018, 20:22

Tequilamixer hat geschrieben:
26.10.2018, 11:06
Wie macht man sowas?????
Mit indexOf und substring.
Schau dir mal diese Funktion an, da hole ich auch Daten von der CCU (jedoch ohne XML-API).

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Antworten

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