16
Geofencing mit Homematic IP Ich beschreibe in diesem Artikel wie ein einfaches Geofencing aufgebaut werden kann. Mit dem hier gezeigten Beispiel lassen sich bis zu 8 Handys überwachen und so eine Beliebige Automatisierung über Homematic IP auslösen. Benötigte Bauteile: WeMos D1 mini https://www.ebay.de/itm/WeMos-D1-MINI-ESP8266-ESP12-NodeMcu-Dev-Kit-WiFi-Modul- Board-Arduino/252745698566? ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649 8 Relais Modul oder 4 Relais Modul https://www.amazon.de/gp/product/B00AEIDWXK/ref=oh_aui_detailpage_o04_s00? ie=UTF8&psc=1 Homematic IP Tür/Fensterkontakt SWDO https://www.amazon.de/Homematic-IP-140733A0-Fenster-Türkontakt/dp/B0107XXOAW/ ref=sr_1_1?ie=UTF8&qid=1518956179&sr=8-1&keywords=homematic+ip+fensterkontakt 2 USB Kabel https://www.amazon.de/Micro-Kabel-Nylon-2-Pack-Schnellladekabel-Space-Grau-1M-2Pack/dp/ B01GJC4WRO/ref=sr_1_1?s=ce- de&ie=UTF8&qid=1518956709&sr=1-1&keywords=usb+kabel+micro+usb USB Netztapter https://www.amazon.de/Wicked-Chili-Pro-Netzteil-Smartphone-schwarz/dp/B004GXUKD4/ ref=sr_1_3?s=ce-de&ie=UTF8&qid=1518956774&sr=1-3&keywords=usb+netzadapter iOS App Lovative https://itunes.apple.com/de/app/locative/id725198453?mt=8 Android App EgiGeoZone https://play.google.com/store/apps/details?id=de.egi.geofence.geozone Webservice Thingspeak https://thingspeak.com

Geofencing mit HMIP - karge.org · zusammengebaut ohne HMIP SWDO so aus. In diesem Beispiel habe ich allerdings nur 4 Relais angeschlossen und auch die empfohlenen Widerstände noch

  • Upload
    vumien

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

Geofencing mit Homematic IP Ich beschreibe in diesem Artikel wie ein einfaches Geofencing aufgebaut werden kann. Mit dem hier gezeigten Beispiel lassen sich bis zu 8 Handys überwachen und so eine Beliebige Automatisierung über Homematic IP auslösen.

Benötigte Bauteile:

WeMos D1 mini https://www.ebay.de/itm/WeMos-D1-MINI-ESP8266-ESP12-NodeMcu-Dev-Kit-WiFi-Modul-Board-Arduino/252745698566?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649

8 Relais Modul oder 4 Relais Modul https://www.amazon.de/gp/product/B00AEIDWXK/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1

Homematic IP Tür/Fensterkontakt SWDO https://www.amazon.de/Homematic-IP-140733A0-Fenster-Türkontakt/dp/B0107XXOAW/ref=sr_1_1?ie=UTF8&qid=1518956179&sr=8-1&keywords=homematic+ip+fensterkontakt

2 USB Kabel https://www.amazon.de/Micro-Kabel-Nylon-2-Pack-Schnellladekabel-Space-Grau-1M-2Pack/dp/B01GJC4WRO/ref=sr_1_1?s=ce-de&ie=UTF8&qid=1518956709&sr=1-1&keywords=usb+kabel+micro+usb

USB Netztapter https://www.amazon.de/Wicked-Chili-Pro-Netzteil-Smartphone-schwarz/dp/B004GXUKD4/ref=sr_1_3?s=ce-de&ie=UTF8&qid=1518956774&sr=1-3&keywords=usb+netzadapter

iOS App Lovativehttps://itunes.apple.com/de/app/locative/id725198453?mt=8

Android App EgiGeoZone https://play.google.com/store/apps/details?id=de.egi.geofence.geozone

Webservice Thingspeak https://thingspeak.com

