Die kostenlose Android Geofence App EgiGeoZone bietet die Möglichkeit, geo-location-basiert Befehle an SmartHomeNG zu senden. Dazu definiert man in der App sogenannte Zonen („Geofences“ = in diesem Fall ein Punkt in Form von GPS Koordinaten und ein Radius um diese herum). So kann man bspw. eine Home-Zone definieren, die sich 200m um ein Haus herum befindet. Fährt man in diese ein, kann beispielsweise das Einfahrtstor automatisch geöffnet, oder beim Herausfahren geschlossen werden.

Ein anderer Anwendungsfall ist es, von der aktuellen Zone (bspw. der Arbeitsplatz) mit dem Traffic Plugin die Fahrzeit nach Hause zu berechnen und via Pushbullet Plugin bei Überschreitung einer bestimmten Dauer Alarm zu schlagen. Dieser Anwendungsfall ist Thema eines separaten Artikels.

Einrichtung des Network Plugins für EgiGeoZone

Als erstes ist das Network Plugin in die etc/plugin.yaml aufzunehmen. Auf einem angegebenen Port muss es mit HTTP aufrufbar sein.


nw:
    class_name: Network
    class_path: plugins.network
    ip: 
    tcp: 'yes'
    http: 8888

Als nächstes wird in der etc/logic.yaml eine Logik für das Einfahren und das Verlassen einer Zone definiert, die via Network-Plugin aufgerufen werden kann:


GeoZoneEntry:
    filename: geozone_entry.py
    nw: 'yes'

GeoZoneExit:
    filename: geozone_exit.py
    nw: 'yes'

Damit das Ganze nun von außen über das Internet erreichbar ist, wurde via NGINX ein Reverse Proxy mit Basic Authentication eingerichtet. Alternativ kann das Smartphone auch im VPN eingeloggt sein und die Anfragen direkt gegen den SmartHomeNG Server unter http://<IP-Adresse von SmartHomeNG>:8888/ schicken.

Tipp: Grundlegende Informationen zur Nutzung von NGINX als Reverse Proxy für SmartHomeNG und die smartVISU können unter https://www.smarthomeng.de/nginx-als-reverseproxy gefunden werden!

In der /etc/nginx/.shng sind dabei mit htpasswd ein Username und ein Passwort generiert worden. So steht der Endpunkt geschützt im Internet. Diese Daten müssen später in der EgiGeoZone App eingetragen werden.


