Stau-Erkennung mit node-red

Antworten
Benutzeravatar
Bluefox
Site Admin
Beiträge: 8052
Registriert: 13.07.2014, 14:42
Kontaktdaten:

Stau-Erkennung mit node-red

Beitrag von Bluefox » 19.04.2015, 16:54

Man kann einfach mit node-red Stau-Erkennung implementieren. Dafür gibt es von google API:
https://developers.google.com/maps/docu ... irections/

Mit URL:
http://maps.googleapis.com/maps/api/dir ... nsor=false

Kann man die Navigation-Info bekommen, wo auch Dauer drin steht.
Einfach alle Lehrzeichen mit "+" ersetzen und keine Umlaute verwenden, z.B. :

http://maps.googleapis.com/maps/api/dir ... nsor=false

Das ergibt:

Code: Alles auswählen

{
   "routes" : [
      {
         "bounds" : {
            "northeast" : {
               "lat" : 51.3185661,
               "lng" : 9.493659299999999
            },
            "southwest" : {
               "lat" : 51.2938967,
               "lng" : 9.478441199999999
            }
         },
         "copyrights" : "© 2015 GeoBasis-DE/BKG (©2009), Google",
         "legs" : [
            {
               "distance" : {
                  "text" : "3,5 km",
                  "value" : 3491
               },
               "duration" : {
                  "text" : "11 min.",
                  "value" : 645
               },
....
Uns interessiert nur "duration".

Folgendes FLOW macht es:

Code: Alles auswählen

[{"id":"27a1244e.d85edc","type":"http request","name":"Google Direction API LaStrada => Hbf","method":"GET","ret":"obj","url":"http://maps.googleapis.com/maps/api/directions/json?origin=Raiffeisenstrasse+10,+34121+Kassel&destination=Rainer-Dierichs+Platz+1,+34117+Kassel&sensor=false","x":341.7142791748047,"y":31.000003814697266,"z":"d7ecc7ab.281338","wires":[["47fd5be6.b802a4"]]},{"id":"47fd5be6.b802a4","type":"function","name":"Fahrzeit in Minuten","func":"msg.payload = Math.ceil(msg.payload.routes[0].legs[0].duration.value / 60);\n\nreturn msg;","outputs":1,"x":319.857177734375,"y":113.14285278320312,"z":"d7ecc7ab.281338","wires":[["61e25a56.9e1da4","3015c229.cfea3e"]]},{"id":"61e25a56.9e1da4","type":"ioBroker out","name":"","topic":"HeimwegMinutes","ack":"true","autoCreate":"true","x":579,"y":103,"z":"d7ecc7ab.281338","wires":[]},{"id":"e6bd80d2.19428","type":"inject","name":"Trigger","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":93,"y":31,"z":"d7ecc7ab.281338","wires":[["27a1244e.d85edc"]]},{"id":"f6469f31.09b96","type":"ioBroker out","name":"","topic":"HeimwegStau","ack":"true","autoCreate":"true","x":565,"y":275,"z":"d7ecc7ab.281338","wires":[]},{"id":"3015c229.cfea3e","type":"function","name":"Stau?","func":"msg.payload = (msg.payload > 10);\n\nreturn msg;","outputs":1,"x":483,"y":198,"z":"d7ecc7ab.281338","wires":[["f6469f31.09b96"]]}]
google-direction.png
Jetzt muss man nur "Google-Direction"- node mit passende URL versehen, und bei Stau-Funktion die Anzahl von Minuten reinschreiben, die als Stau erkannt werden können.

Benutzeravatar
ruhr70
guru
Beiträge: 2274
Registriert: 24.02.2015, 19:40

Re: Stau-Erkennung mit node-red

Beitrag von ruhr70 » 19.04.2015, 22:03

Das hat mich direkt begeistert. Ich habe das Beispiel für mich wie folgt angepasst:

1.) Die URL um die Alternativerouten ergänzt (am Ende der URL &alternatives=true)

http://maps.googleapis.com/maps/api/dir ... tives=true


2.) Im Node-Red Flow alle drei Routen ausgewertet
2015-04 Node-red Anfahrt zur Arbeit.jpg
Für alle drei Routen wird die Anfahrtzeit erfasst und ermittelt und ob es auf der Route Stau gibt.

Zum Ermitteln der Fahrzeit der zweiten Route muss die entsprechende Funktion z.B. wie folgt angepasst werden:

Code: Alles auswählen

msg.payload = Math.ceil(msg.payload.routes[1].legs[0].duration.value / 60);

return msg;
.routes[0].legs[0] -> erste Route
.routes[1].legs[0] -> zweite Route
.routes[2].legs[0] -> dritte Route

3.) den Namen der drei Routen ausgelesen und in den Variablen gespeichert.

Beispiel für die dritte Route:

Code: Alles auswählen

msg.payload = (msg.payload.routes[2].summary);

return msg;
4.) Die Abfrage über eine Javascript Variable von ioBroker getriggert

Um die regelmässige Abfrage über ioBroker zu triggern (bei mir derzeit alle zwei Minuten) und über ioBroker/Vis die aktuelle Fahrzeit auf Knopfdruck zu übermitteln, triggere ich nicht über das Inject in Node-Red, sondern über eine JavaScript Variable, die alle zwei Minuten auf true gesetzt wird.


Was habe ich damit auf die Schnelle realisiert:

a) Dynamisch Anzeige in einem Status/Alarmfeld in VIS, wenn es auf einer oder mehreren Routen aktuell Stau gibt
b) ein 7-Tage Rickshaw-Chart, um die Entwicklung der Fahrzeiten zu vergleichen
c) in VIS eine Tabelle, in der alle drei Routen mit Namen und Fahrzeit dargestellt werden.

