Kanalzustand versenden

Dieses kleine Script versendet nicht nur den auslösenden Kanal, sondern auch dessen Zustand

Auf dieser Seite

Beim Bewegungsmelder ging es nur darum, eine E-Mail zu versenden, wenn Sabotage erkannt wurde. Was aber, wenn man auch den Zustand eines Kanals erfahren möchte? Das zeige ich anhand dieses kleinen Scripts.

Variablen in HomeMatic-Scripten

Die CCU hatte früher ein Limit von maximal 200 Variablen, das mit Firmware-Version 2.29.18 aufgehoben wurde. Dieses Limit bezog sich auf alle Variablen, die in allen Scripten verwendet werden. Gemeint sind Variablen, die direkt im Script definiert werden: object x; object y; var z;

Wenn Scripte nicht mehr funktionieren und bei der Prüfung unerklärliche Syntax-Fehler auftreten, sollte versuchsweise dieses Programm wieder gelöscht oder deaktiviert werden – oder, noch besser, auf die aktuelle Firmware-Version aktualisiert werden.

Strings in HomeMatic-Scripten

Durch String-Verwendung in HomeMatic-Scripten kann die CCU fehlerhaft arbeiten, instabil werden oder sogar abstürzen. Grundsätzlich gilt: Je öfter mit Strings hantiert wird, desto eher führt dies zu Problemen.

Ich empfehle daher, nach Umsetzung dieser Anleitung die CCU unter Beobachtung zu halten.

Die Aufgabe

Als Beispiel nehme ich die Tür-/Fensterkontakte in meinem 1. OG.

Normalerweise interessiert es mich nicht, ob da was bewegt wird: Wenn der Tag gekommen ist, an dem ich eine E-Mail brauche, um zu erfahren, dass ich gerade die Tür zum Bad geöffnet habe, dann brauche ich vermutlich auch jemanden, der die Tür für mich öffnet. Und hinter mir schließt. Und mir bei allem behilflich ist, was ich im Bad hinter verschlossener Tür so treibe.

Aber zum Testen sind es gute Objekte, weil die Türen hübsch häufig bewegt werden.

Tatsächlich entstammt diese Aufgabe nicht meiner eigenen Phantasie, sondern einer Anfrage über mein Kontaktformular. Das zeigt zweierlei: Erstens, dass ich gelegentlich meine E-Mails lese, und zweitens, dass ich deren Inhalt hemmungslos auf meinen Seiten verwurste. Ich stehe dazu. Vielen Dank! Gebt mir mehr!

WebUI-Programm

Das Programm wird ausgelöst, wann immer sich eine der überwachten Türen bewegt.

Wichtig ist hier, dass für jeden Kontakt sowohl für offen als auch für geschlossen eine Wenn … -Bedingung eingefügt wird, da bei jeder Bewegung das Script ausgeführt werden soll.

Die Gruppierung in meinem Programm habe ich der Übersichtlichkeit halber hinzugefügt. Es ist vollkommen egal, an welcher Stelle der auslösende Kontakt steht – es sind also auch beliebige Verknüpfungen mit und und oder möglich.

Wenn weitere Bedingungen verknüpft werden, also wenn zum Beispiel nur bei Abwesenheit E-Mails gesendet werden sollen, dann müssen diese zusätzlichen Bedingungen auf nur prüfen gesetzt sein. Anderenfalls wird das Script auch durch diese Bedingungen ausgelöst. Es liefert dann bestenfalls den Status der zusätzlichen Bedingung, schlimmstenfalls gar nichts.

Ich habe mich für meine Tür-/Fensterkontakte für bei Änderung entschieden: Die Kontakte senden ihren Status mit 30 Sekunden Verzögerung, da sie nur für meine Klimasteuerung gebraucht werden und ich die Batterien dafür nicht unnötig zu belasten brauche. Das bedeutet, wenn ich eine Tür nur kurz öffne und gleich wieder schließe, sendet der Kontakt wiederholt den geschlossen-Status. Bei Aktualisierung würde er dann auch jedes Mal eine E-Mail senden – bei Änderung nur, wenn sich der Status ändert.

Mehr dazu findet man in der Logik von WebUI-Programmen.

Script

Das Script ist erfreulich kurz:

! HomeMatic-Script
! KANALZUSTAND VERSENDEN
! http://www.christian-luetgens.de/homematic/e-mail/zustand/Zustand_melden.htm

object o_dp = dom.GetObject ("$src$");
if (o_dp) {
  string s_status = "geschlossen;offen".StrValueByIndex (";", o_dp.Value());
  object o_channel = dom.GetObject (o_dp.Channel());
  string s_channel = o_channel.Name();
  string s_subject = s_channel # " " # s_status;
  string s_body = "Der Türkontakt " # s_channel # " wurde bewegt. Die Tür ist jetzt " # s_status # ".";

  dom.GetObject ("E-Mail.Subject").State (s_subject);
  dom.GetObject ("E-Mail.Body").State (s_body);
  dom.GetObject ("E-Mail.Versand").State (2);
}

!  Ende des Scripts

Der einzige Haken ist der Betreff: Umlaute kommen nicht sauber an, darum habe ich als Text „offen“ genommen und nicht etwa „geöffnet“. Falls in den Kanal-Bezeichnungen Umlaute enthalten sind, werden diese im Betreff ebenfalls beschädigt.

Das Problem habe ich bei meiner Namenskonvention zum Glück nicht, aber selbst wenn: Es ist ein Schönheitsfehler und tut der Funktion keinen Abbruch. Im Text brauche ich auf Umlaute keine Rücksicht zu nehmen.

Als Ergebnis habe ich kurze Zeit später einen Stapel E-Mails im Postfach.

In einer früheren Version habe ich den Namen des auslösenden Geräts mit .Device() ermittelt. Das war falsch, denn $src$ liefert keinen Kanal, sondern einen Datenpunkt – die nächsthöhere Ebene ist der Kanal, dann erst kommt das Gerät. Tatsächlich brauchte ich auch nur den Kanal. Ich habe das Script daher korrigiert.

Navigation