location /shng {
        auth_basic "Restricted Area: SmartHomeNG";
        auth_basic_user_file /etc/nginx/.shng;

        if ($allowed_country = no) {
                return 403;
                break;
        }
        proxy_pass http://<IP-Adresse von SmartHomeNG>:8888/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

Im nächsten Schritt müssen einige Items angelegt werden:


location:

        lat:
            type: str
            visu_acl: ro
            cache: 'yes'

        lon:
            type: str
            visu_acl: ro
            cache: 'yes'
 
        prev_zone:
            type: str
            visu_acl: ro
            cache: 'yes'

        zone:
            type: str
            visu_acl: ro
            cache: 'yes'

        entry_date:
            type: str
            visu_acl: ro
            cache: 'yes'

        exit_date:
            type: str
            visu_acl: ro
            cache: 'yes'

Nun sind noch die beiden Logiken zu erzeugen.

logics/geozone_entry.py:


from lib.shtime import Shtime

sh_now = Shtime.get_instance().now()

parts = []
parts = value.split(',')

sh.location.prev_zone(sh.location.zone())

if sh.location.prev_zone() != parts[1]:
    sh.location.zone(parts[1])
    sh.location.lat(parts[2])
    sh.location.lon(parts[3])
    sh.location.exit_date('')
    sh.location.entry_date(sh_now.strftime("%Y-%m-%d %H:%M:%S"))
    if parts[1] == 'Home':
        # Tor öffnen
        sh.knx.outside.gate.driveway.open.full(1)

logics/geozone_exit.py:


from lib.shtime import Shtime

sh_now = Shtime.get_instance().now()

parts = []
parts = value.split(',')

sh.location.prev_zone(sh.general.location.zone())
sh.location.exit_date(sh_now.strftime("%Y-%m-%d %H:%M:%S"))
sh.location.entry_date('')
sh.location.zone("Unterwegs")

Spätestens jetzt muss SmartHomeNG neu gestartet werden.

EgiGeoZone einrichten

Nach der Installation der EgiGeoZone App aus dem Android Play Store muss dieses initial konfiguriert werden.

Dazu muss über das Menü links oben der Punkt „Profile“ gewählt werden. Hier fügt man nun mit + ein neues Serverprofil hinzu („SmartHomeNG“):

  

In diesem Profil müssen der zuvor via htpasswd konfigurierte Benutzer und dessen Passwort hinterlegt werden. Wird das Ganze via VPN genutzt, kann die Angabe entfallen.

Für das Betreten / Verlassen der jeweiligen Zone, setzt man nun die jeweiligen URLs in den zugehörigen Felder („URL Zone betreten“, „URL Zone verlassen“).

Die URL besteht im Wesentlichen aus dem Namen der Logik und mehreren kommagetrennten Parametern, die die EgiGeoZone App befüllt. In der Logik werden diese aus dem übergebenen Wert (value) in das Array parts geschrieben.

Betreten der Zone:


https://<dyndns URL>/shng/logic|GeoZoneEntry|${deviceId},${zone},${latitude},${longitude},${accuracy}

bzw. im VPN:


http://<IP-Adresse von SmartHomeNG>:8888/logic|GeoZoneEntry|${deviceId},${zone},${latitude},${longitude},${accuracy}

Verlassen der Zone:


https://<dyndns URL>/shng/logic|GeoZoneExit|${deviceId},${zone},${latitude},${longitude},${accuracy}

bzw. im VPN:


http://<IP-Adresse von SmartHomeNG>:8888/logic|GeoZoneExit|${deviceId},${zone},${latitude},${longitude},${accuracy}

parts[0] ist die eindeutige Geräte-UUID, parts[1] der String der später in EgiGeoZone definierten Zone, parts[2] die Latitude, parts[3] die Longitude der jeweiligen GPS Koordinate der Zone, in der man sich befindet. Mit parts[4] wird noch die aktuelle Genauigkeit der Messung übertragen, die bisher in den Logiken nicht verwendet wird.

Die Werte werden nach dem Auslesen in das Array parts über die Logik in das jeweilige Item geschrieben.

Die erste Zone

Befindet man sich nun z.B. zu Hause, kann die erste Zone schnell definiert werden.

Auf der Hauptseite der EgiGeoZone App ist die Liste der „GeoZonen“ zu sehen. Diese ist initial leer. Über das „+“ Icon rechts unten fügt man eine neue Zone hinzu.

Entweder gibt man die Koordinaten des Zentrums direkt ein (bspw. via Google Maps zu bestimmen), oder man zieht sich über die kleine Weltkugel daneben den aktuellen Wert. Dazu kann man den Radius wählen, was auf einer Karte angezeigt wird.

Als Serverprofil ist nun das zuvor anlegte „SmartHomeNG“ Profil zu wählen.

Beim ersten Erkennen eines Aufenthalts in der Zone, wird nun sofort die GeoZoneEntry Logik aufgerufen. Die entsprechenden Items sollten nun aktualisiert werden.

Nach und nach kann man weitere Zonen festlegen und die Logik(en) entsprechend modifizieren.

Nutzung mit mehreren Geräten

Will man bei unterschiedlichen Smartphones entsprechend unterschiedlich reagieren, lässt sich über das Icon mit den drei Punkten in der rechten oberen Ecke von EgiGeoZone – und dort im Menüpunkt „Technische Info“ – die eindeutige Geräte-UUID einsehen (Achtung: diese ist unterhalb der Android-UUID zu finden und nicht mit dieser zu verwechseln).

In der Logik kann man gezielt auf diese UUID über parts[0] prüfen und daher unterschiedlich reagieren. Beispielsweise könnte man für jedes Endgerät eigenes Items definieren und deren aktuelle Zone getrennt voneinander tracken.

So können bspw. mehrere Familienmitglieder auf einer Google Maps Karte visualisiert werden. Dazu folgt demnächst ein weiterer Artikel.

 

(Die in diesem Artikel verwendeten Screenshots wurden selber erstellt. Das Titelbild ist unter der Creative Commons Zero (CC0) Lizenz veröffentlicht und wurde von www.pexels.com bezogen.)


Schreibe einen Kommentar

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