_Diese Anleitung stammt von Peter Albus und wurde für ihn hier veröffentlicht. Ihr findet diesen Post ebenso im Homematic-Forum. Peter Albus findet ihr auch per Twitter oder direkt auf seinem Blog._

Der HM-SCI-3-FM arbeitet ja mit einer Batterie und muss somit energiesparend betrieben werden. Daher wird der Sender und Empfänger jedes einzelnen Kanals im HM-SCI-3-FM nur bei einer Statusänderung der Kontakte oder ca. alle 24 Std. aktiv. Dies führt dazu, dass eine CCU leider nicht aktiv den Status der Eingänge (Schließer) abfragen kann, sondern auf eine Meldung jedes einzelnen Kanals des HM-SCI-3-FM warten muss.

Wird nun eine CCU neu gestartet (Reboot) so merkt sich die CCU leider nicht den letzten Status des HM-SCI-3-FM, sondern geht bis zur nächsten Meldung des HM-SCI-3-FM einfach davon aus, dass alle Eingänge geschlossen sind. War ein Eingang des HM-SCI-3-FM vor dem Neustart der CCU offen so geht die CCU von einem falschen Zustand aus, bis sich entweder der Zustand am HM-SCI-3-FM ändert oder die 24 stündige Regelmeldung an der CCU eintrifft.

Wie kann man nun mit diesem Verhalten umgehen?

Hier kann man sich zu Nutze machen, dass in den neuen Firmware-Versionen der CCU bei einem Neustart der Zustand von Systemvariablen erhalten bleibt.

Man weist also einfach mittels eines Programms bei jeder Statusänderung der Kanäle des HM-SCI-3-FM einer entsprechenden Systemvariablen den Status zu und arbeitet bei der Auswertung des Status nur mit den Systemvariablen.

Leider ist es doch etwas komplizierter, denn bei Neustart der CCU werden die entsprechenden Programme auch ausgelöst, da die CCU die Eingangsdaten des HM-SCI-3-FM mit „geschlossen“ belegt und somit das Ereignis auslöst. Damit würde man dann in einfachen Programmen prompt den „geretteten“ Zustand direkt wieder überschreiben und hätte nichts gewonnen.

Glücklicherweise gibt es auch dafür eine Lösung. Man macht die Zuweisung an die Systemvariable in einem Script und wertet dort die Variable $src$ aus. $src$ ist bei Auslösung eines Ereignisses mit einem Verweis auf das Auslösende Gerät / Kanal belegt. Wird ein Ereignis durch einen CCU Start ausgelöst, so ist $src$ aber nicht definiert. Dies kann man in einen kleinen Skript prüfen und die Zuweisung des Status an die Systemvariable nur durchführen, wenn das Ereignis von einem Gerät kommt.

Da bei absolut erstmaliger Benutzung der Systemvariablen vor der erstmaligen Meldung des HM-SCI-3-FM ein quasi undefinierter Zustand herrscht, auf den. man ggf. speziell reagieren möchte, habe ich meine Systemvariablen als Werteliste erstellt (in meinem Beispiel die Systemvariable ‚AA-aktiv‘ mit den Werten ‚undefiniert;aktiv;inaktiv‘ – siehe Bild 1).

Definition_der_Systemvariable

 

Bild 1: Definition der Systemvariable.

Nun erstellt man sich für jeden Kanal des HM-SCI-3-FM ein Programm, welches bei Aktualisierungsmeldung vom Schließer den Zustand in die entsprechende Systemvariable übernimmt. In meinem Beispiel heißt das Programm ‚AA Aktivierung‘ und verarbeitet die Aktualisierungsmeldungen der Kanals ‚Alarm aktiviert‘ des HM-SCI-3-FM (siehe Bild 2). Je nach Meldung ‚offen‘ oder ‚geschlossen‘ wird das jeweilige Skript zum Setzen der Systemvariablen ausgeführt.

Programm

Bild 2: Programm zu Übernehmen des Status des Kanals in die Systemvariable.

Bei den Skripts wird zunächst die Variable $src$ benutzt, um der lokalen Variablen ’source‘ den Verweis auf das Ereignis auslösende Objekt zuzuweisen. Wir erinnern uns, dieser Verweis ist nicht gültig, sofern das Skript aus einem Programm aufgerufen wurde, dass die CCU im Rahmen eines Neustarts ausführt. Daher wir dann im Skript mit der folgenden ‚if‘ Abfrage die Gültigkeit von ’source‘ überprüft und nur bei Gültigkeit die Zuweisung an die Systemvariable ‚AA-aktiv‘ durchgeführt (siehe Bild 3 und Bild 4).

Bei Systemvariablen mit Wertelisten muss man in einem Skript anstatt des Wert-Textes einen Dezimalwert zuweisen, welcher der Position des Wert-Elements in der Werteliste entspricht. Meine Werteliste ist ja ‚undefiniert;aktiv;inaktiv‘. Hierbei hat der Wert ‚undefiniert‘ den Dezimalwert ‚0‘, der Wert ‚aktiv‘ entspricht ‚1‘ und der Wert ‚inaktiv‘ wird mit ‚2‘ repräsentiert. Das Skript in Bild 3 setzt also die Systemvariable ‚AA-aktiv‘ auf den Wert ‚aktiv‘ (1). Das Skript in Bild 4 setzt die selbe Systemvariable auf den Wert ‚inaktiv‘ (2).

Skript1

Bild 3: Script setzt die Systemvariable ‚AA-aktiv‘ auf den Wert ‚aktiv‘ (1)

Skript2

Bild 4: Script setzt die Systemvariable ‚AA-aktiv‘ auf den Wert ‚inaktiv‘ (2)

Ich hoffe, ich kann Euch damit helfen und freue mich auf Euer Feedback.