Bewegung erkannt

Ein Beispiel-Programm, um erkannte Bewegung zu melden

Auf dieser Seite

Eines meiner einfachen Beispielprogramme für das Mini-Framework ist die Meldung von Sabotage-Kontakten bei Bewegungsmeldern. Für mein T-Framework wandle ich das Programm etwas ab und lasse mir Nachrichten senden, wenn jemand durch mein Treppenhaus schleicht – der einzige Bereich, in dem ich derzeit innen Bewegungsmelder installiert habe.

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.

WebUI-Programm

Das WebUI-Programm ist ähnlich einfach wie beim Sabotage-Programm: Sobald ein Bewegungsmelder ausgelöst wird, startet das Programm und führt ein Script aus.

Ich habe bei Änderung auslösen gewählt, damit bei wiederholter Bewegung nur einmal eine Nachricht gesendet wird.

Für die Praxis, wenn das Programm z. B. als Teil einer Alarmanlage eingesetzt wird, könnte man unter dem ersten Wenn…-Block noch einen mit UND verknüpften Block anhängen, der überprüft, ob eine Systemvariable scharfgeschaltet ist.

Niemand möchte eine Alarmanlage haben, die man nicht unscharf schalten kann.

Script

Das Script entspricht ebenfalls weitgehend dem Script aus dem Sabotage-Programm.

! HomeMatic-Script
! BEWEGUNG ERKANNT
! http://www.christian-luetgens.de/homematic/telegram/bewegungsmelder/Bewegung_melden.htm

object o_dp = dom.GetObject ("$src$");
if (o_dp) {
  if (o_dp.Value()) {
    object o_channel = dom.GetObject (o_dp.Channel());
    dom.GetObject ("Telegram").State ("Bewegung: " # o_channel.Name());
  }
}

!  Ende des Scripts

Auch hier wird zunächst der auslösende Bewegungsmelder gesucht. Wenn er gefunden wird und Bewegung erkannt hat, dann wird eine Meldung mit seinem Namen versendet. Wird keiner gefunden, weil das Programm zum Beispiel manuell gestartet wurde, oder meldet der auslösende Bewegungsmelder keine Bewegung (mehr), dann macht das Programm nichts.

In einer früheren Version hatte ich hier .Device() verwendet, um den Namen des auslösenden Bewegungsmelders zu ermitteln. Das hat funktioniert, darum habe ich nicht weiter darüber nachgedacht. Bei einem aufmerksamen Leser tauchten auf dem Raspberry jedoch Fehlermeldungen auf, denn $src$ liefert den Datenpunkt, aus dem ich dann den Kanal ermitteln muss, und nicht einen Kanal.

Die Prüfung, ob Bewegung erkannt wurde, erscheint im ersten Moment sinnlos, erklärt sich jedoch aus der Logik von WebUI-Programmen: Das Programm wird nicht nur bei erkannter Bewegung ausgelöst, sondern auch beim Zurücksetzen des Bewegungsmelders auf „keine Bewegung“. Wenn in diesem Moment noch ein anderer Bewegungsmelder ausgelöst ist, dann ist die Wenn…-Bedingung weiterhin erfüllt und das Script läuft durch.

Test

Ich springe auf und laufe durch das Treppenhaus und …

Der Bewegungsmelder startet das Programm, das Programm setzt die Systemvariable und das T-Framework sendet sie erfolgreich an Telegram.

Navigation