Einen morgendlichen Eintrag in meiner Ereignisliste an einem Arbeitstag und zur Frühstückszeit werde ich noch ergänzen.


Danke Bluefox! Von so Beispielen lebe ich ;-)
Intel NUC (NUC6i5SYH) -> ESXi 6 > VM Ubuntu 16.04 ioBroker (redis) > VM Ubuntu 16.04 mySQL
Slave: Pi 3 ohne SD (Boot USB SLC)
CCU2, hue 2, DS 1512+, WeMos, Harmony Hub, Alexa
Adapter: Fritzbox / Skripte: dynamic hue, Bluetooth Scanner, WIFFI-wz

Benutzeravatar
ruhr70
guru
Beiträge: 2274
Registriert: 24.02.2015, 19:40

Re: Stau-Erkennung mit node-red

Beitrag von ruhr70 » 20.04.2015, 06:18

Kann es sein, dass die Google API die Werte ohne Berücksichtigung der Verkehrssituation zurückgibt?

Ich erhalte je Route immer die identische Zeit.
In Google Maps selbst werden mittlerweile höhere Zeiten angezeigt.

*grummel*

Wen dem so ist, bringt die Funktion leider gar nichts :(
Intel NUC (NUC6i5SYH) -> ESXi 6 > VM Ubuntu 16.04 ioBroker (redis) > VM Ubuntu 16.04 mySQL
Slave: Pi 3 ohne SD (Boot USB SLC)
CCU2, hue 2, DS 1512+, WeMos, Harmony Hub, Alexa
Adapter: Fritzbox / Skripte: dynamic hue, Bluetooth Scanner, WIFFI-wz

Benutzeravatar
ruhr70
guru
Beiträge: 2274
Registriert: 24.02.2015, 19:40

Re: Stau-Erkennung mit node-red

Beitrag von ruhr70 » 21.04.2015, 16:02

ruhr70 hat geschrieben:Kann es sein, dass die Google API die Werte ohne Berücksichtigung der Verkehrssituation zurückgibt?

Ich erhalte je Route immer die identische Zeit.
Kann das jemand bestätigen?
D.h. die Verkehrslage wird nicht brücksichtgt.
Die Zeit bei einer Route ändert sich nicht.

Oder muss ich bei mir noch einen Fehler bei mir suchen?
Intel NUC (NUC6i5SYH) -> ESXi 6 > VM Ubuntu 16.04 ioBroker (redis) > VM Ubuntu 16.04 mySQL
Slave: Pi 3 ohne SD (Boot USB SLC)
CCU2, hue 2, DS 1512+, WeMos, Harmony Hub, Alexa
Adapter: Fritzbox / Skripte: dynamic hue, Bluetooth Scanner, WIFFI-wz

Benutzeravatar
Bluefox
Site Admin
Beiträge: 8052
Registriert: 13.07.2014, 14:42
Kontaktdaten:

Re: Stau-Erkennung mit node-red

Beitrag von Bluefox » 21.04.2015, 16:29

ruhr70 hat geschrieben:
ruhr70 hat geschrieben:Kann es sein, dass die Google API die Werte ohne Berücksichtigung der Verkehrssituation zurückgibt?

Ich erhalte je Route immer die identische Zeit.
Kann das jemand bestätigen?
D.h. die Verkehrslage wird nicht brücksichtgt.
Die Zeit bei einer Route ändert sich nicht.

Oder muss ich bei mir noch einen Fehler bei mir suchen?
Ja ist leider so. :(
Es geht nur mit API Key.

Code: Alles auswählen

&key=API_KEY

Benutzeravatar
ruhr70
guru
Beiträge: 2274
Registriert: 24.02.2015, 19:40

Re: Stau-Erkennung mit node-red

Beitrag von ruhr70 » 03.05.2015, 21:47

Ich würde gerne die Routenberechnung auch dynamisch nutzen.
D.h. das Ziel verändert sich.

Dazu müsste ich die URL in der http request node tlw. mit Variablen schreiben (so, wie von Bluefox in Vis in Arbeit).

Weiss jemand, ob dies möglich ist und wenn ja, wie der Syntax ist?
2015-05-03 http request dynamisch.png
Intel NUC (NUC6i5SYH) -> ESXi 6 > VM Ubuntu 16.04 ioBroker (redis) > VM Ubuntu 16.04 mySQL
Slave: Pi 3 ohne SD (Boot USB SLC)
CCU2, hue 2, DS 1512+, WeMos, Harmony Hub, Alexa
Adapter: Fritzbox / Skripte: dynamic hue, Bluetooth Scanner, WIFFI-wz

Benutzeravatar
Bluefox
Site Admin
Beiträge: 8052
Registriert: 13.07.2014, 14:42
Kontaktdaten:

Re: Stau-Erkennung mit node-red

Beitrag von Bluefox » 04.05.2015, 08:42

Code: Alles auswählen

[{"id":"ed13881b.12ec78","type":"inject","name":"","topic":"","payload":"http://iobroker.com","payloadType":"string","repeat":"","crontab":"","once":false,"x":149,"y":58,"z":"d8cc32bf.2733d","wires":[["6e3ec92f.91c138"]]},{"id":"16432cfe.e9bcd3","type":"debug","name":"","active":true,"console":"false","complete":"false","x":720,"y":125,"z":"d8cc32bf.2733d","wires":[]},{"id":"6e3ec92f.91c138","type":"function","name":"Create request","func":"var newMsg = {\n    method: 'GET',\n    url: msg.payload\n}\nreturn newMsg;","outputs":1,"valid":true,"x":337,"y":124,"z":"d8cc32bf.2733d","wires":[["88a0d151.775f3"]]},{"id":"88a0d151.775f3","type":"http request","name":"","method":"GET","ret":"txt","url":"","x":491,"y":126,"z":"d8cc32bf.2733d","wires":[["16432cfe.e9bcd3"]]},{"id":"8b98a428.746758","type":"inject","name":"","topic":"","payload":"http://wikipedia.com","payloadType":"string","repeat":"","crontab":"","once":false,"x":130,"y":123,"z":"d8cc32bf.2733d","wires":[["6e3ec92f.91c138"]]},{"id":"b0e64a7b.4f19b8","type":"ioBroker in","name":"","topic":"myUrl","payloadType":"value","x":147,"y":229,"z":"d8cc32bf.2733d","wires":[["6e3ec92f.91c138"]]}]
node.png

Benutzeravatar
ruhr70
guru
Beiträge: 2274
Registriert: 24.02.2015, 19:40

Re: Stau-Erkennung mit node-red

Beitrag von ruhr70 » 04.05.2015, 21:47

Hi Bluefox,

erst einmal vielen, vielen Dank für die schnelle Antwort!
Ich konnte es direkt in meinem Geofency Flow verarbeiten :-)

Ich bekomme noch jedes Mal eine Warnmeldung, wenn die Funktion und der http request durchläuft:

[http request]
[msg] : (string)
Deprecated: msg properties should not override fixed node properties. Use explicit override option. See http://bit.ly/nr-override-msg-props


Mit dem Link in der Meldung bin ich nicht schlauer geworden.
Derzeit verbuche ich es als "Schönheitsfehler" ;-)

VG
Michael
Intel NUC (NUC6i5SYH) -> ESXi 6 > VM Ubuntu 16.04 ioBroker (redis) > VM Ubuntu 16.04 mySQL
Slave: Pi 3 ohne SD (Boot USB SLC)
CCU2, hue 2, DS 1512+, WeMos, Harmony Hub, Alexa
Adapter: Fritzbox / Skripte: dynamic hue, Bluetooth Scanner, WIFFI-wz

Antworten