Homematic: Anwesenheits-Status “Zuhause” oder “abwesend” zuverlässig automatisch erkennen ?

Ein neues Kleinprojekt für das Homematic-Haussteuerungssystem:

Die Homematic Bewegungsmelder sind gut und zuverlässig. Sie gibts für innen und außen und sie schalten beliebige Homematic Komponenten bei erkannter Bewegung. Soweit so gut.
Aber was, wenn man das Gegenteil erreichen will ? Also schalten, wenn keiner im Haus ist, wenn keine Bewegung erkannt wird ? Also nach dem Motto:

“schalte die Heizung aus, wenn keiner da ist.”, “Alarm scharfschalten, wenn wir in Urlaub sind”

Klar kann man das über eine System-Variable wie z.B.

“Anwesenheit”

tun, die aber auch bei jedem rein und rausgehen manuell gesetzt werden will. Was ist, wenn das vergessen wird ? Und man selber ist im Urlaub. Nein. Es muss auch automatisch gehen. Ein intelligentes Haus muss wissen, wenn sein Besitzer:

  • zu Hause ist
  • nach Hause kommt
  • nicht mehr zu Hause ist.

Was brauchen wir dafür ?

Mindestens einen Bewegungsmelder, welcher im Innenraum installiert wird. Dieser sollte sich an einer möglichst zentralen Position befinden, also z.B. im Flur, im Wohnzimmer, oder überall da, wo man sich regelmäßig und häufig aufhält, wenn man zuhause ist.

Die Idee hinter der Anwesenheitsautomatik ist jetzt die: Wenn jemand sich im Inneren bewegt, registriert das dieser (oder weitere) Bewegunsmelder. Das Problem ist aber: Er ist dumm und “vergisst” die Bewegung von vor 10 Minuten, je nachdem welches Intervall ihr dem Melder mitgegeben habt. (das Standard-Intervall ist glaube ich 5 oder 6 Minuten). In der Praxis wirkt sich das so aus: Ihr lauft im Wohnzimmer rum. Der Melder registriert das und weiss für die nächsten 5-6 Minuten, dass einer im Haus ist. Ihr bewegt euch aber nicht ununterbrochen im Einflussbereich. 10 Minuten in der Küche würde bedeuten, dass die Anlage von einer Abwesenheit ausgeht und schlimmstenfalls den Alarm scharfschaltet oder die Heizung runterfährt.

Was also tun ?
Hier kommt etwas Logik ins Spiel:

Wir erstellen eine Variable “Anwesenheit” (vom Typ Boolean / Wahrheitswert), (falls noch nicht vorhanden). Diese nimmt später den eigentlichen Zustand auf.

Dann erstellen wir eine zweite Hilfsvariable “Anwesenheit_num” (oder ähnlich) vom Typ “numerisch”. Diese Variable wird immer dann auf einen Wert (z.B. 10) geetzt, wenn der (oder bei mehreren ein) Bewegungsmelder im Innenraum Bewegung erkennt. Ein Programm dazu ist Homematic-Standard:

Bewegungsmelder:

Auslösen auf Änderung:   Wenn Bewegung erkannt,

setze Variable auf den Wert 10,

setze Variable “Anwesenheit” auf “wahr”

Das reicht aber noch nicht. Wir brauchen ein weiteres Programm:  “Timer alle 10 Minuten: Wenn KEINE Bewegung erkannt, zähle die Variable um eins runter”. Das funktioniert leider nicht per Standard Programm, hier brauchen wir ein selbstgebasteltes Homematic Script:

dom.GetObject("Anwesenheit_num").State(dom.GetObject("Anwesenheit_num").State() - 1);

Dieses Script soll also alle 10 Min. aufgerufen werden. Falls zum Prüfzeitpunkt keine Bewegung erkannt ist, wird aus dem Wert 10 die 9 usw. (Achtung: Systemvariable “Anwesenheit_num” muss existieren).

Wenn wir bei 0 angekommen sind, wissen wir:  es hat sich in den letzten 10 * 10 Minuten (=100 Min.) keiner bewegt, also liegt die Vermutung nahe, dass keiner im Haus ist. Jetzt wird eine zweite Variable “Anwesenheit” auf “falsch” gesetzt. Diese Variable enthält den wahrscheinlichen Zustand und kann für weitere Steuerungsfunktionen genutzt werden (Heizung, Licht, Alarm, usw.)

Systemvariable:

Wenn  “Anwesenheit_num” = 0 (auslösen auf Änderung)

dann  Variable “Anwesenheit” auf “falsch” setzen.

Das ganze Verfahren funktioniert natürlich umso besser, wenn mehrere Bewegungsmelder im ganzen Haus verteilt mitspielen.

