NEWS
[Frage] Wemos über CUxD mit Alexa ansteuern..
-
MOD-Edit by eric2905; 03.05.2017/09:57; Betreff angepasst
Hallo,
ich habe mit Hilfe einigen Kollegen ein Wemo mit einem Relai über CUxD an die CCU angebunden. Unter IOBroker wurde ein neuer Adapter hm-rpc.1 installiert.
Die Daten vom Wemo tauchen unter Objekte auf… Mit einem Lampen-Widget lässt sich das Teil auch EIN/AUS schalten. Soweit alles in Ordnung!
Ich würde gerne den Wemo noch über die Alexa steuern können? Leider wird dieses Gerät nicht gefunden.
Habt Ihr ne Idee was man da machen kann?? Vor einiger Zeit konnte man den smartNamen ändern.... Wo war das genau???
Ich versuche mich diser Anleitung zu richten: http://www.iobroker.net/docu/?page_id=5910&lang=de
Unter State, wo auch ich den Wemo mit dem Lampenwidget schalte sehe ich Name "" Dort lässt sich etwas eintragen.
Wenn ich ein smartName eintragen möchte, kommt ein Fehler beim Speichern….
Geht es überhaupt das was ich vor habe?
{ "type": "state", "common": { "def": false, "type": "boolean", "read": true, "write": true, "role": "state", "name": "" }, "native": { "ID": "STATE", "UNIT": "", "TAB_ORDER": 3, "OPERATIONS": 7, "FLAGS": 1, "CONTROL": "SWITCH.STATE", "TYPE": "BOOL", "MIN": false, "MAX": true, "DEFAULT": false }, "_id": "hm-rpc.1.CUX2801001.1.STATE", "acl": { "object": 1638, "state": 1638 } }
1526_unbenann15t.png
1526_unbenannt16.png
1526_unbenann17t.png
1526_unbenannt18.png -
Ich würde gerne den Wemo noch über die Alexa steuern können? Leider wird dieses Gerät nicht gefunden.
Habt Ihr ne Idee was man da machen kann?? Vor einiger Zeit konnte man den smartNamen ändern…. Wo war das genau??? `
Du kannst den Datenpunkt, wenn er das richtige Format hat, über den Cloud-Adpter hinzufügen:
-
genau das war es…. :mrgreen: Danke Dir.
Jetzt bekomme ich die kleinen Wemos auch über die Alexa geschaltet. Wie geil ist das denn...
Danke DIR. Damit bekommt man ganz viele Möglichkeiten sich die Aktoren selbst zu bauen. Ich bin begeistert....
-
Kannst Du Deinen Sketch veröffentlichen?
-
selbstverständlich! :mrgreen:
Vorgehensweise:
Mit CUxD ein Geraet vom Typ (28)System/Exec/Schalter erstellen, und an der CCU im Posteingang konfigurieren.
Den erstellten CUxD Schalter wie unten konfigurieren.
SWITCH|CMD_SHORT: /usr/local/addons/cuxd/curl -s -m 5 'http://192.168.1.104/R1-0' // für AUS
SWITCH|CMD_LONG: /usr/local/addons/cuxd/curl -s -m 5 'http://192.168.1.104/R1-1' // für EIN
eigetragen. Jetzt lässt sich der Wemo schalten, und eine Statusanzeige gibt es auch!
im Sketch Netz & CUxD anpassen!
// ******* Einstellungen für CUxD, bitte anpassen! *******
String transmit_state_R1 = "ja"; // ja/nein
String CUxD_Geraet = "CUX2801001:1"; // SN:Kanal
// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid = "o2 DSL"; // SSID des vorhandenen WLANs
const char* password = "Rxxxxxxxxxxx"; // Passwort für das vorhandene WLAN
const char* host = "192.168.1.70"; // IP-Adresse der CCU
IPAddress ip(192,168,1,104); // feste IP-Adresse für den WeMos
IPAddress dns_ip(192,168,1,001); // Adresse des DNS servers
IPAddress gateway(192,168,1,001); // IP-Adresse des WLAN-Gateways
IPAddress subnet(255,255,255,0); // Subnetzmaske
und zum Schluss noch den Adapter Hm-rpc.1 im IObroker installieren und konfigurieren… Siehe Bild. Die Netzwerkeinstellungen natürlich anpassen.
/* * WeMos-Schaltaktor (mit Status-Meldung an CUxD und Taster-Support) * * Getesteter Aufbau: * WeMos D1 mini * Relay Shield mini * Pin-Belegung: * D1: Steuerleitung Relais * D2: Taster-Öffner */ #include <esp8266wifi.h> #include <esp8266webserver.h> // ******* Netzwerkeinstellungen, bitte anpassen! ******* const char* ssid = "o2 DSL"; // SSID des vorhandenen WLANs const char* password = "Rxxxxxxxxxxx"; // Passwort für das vorhandene WLAN const char* host = "192.168.1.70"; // IP-Adresse der CCU IPAddress ip(192,168,1,104); // feste IP-Adresse für den WeMos IPAddress dns_ip(192,168,1,001); // Adresse des DNS servers IPAddress gateway(192,168,1,001); // 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 = "CUX2801001:1"; // SN:Kanal // Definition der Ports .... const int relay_R1 = D1 ; const int switch_R1 = D2 ; // virtuelle CCU String virtual_CCU = "ja"; // ja/nein // ab hier muß eigentlich nichts mehr geändert werden..... // ******* Einstellungen HTML ******* String HTML_title = "WeMos Schaltaktor"; 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(8181); String Version = "1.2"; String Status = "0"; String Status_alt = "0"; String Status_Aenderung = "nein"; String Taster = "unbekannt"; String action = "0"; String transmit_state = "ja"; String HTML_head = " ## " + HTML_title + " "; String HTML_end = ""; 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(relay_R1) == HIGH) {Status = "1";} if (digitalRead(relay_R1) == 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 = "" + button_text +""; String HTML_start = "<title>" + HTML_title + "</title>"; String temp = zeitstempel(); String WeMos_ip = WiFi.localIP().toString(); HTML_content = HTML_start + HTML_head; if (digitalRead(relay_R1) == HIGH) { button_text = "eingeschalten"; button_color = "70E670"; button = "" + button_text +""; HTML_content = HTML_content + "**Status: [" + button +"](http://" + WeMos_ip + "/cmd?R1=0)** "; } else { button_text = "ausgeschalten"; button_color = "A8A8A8"; button = "" + button_text +""; HTML_content = HTML_content + "**Status: [" + button +"](http://" + WeMos_ip + "/cmd?R1=1)** "; } HTML_content = HTML_content + "Betriebszeit: _" + temp + " (Std:Min:Sek)_ "; HTML_content = HTML_content + "Verbunden mit: _" + ssid + "_ "; int rssi = WiFi.RSSI(); HTML_content = HTML_content + "Signalstaerke: _" + String(rssi) + " dBm_ "; HTML_content = HTML_content + "**[Hilfe](http://" + WeMos_ip + "/help)**"; 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); } void help() { String HTML_content = ""; String HTML_start = "<title>" + HTML_title + "</title>"; String WeMos_ip = WiFi.localIP().toString(); HTML_content = HTML_start + HTML_head; HTML_content = HTML_content + "**Schaltaktor mit Taster und Statusmeldung an CUxD (28)exec, CCU-RemotePC kompatibel"; HTML_content = HTML_content + " Version: _" + Version + "_**"; HTML_content = HTML_content + " ### Konfiguration fuer R1: "; HTML_content = HTML_content + "* Status senden: _" + transmit_state_R1 + "_"; HTML_content = HTML_content + "* CUxD-Geraet: _" + CUxD_Geraet + "_"; HTML_content = HTML_content + "* Taster-Typ: _" + Taster + "_ "; HTML_content = HTML_content + " ### HTTP-Befehlsuebersicht: "; HTML_content = HTML_content + "* \"http://" + WeMos_ip + "/cmd?R1=0\" schaltet das Relais mit Statusmeldung an CUxD aus"; HTML_content = HTML_content + "* \"http://" + WeMos_ip + "/cmd?R1=1\" schaltet das Relais mit Statusmeldung an CUxD ein"; HTML_content = HTML_content + "* \"http://" + WeMos_ip + "/cmd?R1=0&transmit=0\" schaltet das Relais ohne Statusmeldung an CUxD aus"; HTML_content = HTML_content + "* \"http://" + WeMos_ip + "/cmd?R1=1&transmit=0\" schaltet das Relais ohne Statusmeldung an CUxD ein"; HTML_content = HTML_content + "* \"http://" + WeMos_ip + "/cmd?R1=state\" gibt den Schaltzustand des Relais als Logikwert (\"0\" oder \"1\") zurueck"; HTML_content = HTML_content + "* \"http://" + WeMos_ip + "/cmd?CUxD=0\" Statusmeldung an CUxD bis zum reboot ausschalten"; HTML_content = HTML_content + "* \"http://" + WeMos_ip + "/cmd?CUxD=1\" Statusmeldung an CUxD einschalten "; HTML_content = HTML_content + " ### CUxD-Integration: "; HTML_content = HTML_content + "* Mit CUxD ein Geraet vom Typ (28)System/Exec/Schalter erstellen"; HTML_content = HTML_content + "* In der CCU im Posteingang konfigurieren: "; HTML_content = HTML_content + " SWITCH|CMD_SHORT: /usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R1-0\' "; HTML_content = HTML_content + " SWITCH|CMD_LONG: /usr/local/addons/cuxd/curl -s -m 5 \'http://" + WeMos_ip + "/R1-1\' "; HTML_content = HTML_content + " ### [CCU-RemotePC](http://ccu-remotepc.dragonfly.at/) kompatibel: "; HTML_content = HTML_content + "* \"virtual_CCU\" im Sketch auf \"ja\" stellen"; HTML_content = HTML_content + "* via TrayControl in CCU-RemotePC folgendes Geraet erstellen: "; HTML_content = HTML_content + " Plattform: CCU; Geraete Gruppe: Switch; Geraetetyp: CUxDAktor; "; HTML_content = HTML_content + " CCU IP-Adresse: " + WeMos_ip + "; SN:Kanal: WeMos00000:1"; HTML_content = HTML_content + "* virtuelle CCU aktiv: _" + virtual_CCU + "_ "; HTML_content = HTML_content + " **[zurueck](http://" + WeMos_ip + ")** "; server.send(300, "text/html", HTML_content + HTML_end); } void turn_on() { digitalWrite(relay_R1, HIGH); Serial.println("on"); } void turn_off() { digitalWrite(relay_R1, LOW); Serial.println("off"); } 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 server_2() { // Check if a client has connected WiFiClient client = server2.available(); if (!client) { return; } // Wait until the client sends some data Serial.println("new client"); while(!client.available()){ delay(1); } // Read the first line of the request String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); // Match the request if (request.indexOf("=dom.GetObject('CUxD.WeMos00000:1.STATE').State(1)") != -1) {action = "1"; action_1();} if (request.indexOf("=dom.GetObject%28%27CUxD.WeMos00000%3A1.STATE%27%29.State%281%29") != -1) {action = "1"; action_1();} if (request.indexOf("=dom.GetObject('CUxD.WeMos00000:1.STATE').State(0)") != -1){action = "0"; action_1();} if (request.indexOf("=dom.GetObject%28%27CUxD.WeMos00000%3A1.STATE%27%29.State%280%29") != -1) {action = "0"; action_1();} if (request.indexOf("=dom.GetObject('CUxD.WeMos00000:1.STATE').Value()") != -1){get_state();} if (request.indexOf("=dom.GetObject%28%27CUxD.WeMos00000%3A1.STATE%27%29.Value%28%29") != -1) {get_state();} // Return the response client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/xml"); client.println(""); // do not forget this one client.print("<xml><state>"); if(Status == "1") { client.print("true"); } else { client.print("false"); } client.print("</state></xml>"); delay(1); Serial.println("Client disconnected"); Serial.println(""); } void setup() { pinMode(relay_R1, OUTPUT); // Relais-Pin als Ausgang setzen pinMode(switch_R1, INPUT_PULLUP); // Taster zum schalten // Seriellen Monitor für Kontrollausgaben öffnen Serial.begin(115200); Serial.println(""); Serial.println("WeMos-Schaltaktor"); //WiFi.mode(WIFI_STA); // WLAN-Verbindung herstellen WiFi.config(ip, dns_ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll 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(switch_R1); // Serial.println(sensorVal); if (sensorVal == HIGH) {Taster = "schliesser";} else {Taster = "oeffner";} // Start server2 if (virtual_CCU == "ja") {server2.begin(); Serial.println(zeitstempel() + " virtuelle CCU gestarted");} } 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"; help(); Serial.println("CUxD-Meldungen: ja");} else if (CUxD == "0") {transmit_state_R1 = "nein"; help(); Serial.println("CUxD-Meldungen: nein");} else { help(); delay(100); Serial.println(zeitstempel() + " Help"); } } void oeffner(){ int sensorVal = digitalRead(switch_R1); if (sensorVal == HIGH && Status == "0") {turn_on(); delay(200);} if (sensorVal == HIGH && Status == "1") {turn_off(); delay(200);} 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(switch_R1); if (sensorVal == LOW && Status == "0") {turn_on(); delay(200);} if (sensorVal == LOW && Status == "1") {turn_off(); delay(200);} 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 if (virtual_CCU == "ja") {server_2();} }</esp8266webserver.h></esp8266wifi.h>
-
Super! Danke!
Eine Verständnisfrage:
Gibt es einen Grund für den "Umweg" über CUxD?
Musst Du den Schalter auch in der CCU haben?
Ansonsten würde es doch reichen, alles in ioBroker zu machen. D.h. ioBorker steuer direkt den Wemos (ioBroker -> Wemos) und nicht ioBroker -> CUxD -> Wemos.
-
Super! Danke!
Eine Verständnisfrage:
Gibt es einen Grund für den "Umweg" über CUxD?
Musst Du den Schalter auch in der CCU haben?
Ansonsten würde es doch reichen, alles in ioBroker zu machen. D.h. ioBorker steuer direkt den Wemos (ioBroker -> Wemos) und nicht ioBroker -> CUxD -> Wemos. `
Genau die gleiche frage hatte ich auch, fuer mein domoticz script (welches ich in de naesten tagen hier publischen werden) machen ich es auch direkt per iObroker.
(und nochmal danke an @ruhr70 der mir bei ein par script sachen hierin geholfen hat ! :))
Vorgehensweise:
-
Fuer die device erstellen ich einen state mit boolean wert true/false (AN/AUS)
-
Per javascript lese ich alle states unter dieser object reihe und bei andaerung schicke ich den befehl per HTTP.
Hier mal die vorlage was ich benutze dafuer, die variabelen:
Das script (ist noch in DEV)
// Trigger on all state changes within Domoticz Devices on({id: /^javascript\.\d\.domoticz\.Devices\.\d+\.STATE$/ , change: "ne"}, function (obj) { var objArr = obj.id.match(/(^.+)\.(.+)\.(.+)$/, ""); //Devide in + Device + CMD var device = objArr[2]; var URL = 'http://192.168.1.152'; var port = '8080'; //Verify which action is required based on state value and send action by HTTP command log(getState('domoticz.Devices.' + device + ".STATE").val); if (getState('domoticz.Devices.' + device + ".STATE").val === true || getState('domoticz.Devices.' + device + ".STATE").val == '1') { try { require("request")( URL + ':' + port + '/json.htm?type=command¶m=switchlight&idx=' + device + '&switchcmd=On'); } catch (e) { console.error(e); } console.log("request: " + URL + ':' + port + '/json.htm?type=command¶m=switchlight&idx=' + device + '&switchcmd=On'); } else { try { require("request")(URL + ':' + port + '/json.htm?type=command¶m=switchlight&idx=' + device + '&switchcmd=Off'); } catch (e) { console.error(e); } console.log("request: " + URL + ':' + port + '/json.htm?type=command¶m=switchlight&idx=' + device + '&switchcmd=Off'); } });
Function des scriptes:
-
Ueberwache alle states unter devices domotics
-
Triggere bij update
-
lese die ID aus (mit andere worten die device) fuer welches de state geaendert ist
-
Generiere den HTTP befehld zum schalten auf basis der variabele
Vorteil hieran ist das alles direkt im iObroker liegt und ich keine umwege ueber CUxD machen muss.
Eventueel etwas uebersehen wodurch die loesung doch angenehmer ist per CUxD ?
Greetz,
Dutch
-
-
Super! Danke!
Eine Verständnisfrage:
Gibt es einen Grund für den "Umweg" über CUxD?
Musst Du den Schalter auch in der CCU haben?
Ansonsten würde es doch reichen, alles in ioBroker zu machen. D.h. ioBorker steuer direkt den Wemos (ioBroker -> Wemos) und nicht ioBroker -> CUxD -> Wemos. `
Hallo ruhr70
es gibt nur einen Grung für mich… Ich steuere Teilweise auch noch aus der CCU heraus... Teil läuft aber unter IOBroker mit Blokly :mrgreen:
Für mich ist es besser, wenn die Sachen auch unter CCU sind.