NEWS

Stau-Erkennung mit node-red


  • 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:

    {
       "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:

    [{"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"]]}]
    
    

    48_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.


  • 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

    327_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:

    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:

    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 😉


  • 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 😞


  • @ruhr70:

    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?


  • @ruhr70:

    @ruhr70:

    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.

    &key=API_KEY
    

  • 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?

    327_2015-05-03_http_request_dynamisch.png


  • [{"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"]]}]
    

    48_node.png


  • 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

Suggested Topics

815
Online

38.4k
Users

43.9k
Topics

613.2k
Posts