Hausautomatisierung

Anwesenheitserkennung über GPS-Position

Hallo, jemand zuhause?

Oftmals würde man gerne alle Geräte automatisch ausschalten wollen oder die Heizung zurückregeln, wenn niemand zuhause ist.  Aber wie können wir feststellen, ob das eigene Heim wirklich verwaist ist?
Umgekehrt hätten wir gerne, dass sich beispielsweise die Heizung einschaltet, wenn man weg war und gleich nach Hause kommen wird.

In beiden Fällen der Anwesenheitserkennung können wir auf die Mittel von Geofencing zurückgreifen.

Was ist Geofencing?

Mit Geofencing (Wortneuschöpfung aus geographic und fence) bezeichnet man den Einsatz des GPS-Systems und/oder Radiofrequenz-Identifikatoren wie WLAN-Knoten oder Bluetooth Beacons zur Erzeugung virtueller Grenzen um einen Ort.

Durch das Überschreiten dieser virtuellen Grenzen wird dann eine Aktion ausgelöst.

Geofencing über GPS?

Die Voraussetzung für die Positionierung im Freien ist ein GPS-Empfänger. Dabei haben wir so einen meistens immer dabei – unser Smartphone! Die meisten gängigen Smartphones haben einen GPS-Empfänger eingebaut. Wir brauchen „nur“ noch eine Software bzw. App, die bei Erreichen eines definierten Gebiets etwas auslöst. Dementsprechend könnten wir genau dadurch unsere Position an die Haussteuerung übertragen. Genau dafür gibt es für die zwei verbreitetsten Smartphone-Betriebssysteme jeweils eine entsprechende App:

  • iOS (iPhone und iPad): Locative
  • Android: EgiGeoZone Geofence

Für das Beispiel, das ich im kommenden beschreiben werde, verwende ich Locative auf dem iPhone. Trotzdem kann ich auch die Android App empfehlen. Diese hatte ich vor dem Wechsel zum iPhone lange im Einsatz.

Geofencing im Haus?

Solange unser Smartphone Kontakt zu ausreichend vielen Satelliten des GPS-Systems hat, kann die Position ermittelt werden. Im Haus sieht das ganz anders aus. Die einzige Positionierungshilfe ist dort das heimische WLAN.  Darüberhinaus haben wir aber keinerlei Information, in welchem Raum wir uns beispielsweise befinden. Nicht einmal eine Entfernung zu einem gewissen Punkt können wir hier mit Standardmitteln ermitteln. Deswegen wurden beispielsweise sog. Beacons erfunden. Diese „Leuchtfeuer“ funktionieren so: Sobald man mindestens 3 dieser Beacons in einem Raum platziert, so kann über Trilateration eine zweidimensionale Position innerhalb dieses Raumes berechnet werden. Somit wäre Folgendes denkbar: Eine Person betritt einen bestimmten Bereich im Haus. Dadurch wird ebenfalls wie beim Geofencing über GPS eine Aktion ausgelöst. Die oben genannte App Locative für iOS unterstützt auch Beacons. Die Einrichtung solcher Bacons werde ich später in einem separaten Artikel beschreiben. Weiters wollen wir uns zuerst einmal auf Geofencing über GPS konzentrieren.

Hard-und Software-Voraussetzungen

Zuerst brauchen wir einen Raspberry Pi mit entsprechendem Netzteil. Hierzu habe ich auch entsprechende Empfehlungen gegeben.
Genauso sollte man sich über die Vernetzung Gedanken machen, ob man die Raspberry Pis per Netzkabel oder per WLAN anbinden möchte. Dafür habe ich hier in meinen Artikeln über die Grundkonfiguration Tipps gegeben:

Dynamische Adressauflösung für unseren Raspberry Pi

Damit die Geofencing-App Informationen über das Erreichen oder Verlassen eines definierten Gebietes an unsere Haussteuerung übertragen kann, müssen wir unseren Raspberry Pi erstmal aus dem Internet erreichbar machen. Besser gesagt müssen wir einen Port über die Fritzbox öffnen. Dafür müssen wir in der Fritzbox im Menü unter Internet ->Freigaben->Dynamic DNS einen Eintrag zur dynamischen Adressauflösung erstellen. Es gibt viele Anbieter für eine dynamische Namensauflösung, bei mir ist es Teil meines Vertrages bei meinem Webhoster.

