Ich erhielt den Hinweis von BadenPower, das dein gepostetes Script den ein oder anderen Fallstrick beinhaltet.
- Zum einen löscht du Objekte in der foreach-schleife direkt aus der Referenz auf .UserSharedObjects, was dazu führt, dass fehlerhafte hintereinanderstehende Objekte nicht gelöscht werden, da die Array-Position ja um 1 verringert wird, aber der Indexzähler schon auf der nächsten Position steht.
- Zum anderen kann dein Script keine "schlafenden" Geistervariablen ermitteln und entsprechend löschen.
Zumindest den zweiten Teil konnte ich verifizieren, da ich noch eigene Schläfer auf der CCU hatte.
Der geneigte User kann dies mit folgendem Script prüfen, welches ich mit ausdrücklicher Genehmigung hier veröffentlichen darf und vor allem auch
soll.
Code: Alles auswählen
!Geistervariablen aller Benutzer ermitteln
! homematic-forum.de by BadenPower
object lUsers = dom.GetObject(ID_USERS);
object lSysVars = dom.GetObject(ID_SYSTEM_VARIABLES);
object lUser;
string lEnum1 = "";
string lEnum2 = "";
object lEnumObj2;
integer lCountWrong = 0;
integer lCountDeleted = 0;
if((lUsers) && (lSysVars))
{
foreach(lEnum1,lUsers.EnumIDs())
{
lUser = lUsers.Get(lEnum1);
!WriteLine("User-Objekt: " # lEnum1 # "/" # lUser);
if(lUser)
{
foreach(lEnum2,lUser.UserSharedObjects())
{
lEnumObj2 = dom.GetObject(lEnum2);
!WriteLine("Enum2-Objekt: " # lEnum2 # "/" # lEnumObj2);
if(lEnumObj2)
{
if( (!lSysVars.Get(lEnum2))
|| ( (lEnumObj2.Type() <> OT_ALARMDP)
&& (lEnumObj2.Type() <> OT_VARDP)
)
)
{
!Geistervariable falscher Typ
WriteLine("Fehler:");
WriteLine("Benutzername: " # lUser.Name() # " mit der ID: " # lUser.ID())
WriteLine("Objekt mit dem Objekttyp " # lEnumObj2.TypeName() # " und der ID " # lEnum2 # " gefunden!");
WriteLine("Objektname: " # lEnumObj2.Name());
WriteLine("");
lCountWrong = lCountWrong + 1;
}
}
else
{
!Geistervariable ID nicht auf der CCU vorhanden
WriteLine("Fehler:");
WriteLine("Benutzername: " # lUser.Name() # " mit der ID: " # lUser.ID())
WriteLine("nicht vorhandenes Objekt mit der ID " # lEnum2 # " gefunden!");
WriteLine("");
lCountDeleted = lCountDeleted + 1;
}
}
}
}
if((lCountDeleted == 0) && (lCountWrong == 0))
{
WriteLine("Keine Fehler gefunden!");
}
else
{
WriteLine( (lCountDeleted + lCountWrong).ToString(0) # " Fehler gefunden!");
}
}
WriteLine("Abfrage beendet");
Warum betone ich vor allem soll
BadenPower hat von sich aus Kontakt mit mir aufgenommen und hat mich darauf hingewiesen das der Fehler dort besteht.
Nein, überhaupt nicht um mit dem Finger auf irgend wen zu zeigen
Nein, er hat mich auch nicht darum gebeten, hier Propaganda zu betreiben.
Er wollte den Forum Usern helfen. und
ich füge noch hinzu:
trotz allem
Ich denke, das ist ihm hoch anzurechnen. Vielen Dank @ BadenPower
[EDIT]
Und hier noch als logische Konsequenz das entsprechende Script, welches die Geistervariablen aller User auch löscht.
Ebenso mit Genehmigung und ausdrücklichen Wunsch zur Veröffentlichung von BadenPower, um zu helfen.
viewtopic.php?f=31&t=40217#p398318
Bitte dort weiter schreiben zum Script.
Sollte es in Zukunft nötig sein, an den Scripten Änderungen durchzuführen, kann ich es besser updaten.
BadenPower kann es ja nicht.
Alchy