WEMOS D1 Mini mit ESP Easy an Homematic?

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

Moderator: Co-Administratoren

lctv
Beiträge: 59
Registriert: 17.03.2015, 18:42

WEMOS D1 Mini mit ESP Easy an Homematic?

Beitrag von lctv » 19.02.2017, 14:37

Hatte meine Frage schon einmal im anderen WEMOS-Therad gestellt. Es gab auch zwei Antworten, aber in dem Thread gehts ja nicht um die WEMOS mit ESP Easy und ich möchte den Thread dort nicht mit meinen speziellen Fragen verwässern.

Hab seit einiger Zeit
- Wemos D1 mini
- mit dem DHT22 shield
- und ESP Easy ( http://www.letscontrolit.com/wiki/index.php/ESPEasy )
als Spielerei laufen.

Läuft soweit. Schau da per Browser gelegentlich mal nach Temp/Feuchtigkeit.

Jetzt lese ich von der Verwendung mit der Homematic.

Der kleine WEMOS sendet die Daten dank ESP Easy in definierbaren Intervallen. Man kann IP etc. pp. und Port des Servers, wo sie hin sollen (empfangen werden sollen) einstellen.

Protokoll ist derzeit Generic http.

a) Kann ich die Daten mit der CCU2 empfangen? In Sysvar schreiben? Was müsste ich das einstellen?

b) Oder muss ich die Daten abfragen? Über CuxD Gerät anlegen (welches)? Hab ich schon als Wandthermostat versucht, aber es kommt nix an.

c) Ich würde gern eine einfache Überwachung "Stromausfall" haben. Bei mir hängt CCU, Router, etc. pp. alles an einer USV. Würde also einen von den Wemos vor der USV per Netzteil anschließen und anpingen. Mache ich zur Anwesenheitsüberwachung per smartphone auch und das läuft gut. Also einfach den Wemos über CuxD anlegen wie das smartphone und anpingen. Strom weg -> 5mal keine Antwort auf ping -> Mail "Stromausfall"?

Man merkt vielleicht, dass ich davon keinen rechten Plan habe.

Über Tips würde ich mich daher besonders freuen.

dondaik
Beiträge: 10403
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 97 Mal
Danksagung erhalten: 29 Mal

Re: WEMOS D1 Mini mit ESP Easy an Homematic?

Beitrag von dondaik » 19.02.2017, 14:55

du kannst daten sowohl in eine SV schreiben oder an ein cuxd-gerät senden.
beide wege ins im wemos-d1 thema beschrieben , der SV weg auch im wiki zum wemos. zum direkten schreiben an an cuxd-gerät hat klassisch mal ein extra thema aufgemacht.
wie das ganze aber in esp-easy umgesetzt wird ... k.a. ein wemos ist zwar mit esp easy "blockiert" doch: zeitmangel :-(
doch "stromausfall" erkennen geht glaube ich einfacher... da sind etliche theman vorhanden. kann nicht mal sagen ob der esp8266 auf einen ping antwortet.. noch nie probiert .... getestet, er antwortet :-)
-------
wer schreibfehler findet darf sie behalten.

kafisc
Beiträge: 78
Registriert: 08.09.2015, 15:14
Hat sich bedankt: 2 Mal

Re: WEMOS D1 Mini mit ESP Easy an Homematic?

Beitrag von kafisc » 15.04.2017, 13:02

lctv hat geschrieben:Hatte meine Frage schon einmal im anderen WEMOS-Therad gestellt. Es gab auch zwei Antworten, aber in dem Thread gehts ja nicht um die WEMOS mit ESP Easy und ich möchte den Thread dort nicht mit meinen speziellen Fragen verwässern.

Hab seit einiger Zeit
- Wemos D1 mini
- mit dem DHT22 shield
- und ESP Easy ( http://www.letscontrolit.com/wiki/index.php/ESPEasy )
als Spielerei laufen.

Läuft soweit. Schau da per Browser gelegentlich mal nach Temp/Feuchtigkeit.

Jetzt lese ich von der Verwendung mit der Homematic.

Der kleine WEMOS sendet die Daten dank ESP Easy in definierbaren Intervallen. Man kann IP etc. pp. und Port des Servers, wo sie hin sollen (empfangen werden sollen) einstellen.

Protokoll ist derzeit Generic http.

a) Kann ich die Daten mit der CCU2 empfangen? In Sysvar schreiben? Was müsste ich das einstellen?

b) Oder muss ich die Daten abfragen? Über CuxD Gerät anlegen (welches)? Hab ich schon als Wandthermostat versucht, aber es kommt nix an.

c) Ich würde gern eine einfache Überwachung "Stromausfall" haben. Bei mir hängt CCU, Router, etc. pp. alles an einer USV. Würde also einen von den Wemos vor der USV per Netzteil anschließen und anpingen. Mache ich zur Anwesenheitsüberwachung per smartphone auch und das läuft gut. Also einfach den Wemos über CuxD anlegen wie das smartphone und anpingen. Strom weg -> 5mal keine Antwort auf ping -> Mail "Stromausfall"?

Man merkt vielleicht, dass ich davon keinen rechten Plan habe.

