Zuverlässige Anwesenheitserkennung per Android-Smartphone

Zuverlässige Anwesenheitserkennung per Android-Smartphone

Wäre es schön, wenn die Homematic selbstständig erkennt, ob man zu Hause ist oder das Haus verlässt? Warum muss die Steuerung überhaupt wissen wann, ich anwesend bin und wann ich das Haus verlasse? Ganz einfach: so kann automatisch Energie gespart werden, die Alarmanlage eingeschaltet und gewisse Programme ablaufen, die sonst händisch gestartet werden müssten. Die größte Motivation ist also wie fast immer der Komfort. Doch auch das Einsparungspotenzial sollte an dieser Stelle nicht unterschätzt werden. Da die meisten Menschen heutzutage ihr Smartphone immer dabei haben, lässt sich so auch gut erkennen, ob jemand zu Hause ist.
In folgendem Beispiel zeige ich eine mögliche Realisierung der automatischen und zuverlässigen (!) Erkennung der Abwesenheit/Anwesenheit.  Die zuverlässige Erkennung von An- und Abwesenheit ist ein wirklich sehr schwieriges Thema. Ich habe auch viele Anleitungen gefunden, die es mit ständigem Senden der PING-Signale lösen, allerdings sind diese Lösungen sehr unzuverlässig. Mein Android-Handy hatte leider das Problem, teilweise extrem kurz im Netz zu sein. Das Ping-Gerät des CUx-Daemons hat es daher manchmal trotz vieler Versuche in kürzest möglichen Zeitabständen nicht geschafft, die Anwesenheit festzustellen. Deshalb habe ich eine zweite Lösung gefunden, die ich hier vorstellen will. Nun kommen wir zu einem Ansatz.

Was wird benötigt

  • Android Smartphone mit mobilem Internetzugang
  • CCU2 mit installierter XML-API Erweiterung
  • Android App: Tasker (kostenlos)
  • optional für die Abwesenheitsmeldung: die Möglichkeit des Fernzugriffs auf CCU
  • optional für die Abwesenheitsmeldung: Android App: HTTP Request Shortcuts (je nachdem, wie der Fernzugriff auf CCU realisiert ist, die App ist kostenlos)
  • optional für die Abwesenheitsmeldung: Webserver mit Reverse-Proxy (je nachdem, wie der Fernzugriff auf CCU realisiert ist, hier: Synology DiskStation DS218j)
  • optional für die Abwesenheitsmeldung: PHP-Webserver (je nachdem, wie die Abwesenheitserkennung realisiert ist, hier: Synology DiskStation DS218j)

CCU vorbereiten

Um die Status der Anwesenheit in der CCU zu speichern, wir eine Systemvariable Anwesenheit.Person1 (der Name kann nach eigenem Bedarf angepasst werden) gebraucht, die wird in CCU vom Typ Logikwert mit Wertebezeichnung „anwesend“ als „wahr“ und „abwesend“ als „falsch“ anlegen:

Als Erstes testen wir, ob die Steuerung der angelegten Systemvariable Anwesenheit.Person1 per URL Aufruf funktioniert. Dazu wird die ISE_ID der Variable benötigt. Um diese zu bekommen, muss in der WebUI unter “Einstellungen” –> “Zusatzsoftware” unter dem installierten Addon “XML-API” auf “Einstellen” geklickt werden.

Anschließend landen wir auf folgender Übersicht:

Dort suchen wir den Punkt “sysvarlist.cgi” (8. Punkt von oben). Hier sind alle Informationen zu den vorhandenen Systemvariablen verfügbar. Wer eine lange liste hat, kann auch mit “STRG + F” nach dem Wort “Anwesenheit” suchen. Wenn die gewünschte Variable gefunden ist, benötigen wir nur die ID-Nummer (ISE_ID) der Variable, die sollen wir uns merken.

Die URL die Steuerung der Systemvariable Anwesenheit.Person1 ist dann wie folgt aufgebaut (CCU-IP und XXXX bei ise_id müssen durch die eigenen Daten ergänzt werden):

  • Anwesenheit der Person 1: http://CCU-IP/config/xmlapi/statechange.cgi?ise_id=XXXX&new_value=true
  • Abwesenheit der Person 1: http://CCU-IP/config/xmlapi/statechange.cgi?ise_id=XXXX&new_value=false

