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.

Du musst dafür auch den Fernzugriff konfiguriert haben, damit dein Handy den veränderten WLAN-Status auch noch an openHAB senden kann, wenn du nicht mehr im lokalen Netzwerk bist. Wenn du das noch nicht getan hast, kannst du dafür diese Anleitung befolgen.

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]“ Code-Sprache: JavaScript (javascript)

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"]Code-Sprache: CSS (css)

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“.

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

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.

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=UnbekanntCode-Sprache: PHP (php)

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 timer1 = null

rule "Anwesenheit"
when 
    Item WLAN_Handy changed from "DEINE SSID" to "UNDEF"
then
    if(!WLAN_Handy.state.equals("DEINE SSID")) {
    	timer1 = createTimer(now.plusSeconds(15), [|
        if(!WLAN_Handy.state.equals("DEINE SSID")){
            Handy.sendCommand(OFF)
            sendTelegram("bot1", "Handy ist jetzt unterwegs!")  
        }
        timer1 = null
    	])
    }
endCode-Sprache: JavaScript (javascript)

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 2"
when 
    Item WLAN_Handy changed to "DEINE SSID"
then
    if(WLAN_Handy.state.equals("DEINE SSID")){
        timer2 = createTimer(now.plusSeconds(15), [|
        if(WLAN_Handy.state.equals("DEINE SSID")){
            Handy.sendCommand(ON)
            sendTelegram("bot1", "Handy ist wieder Zuhause!")
        }              
        timer2 = null
        ])
    }
endCode-Sprache: JavaScript (javascript)

Diese ist vom Prinzip her sehr ähnlich zur anderen Regel. Du kannst hier auch den Timer verwenden, so wie ich es im Beispiel gemacht habe, allerdings kannst du dies natürlich 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 ;-).

Hinweis: Mit Sternchen (*) markierte Links auf dieser Seite sind Werbelinks. Beim Kauf darüber erhalte ich eine kleine Provision, der Preis bleibt für dich aber gleich. Damit unterstützt du mich, sodass ich weiterhin kostenlosen Inhalt auf diesem Blog anbieten kann ;-).

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

Bitte bedenke, dass alle Kommentare manuell freigeschaltet werden müssen. Das kann teilweise ein bisschen dauern, du kannst dich aber mit der unten aufgeführten Funktion benachrichtigen lassen, wenn er beantwortet wurde. Das heißt auch, dass Beleidigungen, Spam oder pure Werbung keine Chance haben, auf die Website zu kommen. Deine Email-Adresse wird selbstverständlich nicht veröffentlicht. Erforderliche Felder sind mit * oder (erforderlich) markiert.