Über Tips würde ich mich daher besonders freuen.
Hi zusammen,

ich nutze ebenfalls einen WeMos D1 Mini mit einem Relay-Shield, einem Taster und espeasy r147 und würde gerne bei einem Tastendruck den aktuellen Zustand an die CCU übergeben.
Bis auf die Übergabe an die CCU funktioniert mein Vorhaben wunderbar.
Bild

Rules

Code: Alles auswählen

on PUMP#Key do
 if [PUMP#Relay]=1
   gpio,5,0
 else
   gpio,5,1
 endif
endon

on PUMP#Relay do
 if [PUMP#Relay]=1 
   wget http://192.168.1.18/addons/xmlapi/statechange.cgi?ise_id=5621&new_value=true
 else
   wget http://192.168.1.18/addons/xmlapi/statechange.cgi?ise_id=5621&new_value=false
 endif
endon
Log

Code: Alles auswählen

838852 : SW : State 0
838853 : EVENT: PUMP#Key=0.00
838859 : ACT : gpio,5,1
838859 : SW : GPIO 5 Set to 1
845184 : HTTP : connection failed
Für Hinweise wäre ich sehr dankbar!
Vielen Dank im Voraus & viele Grüße
kafisc

dondaik
Beiträge: 10403
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 97 Mal
Danksagung erhalten: 29 Mal

Re: WEMOS D1 Mini mit ESP Easy an Homematic?

Beitrag von dondaik » 15.04.2017, 16:25

esp-easy liegt hier immer noch ....
doch warum machst du das nicht mit den sketschen von klassisch? - er hat doch die übergabe beschrieben.
"stromausfall!" würde ich über spezielle relais machen. ( die kommen einfach in den stromkreis und zeigen halt bei spannungsausfall dieses per potentialfreien kontakt an.. )
-------
wer schreibfehler findet darf sie behalten.

kafisc
Beiträge: 78
Registriert: 08.09.2015, 15:14
Hat sich bedankt: 2 Mal

Re: WEMOS D1 Mini mit ESP Easy an Homematic?

Beitrag von kafisc » 17.04.2017, 12:40

dondaik hat geschrieben:esp-easy liegt hier immer noch ....
doch warum machst du das nicht mit den sketschen von klassisch? - er hat doch die übergabe beschrieben.
"stromausfall!" würde ich über spezielle relais machen. ( die kommen einfach in den stromkreis und zeigen halt bei spannungsausfall dieses per potentialfreien kontakt an.. )
Vielen Dank für die Rückmeldung. Das ist eigentlich die beste Idee!
Ich habe das mal entsprechend umgesetzt/zusammen kopiert. Allerdings habe ich noch 1 kleines Problem. Die LED (gpio13Led) ist beim Start des Sonoffs eingeschaltet. Sie schaltet dann aber anschließend sauber mit allen weiteren Schaltvorgängen mit.
Nun würde ich die LED gerne beim Start ausgeschaltet lassen (gleicher Zustand wie das Relais). Hast du mir hierfür einen Tipp?

Code: Alles auswählen

/*
*  WeMos-Schaltaktor (mit Status-Meldung an CUxD und Taster-Support)
*
*  Getesteter Aufbau:
*     WeMos D1 mini
*     relais Shield mini
*     Pin-Belegung:
*     gpio12: relais
*     gpio0: Taster 
*     gpio13: Led 
*/

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


// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid     = "*****"; // SSID des vorhandenen WLANs
const char* password = "******"; // Passwort für das vorhandene WLAN
const char* host = "192.168.1.18"; // IP-Adresse der CCU  
IPAddress ip(192,168,1,237); // feste IP-Adresse für den WeMos
IPAddress dns_ip(192,168,1,1); // Adresse des DNS servers
IPAddress gateway(192,168,1,1); // IP-Adresse des WLAN-Gateways
IPAddress subnet(255,255,255,0);  // Subnetzmaske

// ******* Einstellungen für CUxD, bitte anpassen! *******
String transmit_state_R1 = "ja"; // ja/nein
String CUxD_Geraet = "CUX2801002:1"; // SN:Kanal
 
// Definition der Ports ....
const int gpio12relais = 12 ;
const int gpio0Taster = 0 ; 
const int gpio13Led = 13 ; 


 
 
 
// ab hier muß eigentlich nichts mehr geändert werden.....
 
// ******* Einstellungen HTML *******
String HTML_title = "Funksteckdose Beleuchtung Bett - SZ";
String HTML_background_color = "0D4C75"; //0D4C75
String HTML_title_color = "C9C9C9"; //9A916C
String HTML_text_color = "FFFFFF";
String HTML_color1 = "CECECE";
String HTML_color2 = "9A916C";



ESP8266WebServer server(80); // Webserver initialisieren auf Port 80
//WiFiServer server2(80);

String Version = "1.0";
String Status = "0";
String Status_alt = "0";
String Status_Aenderung = "nein";
String Taster = "unbekannt";
String action = "0";
String transmit_state = "ja";


String HTML_head = "<h2><font color='#" + HTML_title_color +"'>" + HTML_title + "</font></h2>";
String HTML_end = "</body></html>";
String HTML_style = "style='background-color: #" + HTML_background_color +"; color: #" + HTML_text_color +";' alink='#" + HTML_color2 +"' link='#" + HTML_color1 +"' vlink='#" + HTML_color1 +"'";

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 status_aktuallisieren(){
  if (digitalRead(gpio12relais) == HIGH) {Status = "1";}
  if (digitalRead(gpio12relais) == LOW) {Status = "0";}
}


void set_CUxD() {
  String meldung = "";
  WiFiClient client; // Webclient initialisieren
  if (!client.connect(host, 8181)) { // mit dem CCU-Port 8181 verbinden
    Serial.println(" Fehler: Verbindung zur CCU konnte nicht aufgebaut werden");
    delay(50);
    return;
  }
  meldung = meldung +"GET /WeMos.exe?state=dom.GetObject('CUxD." + CUxD_Geraet + ".SET_STATE').State('" + Status + "')";
  client.println(meldung); // Daten an CCU melden
}
 
  
void root() { // bei Aufruf des Root-Verzeichnisses
  String HTML_content = "";
  String button_text = "null";
  String button_color = "FFD06E";
  String button = "<span style='margin-left: 10px; background-color: #" + button_color +"; color: #000; display: inline-block; padding: 2px 10px; font-weight: bold; border: 2px solid #4f4f4f; border-radius: 2px; text-decoration: none;'>" + button_text +"</span>";
  String HTML_start = "<html><head><meta http-equiv='refresh' content='3'><meta name='theme-color' content='#" + HTML_background_color +"'><title>" + HTML_title + "</title></head><body " + HTML_style + ">";
  String temp = zeitstempel();
  String WeMos_ip = WiFi.localIP().toString();  
  HTML_content = HTML_start + HTML_head;
  if (digitalRead(gpio12relais) == HIGH) {
  button_text = "eingeschalten";
  button_color = "70E670";
  button = "<span style='margin-left: 10px; background-color: #" + button_color +"; color: #000; display: inline-block; padding: 2px 10px; font-weight: bold; border: 2px solid #4f4f4f; border-radius: 2px; text-decoration: none;'>" + button_text +"</span>";
  HTML_content = HTML_content + "<strong>Status: <a target='answer_wemos' href='http://" + WeMos_ip + "/cmd?R1=0'>" + button +"</a></strong><br><br>";
  }
  else {
  button_text = "ausgeschalten";
  button_color = "A8A8A8";
  button = "<span style='margin-left: 10px; background-color: #" + button_color +"; color: #000; display: inline-block; padding: 2px 10px; font-weight: bold; border: 2px solid #4f4f4f; border-radius: 2px; text-decoration: none;'>" + button_text +"</span>";
  HTML_content = HTML_content + "<strong>Status: <a target='answer_wemos' href='http://" + WeMos_ip + "/cmd?R1=1'>" + button +"</a></strong><br><br>";
  }
  HTML_content = HTML_content + "Betriebszeit: <font color='#" + HTML_color2 +"'><em>" + temp + " (Std:Min:Sek)</em></font><br>";
  HTML_content = HTML_content + "Verbunden mit: <font color='#" + HTML_color2 +"'><em>" + ssid + "</em></font><br>";
  int rssi = WiFi.RSSI();
  HTML_content = HTML_content + "Signalstaerke: <font color='#" + HTML_color2 +"'><em>" + String(rssi) + " dBm</em></font><br><br>";
  HTML_content = HTML_content + "<strong><a href='http://" + WeMos_ip + "/help'>Hilfe</a></strong>"; 
  HTML_content = HTML_content + "<iframe name='answer_wemos' frameborder='no' height='0' width='0'>Sorry, no frames.</iframe>"; 
  server.send(300, "text/html", HTML_content + HTML_end);
  delay(150);
  Serial.println(temp + " unspezifische HTTP-Anfrage");
}

void help() {
String HTML_content = "";
String HTML_start = "<html><head><meta name='theme-color' content='#" + HTML_background_color +"'><title>" + HTML_title + "</title></head><body " + HTML_style + ">";
String WeMos_ip = WiFi.localIP().toString();  
  HTML_content = HTML_start + HTML_head;
  HTML_content = HTML_content + "<strong><font color='#" + HTML_title_color +"'>Schaltaktor mit Taster und Statusmeldung an CUxD (28)exec</font>";
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;<font color='#" + HTML_color2 +"'>Version: <em>" + Version + "</em></font></strong>";
  HTML_content = HTML_content + "<h3>Konfiguration fuer R1:</h3>";
  HTML_content = HTML_content + "<li>Status senden: <font color='#" + HTML_color2 +"'><em>" + transmit_state_R1 + "</em></font></li>";
  HTML_content = HTML_content + "<li>CUxD-Geraet: <font color='#" + HTML_color2 +"'><em>" + CUxD_Geraet + "</em></font></li>";
  HTML_content = HTML_content + "<li>Taster-Typ: <font color='#" + HTML_color2 +"'><em>" + Taster + "</em></font></li><br>";
  HTML_content = HTML_content + "<h3>HTTP-Befehlsuebersicht:</h3>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=0</font>\" schaltet das Relais mit Statusmeldung an CUxD aus</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=1</font>\" schaltet das Relais mit Statusmeldung an CUxD ein</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=0&transmit=0</font>\" schaltet das Relais ohne Statusmeldung an CUxD aus</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=1&transmit=0</font>\" schaltet das Relais ohne Statusmeldung an CUxD ein</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=state</font>\" gibt den Schaltzustand des Relais als Logikwert (\"0\" oder \"1\") zurueck</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?CUxD=0</font>\" Statusmeldung an CUxD bis zum reboot ausschalten</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?CUxD=1</font>\" Statusmeldung an CUxD einschalten</li><br>";
  HTML_content = HTML_content + "<h3>CUxD-Integration:</h3>";   
  HTML_content = HTML_content + "<li>Mit CUxD ein Geraet vom Typ (28)System/Exec/Schalter erstellen</li>";  
  HTML_content = HTML_content + "<li>In der CCU im Posteingang konfigurieren:<br>"; 
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;SWITCH|CMD_SHORT: <font color='#" + HTML_color1 +"'>/usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R1-0\'</font><br>"; 
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;SWITCH|CMD_LONG: <font color='#" + HTML_color1 +"'>/usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R1-1\'</font><br></li>"; 
  HTML_content = HTML_content + "<br><strong><a href='http://" + WeMos_ip + "'>zurueck</a></strong>";
  HTML_content = HTML_content + "<br><strong>""</strong>";
  server.send(300, "text/html", HTML_content + HTML_end);
}

void turn_on() {
  digitalWrite(gpio12relais, HIGH);
  digitalWrite(gpio13Led, LOW); 
  
}

void turn_off() {
  digitalWrite(gpio12relais, LOW);
  digitalWrite(gpio13Led, HIGH);
  
}

void action_1() { //keinen status senden
  String aktor_status = "unbekannt";
  if (action == "1") {turn_on(); aktor_status = "eingeschalten";}
  if (action == "0") {turn_off(); aktor_status = "ausgeschalten";}
  Status_alt = action;
  status_aktuallisieren();
  server.send(200, "text/plain", "WeMos-Schaltaktor ist "+ aktor_status +", keine Meldung an CUxD");
}

void action_2() { //status senden
  String aktor_status = "unbekannt";
  if (action == "1") {turn_on(); aktor_status = "eingeschalten";}
  if (action == "0") {turn_off(); aktor_status = "ausgeschalten";}
  Status_alt = action;
  status_aktuallisieren();
  if (transmit_state == "ja") {set_CUxD();}
  server.send(200, "text/plain", "WeMos-Schaltaktor ist "+ aktor_status +", Meldung an CUxD");
}

void get_state() {
  String temp = zeitstempel();
  status_aktuallisieren();
  server.send(200, "text/plain", Status);
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP Status gemeldet");
}
void get_state_CCU() {
  String CCU_state = "null";
  String temp = zeitstempel();
  status_aktuallisieren();
  if (Status == "0") {CCU_state = "<state>false</state>";} else {CCU_state = "<state>true</state>";}
  server.send(200, "text/plain", CCU_state);
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP Status gemeldet");
}

void setup() {
  pinMode(gpio12relais, OUTPUT); // Relais-Pin als Ausgang setzen
  pinMode(gpio0Taster, INPUT_PULLUP); // Taster zum schalten
  pinMode(gpio13Led, OUTPUT); // Led

  // Seriellen Monitor für Kontrollausgaben öffnen
  Serial.begin(115200);
  Serial.println("");
  Serial.println("WeMos-Schaltaktor");





  // WLAN-Verbindung herstellen
  WiFi.config(ip, dns_ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
  WiFi.softAPdisconnect(true);
   WiFi.begin(ssid, password);
  Serial.print("Verbindungsaufbau");

  // Verbindungsaufbau abwarten
  byte maxwait = 30;
  while ( (WiFi.status() != WL_CONNECTED) && (maxwait > 0) ) {
    delay(500);
    maxwait--;
    Serial.print(".");
    }
  if (WiFi.status() != WL_CONNECTED) {Serial.println("keine Verbindung");}
  else{
    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("");
    }








    server.on("/", root);
  server.on("/R1-1", [](){action = "1"; action_1();});
  server.on("/R1-0", [](){action = "0"; action_1();});
    server.on("/cmd", cmd);
    server.on("/help", help);

  // HTTP-Server starten
  server.begin();
  Serial.println(zeitstempel() + " HTTP-Server gestartet");
  if (transmit_state == "ja") {set_CUxD();} 
  int sensorVal = digitalRead(gpio0Taster);
  Serial.println(sensorVal);
  if (sensorVal == HIGH) {Taster = "schliesser";} else {Taster = "oeffner";}

  
}



void cmd() { // bei Aufruf von "../cmd"  R1%3D0 R1%3D1

  String CUxD = server.arg("CUxD");
  String R1 = server.arg("R1");
  String transmit = server.arg("transmit");

  if (R1 == "0" && transmit == "0") {action = "0"; action_1();}
  else if (R1 == "1" && transmit == "0") {action = "1"; action_1();}
  else if ( (R1 == "0" && transmit == "1") || (R1 == "0") ) {action = "0"; action_2();}
  else if ( (R1 == "1" && transmit == "1") || (R1 == "1") ) {action = "1"; action_2();} 
  else if (R1 == "state") {get_state();}
  else if (CUxD == "1") {transmit_state_R1 = "ja";}
  else if (CUxD == "0") {transmit_state_R1 = "nein";}
  else {
   help();
        delay(100);
        Serial.println(zeitstempel() + " Help");
  }
}

void oeffner(){
  int sensorVal = digitalRead(gpio0Taster);
  Serial.println(sensorVal);
  if (sensorVal == HIGH && Status == "0") {turn_on(); delay(100);}
  if (sensorVal == HIGH && Status == "1") {turn_off(); delay(100);}
  if (sensorVal == LOW) {
    status_aktuallisieren();
    if (Status_alt != Status) {Status_alt = Status; Status_Aenderung = "ja";} else Status_Aenderung = "nein";
    if (transmit_state == "ja" && Status_Aenderung == "ja") {set_CUxD();}
  }
}
   
void schliesser(){
  int sensorVal = digitalRead(gpio0Taster);
  Serial.println(sensorVal);
  if (sensorVal == LOW && Status == "0") {turn_on(); delay(100);}
  if (sensorVal == LOW && Status == "1") {turn_off(); delay(100);}
  if (sensorVal == HIGH) {
    status_aktuallisieren();
    if (Status_alt != Status) {Status_alt = Status; Status_Aenderung = "ja";} else Status_Aenderung = "nein";
    if (transmit_state == "ja" && Status_Aenderung == "ja") {set_CUxD();}
  }
}

void loop() {
    if ( (WiFi.status() != WL_CONNECTED) || (transmit_state_R1 != "ja")  ) {transmit_state = "nein";} else {transmit_state = "ja";}
  if (Taster == "oeffner") {oeffner();} 
  else if (Taster == "schliesser") {schliesser();}

  server.handleClient(); // auf HTTP-Anfragen warten

}

Danke & viele Grüße
kafisc
Zuletzt geändert von kafisc am 17.04.2017, 14:50, insgesamt 1-mal geändert.

dondaik
Beiträge: 10403
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 97 Mal
Danksagung erhalten: 29 Mal

Re: WEMOS D1 Mini mit ESP Easy an Homematic?

Beitrag von dondaik » 17.04.2017, 13:39

im setup() den port auch richtig schalten ( so bei zeile 209 ). - nicht nur das ini, könnte es sein.
-------
wer schreibfehler findet darf sie behalten.

kafisc
Beiträge: 78
Registriert: 08.09.2015, 15:14
Hat sich bedankt: 2 Mal

Sonoff Wifi an Homematic - Sketch

Beitrag von kafisc » 17.04.2017, 14:54

dondaik hat geschrieben:im setup() den port auch richtig schalten ( so bei zeile 209 ). - nicht nur das ini, könnte es sein.
Vielen Dank! Das war der Fehler...
Hier der fertige Sketch:

Code: Alles auswählen

/*
*  WeMos-Schaltaktor (mit Status-Meldung an CUxD und Taster-Support)
*
*  Getesteter Aufbau:
*     WeMos D1 mini
*     relais Shield mini
*     Pin-Belegung:
*     gpio12: relais
*     gpio0: Taster 
*     gpio13: Led 
*/

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


// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid     = "*****"; // SSID des vorhandenen WLANs
const char* password = "******"; // Passwort für das vorhandene WLAN
const char* host = "192.168.1.18"; // IP-Adresse der CCU  

IPAddress ip(192,168,1,237); // feste IP-Adresse für den WeMos
IPAddress gateway(192,168,1,1); // IP-Adresse des WLAN-Gateways
IPAddress subnet(255,255,255,0);  // Subnetzmaske

// ******* Einstellungen für CUxD, bitte anpassen! *******
String transmit_state_R1 = "ja"; // ja/nein
String CUxD_Geraet = "CUX2801002:1"; // SN:Kanal
 
// Definition der Ports ....
const int gpio12relais = 12 ;
const int gpio0Taster = 0 ; 
const int gpio13Led = 13 ; 


 
 
 
// ab hier muß eigentlich nichts mehr geändert werden.....
 
// ******* Einstellungen HTML *******
String HTML_title = "Funksteckdose Beleuchtung Bett - SZ";
String HTML_background_color = "0D4C75"; //0D4C75
String HTML_title_color = "C9C9C9"; //9A916C
String HTML_text_color = "FFFFFF";
String HTML_color1 = "CECECE";
String HTML_color2 = "9A916C";



ESP8266WebServer server(80); // Webserver initialisieren auf Port 80
//WiFiServer server2(80);

String Version = "1.0";
String Status = "0";
String Status_alt = "0";
String Status_Aenderung = "nein";
String Taster = "unbekannt";
String action = "0";
String transmit_state = "ja";


String HTML_head = "<h2><font color='#" + HTML_title_color +"'>" + HTML_title + "</font></h2>";
String HTML_end = "</body></html>";
String HTML_style = "style='background-color: #" + HTML_background_color +"; color: #" + HTML_text_color +";' alink='#" + HTML_color2 +"' link='#" + HTML_color1 +"' vlink='#" + HTML_color1 +"'";

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 status_aktuallisieren(){
  if (digitalRead(gpio12relais) == HIGH) {Status = "1";}
  if (digitalRead(gpio12relais) == LOW) {Status = "0";}
}


void set_CUxD() {
  String meldung = "";
  WiFiClient client; // Webclient initialisieren
  if (!client.connect(host, 8181)) { // mit dem CCU-Port 8181 verbinden
    Serial.println(" Fehler: Verbindung zur CCU konnte nicht aufgebaut werden");
    delay(50);
    return;
  }
  meldung = meldung +"GET /WeMos.exe?state=dom.GetObject('CUxD." + CUxD_Geraet + ".SET_STATE').State('" + Status + "')";
  client.println(meldung); // Daten an CCU melden
}
 
  
void root() { // bei Aufruf des Root-Verzeichnisses
  String HTML_content = "";
  String button_text = "null";
  String button_color = "FFD06E";
  String button = "<span style='margin-left: 10px; background-color: #" + button_color +"; color: #000; display: inline-block; padding: 2px 10px; font-weight: bold; border: 2px solid #4f4f4f; border-radius: 2px; text-decoration: none;'>" + button_text +"</span>";
  String HTML_start = "<html><head><meta http-equiv='refresh' content='3'><meta name='theme-color' content='#" + HTML_background_color +"'><title>" + HTML_title + "</title></head><body " + HTML_style + ">";
  String temp = zeitstempel();
  String WeMos_ip = WiFi.localIP().toString();  
  HTML_content = HTML_start + HTML_head;
  if (digitalRead(gpio12relais) == HIGH) {
  button_text = "eingeschalten";
  button_color = "70E670";
  button = "<span style='margin-left: 10px; background-color: #" + button_color +"; color: #000; display: inline-block; padding: 2px 10px; font-weight: bold; border: 2px solid #4f4f4f; border-radius: 2px; text-decoration: none;'>" + button_text +"</span>";
  HTML_content = HTML_content + "<strong>Status: <a target='answer_wemos' href='http://" + WeMos_ip + "/cmd?R1=0'>" + button +"</a></strong><br><br>";
  }
  else {
  button_text = "ausgeschalten";
  button_color = "A8A8A8";
  button = "<span style='margin-left: 10px; background-color: #" + button_color +"; color: #000; display: inline-block; padding: 2px 10px; font-weight: bold; border: 2px solid #4f4f4f; border-radius: 2px; text-decoration: none;'>" + button_text +"</span>";
  HTML_content = HTML_content + "<strong>Status: <a target='answer_wemos' href='http://" + WeMos_ip + "/cmd?R1=1'>" + button +"</a></strong><br><br>";
  }
  HTML_content = HTML_content + "Betriebszeit: <font color='#" + HTML_color2 +"'><em>" + temp + " (Std:Min:Sek)</em></font><br>";
  HTML_content = HTML_content + "Verbunden mit: <font color='#" + HTML_color2 +"'><em>" + ssid + "</em></font><br>";
  int rssi = WiFi.RSSI();
  HTML_content = HTML_content + "Signalstaerke: <font color='#" + HTML_color2 +"'><em>" + String(rssi) + " dBm</em></font><br><br>";
  HTML_content = HTML_content + "<strong><a href='http://" + WeMos_ip + "/help'>Hilfe</a></strong>"; 
  HTML_content = HTML_content + "<iframe name='answer_wemos' frameborder='no' height='0' width='0'>Sorry, no frames.</iframe>"; 
  server.send(300, "text/html", HTML_content + HTML_end);
  delay(150);
  Serial.println(temp + " unspezifische HTTP-Anfrage");
}

void help() {
String HTML_content = "";
String HTML_start = "<html><head><meta name='theme-color' content='#" + HTML_background_color +"'><title>" + HTML_title + "</title></head><body " + HTML_style + ">";
String WeMos_ip = WiFi.localIP().toString();  
  HTML_content = HTML_start + HTML_head;
  HTML_content = HTML_content + "<strong><font color='#" + HTML_title_color +"'>Schaltaktor mit Taster und Statusmeldung an CUxD (28)exec</font>";
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;<font color='#" + HTML_color2 +"'>Version: <em>" + Version + "</em></font></strong>";
  HTML_content = HTML_content + "<h3>Konfiguration fuer R1:</h3>";
  HTML_content = HTML_content + "<li>Status senden: <font color='#" + HTML_color2 +"'><em>" + transmit_state_R1 + "</em></font></li>";
  HTML_content = HTML_content + "<li>CUxD-Geraet: <font color='#" + HTML_color2 +"'><em>" + CUxD_Geraet + "</em></font></li>";
  HTML_content = HTML_content + "<li>Taster-Typ: <font color='#" + HTML_color2 +"'><em>" + Taster + "</em></font></li><br>";
  HTML_content = HTML_content + "<h3>HTTP-Befehlsuebersicht:</h3>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=0</font>\" schaltet das Relais mit Statusmeldung an CUxD aus</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=1</font>\" schaltet das Relais mit Statusmeldung an CUxD ein</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=0&transmit=0</font>\" schaltet das Relais ohne Statusmeldung an CUxD aus</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=1&transmit=0</font>\" schaltet das Relais ohne Statusmeldung an CUxD ein</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?R1=state</font>\" gibt den Schaltzustand des Relais als Logikwert (\"0\" oder \"1\") zurueck</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?CUxD=0</font>\" Statusmeldung an CUxD bis zum reboot ausschalten</li>";
  HTML_content = HTML_content + "<li>\"<font color='#" + HTML_color1 +"'>http://" + WeMos_ip + "/cmd?CUxD=1</font>\" Statusmeldung an CUxD einschalten</li><br>";
  HTML_content = HTML_content + "<h3>CUxD-Integration:</h3>";   
  HTML_content = HTML_content + "<li>Mit CUxD ein Geraet vom Typ (28)System/Exec/Schalter erstellen</li>";  
  HTML_content = HTML_content + "<li>In der CCU im Posteingang konfigurieren:<br>"; 
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;SWITCH|CMD_SHORT: <font color='#" + HTML_color1 +"'>/usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R1-0\'</font><br>"; 
  HTML_content = HTML_content + "&nbsp;&nbsp;&nbsp;SWITCH|CMD_LONG: <font color='#" + HTML_color1 +"'>/usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R1-1\'</font><br></li>"; 
  HTML_content = HTML_content + "<br><strong><a href='http://" + WeMos_ip + "'>zurueck</a></strong>";
  HTML_content = HTML_content + "<br><strong>""</strong>";
  server.send(300, "text/html", HTML_content + HTML_end);
}

void turn_on() {
  digitalWrite(gpio12relais, HIGH);
  digitalWrite(gpio13Led, LOW); 
  
}

void turn_off() {
  digitalWrite(gpio12relais, LOW);
  digitalWrite(gpio13Led, HIGH);
  
}

void action_1() { //keinen status senden
  String aktor_status = "unbekannt";
  if (action == "1") {turn_on(); aktor_status = "eingeschalten";}
  if (action == "0") {turn_off(); aktor_status = "ausgeschalten";}
  Status_alt = action;
  status_aktuallisieren();
  server.send(200, "text/plain", "WeMos-Schaltaktor ist "+ aktor_status +", keine Meldung an CUxD");
}

void action_2() { //status senden
  String aktor_status = "unbekannt";
  if (action == "1") {turn_on(); aktor_status = "eingeschalten";}
  if (action == "0") {turn_off(); aktor_status = "ausgeschalten";}
  Status_alt = action;
  status_aktuallisieren();
  if (transmit_state == "ja") {set_CUxD();}
  server.send(200, "text/plain", "WeMos-Schaltaktor ist "+ aktor_status +", Meldung an CUxD");
}

void get_state() {
  String temp = zeitstempel();
  status_aktuallisieren();
  server.send(200, "text/plain", Status);
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP Status gemeldet");
}
void get_state_CCU() {
  String CCU_state = "null";
  String temp = zeitstempel();
  status_aktuallisieren();
  if (Status == "0") {CCU_state = "<state>false</state>";} else {CCU_state = "<state>true</state>";}
  server.send(200, "text/plain", CCU_state);
  delay(100);
  Serial.println(zeitstempel() + " ueber HTTP Status gemeldet");
}

void setup() {
  pinMode(gpio12relais, OUTPUT); // Relais-Pin als Ausgang setzen
  pinMode(gpio0Taster, INPUT_PULLUP); // Taster zum schalten
  pinMode(gpio13Led, OUTPUT); // Led
  digitalWrite(gpio13Led, HIGH); 

  // Seriellen Monitor für Kontrollausgaben öffnen
  Serial.begin(115200);
  Serial.println("");
  Serial.println("WeMos-Schaltaktor");





  // WLAN-Verbindung herstellen
  WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
  WiFi.softAPdisconnect(true);
   WiFi.begin(ssid, password);
  Serial.print("Verbindungsaufbau");

  // Verbindungsaufbau abwarten
  byte maxwait = 30;
  while ( (WiFi.status() != WL_CONNECTED) && (maxwait > 0) ) {
    delay(500);
    maxwait--;
    Serial.print(".");
    }
  if (WiFi.status() != WL_CONNECTED) {Serial.println("keine Verbindung");}
  else{
    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("");
    }








    server.on("/", root);
  server.on("/R1-1", [](){action = "1"; action_1();});
  server.on("/R1-0", [](){action = "0"; action_1();});
    server.on("/cmd", cmd);
    server.on("/help", help);

  // HTTP-Server starten
  server.begin();
  Serial.println(zeitstempel() + " HTTP-Server gestartet");
  if (transmit_state == "ja") {set_CUxD();} 
  int sensorVal = digitalRead(gpio0Taster);
  Serial.println(sensorVal);
  if (sensorVal == HIGH) {Taster = "schliesser";} else {Taster = "oeffner";}

  
}



void cmd() { // bei Aufruf von "../cmd"  R1%3D0 R1%3D1

  String CUxD = server.arg("CUxD");
  String R1 = server.arg("R1");
  String transmit = server.arg("transmit");

  if (R1 == "0" && transmit == "0") {action = "0"; action_1();}
  else if (R1 == "1" && transmit == "0") {action = "1"; action_1();}
  else if ( (R1 == "0" && transmit == "1") || (R1 == "0") ) {action = "0"; action_2();}
  else if ( (R1 == "1" && transmit == "1") || (R1 == "1") ) {action = "1"; action_2();} 
  else if (R1 == "state") {get_state();}
  else if (CUxD == "1") {transmit_state_R1 = "ja";}
  else if (CUxD == "0") {transmit_state_R1 = "nein";}
  else {
   help();
        delay(100);
        Serial.println(zeitstempel() + " Help");
  }
}

void oeffner(){
  int sensorVal = digitalRead(gpio0Taster);
  Serial.println(sensorVal);
  if (sensorVal == HIGH && Status == "0") {turn_on(); delay(100);}
  if (sensorVal == HIGH && Status == "1") {turn_off(); delay(100);}
  if (sensorVal == LOW) {
    status_aktuallisieren();
    if (Status_alt != Status) {Status_alt = Status; Status_Aenderung = "ja";} else Status_Aenderung = "nein";
    if (transmit_state == "ja" && Status_Aenderung == "ja") {set_CUxD();}
  }
}
   
void schliesser(){
  int sensorVal = digitalRead(gpio0Taster);
  Serial.println(sensorVal);
  if (sensorVal == LOW && Status == "0") {turn_on(); delay(100);}
  if (sensorVal == LOW && Status == "1") {turn_off(); delay(100);}
  if (sensorVal == HIGH) {
    status_aktuallisieren();
    if (Status_alt != Status) {Status_alt = Status; Status_Aenderung = "ja";} else Status_Aenderung = "nein";
    if (transmit_state == "ja" && Status_Aenderung == "ja") {set_CUxD();}
  }
}

void loop() {
    if ( (WiFi.status() != WL_CONNECTED) || (transmit_state_R1 != "ja")  ) {transmit_state = "nein";} else {transmit_state = "ja";}
  if (Taster == "oeffner") {oeffner();} 
  else if (Taster == "schliesser") {schliesser();}

  server.handleClient(); // auf HTTP-Anfragen warten

}


dondaik
Beiträge: 10403
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 97 Mal
Danksagung erhalten: 29 Mal

Re: WEMOS D1 Mini mit ESP Easy an Homematic?

Beitrag von dondaik » 17.04.2017, 14:59

daumen hoch ( ein symbol gibt es ja nicht :-( )
na dann zu neuen wegen, und ich schau mir das ganze mal in ruhe an. war, wie immer, was neues zu sehen ..

was soll man bei dem wetter sonst machen ... ok, eine stockwaage programmieren die im winter schon fertig sein sollte .
-------
wer schreibfehler findet darf sie behalten.

nelzon
Beiträge: 37
Registriert: 30.03.2015, 15:42

Re: WEMOS D1 Mini mit ESP Easy an Homematic?

Beitrag von nelzon » 07.08.2017, 23:03

Hallo

ich steige jetzt auch in das Thema Wemos + Homematic ein.

ich finde Easyesp perfekt für mein Vorhaben (DHT22, Ultraschallsensor, IR-Empfänger)

ich werde irgendwie nicht wirklich schlau, wie ich Werte in HM einbinden kann.

mit "Domoticz HTTP" ??

Mit der ganzen Controllergeschichte sehe ich auch nicht durch, als newbie. Das Wiki ist ja leider auch nur auf englisch, und bei solc einem komplexen Thema sehr schwer zu verstehen.

Wie macht ihr das so?

VG Nelzon

markus2121
Beiträge: 17
Registriert: 06.11.2017, 11:36

Re: WEMOS D1 Mini mit ESP Easy an Homematic?

Beitrag von markus2121 » 19.03.2018, 17:06

Hallo zusammen,

das Thema ist zwar schon nun ein Weilchen älter, aber auch ich war auf der Suche nach dem Zusammenspiel von ESP Easy und Homematic.

Und ja: ES FUNZT. Und zwar sogar ziemlich easy!!

To Do:
  • 1. In ESP Easy einen Controller vom Typ "Generic HTTP" anlegen.
  • 2. Controller IP ist die IP Eurer CCU.
  • 3. Controller Port ist 8181.
  • 4. Controller Publish (bitte unverändert eintragen, es sei denn Ihr wollt, dass noch andere ESP Variablen mit übertragen werden)

    Code: Alles auswählen

    x.exe?Antwort=dom.GetObject("%valname%").State(%value%)
Dabei ist valname der Name Eurer in ESP Easy angelegten Variablen (Bspw. Temperature) und value natürlich der dazugehörige Wert.

Die ESP Easy Variable müsst Ihr nun nur noch in der CCU mit dem gleichen Namen anlegen und schon startet die Übertragung.

Hoffe, es hilft weiter. Bei mir funzt das großartig!

Gruß

Markus

Antworten

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