Einführung: Funktionssichere Programmierung

Anhand eines einfachen Beispiels wird gezeigt, wie man Programme gegen verschiedene Kommunikationsstörungen absichern kann

3408 Zeichen
Score aktualisiert
100%
Code: 1c9ebd3a43ad49ba91b0b03ff12dab97
Token in Entwicklung nicht aktualisiert
img-Tag in Entwicklung deaktiviert

Die HomeMatic funkt auf einem öffentlichen Frequenzband und mit relativ wenig Sendeleistung, daher lassen sich Störungen bei der Funkverbindung kaum vermeiden. Bei der Programmierung sollte man daher darauf achten, dass Aktoren von selbst in einen „sicheren“ Zustand zurückfallen, auch wenn der Funkkontakt zur CCU abreißt.

Auf den folgenden Seiten werde ich ein einfaches Programm verwenden, das über die Astrofunktion nachts die Außenbeleuchtung schaltet. Das Beispiel stammt aus der Praxis: Die Aktoren für die Beleuchtung sind bei mir in IP68-Kästen über den gesamten Garten verteilt, also relativ weit entfernt von der CCU und direkt auf dem Boden. Feuchte Erde sorgt für herrliche Funkstörungen.

Auch in anderen Bereichen ist es manchmal wichtig, dass ein Aktor garantiert nach einer gewissen Zeit ausgeschaltet wird, z. B. bei der Heizungssteuerung.

Benennung von Systemvariablen

Prinzipiell kann man Systemvariablen – so wie allen Objekten in der CCU – beliebige Namen geben, also z. B. auch Umlaute und Sonderzeichen verwenden. Ich empfehle jedoch, sich auf reguläre Buchstaben (a-z, A-Z) zu beschränken: Bei Umlauten und Sonderzeichen besteht die Gefahr, dass Systemvariablen in Scripten nicht überall gefunden werden.

Programm

Die erste Version meines Programms für die Außenbeleuchtung ist simpel: Ich verwende die Astro-Funktion und das Zeitmodul der CCU, um „abends“ die Beleuchtung einzuschalten und „tagsüber“ wieder aus.

Im Zeitmodul ist die Astrofunktion ausgewählt. In einem späteren Schritt werde ich hier stattdessen meine Tageszeit-Systemvariable nutzen.

Das Programm funktioniert super, hat aber mehrere Nachteile:

Kollisionen

Die CCU sendet die Ein- bzw. Ausschaltbefehle so schnell wie möglich. Das führt leicht zu Kollisionen bei der Funkübertragung. Durch verzögerte Aussendung kann man dieses Problem beheben.

Befehle gehen unter

Die CCU wartet nur wenige Sekunden darauf, dass ihre Befehle quittiert werden, und erzeugt dann eine Servicemeldung. Mit unbegrenzter Wiederholung der Sendung kann man sicherstellen, dass ein Schaltbefehl garantiert irgendwann ausgeführt wird.

Zeitmodul

Das Zeitmodul der CCU neigt dazu, auszufallen. Bei täglichen Aktionen kommt das nicht so häufig vor, doch bei periodischer Ausführung mit kurzen Zeitabständen wird es zunehmend unzuverlässig. Daher programmiere ich mir meinen eigenen Taktgeber.

Funkstörungen

Bei Funkstörungen wird das Licht nicht eingeschaltet oder – beinahe noch schlimmer – nicht wieder aus. Zusammen mit meinem Taktgeber kann die Funktion „Einschaltdauer“ des jeweiligen Aktors dieses Problem lösen.

Aktoren melden ihren Status nicht

Oft hängen Programme davon ab, dass die CCU weiß, ob ein Aktor ein- oder ausgeschaltet wird. Wenn ein Aktor seinen Status aufgrund von Funkstörungen seinen Status nicht übermitteln konnte, arbeitet die CCU mit veralteten Informationen. Eine regelmäßige Statusprüfung umgeht das Problem.

Hänger der CCU

Mein Programm sendet bei Ausführung an alle Aktoren einzeln den Befehl zum Ein- bzw. Ausschalten. Selbst im Idealfall schalten die Aktoren nicht synchron, sondern leicht verzögert. Bei Funkstörungen unternimmt die CCU mehrere Sendeversuche, so dass andere Programme hängen. Ein virtueller Taster behebt dieses Problem.

Installationsprobleme

Bei langanhaltenden Funkstörungen nützt die beste Programmierung nichts: Manchmal ist es nötig, die Installation zu ändern oder Repeater einzusetzen, damit alle Komponenten Funkkontakt zueinander aufbauen können.

Servicemeldungen

Wenn eine Funkstörung aufgetreten ist, zeigt die CCU zwei Servicemeldungen an. Zum Abschluss daher zwei Programme, die die nervige Servicemeldung „Kommunikation war gestört“ automatisch bestätigen und erneuten Verbindungsaufbau versuchen.

Navigation