Ca. 24 Stunden...
Roland
Moderatoren: jmaus, Co-Administratoren
Ca. 24 Stunden...
Wärst du bitte so freundlich und würdest diesen Skript hier mal öffentlich machen damit man darauf basierend vielleicht was bzgl. der Problematik hier machen kann.
ja gerne, hier das Skript :
Code: Alles auswählen
! v0.6 - holt die Einstellungen zur "zylischen Info" von HMIP-Geräten per GetParamSet
!
!
!- v0.3 (g55) 20.08.2021 Umstellung auf putparamset mit SDV4 (multiple parameters)
!- v0.5 (g55) 20.09.2021 DPs von CH=0 eingefügt : RSSi-Device + Voltage
!- v0.6 (g55) 26.04.2022 Filter nach Name, RSSI_PEER, Volt am Limit per * markiert
!- RSSI Limit per "*" markiert, Voreinstellung iLimitRSSI
! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
object rCH = dom.GetObject(ID_CHANNELS);
!--- nach Gerätetyp filtern ... oder eben nix = "" = alle Gerätetypen ---
string filterDevType = "broll";
! --- nach Gerätename filtern ... oder eben nix = "" = alle Namen ---
string filterDevName = "";
!--- Limit für RSSI zum Markieren per "*"
integer iLimitRSSI = 180;
!--- setze "true" zum Ändern ... btw. manche Geräte brauchen ein Drücken der Config-Taste,
!--- z.B Kontakte SWDO/SWDM, Batterie-Taster/Fernbedienungen WRC*,RC8,KRCA,RCB1,
!--- Wassermelder SWD, evtl Rauchmelder SWSD
! --- hier können Werte gesetzt werden ... VORSICHTIG
boolean bSet = false;
!--- die zu setzenden Werte ... "-1" = nicht setzen
integer cycSet = -1; integer cycChSet = -1; integer cycUChSet = -1; integer iRoutingSet = 0;
!--- Variablen ---
string item;
object devobj;
string devname; string devtype; object oIFace; string iFace;
string chName;
object oCH;
string xmlOut;
integer cyc; integer cycCh; integer cycUCh;
integer iRouting; real rVolt; real rVoltAkt; integer iRSSID; integer iRSSIP;
integer iPos; integer iPos1;
string sText = ""; string sVolt; string sRSSID; string sRSSIP;
time LastDPTime;
string stdErr=""; string stdOut="";
string TCL="";
!- --- Titelzeilen der Ausgabe
WriteLine("HMIP-Gerät \tGeräteTyp\tcycl.\tcycCh\tcycUCh\tRout.\tV-Lim.\tV-akt.\tRSSI_D\tRSSI_P\t LastActionTime CH=0");
WriteLine("---------------------------------------------------------------------------------------------------------------------------");
filterDevType = filterDevType.ToLower();
filterDevName = filterDevName.ToLower();
foreach (item, (dom.GetObject(ID_DEVICES)).EnumUsedIDs()) { ! Schleife über alle Objekte = Kanäle im Gewerk, wie im WebUI definiert
! --- Geräte-Infos holen (Name, Typ, Schnittstelle)
devobj = dom.GetObject(item); ! Objekt der ID
devname = devobj.Name();
devtype = devobj.HssType();
chName = devname # ":0";
oCH = dom.GetObject(chName);
oIFace = dom.GetObject (oCH.Interface());
iFace = oIFace.Name();
if ( filterDevType && ( !devtype.ToLower().Contains(filterDevType) )) { continue; }
if ( filterDevName && ( !devname.ToLower().Contains(filterDevName) )) { continue; }
if ( iFace == "HmIP-RF" ) {
!- if ( devname.Length() <= 7 ) { sText = (devname # "\t\t\t\t" # devtype);
!- } elseif ( devname.Length() <= 15 ) { sText = (devname # "\t\t\t" # devtype);
!- } elseif ( devname.Length() <= 23 ) { sText = (devname # "\t\t" # devtype);
!- } else { sText = (devname # "\t" # devtype); }
!-
!- if ( devtype.Length() < 8 ) { sText = sText # "\t"; }
sText = " ";
sText = devname # sText.Substr(devname.Length(),-1) # "\t";
sText = sText # devtype # " ".Substr(devtype.Length(),-1);
xmlOut = xmlrpc.GetParamset (oCH.Interface(), oCH.Address() , "MASTER");
LastDPTime = oCH.LastDPActionTime();
iPos = xmlOut.Find(">CYCLIC_INFO_MSG<");
if ( iPos ) { cyc = xmlOut.Substr((iPos+34),1).ToInteger(); }
iPos = xmlOut.Find(">CYCLIC_INFO_MSG_DIS<");
if ( iPos ) {
iPos1 = xmlOut.Substr((iPos+38),-1).Find("<");
cycCh = xmlOut.Substr((iPos+38),iPos1).ToInteger();
}
iPos = xmlOut.Find(">CYCLIC_INFO_MSG_DIS_UNCHANGED<");
if ( iPos ) {
iPos1 = xmlOut.Substr((iPos+48),-1).Find("<");
cycUCh = xmlOut.Substr((iPos+48),iPos1).ToInteger();
}
iPos = xmlOut.Find(">ENABLE_ROUTING<");
if ( iPos ) {
iPos1 = xmlOut.Substr((iPos+38),-1).Find("<");
iRouting = xmlOut.Substr((iPos+38),iPos1).ToInteger();
}
iPos = xmlOut.Find(">LOW_BAT_LIMIT<");
if ( iPos ) {
iPos1 = xmlOut.Substr((iPos+36),-1).Find("<");
rVolt = xmlOut.Substr((iPos+36),iPos1).ToFloat();
}
!- jetzt noch ein paar Datenpunkte auch Kanal 0 mit auflisten
rVoltAkt = 0.0;
if ( rCH.Get(chName).DPByHssDP("OPERATING_VOLTAGE") ) {
rVoltAkt = rCH.Get(chName).DPByHssDP("OPERATING_VOLTAGE").Value();
}
iRSSID = -1;
if ( rCH.Get(chName).DPByHssDP("RSSI_DEVICE") ) {
iRSSID = rCH.Get(chName).DPByHssDP("RSSI_DEVICE").Value();
}
iRSSIP = -1;
if ( rCH.Get(chName).DPByHssDP("RSSI_PEER") ) {
iRSSIP = rCH.Get(chName).DPByHssDP("RSSI_PEER").Value();
}
!- Ausgabe zusammenbasteln
sVolt = rVoltAkt.ToString(1);
if ( (rVoltAkt <= rVolt) && (rVolt > 0.0) && (rVoltAkt > 0.0) ) { sVolt = sVolt # " *"; };
if ( (iRSSID > 0) && (iRSSID <= iLimitRSSI) ) { sRSSID = iRSSID # " *"; } else { sRSSID = iRSSID; }
if ( (iRSSIP > 0) && (iRSSIP <= iLimitRSSI) ) { sRSSIP = iRSSIP # " *"; } else { sRSSIP = iRSSIP; }
sText = sText # "\t " # cyc # "\t " # cycCh # "\t " # cycUCh # "\t " # iRouting;
sText = sText # "\t " # rVolt.ToString(1) # "\t " # sVolt # "\t " # sRSSID # "\t " # sRSSIP # "\t " # LastDPTime;
if ( !bSet ) { WriteLine(sText); }
if ( bSet ) {
if ( (cyc <> cycSet) && (cycSet >= 0) ) {
TCL= TCL # " {CYCLIC_INFO_MSG {i4 " # cycSet # "}}";
WriteLine(sText # " --> CYCLIC_INFO_MSG geändert auf " # cycSet);
}
if ( (cycCh <> cycChSet) && (cycChSet >= 0) ) {
TCL= TCL # " {CYCLIC_INFO_MSG_DIS {i4 " # cycChSet # "}}";
WriteLine(sText # " --> CYCLIC_INFO_MSG_DIS geändert auf " # cycChSet);
}
if ( (cycUCh <> cycUChSet) && (cycUChSet >= 0) ) {
TCL= TCL # " {CYCLIC_INFO_MSG_DIS_UNCHANGED {i4 " # cycUChSet # "}}";
WriteLine(sText # " --> CYCLIC_INFO_MSG_DIS_UNCHANGED geändert auf " # cycUChSet);
}
if ( (iRouting <> iRoutingSet) && (iRoutingSet >= 0) ) {
TCL= TCL # " {ENABLE_ROUTING {boolean " # (iRoutingSet == 1) # "}}";
WriteLine(sText # " --> ENABLE_ROUTING geändert auf " # (iRoutingSet == 1));
}
if ( TCL ) {
string sTCL= ^puts [xmlrpc ^ #oIFace.InterfaceUrl()# ^/ putParamset [list string \"^#oCH.Address()#^\"] [list string \"MASTER\"] [list struct \"^#TCL#^\"]]^;
system.Exec ("/bin/sh -c 'echo \"load tclrpc.so; " # sTCL # "\" |tclsh'",&stdOut,&stdErr);
}
}
}
}
Hier noch Anmerkungen meinerseits :Konkret geht es um das "Problem", das nach einem Neustart der Zentrale es ja einige Zeit (bis zu 1h) dauern kann bis der aktuelle Status von homematicIP Geräten in der WebUI mit dem Status übereinstimmt wie er in Wirklichkeit ist.
Gar nicht. Es ist völlig egal, ob der Ausfall 15 Sekunden oder 15 Stunden dauerte, auch in gerade diesen 15 Sekunden kann jemand ein Fenster geöffnet haben, das anschließend beim Aktivieren der Alarmanlage nicht berücksichtigt wird.
So ist es!hab ich wieder deaktiviert, da innerhalb von nur 10 min bei Beschattung und Nacht es im Zweifelsfalle "komisch" werden kann..
Na ja, man sollte sich dieses Problems bewusst sein und wo es notwendig ist, in Programmen den CCU-Neustart (eben z.B. über die originale "Anwesenheit") berücksichtigen.Ich tendiere z.Zt. grad dazu, den Stuatus der HMIP-Geräte nach einem Reboot wirklich dem System zu überlasen.
Genau.So oft wird es ja wohl nicht rebootet.