NEWS
Geofency Adapterersatz mit Node-red
-
Der Node-red Flow für Geofency:
[{"id":"fa0e911c.05f17","type":"tcp in","server":"server","host":"","port":"7999","datamode":"stream","datatype":"utf8","newline":"","topic":"","name":"","base64":false,"x":83.3333625793457,"y":906.6666421890259,"z":"e0986d36.1f679","wires":[["f57f7470.0a8088","7d3f6c25.82c094"]]},{"id":"674a6366.98b59c","type":"debug","name":"ausgeschnittenes JSON Objekt","active":false,"console":"false","complete":"payload","x":962.3333740234375,"y":950.0001392364502,"z":"e0986d36.1f679","wires":[]},{"id":"e29776b1.1d6888","type":"comment","name":"Zum Test: TCP Stream (Geofency) an Node-red","info":"","x":202.00003051757812,"y":822.1110563278198,"z":"e0986d36.1f679","wires":[]},{"id":"82008c7f.7dff7","type":"json","name":"","x":710.0001049041748,"y":1328.3331823349,"z":"e0986d36.1f679","wires":[["674a6366.98b59c","ee027e5f.11fd8","bf3e49bc.40c1b8","20f4652b.df0b9a","ed45adf6.12ba5","a64e4f7.f59b1b","be2be0ee.41d42","2348e43f.dcb71c","404642b1.bfb9bc","a4b5fff9.5b4a","30fea28f.cf015e","8664225c.799be","462426f.fb9dbd8"]]},{"id":"66f3a23c.990c5c","type":"ioBroker out","name":"","topic":"geofenceName","ack":"true","autoCreate":"true","x":1246.6667289733887,"y":1088.333426475525,"z":"e0986d36.1f679","wires":[]},{"id":"ee027e5f.11fd8","type":"function","name":"Geofence Name","func":"if (msg.payload.entry == 1) {\nmsg.payload = msg.payload.name;\n}\nif (msg.payload.entry == 0) {\nmsg.payload = \"unbekannt\";\n}\nreturn msg;\n","outputs":1,"x":999.9999313354492,"y":1088.3333444595337,"z":"e0986d36.1f679","wires":[["66f3a23c.990c5c","ed2ea07b.12d16"]]},{"id":"ed2ea07b.12d16","type":"debug","name":"","active":false,"console":"false","complete":"false","x":1423.333381652832,"y":1088.333212852478,"z":"e0986d36.1f679","wires":[]},{"id":"bf3e49bc.40c1b8","type":"function","name":"Geofence 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}\nreturn msg;\n","outputs":1,"x":1013.3333511352539,"y":1143.3332977294922,"z":"e0986d36.1f679","wires":[["61e458a3.9e1ba8","9c953473.636ac8"]]},{"id":"61e458a3.9e1ba8","type":"ioBroker out","name":"","topic":"geofenceVorgang","ack":"true","autoCreate":"true","x":1250.0000076293945,"y":1143.333176612854,"z":"e0986d36.1f679","wires":[]},{"id":"9c953473.636ac8","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1421.666561126709,"y":1144.999963760376,"z":"e0986d36.1f679","wires":[]},{"id":"20f4652b.df0b9a","type":"function","name":"Datum Format selbst definiert","func":"// msg.payload.date => liefert das Format: 2015-05-03T20:03:02Z \n// hier wird das Datum zum Zeitpunkt des Funktionsaufruf verwendet\n\nvar now = new Date();\n// now = msg.payload.date;\nvar year = now.getFullYear();\nvar month = now.getMonth()+1; \nvar day = now.getDate();\nvar hour = now.getHours();\nvar minute = now.getMinutes();\nvar second = now.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 = {};\n \n//msg.timestamp = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\nmsg1.payload = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;\nmsg2.payload = msg.payload.date;\n\nreturn [msg1,msg2];\n","outputs":"2","x":1001.6666259765625,"y":1205.0000095367432,"z":"e0986d36.1f679","wires":[["b0790c72.4f86f","beccc39.f41334"],["eeb033f3.114fd","bf9369b2.406c98"]]},{"id":"beccc39.f41334","type":"ioBroker out","name":"","topic":"geofenceDatum","ack":"true","autoCreate":"true","x":1246.666633605957,"y":1199.999927520752,"z":"e0986d36.1f679","wires":[]},{"id":"b0790c72.4f86f","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1419.9999732971191,"y":1201.6666746139526,"z":"e0986d36.1f679","wires":[]},{"id":"ed45adf6.12ba5","type":"function","name":"Koordinaten","func":"// Längre der Koordinaten kürzen\nmsg.payload = (Math.round(msg.payload.latitude * 1000000) / 1000000) + \",\" + (Math.round(msg.payload.longitude * 1000000) / 1000000);\n\nreturn msg;\n","outputs":1,"x":958.3332748413086,"y":1301.666597366333,"z":"e0986d36.1f679","wires":[["232c0eb.fdcd3f2","dec3b284.213c5"]]},{"id":"232c0eb.fdcd3f2","type":"ioBroker out","name":"","topic":"geofenceKoordinaten","ack":"true","autoCreate":"true","x":1241.666633605957,"y":1303.3332242965698,"z":"e0986d36.1f679","wires":[]},{"id":"dec3b284.213c5","type":"debug","name":"","active":false,"console":"false","complete":"false","x":1421.6665496826172,"y":1301.666516304016,"z":"e0986d36.1f679","wires":[]},{"id":"a64e4f7.f59b1b","type":"function","name":"id","func":"msg.payload = msg.payload.id;\n\nreturn msg;\n","outputs":1,"x":944.9999389648438,"y":1351.6665573120117,"z":"e0986d36.1f679","wires":[["c413e02.f3bec2","cca0ffb.f335f"]]},{"id":"c413e02.f3bec2","type":"ioBroker out","name":"","topic":"geofenceId","ack":"true","autoCreate":"true","x":1268.3333435058594,"y":1351.6665630340576,"z":"e0986d36.1f679","wires":[]},{"id":"cca0ffb.f335f","type":"debug","name":"","active":false,"console":"false","complete":"false","x":1424.9999237060547,"y":1354.9997720718384,"z":"e0986d36.1f679","wires":[]},{"id":"be2be0ee.41d42","type":"function","name":"device","func":"msg.payload = msg.payload.device;\n\nreturn msg;\n","outputs":1,"x":943.3333530426025,"y":1403.3333110809326,"z":"e0986d36.1f679","wires":[["7bfe2aa1.8401d4","ef758aeb.108a78"]]},{"id":"7bfe2aa1.8401d4","type":"ioBroker out","name":"","topic":"geofenceDevice","ack":"true","autoCreate":"true","x":1248.333339691162,"y":1406.6664838790894,"z":"e0986d36.1f679","wires":[]},{"id":"ef758aeb.108a78","type":"debug","name":"","active":false,"console":"false","complete":"false","x":1428.3333015441895,"y":1406.666482925415,"z":"e0986d36.1f679","wires":[]},{"id":"462426f.fb9dbd8","type":"function","name":"Luftlinie in km zwischen Smartphone und daheim","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.WohnungLat;\nvar lon1 = context.global.WohnungLon;\n// aktueller Standort\nvar lat2 = parseFloat(msg.payload.latitude);\nvar lon2 = parseFloat(msg.payload.longitude); \n \nvar msg1 = {};\nmsg1.payload = Math.round(distance(lat1, lon1, lat2, lon2, \"K\")*1000)/1000 // Distanz in km\nvar msg2 = {};\nmsg2.payload = Math.round(distance(lat1, lon1, lat2, lon2, \"K\")*1000); // in m \nreturn [msg1,msg2];\n\n","outputs":"2","x":1064.9999694824219,"y":1699.9997806549072,"z":"e0986d36.1f679","wires":[["effdfde4.1002","4dea87fd.b21578","b892a5fd.476d58"],["39fcbdbb.c60342","778d97ad.887268"]]},{"id":"effdfde4.1002","type":"debug","name":"","active":false,"console":"false","complete":"payload","x":1596.666648864746,"y":1629.999698638916,"z":"e0986d36.1f679","wires":[]},{"id":"4dea87fd.b21578","type":"ioBroker out","name":"","topic":"geofenceDistanzLuftlineKM","ack":"true","autoCreate":"true","x":1404.9998931884766,"y":1629.9998617172241,"z":"e0986d36.1f679","wires":[]},{"id":"b892a5fd.476d58","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\nreturn msg;","outputs":1,"x":1063.333257675171,"y":1741.6665344238281,"z":"e0986d36.1f679","wires":[["502bb17b.afd45","67415915.98bea8"]]},{"id":"502bb17b.afd45","type":"ioBroker out","name":"","topic":"geofenceDistanzLuftlinieKMstring","ack":"true","autoCreate":"true","x":1386.6664733886719,"y":1739.9997839927673,"z":"e0986d36.1f679","wires":[]},{"id":"67415915.98bea8","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1601.6665649414062,"y":1738.3330764770508,"z":"e0986d36.1f679","wires":[]},{"id":"39fcbdbb.c60342","type":"ioBroker out","name":"","topic":"geofenceDistanzLuftlineM","ack":"true","autoCreate":"true","x":1401.6664810180664,"y":1683.3330345153809,"z":"e0986d36.1f679","wires":[]},{"id":"eeb033f3.114fd","type":"ioBroker out","name":"","topic":"geofenceDatumISO","ack":"true","autoCreate":"true","x":1248.3333053588867,"y":1251.6666345596313,"z":"e0986d36.1f679","wires":[]},{"id":"bf9369b2.406c98","type":"debug","name":"","active":false,"console":"false","complete":"false","x":1426.6666412353516,"y":1253.3333024978638,"z":"e0986d36.1f679","wires":[]},{"id":"2348e43f.dcb71c","type":"ioBroker out","name":"","topic":"geofenceJSON","ack":"true","autoCreate":"true","x":913.3333129882812,"y":984.9999389648438,"z":"e0986d36.1f679","wires":[]},{"id":"f57f7470.0a8088","type":"switch","name":"","property":"payload","rules":[{"t":"cont","v":"{"},{"t":"else"}],"checkall":"false","outputs":2,"x":88.33336639404297,"y":1095.0000076293945,"z":"e0986d36.1f679","wires":[["91493bd3.6eb6c8"],["7690aa1b.896f54"]]},{"id":"404642b1.bfb9bc","type":"function","name":"entry","func":"msg.payload = msg.payload.entry;\n\nreturn msg;\n","outputs":1,"x":943.3332901000977,"y":1460.0000228881836,"z":"e0986d36.1f679","wires":[["59e2c48.fa61d3c","af93cf27.506c3"]]},{"id":"59e2c48.fa61d3c","type":"ioBroker out","name":"","topic":"geofenceEntry","ack":"true","autoCreate":"true","x":1245.0000495910645,"y":1464.9998607635498,"z":"e0986d36.1f679","wires":[]},{"id":"af93cf27.506c3","type":"debug","name":"","active":false,"console":"false","complete":"false","x":1425.0000076293945,"y":1466.6665267944336,"z":"e0986d36.1f679","wires":[]},{"id":"a4b5fff9.5b4a","type":"function","name":"Anwender","func":"// Device ID (aus dem JSONObject rauskopieren)\n// weitere Devices können über weitere Ifs eingetragen werden\nif (msg.payload.device == context.global.Device01id) { // Device ID\nmsg.payload = context.global.Device01name; // Name des Device Besitzers\n} else if (msg.payload.device == context.global.Device02id) { // Device ID\nmsg.payload = context.global.Device02name; // Name des Device Besitzers\n} else if (msg.payload.device == context.global.Device03id) { // Device ID\nmsg.payload = context.global.Device03name; // Name des Device Besitzers\n} else {\n\nmsg.payload = \"Unbekannt\"; // keine Device ID identifiziert\n\n}\n\nreturn msg;\n","outputs":1,"x":948.3333320617676,"y":1530.0000200271606,"z":"e0986d36.1f679","wires":[["741381fb.8bec8","3f7a1058.c085f"]]},{"id":"741381fb.8bec8","type":"ioBroker out","name":"","topic":"geofenceAnwender","ack":"true","autoCreate":"true","x":1249.9999656677246,"y":1523.333239555359,"z":"e0986d36.1f679","wires":[]},{"id":"3f7a1058.c085f","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1428.3334274291992,"y":1524.9999022483826,"z":"e0986d36.1f679","wires":[]},{"id":"c25b7d6b.3da48","type":"debug","name":"Hier darf nichts ankommen","active":true,"console":"false","complete":"payload","x":304.9999694824219,"y":1243.3332662582397,"z":"e0986d36.1f679","wires":[]},{"id":"7690aa1b.896f54","type":"switch","name":"","property":"payload","rules":[{"t":"cont","v":"{"},{"t":"else"}],"checkall":"false","outputs":2,"x":80.00001525878906,"y":1245.000012397766,"z":"e0986d36.1f679","wires":[["c25b7d6b.3da48"],["2804a937.d7fb56"]]},{"id":"3880cc2e.c77f34","type":"comment","name":"Andere Bausteine möglich? Mit Authentifizierung?","info":"","x":210.00003051757812,"y":856.666600227356,"z":"e0986d36.1f679","wires":[]},{"id":"5f54a3fe.a0ab5c","type":"comment","name":"1: Meldung enthält { ","info":"Meldung enthält eine geschweifte Klammer auf und damit den JSON Anteil","x":121.66670989990234,"y":1059.9999647140503,"z":"e0986d36.1f679","wires":[]},{"id":"fda3965b.025c68","type":"comment","name":"2: Restliche Meldungen (ohne JSON Anteil)","info":"","x":193.33334350585938,"y":1131.6665544509888,"z":"e0986d36.1f679","wires":[]},{"id":"a84337d5.57bcc8","type":"comment","name":"Kontrolle ob noch eine Meldung mit { verloren gegangen ist","info":"","x":234.99996948242188,"y":1206.666802406311,"z":"e0986d36.1f679","wires":[]},{"id":"91493bd3.6eb6c8","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;\nreturn msg;","outputs":1,"x":473.33331298828125,"y":1089.9997215270996,"z":"e0986d36.1f679","wires":[["82008c7f.7dff7","706e5457.8f91ac"]]},{"id":"7d3f6c25.82c094","type":"debug","name":"","active":false,"console":"false","complete":"false","x":271.6666259765625,"y":906.6667222976685,"z":"e0986d36.1f679","wires":[]},{"id":"b01c8493.4fe378","type":"debug","name":"Google API JSON","active":false,"console":"false","complete":"payload","x":517.6666870117188,"y":1673.666488647461,"z":"e0986d36.1f679","wires":[]},{"id":"8664225c.799be","type":"function","name":"Create request","func":"// Info von Bluefox (newMsg erstellen)\n\nAdresseWohnung = context.global.AdresseWohnung; // 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}\nvar newMsg1 = {};\nvar msg2 = {};\nnewMsg1 = newMsg;\nmsg2.payload = msg.payload;\nreturn [newMsg1,msg2];","outputs":"2","x":174.66665649414062,"y":1632.6665410995483,"z":"e0986d36.1f679","wires":[["476b2285.b894dc"],["af7ff87.f508008"]]},{"id":"476b2285.b894dc","type":"http request","name":"http request - Google API Route (Auto)","method":"GET","ret":"obj","url":"","x":233.66665649414062,"y":1671.3332080841064,"z":"e0986d36.1f679","wires":[["b01c8493.4fe378","5cef366a.a310c8","65c5b8e9.9a3a48","1861acba.e79e53","4af713e0.b508ec"]]},{"id":"2804a937.d7fb56","type":"debug","name":"alle Meldungen ohne JSON Anteil","active":false,"console":"false","complete":"payload","x":291.6666564941406,"y":1313.333228111267,"z":"e0986d36.1f679","wires":[]},{"id":"778d97ad.887268","type":"debug","name":"","active":false,"console":"false","complete":"payload","x":1589.999900817871,"y":1681.666651725769,"z":"e0986d36.1f679","wires":[]},{"id":"f798e569.086718","type":"function","name":"Eigene Koordinaten & Adresse Wohnung","func":"// eigene Kordinaten Wohnung (Beispiel München)\ncontext.global.WohnungLat = 48.160174;\ncontext.global.WohnungLon = 11.585733;\ncontext.global.AdresseWohnung = \"Leopoldstrasse+47,+80802+Muenchen\";\n\n// Daten der Device/Anwender, auf denen Geofence läuft\n// Hinweis: bei mehr als eine Person macht es Sinn, je Person einen Zweig mit eigenen Variablen aufzumachen\n// Device01\ncontext.global.Device01id = \"4711BG93-4844-2B8F-3E1C-9E83D73F8F32\";\ncontext.global.Device01name = \"Micha\";\n// Device02\ncontext.global.Device02id = \"4711B7G9-4844-2B8F-3E1C-9E83D73F8F32\";\ncontext.global.Device02name = \"Name Person B\";\n// Device02\ncontext.global.Device03id = \"4711B7G3-4844-2B8F-3E1C-9E83D73F8F32\";\ncontext.global.Device03name = \"Name Person C\";\n\n\n\nmsg.payload = \"Geofence - eigene Daten gespeichert\";\n\nreturn msg;","outputs":1,"x":616.6666717529297,"y":861.6666393280029,"z":"e0986d36.1f679","wires":[["c3727d34.3c8d8"]]},{"id":"14337da0.ebcc82","type":"comment","name":"##### Eigene Daten angeben #####","info":"","x":600.0000915527344,"y":821.6668405532837,"z":"e0986d36.1f679","wires":[]},{"id":"30fea28f.cf015e","type":"function","name":"openstreetmap Adresse http","func":"// Openstreetmap URL\n// Koordinate inkl. Marker\nmsg.payload = \"http://www.openstreetmap.org/?mlon=\" \n + msg.payload.longitude + \"&mlat=\"\n + msg.payload.latitude + \"&zoom=15#map=16/\" // Zoom Stufe 16 (beide Werte anpssen, wenn Änderung gewünscht)\n + msg.payload.latitude + \"/\"\n + msg.payload.longitude;\nreturn msg;\n","outputs":"1","x":1026.6666259765625,"y":1816.6666259765625,"z":"e0986d36.1f679","wires":[["bfe0212f.401fe","bfba67fa.404598"]]},{"id":"bfe0212f.401fe","type":"ioBroker out","name":"","topic":"geofenceOpenstreetmapURL","ack":"true","autoCreate":"true","x":1295.2380676269531,"y":1813.8095140457153,"z":"e0986d36.1f679","wires":[]},{"id":"bfba67fa.404598","type":"debug","name":"","active":false,"console":"false","complete":"false","x":1506.6666870117188,"y":1813.8094444274902,"z":"e0986d36.1f679","wires":[]},{"id":"feb462aa.014ba","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":371.6668395996094,"y":1561.6664848327637,"z":"e0986d36.1f679","wires":[]},{"id":"eed067ac.112f98","type":"inject","name":"Eigene Daten initialisieren","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":583.3333892822266,"y":956.6666851043701,"z":"e0986d36.1f679","wires":[["f798e569.086718"]]},{"id":"c3727d34.3c8d8","type":"debug","name":"","active":true,"console":"false","complete":"false","x":555.0001068115234,"y":985.0000190734863,"z":"e0986d36.1f679","wires":[]},{"id":"af7ff87.f508008","type":"debug","name":"Google API URL","active":false,"console":"false","complete":"payload","x":378.3333282470703,"y":1631.6667308807373,"z":"e0986d36.1f679","wires":[]},{"id":"5cef366a.a310c8","type":"function","name":"Fahrzeit in Minuten (Auto)","func":"msg.payload = Math.ceil(msg.payload.routes[0].legs[0].duration.value / 60);\n\nreturn msg;","outputs":1,"x":193.33331298828125,"y":1714.9997835159302,"z":"e0986d36.1f679","wires":[["4bb6819f.b4498","718d152.f8e72ec"]]},{"id":"4bb6819f.b4498","type":"debug","name":"","active":false,"console":"false","complete":"false","x":738.333381652832,"y":1720.0000276565552,"z":"e0986d36.1f679","wires":[]},{"id":"65c5b8e9.9a3a48","type":"function","name":"Entfernung in (1) km (2) m (Auto)","func":"var msg1 = {}; // km\nvar msg2 = {}; // m\nmsg1.payload = msg.payload.routes[0].legs[0].distance.value / 1000;\nmsg2.payload = msg.payload.routes[0].legs[0].distance.value;\n\nreturn [msg1,msg2];","outputs":"2","x":206.6666717529297,"y":1809.9999885559082,"z":"e0986d36.1f679","wires":[["ad7a30af.5285d","7bb4d47c.844b2c","1e5f3bb5.e1a0c4"],["26bd016.fd942fe","40a1a59b.bf5e5c"]]},{"id":"ad7a30af.5285d","type":"debug","name":"","active":false,"console":"false","complete":"false","x":736.6666831970215,"y":1801.6667366027832,"z":"e0986d36.1f679","wires":[]},{"id":"26bd016.fd942fe","type":"debug","name":"","active":false,"console":"false","complete":"false","x":735.0000076293945,"y":1840.0000400543213,"z":"e0986d36.1f679","wires":[]},{"id":"7bb4d47c.844b2c","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\nreturn msg;","outputs":1,"x":218.33334350585938,"y":1888.3332862854004,"z":"e0986d36.1f679","wires":[["eee49ce2.111b6","d3893e41.2c76c"]]},{"id":"eee49ce2.111b6","type":"debug","name":"","active":true,"console":"false","complete":"false","x":733.3333320617676,"y":1888.3332424163818,"z":"e0986d36.1f679","wires":[]},{"id":"1861acba.e79e53","type":"function","name":"Fahrzeit als Text (Auto)","func":"msg.payload = msg.payload.routes[0].legs[0].duration.text;\n\nreturn msg;","outputs":1,"x":188.3333282470703,"y":1749.9998779296875,"z":"e0986d36.1f679","wires":[["4167d0c9.be983","ba343d3d.45cbc"]]},{"id":"4167d0c9.be983","type":"debug","name":"","active":true,"console":"false","complete":"false","x":736.6666259765625,"y":1756.6666259765625,"z":"e0986d36.1f679","wires":[]},{"id":"4af713e0.b508ec","type":"function","name":"Route","func":"msg.payload = (msg.payload.routes[0].summary);\n\nreturn msg;","outputs":1,"x":120,"y":1929.9999141693115,"z":"e0986d36.1f679","wires":[["d2209ca7.2ddf6","6ca57614.935a88"]]},{"id":"d2209ca7.2ddf6","type":"debug","name":"","active":true,"console":"false","complete":"false","x":738.3333435058594,"y":1931.6667032241821,"z":"e0986d36.1f679","wires":[]},{"id":"1e5f3bb5.e1a0c4","type":"ioBroker out","name":"","topic":"geofenceDistanzAutoKM","ack":"true","autoCreate":"true","x":530,"y":1799.9998779296875,"z":"e0986d36.1f679","wires":[]},{"id":"40a1a59b.bf5e5c","type":"ioBroker out","name":"","topic":"geofenceDistanzAutoM","ack":"true","autoCreate":"true","x":538.3333129882812,"y":1839.9998779296875,"z":"e0986d36.1f679","wires":[]},{"id":"d3893e41.2c76c","type":"ioBroker out","name":"","topic":"geofenceDistanzAutoKMstring","ack":"true","autoCreate":"true","x":531.666633605957,"y":1889.9998712539673,"z":"e0986d36.1f679","wires":[]},{"id":"6ca57614.935a88","type":"ioBroker out","name":"","topic":"geofenceRouteAuto","ack":"true","autoCreate":"true","x":516.6666259765625,"y":1933.333251953125,"z":"e0986d36.1f679","wires":[]},{"id":"718d152.f8e72ec","type":"ioBroker out","name":"","topic":"geofenceFahrzeitAutoMin","ack":"true","autoCreate":"true","x":535,"y":1721.6666259765625,"z":"e0986d36.1f679","wires":[]},{"id":"ba343d3d.45cbc","type":"ioBroker out","name":"","topic":"geofenceFahrzeitAutoText","ack":"true","autoCreate":"true","x":535,"y":1761.6666259765625,"z":"e0986d36.1f679","wires":[]},{"id":"706e5457.8f91ac","type":"file","name":"","filename":"/opt/iobroker/gefoncemeldungen.txt","appendNewline":true,"overwriteFile":"false","x":1268.3333892822266,"y":1038.3333740234375,"z":"e0986d36.1f679","wires":[]}]
****Danke an alle, die mir meine unterschiedlichen Fragen an den unterschiedlichen Stellen beantwortet haben.
Ganz besonders auch an Bluefox!****
Kurzbeschreibung
Bei mir funktioniert der Flow für Geofency grundsätzlich.
Die Verarbeitung der Meldungen als TCP Stream (Feld (D)) ist wahrscheinlich nicht richtig. Es klappt aber erst einmal.
Dann gibt es noch die Meldung (orange Kästchen). Hier habe ich den Tipp von Bluefox zur dynamischen Generierung der URL für den http request zur Abfrage der Route über die Google API umgesetzt. Anscheinend handelt es sich dabei um eine nicht mehr empfohlenen Methode (?), siehe http://bit.ly/nr-override-msg-props. Die Lösung hat sich mir aber nicht erschlossen. Entweder ignorieren oder, wer die Entfernungsberechnung zum akt. Geofency Standort nicht benötigt, einfach das ganze Kästchen (C) löschen.
Folgende Daten liefert der Flow
Kästchen (A):
Die Daten, die die iOS/Android App Geofency liefert. Ergänzt um einen Anwendernamen anhand der Device ID.
Kästchen (B):
Spielerei: Die Entfernung zum aktuellen Geofency Standort und der eigenen Wohnung (Luftlinie).
Kästchen (C):
Spielerei: Die Entfernung mit dem Auto zwischen Standort und Wohnung, inkl. Fahrzeit ohne Stau.
-
Nicht benötigte Kästchen können einfach gelöscht werden.
-
Nicht benötigte Daten und Variablen können einfach gelöscht werden
Notwendige Einstellungen
-
Portfreigabe im Router TCP 7999 (in meinem Beispiel) zu ioBroker
-
Die eigenen Daten im Kästchen (D) eintragen. Koordinaten und Anschrift der eigenen Wohnung, ID des Smartphones (Debug bei geofenceDevice einschalten, erste Meldung auslesen) eintragen und der dazugehörige Name). Die Anschrift und die eigenen Koordinaten werden nicht benötigt, wenn man Kästchen (B) und (C) löscht.
-
Geofency Webhook: Event -> URL Mitteilung bei Eintritt und Austritt: ein
-
Geofency Webhook: URL bei Eintritt & Austritt: http://(IP oder dyndns von Router):7999/0
-
Geofency: Authentifizierung aus (bringt nichts, klappt komischerweise mit und ohne / Daten Authentifizierung werden vom Flow ignoriert)
-
Geofency Webhook: Post-Format: JSON-enkodiert ein
Test mit betreten/verlassen unter Webhook.
Offene Baustellen
Der Flow funktioniert bei mir so, trotz der offenen Baustellen:
-
Die zusammengebaute URL Funktion -> http request und die dazugehörige Warnmeldung (oranger Kasten) -> nur bei der Route per Google Maps relevant (andere Lösung notwendig)
-
der richtige Start des Flows. D.h. die richtige Alternative zum TCP node, inkl. Authentifizierung (durch den TCP Stream kommt man beim lokalen Test auf einen Timeout, nachdem die Meldung abgesetzt wurde. In der freien Wildbahn habe ich keine Einschränkungen festgestellt)
-
-
Große Klasse kann ich da nur sagen! Es funktioniert alles auf Anhieb! Und für mich zum lernen einfach Spitze! Danke!!!
-
Das freut mich, dass Du den Flow auch gebrauchen kannst.
Kannst Du bitte beobachten, ob bei Dir alle Meldungen ankommen, wenn Du an einer Standortgrenze bist (kommen, verlassen, kommen, verlassen).
Ich habe da noch nichts festgestellt, könnte mir aber vorstellen, dass bei schnellen Statuswechsel das Thema Timeout zuschlagen könnte (wg. der Lösung über den TCP Stream).
-
Grummel… das obere Kästchen oben links (TCP stream) muss wohl doch getauscht werden.
Die Meldungen werden beim Betreten eines Standorts gesendet und werden auch richtig verarbeitet.
Allerdings schickt die Geofency App dann immer wieder ältere Meldungen (die Standorte, die davor betreten wurden).
Fehler in Geofency oder Geofency erwartet eine Rückmeldung, sprich der TCP Stream reicht nicht?
Bei Owntracks funktioniert das richtig. Dort wird mqtt verwendet, mit dem entsprechenden Baustein.
Ich schau mal was man tun kann.
[EDIT]
Workaround ist in Arbeit
-
Neue Version:
Ältere (doppelte) Meldungen werden nun ignoriert.
iBeacon werden berücksichtigt.
0.1.2 06.05.2015 # Unterscheidung Meldung über GPS Standort oder iBeacon eingebaut
iBeacon Variablen eingebaut
0.1.1 05.05.2015 # msg.payload.routes[0].legs[0].end_address (Goolge Maps API Zieladresse) hinzugefügt
Zeitstempel angepasst. Nicht mehr die Zeit zum Zeitpunkt des Funktionsaufruf,
sondern nun wird die Zeit aus der JSON Meldung ausgegeben.
zwei neue Zeiten: Zeitpunkt aus der JSON Meldung als Epoche, aktuelle Zeit als Epoche
Topic den einzelnen Funktionen -> Variablen zugeorndet (bessere Lesbarkeit der Debugmeldung)
Dokumentation im Flow ergänzt
alle globalen Variablen beginnen nun mit gf (context.global.gf….)
Konfigurierbar: nur neuere Meldungen verarbeiten oder auch ältere Meldungen
Anzeige der aktuellen Kofiguration per Knopfdruck im Debug-Fenster
0.1.0 04.05.2015 # Erste version im Forum
sorry, kann ich leider nicht ablegen:
"Dein Beitrag enthält 117142 Zeichen. Es sind maximal 60000 Zeichen erlaubt."
.
-
Dann pack es in ein Textfile und lade es als Attachment hoch Wäre cool von dir…
-
Anbei die die aktuelle Version des Geofency Flows.
!!ACHTUNG!!
!Neue Struktur der Variablen! <- Bitte beachten, falls jemand schon mit der älteren Version getestet hat.
Die alten Variablen können über iobroker/admin gelöscht werden.
Die neuen Variablen nutzen eine Baumstruktur. Es werden nun bis zu drei Benutzer automatisch dargestellt und diese noch einmal zwischen GPS und iBeacon unterschieden.
Sollte in der Geofency App keine iBeacon Meldungen konfiguriert sein, dann werden die Variablen auch nicht unnötig erzeugt.
Unter eigene Daten/Konfig:
Die eigenen Koordinaten und die eigene Anschrift eintragen (wird für die Spielereien benötigt).
Die eigenen Device ID sollte man vorher auslesen und in der Konfig eintragen. Sonst wird ein Zweig Unbekannt in der Variablen-Baumstruktur erzeugt.
Dazu kann man vor dem ersten Start die Verbindung (A1) trennen und unter Debug (A) die eigene ID auslesen und dann in der Konfig eintragen.
Danach die Verbindung (A1) wieder herstellen.
Nicht benötigte Variablen können einfach gelöscht werden. Genauso, wie die Kästchen "Spielereien".
-
Anbei der Geofency Flow 0.2.0 als Dateianhang (txt):
Der neue Flow filtert die älteren Mehrfachsendungen von Geofency raus.
Das Thema der Geofency Webhook-Behandlung ist noch offen (derzeit tcp-Stream, muss in eine "richtige Behandlung des Webhooks geändert werden).
Dadurch, dass die doppelten Meldungen rausgefiltert werden, kann man den Flow nun so benutzen.
Beispiel, wie die Varibalen aufgebaut sind (weitere Verarbeitung, z.B. direkt in VIS, Node-red, Javascript-Adapter, usw.):
-
Du bist mein Held Sau geil dein Flow. durch dein Anschauungsmaterial blicke ich so langsam bei NODE-RED durch
-
.
Anbei die neue Version.
Er ist benutzerfreundlicher für die, die den Flow bisher nicht verwendet haben.
Ein erster Start des Flows, ohne dass man seine eigene Device ID kennt, gibt erst einmal nur die ID aus, damit man diese in der Konfig nach pflegen kann. Dadurch werden, unter Umständen, nicht erwünschte Variablen, nicht angelegt.
Das Verhalten ist nun aber auch konfigurierbar.
Der Flow ist voll funktionsfähig (bei mir jedenfalls).
Das TCP Thema (anderer Topic) bringt derzeit noch folgenden Schönheitsfehler: Etwas mehr Traffic (nicht relevant), durch mehrfach gesendete Standorte. Und ggf. bei sehr schnell wechselnden Standorten (schneller, als der tcp Timeout). Dies tritt bei mir nicht aus, obwohl ich schnell zwischen den "normalen" Standorten und iBeacon Kennungen (z.B. ein iBeacon im Auto) wechsele. Ein anderer Schönheitsfehler ist, dass es sich bei den "normalen" Standorten nicht um GPS handelt, sondern um "Significant Change Location Service" Standorte. Im Variablenbaum heisst es gps und nicht sclss.
Versionshistorie / Änderungen
0.2.1 09.05.2015
Zoomstufe für Openstreetmaps konfigurierbar
tlw. Abfangen und Korrektur von ungültigen Werten in der Konfiguration
Konfiguration nach Init unter geofency.conf.xxxxx speichern.
Kann dort während der Laufzeit verändert werden, (z.B. Kartenzoomstufe über VIS).
beim erneuten Deploy wird auf die Werte aus der Node-Red Konfiguration zurückgesetzt.
Benutzerfreundlicher: unbekannte Device
Im DEFAULT werden unbekannte Devices nicht als Variable angelegt.
Es wird nur das Device ausgegeben. Die Device Kennung kann man dann in der Konfig zuordnen.
Wenn gewünscht (Konfig), werden auch unbekannte Devices angelegt.
Konfig: Möglichkeit unbekannte Devices mit Ihrer ID in den Variablen anzulegen
0.2.0 08.05.2015
Variablen neu vergeben (Baumstruktur)
eigene Variablen für bis zu drei Nutzer + Unbekannt
0.1.2 06.05.2015
Unterscheidung Meldung über GPS Standort oder iBeacon eingebaut
iBeacon Variablen eingebaut
0.1.1 05.05.2015
msg.payload.routes[0].legs[0].end_address (Goolge Maps API Zieladresse) hinzugefügt
Zeitstempel angepasst. Nicht mehr die Zeit zum Zeitpunkt des Funktionsaufruf,
sondern nun wird die Zeit aus der JSON Meldung ausgegeben.
zwei neue Zeiten: Zeitpunkt aus der JSON Meldung als Epoche, aktuelle Zeit als Epoche
Topic den einzelnen Funktionen -> Variablen zugeorndet (bessere Lesbarkeit der Debugmeldung)
Dokumentation im Flow ergänzt
alle globalen Variablen beginnen nun mit gf (context.global.gf….)
Konfigurierbar: nur neuere Meldungen verarbeiten oder auch ältere Meldungen
Anzeige der aktuellen Kofiguration per Knopfdruck im Debug-Fenster
0.1.0 04.05.2015
Erste version im Forum
Ich hatte noch angefangen ein Widget zu basteln.
Da freue ich mich auf die Änderung von Bluefox (danke noch einmal, dass die Idee so schnell aufgegriffen wurde), der Variablen {node-red.0…..} in den VIS-Feldern. Sobald das Feature da ist, schwebt mir ein recht dynamisches Widget vor.
-
Ich überlege, meine Anwesenheitserkennung über die WLAN Erkennung per Skript auf der Fritz!Box auf GeoFency umzustellen. Könnt ihr mir eine brauchbare App für Android empfehlen?
-
Ich überlege, meine Anwesenheitserkennung über die WLAN Erkennung per Skript auf der Fritz!Box auf GeoFency umzustellen. Könnt ihr mir eine brauchbare App für Android empfehlen? `
Ich nutze unter iOS Geofency mit dem Flow hier und parallel Owntracks (der Flow ist auch hier im Forum).
Owntracks hat keine offenen Punkte in der Kommuniktation.
Für Android bekommst Du Owntracks im Google Play Store:
https://play.google.com/store/apps/deta … tude&hl=de
Habe das allerdings unter Android nicht getestet.
Ich bin mal auf Deine Anwesenheitserkennung gespannt.
Die Kombination aus WLAN, Zeitparameter, Türkontakte funktioniert schon sehr gut.
Mit den Geodaten kann man das dann verfeinern.
-
Leider werden anscheinend nicht alle hier eingesetzten Funktion auch von Node-Red unter Windows unterstützt. Die Connection kommt zwar an, aber es gibt weder eine Ausgabe im debug-Fenster noch erhält Geofency eine Rückmeldung. Irgendwann kommt dann eine Zeitüberschreitung und die im Node-Red angezeigt Connection verschwindet wieder. Das gleiche Verhalten habe ich auch bei ausgeschaltener Firewall.
-
Kann niemand dieses Problem bestätigen oder nachvollziehen?
-
Bei mir ist ioBroker mit Node-red unter Debian installiert. Unter Windows sollte es aber auch funktionieren.
Wenn Du den Debug-Node nach dem tcp-Node aktivierst, müsstest Du die Meldungen bekommen. Windows Firewall (hattest Du schon selbst geschrieben) oder Port-Forwarding im Router sind richtig konfiguriert?
-
hallo ruhr70,
ich habe mich heute mal mit deinem gefency Adapterersatz beschäftigt nur bekomme ich in den Objekten nix angezeigt, könntest dir das mal anschauen, hier ist die Ausgabe von node red:
mehr bekomme ich nicht, was fehlt den hier noch?
bin auch noch am verzweifeln wegen der portweiterleitung????
Mit freundlichen Grüßen
909_bildschirmfoto_2015-12-20_um_22.25.20.png -
Hallo,
habe mich auch mal an Node-RED (v0.3.5) rangetraut. Wenn ich allerdings zum testen in der iOS App auf "betreten" klicke, bekomme ich im io.broker Log folgenden Fehler angezeigt:
node-red.0 2016-01-12 15:37:14 warn node-red.0 12 Jan 15:37:14 - [warn] [http request:http request - Google API Route (Auto)] Warning: msg properties can no longer override set node properties. See bit.ly/nr-override-msg-props
Unter dem angegeben Link steht dazu folgendes:
` > Properties can be set in a node or in an incoming message to define behaviour.
For example, when using a file node, either setting 'Filename' in the node or setting msg.filename in an incoming message will read from that file. If both properties are set msg.filename will currently override the node property.
This behaviour is only found in some nodes and can have unexpected consequences as described in this issue. Therefore, message overriding has been deprecated.
In future nodes and future releases msg.some_property will only be used if the property is not set in the node.
Nodes currently using the override functionality will continue to function in this release but will also receive a warning noting that this behaviour is deprecated.
The core nodes and properties affected by this behaviour are:
http request: msg.url and msg.method
email: msg.to
file: msg.filename `
Geofency selbst spuckt auch einen Fehler… Mache ich noch was falsch?
Ich muss ja gestehen, dass der Adapter unter ccu.io leichter zu confen war Leider fehlt das Gegenstück dazu für io.broker leider noch...
Danke!
-
es gibt jetzt auch endlich einen Adapter!