Ich habe mir das HomeMatic-System zugelegt, um damit meine Wohnung abzusichern. Nachdem ich die ersten Programme noch als reine Wenn-Dann-Programme erstellt habe, wollte ich auch noch Handsender zum Deaktivieren des Alarmstatus einsetzen. Da mir jedoch ein einfacher Tastendruck als zu unsicher erscheint, lag für mich die Realisierung eines Code-Schlosses nahe. Zu diesem Thema gibt es einen interessanten ELV-Fachbeitrag von Herrn Mich. Allerdings arbeitet er mit Integer-Variablen, was bei der Verwendung mehrerer Sender keine Zuordnung des verwendeten Senders mehr zuläßt. Mein Ansatz war, ein ähnliches System mit String-Variablen zu realisieren.

Dabei fielen mir einige Ungereimtheiten in der Skript-Programmierung auf, die mich einige Zeit kosteten (um die richtigen Problemlösungen zu finden):

1. Zugriff auf Variableninhalte:

Herfür gibt es mehrere Methoden, die aber leider nicht einheitlich funktionieren.

So steht sowohl in der Sprachbeschreibung (V1.2) und in der Objektbeschreibung (V1.2), daß auf den Variableninhalt mit der Methode .Value() zugegriffen werden kann. Bei Systemvariablen funktioniert dieser Zugriff lesend korrekt, das Schreiben funktioniert aber im Gegensatz zur Beschreibung gar nicht !

Aus anderen Skripten habe ich entnommen, daß stattdessen die Methode .State() sowohl für das Lesen als auch für das Schreiben von Systemvariablen funktioniert.

Wendet man die Methode .Value() auf eine lokale Variable an, bekommt man ein Systemdatum zurückgeliefert, aber nicht den aktuellen Wert. Für lokale Variablen funktioniert allerdings die direkte Zuweisung (a = b).

Diese Inkonsistenzen und Abweichungen von der Beschreibung kann ich nicht nachvollziehen.

2. Doppelte Ausführung von zeitgetriggerten Aktionen verhindern:

Soweit ich diverse Beschreibungen verstanden habe, soll ein Aktivieren des Auswahlfeldes "Vor dem Ausführen alle laufenden Verzögerungen für diese Aktivitäten beenden" alle bereits früher vorgemerkten Aktionen, die sich auf die gleichen Einträge beziehen, löschen. Dies funktioniert bei mir jedoch nicht, wenn ich als Aktion einen Skript ausführen will. - Der Skript wird in meinem Fall nach jeder Änderung der abgefragten Systemvariable wieder ausgeführt, obwohl die Ausführung um 10 Sekunden verzögert erfolgen sollte.

Als Umgehung habe ich in das Skript eine eigene Zeitabfrage eingebaut, die die eigentliche Aktion erst dann durchführt, wenn 9 Sekunden seit der letzten Variablenaktualisierung vergangen sind. (im Skript habe ich 9 Sekunden eingestellt, um nicht mit der Zeitverzögerung von 10 Sekunden zu kollidieren)

Letztlich habe ich also die Funktion, die das Häckchen erfüllen sollte, in meinem Skript explizit nachprogrammieren müssen - eigentlich ein unnötiger Aufwand.

3. Datumsformat

Bei der Bestimmung der Zeitdauer seit der letzten Aktualisierung meiner Variablen habe ich folgendes Problem festgestellt:

Auszug aus meinem Skript:
time x_time = system.Date();
WriteLine(x_time); ! Liefert z.B. 20:45:05 22.01.2017

object o_1=dom.GetObject("Aktionscode");
x_time = o_1.Timestamp();
WriteLine(x_time); ! Liefert z.B. 2017-01-22 20:34:53

Warum in einem Fall zuerst die Zeit und dann das Datum und im anderen Fall die umgekehrte Reihenfolge zurückgegeben wird, kann ich nicht nachvollziehen. Eine Folge dieser Inkonsistenz ist jedoch, daß die Methoden .Hour(), .Minute() sowie .Second() mit der Systemzeit nicht funktionieren. Hier bleibt nur, mit Hilfe der String-Methode .Substr(anfang,laenge) die gesuchten Einträge für eine Weiterverarbeitung zu beschaffen.


Ich hoffe, daß diese Erkenntnisse dem einen oder anderen Programmierer die Arbeit etwas erleichtern. Weiterhin hoffe ich, daß die Skriptprogrammierung bei einem nächsten Firmware-Update entsprechend beeinigt wird und daß auch die Dokumentation entsprechend angepaßt wird.