Node-RED: API zur Berechnung der Reisezeit

Funktionsbeschreibung

Hallo Community.

Ich wollte wissen, ob es eine kostenlose API-Lösung oder eine andere Möglichkeit gibt, um auf dem Dashboard die Reisezeit zur Arbeit anzuzeigen, und in meinem Fall speziell die Reisezeit zu den 5 Agenturen, in denen ich arbeite, um nicht zu spät zur Arbeit zu kommen :sweat_smile:

TravelTime API Documentation | Isochrone | Distance Matrix | Directions funktioniert gut und du kannst 1.000 Anfragen pro Monat kostenlos machen

Directions API | MapQuest Developer Documentation erlaubt 15.000 Anfragen pro Monat (noch nie ausprobiert)

Présentation de l'API Distance Matrix (ancienne version)  |  Distance Matrix API (Legacy)  |  Google for Developers Google funktioniert super, aber es ist kostenpflichtig (0,005 $ pro Anfrage)

Directions API | API Docs | Mapbox MapBox ist für mich der beste mit 100.000 Anfragen pro Monat

Allerdings weiß ich nicht, wie ich es im Dashboard anzeigen soll. Vielleicht ein virtuelles Gerät?

Danke für die Links, ich habe mich für Mapbox entschieden.

Ich habe es in Node-RED integriert und die Informationen werden korrekt empfangen. Jetzt muss ich es schaffen, nur die Fahrzeit zu extrahieren, um die Informationen anschließend über MQTT und dann im Dashboard zu erhalten.

@Psoy du kennst dich mit Node-RED aus, könntest du mir ein bisschen helfen? Wie kann ich die Dauer extrahieren und eine Umrechnung vornehmen, um die Antwort in Minuten statt in Sekunden zu erhalten

Hallo Jerome
Haben deine Payloads immer die gleiche Größe und die gleiche Form bei jeder Abfrage?

Jerome
schick mir bitte eine Kopie deines Flows.

Offensichtlich sind die Größe und die Form bei jeder Abfrage identisch

Hallo @jerome
Um eine Kopie des Ablaufs zu senden, gehen Sie zum Menü rechts / Export


« In die Zwischenablage kopieren » auswählen

und dann hier einfügen, indem Sie </> verwenden

