Hi Stefan,
danke nochmal für den Hinweis der Kopplungen - da gab es noch einige Unstimmigkeiten bei mir. Bevor ich jetzt wieder zum eigentlichen Thema komme hab ich aber noch bei den Kopplungen 2 komische Erscheinungen oder soll ich hierfür einen separaten Thread aufmachen?
- Ich bekomme keine oder unplausible Leistungswerte über das im Programm aufgerufene Script zurückgemeldet - 75.8W laut Shelly, in der Systemvariable 7.60W, bei Kanal 3 passen die Werte aber nicht so schön 742W zu 42.40W
- Ist der Kanal wieder ausgeschaltet 0W, bekomme ich in der Systemvariablen den hinterlegten Wert angezeigt und nicht 0
Wert.JPG
! Skript V1.0.2 zur Statusaktualisierung ShellyPro 4PM mit Originalfirmware (c)2021 by 66er (alias Stefan K.)
! Publiziert und Updates auf https://smarthome-forum.eu/forum/index.php?board/145-homematic/
! entwickelt und getestet auf Shelly1-Firmware 0.6.4 und 0.7.0
! Versionsdatum: 22.08.2021
! automatische Homematic-SV-Erstellung inkl Kanalzuordnung, Onlinestatus-Prüfung integriert (optional)
! Restrict Login optional
! 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.
!Raumbezeichnung: Werkstatt (kann angepasst werden)
!**** SETUP ******** SETUP ******** SETUP ******** SETUP ***
! ACHTUNG: Beim Anpassen der Adressen keine "" löschen!
! Setup ShellyPro 4 PM
var sh4pip = "192.168.1.111" ; ! IP des Shelly1 anpassen
var sh4pname = "ShellyPro4PM_Scheune" ; ! CUxD-Gerätenamen anpassen (daraus werden ggf. automatisch weitere Variablennamen erzeugt
!Kanalnamen anpassen
var sh4pk1name = "ShellyPro4PM-Scheune.innen" ; ! Name des Shelly-Schaltkanal 1 anpassen (daraus werden ggf. automatisch weitere Variablennamen erzeugt
var sh4pk2name = "ShellyPro4PM-Scheune.außen" ; ! Name des Shelly-Schaltkanal 2 anpassen (daraus werden ggf. automatisch weitere Variablennamen erzeugt
var sh4pk3name = "ShellyPro4PM-Scheune.Hof" ; ! Name des Shelly-Schaltkanal 3 anpassen (daraus werden ggf. automatisch weitere Variablennamen erzeugt
var sh4pk4name = "ShellyPro4PM-Scheune.leer" ; ! Name des Shelly-Schaltkanal 4 anpassen (daraus werden ggf. automatisch weitere Variablennamen erzeugt
! Restrict Login
var sh4prl = "N" ; ! Ist Resrict Login im Shelly aktiv, dann auf "J" setzen
var sh4pbn = "DeinBenutzername" ; ! Ist Restrict login auf J, dann Benutzername anpassen
var sh4ppw = "DeinPasswort" ; ! Ist Restrict login auf J, dann Passwort anpassen, keine Sonderzeichen
! Setup der CUxD-GERÄTE
var execsh4p = "CUxD.CUX2801001:1"; ! Adresse und Kanal des CUxD-Exec-Device angeben
var sh4pcuxd = "CUxD.CUX4000001" ; ! Adresse des CUxD-Device für den ShellyPro 4PM anpassen
! Setup Online-Status
var sh4ponl = "J" ; ! Variable für Onlinezustandsüberwachung, falls nicht gewünscht, auf "N" setzen""
! Setup Aktualisierungs- und Anzeigeumfang
var sh4pl1= "J" ; ! Variable für Leistung Kanal 1 anlegen und aktualisieren, wenn nicht gewünscht auf "N" setzen
var sh4pl2= "J" ; ! Variable für Leistung Kanal 2 anlegen und aktualisieren, wenn nicht gewünscht auf "N" setzen
var sh4pl3= "J" ; ! Variable für Leistung Kanal 3 anlegen und aktualisieren, wenn nicht gewünscht auf "N" setzen
var sh4pl4= "J" ; ! Variable für Leistung Kanal 4 anlegen und aktualisieren, wenn nicht gewünscht auf "N" setzen
!****ENDE SETUP ********ENDE SETUP ********ENDE SETUP ******
!*****Ab hier NICHTS MEHR ÄNDERN *****
! *** Variablen für Leistung prüfen, ggf. anlegen
! Kanal 1
if (sh4pl1 == "J" ) {
var sh4plk1 = sh4pk1name + "_Leistung" ;
!WriteLine(sh4plk1) ;
string sName= ""#sh4plk1#"";
if (!dom.GetObject (ID_SYSTEM_VARIABLES).Get (sName)) {
object svObj = dom.CreateObject(OT_VARDP,sName);
svObj.DPInfo("autom. angelegt durch Skript ShellyPro4PM");
svObj.ValueUnit("W");
dom.GetObject (ID_SYSTEM_VARIABLES).Add(svObj);
svObj.ValueType(ivtFloat);
svObj.ValueSubType(istGeneric);
svObj.ValueMin(0);
svObj.ValueMax(3800);
svObj.State (0);!SCNR = SHP4PM10166R
dom.RTUpdate(0);
object oChan= channels.Get (""#sh4pk1name#"");
object oSys=dom.GetObject (ID_SYSTEM_VARIABLES).Get (""#sh4plk1#"");
oChan.DPs().Add (oSys);
oSys.Channel (oChan.ID() );
}
}
! Kanal 2
if (sh4pl2 == "J" ) {
var sh4plk2 = sh4pk2name + "_Leistung" ;
!WriteLine(sh4plk2) ;
string sName= ""#sh4plk2#"";
if (!dom.GetObject (ID_SYSTEM_VARIABLES).Get (sName)) {
object svObj = dom.CreateObject(OT_VARDP,sName);
svObj.DPInfo("autom. angelegt durch Skript ShellyPro4PM");
svObj.ValueUnit("W");
dom.GetObject (ID_SYSTEM_VARIABLES).Add(svObj);
svObj.ValueType(ivtFloat);
svObj.ValueSubType(istGeneric);
svObj.ValueMin(0);
svObj.ValueMax(3800);
svObj.State (0);!SCNR = SHP4PM10166R
dom.RTUpdate(0);
object oChan= channels.Get (""#sh4pk2name#"");
object oSys=dom.GetObject (ID_SYSTEM_VARIABLES).Get (""#sh4plk2#"");
oChan.DPs().Add (oSys);
oSys.Channel (oChan.ID() );
}
}
! Kanal 3
if (sh4pl3 == "J" ) {
var sh4plk3 = sh4pk3name + "_Leistung" ;
!WriteLine(sh4plk3) ;
string sName= ""#sh4plk3#"";
if (!dom.GetObject (ID_SYSTEM_VARIABLES).Get (sName)) {
object svObj = dom.CreateObject(OT_VARDP,sName);
svObj.DPInfo("autom. angelegt durch Skript ShellyPro4PM");
svObj.ValueUnit("W");
dom.GetObject (ID_SYSTEM_VARIABLES).Add(svObj);
svObj.ValueType(ivtFloat);
svObj.ValueSubType(istGeneric);
svObj.ValueMin(0);
svObj.ValueMax(3800);
svObj.State (0);!SCNR = SHP4PM10166R
dom.RTUpdate(0);
object oChan= channels.Get (""#sh4pk3name#"");
object oSys=dom.GetObject (ID_SYSTEM_VARIABLES).Get (""#sh4plk3#"");
oChan.DPs().Add (oSys);
oSys.Channel (oChan.ID() );
}
}
! Kanal 4
if (sh4pl4 == "J" ) {
var sh4plk4 = sh4pk4name + "_Leistung" ;
!WriteLine(sh4plk4) ;
string sName= ""#sh4plk4#"";
if (!dom.GetObject (ID_SYSTEM_VARIABLES).Get (sName)) {
object svObj = dom.CreateObject(OT_VARDP,sName);
svObj.DPInfo("autom. angelegt durch Skript ShellyPro4PM");
svObj.ValueUnit("W");
dom.GetObject (ID_SYSTEM_VARIABLES).Add(svObj);
svObj.ValueType(ivtFloat);
svObj.ValueSubType(istGeneric);
svObj.ValueMin(0);
svObj.ValueMax(3800);
svObj.State (0);!SCNR = SHP4PM10166R
dom.RTUpdate(0);
object oChan= channels.Get (""#sh4pk4name#"");
object oSys=dom.GetObject (ID_SYSTEM_VARIABLES).Get (""#sh4plk4#"");
oChan.DPs().Add (oSys);
oSys.Channel (oChan.ID() );
}
}
! Variable für Onlinestatus prüfen,ggf.anlegen
if (sh4ponl == "J") {
var sh4ponln = "Online-Status_" + sh4pname ;
!WriteLine(sh4ponln) ;
string sName= ""#sh4ponln#""; ! Onlinestatus
if (!dom.GetObject (ID_SYSTEM_VARIABLES).Get (sName)) {
object svObj = dom.CreateObject(OT_VARDP,sName);
svObj.DPInfo("autom. angelegt durch Skript ShellyPro4PM");
svObj.ValueUnit("");
dom.GetObject (ID_SYSTEM_VARIABLES).Add(svObj);
svObj.ValueType(ivtBinary);
svObj.ValueSubType(istBool);
svObj.ValueName0("Offline");
svObj.ValueName1("Online");
svObj.State(true);!SCR = SH4p10166R
dom.RTUpdate(0);
object oChan= channels.Get (""#sh4pk1name#"");
object oSys=dom.GetObject (ID_SYSTEM_VARIABLES).Get (""#sh4ponln#"");
oChan.DPs().Add (oSys);
oSys.Channel (oChan.ID() );
}
}
! Onlineabfrage und setzen des Status
string stderr;
string stdout;
integer Status;
system.Exec("ping -c 1 '"#sh4pip#"'", &stdout, &stderr);
Status = stdout.Find("ms");
!WriteLine(Status);
if (((sh4ponl ) == "J" ) && ((Status) == -1)) {
WriteLine("ShellyPro 4PM ist offline");
dom.GetObject (""#sh4ponln#"").State(0);
quit; ! Programmabbruch bei Shelly offline
}
if ((sh4ponl ) == "J" ) {
dom.GetObject (""#sh4ponln#"").State(1);
WriteLine("ShellyPro 4PM ist online");
}
! Statusabfrage
! url ohne RL
var url = sh4pip + "/rpc/Shelly.GetStatus";
WriteLine(url);
! url mit RL
if ( sh4prl == "J") {
var url = sh4pbn + ":" + sh4ppw +"@" +sh4pip + "/rpc/Shelly.GetStatus";
WriteLine(url);
}
!****Abfrage des ShellyPro 4M *****
dom.GetObject(""#execsh4p#".CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject(""#execsh4p#".CMD_QUERY_RET").State(1);
string Antwort = dom.GetObject(""#execsh4p#".CMD_RETS").State();
string t = dom.GetObject(""#execsh4p#".CMD_RETS").State();
dom.GetObject(""#execsh4p#".CMD_SETS").State("0");
WriteLine("Antwortstring: " + Antwort);
! *** Auswertung Leistung ***
string output = Antwort;
string part; string code;string slist;integer collect = -1;
foreach (part, output.Split("switch0")){
collect = part.Find("apower");
if (collect>-1){
code = ((part.StrValueByIndex(",",2)).StrValueByIndex(":",1));
code = code.Substr(1, code.Length()-1);
slist = slist#code#"/";
}}
WriteLine(slist);
! Ergebnis in Einzelwerte auflösen
var lk1 = slist.StrValueByIndex("/", 0);
var lk2 = slist.StrValueByIndex("/", 1);
var lk3 = slist.StrValueByIndex("/", 2);
var lk4 = slist.StrValueByIndex("/", 3);
if (sh4pl1 == "J") {
dom.GetObject(""#sh4plk1#"").State(lk1);
}
if (sh4pl2 == "J") {
dom.GetObject(""#sh4plk2#"").State(lk2);
}
if (sh4pl3 == "J") {
dom.GetObject(""#sh4plk3#"").State(lk3);
}
if (sh4pl4 == "J") {
dom.GetObject(""#sh4plk4#"").State(lk4);
}
WriteLine("Skript beendet");
! ENDE SKRIPT
Alles anzeigen
Ich glaube bevor das nicht passt - macht meine obige Frage erst einmal keinen Sinn zur Weiterverfolgung