Anwesenheitserkennung mit openHAB 2 und der openHAB App (Möglichkeit 2)

In diesem Artikel zeige ich dir, wie du eine Anwesenheitserkennung mit Hilfe der openHAB App für Android erstellst. Da die Lösung mit der Abfrage von seitens des WLANs leider nicht sehr zuverlässig ist, da sich die meisten Smartphones nach einiger Zeit in einen Ruhemodus versetzen, sodass sie nicht mehr erkannt werden.

Eine Anwesenheitserkennung ist nicht sehr einfach umzusetzen. Es gibt verschiedene Vor- und Nachteile verschiedener Systeme. Bei einer GPS-basierten Erkennung muss über einen fremden Service kommuniziert werden, bei der Netzwerkbasierten das bereits oben beschriebene Problem und bei Bluetooth-Low-Energy ist die Erkennung sehr aufwendig umzusetzen. Außerdem soll ja keine manuelle Aktion des Nutzers erforderlich sein, sodass das Smart Home automatisch die Anwesenheit aller im Haushalt lebenden Personen erkennt.

Eine weitere Möglichkeit ist die Übermittlung des verbundenen WLAN-Netzwerks vom Smartphone. Diese Funktion ist in der Android App von openHAB enthalten. Leider gibt es diese Funktion im Moment noch nicht für iOS. Mit der Funktion lassen sich Gerätedaten an ein bestimmtes Item in openHAB übertragen. Wir werden jetzt aber nur die SSID des WLANs verwenden.

Item erstellen und konfigurieren

Da die SSID als String übertragen wird, müssen wir in den Items von openHAB ein dazugehöriges anlegen. Wenn du noch nicht weißt, wie du Items anlegst, kannst du das hier nachlesen. Hier also ein Beispiel, wie das Item aussehen kann:

String WLAN_Handy „WLAN [%s]“ 

Du kannst den Namen des Items und das Label natürlich auch ändern.

Ich habe dann zur besseren Visualisierung einen Switch mit der Anwesenheit erstellt, sodass sich einfacher, falls nötig, korrigieren lässt, ob eine Person anwesend ist. Dieser kann wie folgt aussehen:

Switch Handy "Anwesenheitsstatus [MAP(presence.map):%s]" <motion> (gAnwesenheit) ["Switchable"] 

Hier verwende ich eine sogenannte Map, mit der der Status des Schalters auch in Textform ausgegeben werden kann, also z.B. “Zuhause” oder “Abwesend”. Wenn du das nicht umsetzen möchtest, kannst du diesen Schritt überspringen.

App einrichten

Damit dein Gerät eigenständig die Daten an den openHAB Server senden kann, musst du dies in der openHAB App einstellen. Rufe dafür als erstes die Einstellungen der App auf und scrolle hier bis zum Punkt “Geräteinformationen an Server senden”.

Einstellungen der openHAB App

Schalte als nächstes die Ereignisüberwachung ein und Tippe auf das Feld “WLAN-Name”.

Einstellungen zum Senden von Geräteinformationen an den Server

Im jetzt erscheinenden Popup kannst du den zuvor gewählten Namen des Items vom Typ String eingeben. Tippe auf OK und die Einstellung in der App ist abgeschlossen.

Einstellen des Item Namens

Jetzt musst du nur noch (ab Android 8) die Standortdienste aktivieren (da sonst nicht auf den WLAN-Namen zugegriffen werden darf) und erlaube der openHAB App Zugriff auf diesen. Wenn du das bei der Installation der App noch nicht getan hast, kannst du das in den Einstellungen deines Handys erledigen. Dieser Punkt befindet sich meistens unter Apps > Apps verwalten > openHAB > Berechtigungen. (Dies kann bei verschiedenen Android-Launchern und UIs variieren.) Zudem kann es sinnvoll sein, die openHAB App aus dem Energiesparmodus auszuschließen, wenn diese nicht wie erwünscht funktioniert, da diese ja im Hintergrund auf die Gerätedaten zugreifen muss, was vielleicht vom Akkumanager nicht so gern gesehen ist ;-).

Map erstellen

Installiere erst das “Map Transformation” Add-On in der Paper UI. Wenn du dies erledigt hast, kannst du dieses konfigurieren. Um den Status anzuzeigen, musst du eine Datei mit dem Namen “anwesenheit.map” im Verzeichnis “/IP-ADRESSE-DES-OPENHAB-SERVERS/transform/” anlegen. Falls du nicht weißt wie das geht, kannst du es hier nachlesen. Schreibe jetzt folgenden Inhalt in die Datei:

ON=Zuhause
OFF=Unterwegs
NULL=Unbekannt

Du kannst natürlich auch andere Bezeichnungen verwenden, jedoch sollte die linke Seite der Gleichheitszeichen gleich bleiben.

Rule definieren

Um jetzt Aktionen bei der Änderung des WLANs auszuführen, muss dies durch eine Regel konfiguriert werden. Wenn du noch nicht weißt, wie man Regeln im Allgemeinen erstellt, kannst du es hier nachlesen.

