-
Autor
Hallo zusammen,
mein erster Beitrag hier, also bitte nicht gleich verprügeln, falls ich mich irgendwie unklar ausdrücke! 😊
Ich habe mithilfe der tolle Anleitung unter Shelly Plug-S in Homematic einbinden (V2) - mit der Originalfirmware meinen Plug S in Homematic eingebunden, um damit die Leistung meines Balkonkraftwerks zu überwachen. Ich habe mich daran entlang gehangelt und fast alles zum Laufen bekommen. Allerdings funktioniert eine für mich wichtige Sache nicht, und das ist leider genau das Auslesen der aktuellen Leistung aus dem Shelly und das Schreiben in die Systemvariable. Ich kann den Plug S problemlos in HM an- und ausschalten; wenn ich das in der Shelly-Oberfläche tue, bekommt die HM davon auch mit, und auch der Online-Status wird auch korrekt in die Systemvariable geschrieben/aktualisiert. Nur die Leistung steht dauerhaft auf 0.00 Watt. Unabhängig davon, ob Strom fließt oder nicht. Das Script sieht bei mir folgendermaßen aus:
! Skript V2.2.3 zur Einbindung Shelly PlugS mit Originalfirmware (c) 2021-2022 by 66er (alias Stefan K.)
! Alle Rechte vorbehalten!
! Publiziert und Updates auf https://shelly-forum.com/forum/index.php?board/145-homematic/
! entwickelt und getestet auf PlugS-Firmware 1.11.8
! jede Funktion optional aktivierbar, automatische Homematic-SV-Erstellung, Onlinestatus-Prüfung optional integriert
! Versionsdatum: 09.07.2022
! NEU: Systemvariablen werden autom. dem CUxD-Schalter-Kanal zugeordnet
! BITTE BEACHTEN:
! Dieses Skript legt ggf. selbstständig zusätzliche Systemvariablen auf Deiner Homematic-Zentrale an!
! Das vermeidet Inkonsistenzen und eine temporäre Blockade der CCU durch das Skript.
! Ausserdem erspart es Dir das manuelle Anlegen benötigter Systemvariablen.
! Wer das nicht möchte, kann dieses Skript leider nicht nutzen!
! Die Nutzung des Skriptes erfolgt auf eigenes Risiko.
! Aus der Nutzung entsteht kein Rechtsanspruch auf Suppport oder Fehlerbeseitigung durch den Autor.
! Der Autor haftet nicht für eventuelle Folgen der Nutzung auf der Homematic-Zentrale des Nutzers.
! Das Skript ist ausführlich getestet und sollte problemlos funktionieren.
! Bezeichnung: AP BKW (kann angepasst werden, dient nur zur Orientierung)
! **** SETUP ******** SETUP ******** SETUP ******** SETUP ***
! ACHTUNG: Beim Anpassen der Adressen keine "" löschen!
! Setup Shelly PlugS
var shplip = "192.168.0.27" ; ! IP des Shelly PlugS anpassen
var shplname = "PlugS_BKW" ; ! Name des Shelly PlugS anpassen (daraus werden ggf. automatisch weitere Variablennamen erzeugt
var shplrl = "N" ; ! Ist Restrict Login im Shelly aktiv, dann auf "J" setzen
var shplbn = "DeinBenutzername" ; ! Ist Restrict login auf J, dann Benutzername anpassen
var shplpw = "DeinPasswort" ; ! Ist Restrict login auf J, dann Passwort anpassen, keine Sonderzeichen
! Setup der CUxD-GERÄTE
var execshpl = "CUxD.System.Exec:1" ; ! Adresse und Kanal des CUxD-Exec-Device angeben
var shplcuxd = "CUX4000004:1" ; ! Adresse und Kanal des CUxD-Device für den Shelly PlugS anpassen
! Setup Online-Status
var shplonl = "J" ; ! Variable für Onlinezustandsüberwachung, falls nicht gewünscht, auf "N" setzen""
! Setup Aktualisierungsumfang
var shplstat = "J" ; ! Status EIN oder AUS wird durch das Skript aktualisiert, wenn nicht gewünscht auf "N" setzen
var shplvba = "J" ; ! aktuelle Verbrauchsanzeige, wenn nicht gewünscht auf "N" setzen
!****ENDE SETUP ********ENDE SETUP ********ENDE SETUP ******
!*****Ab hier NICHTS MEHR ÄNDERN ***************************
! Variable für Onlinestatus prüfen,ggf.anlegen
if (shplonl == "J") {
var shplonln = shplname + "_Online-Status" ;
! WriteLine(shplonln) ;
string sName= ""#shplonln#""; ! Onlinestatus
if (!dom.GetObject (ID_SYSTEM_VARIABLES).Get (sName)) {
object svObj = dom.CreateObject(OT_VARDP,sName);
svObj.DPInfo("autom. angelegt durch Skript Shelly PlugS");
svObj.ValueUnit("");
dom.GetObject (ID_SYSTEM_VARIABLES).Add(svObj);
svObj.ValueType(ivtBinary);
svObj.ValueSubType(istBool);
svObj.ValueName0("Offline");
svObj.ValueName1("Online");
svObj.State (true);!SCNR = SHP22366R
dom.RTUpdate(0);
object oChan= channels.Get (""#shplname#"");
object oSys=dom.GetObject (ID_SYSTEM_VARIABLES).Get (""#shplonln#"");
oChan.DPs().Add (oSys);
oSys.Channel (oChan.ID() );
}
! Onlineabfrage und setzen des Status
string stderr;
string stdout;
integer Status;
system.Exec("ping -c 1 '"#shplip#"'", &stdout, &stderr);
Status = stdout.Find("ms");
!WriteLine(Status);
if (((shplonl ) == "J" ) && ((Status) == -1)) {
WriteLine("Shelly1 ist offline");
dom.GetObject (""#shplonln#"").State(0);
quit; ! Programmabbruch bei Shelly offline
}
if ((shplonl ) == "J" ) {
dom.GetObject (""#shplonln#"").State(1);
WriteLine("Shelly PlugS ist online");
}
}
!*******************************************************************************
!***** Werte-Abfrage des PlugS *****
if (shplstat == "J"){
var url = "http://" + shplip + "/relay/0/status" ;
!WriteLine(url);
if (shplrl == "J") {
var url = "http://" + shplbn + ":" + shplpw + "@" +shplip + "/relay/0/status" ;
!WriteLine(url);
}
dom.GetObject(""#execshpl#".CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject(""#execshpl#".CMD_QUERY_RET").State(1);
string Antwort = dom.GetObject(""#execshpl#".CMD_RETS").State();
dom.GetObject(""#execshpl#".CMD_SETS").State("0");
!WriteLine(Antwort);
string word = "ison:";
integer word_laenge = word.Length();
integer word_position = Antwort.Find(word);
string daten = Antwort.Substr((word_position + word_laenge +4), 5);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -3));
!WriteLine(daten);
var zustand = dom.GetObject(""#shplcuxd#".STATE").State();
!WriteLine(zustand);
if (daten == "true,")
{dom.GetObject(""#shplcuxd#".SET_STATE").State(1);
!WriteLine("PlugS ist eingeschaltet");
}
if (daten == "false")
{
dom.GetObject(""#shplcuxd#".SET_STATE").State(0);
!WriteLine("PlugS ist aus");
}
}
!*************************************************************************
! Leistung
if (shplvba == "J") {
!Variable prüfen, ggf. anlegen
string shplvban;
shplvban = shplname + "_Leistung" ;
string sName= ""#shplvban#"";
if (!dom.GetObject (ID_SYSTEM_VARIABLES).Get (sName)) {
object svObj = dom.CreateObject(OT_VARDP,sName);
svObj.DPInfo("autom. angelegt durch Skript Shelly PlugS");
svObj.ValueUnit("W");
dom.GetObject (ID_SYSTEM_VARIABLES).Add(svObj);
svObj.ValueType(ivtFloat);
svObj.ValueSubType(istGeneric);
svObj.ValueMin(0);
svObj.ValueMax(3500);
svObj.State (0);!SCNR = SHP22366R
dom.RTUpdate(0);
object oChan= channels.Get (""#shplname#"");
object oSys=dom.GetObject (ID_SYSTEM_VARIABLES).Get (""#shplvban#"");
oChan.DPs().Add (oSys);
oSys.Channel (oChan.ID() );
}
var url2 = "http://" + shplip + "/meter/0?status" ;
!WriteLine(url2);
if (shplrl == "J") {
var url2 = "http://" + shplbn + ":" + shplpw + "@" +shplip + "/meter/0?status" ;
WriteLine(url2);
}
dom.GetObject(""#execshpl#".CMD_SETS").State("wget -q -O - '"#url2#"'");
dom.GetObject(""#execshpl#".CMD_QUERY_RET").State(1);
string Antwort = dom.GetObject(""#execshpl#".CMD_RETS").State();
dom.GetObject(""#execshpl#".CMD_SETS").State("0");
!WriteLine(Antwort);
string t;
t = Antwort;
!WriteLine(t);
string s;
foreach (s,t.Split (",")) {
if (s.LTrim ("{").StartsWith ('"power"')) {
string p = (s.StrValueByIndex (":",1).RTrim ("}"));
! WriteLine(p);
}
}
dom.GetObject(""#shplvban#"").State(p);
}
WriteLine("Skript beendet !");
!Ende Skript
Alles anzeigen
Das Script selbst triggere ich mit dem Homematic internen Zeitmodul auf minütliche Ausführung. Das klappt auch, wie ich anhand des zu jeder vollen Minute stattfindenden Aktualisierungintervall beim Onlinestatus. Nur die Leistung wird nicht verändert (auch nicht der Zeitstempel). Woran könnte das liegen?
Wenn ihr noch etwas benötigt, liefere ich das gern
Danke schonmal vorab und freundliche Grüße
Andreas