Der Wert am Ende der URL “true” setzt die Variable auf “wahr”, also “anwesend”, der Wert „false“ setzt die Variable auf “falsch”, also “abwesend”. Wenn die beiden URLs dann vervollständigt sind, die dann einfach in dem Browser aufrufen. Wenn alles richtig läuft, sollte das Ergebnis so aussehen und die Variable je nach eingegebener URL auf “anwesend” oder “abwesend” stehen.  Die beiden URL sollen gemerkt werden. Wenn das funktioniert, gehen wir zur Anwesenheitserkennung rüber.

Anwesenheitserkenung

Anwesenheitserkennung kann recht einfach realisiert werden, da bei der Anwesenheit zu Hause die Verbindung mit einem lokalen Netzwerk verfügbar ist. Mit dem gleichen Netzwerk soll natürlich auch die CCU verbunden sein Die Anwesenheit wird somit im lokalen Netzwerk gemeldet.

Tasker konfigurieren

Es wird davon ausgegangen, dass die Tasker-App schon installiert ist. Um den neuen Task zu erstellen einfach auf „Tasks“ und danach auf „New Task“ gehen, ich habe meinen Task „Homematic Anwesenheit“ genannt. Dabei soll WIFI-NAME (ohne *) durch ihr eigenes Wi-Fi-Name ersetzt werden.