Wir benötigen dabei leider zwei Regeln, da man leider keine zwei Trigger zusammen in einer Regel verwenden kann. (Wenn du einen Weg kennst, kannst du ihn gerne in einem Kommentar mitteilen ;-).)

Nun also die erste:

var Timer timer = null

rule "Abwesenheit"
when 
    Item WLAN_Handy changed from "DEINE SSID" to "UNDEF"
then
    if(timer == null) {
        timer = createTimer(now.plusSeconds(15), [|
        if(WLAN_Handy.state != "DEINE SSID"){
            Handy.sendCommand(OFF)
            sendTelegram("bot1", "Handy ist jetzt unterwegs!")  
        }              
        timer = null
        ])
    }
end

Zudem sende ich in diesem Beispiel eine Nachricht via Telegram zur Info. Wie das geht, kannst du hier nachlesen.

Du musst natürlich deine SSID und ggf. die anderen Namen der Items an der passenden Stelle einsetzen.

Zudem gehe ich davon aus, dass du bereits den Standort auf dem Handy aktiviert hast und der openHAB App Zugriff auf diesen gegeben hast. Wenn das nicht der Fall ist, musst du dies entweder nachholen oder die noch entsprechenden Fälle “LOCATION_OFF” und “NO_PERMISSION” einbinden.

Es wird nun also diese Regel gestartet, wenn dein Handy sich aus dem WLAN entfernt. Dann wird mit einem Timer, in diesem Fall 15 Sekunden, nach einer gewissen Zeit überprüft, ob das Handy auch wirklich nicht mehr eingeloggt ist, um Fehler bspw. beim Wechseln eines Access Points nicht sofort als abwesend eingetragen zu sein. Diese Zahl kannst du natürlich frei variieren, je nachdem ob du damit nur die automatische Heizung steuern oder die Alarmanlage zum Goldtresor sichern möchtest ;-). Wenn also nach der bestimmten Zeit das Gerät immer noch entfernt ist, wird unser zuvor definierter Schalter deaktiviert und eine Nachricht versandt.

Mit einer Rule, die an den Schalter gekoppelt ist, können dann weitere Funktionen verwendet werden, für welche man die Anwesenheit nutzen möchte. Hier wäre es bei mehreren Personen im Haushalt auch möglich, die Schalter in einer Gruppe zusammenzufassen, sodass man die gesamte Anwesenheit überprüfen kann, so wie ich es schon in dem vorherigen Artikel zur Anwesenheitserkennung gezeigt habe.

Jetzt die zweite Regel:

var Timer timer2 = null

rule "Anwesenheit"
when 
    Item WLAN_Handy changed from "UNDEF" to "DEINE SSID"
then
    if(timer2 == null) {
        timer2 = createTimer(now.plusSeconds(15), [|
        if(WLAN_Handy.state == "DEINE SSID"){
            Handy.sendCommand(ON)
            sendTelegram("bot1", "Handy ist jetzt anwesend!")  
        }              
        timer2 = null
        ])
    }
end

Diese ist vom Prinzip her sehr ähnlich zur anderen Regel. Du kannst hier auch den Timer verwenden, allerdings kannst du dies auch ohne umsetzen, wodurch es aber auch zum voreiligen Wechseln der Anwesenheit kommen kann. Hier gilt also auch wieder: Es kommt ganz auf den Anwendungsfall an!

Jetzt kannst du dein Zuhause noch mehr automatisieren und es durch eine Anwesenheitserkennung erst wirklich smart machen ;-).

Jan

Jan

Ich bin Jan und ich freue mich, dass Du meinen Blog gefunden hast. Ich blogge in meiner Freizeit über Smart Home, 3D Druck und Technik und versuche, Dir mit meinen Beiträgen möglichst gut zu helfen.

Alle Beiträge ansehen von Jan →

2 Gedanken zu “Anwesenheitserkennung mit openHAB 2 und der openHAB App (Möglichkeit 2)

  1. He, vielen Dank für die tolle Idee!!
    Für meine Umgebung ist da aber ein kleiner Bug drin.
    An der Stelle:
    timer = createTimer(now.plusSeconds(15)) [|
    musste ich die zweite Klammer durch ein “,” ersetzen.
    Und unten das Ganze nicht mit ]} schließen, sondern mit ])
    sieht dann wie folgt aus:

    timer = createTimer(now.plusSeconds(15), [|
    if(WLAN_Handy.state != “DEINE SSID”){
    Handy.sendCommand(OFF)
    sendTelegram(“bot1”, “Handy ist jetzt unterwegs!”)
    }
    timer = null
    ])

    Greetings und Dank

    Ralph

    1. Hi Ralph,

      danke für den Hinweis. Komischerweise hat es bei mir auch in der vorherigen Version funktioniert, deine ergibt aber auch Sinn und funktioniert gut!
      Ich habe das ganze Mal im Beitrag geändert, sodass das so dann hoffentlich bei mehr Leuten funktioniert ;-).

      Viele Grüße
      Jan

Wie nutzt du die Anwesenheitserkennung? Welche Fragen hast du noch dazu? Schreib es einfach in einem Kommentar!

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.