[code][{"id":"ca93781b.356c88","type":"tcp in","server":"server","host":"","port":"7999","datamode":"stream","datatype":"utf8","newline":"","topic":"","name":"Geofency an tcp:7999","base64":false,"x":161.50003051757812,"y":688.1666743755341,"z":"8cf2adae.730d5","wires":[["8bfc4a85.7403b8","785d2604.87a2d8"]]},{"id":"4b98ebba.b46714","type":"json","name":"wandelt den string in ein objekt (json)","x":414.1667022705078,"y":863.4998693466187,"z":"8cf2adae.730d5","wires":[["bbeaeadc.441518","ab7fa022.54806"]]},{"id":"8bfc4a85.7403b8","type":"switch","name":"","property":"payload","rules":[{"t":"cont","v":"{"},{"t":"else"}],"checkall":"false","outputs":2,"x":137.50000762939453,"y":859.8333797454834,"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":174.16669464111328,"y":828.1667060852051,"z":"8cf2adae.730d5","wires":[]},{"id":"71cd9b74.8e3264","type":"comment","name":"2: Restliche Meldungen (ohne JSON Anteil)","info":"","x":242.49998474121094,"y":896.4999265670776,"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\nreturn msg;","outputs":1,"x":372.4999771118164,"y":829.8332920074463,"z":"8cf2adae.730d5","wires":[["4b98ebba.b46714","2f3071d.fd0cf8e"]]},{"id":"785d2604.87a2d8","type":"debug","name":"tcp:7999 Stream","active":false,"console":"false","complete":"payload","x":367.16661071777344,"y":688.5001268386841,"z":"8cf2adae.730d5","wires":[]},{"id":"49d5d98d.b62a28","type":"debug","name":"alle Meldungen ohne JSON Anteil","active":false,"console":"false","complete":"payload","x":220.83328247070312,"y":961.4998893737793,"z":"8cf2adae.730d5","wires":[]},{"id":"5740473e.a8bfb8","type":"comment","name":"##### Eigene Daten angeben & Konfiguration #####","info":"","x":324.1667022705078,"y":142.3336420059204,"z":"8cf2adae.730d5","wires":[]},{"id":"b1f32ffa.4e0cd","type":"inject","name":"Eigene Daten initialisieren","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":250.83340454101562,"y":364.00011444091797,"z":"8cf2adae.730d5","wires":[["51c5e73f.ae3a18","aecca3bc.51336","3d389bca.c2c764"]]},{"id":"fe9dac90.01625","type":"debug","name":"","active":true,"console":"false","complete":"false","x":501.83348083496094,"y":365.3334484100342,"z":"8cf2adae.730d5","wires":[]},{"id":"c10ce9b1.3ef318","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenEmpfangen.txt","appendNewline":true,"overwriteFile":"false","x":2015.8334197998047,"y":622.1666722297668,"z":"8cf2adae.730d5","wires":[]},{"id":"51c5e73f.ae3a18","type":"function","name":"Eigene Koordinaten & Adresse Wohnung, 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// Daten der Device/Anwender, auf denen Geofence läuft\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":324.1666564941406,"y":187.3333511352539,"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 ändern in ?\n# 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\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":1041.000259399414,"y":177.66683959960938,"z":"8cf2adae.730d5","wires":[]},{"id":"be1684fd.41e978","type":"comment","name":"**** Änderungsübersicht (Versionen) **** (siehe Kommentarbody)","info":"0.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\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\n\n0.1.0\t04.05.2015\t# Erste version im Forum\n","x":1117.33349609375,"y":134.66672706604004,"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":1174.4999694824219,"y":831.1667020320892,"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; // (true/false) Nur neuere Meldungen, als die letzte Meldung akzeptieren\ncontext.global.gfMeldungenLoggen = true; // (true/false) Einträge unter /opt/ioBroker mitloggen\n\n\n\n\n\n\n\n\nreturn msg;","outputs":1,"x":305.83341217041016,"y":241.66672945022583,"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":342.50006103515625,"y":412.3334197998047,"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":1037.1664733886719,"y":861.1666171550751,"z":"8cf2adae.730d5","wires":[["4c01e294.b3fe1c"],["b73b50a.f48c4b"]]},{"id":"f8a8eb22.075718","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":1377.8332901000977,"y":896.5000569820404,"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":1324.1664962768555,"y":863.8333451747894,"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":1077.0000610351562,"y":240.66669464111328,"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 = {};\n\n\n// INFO (1) msg1\nif (context.global.gfNurNeuereMeldung == true) {\n\tmsg1.payload = \"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\n// INFO (3) msg3\nif (context.global.gfMeldungenLoggen == true) {\n\tmsg3.payload = \"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\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\";\n\nreturn [msg1,msg2,msg3,msg4,msg5];\n","outputs":"5","x":1077.0000610351562,"y":340.6666946411133,"z":"8cf2adae.730d5","wires":[["9be53d11.641ac"],["9be53d11.641ac"],["9be53d11.641ac"],["9be53d11.641ac"],["9be53d11.641ac"]]},{"id":"9be53d11.641ac","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1319.0000610351562,"y":240.66669464111328,"z":"8cf2adae.730d5","wires":[]},{"id":"fb256b96.04da98","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenEmpfangen.txt","appendNewline":true,"overwriteFile":"delete","x":1925.3332061767578,"y":211.00000858306885,"z":"8cf2adae.730d5","wires":[]},{"id":"370dfc5a.c8f204","type":"inject","name":"Datei löschen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":1637.3333282470699,"y":211.33333969116205,"z":"8cf2adae.730d5","wires":[["fb256b96.04da98"]]},{"id":"7aae5d9a.8551a4","type":"comment","name":"JSON aus dem Stream separieren => String => JSON Objekt","info":"","x":306.6666717529297,"y":792,"z":"8cf2adae.730d5","wires":[]},{"id":"59e99284.a6166c","type":"comment","name":"Alle JSON Objekte als Text in eine Datei speichern (ungefiltert)","info":"","x":1945.333480834961,"y":586.9999847412109,"z":"8cf2adae.730d5","wires":[]},{"id":"79de8cf1.862174","type":"comment","name":"Filter & Logik, welche Objekte verarbeitet werden (oben konfigurierbar)","info":"","x":1177.9999694824219,"y":759.0000483989716,"z":"8cf2adae.730d5","wires":[]},{"id":"2a20b17f.d5df4e","type":"comment","name":"<<== eigene Daten","info":"","x":626.6667251586914,"y":195.00002670288086,"z":"8cf2adae.730d5","wires":[]},{"id":"fb478c98.04b87","type":"comment","name":"<<== Konfiguration","info":"","x":578.3333892822266,"y":241.6666717529297,"z":"8cf2adae.730d5","wires":[]},{"id":"6e188e78.91e77","type":"comment","name":"Konfiguration abfragen ==>>","info":"","x":781.6667556762695,"y":240.0000286102295,"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":1006.6665649414062,"y":986.6666839122772,"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":1469.9998931884766,"y":798.3333642482758,"z":"8cf2adae.730d5","wires":[]},{"id":"2a4918fb.d5b6e8","type":"debug","name":"Geofence Object (GPS und ibeacon)","active":false,"console":"false","complete":"payload","x":1399.9998779296875,"y":1016.6666438579559,"z":"8cf2adae.730d5","wires":[]},{"id":"635d9101.9ca27","type":"comment","name":"Zusätzliche Infos zur Geofence Meldung","info":"","x":1373.0003662109375,"y":1857.8332777023315,"z":"8cf2adae.730d5","wires":[]},{"id":"6928ba24.96d744","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenGPSverarbeitet.txt","appendNewline":true,"overwriteFile":"false","x":2026.666763305664,"y":709.9998874664307,"z":"8cf2adae.730d5","wires":[]},{"id":"270aabdd.d8f554","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenIbeaconVerarbeitet","appendNewline":true,"overwriteFile":"false","x":2025.0000152587893,"y":748.3331486384075,"z":"8cf2adae.730d5","wires":[]},{"id":"9f3a36a5.60c5c8","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenGPSverarbeitet.txt","appendNewline":true,"overwriteFile":"false","x":1921.6666412353516,"y":275.0000286102295,"z":"8cf2adae.730d5","wires":[]},{"id":"51a99aa0.ae5664","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenIbeaconVerarbeitet","appendNewline":true,"overwriteFile":"false","x":1923.3333892822266,"y":313.33336448669434,"z":"8cf2adae.730d5","wires":[]},{"id":"786c8a73.879374","type":"inject","name":"Datei löschen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":1636.6665802001953,"y":275.0000171661377,"z":"8cf2adae.730d5","wires":[["9f3a36a5.60c5c8"]]},{"id":"5cdfd064.a3203","type":"inject","name":"Datei löschen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":1635.9999160766602,"y":313.33331966400146,"z":"8cf2adae.730d5","wires":[["51a99aa0.ae5664"]]},{"id":"2f3071d.fd0cf8e","type":"switch","name":"","property":"loggen","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":1770.0001068115234,"y":623.333258152008,"z":"8cf2adae.730d5","wires":[["c10ce9b1.3ef318"]]},{"id":"cff7b073.30085","type":"switch","name":"","property":"loggen","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":1766.6667137145998,"y":709.9998346964519,"z":"8cf2adae.730d5","wires":[["6928ba24.96d744"]]},{"id":"e6f1132e.190ef","type":"switch","name":"","property":"loggen","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":1766.666702270508,"y":748.3331801096599,"z":"8cf2adae.730d5","wires":[["270aabdd.d8f554"]]},{"id":"d7c1ae11.283e5","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenVerarbeitet","appendNewline":true,"overwriteFile":"false","x":2025.0000152587893,"y":788.3331815401714,"z":"8cf2adae.730d5","wires":[]},{"id":"93e607d0.6c19f8","type":"switch","name":"","property":"loggen","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":1766.666702270508,"y":788.3332130114238,"z":"8cf2adae.730d5","wires":[["d7c1ae11.283e5"]]},{"id":"ac2f9681.53d068","type":"file","name":"","filename":"/opt/iobroker/GeofencyMeldungenVerarbeitet","appendNewline":true,"overwriteFile":"false","x":1901.6666412353516,"y":353.3333282470703,"z":"8cf2adae.730d5","wires":[]},{"id":"fee24f51.011db","type":"inject","name":"Datei löschen","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":1636.000015258789,"y":354.99998474121094,"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":460.9526672363281,"y":1193.3333835601807,"z":"8cf2adae.730d5","wires":[["b4c2e14b.4b3d2","cec30a94.313cf8"]]},{"id":"b4c2e14b.4b3d2","type":"debug","name":"","active":true,"console":"false","complete":"false","x":861.3101348876953,"y":1158.7502126693726,"z":"8cf2adae.730d5","wires":[]},{"id":"cec30a94.313cf8","type":"ioBroker out","name":"","topic":"geofencyMeldung","ack":"true","autoCreate":"true","x":879.7622375488281,"y":1192.2023601531982,"z":"8cf2adae.730d5","wires":[]},{"id":"95069bf9.6af968","type":"function","name":"topic geofency.","func":"msg.topic = \"node-red.0.geofency.\";\nreturn msg;","outputs":1,"x":750.1786613464355,"y":1253.9881792068481,"z":"8cf2adae.730d5","wires":[["de7c7ea9.21838","7a77c016.85884"]]},{"id":"de7c7ea9.21838","type":"function","name":"Topic + anwendername + gps || ibeacon .","func":"var name = \"Unbekannt\"; \n\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":1003.7501983642578,"y":1291.66676902771,"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":1261.2501945495605,"y":1366.6667928695679,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","59d3acfc.a62c54"]]},{"id":"b989b53b.467648","type":"ioBroker out","name":"Variablen aus Geofency","topic":"","ack":"true","autoCreate":"true","x":2153.250228881836,"y":1341.3333148956299,"z":"8cf2adae.730d5","wires":[]},{"id":"59d3acfc.a62c54","type":"debug","name":"aus der Meldung der App","active":false,"console":"false","complete":"payload","x":2131.2503051757812,"y":1509.0000095367432,"z":"8cf2adae.730d5","wires":[]},{"id":"7db51997.824ae8","type":"function","name":"terminiert alle Meldungen ibeacon & gps","func":"\nreturn msg;","outputs":1,"x":381.25018310546875,"y":1252.91676902771,"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":1270.0001525878906,"y":1399.1667556762695,"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":1265.0001525878906,"y":1430.4167556762695,"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":1263.7501525878906,"y":1461.6667556762695,"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":1265.0001525878906,"y":1494.1667556762695,"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":1266.750202178955,"y":1526.6667728424072,"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":1257.5002002716064,"y":1253.9167709350586,"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":1309.1666259765625,"y":1572.666763305664,"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":1430.8333129882812,"y":1333.3333797454834,"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":1004.1665344238281,"y":1646.6667652130127,"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":1268.8334045410156,"y":1658.333381652832,"z":"8cf2adae.730d5","wires":[["b989b53b.467648","9bea2001.6415e"]]},{"id":"2ad40256.d52bfe","type":"comment","name":"GPS individueller Teil","info":"","x":1309.8334859212237,"y":1621.6667556762693,"z":"8cf2adae.730d5","wires":[]},{"id":"79c2bb3b.863d44","type":"comment","name":"ibeacon individueller Teil","info":"","x":1320.8334045410156,"y":1695.0000076293945,"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":1288.5000381469727,"y":1730.0000247955322,"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":1271.8330421447754,"y":1766.666856765747,"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":1272.1667022705078,"y":1800.0000305175781,"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":975.8336029052734,"y":1890.0000677108765,"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":1349.4999084472656,"y":1891.666633605957,"z":"8cf2adae.730d5","wires":[["b7d30f00.482cf","b3fe2cca.4c01d"]]},{"id":"b7d30f00.482cf","type":"debug","name":"Zusatzinfos 1","active":false,"console":"false","complete":"payload","x":2132.5003204345703,"y":1996.6666584014893,"z":"8cf2adae.730d5","wires":[]},{"id":"b3fe2cca.4c01d","type":"ioBroker out","name":"Zusatzinfos","topic":"","ack":"true","autoCreate":"true","x":2124.166664123535,"y":1895.0002717971802,"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=16#map=16/\" // Zoom Stufe 16 (beide Werte anpssen, wenn Änderung gewünscht)\n + msg.payload.latitude + \"/\"\n + msg.payload.longitude;\n\nmsg.topic = msg.topic + \"openstreetmapURL\";\nreturn msg;\n","outputs":"1","x":1420.8334655761719,"y":1928.3333225250244,"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":1459.1666259765625,"y":1984.9999923706055,"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":1439.1663818359375,"y":2020.0000743865967,"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":1794.1665573120117,"y":1653.3334331512451,"z":"8cf2adae.730d5","wires":[]},{"id":"bfde47a.f4021b8","type":"debug","name":"Google API Ausgabe als JSON","active":false,"console":"false","complete":"payload","x":1780.8332214355469,"y":2201.3333883285522,"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":1299.4998817443848,"y":2127.333574295044,"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":1461.8334579467773,"y":2204.3332929611206,"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":1544.8335418701172,"y":2167.999931335449,"z":"8cf2adae.730d5","wires":[]},{"id":"129fab34.ed6055","type":"debug","name":"Google API URL","active":false,"console":"false","complete":"payload","x":1826.4999694824219,"y":2133.0003356933594,"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":1346.49995803833,"y":2291.000367164612,"z":"8cf2adae.730d5","wires":[["54d7489.fab28b8","94cc295a.6b33d8"]]},{"id":"54d7489.fab28b8","type":"debug","name":"Zusatzinfos 2","active":true,"console":"false","complete":"payload","x":2156.5000762939453,"y":2421.333381652832,"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":1361.4999656677246,"y":2363.0000972747803,"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":1408.166275024414,"y":2406.333839416504,"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":1336.4999618530273,"y":2323.000304222107,"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":1389.8334503173828,"y":2446.3339805603027,"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":1396.4999542236328,"y":2483.0005674362183,"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":1578.1668701171875,"y":2092.3333826065063,"z":"8cf2adae.730d5","wires":[]},{"id":"94cc295a.6b33d8","type":"ioBroker out","name":"Zusatzinfos","topic":"","ack":"true","autoCreate":"true","x":2162.4998168945312,"y":2333.9999198913574,"z":"8cf2adae.730d5","wires":[]},{"id":"ba11d5bf.45ee28","type":"comment","name":"gefilterte und umgewandelte JSON Onjekte (nach Filter) in je eine Datei","info":"","x":1963.3332977294922,"y":673.3332405090332,"z":"8cf2adae.730d5","wires":[]},{"id":"dda96aa1.225698","type":"comment","name":"Log Dateien löschen","info":"","x":1630.000055948893,"y":163.33334859212235,"z":"8cf2adae.730d5","wires":[]},{"id":"a7cec49c.583138","type":"comment","name":"Verarbeitung als tcp Stream -> Provisorium (Webhook muss anders verarbeitet werden)","info":"","x":363.3333435058594,"y":646.666669845581,"z":"8cf2adae.730d5","wires":[]},{"id":"ab7fa022.54806","type":"function","name":"device","func":"msg.payload = msg.payload.device;\n\n\nmsg.topic = msg.topic + \"device\";\n\nreturn msg;","outputs":1,"x":954.9998779296875,"y":534.9999599456787,"z":"8cf2adae.730d5","wires":[["98bc3cda.6743c"]]},{"id":"98bc3cda.6743c","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1091.6665878295898,"y":536.6666107177734,"z":"8cf2adae.730d5","wires":[]}][/code]