Konzept des Geofencings Mit Geofencing (Kunstwort aus geographic [engl. geographisch] und fence [engl. Zaun]) wird das automatisierte Auslösen einer Aktion durch das Überschreiten einer gedachten Begrenzung auf der Erdoberfläche oder in der Luft[1] bezeichnet. In den meisten Fällen definiert die Begrenzung

eine geschlossene Fläche, so dass zwischen innen und außen unterschieden werden kann. Beispielsweise kann beim Eintritt in die Fläche oder beim Verlassen der Fläche eine Benachrichtigung ausgelöst werden. Das beobachtete Objekt muss dazu in regelmäßigen Abständen seine Position senden oder die Abfrage seiner Position von außen ermöglichen. Diese Ortsbestimmung kann über das Mobilfunksystem auf Funkzellenebene oder koordinatenbezogen über ein Navigationssatellitensystem erfolgen.(Quelle Wikipedia: https://de.wikipedia.org/wiki/Geofencing)

Dieses Konzept machen wir uns zu nutzen indem wir auf dem Handy die oben genannte App installieren und zu unserer Adresse einen festen Radius von ca. 100 Metern festlegen.

Wenn wir jetzt jedes mal, wenn das Handy den Bereich verlässt und wieder betritt ein Signal senden. Wie z.B. eine 0 wenn das Handy den Bereich betritt und eine 1 wenn das Handy den Bereich verlässt.

Für das Empfangen des Signals gibt es drei verschiedene Lösungsansätze, die ich hier erklären werde.

1. Wir erstellen einen Chanel bei Thinkspeak und senden an diesen das Signal und fragen das mit dem WeMos ab.

2. Wir erstellen eine DDNS Adresse und senden das Signal direkt an den WeMos.3. Wir erstellen mit dem Handy eine VPN-Verbindung mit dem Heimnetz und senden das Signal

direkt an den WeMos.

Einen Thinkspeak Chanel erstellen Zunächst muss man sich auf der Seite www.thinkspeak.com registrieren. Dies gescheit über den Button „Sign Up“ oben rechts. Wenn man die Registrierung abgeschlossen hat und auf der Seite angemeldet ist. Kann über den Button „New Chanel“ ein neuer Chanel erstellt werden.

Anschließend muss für diesen Chanel ein Name vergaben werden und für jedes Handy das überwacht werden soll ein „Field“ erstellt werden.

Nachdem wir unten auf „Save“ geklickt haben, ist unser Chanel bereit Daten zu empfangen.Die Adresse an der wir unser Signal schicken müssen und auch alle Informationen, die wir später für die Arduino Programmierung benötigen, findet Ihr im Reiter „API Keys“.

Die Adressen, die Ihr für die App Locative (iOS) oder EgiGeoZone (Android) benötigt sehen so aus. Hier das Beispiel für das erste Handy. Bei jedem weiteren Handy muss in dem Link das „field“ Angepasst werden in field2, field3 u.s.w..

Ankunft:https://api.thingspeak.com/update?api_key="Euer Write API Key“&field1=0

Verlassen:https://api.thingspeak.com/update?api_key="Euer Write API Key“&field1=1

Nun kann im Reiter „Private View“ der Status aller Handys eingesehen werden.

Hier möchte ich auf eine Limitierung des kostenlosen Accounts hinweisen. Dieser nimmt nur alle 15 Sekunden ein neues Signal entgegen. Dies kann Probleme geben, wenn zwei Handys gleichzeitig ein Signal schicken. Der Standard Account lässt eine Aktualisierung jede Sekunde zu.

Wie das ganze nun mit einem Arduino Programm abgefragt wird beschreibe ich später.

DDNS Adresse erstellen Was ist DDNS Dynamisches DNS oder DDNS ist eine Technik, um Domains im Domain Name System (DNS) dynamisch zu aktualisieren. Der Zweck ist, dass ein Computer (bspw. ein PC oder ein Router) nach dem Wechsel seiner IP-Adresse automatisch und schnell den dazugehörigen Domaineintrag ändert. So ist der Rechner immer unter demselben Domainnamen erreichbar, auch wenn die aktuelle IP-Adresse für den Nutzer unbekannt ist.(Quelle Wikipedia: https://de.wikipedia.org/wiki/Dynamisches_DNS)

Kurz um unser Signal direkt an unseren WeMos senden zu können müssen wir Ihn erreichen. Weil sich unsere öffentliche IP-Adresse, welche wir vom Internetanbieter bekommen in der Regel alle 24 Stunden ändert. Brauchen wir einen Webadresse der wir diese Änderung mitteilen können.

DDNS erstellen Es gibt eine Vielzahl von Anbietern von DDNS Service. Der bekannteste ist wahrscheinlich DynDNS.org dieser verlangt allerdings auch einen recht hohen Preis, da der Service sehr umfangreich ist und die Möglichkeit bietet bis zu 30 Adressen zu verwalten.

Go IP: Ebenfalls aus deutschen Landen stammt Go IP . Der Dienst ist komplett kostenlos und erlaubt pro Person die Registrierung von einer Domain und bis zu 15 Subdomains. Die Website zeichnet sich durch umfangreiche Hilfestellungen beim Einrichten des Routers aus, was aufgrund der komplexen Update-URL auch sinnvoll erscheint.

DYNDNS.NET: Wer auf einen deutschsprachigen Dienst setzt, ist mit DYNDNS.NET gut bedient. Unterstützt der Router den Dienst nicht, steht ein kostenpflichtiger Java-Client für 19,95 Euro zur Verfügung. Dies ist z.B. eine gute Alternative für Kunden von Unitymedia deren Router kein DDNS unterstützen.

DNS dynamic: Der englischsprachige Dienst DNS dynamic bietet eine beeindruckende Auswahl von Domains an, darunter etliche .com-Domänen. Außerdem können Sie bei diesem Dienst eine unbegrenzte Zahl von Hostnamen registrieren. Zum Aktualisieren der IP-Adresse stellt DNS dynamic zwei kostenlose Windows-Tools zur Verfügung, eines für die Kommandozeile und eines mit grafischer Oberfläche. Hinzu kommen ein Webclient, eine webbasierte Management-Oberfläche sowie eine einfache Schnittstelle, über die Sie die Aktualisierung per Skript vornehmen können.

(Quelle PCWelt.de: https://www.pcwelt.de/ratgeber/DynDNS-Alternativen-kostenlos-5680355.html )

Verbindung zum DDNS Services aufbauen Wenn eine DDNS Adresse besteht müssen wir Ihr jetzt unsere IP mitteilen. Viele Router unterstützen diese Service und haben auf Ihrer Konfigurationsseite einen Bereich, in dem man nur seine Verbindungsdaten eingeben muss.

Bei der Fritzbox geht das wie hier zu sehen:

Wenn man z.B. ein Synology NAS besitzt kann man auch dies für den DDNS Services verwenden. Die kann auch eine Alternative für alle deren Router kein DDNS unterstützt.

Nachdem man seinen Router erfolgreich mit dem DDNS Service verbunden hat muss noch der Router den Port 80 auf den WeMos weiterleiten. Das wird in der Portweiterleitung oder Port forwarding eingestellt.

Was ist Protweiterleitung In unserem Beispiel wird ein Signal über unsere DDNS Adresse www.deineDomain.de/D1/1 an unseren Router gesendet. In der Regel landen diese Standardmäßig am Port 80 des Routers. Der Router kann mit dieser Information allerdings nichts anfangen. Aus diesem Grund müssen wir Ihm sagen, das er dies an den Port 80 von unserem WeMos weiterleiten soll. Da wir unseren WeMos noch nicht mit einem Programm versehen haben, hat dieser noch keine IP-Adresse. Aus diesem Grund komme ich später auf diesen Punkt zurück.

Allerdings wissen wir schon das unsere Adressen für die Handy App wie folgt aussieht.

Ankunft:http://www.DeineDomain.de/D1/0

Verlassen:http://www.DeineDomain.de/D1/1

Sicherheitshinweis Praktisch kann so jeder, der unsere Adresse kennt und diese Anleitung gelesen hat, diesen aufrufen und unsere Zustände manipulieren. Dies ist eine deutlicher Nachteil gegenüber der anderen beiden Verbindungsmethoden. Um wenigstens etwas Sicherheit zu erlangen empfehle ich einen unbekannten Port zu verwenden. Standardmäßig trägt man in der Portweiterleitung folgendes ein.

TCP-Umleitung

Mann kann aber auch sowas eintragen:

TCP-Umleitung

Hierdurch verändert sich die Adresse wie folgt:

http://www.deinedomain.de:6666/D1/0

So gewinnst Du etwas mehr Sicherheit.

von 80 zu 80 IP-WeMos

von 6666 zu 80 IP-WeMos

VPN-Verbindung zum Heimnetz

Was ist VPN VPN steht für Virtual Private Network. Wer sich genauer informieren möchte kann das hier tun.https://de.wikipedia.org/wiki/Virtual_Private_Network

Im Grunde stellen wir mit unserem Handy eine direkte verschlüsselte Verbindung zu unserem Heimnetz her. Dies ermöglicht es uns den WeMos über die interne IP-Adresse anzurufen.

Ich habe das mit einem VPN-Server auf meiner Synology realisiert. Wie das geht hat der Youtuber iDomix in seinem Chanel sehr gut erklärt. Aus diesem Grund möchte ich hier nicht mehr darauf eingehen.

https://www.youtube.com/watch?v=OYXv9tNeE10&t=123s

Aufbau der Schaltung: Hier habe ich zwei 4 Relais Module zusammen gesetzt, weil ich für das verwendete Programm Fritzen kein 8 Relais Modul zur Verfügung hatte.

Auf der HMIP Tür/Fensterkontakt ist hier nur symbolisch dargestellt.

Der Zusammenbau sollte nach diesem Schaubild bei Problem darstellen. Bei mir sieht das zusammengebaut ohne HMIP SWDO so aus.

In diesem Beispiel habe ich allerdings nur 4 Relais angeschlossen und auch die empfohlenen Widerstände noch nicht eingebaut.

In der Facebook Gruppe „Homematic IP Tips und Tricks“ gibt es den Hinweis nicht den Ausgang D4 zu verwenden. Hier soll es Probleme beim Reset geben. Dieses Problem konnte ich nicht nachvollziehen. Weiter ist der Pin D4 auch mit der blauen Diode am WeMos verbunden. Das bedeutet bei Zustand 0 leuchtet auch die blaue Diode.

Um eine Spätere Stromversorgung wie im Bild sicher zu stellen, hier die Belegung eines Standard USB 1.0 und 2.0 Kabels.

Tür- Fensterkontakt Umbauen Hierzu einfach zwei Kabel an den Kontakten MP9 und MP7 parallel zur IR Lichtdiode löten. Anschließend den Lichtsensor nicht abkleben.

Installation von Arduino

Wie man Arduino installiert wurde schon hinreichend auf YouTube erklärt. Aus diesem Grund möchte ich hier nur ein der vielen Videos verlinken. Ich habe eins ausgesucht das die Installation in Vereindung mit dem WeMos D1 mini beschreibt.

https://www.youtube.com/watch?v=lrVvmljloec

Erstellen eines Sketch Zunächst ist wichtig, das man auch die USB-Treiber für Arduino installiert hat diese befinden sich hier:

Für Windows:

Schließen Sie Ihr Arduino-Board mit einem USB-Kabels an Ihren Computer an. Windows startet eine Treiber-Installation, die aber meistens fehlschlägt. Ist das der Fall, gehen Sie folgendermaßen vor: 1. Klicken Sie auf den Start-Button und suchen Sie nach dem „Geräte-Manager".2. Damit Sie Ihr Arduino-Board finden, drücken Sie auf des kleine Dreieck vor dem Punkt

"Anschlüsse (COM & LPT)“.3. Klicken Sie mit der rechten Maustaste auf Ihren Arduino und wählen Sie die Option

"Treibersoftware aktualisieren“.4. Drücken Sie auf "Auf dem Computer nach Treibersoftware suchen" und navigieren Sie zum

Pfad: "C/Programme/Arduino/drivers". Bestätigen Sie die Treiber-Installation und folgen Sie den weiteren Schritten. Der Treiber ist nun erfolgreich installiert.

Für macOS

Einfach das Packet von der Seite des Herstellers runterladen und installieren.

http://www.wch.cn/download/CH341SER_MAC_ZIP.html

Anschließend die Einstellungen für das Board im Arduino unter Werkzeuge vornehmen.

Unter Werkzeuge->Port den vom System vergebenen Port wählen. Unter Windows ist das z.B. COM6.

Hier ein Bild aus macOS.

Nun können wir die ersten Sketche erstellen:

Die Programme können über den „Serieller Monitor“ überwacht werden.

Hier kann man auch die IP-Adresse des WeMos sehen, die Vergeben wurde.

Zu dieser IP muss im Router die Portweiterleitung, wie oben beschrieben erfolgen.

Thinkspeak Variante:

#include "ThingSpeak.h"#include <ESP8266WiFi.h>

char ssid[] = "DeinNetzwerk"; // deine Netzwerk SSID (name) char pass[] = "DeinPasswort"; // ydein Netzwerkpasswort

int8_t latestValue[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int8_t leds[8] = {D1, D2, D3, D4, D5, D6, D7, D8};

int status = WL_IDLE_STATUS;WiFiClient client;

unsigned long myChannelNumber = 123456; // Thinkspeak Channel IDconst char* myReadAPIKey = "W80F3DXQ7OY7VRA2"; // Thinkspeak ReadApiKey

void setup() { Serial.begin(115200); // for debugging reasons Serial.println(); Serial.print(„Verbinden mit "); Serial.println(ssid); WiFi.begin(ssid, pass);

// Warten auf Verbindung while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }

Serial.println("");Serial.println("WiFi connected");Serial.println(WiFi.localIP());Serial.println();

ThingSpeak.begin(client);for(int i = 0; i < 9; i++){pinMode(leds[i], OUTPUT);digitalWrite(leds[i], LOW);}Serial.println("Starten der Statusabfrage");}

void loop() {getLatestValues();delay(100);}

void getLatestValues(){for(int i = 0; i < 8; i++) // bei 4 Relais kann hier von 8 auf 4 umgestellt werden{latestValue[i] = ThingSpeak.readIntField(myChannelNumber, i+1, myReadAPIKey);digitalWrite(leds[i], latestValue[i]);

Serial.print("Handy " + String(i+1) + " = "); // debugging instrumentif (latestValue[i] == 0){// Serial.println(latestValue[i]); // debugging instrumentSerial.println("ist zuhause");}else{Serial.println("nicht zuhause");}}

Variante für DDNS oder VPN In diesem Beispiel wird auf dem WeMos ein Server mit einer Überwachung auf Port 80 erstellt. Andrey Hübner hat dieses Sketch so erstellt, das man mit http://www.deineDomain.de/test vom WeMos die UpTime Zeit zurück bekommt.

#include <ESP8266WiFi.h>

// Wifi Verbindungsdatenconst char* ssid = „deinWLAN"; // deine Netzwerk SSID (name)const char* password = „123456"; // dein Netzwerk Passwort

// Erstellen Sie einen Server und einen Überwachungsport 80

WiFiServer server(80);

void setup() { Serial.begin(115200); delay(10);

// GPIO vorbereiten: Hier wird die Startbedingung Festgelegt. pinMode(D1, OUTPUT); digitalWrite(D1, 0); pinMode(D2, OUTPUT); digitalWrite(D2, 0); pinMode(D3, OUTPUT); digitalWrite(D3, 0); pinMode(D4, OUTPUT); digitalWrite(D4, 0); pinMode(D5, OUTPUT); digitalWrite(D5, 0); pinMode(D6, OUTPUT); digitalWrite(D6, 0); pinMode(D7, OUTPUT); digitalWrite(D7, 0); pinMode(D8, OUTPUT); digitalWrite(D8, 0); // Verbindung mit einem WiFi-Netzwerk Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid);

WiFi.begin(ssid, password);

// Warten auf Verbindung while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected");

// Starten des Servers server.begin(); Serial.println("Server started");

// Gib die empfangene IP-Adresse aus Serial.println(WiFi.localIP()); }

void loop() {

// Überprüfen Sie die Verbindung WiFiClient client = server.available(); if (!client) { return; }

// Warten auf Daten Serial.println("new client"); while (!client.available()) { delay(1); }

// Lesen der ersten Abfragezeichenfolge String req = client.readStringUntil('\r'); Serial.println(req); client.flush();

// Mit GPIO arbeiten if (req.indexOf("/D1/0") != -1) digitalWrite(D1, 0); else if (req.indexOf("/D1/1") != -1) digitalWrite(D1, 1); else if (req.indexOf("/D2/0") != -1) digitalWrite(D2, 0); else if (req.indexOf("/D2/1") != -1) digitalWrite(D2, 1); else if (req.indexOf("/D3/0") != -1) digitalWrite(D3, 0); else if (req.indexOf("/D3/1") != -1) digitalWrite(D3, 1); else if (req.indexOf("/D4/0") != -1) digitalWrite(D4, 0); else if (req.indexOf("/D4/1") != -1) digitalWrite(D4, 1); else if (req.indexOf("/D5/0") != -1) digitalWrite(D5, 0); else if (req.indexOf("/D5/1") != -1) digitalWrite(D5, 1); else if (req.indexOf("/D6/0") != -1)

digitalWrite(D6, 0); else if (req.indexOf("/D6/1") != -1) digitalWrite(D6, 1); else if (req.indexOf("/D7/0") != -1) digitalWrite(D7, 0); else if (req.indexOf("/D7/1") != -1) digitalWrite(D7, 1); else if (req.indexOf("/D8/0") != -1) digitalWrite(D8, 0); else if (req.indexOf("/D8/1") != -1) digitalWrite(D8, 1);

else if (req.indexOf("/test") != -1) { Serial.println("TEST OK"); String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nUptime: ";

// UpTime-Sponsoring int Sec = (millis() / 1000UL) % 60; int Min = ((millis() / 1000UL) / 60UL) % 60; int Hours = ((millis() / 1000UL) / 3600UL) % 24; int Day = ((millis() / 1000UL) / 3600UL / 24UL); s += Day; s += "d "; s += Hours; s += ":"; s += Min; s += ":"; s += Sec; s += "</html>\n"; client.print(s); client.stop(); return; } else

// Wenn eine ungültige Abfrage kommt wird ein Fehler geschrieben { Serial.println("invalid request"); String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nInvalid request"; s += "</html>\n"; client.print(s); client.stop(); return; }

client.flush();

// Die Antwort bilden String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO set OK"; s += "</html>\n";

// Send the response to the client client.print(s); delay(1);

Serial.println("Client disonnected");

}

Anhang:

Locative Einstellungen ohne Thinkspeak:

Locative Einstellungen mit Thinkspeak:

Schlusswort Zum Schluss möchte ich mich noch bei Andrey Hübner und der Facebook Gruppe „Homematic IP Tips und Tricks“ bedanken. Ohne die diese Anleitung so nicht Möglich gewesen währe.

Andrey Hübner hatte die Ursprüngliche Idee und hat mir bei den Sketch und der Einrichtung des Arduino sehr geholfen. Aus diesem Grund verlinke ich hier nochmal die Gruppe und die das YouTube Video, das Andrey verfasst hat.

https://www.facebook.com/groups/HomematicIP/

https://www.youtube.com/watch?v=a_hzuwXsRYM

Danke für die Hilfe und die vielen Anregungen in der Gruppe. Ich freue mich schon auf das nächste Projekt.

Viel Spaß Euer

Tobias Karge