DynDNS Danach ist zuerst mal nur unsere Fritzbox über den Namen erreichbar. Jedoch wollen wir ja unseren Raspberry Pi erreichen bzw. einen Port davon. Wie wir später wissen werden handelt es sich um den Port 8088, den wir für die Geofencing Datenübermittlung freigeben wollen.

Portfreigabe

Nun ist der Port 8088 unseres Raspberry Pi, auf dem die Haussteuerung FHEM läuft, von außen ebenfalls über den Port 8088 erreichbar. Alle Daten, die die Fritzbox vom Internet am Port 8088 erreichen, werden an den gleichen Port auf unseren Raspberry Pi übermittelt und umgekehrt. Später müssen wir uns noch um die Absicherung unserer Haussteuerung kümmern, damit über diesen Port auch nur entsprechende Informationen zum Geofencing empfangen werden können.

Einrichten der Geofencing-App am Smartphone

Anhand der App Locative für iOS werde ich die Konfiguration und Einbindung in die Haussteuerung FHEM beschreiben.

Locative iPhone

Nach Installation der App Locative starten wir diese und definieren ein Geofencing-Gebiet, bei dessen Erreichen wir eine Information an FHEM übermitteln wollen. Als Beispiel erstellen wir den Flughafen München. Hier könnte man sich vorstellen, dass bei Erreichen des Terminals automatisch zuhause bestimmte Steckdosen oder die Heizkörper ausgeschaltet werden, weil wir verreisen wollen.

Locative

Falls wir nur jemanden vom Flughafen abholen, ist das natürlich keine gute Idee ohne weitere Bedingung das Ganze an die Position unseres Smartphones zu koppeln. Dessen ungeachtet dient es als Beispiel zur Erklärung. Wir tappen auf „Geofences„, dann oben auf „+" und erstellen wie im Screenshot darüber einen neuen Geofence namens flughafen_muc. In die beiden HTTP Push Felder tragen wir die Adresse unseres Raspberry Pi aus dem Internet ein mit dem entsprechenden Pfad wie

http://home.mywebsite.de:8088/webhook/geo

Des weiteren müssen wir noch die Authentifizierung einstellen, also User und Passwort.

Locative Authentifizierung

Nun wäre unsere Geofencing App so eingestellt, dass sie eine Webseite auf unserem Raspberry Pi aufruft und per Get-Methode Daten überträgt. Und das passiert sowohl beim Erreichen als auch beim Verlassen des Gebiets „flughafen_muc„.
Genauso sollten wir einen weiteren Geofence „home“ erstellen. Wir gehen genauso vor, wie eben beschrieben, ändern lediglich Ort, Radius und Location ID, die wir „home“ nennen.

Permanente Überwachung?

Was man noch wissen sollte ist, dass die App nicht ständig seine Position überträgt, sondern eben nur, wenn es einen „Fence“ überschreitet. In obigem Beispiel lösen wir die Übertragung sowohl bei Ankunft und bei Verlassen aus. Wird die Position beim Verlassen übertragen, so wird die ID „underway“ übertragen. Für jedes definierte Geofence-Gebiet wird die GPS-Position verglichen. Die App überwacht uns also nicht permanent, sondern löst nur aus, wo wir ein solches Gebiet erstellt haben. Für unser Beispiel gibt es also drei übertragende Location IDs: flughafen_muc, home und underway.

Einbinden von Geofencing in FHEM

Demgegenüber ist die Einbindung in FHEM relativ einfach. Hierfür brauchen wir nur ein paar Zeilen in der Konfigurationsdatei fhem.cfg einfügen:

define geofancy GEOFANCY geo
attr geofancy room Anwesenheit

