Geänderten Wert aus einer Werteliste melden

Ein Dreizeiler, um geänderte Systemvariable vom Typ „Werteliste“ zu melden

Wie man normale Zahlen per Telegram melden kann, hatte ich hier schon beschrieben. Doch was ist mit Wertelisten? Die werden intern auch nur als Zahlenwerte von 0 bis x gespeichert und aus Scripten heraus entsprechend angezeigt.

Im Rahmen meines CCU-Bots stand ich vor der Aufgabe, auch hier eine Lösung zu finden – und zum Glück gibt es eine.

Neue Script-Funktionen

Mit Firmware 2.29.22 wurden neue Funktionen in der Scriptsprache der CCU eingeführt, die auf dieser Seite genutzt werden. Achten Sie darauf, als Logikschicht-Version in den Systemeinstellungen der CCU nicht „Legacy“ zu wählen.

Wenn Sie eine ältere Firmware verwenden oder als Logikschicht-Version „Legacy“ ausgewählt haben, werden Sie Script-Fehler angezeigt bekommen, wenn Sie diese Anleitung umsetzen. Die Programme werden nicht funktionieren.

Aktualisieren Sie die Firmware Ihrer CCU! Wählen Sie „Standard“ als Logikschicht-Version aus!

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.

Als Beispiel verwende ich meine Systemvariable Sonne manuell. Hier kann ich manuell vorgeben, ob die Sonne scheint, es bewölkt ist oder regnet – oder ob ich alles der Automatik überlasse. Andere Programme steuern daraufhin die Beschattung mit Jalousie-Aktoren.

Zunächst das WebUI-Programm.

Die Bedingungen sind widersprüchlich. Entsprechend der Logik von WebUI-Programmen wird das Programm bei jeder Aktualisierung von Sonne manuell gestartet – soviel ist klar. Aber natürlich kann der Wert nicht gleichzeitig sonnig und bewölkt sein. Der Dann…-Teil wird dementsprechend niemals ausgeführt und ist leer.

Das eigentliche Programm steckt im Sonst…-Teil, der entsprechend bei jeder Aktualisierung ausgeführt wird. Wie üblich baue ich ein paar Sekunden Verzögerung ein, um die Vorgänge auf der CCU etwas zu entzerren.

Dann wird folgendes Script ausgeführt:

! HomeMatic-Script
! GEäNDERTEN WERT AUS EINER WERTELISTE MELDEN
! http://www.christian-luetgens.de/homematic/telegram/werteliste/Werteliste.htm

object s = dom.GetObject ("$src$");
integer i = s.Value();
if (i != s.LastValue()) {
  dom.GetObject ("Telegram").State ("*" # s.Name() # "*" # "\n" # s.ValueList().StrValueByIndex (";", i).Trim());
}

!  Ende des Scripts

Das Script sucht sich zunächst die Systemvariable, um die es geht. Ich nehme hier einfach $src$ – eine Pseudo-Variable, in der stets die ID des Datenpunktes gespeichert ist, der das Script aufgerufen hat. In diesem fall ist es Sonne manuell.

Der Wert wird mit dem vorherigen Wert der Variablen verglichen: Wenn er sich nicht geändert hat, sondern nur aktualisiert wurde, brauche ich keine Nachricht. Anderenfalls wird über das T-Framework der aktuelle Wert übertragen.

Der Name der Variablen, durch die das Script aufgerufen wurde, findet sich über .Name(). Die Werteliste, die über die WebUI für die Systemvariable eingegeben wurde, ist durch Semikola getrennt und lässt sich über .ValueList() abfragen. Mit .StrValueByIndex() kann ich dann den passenden Eintrag heraussuchen, mit .Trim() werden überflüssige Leerzeichen davor und danach abgeschnitten und schließlich wird die richtige Nachricht versendet.

Als Bonus nehme ich noch Fettdruck mit, den ich bei meiner T-Framework-Erweiterung aktiviert habe.

Durch die Verwendung von $src$ kann das Programm übrigens universell alle Wertelisten senden, die es gibt – und zwar auch in ein und demselben Programm.

Ich habe hier nur die Wenn…-Bedingung angepasst: Nach Sonne manuell kommt ein gleichfalls widersprüchliches Bedingungspaar für Heizungssteuerung. Damit wird das Script bei jeder Aktualisierung einer dieser Systemvariablen aufgerufen und der passende Wert gesendet.

Wenn man noch den Haken bei Vor dem Ausführen alle laufenden Verzögerungen für diese Aktivitäten beenden entfernt, dann übersteht das Programm es sogar, wenn die Variablen kurz hintereinander geändert werden. Anderenfalls gibt es ein Problem, wenn die zweite Variable geändert wird, während noch eine Verzögerung aufgrund der Änderung der ersten läuft: Die Verzögerung wird abgebrochen und es wird nur der Wert der zweiten (zuletzt geänderten) Variable gesendet.

Navigation