[{"id":"ca93781b.356c88","type":"tcp in","server":"server","host":"localhost","port":"7999","datamode":"stream","datatype":"utf8","newline":"","topic":"","name":"Geofency an tcp:7999","base64":false,"x":169.16668701171875,"y":1405.1666259765625,"z":"8cf2adae.730d5","wires":[["8bfc4a85.7403b8","785d2604.87a2d8","e9948341.166b8"]]},{"id":"4b98ebba.b46714","type":"json","name":"wandelt den string in ein objekt (json)","x":406.16676330566406,"y":1628.4998254776,"z":"8cf2adae.730d5","wires":[["ab7fa022.54806"]]},{"id":"8bfc4a85.7403b8","type":"switch","name":"","property":"payload","rules":[{"t":"cont","v":"{"},{"t":"else"}],"checkall":"false","outputs":2,"x":129.500068664551,"y":1624.8333358764648,"z":"8cf2adae.730d5","wires":[["931915b.f6ce6e8"],["49d5d98d.b62a28"]]},{"id":"4cb8fd1c.b34704","type":"comment","name":"1: Meldung enthält { ","info":"Meldung enthält eine geschweifte Klammer auf und damit den JSON Anteil","x":166.16675567626953,"y":1593.1666622161865,"z":"8cf2adae.730d5","wires":[]},{"id":"71cd9b74.8e3264","type":"comment","name":"2: Restliche Meldungen (ohne JSON Anteil)","info":"","x":234.5000457763672,"y":1661.499882698059,"z":"8cf2adae.730d5","wires":[]},{"id":"931915b.f6ce6e8","type":"function","name":"{JSON} rausschneiden","func":"quelle = msg.payload;\npos_klammer_auf = quelle.indexOf('{');\npos_klammer_zu = quelle.lastIndexOf('}');\nergebnis = quelle.substring(pos_klammer_auf, pos_klammer_zu+1);\nmsg.payload = ergebnis;\n\n\nmsg.loggen = context.global.gfMeldungenLoggen; // ist das Dateilogging eingechaltet (unter Konfiguration)\n\nmsg.freigabe = context.global.freigabe;\n\nreturn msg;","outputs":1,"x":364.50003814697266,"y":1594.8332481384277,"z":"8cf2adae.730d5","wires":[["4b98ebba.b46714","2f3071d.fd0cf8e"]]},{"id":"785d2604.87a2d8","type":"debug","name":"tcp:7999 Stream","active":false,"console":"false","complete":"payload","x":426.833251953125,"y":1371.5001220703125,"z":"8cf2adae.730d5","wires":[]},{"id":"49d5d98d.b62a28","type":"debug","name":"alle Meldungen ohne JSON Anteil","active":false,"console":"false","complete":"payload","x":212.83334350585938,"y":1726.4998455047607,"z":"8cf2adae.730d5","wires":[]},{"id":"5740473e.a8bfb8","type":"comment","name":"##### Eigene Daten angeben & Konfiguration #####","info":"","x":330.1667022705078,"y":64.33363437652588,"z":"8cf2adae.730d5","wires":[]},{"id":"b1f32ffa.4e0cd","type":"inject","name":"Eigene Daten initialisieren (automatisch beim deploy)","topic":"init","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":334.16680908203125,"y":782.3334350585938,"z":"8cf2adae.730d5","wires":[["51c5e73f.ae3a18","aecca3bc.51336","3d389bca.c2c764","120889e1.edf776"]]},{"id":"fe9dac90.01625","type":"debug","name":"","active":true,"console":"false","complete":"false","x":673.1668701171875,"y":789.666748046875,"z":"8cf2adae.730d5","wires":[]},{"id":"c10ce9b1.3ef318","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenEmpfangen.txt","appendNewline":true,"overwriteFile":"false","x":2800.833450317383,"y":592.1666779518127,"z":"8cf2adae.730d5","wires":[]},{"id":"51c5e73f.ae3a18","type":"function","name":"Eigene Koordinaten & Adresse, Device, Namen","func":"// eigene Kordinaten Wohnung (Beispiel München)\ncontext.global.gfWohnungLat = 48.160174;\ncontext.global.gfWohnungLon = 11.585733;\ncontext.global.gfAdresseWohnung = \"Leopoldstrasse+47,+80802+Muenchen\";\n\n\n// Daten der Device/Anwender, auf denen Geofence läuft\n// wenn Device unbekannt, wird das Device ausgegeben und der Flow gestoppt, \n// um nicht unnötig Variablen anzulegen\n\n\n// Device01\ncontext.global.gfDevice01id = \"4711BG93-4844-2B8F-3E1C-9E83D73F8F32\";\ncontext.global.gfDevice01name = \"Micha\";\n// Device02\ncontext.global.gfDevice02id = \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\";\ncontext.global.gfDevice02name = \"Name Person B\";\n// Device02\ncontext.global.gfDevice03id = \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\";\ncontext.global.gfDevice03name = \"Name Person C\";\n\n\n\nmsg.payload = \"Geofence - eigene Daten gespeichert\";\n\nreturn msg;","outputs":1,"x":330.1666564941406,"y":109.33334350585938,"z":"8cf2adae.730d5","wires":[["fe9dac90.01625"]]},{"id":"242810d2.dbd7f","type":"comment","name":"#### todo #### (siehe Kommentarbody)","info":"\ntodos\n=====\n\n\nFehler:\n-------\n# \"Fehler:\" TCP Stream -> Antwort, um den Tiemout zu verhindern\n# \"Warn:\" Metode NewMsg an http request (Google API) überarbeiten wg. Warnmeldung: http://bit.ly/nr-override-msg-props\n\n\nProgrammdesign Änderungen/Optimierungen:\n-----------------------------------------\n\n\n\nNeue Leistungen (Planung):\n--------------------------\n# Google Map URL für die Routenplanung\n# Fehlerkorrektur, wenn eigene Daten falsch oder unlogisch sind\n# Zeit in Sekunden gps/iBeacon -> wie lange seit letzter Aktualisierung\n# Nutzerfreundlichkeit: Geofency Datenformat automatisch erkennen (JSON oder nicht) und entsprechend verarbeiten\n# node.red.0.geofency. Variablenbäume über Node-red erkennen und löschbar machen.\n# können angelegte Varablenbäume (name im Baum) nachträglich geändert werden? Um z.B. einer Devicekennung nachträglcih einen Namen zuzuordnen.\n\n\n\nerledigt:\n---------\n# iBeacon: beaconUUID, major, minor als Variable schreiben, wenn iBeacon\n# Unterscheidung, ob Meldung per GPS Waypoint kommt oder per iBeacon\n# solange TCP Stream: Auswählbar, ob ältere Meldungen verarbeitet werden sollen\n (z.B. Zeitunteschied > 10 Sekunden\n oder Neue Meldung älter, als die zuletzt gespeicherte Meldung)\n Zähler, wie viele Meldungen verworfen wurden, seit dem letzten Neustart des Flow\n --> Datum letzte Meldung wird mit der aktuellen Meldung verglichen\n# Lösung für Unterscheidung mehrere Anwender in den Daten\n","x":1066.000259399414,"y":109.83349418640137,"z":"8cf2adae.730d5","wires":[]},{"id":"be1684fd.41e978","type":"comment","name":"**** Änderungsübersicht (Versionen) **** (siehe Kommentarbody)","info":"0.2.1\t09.05.2015\t# Zoomstufe für Openstreetmaps konfigurierbar\n\t\t\t\t\t# tlw. Abfangen und Korrektur von unügltigen Werten in der Konfiguration\n\t\t\t\t\t# Konfiguration nach Init unter geofency.conf.xxxxx speichern.\n\t\t\t\t\t Kann dort wärend der Laufzeit verändert werden, (z.B. Kartenzoomstufe über VIS).\n\t\t\t\t\t beim erneuten Deploy wird auf die Werte aus der Node-Red Konfiguration zurückgesetzt.\n\t\t\t\t\t# Benutzerfreundlicher: unbekannte Device\n\t\t\t\t\t Im DEFAULT werden unbekannte Devices nicht als Variable angelegt.\n\t\t\t\t\t Es wird nur das Device ausgegeben. Die Device Kennung kann man dann in der Konfig zuordnen.\n\t\t\t\t\t Wenn gewünscht (Konfig), werden auch unbekannte Devices angelegt.\n\t\t\t\t\t# Konfig: Möglichkeit unbekannte Devices mit Ihrer ID in den Variablen anzulegen\n\t\t\t\t\t \n0.2.0\t08.05.2015\t# Variablen neu vergeben (Baumstruktur)\n\t\t\t\t\t# eigene Variablen für bis zu drei Nutzer + Unbekannt\n\n0.1.2\t06.05.2015\t# Unterscheidung Meldung über GPS Standort oder iBeacon eingebaut\n\t\t\t\t\t# iBeacon Variablen eingebaut\n\n0.1.1 05.05.2015\t# msg.payload.routes[0].legs[0].end_address (Goolge Maps API Zieladresse) hinzugefügt\n\t\t\t\t\t# Zeitstempel angepasst. Nicht mehr die Zeit zum Zeitpunkt des Funktionsaufruf, \n\t\t\t\t\t sondern nun wird die Zeit aus der JSON Meldung ausgegeben.\n\t\t\t\t\t# zwei neue Zeiten: Zeitpunkt aus der JSON Meldung als Epoche, aktuelle Zeit als Epoche\n\t\t\t\t\t# Topic den einzelnen Funktionen -> Variablen zugeorndet (bessere Lesbarkeit der Debugmeldung)\n\t\t\t\t\t# Dokumentation im Flow ergänzt\n\t\t\t\t\t# alle globalen Variablen beginnen nun mit gf (context.global.gf....)\n\t\t\t\t\t# Konfigurierbar: nur neuere Meldungen verarbeiten oder auch ältere Meldungen\n\t\t\t\t\t# Anzeige der aktuellen Kofiguration per Knopfdruck im Debug-Fenster\n\t\t\t\t\t\n0.1.0\t04.05.2015\t# Erste version im Forum\n","x":1142.33349609375,"y":66.83338165283203,"z":"8cf2adae.730d5","wires":[]},{"id":"bbeaeadc.441518","type":"function","name":"Prüft die Zeit der Meldung, mit der letzten gespeicherten Meldung","func":"// ggf. gehen Meldungen verloren, wenn Geofency Meldungen mangels Datenbverbindung\n// nicht absetzen kann und dies später nachholt (prüfen) und die Meldungen nicht\n// in der richtigen zeitlichen Reihenfolge absetzt\n// dann ist die Lösung: weg von tcp Stream\n\nvar tst = Date.parse(msg.payload.date)/1000; // Zeit aus der Geofency Meldung\nvar meldungOK = false;\n\n\nif (typeof(msg.payload.beaconUUID)==\"undefined\") {\n\tmsg.art = \"gps\";\n\tif (context.global.gfEpocheLetzteMeldung < tst) {\n\t\tcontext.global.gfEpocheLetzteMeldung = tst; // Datum der letzten Meldung, mit dem Datum dieser Meldung ersetzen\n\t\tmeldungOK = true;\n\t\t} else {\n\t\tmeldungOK = false;\t\n\t\t}\n\t} else {\n\tmsg.art = \"ibeacon\";\n\tif (context.global.gfEpocheLetzteMeldungIbeacon < tst) {\n\t\tcontext.global.gfEpocheLetzteMeldungIbeacon = tst; // Datum der letzten Meldung, mit dem Datum dieser Meldung ersetzen\n\t\tmeldungOK = true;\n\t\t} else {\n\t\tmeldungOK = false;\t\n\t\t}\n\t}\n\n\n// wenn nur neuere Meldungen verarbeitet werden sollen (Konfig) und die letzte Meldung von der Zeit OK war, dann verarbeiten.\nvar verarbeiten = ((context.global.gfNurNeuereMeldung && meldungOK) || !(context.global.gfNurNeuereMeldung));\n\t\nmsg.ok = meldungOK;\nmsg.verarbeiten = verarbeiten;\n//msg.topic = \"Ist die Meldung OK (aktueller als die Letzte)?\";\n\nreturn msg;\n","outputs":1,"x":1534.5000915527344,"y":1622.1665620803833,"z":"8cf2adae.730d5","wires":[["f47f3ffd.0b80c","2d0aa73.fd2f558"]]},{"id":"3d389bca.c2c764","type":"function","name":"Konfiguration (Verhalten des Flows)","func":"\n// Konfiguration (Verhaltendes Flows)\n// ========================================================================================================\n\ncontext.global.gfNurNeuereMeldung = true; \t\t\t// (true/false, Default: true) Nur neuere Meldungen, als die letzte Meldung akzeptieren\n\t\t\t\t\t\t\t\t\t\t\t\t\t// solange der Flow mit einem tcp:stream arbeitet, sollte hier true stehen \n\t\t\t\t\t\t\t\t\t\t\t\t\t\ncontext.global.gfMeldungenLoggen = true; \t\t\t// (true/false, Default: true) Einträge unter /opt/ioBroker mitloggen\n\ncontext.global.gfOpenstreetmapZoom = 16; \t\t\t// (1-19, Default: 16) Zoomstufe der Openstreetmap Karte\n\ncontext.global.gfUnbekannteDeviceAnlegen = false; \t// (true/false, Default: false) false -> für unbekannte Device \n\t\t\t\t\t\t\t\t\t\t\t\t\t// wird keine Variable angelegt. Das Device wird ausgegeben, \n\t\t\t\t\t\t\t\t\t\t\t\t\t// um die Konfiguration anzupassen\n\ncontext.global.gfUnbekannteDeviceMitKennunganlegen = true; // (true/false, Default = true)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// greift nur, wenn unbekannte Device angelegt werden sollen\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// d.h.: context.global.gfUnbekannteDeviceAnlegen = true;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// true -> unbekannte Devices werden mit Ihrer Kennung angelegt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// false -> alle unbekannten Devices werden unter einer\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\t\t\tgemeinsamen Kennung (unbekannt) angelegt.\n\n\n\nreturn msg;","outputs":1,"x":311.83341217041016,"y":163.6667218208313,"z":"8cf2adae.730d5","wires":[[]]},{"id":"aecca3bc.51336","type":"function","name":"Variablen für die korrekte Funktion des Flows","func":"// KEINE KONFIGURATION \n// Variablen für die Funktion des Flows \n// ========================================================================================================\n\n\nvar now = Date.parse(Date());\ncontext.global.gfEpocheLetzteMeldung = (now / 1000); // aktuelle Zeit als Zeit der letzten Meldung (ältere Meldungen werden nicht akzeptiert)\ncontext.global.gfEpocheLetzteMeldungIbeacon = (now / 1000); // aktuelle Zeit als Zeit der letzten Meldung (ältere Meldungen werden nicht akzeptiert)\ncontext.global.gfAnzahlJSONverworfen = 0; // Anzahl der Geofency Objekte, die seit dem letzten Start verworfen wurden (zu alt, Verarbeitung nicht gewünscht)\n\nreturn msg;","outputs":1,"x":335.8334617614746,"y":820.6667133967082,"z":"8cf2adae.730d5","wires":[[]]},{"id":"f47f3ffd.0b80c","type":"switch","name":"Filter Message verarbeiten j/n","property":"verarbeiten","rules":[{"t":"true"},{"t":"else"}],"checkall":"true","outputs":2,"x":1397.1665954589844,"y":1652.1664772033691,"z":"8cf2adae.730d5","wires":[["4c01e294.b3fe1c"],["b73b50a.f48c4b"]]},{"id":"f8a8eb22.075718","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":1737.8334121704102,"y":1687.4999170303345,"z":"8cf2adae.730d5","wires":[]},{"id":"b73b50a.f48c4b","type":"function","name":"Anzahl nicht verarbeiteter Objekte","func":"// zählt die Anzahl der verworfenen JSON Objekte, da eine Verarbeitung nicht erwünscht war\n// (in der Konfig entsprechend konfiguriert)\n\nmsg.payload = ++context.global.gfAnzahlJSONverworfen;\nmsg.topic = \"NICHT VERARBEITETE OBJEKTE\";\nreturn msg;","outputs":1,"x":1684.166618347168,"y":1654.8332052230835,"z":"8cf2adae.730d5","wires":[["f8a8eb22.075718"]]},{"id":"a1d365bd.5e2c98","type":"inject","name":"Aktuelle Konfiguration -> Debug Fenster","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":1872.0001220703125,"y":66.16668701171875,"z":"8cf2adae.730d5","wires":[["3dd070a5.c22f9"]]},{"id":"3dd070a5.c22f9","type":"function","name":"Aktuelle Einstellungen -> DEBUG Fenster","func":"var msg1 = {};\nvar msg2 = {};\nvar msg3 = {};\nvar msg4 = {};\nvar msg5 = {};\nvar msg6 = {};\nvar msg7 = {};\n\n\n\n// INFO (1) msg1\nif (context.global.gfNurNeuereMeldung == true) {\n\tmsg1.payload = \"(DEFAULT) Nur neuere Meldungen, als die zuletzt gespeicherte Meldung ausgeben\";\n\t} else if (context.global.gfNurNeuereMeldung == false) {\n msg1.payload = \"Alle Meldungen, auch ältere Meldungen, verarbeiten\";\n\t} else {\n\tmsg1.payload = \"Konfigurationsfehler: context.global.gfNurNeuereMeldung\";\n\t}\n\n// INFO (2) msg2\nmsg2.payload = \"Anzahl verworfener Objekte: \" + context.global.gfAnzahlJSONverworfen;\n\n// INFO (3) msg3\nif (context.global.gfMeldungenLoggen == true) {\n\tmsg3.payload = \"(DEFAULT) Geofency Meldungen werden unter /opt/iobroker/ geloggt\";\n\t} else if (context.global.gfMeldungenLoggen == false) {\n msg3.payload = \"Geofency Meldungen werden nicht geloggt\";\n\t} else {\n\tmsg3.payload = \"Konfigurationsfehler: context.global.gfMeldungenLoggen\";\n\t}\n\n// INFO (4) msg4\nmsg4.payload = \"Adresse: \" + context.global.gfAdresseWohnung \n +\" # Lat: \" + context.global.gfWohnungLat \n + \", Lon: \" + context.global.gfWohnungLon;\n\n// INFO (5) msg5\nmsg5.payload = context.global.gfDevice01name + \" -> \" + context.global.gfDevice01id + \" # \"\n + context.global.gfDevice02name + \" -> \" + context.global.gfDevice02id + \" # \"\n + context.global.gfDevice03name + \" -> \" + context.global.gfDevice03id;\n\n// INFO (6) msg6\nmsg6.payload = \"Zoomstufe Openstreetmap: \" + context.global.gfOpenstreetmapZoom;\n\n// INFO (7) msg7\n\nif (context.global.gfUnbekannteDeviceAnlegen == false) {\n\tmsg7.payload = \"(DEFAULT) Keine unbekannten Device als Variablen anlegen\";\n\t} else if (context.global.gfUnbekannteDeviceAnlegen == true) {\n msg7.payload = \"# ACHTUNG # Unbekannte Devices werden als Variable angelegt\";\n\t} else {\n\tmsg7.payload = \"context.global.gfUnbekannteDeviceAnlegen\";\n\t}\n\n\nmsg1.topic = \"Geofency Behandlung der Meldungen nach Datum in der Meldung\";\nmsg2.topic = \"Geofenzy Anzahl der verworfen JSON Objekte\";\nmsg3.topic = \"Geofency Logging von JSON Objekte\";\nmsg4.topic = \"Eigener Standort\";\nmsg5.topic = \"Device & Anwender\";\nmsg6.topic = \"Zoomstufe Openstreetmap\";\nmsg7.topic = \"Unbekannte Device verarbeiten\";\n\n\nreturn [msg1,msg2,msg3,msg4,msg5,msg6,msg7];\n","outputs":"7","x":1872.0001220703125,"y":166.16668701171875,"z":"8cf2adae.730d5","wires":[["9be53d11.641ac"],["9be53d11.641ac"],["9be53d11.641ac"],["9be53d11.641ac"],["9be53d11.641ac"],["9be53d11.641ac"],["9be53d11.641ac"]]},{"id":"9be53d11.641ac","type":"debug","name":"","active":true,"console":"false","complete":"false","x":2142.333450317383,"y":66.16668319702148,"z":"8cf2adae.730d5","wires":[]},{"id":"fb256b96.04da98","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenEmpfangen.txt","appendNewline":true,"overwriteFile":"delete","x":2850.3333587646484,"y":150.99999904632568,"z":"8cf2adae.730d5","wires":[]},{"id":"370dfc5a.c8f204","type":"inject","name":"Datei löschen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":2562.3334808349605,"y":151.3333301544189,"z":"8cf2adae.730d5","wires":[["fb256b96.04da98"]]},{"id":"7aae5d9a.8551a4","type":"comment","name":"JSON aus dem Stream separieren => String => JSON Objekt","info":"","x":298.66673278808594,"y":1556.9999561309814,"z":"8cf2adae.730d5","wires":[]},{"id":"59e99284.a6166c","type":"comment","name":"Alle JSON Objekte als Text in eine Datei speichern (ungefiltert)","info":"","x":2730.333511352539,"y":556.9999904632568,"z":"8cf2adae.730d5","wires":[]},{"id":"79de8cf1.862174","type":"comment","name":"Filter & Logik, welche Objekte verarbeitet werden (oben konfigurierbar)","info":"","x":1538.0000915527344,"y":1549.9999084472656,"z":"8cf2adae.730d5","wires":[]},{"id":"2a20b17f.d5df4e","type":"comment","name":"<<== eigene Daten anpassen","info":"","x":640.6667175292969,"y":111.0000228881836,"z":"8cf2adae.730d5","wires":[]},{"id":"fb478c98.04b87","type":"comment","name":"<<== Konfiguration anpassen","info":"","x":636.3333740234375,"y":165.66666412353516,"z":"8cf2adae.730d5","wires":[]},{"id":"6e188e78.91e77","type":"comment","name":"Konfiguration abfragen ==>>","info":"","x":1565.666748046875,"y":68.00002670288086,"z":"8cf2adae.730d5","wires":[]},{"id":"4c01e294.b3fe1c","type":"switch","name":"(1) GPS (2) iBeacon (3) beide","property":"art","rules":[{"t":"eq","v":"gps"},{"t":"eq","v":"ibeacon"},{"t":"neq","v":"trallala"}],"checkall":"true","outputs":3,"x":1366.6666870117188,"y":1777.6665439605713,"z":"8cf2adae.730d5","wires":[["cff7b073.30085"],["e6f1132e.190ef"],["2a4918fb.d5b6e8","93e607d0.6c19f8","5512cb8b.aaed34","7db51997.824ae8"]]},{"id":"2d0aa73.fd2f558","type":"debug","name":"","active":false,"console":"false","complete":"art","x":1955.0001449584963,"y":1609.3332575956981,"z":"8cf2adae.730d5","wires":[]},{"id":"2a4918fb.d5b6e8","type":"debug","name":"Geofence Object (GPS und ibeacon)","active":false,"console":"false","complete":"payload","x":1760,"y":1807.66650390625,"z":"8cf2adae.730d5","wires":[]},{"id":"635d9101.9ca27","type":"comment","name":"Zusätzliche Infos zur Geofence Meldung","info":"","x":1493.000431060791,"y":2712.8331985473633,"z":"8cf2adae.730d5","wires":[]},{"id":"6928ba24.96d744","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenGPSverarbeitet.txt","appendNewline":true,"overwriteFile":"false","x":2811.666793823242,"y":679.9998931884766,"z":"8cf2adae.730d5","wires":[]},{"id":"270aabdd.d8f554","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenIbeaconVerarbeitet","appendNewline":true,"overwriteFile":"false","x":2810.000045776367,"y":718.3331543604534,"z":"8cf2adae.730d5","wires":[]},{"id":"9f3a36a5.60c5c8","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenGPSverarbeitet.txt","appendNewline":true,"overwriteFile":"false","x":2846.666793823242,"y":215.00001907348633,"z":"8cf2adae.730d5","wires":[]},{"id":"51a99aa0.ae5664","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenIbeaconVerarbeitet","appendNewline":true,"overwriteFile":"false","x":2848.333541870117,"y":253.33335494995117,"z":"8cf2adae.730d5","wires":[]},{"id":"786c8a73.879374","type":"inject","name":"Datei löschen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":2561.666732788086,"y":215.00000762939453,"z":"8cf2adae.730d5","wires":[["9f3a36a5.60c5c8"]]},{"id":"5cdfd064.a3203","type":"inject","name":"Datei löschen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":2561.000068664551,"y":253.3333101272583,"z":"8cf2adae.730d5","wires":[["51a99aa0.ae5664"]]},{"id":"2f3071d.fd0cf8e","type":"switch","name":"","property":"loggen","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":2555.0001373291016,"y":593.333263874054,"z":"8cf2adae.730d5","wires":[["c10ce9b1.3ef318"]]},{"id":"cff7b073.30085","type":"switch","name":"","property":"loggen","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":2551.6667442321777,"y":679.9998404184978,"z":"8cf2adae.730d5","wires":[["6928ba24.96d744"]]},{"id":"e6f1132e.190ef","type":"switch","name":"","property":"loggen","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":2551.666732788086,"y":718.3331858317058,"z":"8cf2adae.730d5","wires":[["270aabdd.d8f554"]]},{"id":"d7c1ae11.283e5","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenVerarbeitet","appendNewline":true,"overwriteFile":"false","x":2810.000045776367,"y":758.3331872622173,"z":"8cf2adae.730d5","wires":[]},{"id":"93e607d0.6c19f8","type":"switch","name":"","property":"loggen","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":2551.666732788086,"y":758.3332187334697,"z":"8cf2adae.730d5","wires":[["d7c1ae11.283e5"]]},{"id":"ac2f9681.53d068","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenVerarbeitet","appendNewline":true,"overwriteFile":"false","x":2826.666793823242,"y":293.33331871032715,"z":"8cf2adae.730d5","wires":[]},{"id":"fee24f51.011db","type":"inject","name":"Datei löschen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":2561.0001678466797,"y":294.9999752044678,"z":"8cf2adae.730d5","wires":[["ac2f9681.53d068"]]},{"id":"5512cb8b.aaed34","type":"function","name":"Geofency Kuzmeldung: yyyy-mm-dd - Anwendername - Vorgang","func":"\n// Datum aus der Nachricht generieren\nvar datum = new Date(msg.payload.date);\nvar year = datum.getFullYear();\nvar month = datum.getMonth()+1; \nvar day = datum.getDate();\nvar hour = datum.getHours();\nvar minute = datum.getMinutes();\nvar second = datum.getSeconds(); \nif(month.toString().length == 1) {\nvar month = '0'+month;\n}\nif(day.toString().length == 1) {\nvar day = '0'+day;\n} \nif(hour.toString().length == 1) {\nvar hour = '0'+hour;\n}\nif(minute.toString().length == 1) {\nvar minute = '0'+minute;\n}\nif(second.toString().length == 1) {\nvar second = '0'+second;\n} \n \nvar Zeitstempel = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second; // zusammengebautes Zeitformat\n\nvar Benutzer = \"\";\nif (msg.payload.device == context.global.gfDevice01id) { // Device ID\nBenutzer = context.global.gfDevice01name; // Name des Device Besitzers\n} else if (msg.payload.device == context.global.gfDevice02id) { // Device ID\nBenutzer = context.global.gfDevice02name; // Name des Device Besitzers\n} else if (msg.payload.device == context.global.gfDevice03id) { // Device ID\nBenutzer = context.global.gfDevice03name; // Name des Device Besitzers\n} else {\nBenutzer = \"Unbekannt\"; // keine Device ID identifiziert\n}\n\n\n\nvar Vorgang = \"\";\nif (msg.payload.entry == 1) {\nVorgang = msg.payload.name + \" betreten\";\n} \nif (msg.payload.entry == 0) {\nVorgang = msg.payload.name + \" verlassen\";\n}\n\nmsg.payload = Zeitstempel+\" - \"+Benutzer+\" - \"+Vorgang;\n\nreturn msg;","outputs":1,"x":580.9527320861816,"y":2048.3333044052124,"z":"8cf2adae.730d5","wires":[["b4c2e14b.4b3d2","cec30a94.313cf8"]]},{"id":"b4c2e14b.4b3d2","type":"debug","name":"","active":true,"console":"false","complete":"false","x":981.3101997375488,"y":2013.7501335144043,"z":"8cf2adae.730d5","wires":[]},{"id":"cec30a94.313cf8","type":"ioBroker out","name":"","topic":"geofencyMeldung","ack":"true","autoCreate":"true","x":999.7623023986816,"y":2047.20228099823,"z":"8cf2adae.730d5","wires":[]},{"id":"95069bf9.6af968","type":"function","name":"topic geofency.","func":"msg.topic = \"node-red.0.geofency.\";\nreturn msg;","outputs":1,"x":870.1787261962891,"y":2108.98810005188,"z":"8cf2adae.730d5","wires":[["de7c7ea9.21838","7a77c016.85884"]]},{"id":"de7c7ea9.21838","type":"function","name":"Topic + anwendername + gps || ibeacon .","func":"var name = \"Unbekannt\"; // Name für unbekannte Device\n\n\nif (context.global.gfUnbekannteDeviceMitKennunganlegen === true) {\n\tname = msg.payload.device;\n\t}\n\n\n// bekannte Devicenamen zuordnen und als Variable im Baum anlegen\nif (msg.payload.device == context.global.gfDevice01id) { // Device ID\nvar name = context.global.gfDevice01name; // Name des Device Besitzers\n} else if (msg.payload.device == context.global.gfDevice02id) { // Device ID\nvar name = context.global.gfDevice02name; // Name des Device Besitzers\n} else if (msg.payload.device == context.global.gfDevice03id) { // Device ID\nvar name = context.global.gfDevice03name; // Name des Device Besitzers\n}\n\nmsg.topic = msg.topic + name +\".\"+msg.art+\".\";\n\nreturn msg;","outputs":1,"x":1123.7502632141113,"y":2146.6666898727417,"z":"8cf2adae.730d5","wires":[["9c264688.63d9b8","4e3663fe.b1c99c","861da841.79e258","2e8f513a.d170ae","4d9bfd18.b26404","c7697ca9.38968","9f07df0d.60f82","bbae7f9b.44518"]]},{"id":"9c264688.63d9b8","type":"function","name":"device","func":"msg.payload = msg.payload.device;\n\n\nmsg.topic = msg.topic + \"device\";\n\nreturn msg;","outputs":1,"x":1381.250259399414,"y":2221.6667137145996,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","59d3acfc.a62c54"]]},{"id":"b989b53b.467648","type":"ioBroker out","name":"Variablen aus Geofency","topic":"","ack":"true","autoCreate":"true","x":2273.2502937316895,"y":2196.3332357406616,"z":"8cf2adae.730d5","wires":[]},{"id":"59d3acfc.a62c54","type":"debug","name":"aus der Meldung der App","active":false,"console":"false","complete":"payload","x":2251.2503700256348,"y":2363.999930381775,"z":"8cf2adae.730d5","wires":[]},{"id":"7db51997.824ae8","type":"function","name":"terminiert alle Meldungen ibeacon & gps","func":"\nreturn msg;","outputs":1,"x":501.25024795532227,"y":2107.9166898727417,"z":"8cf2adae.730d5","wires":[["95069bf9.6af968"]]},{"id":"4e3663fe.b1c99c","type":"function","name":"longitude","func":"// Länge der Koordinaten kürzen (Longitude gekürzt)\nmsg.payload = (Math.round(msg.payload.longitude * 1000000) / 1000000);\n\n// Longitude, wie aus der Meldung\n//msg.payload = msg.payload.longitude;\n\n\nmsg.topic = msg.topic + \"longitude\";\n\nreturn msg;\n","outputs":1,"x":1390.0002174377441,"y":2254.1666765213013,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","59d3acfc.a62c54"]]},{"id":"861da841.79e258","type":"function","name":"latitude","func":"// Länge der Koordinaten kürzen (Latitude gekürzt)\nmsg.payload = (Math.round(msg.payload.latitude * 1000000) / 1000000);\n\n// Latitude, wie aus der Meldung\n//msg.payload = msg.payload.latitude;\n\nmsg.topic = msg.topic + \"latitude\";\nreturn msg;\n","outputs":1,"x":1385.0002174377441,"y":2285.4166765213013,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","59d3acfc.a62c54"]]},{"id":"2e8f513a.d170ae","type":"function","name":"id","func":"msg.payload = msg.payload.id;\n\n\nmsg.topic = msg.topic + \"id\";\nreturn msg;\n","outputs":1,"x":1383.7502174377441,"y":2316.6666765213013,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","59d3acfc.a62c54"]]},{"id":"4d9bfd18.b26404","type":"function","name":"entry","func":"msg.payload = msg.payload.entry;\n\nmsg.topic = msg.topic + \"entry\";\nreturn msg;\n","outputs":1,"x":1385.0002174377441,"y":2349.1666765213013,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","59d3acfc.a62c54"]]},{"id":"c7697ca9.38968","type":"function","name":"name","func":"/* if (msg.payload.entry == 1) {\nmsg.payload = msg.payload.name;\n}\nif (msg.payload.entry == 0) {\nmsg.payload = \"unbekannt\";\n// msg.payload = \"kein iBeacon\";\n}\n*/\nmsg.payload = msg.payload.name;\n\nmsg.topic = msg.topic + \"name\";\n\nreturn msg;\n","outputs":1,"x":1386.7502670288086,"y":2381.666693687439,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","59d3acfc.a62c54"]]},{"id":"7a77c016.85884","type":"function","name":"object","func":"\nmsg.topic = msg.topic + \"object\";\n\nreturn msg;","outputs":1,"x":1377.50026512146,"y":2108.9166917800903,"z":"8cf2adae.730d5","wires":[["b989b53b.467648"]]},{"id":"9f07df0d.60f82","type":"function","name":"date (und Varianten)","func":"// msg.payload.date => liefert das Format: 2015-05-03T20:03:02Z \n// \n// Ausgang 1-3: Wert aus der JSON Meldung von Geofency (Zeitpunkt der Standortänderung)\n\n// Ausgang 1: yyyy-mm-dd hh:mm:ss (Format kann unten selbst definiert werden)\n// Ausgang 2: yyyy-mm-ddThh:mm:ssZ (ISOstring aus der JSON Meldung von Geofence)\n// Ausgang 3: epoche Wert (Unix Timestamp)\n\n// Ausgang 4: aktuelle Zeit als epoche Wert\n\nvar tst = Date.parse(msg.payload.date); // Zeitpunkt der Meldung im Epocheformat (Unix Timestamp)\nvar now = Date.parse(Date()); // aktuelle Zeit im Epocheformat\n\nvar datum = new Date(msg.payload.date);\n// now = msg.payload.date;\nvar year = datum.getFullYear();\nvar month = datum.getMonth()+1; \nvar day = datum.getDate();\nvar hour = datum.getHours();\nvar minute = datum.getMinutes();\nvar second = datum.getSeconds(); \nif(month.toString().length == 1) {\nvar month = '0'+month;\n}\nif(day.toString().length == 1) {\nvar day = '0'+day;\n} \nif(hour.toString().length == 1) {\nvar hour = '0'+hour;\n}\nif(minute.toString().length == 1) {\nvar minute = '0'+minute;\n}\nif(second.toString().length == 1) {\nvar second = '0'+second;\n} \n \n \nvar msg1 = {};\nvar msg2 = {};\nvar msg3 = {};\nvar msg4 = {}; \n\n//msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\nmsg1.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second; // zusammengebautes Zeitformat\nmsg2.payload = msg.payload.date; // ISO String, Zeitpunkt des Standortwechsels aus der JSON Geofence Meldung\nmsg3.payload = tst / 1000; // epoche, Zeitpunkt des Standortwechsels aus der JSON Geofence Meldung\nmsg4.payload = now / 1000; // epoche, aktuelle Uhrzeit\n\nmsg1.topic = msg.topic + \"datum\"; // Zeit Geofence Meldung, Format selbst definiert\nmsg2.topic = msg.topic + \"date\"; // Zeit Geofence Meldung ISO String (wie aus der Geofency Meldung)\nmsg3.topic = msg.topic + \"datumEpoche\"; // Zeit Geofence Meldung (epoch)\";\nmsg4.topic = msg.topic + \"datumEpocheAktuell\"; // aktuelle Zeit (epoch)\";\n\nreturn [msg1,msg2,msg3,msg4];\n","outputs":"4","x":1429.166690826416,"y":2427.666684150696,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","59d3acfc.a62c54"],["b989b53b.467648","59d3acfc.a62c54"],["b989b53b.467648"],["b989b53b.467648"]]},{"id":"8d78263a.7287d8","type":"comment","name":"JSON Daten wie sie aus der App kommen (+ Datumsvarianten)","info":"// Meldung gps\n{\n \"device\" : \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n \"radius\" : 100,\n \"longitude\" : 1.234567890123456,\n \"id\" : \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n \"date\" : \"2015-05-05T20:41:41Z\",\n \"latitude\" : 51.23456789012345,\n \"entry\" : \"1\",\n \"name\" : \"Standortname\"\n}\n\n// Meldung iBeacon\n{\n \"device\" : \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n \"major\" : 47111,\n \"longitude\" : 1.234567890123456,\n \"id\" : \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n \"beaconUUID\" : \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n \"minor\" : 08151,\n \"date\" : \"2015-05-06T05:37:42Z\",\n \"latitude\" : 51.23456789012345,\n \"entry\" : \"1\",\n \"name\" : \"Auto\"\n}","x":1550.8333778381348,"y":2188.333300590515,"z":"8cf2adae.730d5","wires":[]},{"id":"bbae7f9b.44518","type":"switch","name":"(1) GPS (2) iBeacon (3) beide","property":"art","rules":[{"t":"eq","v":"gps"},{"t":"eq","v":"ibeacon"},{"t":"neq","v":"trallala"}],"checkall":"true","outputs":3,"x":1124.1665992736816,"y":2501.6666860580444,"z":"8cf2adae.730d5","wires":[["5faf9c23.a05064"],["7ec35cfc.813ca4","eb494cfa.14b6b","323d66fe.cdc29a"],["84f1499a.7b0eb8"]]},{"id":"5faf9c23.a05064","type":"function","name":"radius","func":"msg.payload = msg.payload.radius;\n\nmsg.topic = msg.topic+\"radius\"; // Radius um die Koordinaten des Geofancy Standorts\nreturn msg;\n","outputs":1,"x":1388.8334693908691,"y":2513.3333024978638,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","9bea2001.6415e"]]},{"id":"2ad40256.d52bfe","type":"comment","name":"GPS individueller Teil","info":"","x":1429.8335507710772,"y":2476.6666765213013,"z":"8cf2adae.730d5","wires":[]},{"id":"79c2bb3b.863d44","type":"comment","name":"ibeacon individueller Teil","info":"","x":1440.8334693908691,"y":2549.9999284744263,"z":"8cf2adae.730d5","wires":[]},{"id":"7ec35cfc.813ca4","type":"function","name":"beaconUUID","func":"msg.payload = msg.payload.beaconUUID;\n\n\nmsg.topic = msg.topic + \"beaconUUID\";\n\nreturn msg;\n","outputs":1,"x":1408.5001029968262,"y":2584.999945640564,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","9bea2001.6415e"]]},{"id":"eb494cfa.14b6b","type":"function","name":"major","func":"msg.payload = msg.payload.major;\n\n\nmsg.topic = msg.topic + \"major\";\n\nreturn msg;\n","outputs":1,"x":1391.833106994629,"y":2621.666777610779,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","9bea2001.6415e"]]},{"id":"323d66fe.cdc29a","type":"function","name":"minor","func":"msg.payload = msg.payload.minor;\n\n\nmsg.topic = msg.topic + \"minor\";\n\nreturn msg;\n","outputs":1,"x":1392.1667671203613,"y":2654.99995136261,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","9bea2001.6415e"]]},{"id":"84f1499a.7b0eb8","type":"function","name":"Topic + zusatz .","func":"\nmsg.topic = msg.topic + \"zusatz.\";\n\nreturn msg;","outputs":1,"x":1095.833667755127,"y":2744.999988555908,"z":"8cf2adae.730d5","wires":[["13600a43.ec9ff6","fdb60750.0249f8","f9b81914.0647e8","7f9b6817.806498"]]},{"id":"13600a43.ec9ff6","type":"function","name":"Geofency Vorgang mit Standort","func":"if (msg.payload.entry == 1) {\nmsg.payload = msg.payload.name + \" betreten\";\n} \nif (msg.payload.entry == 0) {\nmsg.payload = msg.payload.name + \" verlassen\";\n}\n\nmsg.topic = msg.topic + \"vorgang\";\nreturn msg;\n","outputs":1,"x":1469.4999732971191,"y":2746.6665544509888,"z":"8cf2adae.730d5","wires":[["b7d30f00.482cf","b3fe2cca.4c01d"]]},{"id":"b7d30f00.482cf","type":"debug","name":"Zusatzinfos 1","active":false,"console":"false","complete":"payload","x":2252.500385284424,"y":2851.666579246521,"z":"8cf2adae.730d5","wires":[]},{"id":"b3fe2cca.4c01d","type":"ioBroker out","name":"Zusatzinfos","topic":"","ack":"true","autoCreate":"true","x":2244.1667289733887,"y":2750.000192642212,"z":"8cf2adae.730d5","wires":[]},{"id":"fdb60750.0249f8","type":"function","name":"openstreetmap Adresse http zum gemeldeten Standort","func":"// Openstreetmap URL\n// Koordinate inkl. Marker\nmsg.payload = \"http://www.openstreetmap.org/?mlon=\" \n + msg.payload.longitude + \"&mlat=\"\n + msg.payload.latitude + \"&zoom=\" + context.global.gfOpenstreetmapZoom\n + \"#map=\" + context.global.gfOpenstreetmapZoom + \"/\" // Zoom Stufe (beide Werte anpassen, wenn Änderung gewünscht)\n + msg.payload.latitude + \"/\"\n + msg.payload.longitude;\n\nmsg.topic = msg.topic + \"openstreetmapURL\";\nreturn msg;\n","outputs":"1","x":1540.8335304260254,"y":2783.333243370056,"z":"8cf2adae.730d5","wires":[["b3fe2cca.4c01d","b7d30f00.482cf"]]},{"id":"f9b81914.0647e8","type":"function","name":"Luftlinie zwischen Smartphone und daheim- (1) km (2) m (3) weiter","func":"//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n//::: :::\n//::: This routine calculates the distance between two points (given the :::\n//::: latitude/longitude of those points). It is being used to calculate :::\n//::: the distance between two locations using GeoDataSource (TM) prodducts :::\n//::: :::\n//::: Definitions: :::\n//::: South latitudes are negative, east longitudes are positive :::\n//::: :::\n//::: Passed to function: :::\n//::: lat1, lon1 = Latitude and Longitude of point 1 (in decimal degrees) :::\n//::: lat2, lon2 = Latitude and Longitude of point 2 (in decimal degrees) :::\n//::: unit = the unit you desire for results :::\n//::: where: 'M' is statute miles (default) :::\n//::: 'K' is kilometers :::\n//::: 'N' is nautical miles :::\n//::: :::\n//::: Worldwide cities and other features databases with latitude longitude :::\n//::: are available at http://www.geodatasource.com :::\n//::: :::\n//::: For enquiries, please contact sales@geodatasource.com :::\n//::: :::\n//::: Official Web site: http://www.geodatasource.com :::\n//::: :::\n//::: GeoDataSource.com (C) All Rights Reserved 2015 :::\n//::: :::\n//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n\n\n\nfunction distance(lat1, lon1, lat2, lon2, unit) {\n\tvar radlat1 = Math.PI * lat1/180\n\tvar radlat2 = Math.PI * lat2/180\n\tvar radlon1 = Math.PI * lon1/180\n\tvar radlon2 = Math.PI * lon2/180\n\tvar theta = lon1-lon2\n\tvar radtheta = Math.PI * theta/180\n\tvar dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);\n\tdist = Math.acos(dist)\n\tdist = dist * 180/Math.PI\n\tdist = dist * 60 * 1.1515\n\tif (unit==\"K\") { dist = dist * 1.609344 }\n\tif (unit==\"N\") { dist = dist * 0.8684 }\n\treturn dist\n}\n\n// Koordinaten der eignen Wohnung\nvar lat1 = context.global.gfWohnungLat;\nvar lon1 = context.global.gfWohnungLon;\n// aktueller Standort\nvar lat2 = parseFloat(msg.payload.latitude);\nvar lon2 = parseFloat(msg.payload.longitude); \n \nvar msg1 = {};\nvar msg2 = {};\nvar msg3 = {};\n\nmsg1.payload = Math.round(distance(lat1, lon1, lat2, lon2, \"K\")*1000)/1000 // Distanz in km\nmsg2.payload = Math.round(distance(lat1, lon1, lat2, lon2, \"K\")*1000); // in m \nmsg3.payload = msg1.payload;\n\nmsg1.topic = msg.topic + \"luftlinieKM\"; // Luftlinie in km zum Standort\";\nmsg2.topic = msg.topic + \"luftlinieM\"; // Luftlinie in m zum Standort\";\nmsg3.topic = msg.topic;\nreturn [msg1,msg2,msg3];\n\n","outputs":"3","x":1579.166690826416,"y":2839.999913215637,"z":"8cf2adae.730d5","wires":[["b3fe2cca.4c01d","b7d30f00.482cf"],["b3fe2cca.4c01d","b7d30f00.482cf"],["e2dc8d54.1d237"]]},{"id":"e2dc8d54.1d237","type":"function","name":"als String mit dynamischen Nachkommastellen","func":"function runden(x) {\n var k = (Math.round(x * 100) / 100).toString();\n k += (k.indexOf('.') == -1)? '.0' : '0';\n var p = k.indexOf('.'), m = k.indexOf('-.');\n var f = (p == 0 || m == 0)? '0,' : ',';\n return k.substring(0, p) + f + k.substring(p+1, p+3);\n}\n\n\nvar dist = msg.payload;\nif (dist < 1) {\ndist = Math.round(dist * 1000).toString();\nmsg.payload = dist + \" m\"; \n} else {\ndist = runden(dist).toString();\nmsg.payload = dist + \" km\";\n}\n\nmsg.topic = msg.topic + \"luftlinieText\"; // Luftlinie als dynamischer String zum Standort\nreturn msg;","outputs":1,"x":1559.166446685791,"y":2874.9999952316284,"z":"8cf2adae.730d5","wires":[["b7d30f00.482cf","b3fe2cca.4c01d"]]},{"id":"9bea2001.6415e","type":"debug","name":"aus der Meldung der App","active":false,"console":"false","complete":"payload","x":1914.1666221618652,"y":2508.333353996277,"z":"8cf2adae.730d5","wires":[]},{"id":"bfde47a.f4021b8","type":"debug","name":"Google API Ausgabe als JSON","active":false,"console":"false","complete":"payload","x":1900.8332862854004,"y":3056.333309173584,"z":"8cf2adae.730d5","wires":[]},{"id":"7f9b6817.806498","type":"function","name":"Create request","func":"// Info von Bluefox (newMsg erstellen)\n\nAdresseWohnung = context.global.gfAdresseWohnung; // Leerzeichen = \"+\", ohne Umlaute\nlat = (Math.round(msg.payload.latitude * 1000000) / 1000000);\nlon = (Math.round(msg.payload.longitude * 1000000) / 1000000);\n\nmsg.payload = \"http://maps.googleapis.com/maps/api/directions/json?origin=\"\n + AdresseWohnung\n + \"&destination=\"\n + lat +\",\" + lon \n + \"&sensor=false&alternatives=false\";\n\nvar newMsg = {\n method: 'GET',\n url: msg.payload,\n topic: msg.topic\n}\n\nvar newMsg1 = {}; // zum füllen des http request\nvar msg2 = {}; // Ausgabe der URL für die Google Api zum Test (Debug)\n\nnewMsg1 = newMsg;\nmsg2.payload = msg.payload;\n\nreturn [newMsg1,msg2];","outputs":"2","x":1419.4999465942383,"y":2982.3334951400757,"z":"8cf2adae.730d5","wires":[["39e62251.c619de"],["129fab34.ed6055"]]},{"id":"39e62251.c619de","type":"http request","name":"http request - Google API Route (Auto)","method":"GET","ret":"obj","url":"","x":1581.8335227966309,"y":3059.3332138061523,"z":"8cf2adae.730d5","wires":[["bfde47a.f4021b8","ba21f586.45de08","884b66b1.77b498","f284159b.0d7be8","42b024e0.bd4fdc","c3d13a0f.3c2ec8"]]},{"id":"e7efddf1.18102","type":"comment","name":"Methode zur Übergabe Parameter an hhtp request 8create request) muss überarbeitet werden","info":"Warnmeldung beim Aufruf:\n====================================================================\nDeprecated: msg properties should not override fixed node properties. \nUse explicit override option. \nSee bit.ly/nr-override-msg-props","x":1664.8336067199707,"y":3022.999852180481,"z":"8cf2adae.730d5","wires":[]},{"id":"129fab34.ed6055","type":"debug","name":"Google API URL","active":false,"console":"false","complete":"payload","x":1946.5000343322754,"y":2988.000256538391,"z":"8cf2adae.730d5","wires":[]},{"id":"ba21f586.45de08","type":"function","name":"Fahrzeit in Minuten (Auto)","func":"msg.payload = Math.ceil(msg.payload.routes[0].legs[0].duration.value / 60);\n\nmsg.topic = msg.topic + \"FahrzeitAutoMin\";\n\nreturn msg;","outputs":1,"x":1466.5000228881836,"y":3146.0002880096436,"z":"8cf2adae.730d5","wires":[["54d7489.fab28b8","94cc295a.6b33d8"]]},{"id":"54d7489.fab28b8","type":"debug","name":"Zusatzinfos 2","active":false,"console":"false","complete":"payload","x":2276.500141143799,"y":3276.3333024978638,"z":"8cf2adae.730d5","wires":[]},{"id":"884b66b1.77b498","type":"function","name":"Entfernung in (1) km (2) m (Auto)","func":"var msg1 = {}; // km\nvar msg2 = {}; // m\nvar msg3 = {}; // m\nmsg1.payload = msg.payload.routes[0].legs[0].distance.value / 1000;\nmsg2.payload = msg.payload.routes[0].legs[0].distance.value;\nmsg3.payload = msg1.payload;\n\nmsg1.topic = msg.topic + \"DistanzAutoKM\";\nmsg2.topic = msg.topic + \"DistanzAutoM\";\nmsg3.topic = msg.topic;\n\nreturn [msg1,msg2,msg3];","outputs":"3","x":1481.5000305175781,"y":3218.000018119812,"z":"8cf2adae.730d5","wires":[["94cc295a.6b33d8","54d7489.fab28b8"],["94cc295a.6b33d8","54d7489.fab28b8"],["8f78c17e.70874"]]},{"id":"8f78c17e.70874","type":"function","name":"als String mit dynamischen Nachkommastellen","func":"function runden(x) {\n var k = (Math.round(x * 100) / 100).toString();\n k += (k.indexOf('.') == -1)? '.0' : '0';\n var p = k.indexOf('.'), m = k.indexOf('-.');\n var f = (p == 0 || m == 0)? '0,' : ',';\n return k.substring(0, p) + f + k.substring(p+1, p+3);\n}\n\n\nvar dist = msg.payload;\nif (dist < 1) {\ndist = Math.round(dist * 1000).toString();\nmsg.payload = dist + \" m\"; \n} else {\ndist = runden(dist).toString();\nmsg.payload = dist + \" km\";\n}\n\nmsg.topic = msg.topic + \"DistanzAutoText\";\n\nreturn msg;","outputs":1,"x":1528.1663398742676,"y":3261.3337602615356,"z":"8cf2adae.730d5","wires":[["94cc295a.6b33d8","54d7489.fab28b8"]]},{"id":"f284159b.0d7be8","type":"function","name":"Fahrzeit als Text (Auto)","func":"msg.payload = msg.payload.routes[0].legs[0].duration.text;\n\nmsg.topic = msg.topic + \"FahrzeitAutoText\";\n\nreturn msg;","outputs":1,"x":1456.5000267028809,"y":3178.0002250671387,"z":"8cf2adae.730d5","wires":[["94cc295a.6b33d8","54d7489.fab28b8"]]},{"id":"42b024e0.bd4fdc","type":"function","name":"Route zum Standort (Kurzbeschreibung)","func":"msg.payload = (msg.payload.routes[0].summary);\n\nmsg.topic = msg.topic + \"AutoRoute\";\n\nreturn msg;","outputs":1,"x":1509.8335151672363,"y":3301.3339014053345,"z":"8cf2adae.730d5","wires":[["94cc295a.6b33d8","54d7489.fab28b8"]]},{"id":"c3d13a0f.3c2ec8","type":"function","name":"Adresse des Standorts (per Google Maps)","func":"// Standorte per iBeacon können beweglich sein (z.B. ein iBeacon im Auto, um die Zeit im Auto zu messen)\n// Hier wird die aktuelle Adresse ausgegeben, auch wenn diese vorher nicht in Geofency gespeichert ist\n\nmsg.payload = msg.payload.routes[0].legs[0].end_address;\n\nmsg.topic = msg.topic + \"AdresseGoogle\";\n\nreturn msg;","outputs":1,"x":1516.5000190734863,"y":3338.00048828125,"z":"8cf2adae.730d5","wires":[["94cc295a.6b33d8","54d7489.fab28b8"]]},{"id":"4373550b.bc8cac","type":"comment","name":"Informationen zur Entfernung (Auto) & Route zum gemeldeten Standort, Block löschen, wenn nicht benötigt","info":"z.B. Berechnung, ob man sich der Wohnung nähert oder von der Wohnung entfern\nz.B. zur automatisierten Anwesenheitskontrolle\nz.B. Lichter an/aus\nz.B. Visualisierung in VIS\n","x":1698.166934967041,"y":2947.333303451538,"z":"8cf2adae.730d5","wires":[]},{"id":"94cc295a.6b33d8","type":"ioBroker out","name":"Zusatzinfos","topic":"","ack":"true","autoCreate":"true","x":2282.4998817443848,"y":3188.999840736389,"z":"8cf2adae.730d5","wires":[]},{"id":"ba11d5bf.45ee28","type":"comment","name":"gefilterte und umgewandelte JSON Onjekte (nach Filter) in je eine Datei","info":"","x":2748.3333282470703,"y":643.3332462310791,"z":"8cf2adae.730d5","wires":[]},{"id":"dda96aa1.225698","type":"comment","name":"Log Dateien löschen","info":"","x":2555.0002085367837,"y":103.33333905537918,"z":"8cf2adae.730d5","wires":[]},{"id":"a7cec49c.583138","type":"comment","name":"Verarbeitung als tcp Stream","info":"","x":187,"y":1371.6666259765625,"z":"8cf2adae.730d5","wires":[]},{"id":"ab7fa022.54806","type":"function","name":"(1) device ausgeben & (2) Prüfung, ob Device bekannt (für Flow freigabe), weiter im Flow","func":"msg1 = {};\nmsg2 = {};\n\nmsg1.payload = msg.payload.device;\n\nif (msg1.payload == context.global.gfDevice01id ||\n msg1.payload == context.global.gfDevice02id ||\n msg1.payload == context.global.gfDevice03id ||\n context.global.gfUnbekannteDeviceAnlegen != false) {\n\tmsg2.freigabe = true;\n\t}\n\nmsg1.topic = msg.topic + \"device\";\n\nmsg2.payload = msg.payload;\nmsg2.topic = msg.topic;\n\nreturn [msg1,msg2];","outputs":"2","x":810.2499389648438,"y":1508.7498779296875,"z":"8cf2adae.730d5","wires":[["98bc3cda.6743c","62074ec0.9df8b"],["26daadd6.d92552"]]},{"id":"98bc3cda.6743c","type":"debug","name":"Ausgabe Device (für die Zuordnung des Namens) in der Konfig","active":true,"console":"false","complete":"payload","x":1060.9166259765625,"y":362.41650390625,"z":"8cf2adae.730d5","wires":[]},{"id":"120889e1.edf776","type":"delay","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":220.4167251586914,"y":909.1666247049968,"z":"8cf2adae.730d5","wires":[["35c65973.ca39a6"]]},{"id":"35c65973.ca39a6","type":"function","name":"Korrektur ungültiger Werte in der Konfiguration","func":"// context.global.gfOpenstreetmapZoom\n// ungültiger Wert bei der Zoomstufe für Openstreetmaps\n// auf Default (=16) stellen.\nif (context.global.gfOpenstreetmapZoom <1 && context.global.gfOpenstreetmapZoom > 19) {\n\tcontext.global.gfOpenstreetmapZoom = 16;\n\t}\n\t\n\nreturn msg;","outputs":1,"x":520.8333778381348,"y":907.499976793925,"z":"8cf2adae.730d5","wires":[["841944d1.7be6b8"]]},{"id":"440aadf2.bbf554","type":"delay","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":209.5833625793457,"y":979.9999777475994,"z":"8cf2adae.730d5","wires":[["101f022b.efe0fe"]]},{"id":"717aab7.f8e8554","type":"comment","name":"Hinweise","info":"# Die Bezeichnung GPS ist falsch. Geofency nutzt kein GPS sondern (aus einem Forum):\n Significant Change Location Service: uses cell signal only; low-powered option; iOS 4.0+\n Also Trianguliertes Cell-Signal , kein GPS.\n Eine APP gibt dem IOS die Positionen ( max 20 ) und legt sich dann \"schlafen\".\n Den Rest erledigt das Betriebssystem. Wird ein Bereich betreten oder verlassen \n \"weckt\" das IOS die APP ......\n Radius bei Geofency: zwischen 100m und 5000m\n \n zum Vergleich Owntracks:\n Monitors \"significant location changes\" as defined by Apple Inc. \n (about 5 minutes AND \"significant location changes\" (>500m)) \n or as described in Move Mode below. \n In addition version >= 5.3 supports circular region monitoring (aka geo fences). \n In addition version >= 7.7 supports iBeacon region monitoring and ranging.\n \n ","x":965.0000305175781,"y":152.16664743423462,"z":"8cf2adae.730d5","wires":[]},{"id":"689a572e.9765a8","type":"comment","name":"Javascript gelernt","info":"","x":1110.000072479248,"y":153.83332014083862,"z":"8cf2adae.730d5","wires":[]},{"id":"101f022b.efe0fe","type":"function","name":"Konfiguration als Node-Red Variablen in ioBroker speichern geofency.conf.","func":"// Konfiguration in ioBroker unter geofency.conf. speichern\n// die Variablen können dort wärend der Laufzeit, z.B. über VIS geändert werden, \n// um z.B. in einem Widget die Zoomstufe wärend der Laufzeit anzupassen\n// bei einen neuem Deploy, wird auf die Konfiguration zurückgestellt.\n\n// für die Konfiguration, die Sinn macht\n\n\nvar gfPfad = \"node-red.0.geofency.conf.\";\n\nvar msg1 = {};\n\n// msg1: context.global.gfOpenstreetmapZoom\nmsg1.payload = context.global.gfOpenstreetmapZoom;\nmsg1.topic = gfPfad + \"mapZoom\";\n\n\nreturn [msg1];","outputs":1,"x":413.7500343322754,"y":1013.7499777475994,"z":"8cf2adae.730d5","wires":[["fbad8413.045278","699cffb6.9663"]]},{"id":"841944d1.7be6b8","type":"switch","name":"(1) init (2) rest","property":"topic","rules":[{"t":"eq","v":"init"},{"t":"else"}],"checkall":"true","outputs":2,"x":786.2500457763672,"y":906.249976793925,"z":"8cf2adae.730d5","wires":[["440aadf2.bbf554"],[]]},{"id":"9d2dcaf2.62d238","type":"comment","name":"Mehrfachverwendung der Funktion über den Topic","info":"ist der msg.topic = init, dann wird der Ausgang (1) benutzt\nsonst Ausgang (2)\n\nDadurch kann die Funktion von verschiedenen Stellen aus genutzt werden.\nDie Grundinitalisierung der Konfig verwendt msg.topic = \"init\";\n\nSoll die Fehlerkorrektur z.B. auch wärend der Laufzeit con anderen\nStellen genutzt werden, kann man den Eingang verbinden und dann über den \nAusgang (2) weitermachen. ","x":683.7500495910645,"y":873.749976793925,"z":"8cf2adae.730d5","wires":[]},{"id":"fbad8413.045278","type":"debug","name":"","active":false,"console":"false","complete":"false","x":797.5000457763672,"y":1012.4999787012737,"z":"8cf2adae.730d5","wires":[]},{"id":"9d934e46.626cb","type":"ioBroker in","name":"","topic":"node-red.0.geofency.conf.*","payloadType":"value","x":1357.5000762939453,"y":901.2500138282776,"z":"8cf2adae.730d5","wires":[["2c67c537.d3983a","187af43c.e7850c"]]},{"id":"2c67c537.d3983a","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1602.5000839233398,"y":897.5000138282776,"z":"8cf2adae.730d5","wires":[]},{"id":"699cffb6.9663","type":"ioBroker out","name":"Konfiguration unter geofency.conf.* ablegen.","topic":"","ack":"true","autoCreate":"true","x":702.5000419616699,"y":1056.2499806086223,"z":"8cf2adae.730d5","wires":[]},{"id":"153fb0e5.eac04f","type":"inject","name":"","topic":"","payload":"17","payloadType":"string","repeat":"","crontab":"","once":false,"x":1316.2500610351562,"y":783.7500042915344,"z":"8cf2adae.730d5","wires":[["7820ee2c.87df1"]]},{"id":"7820ee2c.87df1","type":"ioBroker out","name":"","topic":"node-red.0.geofency.conf.mapZoom","ack":"true","autoCreate":"false","x":1521.2500801086426,"y":782.5000128746033,"z":"8cf2adae.730d5","wires":[]},{"id":"6398d3d5.9c672c","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":1352.500099182129,"y":1063.7500262260437,"z":"8cf2adae.730d5","wires":[["7c5c38b7.83a3c8"]]},{"id":"7c5c38b7.83a3c8","type":"function","name":"context.global.gfOpenstreetmapZoom auslesen","func":"msg.payload = context.global.gfOpenstreetmapZoom;\nreturn msg;","outputs":1,"x":1455.0000915527344,"y":1098.750027179718,"z":"8cf2adae.730d5","wires":[["b2eeaa8e.4d1158"]]},{"id":"b2eeaa8e.4d1158","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1540.0000953674316,"y":1062.500027179718,"z":"8cf2adae.730d5","wires":[]},{"id":"187af43c.e7850c","type":"function","name":"(optimieren) Variablenänderung aus node.red.0. -> in context.global. übernehmen","func":"// das kann man bestimmt optimieren, d.h. die Variable anhand des kommenden\n// topic automatisch zusammenbauen\n\nif( msg.topic == \"node-red/0/geofency/conf/mapZoom\") {\n\tcontext.global.gfOpenstreetmapZoom = msg.payload;\n\t}\n\nreturn msg;","outputs":1,"x":1525.0000915527344,"y":950.0000157356262,"z":"8cf2adae.730d5","wires":[["7c5c38b7.83a3c8"]]},{"id":"109b7f.ffef6481","type":"comment","name":"Nur Test und Debug, kann gelöscht werden","info":"Überprüft, ob die richtige variable in context.global.gfOpenstreetmapZoom steht.\n","x":1420.0000762939453,"y":1032.5000157356262,"z":"8cf2adae.730d5","wires":[]},{"id":"6bbb626c.94449c","type":"comment","name":"Nur Test und Debug, kann gelöscht werden","info":"änder in ioBroker den Wert der Konfig\n","x":1400.0000610351562,"y":748.7500042915344,"z":"8cf2adae.730d5","wires":[]},{"id":"6c5e7603.93a188","type":"comment","name":"Wenn node-red.0.geofency.conf.* Variablen geändert werden diese in context.global übernehmen","info":"","x":1550,"y":868,"z":"8cf2adae.730d5","wires":[]},{"id":"62074ec0.9df8b","type":"ioBroker out","name":"Device der letzten Meldung unter node-red.0.geofency.device","topic":"node-red.0.geofency.device","ack":"true","autoCreate":"true","x":1058,"y":402,"z":"8cf2adae.730d5","wires":[]},{"id":"2c2ba042.d3d46","type":"comment","name":"### hier kann die Nummer des eigenen Device ermittelt werden ###","info":"","x":1064,"y":322,"z":"8cf2adae.730d5","wires":[]},{"id":"26daadd6.d92552","type":"switch","name":"Flow freigegeben (1) true (2) false","property":"freigabe","rules":[{"t":"true"},{"t":"else"}],"checkall":"true","outputs":2,"x":956,"y":1582,"z":"8cf2adae.730d5","wires":[["bbeaeadc.441518"],["4b74219.fb48be"]]},{"id":"8212d691.7ded28","type":"debug","name":"Flow ist nicht freigegeben","active":true,"console":"false","complete":"payload","x":942,"y":1664,"z":"8cf2adae.730d5","wires":[]},{"id":"4b74219.fb48be","type":"function","name":"Flow ist gesperrt","func":"msg.payload = \"### DEVICE UNBEKANNT ### Nur das Device wird ausgegeben. siehe: node-red.0.geofency.device # Konfig. anpassen ### Variablen für unbekanntes Device NICHT angelegt.\";\n\nreturn msg;","outputs":1,"x":898,"y":1626,"z":"8cf2adae.730d5","wires":[["8212d691.7ded28"]]},{"id":"e9948341.166b8","type":"tcp out","host":"","port":"7999","beserver":"reply","base64":false,"end":true,"name":"","x":613.6666259765625,"y":1406,"z":"8cf2adae.730d5","wires":[]}]