TEMPO node-RED API EDF

Bonjour a tous,
ma gestion EDF TEMPO dans mon ESS (NODE-RED) ne fonctionne plus car l’API EDF est HS
j’ai trouvé sur le net “FABIC” (merci a lui) qui a trouvé une solution en passant pas l’API RTE
je vous met le lien pour ce qui cela intéresse
cordialement

Hello everyone,
my EDF TEMPO management in my ESS (NODE-RED) no longer works because the EDF API is HS
I found on the net “FABIC” (thanks to him) who found a solution by going through the RTE API
I give you the link for those who are interested
cordially

Je partage mon flux réalisé à partir de api-couleur-tempo.fr et non directement de l’API RTE. Ce site simplifie légèrement la mise en oeuvre car il ne nécessite pas de compte utilisateur ni de token.

[{"id":"707bfa6aa3b4b4a0","type":"tab","label":"EDF","disabled":false,"info":"","env":[]},{"id":"e2891a8732bb9133","type":"inject","z":"707bfa6aa3b4b4a0","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"},{"p":"delay","v":"900000","vt":"num"},{"p":"max_retries","v":"3","vt":"num"}],"repeat":"3600","crontab":"","once":true,"onceDelay":"1","topic":"","payload":"","payloadType":"date","x":110,"y":40,"wires":[["2a647c1378e02aad"]]},{"id":"4cf442c77ec8cdd2","type":"inject","z":"707bfa6aa3b4b4a0","name":"06:01","props":[{"p":"payload"},{"p":"topic","vt":"str"},{"p":"delay","v":"300000","vt":"num"},{"p":"max_retries","v":"2","vt":"num"}],"repeat":"","crontab":"01 06 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":100,"y":120,"wires":[["2a647c1378e02aad"]]},{"id":"c4929c1aa960a163","type":"inject","z":"707bfa6aa3b4b4a0","name":"22:01","props":[{"p":"payload"},{"p":"topic","vt":"str"},{"p":"delay","v":"300000","vt":"num"},{"p":"max_retries","v":"2","vt":"num"}],"repeat":"","crontab":"01 22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":100,"y":160,"wires":[["2a647c1378e02aad"]]},{"id":"32c5ddfda06248b5","type":"inject","z":"707bfa6aa3b4b4a0","name":"00:01","props":[{"p":"payload"},{"p":"topic","vt":"str"},{"p":"delay","v":"300000","vt":"num"},{"p":"max_retries","v":"2","vt":"num"}],"repeat":"","crontab":"01 00 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":100,"y":80,"wires":[["2a647c1378e02aad"]]},{"id":"4fe5995075ba4b7d","type":"http request","z":"707bfa6aa3b4b4a0","name":"Jours Tempo","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://www.api-couleur-tempo.fr/api/joursTempo?dateJour[]={{{dateJ0}}}&dateJour[]={{{dateJ1}}}","tls":"45b6751b593261a4","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":650,"y":160,"wires":[["402b7715133ee8e0"]]},{"id":"5631cadcbd636f8b","type":"function","z":"707bfa6aa3b4b4a0","name":"TEMPO J0","func":"let codeJour;\n\nif (msg.payload[0].dateJour == msg.dateJ0) {\n    codeJour = msg.payload[0].codeJour;\n} else if (msg.payload[1].dateJour == msg.dateJ0) {\n    codeJour = msg.payload[1].codeJour;\n}\n\nswitch (codeJour) {\n    case 1:\n        node.status({ fill: \"blue\", shape: \"dot\", text: \"BLEU \" + msg.dateJ0 });\n        msg.payload = 1;\n        break;\n    case 2:\n        node.status({ fill: \"grey\", shape: \"dot\", text: \"BLANC \" + msg.dateJ0 });\n        msg.payload = 2;\n        break;\n    case 3:\n        node.status({ fill: \"red\", shape: \"dot\", text: \"ROUGE \" + msg.dateJ0 });\n        msg.payload = 3;\n        break;\n    default:\n        node.status({ fill: \"yellow\", shape: \"dot\", text: \"??? \" + msg.dateJ0 });\n        msg.payload = 0;\n}\n\nmsg.topic = \"EDF/Tempo/J0\"\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1170,"y":160,"wires":[["011a36635ecfecb5","aa3e8abc38212466"]]},{"id":"fe4269e1a6936a4c","type":"function","z":"707bfa6aa3b4b4a0","name":"TEMPO J1","func":"const date = new Date();\nlet codeJour = 0;\n\n// Toujours incertain entre 6 et 11h\nif (date.getHours() >= 11 || date.getHours() < 6) {\n    if (msg.payload[1].dateJour == msg.dateJ1) {\n        codeJour = msg.payload[1].codeJour;\n    } else if (msg.payload[0].dateJour == msg.dateJ1) {\n        codeJour = msg.payload[0].codeJour;\n    }\n}\n\nswitch (codeJour) {\n    case 1:\n        node.status({ fill: \"blue\", shape: \"dot\", text: \"BLEU \" + msg.dateJ1 });\n        msg.payload = 1;\n        break;\n    case 2:\n        node.status({ fill: \"grey\", shape: \"dot\", text: \"BLANC \" + msg.dateJ1 });\n        msg.payload = 2;\n        break;\n    case 3:\n        node.status({ fill: \"red\", shape: \"dot\", text: \"ROUGE \" + msg.dateJ1 });\n        msg.payload = 3;\n        break;\n    default:\n        node.status({ fill: \"yellow\", shape: \"dot\", text: \"??? \" + msg.dateJ1 });\n        msg.payload = 0;\n}\n\nmsg.topic = \"EDF/Tempo/J1\"\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1170,"y":220,"wires":[["0da0154f82762fb3","aa3e8abc38212466"]]},{"id":"2a647c1378e02aad","type":"function","z":"707bfa6aa3b4b4a0","name":"Horaire, Dates","func":"const date = new Date();\nlet hours = date.getHours();\nlet tz, time, dateJ0, dateJ1;\n\n// set date as it is UTC\ntz = -date.getTimezoneOffset();\ntime = date.getTime();\ndate.setTime(time+tz*60*1000);\n\nmsg.topic = 'EDF/Horaire';\n\n// Toutes les journées TEMPO commencent par la période des heures pleines suivie de la période des heures creuses (PM suivi de AM)\nif (hours >= 6 && hours < 22) {\n    // 0: Heures pleine\n    msg.payload = 0;\n    node.status({ fill: \"grey\", shape: \"dot\", text: \"HP\" });\n} else {\n    if (hours >= 22) {\n        // 1: Heures creuses avant minuit (PM)\n        msg.payload = 1;\n        node.status({ fill: \"grey\", shape: \"ring\", text: \"HC (PM)\" });\n    } else {\n        // 2: Heures creuses après minuit (AM)\n        msg.payload = 2;\n        time = date.getTime() - 24*60*60*1000;\n        date.setTime(time);\n        node.status({ fill: \"grey\", shape: \"ring\", text: \"HC (AM)\" });\n    }\n}\n\nmsg.dateJ0 = date.toISOString().substring(0,10);\ntime = date.getTime() + 24*60*60*1000;\ndate.setTime(time);\nmsg.dateJ1 = date.toISOString().substring(0,10);\n\nmsg.retry_counter = 0;\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":100,"wires":[["8e44b1d098f935be","011a36635ecfecb5","aa3e8abc38212466"]]},{"id":"402b7715133ee8e0","type":"switch","z":"707bfa6aa3b4b4a0","name":"Status","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"num"},{"t":"neq","v":"200","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":810,"y":160,"wires":[["320c09a35b6ec042"],["24814366eaf3546b"]]},{"id":"24814366eaf3546b","type":"switch","z":"707bfa6aa3b4b4a0","name":"Max retries","property":"retry_counter","propertyType":"msg","rules":[{"t":"gte","v":"max_retries","vt":"msg"},{"t":"lt","v":"max_retries","vt":"msg"}],"checkall":"false","repair":false,"outputs":2,"x":970,"y":220,"wires":[["5631cadcbd636f8b","fe4269e1a6936a4c"],["bc797ae25448c924"]]},{"id":"bc797ae25448c924","type":"function","z":"707bfa6aa3b4b4a0","name":"Increment","func":"msg.retry_counter++;\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":180,"y":220,"wires":[["e85d605a35908c82"]]},{"id":"e85d605a35908c82","type":"delay","z":"707bfa6aa3b4b4a0","name":"Delay","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":330,"y":220,"wires":[["8e44b1d098f935be"]]},{"id":"8e44b1d098f935be","type":"function","z":"707bfa6aa3b4b4a0","name":"Counter","func":"node.status({fill:\"grey\", shape:\"dot\", text: msg.retry_counter + \" / \" + msg.max_retries});\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":160,"wires":[["4fe5995075ba4b7d"]]},{"id":"320c09a35b6ec042","type":"json","z":"707bfa6aa3b4b4a0","name":"JSON","property":"payload","action":"obj","pretty":false,"x":990,"y":160,"wires":[["5631cadcbd636f8b","fe4269e1a6936a4c"]]},{"id":"efa6968301e2c54d","type":"ui_text","z":"707bfa6aa3b4b4a0","group":"bae23f72ed5c5061","order":1,"width":6,"height":1,"name":"Couleur J0","label":"Maintenant","format":"{{msg.payload}}","layout":"col-center","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":1670,"y":100,"wires":[]},{"id":"2d6d4fed2f202390","type":"ui_text","z":"707bfa6aa3b4b4a0","group":"bae23f72ed5c5061","order":2,"width":6,"height":1,"name":"Couleur J1","label":"Demain (à.p.d. 6h00)","format":"{{msg.payload}}","layout":"col-center","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":1670,"y":160,"wires":[]},{"id":"011a36635ecfecb5","type":"join","z":"707bfa6aa3b4b4a0","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":" ","joinerType":"str","useparts":true,"accumulate":true,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":1350,"y":100,"wires":[["69c76145a1b08e30"]]},{"id":"69c76145a1b08e30","type":"function","z":"707bfa6aa3b4b4a0","name":"Format","func":"var text = '';\nswitch (msg.payload['EDF/Tempo/J0']) {\n    case 1: text = 'BLEU'; break;\n    case 2: text = 'BLANC'; break;\n    case 3: text = 'ROUGE'; break;\n    default: text = '???';    \n}\n\nswitch (msg.payload['EDF/Horaire']) {\n    case 0: text += ' HP'; break;\n    case 1: text += ' HC (PM)'; break;\n    case 2: text += ' HC (AM)'; break;\n    default: text += ' ??';    \n}\n\nnode.status({ fill: \"grey\", shape: \"dot\", text: text });\n\nmsg.payload = text\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1500,"y":100,"wires":[["efa6968301e2c54d"]]},{"id":"0da0154f82762fb3","type":"function","z":"707bfa6aa3b4b4a0","name":"Format","func":"var text = '';\nswitch (msg.payload) {\n    case 1: text = 'BLEU'; break;\n    case 2: text = 'BLANC'; break;\n    case 3: text = 'ROUGE'; break;\n    default: text = '???';    \n}\n\nnode.status({ fill: \"grey\", shape: \"dot\", text: text });\n\nmsg.payload = text\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1500,"y":160,"wires":[["2d6d4fed2f202390"]]},{"id":"3979fd696f3261b0","type":"debug","z":"707bfa6aa3b4b4a0","name":"debug 17","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":640,"y":300,"wires":[]},{"id":"1fcb7cc13aea0439","type":"catch","z":"707bfa6aa3b4b4a0","name":"Exceptions","scope":null,"uncaught":true,"x":480,"y":300,"wires":[["3979fd696f3261b0","4fe5995075ba4b7d","ae1ba7def011bb85"]]},{"id":"4f972b8599dc02e4","type":"inject","z":"707bfa6aa3b4b4a0","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"},{"p":"delay","v":"1800000","vt":"num"},{"p":"max_retries","v":"12","vt":"num"}],"repeat":"","crontab":"01 12 * * *","once":true,"onceDelay":"1","topic":"","payload":"","payloadType":"date","x":110,"y":360,"wires":[["c0ec6bbb5d5cd102"]]},{"id":"ae1ba7def011bb85","type":"http request","z":"707bfa6aa3b4b4a0","name":"Jours Tempo","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://www.api-couleur-tempo.fr/api/joursTempo?periode={{{payload}}}","tls":"45b6751b593261a4","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":650,"y":420,"wires":[["caac4579b3f214b8"]]},{"id":"9ef2c0242cd044e8","type":"function","z":"707bfa6aa3b4b4a0","name":"Tempo jours par couleur","func":"var msg1 = { topic: \"EDF/Tempo/Compteurs/Bleu\", payload: 0 };\nvar msg2 = { topic: \"EDF/Tempo/Compteurs/Blanc\", payload: 0};\nvar msg3 = { topic: \"EDF/Tempo/Compteurs/Rouge\", payload: 0};\n\nfor (var item of msg.payload) {\n    switch (item.codeJour) {\n        case 1: msg1.payload++; break;\n        case 2: msg2.payload++; break;\n        case 3: msg3.payload++; break;\n    }\n};\n\nnode.status({fill: \"grey\", shape: \"dot\", text: msg1.payload+\"/\"+msg2.payload+\"/\"+msg3.payload});\n\nreturn [msg1,msg2,msg3];\n","outputs":3,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1210,"y":420,"wires":[["a0e837b0df61ef9f","aa3e8abc38212466"],["aa1b810b75929c50","aa3e8abc38212466"],["9de9958095be18df","aa3e8abc38212466"]]},{"id":"c0ec6bbb5d5cd102","type":"function","z":"707bfa6aa3b4b4a0","name":"Tempo période","func":"const date = new Date();\n\nlet day = date.getDate();\nlet month = date.getMonth() + 1;\nlet year = date.getFullYear();\n\nmsg.topic = \"EDF/Tempo/Compteurs/Periode\"\n\nif (month >= 9) {\n    msg.payload = year+\"-\"+(year+1);\n} else {\n    msg.payload = (year-1)+\"-\"+year;\n}\n\nnode.status({ fill: \"grey\", shape: \"ring\", text: msg.payload });\n\nmsg.retry_counter = 0;\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":360,"wires":[["a8f2302a0457caf4","ee6a5a53b48ab846","aa3e8abc38212466"]]},{"id":"caac4579b3f214b8","type":"switch","z":"707bfa6aa3b4b4a0","name":"Status","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"num"},{"t":"neq","v":"200","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":810,"y":420,"wires":[["4e75650607404cca"],["2a07871befd4975d"]]},{"id":"2a07871befd4975d","type":"switch","z":"707bfa6aa3b4b4a0","name":"Max retries","property":"retry_counter","propertyType":"msg","rules":[{"t":"gte","v":"max_retries","vt":"msg"},{"t":"lt","v":"max_retries","vt":"msg"}],"checkall":"false","repair":false,"outputs":2,"x":970,"y":480,"wires":[[],["e956d04b0250dc23"]]},{"id":"e956d04b0250dc23","type":"function","z":"707bfa6aa3b4b4a0","name":"Increment","func":"msg.retry_counter++;\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":180,"y":480,"wires":[["cdd6af401125400f"]]},{"id":"cdd6af401125400f","type":"delay","z":"707bfa6aa3b4b4a0","name":"Delay","pauseType":"delayv","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":330,"y":480,"wires":[["a8f2302a0457caf4"]]},{"id":"a8f2302a0457caf4","type":"function","z":"707bfa6aa3b4b4a0","name":"Counter","func":"node.status({fill:\"grey\", shape:\"dot\", text: msg.retry_counter + \" / \" + msg.max_retries});\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":420,"wires":[["ae1ba7def011bb85"]]},{"id":"4e75650607404cca","type":"json","z":"707bfa6aa3b4b4a0","name":"JSON","property":"payload","action":"obj","pretty":false,"x":990,"y":420,"wires":[["9ef2c0242cd044e8"]]},{"id":"ee6a5a53b48ab846","type":"ui_text","z":"707bfa6aa3b4b4a0","group":"bae23f72ed5c5061","order":3,"width":6,"height":1,"name":"Période","label":"Période:  ","format":"{{msg.payload}}","layout":"row-center","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":1660,"y":340,"wires":[]},{"id":"a0e837b0df61ef9f","type":"ui_text","z":"707bfa6aa3b4b4a0","group":"bae23f72ed5c5061","order":4,"width":2,"height":1,"name":"Bleu","label":"Bleu ","format":"{{msg.payload}}/300","layout":"col-center","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":1650,"y":380,"wires":[]},{"id":"aa1b810b75929c50","type":"ui_text","z":"707bfa6aa3b4b4a0","group":"bae23f72ed5c5061","order":5,"width":2,"height":1,"name":"Blanc","label":"Blanc","format":"{{msg.payload}}/43","layout":"col-center","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":1650,"y":420,"wires":[]},{"id":"9de9958095be18df","type":"ui_text","z":"707bfa6aa3b4b4a0","group":"bae23f72ed5c5061","order":6,"width":2,"height":1,"name":"Rouge","label":"Rouge","format":"{{msg.payload}}/22","layout":"col-center","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":1650,"y":460,"wires":[]},{"id":"aa3e8abc38212466","type":"mqtt out","z":"707bfa6aa3b4b4a0","name":"MQTT","topic":"","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"4c8b3ff1e27c2ef9","x":1650,"y":240,"wires":[]},{"id":"45b6751b593261a4","type":"tls-config","name":"no check server certificat","cert":"","key":"","ca":"","certname":"","keyname":"","caname":"","servername":"","verifyservercert":false,"alpnprotocol":""},{"id":"bae23f72ed5c5061","type":"ui_group","name":"EDF Tempo","tab":"b0a31a493b3eae92","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"4c8b3ff1e27c2ef9","type":"mqtt-broker","name":"Localhost","broker":"localhost","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"b0a31a493b3eae92","type":"ui_tab","name":"EDF","icon":"dashboard","disabled":false,"hidden":false}]

Untitled

Les ??? est normal entre 6h et 11h car le code couleur du lendemain n’est pas encore connu.

J’ai apporté quelques améliorations afin de mieux correspondre à la réalité. Le changement de code couleur se fait à 6h du matin. Même l’API RTE est foireuse sur ce détail. Par exemple, à 4h du matin, le code couleur du jour est celui applicable à partir de 6h alors qu’il faut prendre le code couleur de la veille pour connaître la situation exacte.

Bonsoir , Quentin
merci pour le partage et joli travail
je vais faire tourner les deux en parallèle et faire un test quand les premier jour blanc et rouge arriverons

PS quelle est la fonction du bloc “Exception” ?

Normalement, ça devrait capturer les exceptions. Mais je n’ai pas encore d’expérience à ce niveau pour savoir si ce bloc est utilisé à bon escient.

Merci pour ce superbe Flow

Manuel

Bonsoir

@jolilo - j’ai tenté d’utiliser le flux de ton lien, mais le json retourné par RTE est vide (j’ai bien mis mon code API base64 - je ne crois pas qu’il y ait autre chose à faire pourtant…)

Par contre, le flux de @Q.x fonctionne bien. Je vois bien les données publiées sur MQTT dans MQTT explorer.
Je débute en Node Red, mais j’imagine que lire ces données sur MQTT dans un autre flux est le point de départ pour la programmation du Victron (par ex charger de la batterie en HC la veille depuis l’AC In en cas de lendemain rouge - sachant que j’ai des logiques complexes en place sur Home Assistant aujourd’hui avec mon autre onduleur (j’arrive chez Victron :slight_smile: )) - si vous avez un tel exemple, je suis preneur :slight_smile:

@jolilo : qu’a donné ton test des deux flux en parallèle ? Même résultat ? tout fonctionne bien ?(auquel cas, le flux de quentin ira très bien)

Merci à tous les deux en tout cas !

Matt

Bonjour , Matt

j’utilise plus que celui de Quintin , le RTE n’est pas très fiable pour mon flux (obligation de lancer plusieurs fois l’interrogation pour obtenir un résultat
j’ai refait un test la somme des jours fonctionne a la deuxième interrogation !!
le jour de demain fonctionne
le jour aujourd’hui ne fonctionne pas ( manque info array 1 )

mais je le garde sous le coude au cas ou

Michel

1 Like

Merci pour ton retour d’expérience

Salut

pour information, j’ai conçu un flux pour un usage de l’API RTE en partant du flux de Fabic (en premier post). Ca fait des mois que j’utlise cette APIsans soucis sur Home Assistant et y’avait pas de raison que ca ne fonctionne pas sur Node Red :slight_smile:

Je pense avoir trouvé ce qui est à l’origine du problème que tu décris “des fois ça marche, des fois ça marche pas”.

L’API de RTE a un défaut de comportement :

  • selon la doc, elle est censée retourner en JSON ses résultats, sauf si on précise qu’on peut recevoir du XML…
  • dans la vraie vie: sur plusieurs appels consécutifs à l’API, certains retours seront en JSON, d’autres en XML :thinking:… (et ce problème semble dater d’un bon bout de temps)
    => conséquence: un retour XML dans un nœud JSON du flux ne se passe pas bien, avec pour conséquence : arrêt du flux et pas de donnée à jour.

En indiquant explicitement le format de retour souhaité dans le header de la requête, j’ai désormais un retour stable, en JSON, donc tout le monde est content.

Mon flux reprend l’approche mise en place par @Q.x : il renvoie dans MQTT J0 et J1 (avec une codification identique (1=Bleu, 2=Blanc, 3=Rouge)) pour usage dans d’autres flux (je n’ai pas besoin d’autre donnée dans mes usages à priori)

Je garde ça en test un peu et vous tiens au courant.

Je suis content, car je découvre Node Red que depuis peu et c’est plutôt sympa :slight_smile:

Matt

[Info du 21/11 : je travaille sur une version un peu plus robuste (celle de ce post n’a aucune gestion des erreurs serveur éventuelles) et plus respectueuse du serveur RTE (un seul token sera demandé, deux demandes de couleurs J0 et J1). Elle séparera aussi la partie capture de l’information depuis les API et l’envoi sur MQTT (qui sera désormais périodique, à toutes fins utiles) - cette version est en test chez moi, probablement publiée ici durant le WE prochain]

[26/11 : nouvelle version ici: TEMPO node-RED API EDF - #14 by msevestre]

Bonjour à tout le monde

je vous partage ici mon flux (très simple) qui fonctionne avec l’API RTE pour la récupération des couleurs de jour (J0 et J+1)
Tempo RTE flow.json.zip (3,6 Ko)

Il diffuse sur le serveur MQTT local les couleurs du jour courant et du lendemain (pour usage par exemple dans un flux dédié à la définition de la stratégie de charge de la batterie) + l’horaire de dernière mise à jour, pour des situations de debug éventuelles.

La seule configuration à faire (en dehors d’avoir MQTT activé sur votre GX) est d’ajouter la clef d’API “base64” RTE comme valeur au noeud “RTE_API_Key” (à la place de “METTRE_ICI_VOTRE_CLEF_API_RTE_BASE64”) (voir plus bas pour récupérer cette clé).

Un grand merci à @Q.x pour son travail initial (qui m’a permis de suivre l’idée d’utiliser MQTT comme média de transport de l’information), ainsi que @jolilo qui a donné le pointeur vers un travail préliminaire de FABIC. Mon flux ajuste trois choses par rapport à cette dernière source :

  • l’appel fait pour la récupération des autorisations par l’API n’était pas (plus ?) correct
  • l’API RTE n’en faisant qu’à sa tête (elle retournait des fois du XML, des fois du JSON, entrainant des loupés de traitement), elle est désormais forcée dans mon flux à retourner du JSON
  • il ne s’appuie que sur les fonctions nodered par défaut (pas de crontab - peu utile pour nos usages simples)

Matt

Note:
Comme tout usage de l’API RTE, il faut aller se créer une clé pour permettre la récupération les données Tempo:
1. Aller sur l’API Tempo Like Supply de RTE et cliquez sur “Abonnez-vous à l’API”
2. Se connecter ou créer un compte si nécessaire
3. donnez un nom et une description à votre application et sélectionnez bien “Web/Serveur” comme type
4. dans le menu à gauche de l’écran, section “Mes Applications”, vous retrouverez votre application créée à l’étape juste avant.
5. cliquez dessus et vous pourrez récupérer votre clef base 64 en cliquant sur le bouton “Copier en base 64”

1 Like

Merci , Matt

super travail , et merci pour le partage .
fonctionne chez moi !

Michel

1 Like

hors sujet mais pour info pour tempo sur HA j’utilise ça et ça fonctionne tres bien avec l’api rte : GitHub - hekmon/rtetempo: RTE Tempo days calendar and sensors for Home Assistant

C’est celui que j’utilise sur HA… et comme il fonctionne bien c’est qui m’a lancé dans la révision du flux nodered pour mon gx (et si j’ échouais, je comptais partager la donnée tempo depuis HA par MQTT, pour récupération sur nodered)

Salut à tous

ayant progressé en Node Red, j’en ai profité pour améliorer mon flux qui récupère les infos Tempo chez RTE. Notamment:

  • gestion des erreurs lors des récupérations de données par API (avec boucle d’essai) - en cas d’erreurs répétées un code d’erreur est renvoyé par MQTT pour permettre un traitement de votre choix
  • amélioration de la récupération J+1: un premier essai est fait à 6h01 et si RTE n’a pas encore fait la mise à jour (ce qui est souvent le cas à cette heure), boucle toutes les 5 minutes pour récupérer la nouvelle couleur J+1 au plus tôt (la récupération de 10h41 reste en place car RTE se donne le droit de modifier cette donnée jusqu’à 10h40).

C’est du fignolage, mais c’est plus robuste.

flows_Tempo_RTE.json.zip (6,1 Ko)

2 Likes

Bonjour Matt et merci pour le partage.

Dans les flux récupération couleur J0 et J1 est-il possible d’avoir les valeurs de sortie (1,2,3) en variable globale ou pas car je ne souhaite pas utiliser MQTT.
Si c’est possible, peux tu indiquer comment faire.

Merci d’avance :wink:

Dans un nœud fonction, tu peux utiliser les commandes :

  • global.set(‘nom de variable’, valeur);
  • flow.set(‘nom de variable’, valeur);

Par exemple:

  • global.set(‘ma_variable’, msg.payload);

Que tu récupères avec la méthode get.

  • global.get(‘ma_variable’);

Tu peux également utiliser un nœud change pour affecter une valeur du message à une variable du globale ou de flux.

image

Tu peux consulter les variables existantes avec

Je vais regarder ça effectivement c’est simple, merci Quentin

Bonjour,

J’ai un serveur “WES” (cartelectronique) qui permet d’extraire les infos linky, notamment la couleur du lendemain.
Je veux privilégier cette option et en cas d’échec (normalement jamais car pas besoin de connexion internet) utiliser le code fait par @msevestre pour modifier le SoC des batteries de 20 à 100% si demain est rouge et si on est entre 22h05 et 5h55 (ce qui me permet indirectement de recharger la batterie sans toucher à d’autres paramètres)

J’ai pu trouver code pour extraire les infos depuis le WES, je pense avoir trouvé le moyen de prioriser et de gérer mes conditions (demain=jour rouge + plage horaire)
Par contre (je pense que ca vient de là), je n’arrive pas à envoyer les infos dans l’ESS pour que le soc se modifie automatiquement

Avez vous une idée ?

Je vous joins mon code ainsi qu’une capture d’écran (le WES n’est pas encore raccordé au routeur d’où l’erreur qui s’affiche sur le screenshot)
PS : je viens de voir que dans les commentaires du code, j’avais laissé une ancienne “version” que je voulais utiliser : passer en mode maintenir les batteries chargées plutôt que de modifier le SOC, mais ca ne vient pas de là


flux_WES_et_tempoRTE_modifSOC.txt (6,5 Ko)

pour info il est maintenant possible d activé le dynamique ess, dans les fournisseurs pay france vous aurez EDF pour le tempo !

Bonsoir , j’ai fait mon ma propre petite gestion du tempo !
mais je suis curieux , mais je ne trouve pas EDF tempo peut tu m’expliquer
par avance merci