Nochmal in der Zusammenfassung:

  1. Ein (oder mehrere) Bewegungsmelder setzen die Variable “Anwesenheit_num” bei erkannter Bewegung auf “10”, die Variable “Anwesenheit” auf “wahr”
  2. Ein Homematic-Programm prüft per Timer periodisch: haben der (oder bei mehreren: alle) Melder “Keine Bewegung”:  wenn ja (keine Bewegung): “Anwesenheit_num” um 1 runterzählen
  3. “Anwesenheit_num” bei 0 angekommen (Homematic-Script:  Systemvariable=0, auslösen auf Änderung):  Zeitintervall ist abgelaufen, es ist wahrscheinlich keiner da. ==> Variable “Anwesenheit” auf “falsch” setzen

Die Zeiten (Timer-Interval in Minuten, Startwert der Variable) können natürlich dem eigenen Verhalten angepasst werden. Insbesondere der Einsatz mehrerer  Melder kann die Präzision der Voraussage deutlich erhöhen.
Denkbar wären z.B. auch:  Bewegung: alle 5 Minuten prüfen, Startwert = 30. Damit ergeben sich dann 150 Minuten von der Anwesenheit bis zur (dann sehr wahrscheinlichen) Abwesenheits-Schaltung.

Einfach aber gut, insbesondere, wenn in jedem Flur oder Zimmer ein Melder hängt… Erweiterungen mit Türkontakten sind natürlich ebenfalls möglich…

 

 

 

 

6 Kommentare

Zum Kommentar-Formular springen

  1. Hi, habe.die anwesenheitskontrolle durchgefuehrt.leider funzt es bei mir nich. Kannst du mir einen scrennshot aller programmierungen schicken! Vielen dank im voraus! Gruesse michael

  2. Was ist denn, wenn die Bewegungen immer zwischen den 10 Minuten stattfinden?

    • schmue auf 23. Februar 2016 bei 7:47
    • Antworten

    Hallo,
    danke für die Mühen, ich nutze für die Anwesenheit derzeit nur die Anwesenheit eines oder mehrerer Wlangeräte.
    Die aktionen werden bei erfolgreichem Ping “bei Änderung ausgelöst”.

    Aktion ist Systemvariable Anwesenheit_num sofort auf 10 zu setzen.
    Und dann die Systemvariable Anwesenheit auf anwesend.

    Leider funktioniert das erstgenannte nicht und ich sehe aber den Fehler nicht.

    • Frank Janka auf 22. März 2016 bei 14:36
    • Antworten

    Hi,

    danke für die coole Anleitung. Einen Fehler habe ich wohl noch drin. Bei mir zählt er nicht runter. Die Variable wird gesetzt aber der Zähler bleibt auf 10.

    Muss ich die Bewegungsmelder noch irgendwie einstellen?

    Runterzählprogramm:

    Bedingung: Wenn…
    Periodisch Ganztägig beginnend am 20.03.2016

    Aktivität: Dann…Vor dem Ausführen alle laufenden Verzögerungen für diese Aktivitäten beenden (z.B. Retriggern).
    dom.GetObject(“Zuhause_num”).State(dom.GetObject(“Zuhause_num”).State() – 1);

    Aktivität: Vor dem Ausführen alle laufenden Verzögerungen für diese Aktivitäten beenden (z.B. Retriggern).

    ########

    Meine Variablen heißen nur anders.

    Grüße und Danke

    • Zahackn auf 18. Oktober 2016 bei 16:58
    • Antworten

    Hi schönes Projekt. Aber wie machst Du das Nachts? Da bewegt man sich ja nicht soviel. Das System denkt doch dann das niemand zuhause ist…?

    • Stephan auf 30. Oktober 2016 bei 10:34
    • Antworten

    Hi
    vielen Dank für den Artikel. Aber das geht viel einfacher:
    Mach einfach ein Programm wie folgt:

    Wenn Bewegung
    Dann Systemvariable Anwesenheit verzögert um 100 Miunten auf “nicht anwesend”.

    Fertig!

    Wichtig: Das Häckchen “Aktivität: Dann…Vor dem Ausführen alle laufenden Verzögerungen für diese Aktivitäten beenden (z.B. Retriggern).” unbedingt gesetzt lassen…. ist default gesetzt.

    Die Zeit kannst Du natürlich beliebig ändern. Meine Heizung in der Ferienwohnung schalte ich so z.B. nach 24h ohne Bewegung aus.

    Gruss
    Stephan

Schreibe einen Kommentar zu michael Antworten abbrechen

Deine Email-Adresse wird nicht veröffentlicht.