Homematic Anwesenheit
  A1: Variable Set [ Name:%Count To:0 Recurse Variables:Off Do Maths:Off Append:Off ] 
  A2: If [ %WIFII ~ *WIFI-NAME* ]
    A3: HTTP Get [ Server:Port:http://192.168.0.232/addons/xmlapi/statechange.cgi?ise_id=6386&new_value=1 Path: Attributes: Cookies: User Agent: Timeout:10 Mime Type: Output File: Trust Any Certificate:On Continue Task After Error:On ] 
    A4: If [ %HTTPR neq 200 & %Count < 5 & %WIFI ~ *KDG-47D73* ]
      A5: Wait [ MS:0 Seconds:0 Minutes:1 Hours:0 Days:0 ] 
      A6: Variable Set [ Name:%Count To:%Count+1 Recurse Variables:Off Do Maths:On Append:Off ] 
      A7: Goto [ Type:Action Number Number:2 Label: ] 
    A8: End If 
    A9: If [ %HTTPR = 200 ]
      A10: Variable Set [ Name:%AtHome To:1 Recurse Variables:Off Do Maths:Off Append:Off ] 
    A11: End If 
  A12: End If

In Zeile 1 wird eine neue Variable %Count mit dem Wert „0“ erstellt, um die Durchläufe der folgenden Schleife (Zeile 2 – 7) zu zählen. Die Schleife kann maximal 4-mal ausgeführt werden. Die Schleife wird vorzeitig beendet, wenn der HTTP-Request zur Anwesenheitsmeldung erfolgreich gesendet ist. Die Schleife dient zur Absicherung, wenn der Router sich aus irgendeinem Grund nicht meldet. Die Anzahl der Schleifendurchläufe und Wartezeit zwischen den einzelnen Durchläufen kann nach eigenem Bedarf angepasst werden. In der Schleife wird zudem überprüft, ob wir noch in dem lokalen Netzwerk sind (sprich: anwesend), falls ja, wird der HTTP-Request zur Anwesenheitsmeldung gesendet. Falls es ein Fehler beim Senden des HTTP-Request aufgetreten hat, wiederholt sich der gesamte Vorgang, höchstens aber 4-mal. Nach der Überprüfung, ob HTTP-Request erfolgreich gesendet war, wird der Wert der Variable %AtHome auf „1“ geändert.

Als Nächstes wird ein neues Tasker-Profil erstellt. Dafür in „Profiles“ auf „+“ Klicken und in dem Menü „State“ auswählen. In dem Fenster „Select State Category“ „Net“→“Wifi Connected“ auswählen. Das Feld „SSID“ mit eigenem Wifi-Namen ergänzen und auf „Zurück“-Pfel klicken.

In nächstem Schritt wird vorgeschlagen, einen Task zu wählen, der ausgeführt wird, wenn die Verbindung zu dem Haus-Wifi vorhanden ist, da soll oben erstelltes Task „Homematic Anwesenheit“ gewählt werden.

Somit ist die Anwesenheitserkennung fertig. Anwesenheit wird an die CCU gemeldet, sobald ihr Handy mit Heimnetzwerk per WLAN sich verbindet. In der CCU wird dann der Wert der Variable Anwesenheit.Person1 auf „anwesend“ geändert.

Abwesendheitserkennung (HTTP-Request mit HTTP-Basic-Authentifizierung)

In dieser Lösung wird vorausgesetzt, dass die CCU auf einen Fernzugang mit HTTP-Basic-Authentifizierung konfiguriert ist (eine Anleitung dafür ist hier). Leider kann Tasker die HTTP-Requsts mit HTTP-Basic-Authentifizierung nicht versenden, deswegen wird hier die kostenlose App „HTTP Request Shortcuts“ eingesetzt, die die Tasker-App unterstützt. Leider ist in dieser App keine Weiterleitung der Antwort auf HTTP-Requst in die Tasker-App realisiert. Dies macht die Prüfung, ob der HTTP-Request erfolgreich gesendet wurde, unmöglich. Das ist das Nachteil dieser Lösung. Eine andere App, die HTTP-Requsts mit HTTP-Basic-Authentifizierung versenden kann und die Tasker-App unterstützt, habe ich nicht gefunden. Falls jemand den Vorschlag hat, wie man mit Tasker die HTTP-Request mit HTTP-Basic-Authentifizierung besser versenden kann, bitte im Kommentar unter dem Post angeben.

Was wird benötigt

  • CCUmit dem Fernzugang (HTTP-Basic-Authentifizierung bzw. Portweiterleitung)
  • Android Smartphone mit mobilem Internetzugang
  • Android App: Tasker (kostenlos)
  • Android App: HTTP Request Shortcuts (kostenlos)

Die App „HTTP Request Shortcuts“ konfigurieren

Die App öffnen und auf das „+“ Symbol klicken. Im aufgetauchten Dialogfenster „Neuen Shortcut/From scratch“ wählen:

Einen Namen des Schortcuts (und eine Beschreibung) eingeben. Den in diesem Beispiel aufgeführten Namen kann natürlich nach eigenem Bedarf angepasst werden. Eventuell ein passendes Icon auswählen. Im Feld „URL“ die oben generierte und mit eigenen Daten angepasste URL für die Abwesenheit der Person 1 eingeben. Aus der Liste „Authentifizierungsart/Authentification Method“ „Basic Authentification“ auswählen und den Benutzernamen und Passwort für den Fernzugriff an die CCU eingeben, somit ist HTTP-Shortcut fertig!

Tasker konfigurieren

Um den neuen Task zu erstellen in „Tasks“ gehen und danach auf „New Task“ klicken, ich habe meinen Task „Homematic Abwesenheit“ genannt. Das Task ist wie folgt aufgebaut, WIFI-NAME (ohne *) soll dabei durch ihr eigenes Wi-Fi-Name ersetzt werden.:

Homematic Abwesenheit
A1: Variable Set [ Name:%Count To:0 Recurse Variables:Off Do Maths:Off Append:Off ] 
A2: If [ %WIFII !~ *WIFI-NAME* ]
  A3: HTTP Get [ Server:Port:google.com Path: Attributes: Cookies: User Agent: Timeout:10 Mime Type: Output File: Trust Any Certificate:Off Continue Task After Error:On ] 
  A4: If [ %Count < 5 & %WIFI ~ *WIFI-NAME* & %HTTPR neq 200 ]
    A5: Wait [ MS:0 Seconds:0 Minutes:1 Hours:0 Days:0 ] 
    A6: Variable Set [ Name:%Count To:%Count+1 Recurse Variables:Off Do Maths:On Append:Off ] 
    A7: Goto [ Type:Action Number Number:2 Label: ] 
  A8: End If 
  A9: If [ %HTTPR = 200 ]
    A10: Execute HTTP Shortcut [ Configuration:Execute shortcut "Abwesenheit.Person1 auf Wahr setzen" Timeout (Seconds):0 ] 
    A11: Variable Set [ Name:%AtHome To:1 Recurse Variables:Off Do Maths:Off Append:Off ] 
  A12: End If 
A13: End If

In Zeile 1 wird der Variable %Count der Wert „0“ zugewiesen, um die Durchläufe der Schleife (Zeile 2 – 8) zu zählen. Die Schleife dient zur Überprüfung, ob die Verbindung mit dem mobilen Internet vorhanden ist, dafür wird HTTP-Request an „google.com“ versendet und der Antwortcode des HTTP-Requests ausgewertet. Diese Überprüfung kann maximal 4-mal ausgeführt werden, wenn kein mobiles Internet vorhanden ist. Die Schleife wird vorzeitig beendet, wenn der HTTP-Request zur „google.com“ erfolgreich versendet wurde. Die Anzahl der Schleifendurchläufe zur Überprüfung der Internetverbindung und Wartezeit zwischen den einzelnen Durchläufen kann nach eigenem Bedarf angepasst werden. Dann wird die Anwesenheitsmeldung durchgeführt, indem in der „HTTP Request Shortcuts“-App erstelltes HTTP-Shortcut ausgeführt wird (Zeile 10) und der Wert der Variable %AtHome auf „1“ geändert wird.

Alternative Abwesenheitserkennung (mit PHP Webserver)

Vorteil dieser Lösung ist, dass man die HTTP-Basic-Authentifizierung nicht braucht. Die HTTP-Requests können mit der Tasker-App direkt gesendet werden. Da die Abwesenheit von außen gemeldet wird, braucht man eine Authentifizierung, damit nicht jeder in der Lage ist, die Abwesenheit einer Person melden zu können. Diese Authentifizierung sowie die Abwesenheitsmeldung selbst habe ich in einem PHP-Skript realisiert. Um dieses PHP-Skript auszuführen, wird ein PHP-Webserver benötigt, der mit dem gleichen lokalen Netzwerk wie die CCU verbunden ist, hier: Synology DiskStation DS218j. Im Allgemeinen läuft die Abwesenheitserkennung so: wenn ihr Handy die Verbindung ins WLAN-Heimnetzwerk verliert, wird ein HTTP-Request an den PHP-Webserver versendet. Dies ist durch die Tasker-App realisiert. Auf dem PHP-Webserver wird darauf das PHP-Skript ausgeführt. In dem Skript wird zuerst das Kennwort abgeglichen, und wenn das Kennwort richtig ist, versendet der Webserver das HTTP-Request an die lokale IP-Adresse der CCU und meldet somit die Abwesenheit der Person weiter an die CCU.

Synology DiskStation konfigurieren

Als PHP-Webserver wird hier wieder Synology DiskStation DS218j eingesetzt. Bitte vor dem Start darauf achten, dass Sie bereits Folgendes ausgeführt haben:

  • EZ-Internet ist eingerichtet und Port 80 ist konfiguriert, falls nicht, EZ-Internet öffnen und den weiteren Schritten des EZ-Internet-Assistenten folgen (Hinweis: Das Einrichten der Portweiterleitung mit EZ-Internet überschreibt die vorhandenen Portweiterleitungsregeln auf dem Router).
  • Synology DiskStation ist von außen zugänglich und hat statische IP-Adresse oder DynDNS, falls es nicht der Fall sein sollte, zu der Systemsteuerung > Externer Zugriff > DDNS gehen, um die Domain-Einstellungen zu konfigurieren.
  • Web Station und PHP 5.6 bzw. PHP 7.2 sollen installiert werden

Mit der Web Station kann auf Synology DiskStation eine Website (in diesem Fall PHP-Skript) mit mehreren Seiten erstellt werden. Der freigegebene Standardordner „web“ wird von Web Station bereitgestellt, dort können die Webseitendateien zur Erstellung der Websites gespeichert werden. Die Webanwendung mithilfe von Web Station erstellen:

  1. Die Web Station öffnen und zu Allgemeine Einstellungen gehen, um den HTTP Back-end-Server und das PHP-Profil auszuwählen. Hier habe ich zu Demonstrationszwecken das Standardprofil (PHP 5.6) ausgewählt.
  2. Zu den PHP-Einstellungen gehen und auf die Schaltfläche Bearbeiten (Edit) klicken, um die PHP-Erweiterungen zu aktivieren.
  3. Wählen Sie Kontrollkästchen aus, um alle Erweiterungen zu aktivieren.
  4. Im Web-Ordner /web/homematicAbwesendheitsMelden die Datei Person1AbwesendMelden.php mit folgendem Inhalt* erstellen und diese speichern.
<?php
  $md5pass = md5($_GET['pass']);
  if($pass == "MD5PASS")
  {	
    $url = "http://LOKALE-IP-DER-CCU/addons/xmlapi/statechange.cgi?ise_id=XXXX&new_value=false";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
  }
?>

*In diesem Skript sollen folgende Daten durch ihre eigene ausgetauscht werden:

  • Zeile 3: MD5PASS (ohne “ „) soll durch das MD5-Hash ihres Kennworts ausgetauscht werden. Das Kennwort wird benötigt, um mit dem PHP-Skript die Peron 1 als abwesend zu melden. Dafür kann ein der vielen Online-MD5-Generatoren (z. B. dieser) benutzt werden. In einem solchen Online-MD5-Generator das Password im Klartext eingeben, MD5-Hash generieren, das generierte MD5-Hash statt MD5PASS im php-Skript einfügen (ohne “ „).
  • Zeile 5: URL-Adresse durch die hier generierte und mit eigenen Daten angepasste URL für die Abwesenheit der Person 1 ersetzen.

Die Einrichtung von Synology DiskStation ist somit abgeschlossen. Um jetzt die Abwesenheit der Person an die CCU zu melden, soll HTTP-Request zu http://domainname/homematicAbwesenheitMelden/Person1AbwesendMelden.php?pass=dein_password gesendet werden, zum Beispiel: http://smarthome.synology.me/homematicAbwesenheitMelden/PaulAbwesendMelden.php?=qwertz12345. Jetzt soll nur die Tasker-App zur Abwesenheitsmeldung eingerichtet werden, um die Abwesenheitsmeldung zu automatisieren.

Tasker konfigurieren

Es soll neues „Task“ erstellt werden, dafür auf „Tasks“ gehen und danach „New Task“ klicken. Ich habe mein Task „Homematic Abwesenheit“ genannt. WIFI-NAME (ohne *) soll durch ihr eigener WiFi-Name ersetzt werden.

Homematic Abwesenheit
A1: Variable Set [ Name:%Count To:0 Recurse Variables:Off Do Maths:Off Append:Off ] 
A2: If [ %WIFII ~ *WIFI-NAME* ]
  A3: HTTP Get [ Server:Port:http://SYNOLOGY-DOMAIN/homematicAbwesenheitMelden/Person1AbwesendMelden.php Path: Attributes: Cookies: User Agent: Timeout:10 Mime Type: Output File: Trust Any Certificate:On Continue Task After Error:On ] 
  A4: If [ %HTTPR neq 200 & %Count < 5 & %WIFI ~ *WIFI-NAME* ]
    A5: Wait [ MS:0 Seconds:0 Minutes:1 Hours:0 Days:0 ] 
    A6: Variable Set [ Name:%Count To:%Count+1 Recurse Variables:Off Do Maths:On Append:Off ] 
    A7: Goto [ Type:Action Number Number:2 Label: ] 
  A8: End If 
  A9: If [ %HTTPR = 200 ]
    A10: Variable Set [ Name:%AtHome To:1 Recurse Variables:Off Do Maths:Off Append:Off ] 
  A11: End If 
A12: End If

Der Ablauf dieses Tasks ist ähnlich, wie bei der Anwesenheitserkennung, mit dem Unterschied, dass per HTTP-Request nicht die CCU direkt angesprochen wird, sondern der HTTP-Request wird an den Webserver versendet.

Jetzt soll das zuvor erstelltem Profil „Homematic Anwesenheitserkennung“ mit einem Ausgangstask (Exit-Task) erweitert werden. Sobald die Bedingung „Mit Haus-WiFi Verbungen“ nicht mehr erfüllt sind, wird das Ausgangstask ausgeführt und die Person als abwesend gemeldet wird. Dafür lange auf das Task „Homematic Abwesenheit“ klicken, danach das zuvor erstellte Task „Homematic Abwesenheit“ auwählen.

Somit ist die Abwesenheitserkennung fertig. Abwesenheit wird zuerst an den Webserver via mobilem Internet gemeldet, sobald ihr Handy die Verbindung mit Haus-WiFi verliert. Webserver führt das PHP-Skript aus und falls das Kennwort stimmt, meldet an die CCU via lokalem Netzwerk die Abwesenheit der Person weiter. Dort wird dann der Wert der Variable Anwesenheit.Person1 auf „abwesend“ geändert.

Fazit

Ich habe hier die Möglichkeit der An- und Abwesenheitserkennung beschrieben. Die Anwesenheitserkennung funktioniert recht einfach, kein Fernzugriff auf die CCU wird gebraucht. Die Meldung der Anwesenheit an die CCU erfolgt im lokalen Netzwerk. Die Abwesenheitserkennung dagegen ist etwas schwieriger umzusetzen. Es wird irgendeine Möglichkeit benötigt, die CCU von außen zu steuern. Ich habe hier zwei Möglichkeiten beschrieben, wie die CCU von außen gesteuert werden kann. Einerseits kann die CCU von außen direkt angesprochen werden, dafür soll der Fernzugang an die CCU eingerichtet werden. Das kann entweder Fernzugang mit HTTP-Basic-Authentifizierung sein oder via Port-Forwarding (was äußerst nicht empfohlen wird, da die jegliche Authentifizierung fehlt und im Prinzip jeder die CCU über Internet steuern konnte). Andererseits kann die CCU indirekt über ein weiteres Gerät angesprochen werden, ein solches Gerät kann zum Beispiel ein Webserver sein, bei dem den Fernzugang leichter einzurichten ist. In diesem Beitrag habe ich beschrieben, wie die Anwesenheitsmeldung zuerst an den Webserver und dann an die CCU weitergeleitet wird. Mir persönlich gefällt die zweite Lösung mit PHP-Webserver besser, weil die Verwendung der zusätzlichen App „HTTP Request Shortcuts“ wegfällt. Die HTTP-Requests werden direkt über Tasker versendet, zu dem kann es geprüft werden, ob HTTP-Request zur Abwesenheitsmeldung erfolgreich versendet wurde.

Falls ihr Anmerkungen, Ergänzungen oder Verbesserungsvorschläge etc. loswerden wollt, so schreibt die in einem Kommentar unter dem Beitrag…

Dieser Beitrag hat 4 Kommentare

  1. Hallo,
    vielen Dank für die ausführliche Anleitung.
    Was mir bei der Beschreibung noch nicht ganz klar ist, für was die Variable %AtHome genutzt wird.
    Da sie sowohl bei Anwesend als auch bei Abwesend auf 1 gesetzt wird.

    MfG

  2. Hallo,
    ich habe eine weitere Lösung für die Abwesenheitserkennung gefunden:
    Wenn man ein weiteres (altes) Smartphone mit Taskerinstallation im Heimnetzwerk (ohne SIM) hat, kann man mit Join (vom Tasker Entwickler joaoapps.com) vom das Haus verlassenden Smartphone eine Benachrichtigung an das interne Smartphone senden, sobald die WLAN-Verbindung unterbrochen wird.
    Das interne Smartphone sendet dann den HTTP-Request an die CCU. Geht dann alles recht einfach, weil Join auch als Plugin für Tasker fungiert. Keine Portweiterleitung, kein VPN, kein Webserver etc. benötigt.

  3. Sollte eine Fritz!Box vorhanden sein, dann schaut euch mal das AddOn hm_pdetect an.
    Dieses erkennt die Anwesenheit über die an der Fritz!Box angemeldeten Smartphones (ohne das auf dem Smartphone irgendwas installiert werden muss).
    Dies funktioniert auch noch sehr zuverlässig, mit den neuen Andrid Versionen, wo die Stromspareinstellungen das WLAN im DeepSleep ausschalten.

    1. Vielen Dank für den Tipp, würde ich testen! Das Addon scheint richtig gut zu sein!

Schreibe einen Kommentar

Menü schließen