ich habe im Forum nichts zu dem Thema gefunden, von daher poste ich mal, wie ich das Problem gelöst habe. Wenn es andere Lösungen gibt, bin ich natürlich auch daran interessiert.
Das Problem: nach einem Reboot/Stromausfall der CCU gibt eine Abfrage des Zustands der batteriebetriebenen HmIP (Fenster-)sensoren den letzen Zustand vor dem Reboot zurück alle Fenster als "geschlossen" zurück. Öffnet oder schließt man während des War vor dem Stromausfall/Reboot ein Fenster offen, ist der Zustand in der CCU nach dem Reboot nicht vertrauenswürdig bis sich der Sensor wieder gemeldet hat. Alle Programme, die aufgrund des Zustands etwas auslösen sollten also nur ausgeführt werden, wenn der Zustand vertrauenswürdig ist (z.B. Abfrage auf Anzahl offener Fenster).
Meine Lösung: für jeden Sensor habe ich eine Logik Systemvariable, die auf wahr gesetzt wird, wenn sich ein Sensor nach dem Reboot der CCU das erste mal gemeldet hat. Um diese Variable zu setzen habe ich für jeden Sensor ein "Miniprogramm", dass auf die erste Meldung wartet, die Variable setzt und sich dann deaktiviert. Nach dem Reboot habe ich ein "init" Script dass unter anderem die Variable auf falsch setzt und das Miniprogramm aktiviert.
Die Einstellung am Sensor selbst bewirkt, dass er sich spätestens nach einer knappen Stunde meldet: Auszug aus den Systemvariablen: Auszug aus dem init script, dass nach einem Reboot läuft:
Code: Alles auswählen
! 1. Alle SV für Verschlüsse zurücksetzen
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Init_Arbeitszimmer_Fenster").State(false);
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Init_Bad_Fenster").State(false);
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Init_Esszimmer_Fenster").State(false);
! [...]
! 4. Alle Programme für Initialisierung auf aktiv setzen
dom.GetObject(ID_PROGRAMS).Get("Init_Arbeitszimmer_Fenster").Active(true);
dom.GetObject(ID_PROGRAMS).Get("Init_Bad_Fenster").Active(true);
dom.GetObject(ID_PROGRAMS).Get("Init_Esszimmer_Fenster").Active(true);
Das Script selbst ist für jedes Fenster identisch. Es setzt die gleichnamige Systemvariable und deaktiviert das Programm:
Code: Alles auswählen
! Aktualisiert SV (muss den gleichen Namen wie das Programm haben!!!) und setzt Programm inaktiv
! Ruft am Ende das Programm 1_Monitor_Aktualisieren auf!!!
if ( dom.GetObject("0_CCU_REBOOT").Value() == false) {
string sv_name = dom.GetObject("$this$").Name();
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sv_name).State(true);
dom.GetObject("$this$").Active(false);
dom.GetObject("1_Programme_loggen").State(dom.GetObject("$this$").Name() #" wurde am "#system.Date("%d.%m. %H:%M Uhr") #" deaktiviert");
dom.GetObject(ID_PROGRAMS).Get("1_Verschluss_Aktualisieren").ProgramExecute();
}
Vielleicht ist das "mit Kanonen auf Spatzen" geschossen, aber für mich funktioniert es recht gut.
Gruß,
Yosh