attr WEBhook hiddenroom input,detail,save,Unsorted,Everything,Anwesenheit,FS20,Fenster,Heizung,Kalender,Logging,Multimedia,Sensoren,Text2Speech,Wettervorhersage,Commandref,style,Edit files,Select style,Logfile,Floorplans,Remote doc,FileLogs,Apartment,Bathroom,Bedroom,Kitchen,Living,Residents,System,Weather,Event monitor,NEW
attr WEBhook room hidden
attr WEBhook webname webhook
define allowed_WEBhook allowed
attr allowed_WEBhook basicAuth { "$user:$password" eq "martin:dasistmeinpasswort" }
attr allowed_WEBhook validFor WEBhook

Wenn unser Raspberry Pi mit dem Namen raspberrypi die IP-Adresse 192.168.188.71 hat, dann ist unter der URL http://192.168.188.71:8088/webhook/geo das GEOFANCY Modul erreichbar. Von außen natürlich unter http://home.mywebsite.de:8088/webhook/geo, je nach dynamischem Namen. Über das Attribut hiddenroom werden alle Räume versteckt, der Pfad hinter dem Port wird mit dem Attribut webname konfiguriert. Die Authentifizierung stellt man mit dem Attribut basicAuth ein.

Simulation des Geofencing

Um zu testen, ob die Einbindung des GEOFANCY Moduls in FHEM funktioniert, müssen wir nicht erst zu unserem definierten Gebiet reisen. Wir können so tun, als ob unsere App die URL aufruft. Wenn wir im Browser nun http://home.mywebsite.de:8088/webhook/geo aufrufen, dann sollte im Browser nach Abfrage von User und Passwort als Antwort eine fast leere Webseite kommen mit der Zeile

NOK No data received

Wir müssen jetzt nicht gleich zum definierten Gebiet fahren (flughafen_muc), um als nächsten Schritt vom Smartphone aus zu testen, ob die Daten von der App zu FHEM richtig übertragen werden. Dazu hat sowohl Locative für iOS als auch das Android Pendant EgiGeoZone Geofence eine Testfunktion.

In Locative gehen wir dazu auf Einstellungen und aktivieren das Flag Benachrichtigung bei Erfolg und Benachrichtigung bei Fehler. Weiter geben wir dieselbe URL an wie beim Eintragen des Geofence. Des Weiteren pflegen wir noch den Benutzernamen und das Passwort. Bei Test-Request senden sollte ein Popup und oben am Bildschirmrand eine grüne Meldung wie folgt kommen.

Locative Verbindungstest

Diese Rückmeldung besagt, dass die Übertragung erfolgreich war, aber eine „leere“ Positionsangabe (anstatt z.B. flughafen_muc) übertragen wurde. Trotzdem war der Test erfolgreich.

Echtes Auslösen des Geofence

Nun können wir uns mit dem Smartphone zu unserem definierten Gebiet begeben. Sobald wir den „Fence“, also die Grenze zu unserem definierten Gebiet überschreiten,  wird über die App die hinterlegte URL aufgerufen und die Positions-ID (z.B. flughafen_muc) übertragen.

Zunächst sollten wir aber unserem Smartphone für Geofencing noch einen Namen geben. Denn es wird im Device geofancy unter seiner kryptischen UUID Hexadezimaladresse geführt, was die weitere Verarbeitung schwierig macht. Die ersten Einträge finden wir unter Anwesenheit->geofancy unter den Readings. Dort tauchen dann die ersten Einträge aus wie z.B.

lastDeviceUUID	                            FA2C668B-AA11-BB22-CC33-987654321AB  2017-01-02 16:11:02	

Das muss unser Smartphone sein. Entsprechend schwer ist das zu lesen, deshalb legen wir für die UUID einen Alias an, was ganz einfach geht mit:

attr geofancy devAlias FA2C668B-AA11-BB22-CC33-987654321AB:MartiniPhone

Nachfolgend können wir das Smartphone im Geofancy-Modul über seinen lesbaren Namen ansprechen. Nachdem wir die zusätzlichen Einträge in der fhem.cfg gemacht haben, sollten beim nächsten Auslösen des „Fence“ schon mehr Einträge in den Geofancy Readings zu sehen sein:

