Une mise à jour du flow (version 1.4) a été postée. Elle intègre une correction/amelioration dans le flow pour la récupération de la consommation.
Une autre astuce pour récupérer « correctement » les données complètes de chaque journée sur HA (retrouver dans J-1 les consommations 18h-24h récupérées à J après minuit) : décaler chaque nouvelle valeur reçue à -1h dans de nouvelles entités. Voici comment faire :
Édit : tout ce qui suit ne fonctionne finalement pas
- Considérer les entités créées dans le flow Node Red comme « passagères »
- Dans HA, créer une entrée de type template pour chaque pièce de votre domicile et une dernière pour le totalisateur.
- Renseigner les entrées comme sur l’exemple ci-dessous :
- Modèle de l’état à ajouter :
{% set current_time = now() %}
{% set advanced_time = current_time - timedelta(hours=1) %}
{{ states(‹ sensor.votre_sensor ›) | default(0) }}- Renseigner le nom de votre sensor dans les parenthèses qui suivent « states( », entre deux apostrophes.
- Répéter l’opération pour chaque entité
- Attribuer ces entités à vos graphiques et votre module de suivi d’énergie à la place de celles créées dans Node Red
De mon côté, je suis pleinement satisfait du flow en récupérant les données sur J-1 et en utilisant les graphes de statistiques. Mais pour la partie dashboard Energie, je n’ai pas réussi à faire ce que je voulais jusqu’à maintenant (à savoir Avoir le même comportement dans le tableau de bord Energie qu'un graphe de statistiques utilisant l'attribut "Etat" (state)).
Je suivrai donc avec intérêt la suite de vos tests ! Merci.
De toutes façons ce que je propose juste au dessus ne fonctionne finalement pas.
Bonjour Yann,
Merci beaucoup pour tout ton travail, ça fonctionne super bien chez moi.
Je ne suis pas informaticien et j’ai réussi à intégrer mon radiateur Noirot dans ma conf Home Assistant grâce à toi !
Pour la remontée d’informations, tout se passe très bien.
J’aimerais maintenant pouvoir passer des commandes du type « passage en mode hors gel les journées Tempo Rouge ». Aucun problème pour l’automatisation qui est faite dans HA mais j’ai besoin d’accéder aux « commandes ».
Questions :
- As-tu trouvé une description de l’API Muller Intuitive ?
- As tu a dispo un flux de node-red même pas tout a fait adapté pour que je puisse commencer à bricoler ?
Encore merci pour ton travail,
Guillaume
Bonjour,
C’est toujours un plaisir de voir que ce flow rend service à de nouvelles personnes. J’ai passé tellement de temps à le concevoir !
Il est tout à fait possible de passer des commandes. J’ai par exemple un flow qui permet d’acquitter les fenêtres ouvertes et un autre qui va modifier le planning en cours.
Par contre il n’existe aucune doc qui recense les commandes API, mais il y a quand même quelques astuces possibles :
. Télécharger le plugin Jeedom dont il est question dans le premier message de ce sujet et faire des recherches dans les différents fichiers de l’archive (Notepad++ est votre ami pour la recherche sur plusieurs fichiers à la fois). Mais cela nécessite pas mal de temps et d’essais pour les commandes et les paramètres.
. Interecepter les trames HTTP de l’appli Intuis Connect avec une application style HTTP toolkit. Cela nécessite un vieux téléphone (IPhone S 1er du nom pour moi) et une petite prise en main mais c’est assez efficace.
Je mets à dispo le flux de commande très vite !
Voici un lien vers un nouveau flow qui contient deux commandes pour acquitter la notification de fenêtre ouverte et pour modifier le planning en cours.
https://flows.nodered.org/flow/2134237ff93f1b079fb8ac6ade453d07
Attention, les éléments de ce nouveau flow sont à coller dans l’existant. Si vous l’utilisez tel quel, il ne fonctionnera pas.
Un énorme merci pour ton flow .
J’ai pas encore mis en l’exploitation ton flow mais ça m’a permis de me mettre à node Red déjà et je commence à faire des petites modifications du code.
Merci pour le boulot
Top ! merci Yann,
Je regarde tout ça et je reviens donner des nouvelles.
bonne journée !
Hello,
Je reviens vers vous avec quelques news :
Voici le flux pour envoyer les commandes :
[{"id":"a2f12235762ec828","type":"tab","label":"Flux 1","disabled":false,"info":"","env":[]},{"id":"087481a66b64a77c","type":"group","z":"a2f12235762ec828","name":"Passer une commande manuelle","style":{"label":true},"nodes":["e16b1440f9976fc9","40443890d8c3a7df","5a3259d752e1efa7","2ae8f33d83a59f91","f1b88b07dab52fdf","e0f695c83e952ca1","872ac0abb2dfec75","7dce604279a1cf46","f81677b3ca6fc19f","e4342b0432a85d74","96c2c3ef618edd31","1267ba1a01763541","be6618e22ddd3bef","4a1da8ae2657e4f7"],"x":54,"y":119,"w":1732,"h":202},{"id":"e16b1440f9976fc9","type":"debug","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"contrôle retour","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1660,"y":220,"wires":[]},{"id":"40443890d8c3a7df","type":"debug","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"contrôle requête","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1460,"y":160,"wires":[]},{"id":"5a3259d752e1efa7","type":"http request","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"Intuis setstate","method":"POST","ret":"obj","paytoqs":"ignore","url":"https://app.muller-intuitiv.net/syncapi/v1/setstate","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"Authorization","keyValue":"","valueType":"msg","valueValue":"token"},{"keyType":"Content-Type","keyValue":"","valueType":"other","valueValue":"application/json"}],"x":1460,"y":220,"wires":[["e16b1440f9976fc9"]]},{"id":"2ae8f33d83a59f91","type":"change","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"Set param acquit fenetre","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t \"home\": {\t \"id\": \"yourId\",\t \"rooms\": [\t {\t \"id\": \"yourId\",\t \"therm_setpoint_mode\": $globalContext(\"mode_setpoint\"),\t \"therm_setpoint_temperature\": $globalContext(\"temp_setpoint\"),\t \"therm_setpoint_end_time\": $globalContext(\"due_date_setpoint\")\t }\t ]\t },\t \"app_identifier\": \"app_muller\"\t}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":1210,"y":220,"wires":[["40443890d8c3a7df","5a3259d752e1efa7"]]},{"id":"f1b88b07dab52fdf","type":"change","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"","rules":[{"t":"set","p":"token","pt":"msg","to":"\"Bearer \" & $globalContext(\"AccessToken\")\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":970,"y":220,"wires":[["2ae8f33d83a59f91"]]},{"id":"e0f695c83e952ca1","type":"server-state-changed","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"Mode de fonctionnement - setpoint","server":"3b9eb627.f4aeda","version":6,"outputs":1,"exposeAsEntityConfig":"","entities":{"entity":["input_select.radiateur_chambre_parents_mode_de_fonctionnement_setpoint"],"substring":[],"regex":[]},"outputInitially":false,"stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":220,"y":220,"wires":[["e4342b0432a85d74"]]},{"id":"872ac0abb2dfec75","type":"server-state-changed","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"Consigne de température - setpoint","server":"3b9eb627.f4aeda","version":6,"outputs":1,"exposeAsEntityConfig":"","entities":{"entity":["input_number.radiateur_chambre_parents_consigne_de_temperature_setpoint"],"substring":[],"regex":[]},"outputInitially":false,"stateType":"num","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":220,"y":160,"wires":[["7dce604279a1cf46"]]},{"id":"7dce604279a1cf46","type":"change","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"","rules":[{"t":"set","p":"temp_setpoint","pt":"global","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":160,"wires":[["96c2c3ef618edd31"]]},{"id":"f81677b3ca6fc19f","type":"change","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"","rules":[{"t":"set","p":"due_date_setpoint","pt":"global","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":280,"wires":[["96c2c3ef618edd31"]]},{"id":"e4342b0432a85d74","type":"change","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"","rules":[{"t":"set","p":"mode_setpoint","pt":"global","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":220,"wires":[["96c2c3ef618edd31"]]},{"id":"96c2c3ef618edd31","type":"delay","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"","pauseType":"delay","timeout":"100","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":770,"y":220,"wires":[["f1b88b07dab52fdf"]]},{"id":"1267ba1a01763541","type":"server-state-changed","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"Echéance - setpoint","server":"3b9eb627.f4aeda","version":6,"outputs":1,"exposeAsEntityConfig":"","entities":{"entity":["input_datetime.radiateur_chambre_parents_setpoint_end_time"],"substring":[],"regex":[]},"outputInitially":false,"stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":170,"y":280,"wires":[["4a1da8ae2657e4f7"]]},{"id":"be6618e22ddd3bef","type":"change","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$round($number($toMillis(payload))/1000,0)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":630,"y":280,"wires":[["f81677b3ca6fc19f"]]},{"id":"4a1da8ae2657e4f7","type":"moment","z":"a2f12235762ec828","g":"087481a66b64a77c","name":"","topic":"","input":"payload","inputType":"msg","inTz":"Europe/Paris","adjAmount":0,"adjType":"days","adjDir":"add","format":"","locale":"C","output":"payload","outputType":"msg","outTz":"Europe/Paris","x":400,"y":280,"wires":[["be6618e22ddd3bef"]]},{"id":"3b9eb627.f4aeda","type":"server","name":"Home Assistant","addon":true}]
En deux mots, le fonctionnement :
-
« hg » : hors gel → la commande est passée et maintenue automatiquement jusqu’à nouvel ordre
-
« home » : « mode auto » → place le radiateur (la pièce) sur le programme établi dans l’application
-
« manual » : « mode manu » → force le radiateur à une température donnée
- il faut comprendre ce mode comme une dérogation au mode « home » avec une durée limitée
- il faut donc envoyer en même temps l’heure de fin du forçage ; après cette heure, le radiateur retourne automatiquement sur le mode « home » et la programmation établie dans l’application.
- l’heure est au format timestamp unix en secondes (et non milli-secondes) → conversion*$round($number($toMillis(payload))/1000,0)*
Les entités sont configurée dans configuration.yaml :
Messages de déboggage :
et sur l’appli :
Au final, je ne vais probablement commencer par piloter le radiateur les jours Tempo Rouge par le mode manu avec une température assez faible, vois peut-être avec le mode hors gel … on verra par la suite.
Si vous avez de bonnes idées, je suis preneur
Bonne journée !
Excellent travail ! Bien joué
Et en plus c’est extrêmement bien expliqué pour les suivants qui voudraient essayer à leur tour.
Hello,
Pour la doc de l API, celle ci s’appuie sur celle de netatmo energy si je ne me trompe pas.
Clément
Un grand merci à vous tous pour vos partages.
J’ai adapté vos flows respectifs pour récupérer les Infos de mes 3 radiateurs et ajouter un mode away global.
Par contre, j’ai du changer la baseurl de l api bizarrement ( api vs syncapi) pour le flow de BeaverBeliever qui était pourtant la même que celle de Yann. La fonction setthermmode ne semble pas exposée sur la syncapi,
Il y a sûrement plusieurs versions de l’api exposées par l’app muller.
En suivant la doc de l’api netatmo, je m’en suis sorti( pas besoin de sniffer les appels)
Le endpoint setthermmode permet de gérer le mode away, hg, schedule(qui correspond à home) sur la maison directement ce qui est utile lorsqu’on a plusieurs radiateurs.
Merci encore…
Clément