Bewegungsmelder über Telegram abfragen

Von unterwegs gucken, wann zuletzt jemand durchs Treppenhaus lief – mit dem CCU-Bot kein Problem

Auf dieser Seite

Ähnlich wie das Thema Servicemeldungen sind auch Bewegungsmelder ein immer wiederkehrender Dauerbrenner. Beim Mini-Framework hatte ich kurz beschrieben, wie man eine Standard-Meldung verschickt, wenn jemand durch den Garten schleicht. Später habe ich die Bewegungsmelder beim T-Framework hergenommen, um den auslösenden Bewegungsmelder per Telegram zu melden.

Hier soll es nun darum gehen, dass der CCU-Bot auf Anforderung eine Gesamtübersicht aller Bewegungsmelder sendet. Das ist insofern interessant, als man sehen kann, wann ein Bewegungsmelder zuletzt ausgelöst wurde. Wenn man morgens um sieben das Haus verlassen hat und dann feststellt, dass um elf Bewegung im Treppenhaus war, sollte einem das zu denken geben.

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.

WebUI-Programm

Die eigentliche Programmlogik steckt wie immer im Script, entsprechend ist das WebUI-Programm wie immer sehr einfach.

Eigentlich könnte ich für die CCU-Bot-Programme stets denselben Screenshot nehmen – dieser Teil sieht schließlich immer gleich aus: Das Programm reagiert auf Telegram.Command und wird ausgeführt, wenn dort keine leere Zeichenkette gespeichert ist.

Script

Das Script, das durch Telegram.Command ausgelöst wird, ist immerhin etwas anspruchsvoller als meine bisherigen Befehle. Weltbewegend ist es nicht.

! HomeMatic-Script
! BEWEGUNGSMELDER üBER TELEGRAM ABFRAGEN
! http://www.christian-luetgens.de/homematic/ccubot/bewegung/Bewegungsmelder.htm

object o = dom.GetObject ("Telegram.Command");

if (o.Value() == "/bewegung") {
  string s;
  object chn;
  object dp;
  string status;
  string res = "*Status Bewegungsmelder*" # "\n\n";
  foreach (s, dom.GetObject (ID_CHANNELS).EnumUsedIDs()) {
    chn = dom.GetObject (s);
    if (chn.HssType() == "MOTION_DETECTOR") {
      dp = chn.DPByHssDP("MOTION");
      status = ("keine Bewegung;*Bewegung erkannt*").StrValueByIndex (";", dp.Value().ToInteger());
      res = res # "*" # chn.Name() # "*" # "\n" # "    " # status # " _" # dp.Timestamp().Format ("%d.%m. %H:%M") # "_" # "\n";
    }
  }
  dom.GetObject ("Telegram").State (res);
  o.State ("");
}

!  Ende des Scripts

Zunächst wird, wie immer, die Systemvariable gesucht und nachgeschaut, ob das Script sich zuständig fühlt und irgendwas machen soll. Wenn tatsächlich „/bewegung“ in der Variablen steht, geht’s los.

Das Script geht der Reihe nach alle Kanäle durch, die auf der CCU definiert sind. Wird ein Kanal vom Typ MOTION_DETECTOR erkannt (also: Bewegungsmelder), so wird der Datenpunkt MOTION (also: Bewegung) gesucht und dessen Zustand dem String res hinzugefügt. Ich definiere keinerlei Einschränkungen bei der Auswahl meiner Bewegungsmelder: Alle Melder in allen Räumen und allen Gewerken werden überprüft.

Für jeden Bewegungsmelder gibt es dabei zwei Zeilen in res:

Erste Zeile

Name des Kanals als fettgedruckte Überschrift

Zweite Zeile

aktueller Status (man beachte, wie ich elegant ohne if … then … else auskomme) sowie Datum und Uhrzeit der letzten Rückmeldung

Zum Schluss wird über das T-Framework die Nachricht versendet und Telegram.Command wieder zurückgesetzt, damit nicht meine Hilfe-Funktion anspringt.

Und hopp!

Ich schicke hoffnungsfroh meinen Befehl ab und wenige Minuten später antwortet mein CCU-Bot.

Wie man sieht, derzeit keinerlei Bewegung im Haus – und ich war lange nicht mehr im Treppenhaus oben.

Navigation