Sabotagemeldung

Bei Sabotage steht in der E-Mail, welches Gerät betroffen ist

2954 Zeichen
Score aktualisiert
100%
Code: 3e4487cc8e384a35b8c8e58e627843a3
Token in Entwicklung nicht aktualisiert
img-Tag in Entwicklung deaktiviert

Oft ist es sinnvoll, in einer E-Mail dynamisch einzutragen, welches Gerät die Benachrichtigung ausgelöst hat. Sind die Kanäle einzeln im WebUI-Programm aufgelistet, ist die Auswertung ein Kinderspiel.

Wenn jemand in meinem Vorgarten den Bewegungsmelder abknickt, dann möchte ich das schon gerne wissen. Zum Glück sind die Bewegungsmelder der HomeMatic mit Sabotageerkennung ausgestattet, auf die die CCU programmatisch reagieren kann.

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.

String-Verlängerung

In den Scripten auf dieser Seite werden Strings verlängert (x = x # y). Dies führt oft zu Störungen bei der Ausführung von Programmen:

  • Scripte in Programmen werden nicht mehr ausgeführt
  • bei der Fehlerprüfung erscheinen unerklärliche Syntax-Fehler

Durch einen Neustart werden diese Probleme (vorübergehend) behoben. Auch hier hängt die Dauer, bis es zu Störungen kommt, davon ab, wie häufig diese Programmschritte ausgeführt werden.

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.

Ich habe daher ein simples WebUI-Programm geschrieben, das die Sabotagekontakte der fraglichen Bewegungsmelder beobachtet und bei Sabotage Alarm schlägt.

Der Bewegungsmelder auf dem Flur gehört natürlich eigentlich nicht in die Liste – aber ich hatte halt keine Lust, zum Testen in die Kälte zu rennen und habe darum einfach den nächstgelegenen hinzugefügt.

Bei einem solchen Programm ist es sehr leicht, den auslösenden Kanal ausfindig zu machen: Für die Verarbeitung im Script wird der Parameter $src$ übergeben, der die ID des Datenpunktes enthält, der das Programm ausgelöst hat.

Man kann also einfach im Script diese Information verarbeiten.

! HomeMatic-Script
! SABOTAGEMELDUNG
! http://www.christian-luetgens.de/homematic/e-mail/sabotage/Sabotagemeldung.htm

object o_dp = dom.GetObject ("$src$");
if (o_dp) {
  if (o_dp.Value()) {
    string s_subj = "Sabotage erkannt";
    string s_body = "Es wurde Sabotage erkannt.";
    object o_channel = dom.GetObject (o_dp.Channel());
    s_body = s_body # "\n\nDiese Benachrichtigung wurde durch das folgende Gerät ausgelöst:\n" # o_channel.Name();
    dom.GetObject ("E-Mail.Subject").State (s_subj);
    dom.GetObject ("E-Mail.Body").State (s_body);
    dom.GetObject ("E-Mail.Versand").State (1);
  }
}

!  Ende des Scripts

Zunächst suche ich mit $src$ den auslösenden Datenpunkt. Wird er gefunden und  meldet ausgelöste Sabotage, definiere ich meine Standard-Variablen für Subject und Body der Benachrichtigungs-E-Mail und weise ihnen sinnvolle Texte zu. Anschließend suche ich mir den zum Datenpunkt gehörenden Kanal und ergänze den Text der E-Mail um einen hilfreichen Hinweis.

Wenn $src$ nicht gesetzt ist, weil das Programm z. B. manuell ausgelöst wurde, dann wird natürlich auch kein auslösender Kanal gefunden. Das Script macht in diesem Falle nichts – aufgrund der Logik von WebUI-Programmen würde es sonst bei mehr als einem sabotierten Bewegungsmelder auch bei Beenden der Sabotagemeldungen noch Benachrichtigungen senden.

Zum Schluss setze ich die Systemvariablen meines Mini-Frameworks und schicke die E-Mail dadurch ab – mit meiner ersten E-Mail-Vorlage, die bei mir ja für „Fehler“ steht. Sekunden später habe ich eine informative E-Mail im Postfach.

In einer früheren Version des Scriptes habe ich .Device() benutzt, um den Namen des Gerätes herauszufinden, das die Sabotagemeldung auslöst. Nach dem Feedback eines Lesers habe ich nochmal gründlich darüber nachgedacht und das Script korrigiert: Ausgelöst wird es durch einen Datenpunkt, davon ausgehend ermittle ich mit .Channel() den Namen des Kanals. Das Gerät brauche ich gar nicht.

Navigation