geofancy readings

Änderung der übertragenen Position

Im Augenblick übertragen wir lediglich die Positionsdaten von der Smartphone-App an das Hilfsmodul GEOFANCY. Nun wollen wir aber auf die Änderung der Position reagieren und entsprechend eine Aktion auslösen.

Um für die verschiedenen Positionen unterschiedliche Dinge auszulösen, definieren wir uns am besten eine Hilfsmethode. Hierzu erstellen wir ein neues Include, das wir im Verzeichnis /opt/fhem/FHEM erstellen. Dementsprechend kopieren wir uns den unten aufgelisteten Code in eine leere Datei namens 99_GeofancyUtils.pm. Hierfür können wir den kleinen Editor nano benutzen und die neue Datei mit

cd /opt/fhem/FHEM
nano 99_GeofancyUtils.pm

erstellen. Weiters kopieren wir den unten stehenden Code in den geöffneten Editor und speichern ihn mit STRG+O ab. Schließlich beenden wir den Editor mit STRG+X.
Im Anschluß der Code:

sub
get_location_and_trigger_action($$)
{
  my ($device,$status) = @_;

  my $martiniphone_location = ReadingsVal("geofancy", "currLoc_MartiniPhone", "underway");
  my $martiniphone_lastlocation = ReadingsVal("geofancy","lastLoc_MartiniPhone","underway");

  if($device eq "iphonemartin") {
  	if($status eq "flughafen_muc") {
  		if($martiniphone_lastlocation ne $martiniphone_location) { 
  		    # Aktion ausführen wie z.B. Heizung aus, Strom aus etc.
  			fhem("set FS20_steckdose off");;
      }
   }
   elsif($status eq "home") {
  		if($martiniphone_lastlocation ne $martiniphone_location) { 
  		    # Aktion ausführen wie z.B. Heizung aus, Strom an etc.
  			fhem("set FS20_steckdose on");;
      }
   }
}

Nun müssen wir nur noch einen Notify in die Konfigurationsdatei fhem.cfg einbauen, die bei jeder Änderung der Position von der Smartphone-App übertragen wird:

define n_location_iPhone notify geofancy:currLoc_MartiniPhone:.* { \
  get_location_and_trigger_action("iphonemartin",$EVTPART1);; \
}

Zusammenfassung

In unserem Beispiel für die Anwesenheitserkennung passiert also folgendes: Wir haben eine Steckdose FS20_steckdose. Diese soll sich ausschalten, sobald wir das Gebiet „flughafen_muc“ erreicht haben. Damit dieser Schaltvorgang aber nur dann passiert, wenn wir nicht schon an diesem Ort bei der Geofence-Übermittlung unmittelbar zuvor waren, wird der Ort der letzten Übertragung verglichen.
Andererseits schalten wir die Steckdose automatisch wieder ein, sobald wir zuhause ankommen und die Location ID „home“ übertragen haben.

 

 

Zuletzt aktualisiert am 06.01.2017.

4 Gedanken zu „Anwesenheitserkennung über GPS-Position“

  1. Moin und danke für die super Anleitung.
    Prinzipell funktioniert alles und ich verstehe auch min. 60%.
    Allerdings bekomme ich bei Anlage des notify einen Fehler:

    syntax error at (eval 94131) line 1, at EOF“
    Was mache ich falsch?
    Die Variablen habe ich meinem Telefon angepasst.

    Danke

    1. Hallo,

      so einen Fehler habe ich auch schon des Öfteren bekommen. Es reduziert sich leider immer wieder auf einen Tipp-Fehler. Dabei fehlt sehr oft eine Klammer bzw. die Ende-Klammer, der Backslash \ oder die Strichpunkte ;; am Ende des Notify.
      Ich würde mal schrittweise vorgehen und den Notify erst mal ganz einfach aufbauen und dann in die finale Form bringen. So bekommst Du eine Struktur, die syntaktisch korrekt ist und kannst dazu ergänzen.

      define n_location_iPhone notify geofancy:currLoc_MartiniPhone:.* { \
      }

      das müsste syntaktisch korrekt sein und dürfte keinen Fehler liefern.
      Danach die mittlere Zeile einfügen und nochmal probieren.

      get_location_and_trigger_action(„iphonemartin“,$EVTPART1);; \

      Danach sollte die Form wieder vollständig sein:
      define n_location_iPhone notify geofancy:currLoc_MartiniPhone:.* { \
      get_location_and_trigger_action(„iphonemartin“,$EVTPART1);; \
      }

      Probier nochmal. Wenn das nicht klappt, dann liegt der Fehler ausserhalb des Notify. Der Fehler könnte auch in der sub-Methode get_location_and_trigger_action sein.
      Dort gilt dasselbe: Oft fehlt eine Klammer oder die Strichpunkte. (in der sub natürlich nur ein einfacher Strichpunkt und keine Backslashes, denn dort sind wir in direktem Perl-Coding)

      Hope this helps
      Gruß
      Martin

  2. Hallo,
    mit grossem Interesse habe ich deine Seite über Anwesenheitserkennung über GPS-Position gelesen. Ich möchte dies in Verbindung mit meinem Projekt Alarmanlage nutzen. Ich bin nicht der Experte, ich versuche mich aber durchzukämpfen.
    Aktuell habe ich den Raspberry mit dem Port 8085 freigeschaltet und komme sowohl mit einen dyndns (GOIP), als auch über myfritz! auf den Raspberry von extern. Über diesen Port 8085 überwache ich mein Haus, falls ich unterwegs bin. Jetzt benötigst du ja noch einen weiteren Port 8088 für Geofancy und meine Fritzbox auch mit dem AVM Support packt dies , warum auch immer , nicht.
    Prinzipiell die Fragen
    1. Ich benötige den 8088 zusätzlich zu meinem 8085 frei?
    2. Kann ich in der Fritzbox an einem Gerät, auf den bereits Ports freigeschalten sind, weitere Ports freischalten? Wenn ja, wie geht das?

    Vielen Dank

    1. Hallo Uwe,

      zu Deinen Fragen:
      1. Theoretisch könnte man das auch auf dem selben Port 8085 machen, es empfiehlt sich jedoch ein eigener Port, schon alleine deswegen, weil man dann besser steuern kann von wo aus und wer diesen Link aufruft. Diesen kann man dann separat und mit anderen Zugangsdaten absichern. Du kannst jedoch einstellen, welchen Port Du nimmst, standardmässig wird jedoch für Geofancy immer der 8088 benutzt.
      Du kannst dies im Block
      define WEBhook FHEMWEB 8088 global
      attr WEBhook hiddenroom input,detail,save,Unsorted,Everything,FS20,Fenster,FritzBox,Heizung,Kalender,Logging,Multimedia,Sensoren,Text2Speech,Commandref,style,Edit files,Select style,Logfile,Floorplans,Remote doc,FileLogs,Apartment,System,Weather,Event monitor,NEW,CUL_HM,HomeBridge,PushMsg
      attr WEBhook longpoll 1
      attr WEBhook room hidden
      attr WEBhook webname webhook
      attr WEBhook HTTPS 1
      define allowed_WEBhook allowed
      attr allowed_WEBhook basicAuth xxxxxxxxxxxxxxxxxxxxxx
      attr allowed_WEBhook validFor WEBhook

      gleich oben einstellen. Man sollte jedoch eine hohe Nummer verwenden und eine, die nicht schon verwendet wurde.

      Zu 2.
      Klar geht das. Du kannst mehrere Ports an ein Gerät freischalten:
      Nehmen wir als Beispiel Port 8888
      Über Internet->Freigaben->Gerät für Freigaben hinzufügen
      suchst Du erst das Zielgerät raus,
      und machst dann Neue Freigabe.
      Dort auf Portfreigabe und „andere Anwendung“
      Text eingeben bsp. „Geofancy“
      und dann Port an Gerät von 8888 bis 8888
      Port extern gewünscht 8888

      Hoffe, ich konnte Dir weiterhelfen
      Gruß
      Martin

Schreibe einen Kommentar

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