ich möchte euch kurz vorstellen, wie ihr die IP Steckdosenleiste mPower PRO (EU) in HM einbindet.
Prinzipiell sind auch die anderen Produkte der mpower Serie integrierbar, siehe https://www.ubnt.com/mfi/mpower/.
Ich habe die mPower PRO (EU) mit 6 Steckdosen und Ethernet + Wi-Fi.
Mit der Steckdosenleiste kann man z.B.
- einzelne Steckdosen über Homematic ein- und ausschalten
- aktuelle Spannung (V) an den Steckdosen auslesen
- aktuelle Leistung (W) an den Steckdosen auslesen
- Stromverbrauch (kWh) der einzelnen Steckdosen auslesen.
.....
- Watchdog funktion durch anpingen von Netzwerkgeräten ist auch noch integriert, uvm.
Möchte mich in dem Tutorial auf ein- und ausschalten, sowie auslesen der o.g. Messwerte beschränken.
für's Einschalten sind folgende zwei Skripte anzulegen, die im Abstand von 8 sec (=Erfahrungswert) auszulösen sind.
Voraussetzung ist zudem das CUxD installiert und eingerichtet ist.
IP der Leiste und Userdaten sind im Skript evtl anzupassen.
Login-Skript:
Code: Alles auswählen
!Login mit Userdaten an der Steckdosenleiste, eigene Daten hier eingeben:
string user_mpower = "ubnt"; ! User-Name der Steckdoesenleiste (ubnt ist Standard-User und kann übernommen werden)
string pw_mpower = "ubnt"; ! Passwort der Steckdoesenleiste (ubnt ist Standard-Passwort und kann übernommen werden)
string ip_mpower = "192.168.1.42"; ! IP der Steckdoesenleiste
dom.GetObject("CUxD.CUX2801001:11.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -X POST -d 'username="#user_mpower#"&password="#pw_mpower#"' -b 'AIROS_SESSIONID=01234567890123456789012345678901' "#ip_mpower#"/login.cgi");
Code: Alles auswählen
string ip_mpower = "192.168.1.42"; ! IP der Steckdoesenleiste
dom.GetObject("CUxD.CUX2801001:11.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -X PUT -d output=1 -b 'AIROS_SESSIONID=01234567890123456789012345678901' "#ip_mpower#"/sensors/1");
Code: Alles auswählen
string ip_mpower = "192.168.1.42"; ! IP der Steckdoesenleiste
dom.GetObject("CUxD.CUX2801001:11.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -X PUT -d output=0 -b 'AIROS_SESSIONID=01234567890123456789012345678901' "#ip_mpower#"/sensors/1");
Um Steckdose 2-6 zu schalten ist jeweils die Zahl am Ende des Skripts anzupassen, also die 1 bei sensors/1.
Web-UI Programm:
Um die Messwerte der Steckdosenlsiete auszulesen sind wieder das Login-Skript und ein Auslesen-Skript notwendig.
Login-Skript:
Code: Alles auswählen
!Login mit Userdaten an der Steckdosenleiste, eigene Daten hier eingeben:
string user_mpower = "ubnt"; ! User-Name der Steckdoesenleiste (ubnt ist Standard-User und kann übernommen werden)
string pw_mpower = "ubnt"; ! Passwort der Steckdoesenleiste (ubnt ist Standard-Passwort und kann übernommen werden)
string ip_mpower = "192.168.1.42"; ! IP der Steckdoesenleiste
dom.GetObject("CUxD.CUX2801001:11.CMD_EXEC").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -X POST -d 'username="#user_mpower#"&password="#pw_mpower#"' -b 'AIROS_SESSIONID=01234567890123456789012345678901' "#ip_mpower#"/login.cgi");
am Beispiel von Spannung, Leistung, und Stromverbrauch für Steckdosen 1 und 2 - Erweiterung nach Bedarf möglich, analog JSON Rückgabeobjekt unten.
Dementsprechend sind vorher die Systemvariablen power1, power2, voltage1, voltage2, thismonth1 und thismonth2 als Zahl anzulegen.
Thismonth (kWh) ist ab Firmware 2.1.8 der Leiste verfübar. Update kann gemäß diesem Wiki http://www.fhemwiki.de/wiki/Ubiquit_mFi/mPower durchgeführt werden. Ich habe die aktuellste 2.1.11 installiert
Code: Alles auswählen
!Skript gilt für Firmwareversion 2.1.11
string ip_mpower = "192.168.1.42"; ! IP der Steckdoesenleiste eingeben
!Sensors aufrufen
dom.GetObject("CUxD.CUX2801001:10.CMD_SETS").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -b 'AIROS_SESSIONID=01234567890123456789012345678901' "#ip_mpower#"/sensors");
dom.GetObject("CUxD.CUX2801001:10.CMD_QUERY_RET").State(1);
string sensors = dom.GetObject("CUxD.CUX2801001:10.CMD_RETS").State();
!dom.GetObject("sensors").State(sensors);
!Werte auslesen
!Steckdose 1
string power_1 = sensors.StrValueByIndex(",", 2);
string word = "power";
integer word_laenge = word.Length();
integer word_position = power_1.Find(word);
string daten = power_1.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("power1").State(zahl);
string voltage_1 = sensors.StrValueByIndex(",", 5);
string word = "voltage";
integer word_laenge = word.Length();
integer word_position = voltage_1.Find(word);
string daten = voltage_1.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("voltage1").State(zahl);
string thismonth_1 = sensors.StrValueByIndex(",", 9);
string word = "thismonth";
integer word_laenge = word.Length();
integer word_position = thismonth_1.Find(word);
string daten = thismonth_1.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("thismonth1").State(zahl);
!Steckdose 2
string power_2 = sensors.StrValueByIndex(",", 12);
string word = "power";
integer word_laenge = word.Length();
integer word_position = power_2.Find(word);
string daten = power_2.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("power2").State(zahl);
string voltage_2 = sensors.StrValueByIndex(",", 15);
string word = "voltage";
integer word_laenge = word.Length();
integer word_position = voltage_2.Find(word);
string daten = voltage_2.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("voltage2").State(zahl);
string thismonth_2 = sensors.StrValueByIndex(",", 19);
string word = "thismonth";
integer word_laenge = word.Length();
integer word_position = thismonth_2.Find(word);
string daten = thismonth_2.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("thismonth2").State(zahl);
Für die Erweiterung des Auslese-Skripts um Steckdosen 3-6, oder andere Paramter, ist es hilfreich, wenn man das ganze JSON Rückgabeobjekt auf den cURL von oben kennt. Für meine Leiste sieht das nach 2 Wochen Nutzung so aus:
Code: Alles auswählen
{"sensors":[{"port":1,"output":1,"power":0.0,"enabled":0,"current":0.0,"voltage":234.884034633,"powerfactor":0.0,"relay":1,"lock":0,"thismonth":3031},{"port":2,"output":1,"power":0.0,"enabled":0,"current":0.0,"voltage":234.925451278,"powerfactor":0.0,"relay":1,"lock":0,"thismonth":4514},{"port":3,"output":0,"power":0.0,"enabled":0,"current":0.0,"voltage":0.0,"powerfactor":0.0,"relay":0,"lock":0,"thismonth":0},{"port":4,"output":0,"power":0.0,"enabled":0,"current":0.0,"voltage":0.0,"powerfactor":0.0,"relay":0,"lock":0,"thismonth":0},{"port":5,"output":0,"power":0.0,"enabled":0,"current":0.0,"voltage":0.0,"powerfactor":0.0,"relay":0,"lock":0,"thismonth":0},{"port":6,"output":0,"power":0.0,"enabled":0,"current":0.0,"voltage":0.0,"powerfactor":0.0,"relay":0,"lock":0,"thismonth":0}],"status":"success"}
Durch Anlegen einer Systemvariablen "sensors" (Zeichenkette) in der CCU und dem Entfernen des !-Zeichens in der Zeile !dom.GetObject("sensors").State(sensors); des Auslese-Skripts könnt ihr eure eigene Rückgabe ansehen und das Auslese-Skript entsprechend anpassen. Dazu Einfach die "Block-Zahl" im Befehl StrValueByIndex(",", 15); (Beispiel) usw. entsprechend anpassen. Ein Block geht jeweils bis zum nächsten Komma und es wird bei 0 zu zählen angefangen.
Hinweise:
- Uhrzeit/Datum müssen bei der Erstinbetriebnahme korrekt eingestellt werden
- Bevor man das Script zum Auslesen anwendet die Dosen mit einem Verbraucher ein paar Stunden laufen lassen, damit der Wert "thismonth" in der Dose aktiviert wird.
- die Verbrauchswerte von "thismonth" im JSON und der WEBUI der Steckdosenleiste unterscheiden sich. Die Werte (kWh) in der WEBUI scheinen plausibel zu sein. Ob die Werte im JSON falsch sind, oder nur in einer anderen Einheit dargestellt sind ist derzeit noch ungeklärt.
- der Wert "prevmonth" erscheint erst nach einem Monat Nutzungsdauer. Das Ausleseskript, d.h. die "Blockzahlen", müssen demnach nach einem Monat angepasst werden. Für das Bsp. von oben wie folgt:
Code: Alles auswählen
!Messwerte auslesen .
!Skript gilt für Firmwareversion 2.1.11
string ip_mpower = "192.168.1.42"; ! IP der Steckdoesenleiste eingeben
!Sensors aufrufen
dom.GetObject("CUxD.CUX2801001:10.CMD_SETS").State("LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -b 'AIROS_SESSIONID=01234567890123456789012345678901' "#ip_mpower#"/sensors");
dom.GetObject("CUxD.CUX2801001:10.CMD_QUERY_RET").State(1);
string sensors = dom.GetObject("CUxD.CUX2801001:10.CMD_RETS").State();
dom.GetObject("sensors").State(sensors);
!Werte auslesen
!Steckdose 1
string power_1 = sensors.StrValueByIndex(",", 2);
string word = "power";
integer word_laenge = word.Length();
integer word_position = power_1.Find(word);
string daten = power_1.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("power1").State(zahl);
string voltage_1 = sensors.StrValueByIndex(",", 5);
string word = "voltage";
integer word_laenge = word.Length();
integer word_position = voltage_1.Find(word);
string daten = voltage_1.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("voltage1").State(zahl);
string thismonth_1 = sensors.StrValueByIndex(",", 10);
string word = "thismonth";
integer word_laenge = word.Length();
integer word_position = thismonth_1.Find(word);
string daten = thismonth_1.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("thismonth1").State(zahl/3600);
!Steckdose 2
string power_2 = sensors.StrValueByIndex(",", 13);
string word = "power";
integer word_laenge = word.Length();
integer word_position = power_2.Find(word);
string daten = power_2.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("power2").State(zahl);
string voltage_2 = sensors.StrValueByIndex(",", 16);
string word = "voltage";
integer word_laenge = word.Length();
integer word_position = voltage_2.Find(word);
string daten = voltage_2.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("voltage2").State(zahl);
string thismonth_2 = sensors.StrValueByIndex(",", 21);
string word = "thismonth";
integer word_laenge = word.Length();
integer word_position = thismonth_2.Find(word);
string daten = thismonth_2.Substr((word_position + word_laenge +2), 4);
real zahl = daten.ToFloat();
dom.GetObject("thismonth2").State(zahl/3600);
Code: Alles auswählen
{"sensors":[{"port":1,"output":1,"power":0.0,"enabled":0,"current":0.0,"voltage":233.978244781,"powerfactor":0.0,"relay":1,"lock":0,"prevmonth":27365,"thismonth":15859},{"port":2,"output":1,"power":0.0,"enabled":0,"current":0.0,"voltage":233.963060379,"powerfactor":0.0,"relay":1,"lock":0,"prevmonth":18748,"thismonth":4565},{"port":3,"output":0,"power":0.0,"enabled":0,"current":0.0,"voltage":0.0,"powerfactor":0.0,"relay":0,"lock":0,"prevmonth":0,"thismonth":0},{"port":4,"output":0,"power":0.0,"enabled":0,"current":0.0,"voltage":0.0,"powerfactor":0.0,"relay":0,"lock":0,"prevmonth":0,"thismonth":0},{"port":5,"output":0,"power":0.0,"enabled":0,"current":0.0,"voltage":0.0,"powerfactor":0.0,"relay":0,"lock":0,"prevmonth":0,"thismonth":0},{"port":6,"output":0,"power":0.0,"enabled":0,"current":0.0,"voltage":0.0,"powerfactor":0.0,"relay":0,"lock":0,"prevmonth":0,"thismonth":0}],"status":"success"}
Einsatzzweck der Steckdosenleiste:
Ich werwende die Steckdosenleiste um unsere Waschmaschine und Trockner "smarter" zu machen, also um Meldungen bei Beendigung von Wasch- und Trockervorgang auszugeben. Ich ersetze damit den Funk-Schaltaktor mit Leistungsmessung, mit dem ich im Keller immer wieder Empfangsprobleme hatte.
Viele Spass und Erfolg bei der Umsetzung !