Suggestions pour piloter un plancher chauffant hydrolique (via PAC)

Bonjour,

Mon installation de chauffage:

Plancher chauffant hydrolique sur 3 niveaux (3 zones), chauffé par une PAC Toshiba Estia (non domotisable, enfin je peux faire du on/off si je met un relai, mais ce n’est pas l’intérêt d’une PAC).

En mode chauffage, la température de l’eau est pilotée par la PAC en loi d’eau, c’est à dire que l’eau est automatiquement inversement proportionnelle à la température extérieur (plus il fait froid, plus l’eau est chaude et vice-et-versa). Le réglage de base (courbe de la loi d’eau) est fait pour que le RDC soit à la température « confort », puis je restreint une « sous température » pour les étages (comme la chaleur monte, le besoin en chauffage est moindre, sachant en plus que pour les chambres on a moins de besoins de chaleur) via des vannes mélangeuses (je peux donc piloter par exemple pour que l’étage ne chauffe qu’a 20%). Ce sont des vannes 3 voies avec servomoteur qui mettent 120 secondes pour faire une ouverture complète (elles sont déjà paramétrées dans HA)

Parfois un schéma vaut mieux que des mots:

La maison est très isolée, avec une forte inertie, je ne souhaite pas gérer des plages de chauffe différentes dans la journée (a la limite si je part en vacances pendant plusieurs jours pourquoi pas, mais ce n’est pas le sujet), mais juste que l’ouverture des vannes s’ouvre proportionnellement en fonction du besoin en chauffage par rapport à une température de consigne. Je veux donc éviter le mode, je chauffe à 100% si je suis en dessous de la consigne, puis j’arrête dès que j’atteints la consigne car avec l’inertie, les fluctuations vont être trop importantes. La solution serais plutot de l’ordre de: si température est loin de la consigne je tends vers 100%, puis plus je me rapproche, plus je baisse.

J’ai regardé du coté de l’entité « Generic_thermostat », mais j’ai l’impression que cela s’applique plus a du radiateur électrique avec surtout le switch on/off. Je n’ai pas vraiment trouvé de retours d’expérience correspondant à mon attente.

Pour piloter tout cela, j’ai donc dans HA a ma dispositions les infos/commandes suivantes:
Température moyenne de la zone concernée
Températures de départ et de retour de l’eau dans chaque boucle
Switch du circulateur de chaque zone (mais à priori je ne souhaite pas me servir de celui-ci)
Slider qui pilote l’ouverture des vannes de mélange (de 0% a 100%)
image
(Remarque: On vois par exemple dans ce screenshot, que la température est pas mal montée en milieu de journée, le chauffage aurais pu être réduit a ce moment par exemple)

Quelqu’un a t’il mis en place quelque chose de similaire?
Sinon, avez-vous des suggestions sur comment je pourrais gérer cela?

Bonne journée,
Dapolux

Salut, ton sujet m’intéresse beaucoup !!
pour deux raisons : je souhaite domotiser du chauffage au sol
1/ Le mien qui est un chauffage électrique classique au sol (sans PAC) ce sont des grilles électrique dans le sol, donc pas de variation possible, c’est du tout ou rien.
2/ Un ami qui possède la même technologie que toi (PACS) et qui souhaite domotiser l’ensemble.

Je suis dev python, j’ai songer a me lancer sur un module pour gérer
une températeur exterieur,
une temperature cible,
et un chauffage qui apprendrais de lui meme… je m’explique

Un chauffage qui « apprend » l’inertie de la dalle en fonction de la température intérieur et extérieur au fur et a mesure de l’année afin de coller au mieux a la consigne, sans pointe.
Un chauffage qui sais que quand tu demande « 20.5 degres a 17h30 » il a commencer a chauffé a 16h45, parce qu’il fait 8 degres dehors.

Bon ça c’est la partie idéal, je suis surpris que tu n’es pas eu de retour.

