Node-RED: API Calcul du temps de trajet

Feature description

Salut la communauté.

Je voulais savoir si il existait une solution API gratuite ou autre moyen pour avoir sur le dashboard le temps de trajet pour se rendre au travail par exemple et dans mon cas plus particulièrement de savoir le temps de trajet sur les 5 agences ou je travaille pour ne pas arriver en retard au boulot :sweat_smile:

TravelTime API Documentation | Isochrone | Distance Matrix | Directions marche bien et tu peux faire 1000 requêtes par mois gratuitement

https://developer.mapquest.com/documentation/directions-api/optimized-route/get/ autorise 15000 requêtes par mois (jamais essayé)

Overview  |  Distance Matrix API  |  Google Developers Google marche super bien, mais c’est payant (0.005 $ par requête)

Directions | API | Mapbox MapBox est pour moi le meilleur avec 100K requêtes par mois

Par contre, je ne sais pas comment l’afficher dans le Dashboard. Peut-être un périphérique virtuel ?

Merci pour les liens j’ai pris mapbox du coup.

Je l’ai intégré sur node-red et je reçois bien les infos. Il faut que j’arrive à extraire que le temps de trajet maintenant pour récupérer l’infos en mqtt ensuite puis ensuite sur le dashboard.

@Psoy tu gères node red, un peu t’aide si tu peux. Comment je fais pour extraire le duration et de faire un changement pour avoir la réponse en minutes plutôt qu’en secondes

Capture d’écran 2022-02-27 à 10.18.49

Bonjour Jerome
est ce que tes payload ont toujours la même taille et la mem forme à chaque interrogation ?

Jerome
envoies moi une copie de ton flow, s’il te plait.

Visiblement oui la taille et la forme sont identiques à chaque interrogation

Bonjour @jerome
Pour envoyer une copie du flow il faut aller dans le menu à droite / Export
image
Sélectionner “copy to clipboard”


puis venir le copier ici en utilisant </>

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

voici la fonction de conversion seconde en minute. tu crées un node fonction et tu colles de dans :
var input = msg.payload;
input = parseFloat(input);// transforme en nombre
var secondes = String(input % 60); // on recupere le reste qui represente les secondes
var minutes = String(Math.floor(input / 60));// on recupere la partie entiere du quotien qui represent les minutes
msg.payload = minutes + "mn " + secondes +"sec";
return msg;
Attention la ligne :quotien qui represent les minutes
doit être sur la même ligne que
var minutes = ......
Pour capter la duration c’est le même principe que pour recuperer le device rflink, il faut compter les caracteres :wink:

Jerome
et l’émission Rflink c’est bon ?
Pour le flow , j’ai toujours la même erreur que j’avais avec cce66, il y a des quotes à chaque ligne, qui ne sont pas les bonnes,et qui plante le copier coller. il faut des quotes comme ça " et non comme des virgules inversées , je ne sais pas d’où ça vient . :thinking:.

Bonjour cce66,
comment tu pratiques pour avoir ton flow, dans une fenêtre avec un ascenseur? car là les quotes sont bonnes .

type or paste code here

il faut d’abord cliquer sur </> puis cela affiche

type or paste code here

il faut alors coller le code à la place 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":""}]

tu fais un import dans un flow, tu charge ton access token et t’auras en sortie en hh:mm:ss :wink:

Bonjour cce66,
ça y est j’ai compris , je n’avais pas vu le </> dans le menu du haut. A des fois ça gamberge pas vite :weary:
merci encore
bonne journée

Rassures toi, j’ai fais la même ! :wink: C’est bon pour le flow, t’as réussi à l’importer et cela fonctionnes comme tu veux ? Il fallait en fait passer par un json et extraire msg.payload.routes[0].duration et pas msg.payload.duration car duration est issu de “route object” Directions | API | Mapbox là aussi je me suis fait avoir sur une autre api ! :rofl:
et pour afficher le temps de trajet en mn il faut remplacer
msg.payload = (temps.getHours()-1) + “:” + temps.getMinutes() + “:” + temps.getSeconds();
par
msg.payload = ((temps.getHours()-1) *60) + temps.getMinutes() ;
en attendant qu’il y ait dans Gladys la possibilité d’afficher des chaines de caractères !

bonsoir cce66,
Merci c’est bon pour le flow, je découvre cette APi de calcul de temps et je vais approfondir ta méthode de conversion de temps. Pour la" duration", effectivement j’avais appliquée ta méthode dans la gateway Xiaomi, mais je n’y ai pas pensé sur ce coup là et comme Jerome m’ a dit que c’était la même constitution pour tous les messages , je lui ai proposé la méthode lourde: extraire la chaine de caractères correspondant à la valeur de la "duration " en comptant les caractères de la chaine. Mais c’est quand même mieux le Json :wink:

Salut les gars.

Cool merci.

Par contre c’est normal que j’ai -1:33:11 ; le -1 c’est quoi ?

Du coup dans le dashboard il m’affiche que -1

parce que le trajet est inférieur à 1h (temps.getHours()-1) ) met (temps.getHours())) le -1 sert en cas de dépassement de 24h mais là c’est pas utile dans ce cas
donc met juste
msg.payload = (temps.getHours() *60) + temps.getMinutes() ;