<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>egigeozone &#8211; SmartHomeNG | smarthome knx homematic mqtt hue 1wire home automation</title>
	<atom:link href="https://www.smarthomeng.de/tag/egigeozone/feed" rel="self" type="application/rss+xml" />
	<link>https://www.smarthomeng.de</link>
	<description>Die Device Integrations-Plattform für Dein Smart Home</description>
	<lastBuildDate>Fri, 02 Nov 2018 07:32:42 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.5</generator>

<image>
	<url>https://www.smarthomeng.de/wp-content/uploads/global/logo_small_152x152-150x150.png</url>
	<title>egigeozone &#8211; SmartHomeNG | smarthome knx homematic mqtt hue 1wire home automation</title>
	<link>https://www.smarthomeng.de</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Google Maps Widget für SmartVISU 2.9</title>
		<link>https://www.smarthomeng.de/google-maps-widget-fuer-smartvisu-2-9</link>
					<comments>https://www.smarthomeng.de/google-maps-widget-fuer-smartvisu-2-9#respond</comments>
		
		<dc:creator><![CDATA[Marc René Frieß]]></dc:creator>
		<pubDate>Sat, 18 Aug 2018 14:52:28 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[egigeozone]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[smartVISU]]></category>
		<category><![CDATA[smartVISU 2.9]]></category>
		<category><![CDATA[Traffic Plugin]]></category>
		<category><![CDATA[Widget]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=1995</guid>

					<description><![CDATA[Auch in der Visualisierung kann es von Nutzen sein, seine aktuelle Position und ggf. eine Fahrtroute auf einer Google Maps Karte zu visualisieren. SmartHomeNG bietet eine Reihe an Plugins und Möglichkeiten, um die jeweiligen Geokoordinaten zu erfassen (EgiGeoZone mit Network oder Webservices Plugin) und die Fahrzeit zu berechnen (Traffic Plugin).<a class="moretag" href="https://www.smarthomeng.de/google-maps-widget-fuer-smartvisu-2-9"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Auch in der Visualisierung kann es von Nutzen sein, seine aktuelle Position und ggf. eine Fahrtroute auf einer Google Maps Karte zu visualisieren. SmartHomeNG bietet eine Reihe an Plugins und Möglichkeiten, um die jeweiligen Geokoordinaten zu erfassen (EgiGeoZone mit Network oder Webservices Plugin) und die Fahrzeit zu berechnen (Traffic Plugin). Die Anzeige dieser Daten muss jedoch in der Visualisierung geschehen. <span id="more-1995"></span><br />
Aus dieser Motivation heraus habe ich ein Google Maps Widget für die SmartVISU geschrieben, welches mir meine aktuelle Position, meine Heimkoordinaten und den Weg zur Arbeit bzw. den Weg von der aktuellen Position nach Hause anzeigt.</p>
<p>In <a href="https://www.smarthomeng.de/geozonen-basierte-services-mit-der-egigeozone-app-und-dem-network-plugin" target="_blank" rel="noopener">https://www.smarthomeng.de/geozonen-basierte-services-mit-der-egigeozone-app-und-dem-network-plugin</a> wurde beschrieben, wie man Positionsdaten in SmartHomeNG übertragen kann. In <a href="https://www.smarthomeng.de/das-traffic-plugin-am-beispiel-eines-staualarms" target="_blank" rel="noopener">https://www.smarthomeng.de/das-traffic-plugin-am-beispiel-eines-staualarms</a> wurde beschrieben, wie das Traffic Plugin (Google Directions) in SmartHomeNG eingebunden werden kann. Items aus beiden Artikeln werden für das Plugin benötigt!</p>
<p><strong>Tipp:</strong> Am Ende des Artikels findet sich noch eine einfachere Version, die nur die aktuelle Position benötigt (und anzeigt)!</p>
<h1>Items</h1>
<p>Basis bilden ein Teil bzw. eine Erweiterung der Items aus dem EgiGeoZone und den Traffic Plugin Artikel. Bitte auf diese Artikel referenzieren, wie die Items belegt werden können.</p>
<pre><code class="language-yaml">
%YAML 1.1
---
location:

	home:
		lat:
			type: str
			value: 48.263530
			cache: 'yes'

		lon:
			type: str
			value: 11.443952
			cache: 'yes'
	
	work:

		lat:
			type: str
			value: 48.143158
			cache: 'yes'

		lon:
			type: str
			value: 11.547755
			cache: 'yes'
			
	lat:
		type: str
		cache: 'yes'

	lon:
		type: str
		cache: 'yes'

travel_info:
       
        calculate_way_home:
                type: bool
                cache: 'yes'

        calculate_way_work:
                type: bool
                cache: 'yes'

        travel_summary:
                type: str
 
</code></pre>
<p>Neben den jeweiligen GPS Koordinaten der aktuellen Position (<code>location.lat, location.lon</code>), der Home-Koordinate (<code>location.home.lat, location.home.lon</code>) und der Koordinate der Arbeitsstelle (<code>location.work.lat, location.work.lon</code>), sind hier auch zwei boolsche Items, die angeben, ob jeweils der Weg nach Hause oder in die Arbeit angezeigt werden soll (<code>travel_info.calculate_way_home</code> und <code>travel_info.calculate_way_work</code>) Für die Anzeige darf jeweils nur eines dieser Items <code>True</code> sein. Näheres ist in <a href="https://www.smarthomeng.de/das-traffic-plugin-am-beispiel-eines-staualarms" target="_blank" rel="noopener">https://www.smarthomeng.de/das-traffic-plugin-am-beispiel-eines-staualarms</a> beschrieben.</p>
<p><strong>Tipp:</strong> Man kann natürlich auch die &#8222;aktuelle&#8220; Koordinate <code>location.lat, location.lon</code> fest im Item hinterlegen, ohne dieses via EgiGeoZone zu bedaten. Diese Koordinate ist, so lange keine Route angezeigt wird, das Zentrum der Karte!</p>
<h1>Google Maps Widget</h1>
<p>Für das Widget sind im Ordner <code>dropins/widgets</code> zwei Dateien zu erstellen. Im Javascript File wird dabei die Karte initialisiert und falls angegeben, die Verkehrsanzeige eingeschaltet. Daneben wird ein Marker auf die Home Koordinate und die aktuelle Position gesetzt. Letzterer ist mit einem Foto hinterlegt.</p>
<p>Im Update-Block werden die jeweiligen Positionen aktualisiert und die aktuelle Route gesetzt (falls eine Route aktuell angezeigt werden soll).</p>
<p>Im JS-File muss bedacht werden, dass der im Rahmen des Traffic Plugins eingerichtete API Key für die Google Directions API angegeben werden muss (<code>&lt;apikey&gt</code>)! Zudem kann als Title noch der jeweilige Name <code>&lt;Mein Name&gt;</code> gesetzt werden.</p>
<p><strong><code>dropins/widgets/gmaps.js</code>:</strong></p>
<pre><code class="language-javascript">
// dropins/widgets/gmaps.js
$.widget("sv.gmaps_map", $.sv.widget, {
    initSelector: 'div[data-widget="gmaps_map"]',

    options: {
        'traffic': null,
    },

    _create: function () {
        this._super();
        this._create_map();
    },

    _create_map: function () {
        try {
            this.map = new google.maps.Map(this.element[0], {
                zoom: 11,
                disableDefaultUI: false,
                clickableIcons: false,
                mapTypeControl: false,
                streetViewControl: false
            });
        }
        catch(e) {
            if(e.name == "ReferenceError") { // google maps script not loaded yet
                var that = this;
                // google maps script is already loading in another widget
                if(window.google_maps_loading) { 
                    window.setTimeout(function() { that._create_map() }, 100)
                    return;
                }
                // google maps script is not loading
                window.google_maps_loading = true;
                $.ajax({
                    url: 'https://maps.googleapis.com/maps/api/js?key=&lt;apikey&gt;',
                    dataType: "script",
                    complete: function() { window.google_maps_loading = false; that._create_map() }
                });
                return;
            }
            else  // other exceptions should be trown
                throw e;
        }

        this.directionsService = new google.maps.DirectionsService;
        this.directionsDisplay = new google.maps.DirectionsRenderer();
        this.directionsDisplay.setMap(this.map);

        if (this.options['traffic']) {
            var trafficLayer = new google.maps.TrafficLayer();
            trafficLayer.setMap(this.map);
        }

        var pinColorGreen = "20d24a";
        var pinImageGreen = new google.maps.MarkerImage("https://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|" + pinColorGreen,
            new google.maps.Size(21, 34),
            new google.maps.Point(0,0),
            new google.maps.Point(10, 34));
        var pinImageMyself = new google.maps.MarkerImage("/smartVISU/pics/phone/myself.jpg" ,
            null, null, null, new google.maps.Size(40, 40));
        var pinShadow = new google.maps.MarkerImage("https://chart.apis.google.com/chart?chst=d_map_pin_shadow",
            new google.maps.Size(40, 37),
            new google.maps.Point(0, 0),
            new google.maps.Point(12, 35));

        this.marker_home = new google.maps.Marker({
            map: this.map,
            icon: pinImageGreen,
            shadow: pinShadow,
            title:' Home '
        });

        this.marker_myself = new google.maps.Marker({
            map: this.map,
            icon: pinImageMyself,
            title:' &lt;Mein Name&gt;',
            zIndex:99999999
        });
    },

    _update: function(response) {

        if(!this.map) {
            var that = this;
            window.setTimeout(function() { that._update(response) }, 100)
            return;
        }

        this.map.setCenter({lat: response[0], lng: response[1]});
        var pos = new google.maps.LatLng(parseFloat(response[0]),parseFloat(response[1]));
        this.marker_myself.setPosition(pos);

        var pos_home = new google.maps.LatLng(parseFloat(response[2]),parseFloat(response[3]));
        this.marker_home.setPosition(pos_home);
        if (response[6] && response[7] && (response[4] == 1 || response[5] == 1)) {
            if (response[4] == 1) {
                var destination = { lat: parseFloat(response[2]), lng: parseFloat(response[3]) };
            } else if (response[5] == 1) {
                var destination = { lat: parseFloat(response[6]), lng: parseFloat(response[7]) };
            };
            var directionsDisplay = this.directionsDisplay;
            this.directionsDisplay.setMap(this.map);
            this.directionsService.route({
                origin: pos,
                //provideRouteAlternatives: true,
                destination: destination,
                travelMode: google.maps.TravelMode.DRIVING
            }, function(result, status) {
                if (status === google.maps.DirectionsStatus.OK) {
                    directionsDisplay.setDirections(result);
                } else {
                    console.log('Directions request failed due to ' + status);
                }
            });
        } else {
            if(this.directionsDisplay != null) {
                this.directionsDisplay.setMap(null);
            }
        }
    }
})
</code></pre>
<p>&nbsp;</p>
<p>und <strong><code>dropins/widgets/gmaps.html</code>:</strong></p>
<pre><code class="language-twig">
// dropins/widgets/gmaps.html - API Key für Google Directions angeben!
/**
 * Displays a google maps map with current, home and work position, as well as routing
 *
 * @param unique id for this widget
 * @param a gad/item for latitude
 * @param a gad/item for longitude
 * @param a gad/item for home latitude
 * @param a gad/item for home longitude
 * @param a gad/item for bool flag, if route to home shall be calculated
 * @param a gad/item for bool flag, if route to work shall be calculated
 * @param a gad/item for work latitude
 * @param a gad/item for work longitude
 * @param traffic information on (=1) or off (=0)
 */
{% macro map(id, gad_lat, gad_lon, gad_home_lat, gad_home_lon, gad_calculate_way_home, gad_calculate_way_work, gad_work_lat, gad_work_lon, traffic) %}
    &lt;div id="{{ uid(page, id) }}" style="width: 100%; height: 400px;" data-traffic="{{ traffic }}" data-widget="gmaps_map" data-item="{{ gad_lat }}, {{ gad_lon}}, {{ gad_home_lat }}, {{ gad_home_lon }}, {{ gad_calculate_way_home }}, {{ gad_calculate_way_work }}, {{ gad_work_lat }}, {{ gad_work_lon }}"&gt;&lt;/div&gt;
{% endmacro %}
</code></pre>
<p>Weiterhin wird ein Bild, welches unter <code>/smartVISU/pics/phone/myself.jpg</code> abgelegt ist, verwendet! Damit das Widget ordentlich funktioniert, sollte dieses Bild auch dort existieren.</p>
<h1>Einbindung in smartVISU 2.9</h1>
<p>Da die Widgets mit smartVISU 2.9 automatisch geladen werden, muss nun nur noch das Widget auf der entsprechenden Seite eingebunden werden:</p>
<pre><code class="language-twig">
&lt;div class="block" style="width: 100%;"&gt;
  &lt;div class="set-2" data-role="collapsible-set" data-theme="c" data-content-theme="a" data-mini="true"&gt;
    &lt;div data-role="collapsible" data-collapsed="false"&gt;
      &lt;h3&gt;Verkehr:
      {{ basic.symbol('travel_info.calculate_way_home', 'travel_info.calculate_way_home', 'Nach Hause via ', '', '1') }}
      {{ basic.symbol('travel_info.calculate_way_work', 'travel_info.calculate_way_work', 'Zur Arbeit via ', '', '1') }}
      {{ basic.print('travel_info.travel_summary', 'travel_info.travel_summary', 'text') }}
      &lt;/h3&gt;
      {{ gmaps.map('trafficmap', 'location.lat', 'location.lon', 'location.home.lat', 'location.home.lon', 'travel_info.calculate_way_home', 'travel_info.calculate_way_work', 'location.work.lat', 'location.work.lon', '1') }}
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;  
</code></pre>
<p>Das Ergebnis mit aktivem Arbeitsweg, sieht dann wie folgt aus:</p>
<p><img fetchpriority="high" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/08/kartenansicht.jpg" alt="" width="830" height="472" class="alignnone size-full wp-image-2016" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/08/kartenansicht.jpg 830w, https://www.smarthomeng.de/wp-content/uploads/2018/08/kartenansicht-300x171.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/08/kartenansicht-768x437.jpg 768w" sizes="(max-width: 830px) 100vw, 830px" /></p>
<h1>Einfachere Version:</h1>
<p>Hier noch eine einfachere Version des Widgets, nur mit Koordinaten der aktuellen Position:</p>
<pre><code class="language-twig">
{{ gmaps.simple_map('trafficmap_simple', 'location.lat', 'location.lon') }}
</code></pre>
<pre><code class="language-twig">
/**
 * Displays a simple google maps map
 *
 * @param unique id for this widget
 * @param a gad/item for latitude
 * @param a gad/item for longitude
 */
{% macro simple_map(id, gad_lat, gad_lon) %}
&lt;div id="{{ uid(page, id) }}" style="width: 100%; height: 400px;" data-widget="gmaps_simplemap" data-item="{{ gad_lat }}, {{ gad_lon}}"&gt;&lt;/div&gt;
{% endmacro %}
</code></pre>
<pre><code class="language-javascript">
$.widget("sv.gmaps_simplemap", $.sv.widget, {
    initSelector: 'div[data-widget="gmaps_simplemap"]',

    _create: function () {
        this._super();
        this._create_map();
    },

    _create_map: function () {
        try {
            this.map = new google.maps.Map(this.element[0], {
                zoom: 11,
                disableDefaultUI: false,
                clickableIcons: false,
                mapTypeControl: false,
                streetViewControl: false
            });
        }
        catch (e) {
            if (e.name == "ReferenceError") { // google maps script not loaded yet
                var that = this;
                // google maps script is already loading in another widget
                if (window.google_maps_loading) {
                    window.setTimeout(function () {
                        that._create_map()
                    }, 100)
                    return;
                }
                // google maps script is not loading
                window.google_maps_loading = true;
                $.ajax({
                    url: 'https://maps.googleapis.com/maps/api/js?key=&lt;apikey&gt;',
                    dataType: "script",
                    complete: function () {
                        window.google_maps_loading = false;
                        that._create_map()
                    }
                });
                return;
            }
            else  // other exceptions should be thrown
                throw e;
        }

        var pinColorGreen = "20d24a";
        var pinImageGreen = new google.maps.MarkerImage("https://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|" + pinColorGreen,
            new google.maps.Size(21, 34),
            new google.maps.Point(0,0),
            new google.maps.Point(10, 34));
        this.marker_myself = new google.maps.Marker({
            map: this.map,
            icon: pinImageGreen,
            title:' &lt;Mein Name&gt;',
            zIndex:99999999
        });
    },

    _update: function(response) {
        if(!this.map) {
            var that = this;
            window.setTimeout(function() { that._update(response) }, 100)
            return;
        }

        this.map.setCenter({lat: response[0], lng: response[1]});
        var pos = new google.maps.LatLng(parseFloat(response[0]),parseFloat(response[1]));
        this.marker_myself.setPosition(pos);
    }
});</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/google-maps-widget-fuer-smartvisu-2-9/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Geozonen-basierte Services mit der EgiGeoZone App und dem Network-Plugin</title>
		<link>https://www.smarthomeng.de/geozonen-basierte-services-mit-der-egigeozone-app-und-dem-network-plugin</link>
					<comments>https://www.smarthomeng.de/geozonen-basierte-services-mit-der-egigeozone-app-und-dem-network-plugin#respond</comments>
		
		<dc:creator><![CDATA[Marc René Frieß]]></dc:creator>
		<pubDate>Thu, 29 Mar 2018 13:13:18 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[egigeozone]]></category>
		<category><![CDATA[gps]]></category>
		<category><![CDATA[location based services]]></category>
		<category><![CDATA[network]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=787</guid>

					<description><![CDATA[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 (&#8222;Geofences&#8220; = 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<a class="moretag" href="https://www.smarthomeng.de/geozonen-basierte-services-mit-der-egigeozone-app-und-dem-network-plugin"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Die kostenlose Android Geofence App <a href="https://www.egigeozone.de/" target="_blank" rel="noopener">EgiGeoZone</a> bietet die Möglichkeit, geo-location-basiert Befehle an SmartHomeNG zu senden. Dazu definiert man in der App sogenannte Zonen (&#8222;Geofences&#8220; = 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.</p>
<p>Ein anderer Anwendungsfall ist es, von der aktuellen Zone (bspw. der Arbeitsplatz) mit dem <a href="https://github.com/smarthomeNG/plugins/tree/master/traffic" target="_blank" rel="noopener">Traffic Plugin</a> die Fahrzeit nach Hause zu berechnen und via <a href="https://github.com/smarthomeNG/plugins/tree/master/pushbullet" target="_blank" rel="noopener">Pushbullet Plugin </a>bei Überschreitung einer bestimmten Dauer Alarm zu schlagen. Dieser Anwendungsfall ist Thema eines <a href="https://www.smarthomeng.de/das-traffic-plugin-am-beispiel-eines-staualarms">separaten Artikels</a>.</p>
<h1>Einrichtung des Network Plugins für EgiGeoZone</h1>
<p>Als erstes ist das <a href="https://github.com/smarthomeNG/plugins/tree/master/network" target="_blank" rel="noopener">Network Plugin</a> in die <code>etc/plugin.yaml</code> aufzunehmen. Auf einem angegebenen Port muss es mit HTTP aufrufbar sein.</p>
<pre><code class="language-yaml">
nw:
    class_name: Network
    class_path: plugins.network
    ip: <ip-adresse von="" smarthomeng="">
    tcp: 'yes'
    http: 8888
</ip-adresse></code></pre>
<p>Als nächstes wird in der <code>etc/logic.yaml</code> eine Logik für das Einfahren und das Verlassen einer Zone definiert, die via Network-Plugin aufgerufen werden kann:</p>
<pre><code class="language-yaml">
GeoZoneEntry:
    filename: geozone_entry.py
    nw: 'yes'

GeoZoneExit:
    filename: geozone_exit.py
    nw: 'yes'
</code></pre>
<p>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 <code>http://<span style="color: #ff0000;">&lt;IP-Adresse von SmartHomeNG&gt;</span>:8888/</code> schicken.</p>
<p><strong>Tipp:</strong> Grundlegende Informationen zur Nutzung von NGINX als Reverse Proxy für SmartHomeNG und die smartVISU können unter <a href="https://www.smarthomeng.de/nginx-als-reverseproxy" target="_blank" rel="noopener">https://www.smarthomeng.de/nginx-als-reverseproxy</a> gefunden werden!</p>
<p>In der <code>/etc/nginx/.shng</code> sind dabei mit <code>htpasswd</code> 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.</p>
<pre><code class="language-nginx">
location /shng {
        auth_basic "Restricted Area: SmartHomeNG";
        auth_basic_user_file /etc/nginx/.shng;

        if ($allowed_country = no) {
                return 403;
                break;
        }
        proxy_pass http://<span style="color: #ff0000;">&lt;IP-Adresse von SmartHomeNG&gt;</span>: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;
    }
</code></pre>
<p>Im nächsten Schritt müssen einige Items angelegt werden:</p>
<pre><code class="language-yaml">
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'
</code></pre>
<p>Nun sind noch die beiden Logiken zu erzeugen.</p>
<p><code>logics/geozone_entry.py</code>:</p>
<pre><code class="language-python">
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)
</code></pre>
<p><code>logics/geozone_exit.py</code>:</p>
<pre><code class="language-python">
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")
</code></pre>
<p>Spätestens jetzt muss SmartHomeNG neu gestartet werden.</p>
<h1>EgiGeoZone einrichten</h1>
<p>Nach der Installation der EgiGeoZone App aus dem Android Play Store muss dieses initial konfiguriert werden.</p>
<p>Dazu muss über das Menü links oben der Punkt &#8222;Profile&#8220; gewählt werden. Hier fügt man nun mit + ein neues Serverprofil hinzu (&#8222;SmartHomeNG&#8220;):</p>
<p><img decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-144444.png" alt="" class="alignnone wp-image-811" width="232" height="412" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-144444.png 1440w, https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-144444-169x300.png 169w, https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-144444-768x1365.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-144444-576x1024.png 576w" sizes="(max-width: 232px) 100vw, 232px" />   <img decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-133417.png" alt="" class="alignnone wp-image-812" width="232" height="412" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-133417.png 1440w, https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-133417-169x300.png 169w, https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-133417-768x1365.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-133417-576x1024.png 576w" sizes="(max-width: 232px) 100vw, 232px" /></p>
<p>In diesem Profil müssen der zuvor via <code>htpasswd</code> konfigurierte Benutzer und dessen Passwort hinterlegt werden. Wird das Ganze via VPN genutzt, kann die Angabe entfallen.</p>
<p>Für das Betreten / Verlassen der jeweiligen Zone, setzt man nun die jeweiligen URLs in den zugehörigen Felder (&#8222;URL Zone betreten&#8220;, &#8222;URL Zone verlassen&#8220;).</p>
<p>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 (<code>value</code>) in das Array <code>parts</code> geschrieben<strong>.<br />
</strong></p>
<p><strong>Betreten der Zone:</strong></p>
<pre><code class="language-bash">
https://<span style="color: #ff0000;">&lt;dyndns URL&gt;</span>/shng/logic|GeoZoneEntry|${deviceId},${zone},${latitude},${longitude},${accuracy}
</code></pre>
<p>bzw. im VPN:</p>
<pre><code class="language-bash">
http://<span style="color: #ff0000;">&lt;IP-Adresse von SmartHomeNG&gt;</span>:8888/logic|GeoZoneEntry|${deviceId},${zone},${latitude},${longitude},${accuracy}
</code></pre>
<p><strong>Verlassen der Zone:</strong></p>
<pre><code class="language-bash">
https://<span style="color: #ff0000;">&lt;dyndns URL&gt;</span>/shng/logic|GeoZoneExit|${deviceId},${zone},${latitude},${longitude},${accuracy}
</code></pre>
<p>bzw. im VPN:</p>
<pre><code class="language-bash">
http://<span style="color: #ff0000;">&lt;IP-Adresse von SmartHomeNG&gt;</span>:8888/logic|GeoZoneExit|${deviceId},${zone},${latitude},${longitude},${accuracy}
</code></pre>
<p><code>parts[0]</code> ist die eindeutige Geräte-UUID, <code>parts[1]</code> der String der später in EgiGeoZone definierten Zone, <code>parts[2]</code> die Latitude, <code>parts[3]</code> die Longitude der jeweiligen GPS Koordinate der Zone, in der man sich befindet. Mit <code>parts[4]</code> wird noch die aktuelle Genauigkeit der Messung übertragen, die bisher in den Logiken nicht verwendet wird.</p>
<p>Die Werte werden nach dem Auslesen in das Array <code>parts</code> über die Logik in das jeweilige Item geschrieben.</p>
<h1>Die erste Zone</h1>
<p>Befindet man sich nun z.B. zu Hause, kann die erste Zone schnell definiert werden.</p>
<p>Auf der Hauptseite der EgiGeoZone App ist die Liste der &#8222;GeoZonen&#8220; zu sehen. Diese ist initial leer. Über das &#8222;+&#8220; Icon rechts unten fügt man eine neue Zone hinzu.</p>
<p>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.</p>
<p>Als Serverprofil ist nun das zuvor anlegte &#8222;SmartHomeNG&#8220; Profil zu wählen.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-145621.png" alt="" class="alignnone wp-image-817" width="233" height="414" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-145621.png 1440w, https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-145621-169x300.png 169w, https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-145621-768x1365.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/Screenshot_20180329-145621-576x1024.png 576w" sizes="(max-width: 233px) 100vw, 233px" /></p>
<p>Beim ersten Erkennen eines Aufenthalts in der Zone, wird nun sofort die GeoZoneEntry Logik aufgerufen. Die entsprechenden Items sollten nun aktualisiert werden.</p>
<p>Nach und nach kann man weitere Zonen festlegen und die Logik(en) entsprechend modifizieren.</p>
<h1>Nutzung mit mehreren Geräten</h1>
<p>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 &#8211; und dort im Menüpunkt &#8222;Technische Info&#8220; &#8211; die eindeutige Geräte-UUID einsehen (Achtung: diese ist unterhalb der Android-UUID zu finden und nicht mit dieser zu verwechseln).</p>
<p>In der Logik kann man gezielt auf diese UUID über <code>parts[0]</code> 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.</p>
<p>So können bspw. mehrere Familienmitglieder auf einer Google Maps Karte visualisiert werden. Dazu folgt demnächst ein weiterer Artikel.</p>
<p>&nbsp;</p>
<p><em>(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.)</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/geozonen-basierte-services-mit-der-egigeozone-app-und-dem-network-plugin/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
