Sabotagemeldung

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

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.

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.

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);
  }
}

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