Dieser Beitrag hat 12 Kommentare

  1. Avatar-Foto
    Ralph

    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. Logo Bloggingwelt
      Jan

      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

  2. Avatar-Foto
    Marcus

    Hallo Jan,
    Sehr gute Methode und auch gleich einleuchtend. Also habe ich es mal nachgebaut.
    Ich habe nur folgendes Problem. Die erste Regel wird bei meinem Versuchen nie getriggert.  Denn in meinem log sehe ich nicht, dass sich das Item selbstständig ändert. Die zweite Regel klappt hervorragend,da das Handy/App die Änderung initiiert. Jedoch wenn ich das WLAN verlasse, kann ich dem Server keine Änderung mitteilen da das Netzwerk nicht mehr erreichbar ist.
    Ich hoffe du verstehst was ich meine. Nun frage ich mich, wieso scheint es bei euch zu klappen, gibt es eventuell einen Timout oder habe ich etwas übersehen?
     
    Beste Grüße, Marcus

    1. Logo Bloggingwelt
      Jan

      Hallo Marcus,

       

      was siehst du denn in deinem Log?
      Was mir da einfallen würde, wäre, dass du vielleicht von deinem WLAN direkt in ein anderes wechselt oder dein Handy das getrennte Netzwerk nicht als UNDEF zurückgibt. Du könntest Mal im Log nachschauen, was dein Handy dann mitteilt, wenn du das WLAN verlässt. Bei mir habe ich eigentlich immer dann mobile Daten an, worüber dann der neue Status übermittelt wird. Du nicht?
      Ansonsten kannst du auch noch probieren, die Trigger-Zeile zu:
      Item WLAN_Handy changed from "DEINE SSID"
      zu ändern, wobei das auch nichts bringen wird, wenn dein Handy es nicht mehr übermittelt.
      Oder hast du vielleicht den Fernzugriff nicht richtig oder noch gar nicht konfiguriert? Dann findest du hier eine Anleitung.

       

      Viele Grüße
      Jan

      1. Avatar-Foto
        Marcus

        Hallo Jan,

        ah, Stichwort ist Fernzugriff. Nein, das habe ich nicht gemacht. Das steht bei mir noch auf der ToDo-Liste, jedoch erst zu einem anderen Zeitpunkt.
        Also danke für die Info und für die Beschreibung!
        Grüße, Marcus!

        1. Logo Bloggingwelt
          Jan

          Guten Abend Marcus,

          ok super, das ist ein guter Hinweis! Habe das auch noch in dem Artikel ergänzt, daran hatte ich gar nicht beim Entwickeln der Anwesenheitserkennung gedacht, da ich das sowieso schon eingerichtet hatte ?.

          Beste Grüße und einen guten Rutsch
          Jan

  3. Avatar-Foto
    Andre Kaiser

    Hallo,

    ich habe es nach der Anleitung gemacht und manchmal funktioniert es auch, aber leider nicht immer und daher ist es sehr unzuverlässig. Beim nach Hause kommen funktioniert es eigentlich immer, jedoch beim verlassen des Hauses bekommt ich sehr häufig eine Fehlermeldung auf dem Handy. Es kommt immer das ein Item nicht aktualisiert werden konnte. Auf dem Handy meiner Frau funktioniert es fast garnicht zuverlässig und bei mir bei jedem 4. oder 5. mal verlassen nicht. Woran kann das liegen?

    1. Logo Bloggingwelt
      Jan

      Hallo Andre,

      hast du auf deinem Handy den Energiesparmodus für die openHAB App deaktiviert? Diese kann die Hintergrundaktivität einschränken, sodass dann nicht mehr an openHAB übermittelt werden kann.

      Das klingt mir aber eher so, als wäre der Fernzugriff nicht richtig konfiguriert. Wenn du dein Heimnetzwerk verlässt, dann kann die Änderung nicht mehr an den lokalen openHAB Server übermittelt werden, bzw. das Item kann nicht aktualisiert werden.

      Wenn das dann korrekt konfiguriert ist, kann man noch mit den Toleranzzeiten experimentieren, um eine zuverlässige Erkennung zu erzielen.

      Ich hoffe, dass ich dir damit weiterhelfen konnte. Funktioniert es dann damit?

      Viele Grüße
      Jan

      1. Avatar-Foto
        Andre Kaiser

        Hallo Jan,

        vielen Dank für die Infos. Ich habe nochmal meinen gesamten Zugang überprüft und die Passwörter neu eingegeben und werde testen.
        Was ist denn mit den Toleranzzeiten gemeint? Wie kann ich diese anpassen?
        Gruß
        Andre

        1. Logo Bloggingwelt
          Jan

          Guten Abend Andre,

          super, was sagt denn das Log von openHAB dazu? Das kannst du unter http://openhabianpi:9001 aufrufen.

          Mit den Toleranzzeiten meine ich den Zeitabstand, der zwischen dem ersten Auslösen der Netzwerk-Änderung und der in der Rule definierten erneuten Überprüfung ist, ob das Handy immer noch den entsprechenden Status hat und es keine kleinen Schwankungen waren, wie wenn z.B. mehrere Access-Points im Haus sind und das Handy zwischen diesen wechselt, sodass es kurzzeitig nicht eingeloggt ist.

          Das ist unter Rule definieren genauer beschrieben, du könntest also in beiden Rules den Teil now.plusSeconds(15) Mal durch eine andere Zahl ersetzen und schauen, ob es dann zuverlässiger funktioniert.

          Viele Grüße
          Jan

          1. Avatar-Foto
            Andre Kaiser

            Halo Jan,

            ich habe oft den Fehler beim verlassen des Wlans, dann möchte er ja direkt den Wlannamen in das Item auf dem Server schreiben. Hierbei kommt die Fehlermeldung „1 Item konnte nicht aktualisiert werden. Update von xxx fehlgeschlagen: HTTP-Code 500“
            Die App ist richtig konfiguriert mit Remotezugang. Es passiert auch nicht immer. Verhältnis ist halt 70 (Fehler) zu 30 (geht). Dann reagiert natürlich auch keine Rule.

          2. Logo Bloggingwelt
            Jan

            Hallo Andre,
            okay das wundert mich, da fällt mir so spontan jetzt leider auch nichts ein.
            Aber ich sehe ja schon, dass du die Frage auch auf openhabforum.de gestellt hast, vielleicht weiß da ja jemand weiter.
            Halte uns hier gerne auf dem Laufenden, damit der Beitrag eventuell entsprechend aktualisiert werden kann, falls es eine bessere Lösung gibt.
            Viele Grüße
            Jan