Suggestions pour piloter un plancher chauffant hydrolique (via PAC)

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.

@Dapolux
merci pour tes super infos, ton approche correspond en gros à mon besoin.
juste une petite question, peux-tu avoir une ouverture partielle (50% par ex en mettant 60 seconde de fonctionnement) avec ton servomoteur?
Aujourd’hui c’est ce que je fais à la main: quand je veux 1° en moins dans une pièce par rapport au séjour (pièce avec le thermostat de la PAC) alors je ferme d’un demi tour la vanne.
J’aimerais éviter de faire du tout ou rien qui me parait moins fin et surtout va me demander de re-créer toute la logique de réglage et risque d’avoir une courbe de température moins lisse

Merci

Nojour @olivierarthus,

Oui biensur, c’est ce que je fais (c’est tout l’intérêt des vannes 3 voies), l’ouverture du servomoteur dépend de l’écart entre la température de consigne, et la température mesurée (plus le delta est grand, plus j’ouvre le servomoteur).

Extrait de mon nodered:

if (delta > 1) {ouverture = 100;}
else if (delta >= 0.6) {ouverture = 75;}
else if (delta >= 0.2) {ouverture = 50;}
else if (delta >= -0.2) {ouverture = 25;}

merci @Dapolux cela me fait progresser.
Par contre sauf erreur de ma part ce type de vanne 3 voies ne peut pas se monter sur la nourrice sur chaque tête (qui correspond à une pièce), mais bien en amont de la nourrice, car je n’ai pas 3 voies sur mes têtes de nourrice, à moins que je n’ai rien compris
Sais-tu s’il existe l’équivalent de ta vanne pour une tête de nourrice avec réglage autre que on/off?

Merci

Discussion très interessante !
Je suis chauffagiste et connais un peu le sujet. Programmer une régulation dans HA, c’est par contre autre chose ! :upside_down_face:
Sur les principes de régulation, je partage cet article qui est très intéressant et accessible pour comprendre les différents types de régulation dans le chauffage et pourquoi on utilise une régulation de type PI pour les chauffage à eau plutôt que les régulation de type P (qui ne permettent pas d’atteindre la consigne…) ou de type PID (qui surréagissent et sont adaptés aux système à faible inertie comme les climatisations). A mon avis, c’est dans cette voie là qu’il faut creuser pour répondre à la question intiale.
Les différents types de régulation
Concernant la question sur la gestion individuelle de chaque pièce, il existe des vannes motorisées qui se mettent sur les nourrices de PC Vanne motorisée mais, à mon sens, elles n’ont un intérêt que lorsqu’on a un PC très réactif (avec une chappe fine). Dès lors que l’inertie augmente et qu’on dépasse les 2 ou 3 heures de réactivité (ce qui est très courant sur un plancher chauffant avec une chappe de 5 cm), je pense qu’il faut se « contenter » de la démarche de @Dapolux .

@gic
merci pour ta réponse d’expert.
La vanne motorisée que tu mentionnes est de type on/off, or je recherche une vanne de type « progressive », pour répliquer ce que je fais à la main.
Tu dis que si le plancher a une interie > 3h (c’est mon cas mais je suis à la limite) il faut se contenter d’une vanne on/off. Je t’avoue ne pas comprendre la logique: pour moi même avec forte initerie une vanne progressive pour certaines pièces sera toujours préférable: en effet en on/off tu auraus toujours plus de varaiation qu’avec du progressif et donc un confort supplémentaire.
L’utilisation principale de ce système pour moi est pour des pièces type chambre d’ami que je veux chauffer à 14-15° en générale, puis monter à ,18-19 lorsqu’elle va être occupée.

Merci

Ce type de matériel n’existe pas en progressif à ma connaissance. Tous les modèles que je connais sont en TOR.
C’est pour cela que ça ne fait de sens que sur des systèmes à faible inertie. Sinon, le temps que ça se réveille, il fait soit trop chaud, soit trop froid !

Un lien vers un site pro avec pas mal de matériel de ce type
TBS

Dans ton cas, ça n’a pas grand importance puisque ce n’est pas pour faire de la régulation à la maille de l’heure mais plutôt sur des temps longs.
En temps normal, pièce inoccupée, vanne fermée. Elle s’ouvre seulement si la température baisse sous les 14 degrés pour ajouter quelques degrés (attention, en dessous de 14,15, tu peux avoir des problèmes d’humidité…), et quand la chambre d’amis prévoit d’être occupée, tu l’ouvres et elle passe sur une régulation similaire au reste de la maison.