< [ { "id": "2aa6c7d0d6c34c69", "type": "http request", "z": "78945adb8706e343", "name": "Api Trajet Les Andelys", "method": "GET", "ret": "txt", "paytoqs": "ignore", "url": "https://api.mapbox.com/directions/v5/mapbox/driving-traffic/01.XXXXXX,49.XXXXXXX;01.41859,49.24665?access_token=XXXXXXXXXXXXXXX", "tls": "", "persist": false, "proxy": "", "authType": "", "senderr": false, "x": 440, "y": 60, "wires": [ [ "902eeb605ce660fd", "d03b888bd26d03f2" ] ] }, { "id": "6ea28c57b0da3a95", "type": "inject", "z": "78945adb8706e343", "name": "Toutes les heures", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "3600", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "", "payloadType": "date", "x": 150, "y": 60, "wires": [ [ "2aa6c7d0d6c34c69" ] ] }, { "id": "902eeb605ce660fd", "type": "debug", "z": "78945adb8706e343", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 590, "y": 120, "wires": [] }, { "id": "d03b888bd26d03f2", "type": "function", "z": "78945adb8706e343", "name": "Extraire Durée", "func": "msg.payload=msg.payload.duration\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 740, "y": 60, "wires": [ [ "da8870c4b442b262", "9a4c9dd06fabf7df" ] ] }, { "id": "da8870c4b442b262", "type": "mqtt out", "z": "78945adb8706e343", "name": "Trajet Les Andelys", "topic": "gladys/master/device/mqtt:les-andelys/feature/mqtt:les-andelys/state", "qos": "2", "retain": "", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "b43615cb2732e077", "x": 970, "y": 60, "wires": [] }, { "id": "9a4c9dd06fabf7df", "type": "debug", "z": "78945adb8706e343", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 870, "y": 120, "wires": [] }, { "id": "b43615cb2732e077", "type": "mqtt-broker", "name": "", "broker": "mqtt://localhost", "port": "1883", "clientid": "", "autoConnect": true, "usetls": false, "protocolVersion": "4", "keepalive": "60", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "birthMsg": {}, "closeTopic": "", "closeQos": "0", "closePayload": "", "closeMsg": {}, "willTopic": "", "willQos": "0", "willPayload": "", "willMsg": {}, "sessionExpiry": "" } ] >

Hier ist die Umrechnungsfunktion von Sekunden in Minuten. Du erstellst einen Node-Funktion und fügst dort ein:
var input = msg.payload;
input = parseFloat(input);// in eine Zahl umwandeln
var secondes = String(input % 60); // wir holen den Rest, der die Sekunden darstellt
var minutes = String(Math.floor(input / 60));// wir holen den ganzzahligen Teil des Quotienten, der die Minuten darstellt
msg.payload = minutes + "mn " + secondes +"sec";
return msg;
Achtung, die Zeile:Quotient, der die Minuten darstellt
muss in derselben Zeile wie
var minutes = ......
stecken. Um die Dauer zu erfassen, ist es dasselbe Prinzip wie beim Abrufen des Geräts rflink, man muss die Zeichen zählen :wink:

Jerome
Ist die Sendung Rflink gut?
Beim Flow habe ich immer noch denselben Fehler wie mit cce66. Es gibt Anführungszeichen in jeder Zeile, die nicht die richtigen sind und den Kopiervorgang stören. Es sollten Anführungszeichen wie diese " sein und keine umgekehrten Kommas. Ich weiß nicht, woher das kommt. :thinking:.

Hallo cce66,
how do you practice to get your flow in a window with a scrollbar? Because the quotes are good here.

type or paste code here

Man muss zuerst auf </> klicken, dann wird
…
type or paste code here
…angezeigt
Man muss dann den Code anstelle von « type or paste code here » einfügen

[{"id":"56b83b7bec2eff35","type":"tab","label":"Flow 2","disabled":false,"info":"","env":[]},{"id":"2aa6c7d0d6c34c69","type":"http request","z":"56b83b7bec2eff35","name":"Api Trajet Les Andelys","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://api.mapbox.com/directions/v5/mapbox/driving-traffic/42.586364, 2.370217;01.41859,49.24665?access_token=pk.eyJ1IjoianVtb3JlYXVqdSIsImEiOiJjbDA3Y2g3OGUwMzhmM29xMGR2OGJocHJwIn0.VYT4Y8Hd_of5tKXqluVjng","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":380,"y":220,"wires":[["902eeb605ce660fd","d35d5f8df3edeeea"]]},{"id":"6ea28c57b0da3a95","type":"inject","z":"56b83b7bec2eff35","name":"Toutes les heures","props":[{"p":"payload"}],"repeat":"3600","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":220,"wires":[["2aa6c7d0d6c34c69"]]},{"id":"902eeb605ce660fd","type":"debug","z":"56b83b7bec2eff35","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":590,"y":280,"wires":[]},{"id":"da8870c4b442b262","type":"mqtt out","z":"56b83b7bec2eff35","name":"Trajet Les Andelys","topic":"gladys/master/device/mqtt:les-andelys/feature/mqtt:les-andelys/state","qos":"2","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"b43615cb2732e077","x":950,"y":220,"wires":[]},{"id":"9a4c9dd06fabf7df","type":"debug","z":"56b83b7bec2eff35","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":890,"y":280,"wires":[]},{"id":"d35d5f8df3edeeea","type":"json","z":"56b83b7bec2eff35","name":"","property":"payload","action":"obj","pretty":false,"x":570,"y":220,"wires":[["4e6f68ad1abebbb4"]]},{"id":"4e6f68ad1abebbb4","type":"function","z":"56b83b7bec2eff35","name":"duration","func":"var duration=msg.payload.routes[0].duration;\n\n// transforme en nombre\nduration = parseFloat(duration);\n\n// convertit en hh:mn:ss\nvar temps=new Date();\ntemps.setTime(duration*1000);\nmsg.payload = (temps.getHours()-1) + \":\" + temps.getMinutes() + \":\" + temps.getSeconds();\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":720,"y":220,"wires":[["9a4c9dd06fabf7df","da8870c4b442b262"]]},{"id":"b43615cb2732e077","type":"mqtt-broker","name":"","broker":"mqtt://localhost","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]

Du importierst in einen Flow, lädst deinen Access-Token und erhältst als Ausgabe hh:mm:ss :wink:

Hallo cce66,
jetzt habe ich es verstanden, ich hatte das </> im oberen Menü nicht gesehen. Manchmal denkt es nicht so schnell :weary:
nochmals danke
schönen Tag

Keine Sorge, ich habe das Gleiche gemacht! :wink: Es ist gut für den Flow, hast du es importiert und funktioniert es so, wie du es möchtest? Man muss in Wirklichkeit über ein JSON gehen und msg.payload.routes[0].duration und nicht msg.payload.duration extrahieren, weil duration aus dem « route object » stammt Directions API | API Docs | Mapbox Da habe ich mich auch bei einer anderen API erwischen lassen! :rofl: Und um die Fahrzeit in Minuten anzuzeigen, muss man
msg.payload = (temps.getHours()-1) + « : » + temps.getMinutes() + « : » + temps.getSeconds();
durch
msg.payload = ((temps.getHours()-1) *60) + temps.getMinutes() ;
ersetzen, bis es in Gladys die Möglichkeit gibt, Zeichenketten anzuzeigen!

Hallo cce66,
Danke, das Flow funktioniert. Ich entdecke gerade diese API zur Zeitberechnung und werde deine Methode zur Zeitumrechnung vertiefen. Bei der „duration“ habe ich tatsächlich deine Methode in der Xiaomi-Gateway angewendet, aber darauf bin ich diesmal nicht gekommen. Und da Jerome mir gesagt hat, dass alle Nachrichten den gleichen Aufbau haben, habe ich ihm die umständliche Methode vorgeschlagen: den Zeichenstring, der dem Wert der „duration“ entspricht, durch Zählen der Zeichen im String extrahieren. Aber JSON ist trotzdem besser :wink:

Hallo Jungs.

Cool, danke.

Aber ist es normal, dass ich -1:33:11 habe? Was bedeutet das -1?

Deshalb zeigt mir das Dashboard -1 an

denn die Fahrtzeit ist weniger als 1 Stunde (temps.getHours()-1) ) setzt (temps.getHours())) das -1 dient im Falle einer Überschreitung von 24 Stunden, aber hier ist es in diesem Fall nicht nötig
daher einfach
msg.payload = (temps.getHours() *60) + temps.getMinutes() ;