Quelle sont les références de tes vannes mélangeuses ? Je ne pensais pas qu’on pouvais « doser » l’ouverture.

Hello,

Content de voir que je ne suis pas seul :slight_smile:

Alors pour les vannes, j’utilise:

  • Vanne 3 voies Wipex
  • Servomoteur STM (Somatherm) pour vanne mélangeuse
    ==> Ce moteur a un temps de marche de 2 minutes, c’est à dire qu’il met 120 secondes pour faire une ouverture complète ou une fermeture complète.

En suite, j’ai un ESP (Wemos), qui pilote 2 relais. 1 pour alimenter ou non le moteur, et l’autre pour piloter le sens (ouverture / fermeture). J’arrive ainsi à avoir mes 3 positions (vanne a l’arrêt: relai 1 off, vanne qui s’ouvre: relais 1 on + relais 2 ouverture, vanne qui se ferme: relais 2 fermeture.
En fait, c’est le même montage que celui-ci (je n’applique pas le scenario de réglage, mais il peut être source d’inspiration pour notre besoin).

Puis coté HA, j’ai un input_select pour ces 3 positions, et j’utilise le Cover RF Time Based pour piloter et avoir le retour d’état sur la position de la vanne (le plugin du même nom mais sans « RF » ne permet par le « stop »).

Dans ton cas, en mode on/off, peut être que le % de chauffage pourrait être piloté par exemple par un nombre de cycles de chauffe à l’heure (exemple, à 100% tu n’est que en on, a 50% tu chauffes 10mins, tu t’arrêtes 10mins, tu rechauffe 10 mins…). Mais je pense que le mieux pour toi est que ça s’arrête quand le système a calculé qu’il y a assez d’inertie pour maintenir la température de consigne, puis qui rechauffe dès qu’il a déterminé que la température va chuter.

Oui en effet, sur un tout ou rien (on / off) il faut jouer sur les cycles pour « lisser » la température.
Dans ton cas, tes vannes tu peux ordonner 20% d’ouverture ?

Si ton cycle de vérification est toute les 10 minutes.
Si je dois mettre mon système sur 20%, ça sera 2 minutes toutes les 10 minutes.

Les paramètres entrants sont

température extérieur
température intérieur
température de consigne

le coefficient directeur entre deux prises de températures, afin de déterminer la pente et prévoir quand on dépassera la consigne.

Le plus complexe est de faire l’auto-apprentissage…

  • Le 1er jour il balance 100% jusqu’à la consigne (20°) et il connaîtra le temps de re-descente a la consigne. (pic à 23 degrés après 30 min, 1h30 de descente jusqu’a 20)
  • Le 2eme jour il balance 100% et coupe 30 minute avant pour que le pic tombe a 20
    (si situation égale de température extérieur) théoriquement on est dans le bon.

Ca c’est pour la montée de température, il faut prédire l’intertie de la dalle en fonction de la temp ext qui évolue.
il y a le maintien de la température, determiner le meilleur cycle en fonction de la temp ext qui évolue
et la baisse de consigne …

Je suis sur que c’est possible :slight_smile:
Je suis toujours étonné qu’un petit génie n’est pas encore pondu ce genre de truc…

Pour ce que tu cites, j’essaierais dans un premier temps de voir comment se comporte et comment utiliser :

C’est pas totalement ce que tu cites, je n’arrive pas à voir si cela peut servir, mais c’est la seule notion de prédiction que ma mémoire se rappelle dans la documentation officielle…

Merci interressant, je vais aller voir ça :slight_smile:

Bon alors faute de mieux, je suis en cours de test (depuis hier) de la solution suivante:

  • A intervalle régulier (10 minutes), je détermine de delta entre la consigne et la température réelle (qui sont gérées dans une entité climate, entres autres pour l’affichages ultérieur de cartes)
  • J’ouvre la vanne en fonction de ce delta via node-red (>= 1° → 100%, entre 0.6 et 1° → 75%, entre 0.2 et 0.6° → 50%, entre -0.2 et 0.2° → 25%, <= -0.2° → 0%). Je peaufinerai ces valeurs en fonction des résultats (j’ai préféré raisonner par intervalles histoire d’éviter des changements trop fréquents).

.

Flow:

[{"id":"3aa156bc.151faa","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"8dffcc29.8d1d6","type":"comment","z":"3aa156bc.151faa","name":"---------------- RDC --------------","info":"","x":700,"y":100,"wires":[]},{"id":"5e33257d.00521c","type":"function","z":"3aa156bc.151faa","name":"Calcul Delta","func":"\nvar consigne = msg.climate[0].attributes.temperature;\nvar mesure = msg.climate[0].attributes.current_temperature;\nvar delta = consigne - mesure;\n\nmsg.delta = delta;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":750,"y":240,"wires":[["56a4c0a1.1aaa6"]]},{"id":"58af4117.6ed42","type":"inject","z":"3aa156bc.151faa","name":"Every 10 minutes","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"*/10 0-22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":330,"y":240,"wires":[["e0aa788.fe9ba88"]]},{"id":"56a4c0a1.1aaa6","type":"switch","z":"3aa156bc.151faa","name":"","property":"delta","propertyType":"msg","rules":[{"t":"gte","v":"1","vt":"str"},{"t":"btwn","v":"0.6","vt":"num","v2":"1","v2t":"num"},{"t":"btwn","v":"0.2","vt":"num","v2":"0.6","v2t":"num"},{"t":"btwn","v":"-0.2","vt":"num","v2":"0.2","v2t":"num"},{"t":"lte","v":"-0.2","vt":"str"}],"checkall":"false","repair":false,"outputs":5,"x":910,"y":240,"wires":[["7fd89328.85f81c"],["497bfab6.b6b3b4"],["a2a1f439.3f9768"],["b0da1045.40856"],["9ca85125.ab06b"]]},{"id":"9ca85125.ab06b","type":"api-call-service","z":"3aa156bc.151faa","name":"Set 0","server":"74685640.813718","version":1,"debugenabled":false,"service_domain":"cover","service":"set_cover_position","entityId":"cover.servomoteur_rdc","data":"{\"position\":0}","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1170,"y":360,"wires":[[]]},{"id":"e0aa788.fe9ba88","type":"ha-get-entities","z":"3aa156bc.151faa","server":"74685640.813718","name":"Get RDC Climate","rules":[{"property":"entity_id","logic":"is","value":"climate.rdc","valueType":"str"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"climate","output_results_count":1,"x":550,"y":240,"wires":[["5e33257d.00521c"]]},{"id":"b0da1045.40856","type":"api-call-service","z":"3aa156bc.151faa","name":"Set 25","server":"74685640.813718","version":1,"debugenabled":false,"service_domain":"cover","service":"set_cover_position","entityId":"cover.servomoteur_rdc","data":"{\"position\":25}","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1170,"y":300,"wires":[[]]},{"id":"a2a1f439.3f9768","type":"api-call-service","z":"3aa156bc.151faa","name":"Set 50","server":"74685640.813718","version":1,"debugenabled":false,"service_domain":"cover","service":"set_cover_position","entityId":"cover.servomoteur_rdc","data":"{\"position\":50}","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1170,"y":240,"wires":[[]]},{"id":"497bfab6.b6b3b4","type":"api-call-service","z":"3aa156bc.151faa","name":"Set 75","server":"74685640.813718","version":1,"debugenabled":false,"service_domain":"cover","service":"set_cover_position","entityId":"cover.servomoteur_rdc","data":"{\"position\":75}","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1170,"y":180,"wires":[[]]},{"id":"7fd89328.85f81c","type":"api-call-service","z":"3aa156bc.151faa","name":"Set 100","server":"74685640.813718","version":1,"debugenabled":false,"service_domain":"cover","service":"set_cover_position","entityId":"cover.servomoteur_rdc","data":"{\"position\":100}","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1180,"y":120,"wires":[[]]},{"id":"74685640.813718","type":"server","name":"Home Assistant","addon":true}]

Si ça fonctionne bien, je j’ajouterai le fonctionnement en mode refroidissement (la logique actuelle n’est que pour le mode chauffe).

Après quelques temps d’utilisation, je me suis aperçu que dans le temps, l’ouverture de mes vannes 3 voies n’étaient pas toujours synchro, c’est à dire que le retour d’état calculé, n’est pas dans 100% des cas exacte à l’état réel. Pour ce faire, j’ai rajouté une fonctionnalité de reset dans le cas ou je détecte un souci.
J’ai par ailleurs un peu revu le flow pour simplifier les choses avec mes 3 zones, voici donc ma dernière version en date:


[{"id":"481ec58f.8415ac","type":"inject","z":"c8f6bacd.b33d38","name":"Every 10 minutes","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"*/10 0-22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":270,"y":260,"wires":[["86761f8f.073","34a9054e.0b5baa","bd9c8f73.16bcf"]]},{"id":"86761f8f.073","type":"change","z":"c8f6bacd.b33d38","name":"rdc","rules":[{"t":"set","p":"id","pt":"msg","to":"rdc","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":200,"wires":[["311b7eb.d2b2b82"]]},{"id":"3c239f68.17c82","type":"api-call-service","z":"c8f6bacd.b33d38","name":"Set position","server":"74685640.813718","version":1,"debugenabled":false,"service_domain":"cover","service":"set_cover_position","entityId":"{{servo.0.entity_id}}","data":"{\"position\": \"{{payload}}\"}","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1730,"y":240,"wires":[[]]},{"id":"34a9054e.0b5baa","type":"change","z":"c8f6bacd.b33d38","name":"etage","rules":[{"t":"set","p":"id","pt":"msg","to":"etage","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":260,"wires":[["311b7eb.d2b2b82"]]},{"id":"bd9c8f73.16bcf","type":"change","z":"c8f6bacd.b33d38","name":"grenier","rules":[{"t":"set","p":"id","pt":"msg","to":"grenier","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":320,"wires":[["311b7eb.d2b2b82"]]},{"id":"1d8796c7.5c8b79","type":"group","z":"c8f6bacd.b33d38","name":"Resynchronize V3V","style":{"stroke":"#bfbfbf","label":true,"fill":"#ffdf7f"},"nodes":["5688ce36.8a127","f29fbce4.34fd5","7c7c1ef3.c9f55","1d8c1ae2.7e7225"],"x":934,"y":259,"w":672,"h":82},{"id":"5688ce36.8a127","type":"delay","z":"c8f6bacd.b33d38","g":"1d8796c7.5c8b79","name":"Wait 7 min","pauseType":"delay","timeout":"7","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1030,"y":300,"wires":[["f29fbce4.34fd5"]]},{"id":"f29fbce4.34fd5","type":"function","z":"c8f6bacd.b33d38","g":"1d8796c7.5c8b79","name":"Resynchronize?","func":"const depart = msg.depart[0].state;\nconst retour = msg.retour[0].state;\nconst delta = msg.delta;\n\nif (retour >= depart && delta >=0.5)\n    {msg.payload = 'yes';}\nelse\n    {msg.payload = 'no';}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1200,"y":300,"wires":[["7c7c1ef3.c9f55"]]},{"id":"7c7c1ef3.c9f55","type":"switch","z":"c8f6bacd.b33d38","g":"1d8796c7.5c8b79","name":"Yes","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"yes","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":1350,"y":300,"wires":[["1d8c1ae2.7e7225"]]},{"id":"1d8c1ae2.7e7225","type":"function","z":"c8f6bacd.b33d38","g":"1d8796c7.5c8b79","name":"Calc Resynchro","func":"\nvar actual = msg.servo[0].attributes.current_position\nvar resynchro;\n\n\nif (actual >= 50)\n    {resynchro = 0;}\nelse\n    {resynchro = 100;}\n\nmsg.payload = resynchro;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1500,"y":300,"wires":[["3c239f68.17c82"]]},{"id":"7504cd73.3591a4","type":"group","z":"c8f6bacd.b33d38","name":"V3V Opening determination","style":{"label":true,"fill":"#bfdbef"},"nodes":["aedb1506.d92e38","d7e19dde.a7d8a","b0cadb6c.8bde08"],"x":934,"y":159,"w":672,"h":82},{"id":"aedb1506.d92e38","type":"function","z":"c8f6bacd.b33d38","g":"7504cd73.3591a4","name":"Calc Delta","func":"\nvar consigne = msg.climate[0].attributes.temperature;\nvar mesure = msg.climate[0].attributes.current_temperature;\nvar delta = consigne - mesure;\n\nmsg.delta = delta;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1030,"y":200,"wires":[["d7e19dde.a7d8a"]]},{"id":"d7e19dde.a7d8a","type":"function","z":"c8f6bacd.b33d38","g":"7504cd73.3591a4","name":"Calc ouverture","func":"var ouverture = 0;\nvar delta = msg.delta;\n\nif (delta > 1) {ouverture = 100;}\nelse if (delta >= 0.6) {ouverture = 75;}\nelse if (delta >= 0.2) {ouverture = 50;}\nelse if (delta >= -0.2) {ouverture = 25;}\n\n\nmsg.payload = ouverture;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1260,"y":200,"wires":[["b0cadb6c.8bde08","5688ce36.8a127"]]},{"id":"b0cadb6c.8bde08","type":"switch","z":"c8f6bacd.b33d38","g":"7504cd73.3591a4","name":"Different Position?","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"servo[0].attributes.current_position","vt":"msg"}],"checkall":"true","repair":false,"outputs":1,"x":1490,"y":200,"wires":[["3c239f68.17c82"]]},{"id":"b556dd66.0c4bf","type":"group","z":"c8f6bacd.b33d38","name":"Get Entities","style":{"label":true,"fill":"#c8e7a7"},"nodes":["311b7eb.d2b2b82","fa449613.e9f488","db909287.2c959","943c66af.d93568"],"x":654,"y":119,"w":192,"h":262},{"id":"311b7eb.d2b2b82","type":"ha-get-entities","z":"c8f6bacd.b33d38","g":"b556dd66.0c4bf","server":"74685640.813718","name":"Get Climate","rules":[{"property":"entity_id","logic":"jsonata","value":"$contains(\t   $entity().entity_id,\t   \"climate.\" & id\t)\t","valueType":"jsonata"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"climate","output_results_count":1,"x":750,"y":160,"wires":[["943c66af.d93568"]]},{"id":"fa449613.e9f488","type":"ha-get-entities","z":"c8f6bacd.b33d38","g":"b556dd66.0c4bf","server":"74685640.813718","name":"Get Depart","rules":[{"property":"entity_id","logic":"jsonata","value":"$contains(\t   $entity().entity_id,\t   \"sensor.pc_\" & id & \"_temperature_depart\"\t)\t","valueType":"jsonata"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"depart","output_results_count":1,"x":750,"y":280,"wires":[["db909287.2c959"]]},{"id":"db909287.2c959","type":"ha-get-entities","z":"c8f6bacd.b33d38","g":"b556dd66.0c4bf","server":"74685640.813718","name":"Get Retour","rules":[{"property":"entity_id","logic":"jsonata","value":"$contains(\t   $entity().entity_id,\t   \"sensor.pc_\" & id & \"_temperature_retour\"\t)\t","valueType":"jsonata"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"retour","output_results_count":1,"x":750,"y":340,"wires":[["aedb1506.d92e38"]]},{"id":"943c66af.d93568","type":"ha-get-entities","z":"c8f6bacd.b33d38","g":"b556dd66.0c4bf","server":"74685640.813718","name":"Get Servo","rules":[{"property":"entity_id","logic":"jsonata","value":"$contains(\t   $entity().entity_id,\t   \"cover.servomoteur_\" & id\t)\t","valueType":"jsonata"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"servo","output_results_count":1,"x":740,"y":220,"wires":[["fa449613.e9f488"]]},{"id":"74685640.813718","type":"server","name":"Home Assistant","addon":true}]

bonjour @Dapolux, tu utilises quoi pour récupérer la température de départ et de retour de ton plancher chauffant ?
Si tu as une photo de ton installation, je suis preneur.
Merci,

Hello,

J’utilise des sondes ds18b20, que je positionne entre les tubes (multicouche) et l’isolant des tubes (armaflex). Elles sont reliées a un esp (wemos).

Je n’ai pas de photo sous le coude, mais je vais m’en occuper :).

Merci !
Je pensais que la sonde était dans le tuyau, je me disais qu’il fallait être joueur :slight_smile:

Avec un peu de retard, voici une photo (dsl c’est un peu sombre):

Je ne vois pas apparaître de circulateur dans ton schema en effet, mais j’ai l’impression de l’apercevoir sur la photo, non ? A quoi sert il du coup et pourquoi tu n’as pas besoin ou pas voulu t’en servir ?

Je ne les ai pas mis sur le schéma mais il y a bien 1 circulateur par zone.

Sur la photo tu en vois 2 et même un troisième, mais très sombre sur la droite, on vois les 2 leds, les 2 « noirs » sont ceux de 2 circuits, et le rouge de gauche (qui ressemble au tiens, cf ton autre post) n’est pas pour le chauffage mais pour le bouclage de l’eau chaude.

Bonjour à tous,

Je suis intéressé par votre discussion : Je viens d’installer une chaudière à bois déchiqueté, avec un ballon tampon (comme dans le schéma de dapolux), puis j’ai installé une vanne 3 voies motorisée à commande 3 points ( fermeture, ouverture, pas d’action) en amont de mon seul circuit secondaire.
Je me penche maintenant sur la régulation de la température dans la maison. A priori, (je n’ai encore rien fait) je pensais m’y prendre en décomposant mon problème en deux sous problèmes indépendants :

1/ Piloter la vanne 3 voies pour avoir une température en sortie de vanne qui atteigne une température de consigne de sortie de vanne : Régulation avec très peu d’inertie. Seul la température immédiate de sortie de la vanne est mesurée et est utilisée pour le pilotage. La consigne est imposée par le 2/

2/ Régulation de la température de la maison, avec capteur de température interne et externe, régulation avec beaucoup d’inertie, avec une approche PID dont l’objectif est de réguler la température de consigne (puissance) de la vanne 3 voies, sans se soucier de comment est faite cette régulation.

J’ai l’impression que dans votre approche, vous faite directement les deux (pilotage de la vanne, régulation de la maison) en une seule étape. Est-ce correct ? Etes vous satisfait ? Est ce que tout le code est disponible dans le fil de discussion ? (je peut comme vous, faire des composants sous Node Red)

En vous remerciant
Laurent

Bonjour @briseis,

Je ne sais pas bien comment fonctionne ta chaudière (est ce qu’elle chauffe en continu? par rapport à une consigne donnée? en fonction de l’extérieur?). C’est un peu ça qui va déterminer comment piloter ta 3 voies.

En ce qui me concerne, la PAC chauffe le ballon selon une loi d’eau (donc en fonction de la température extérieure), et cela est fait nativement par la PAC.

La régulation supplémentaire que je fais par circuit, est surtout liée au fait que chaque étage n’a pas besoin de la même puissance de chauffe (et qui est plus fine / correspond mieux à la réalité de mon intérieur que juste la loi d’eau).

Perso j’en suis pleinement satisfait. Oui le code (node red) est bien dans ce topic au dessus.