Node-RED: API Cálculo del tiempo de viaje

Descripción de la función

Hola comunidad.

Quería saber si existe una solución API gratuita u otro medio para tener en el panel de control el tiempo de desplazamiento para ir al trabajo, por ejemplo, y en mi caso, más concretamente, saber el tiempo de desplazamiento a las 5 agencias donde trabajo para no llegar tarde al trabajo :sweat_smile:

TravelTime API Documentation | Isochrone | Distance Matrix | Directions funciona bien y puedes hacer 1000 solicitudes al mes de forma gratuita

Directions API | MapQuest Developer Documentation permite 15000 solicitudes al mes (nunca lo he probado)

Présentation de l'API Distance Matrix (ancienne version)  |  Distance Matrix API (Legacy)  |  Google for Developers Google funciona muy bien, pero es de pago (0.005 $ por solicitud)

Directions API | API Docs | Mapbox Para mí, MapBox es el mejor con 100K solicitudes al mes

Sin embargo, no sé cómo mostrarlo en el Panel de control. ¿Quizás un dispositivo virtual?

Gracias por los enlaces, al final he cogido mapbox.

Lo he integrado en node-red y recibo bien las infos. Ahora tengo que extraer solo el tiempo de viaje para recuperar la info en mqtt y luego en el dashboard.

@Psoy ¿tú controlas node red? ¿Podrías echarme una mano? ¿Cómo hago para extraer la duración y hacer un cambio para tener la respuesta en minutos en lugar de en segundos?

Hola Jerome
¿Tus payloads siempre tienen el mismo tamaño y la misma forma en cada consulta?

Jerome
envíame una copia de tu flujo, por favor.

Visiblemente, sí, el tamaño y la forma son idénticos en cada consulta

Hola @jerome
Para enviar una copia del flujo hay que ir al menú de la derecha / Exportar


Seleccionar « copiar al portapapeles »

y luego pegarlo aquí usando </>

< [ { "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": "Todas las horas", "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": "Extraer Duración", "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": "" } ] >

aquí está la función de conversión de segundos a minutos. creas un nodo de función y pegas esto:
var input = msg.payload;
input = parseFloat(input);// convierte en número
var segundos = String(input % 60); // se recupera el resto que representa los segundos
var minutos = String(Math.floor(input / 60));// se recupera la parte entera del cociente que representa los minutos
msg.payload = minutos + "mn " + segundos +"seg";
return msg;
Atención la línea :cociente que representa los minutos
debe estar en la misma línea que
var minutos = ......
Para capturar la duración es el mismo principio que para recuperar el dispositivo rflink, hay que contar los caracteres :wink:

Jerome
et el programa Rflink ¿está bien?
Para el flujo, siempre tengo el mismo error que tenía con cce66, hay comillas en cada línea, que no son las correctas, y que hacen que el copiar y pegar falle. Se necesitan comillas como estas " y no como comillas invertidas, no sé de dónde viene. :thinking:.

Hola cce66,
¿cómo lo haces para tener tu flujo en una ventana con un ascensor? porque ahí las citas son buenas.

type or paste code here

hay que hacer clic en </> y luego se muestra
…
type or paste code here
…
se debe pegar el código en lugar de « type or paste code here »

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

haces una importación en un flujo, cargas tu access token y tendrás como salida en hh:mm:ss :wink:

Hola cce66,
¡ya lo entendí, no había visto el </> en el menú superior! A veces no se me ocurre rápido :weary:
¡gracias de nuevo!
buen día

Tranquilo, ¡yo también lo hice! :wink: Es bueno para el flujo, ¿lograste importarlo y funciona como quieres? En realidad, había que pasar por un json y extraer msg.payload.routes[0].duration y no msg.payload.duration porque duration proviene del « route object » Directions API | API Docs | Mapbox ¡También me engañó en otra API! :rofl:

Y para mostrar el tiempo de viaje en minutos, hay que reemplazar
msg.payload = (temps.getHours()-1) + « : » + temps.getMinutes() + « : » + temps.getSeconds();
por
msg.payload = ((temps.getHours()-1) *60) + temps.getMinutes() ;
en espera de que en Gladys haya la posibilidad de mostrar cadenas de caracteres!

buenas noches cce66,
Gracias, está bien para el flujo, estoy descubriendo esta API de cálculo de tiempo y voy a profundizar en tu método de conversión de tiempo. Para la « duration », efectivamente, había aplicado tu método en la gateway Xiaomi, pero no se me ocurrió en este caso y como Jerome me dijo que era la misma constitución para todos los mensajes, le propuse el método pesado: extraer la cadena de caracteres correspondiente al valor de la « duration » contando los caracteres de la cadena. Pero el Json es mejor de todos modos :wink:

Hola chicos.

Genial, gracias.

Por cierto, ¿es normal que tenga -1:33:11? ¿Qué significa el -1?

Por lo tanto, en el panel de control me muestra -1

porque el viaje es inferior a 1h (temps.getHours()-1) ) pone (temps.getHours())) el -1 sirve en caso de exceder las 24h pero aquí no es útil en este caso
debe poner solo
msg.payload = (temps.getHours() *60) + temps.getMinutes() ;