[CHAUFFAGE] Régulation simple de la bonne température au bon moment


Wake up Time ! (et bonne année)
Niveau: pas si difficile… version beta à rendre plus facile


Bonjour :call_me_hand:

Je me lance pour partager une première version tout juste fonctionnelle de calcul de l’heure de relance du chauffage… (une autre approche, et surtout une méthode simple pour déterminer les coef, de ce qu’on trouve par ailleurs dans les régulations comme celle très complète de jmcollin avec le détail [ici])

1. Pourquoi faire ça ?
2. La formule mathématique pour les curieux
3. [ÉTAPE 1] Déterminer 2 constantes qui caractérisent ma pièce (procédure à la mano)
4. [ÉTAPE 2] pack variables + script
5. [ÉTAPE 3] utilisation et config dans mes automatisations

1. Objectif… Pour qui ? Pourquoi allumer le chauffage avant de se réveiller le matin ?

confort + économie & simplicité maximum dans le paramétrage (mais précis)

L’inertie thermique (épaisseur des murs, radiateurs à inertie sèche, panneaux rayonnants, etc.) c’est bien pour le confort (chaleur douce), mais le matin le temps que le chauffage se mette en route, je suis déjà parti au boulot, et en heures creuses de nuit c’est plus économique…

Bref, le problème ici c’est d’allumer le chauffage ni trop tôt, ni trop tard, et que ça dépend essentiellement de 2 variables qui changent tous les jours:

  • la température intérieure Tint (°C)
  • la température extérieure Text (°C)

Et d’un objectif fixé :

  • Tsp (set point) ou température de consigne qu’on souhaite au petit-déj !

Voici un exemple concret avec mes température d’une nuit de ce mois de décembre… L’augmentation/diminution de Tint n’est évidemment pas linéaire (mais c’est classique, ce qui est rassurant).


Mon calcul approximatif m’a dit de relancer le chauffage entre 3 et 4h (ma formule n’était pas encore bien calée), et il faut un peu du temps pour que la température augmente (c’est l’inertie thermique de la pièce en plus des déperditions)

Pour ceux qui n’ont pas d’inertie (ex: ventilo-convecteur et logement bien isolé par l’intérieur), ce tuto est inutile, car quelques minutes de chauffage suffisent (et il vaut mieux regarder du côté PID et autres thermostats intelligents ailleurs sur le forum).

2. Trouver le temps nécessaire pour atteindre Tsp le plus simplement possible

Il y a plusieurs paramètres qu’on peut simplifier au maximum en 2 paramètres à déterminer :

  • RCth : combinaison de l’isolation & inertie thermique effective
  • RPth : combinaison de l’isolation et de la puissance de chauffage effective

L’équation est plutôt simple à mettre dans une automatisation (voir la suite) :

Pour les curieux, comment trouver cette formule plus de détails ici

La puissance de chauffage compense les pertes et l’augmentation nécessaire de température :


En supposant que Text est à peu près constant (sinon on prend la moyenne en approximation)
On isole les variations dTint et dt

Et on intègre en Tint,init et Tsp pour la température, et 0 et t pour le temps:

ce qui donne la formule précédente…

3 → ÉTAPE 1. Avant le programme dans HA…

Comment trouver mes deux paramètres RCth et RPth le plus simplement possible ? A priori ça peut se faire tout seul dans HA (automatisation en cours), mais en attendant une automatisation complète il faut faire les 2 petites manips suivantes…

ÉTAPE 1a

RCth à partir de seulement 3 valeurs de températures par nuit calme

L’idéal c’est de regarder dans l’historique plusieurs nuits les plus froides possibles (écarts de température importants plus défavorables et descente importantes de températures) et de noter :

  • la durée, je prend par exemple une durée de 3h (de minuit à 3h du matin - dans les faits il vaut mieux prendre plus longtemps si possible)
  • Text en moyenne entre minuit et 3h
  • Tint(0h)
  • Tint(3h)

Et comme le chauffage est éteint, le terme RPth précédent est nul
(prendre une heure de début de période un peu après l’extinction des radiateurs), et donc :

Pour ce calcul (version beta :slight_smile: )… à vous de faire une feuille EXCEL, en attendant mieux…

Et le vent ?
en fonction des infiltrations d’air du logement, le vent peut avoir de l’influence → RCth diminue quand la vitesse du vent WIND augmente

sujet traité à la suite (et dans un premier temps prendre des nuits sans trop de vent… ou avec beaucoup si on veut le cas vraiment défavorable mais exceptionnel)

Mes valeurs perso de `RCth` sur quelques cas


Dans un premier temps je retiens 45h

automatisation >> en cours

TODO: faire une belle automatisation qui fasse ça tout seul - je n’ai pas trouvé de moyen simple d’extraire une valeur historique de température à une heure donnée
→ en expérimentation

ÉTAPE 1b

RPth la même nuit à la relance du chauffage → comme en 1a, à partir de seulement 3 valeurs de températures par nuit calme…

Par exemple on relance le chauffage à 3h du matin et on note les 3 valeurs de températures :

  • Tint(3h)la température intérieure au démarrage (ici à 3h du matin)
  • Tint(6h)la température intérieure à la fin de la période de 3h (ici à 6h du matin)
  • Text en moyenne entre 3h et 6h
    Et grâce à la valeur de RCth trouvée juste avant on obtient RPth :
Mes valeurs de RPth


dans un premier temps je prends 30 °C

Démonstration pour les curieux

D’après l’équation du temps déterminée en (2.) pour chauffer de Tint(3h) à Tint(6h) en 3 h de temps:


Donc

d’où la formule ci-dessus.

4. → ÉTAPE 2

le plus dur est passé…

Il faut définir dans HA au préalable :

  • un input datetime heure_relance_chauffage (le script va calculer sa valeur) → pour ça on suit dans l’interface paramètres >> appareils et services >> onglet Entrées >> bouton + Créer une entrée - format Heure (pas Date, ni Date et Heure)
  • Ajouter le package ci-dessous dans un fichier que j’appelle ici thermal_recovery_time.yaml :
    • à placer dans son dossier package en suivant le très bon tuto ici pour que tout soit opérationnel au redémarrage de home assistant,
    • et sans oublier de remplacer sensor.salon_temperature par votre propre sensor de température intérieure dans le script
thermal_recovery_time.yaml
input_datetime:
  target_hour:
    name: Wake Up Time (heure de lever)
    has_date: false
    has_time: true
  recoverycalc_hour:
    name: Recovery calculation hour (e.g. 1AM)
    has_date: false
    has_time: true

input_number:
  rcth:
    name: Coefficient RCth
    min: 0
    max: 1000
    step: 0.1
    unit_of_measurement: "h"
  rpth:
    name: Coefficient RPth
    min: -100
    max: 100
    step: 0.1
    unit_of_measurement: "°C"
  tsp:
    name: Consigne (Set Point)
    min: 13
    max: 26
    step: 0.1
    unit_of_measurement: "°C"

template:
  - sensor:
      - name: "RCth"
        state: "{{ states('input_number.rcth') }}"
        unit_of_measurement: "h"
      - name: "RPth"
        state: "{{ states('input_number.rpth') }}"
        unit_of_measurement: "°C"
      - name: "RCth_calculated"
        state: "{{ states('input_number.rcth') }}"
        unit_of_measurement: "h"
      - name: "RPth_calculated"
        state: "{{ states('input_number.rpth') }}"
        unit_of_measurement: "°C"
      - name: "Tsp"
        state: "{{ states('input_number.tsp') }}"
        unit_of_measurement: "°C"
      - name: "exterior_temperature"
        state: >
          {% set weather_entities = states.weather | selectattr('attributes.temperature', 'defined') | list %}
          {% if weather_entities | length > 0 %}
            {{ weather_entities[0].attributes.temperature }}
          {% else %}
            N/A
          {% endif %}
        unit_of_measurement: "°C"

script:
  calculate_recovery_time:
    alias: calcul relance radiateur
    sequence:
      - variables:
          heure_relance_chauffage: >-
            {% set text = states('sensor.exterior_temperature')|float %}
            {% set tint = states('sensor.salon_temperature')|float %}  {# REMPLACER PAR VOTRE SENSOR #}
            {% set tsp = states('input_number.tsp')|float %}
            {% set rcth = states('input_number.rcth')|float %}
            {% set rpth = states('input_number.rpth')|float %}
            {% set target_hour = states.input_datetime.target_hour.attributes.hour %}
            {% set target_minute = states.input_datetime.target_hour.attributes.minute %}
            {% set target_time = now().replace(hour=target_hour, minute=target_minute, second=0, microsecond=0) %}

            {# Calcul de l'heure cible en s'assurant qu'elle est dans le futur #}
            {% if target_time < now() %}
              {% set target_time = target_time + timedelta(days=1) %}
            {% endif %}

            {% set time_remaining = (target_time - now()).total_seconds() / 3600 %}
            {% set max_duration = max((time_remaining - 1/6), 0) %}

            {% set duree_relance = min(max(rcth*log(max((rpth+text-tint)/(rpth+text-tsp),0.1)),0),max_duration) %}

            {# (Prédiction itérative de la température de début de relance et recalcul de la duree de relance) x 4 #}
            {% for i in range(20) %}
              {% set tint_start = text+(tint-text)/e**((time_remaining-duree_relance)/rcth) %}
              {% set duree_relance = min(max(rcth*log(max((rpth+text-tint_start)/(rpth+text-tsp),0.1)),0),max_duration) %}
            {% endfor %}

            {% set seconds = (duree_relance*3600)| int %}
            {% set time = target_time - timedelta(seconds=seconds) %}

            {{ time.strftime('%H:%M:%S') }}
      - metadata: {}
        data:
          datetime: "{{ now().strftime('%Y-%m-%d ') + heure_relance_chauffage }}"
        target:
          entity_id: input_datetime.heure_relance_chauffage
        action: input_datetime.set_datetime
    mode: single
    icon: mdi:hours-24

5. → ÉTAPE 3 (utilisation)

Un petit dashboard pour configurer et tester le script :


On peut changer les valeurs cibles et lancer le calcul pour voir à quelle heure il faudrait relancer le chauffage (avec 4h max de temps de relance dans cette version).

Code du dashboard
type: grid
cards:
  - type: heading
    heading: PARAMETERS (input)
    heading_style: title
    badges: []
  - type: tile
    entity: input_datetime.target_hour
  - type: tile
    entity: input_number.tsp
  - type: custom:mushroom-number-card
    entity: input_number.rpth
    display_mode: buttons
    name: RPth
  - type: custom:mushroom-number-card
    entity: input_number.rcth
    display_mode: buttons
    name: RCth
  - type: tile
    entity: sensor.rpth
  - type: tile
    entity: sensor.rcth
  - type: tile
    grid_options:
      columns: 12
      rows: 1
    entity: script.calcul_relance_radiateur
  - type: tile
    entity: input_datetime.heure_relance_chauffage
  - type: tile
    entity: sensor.heure_relance_chauffage_value

Automatiser le tout

Il suffit de créer 2 automatisations :

  • l’une à heure fixe la nuit (je prends 1h25), pour calculer l’heure de relance
    par ex
  • l’autre pour lancer le chauffage quand on atteint l’heure de relance
    par ex avec mes Nodon fil pilotes

TODO List

  • [EN COURS] automatiser et actualiser au fil de l’eau le calcul des constantes en vérifiant les valeurs aberrantes
  • [EN COURS] recalcul de l’heure prévue en « permanence » (au tiers du temps restant) avant la relance (calculer en permanence la température minimale intérieure en période d’absence, en fonction du temps restant avant le retour, et avec donc aucun ralenti à part le hors-gel. Les ralentis consomment sans intérêt quand on a une relance intelligente…)
  • [EN COURS] ajouter l’effet du vent (cf. détails réponse suivante)
  • [EN COURS] apprentissage auto et relaxation
  • [+TARD] optimiser les temps de relance en fonction des heures creuses (coût des relances), surtout après une période de vacances et une chute importante de température intérieure
  • [+ TARD] prise en compte de l’ensoleillement (combiné à la gestion des stores) pour la relance de jour
  • [++ TARD] anticiper sur la température extérieure en prenant les valeurs à venir à partir de la météo (utile pour les matins très froids avec de fortes chutes de température)
  • [++ TARD] Mettre toutes les variables dans un template pour pouvoir générer plusieurs zones avec chacune son jeu de param.

UPDATE 2025-03jan

  • AJOUT: calcul automatique de la prédiction de température de début de relance en supposant que le chauffage est éteint à ce moment-là (température en décroissance, usage normal du lancement du calcul de la relance)
  • AJOUT: ajout automatique du sensor température extérieure de la météo HA
  • EN COURS: calculs automatiques des paramètres RCth et RPth pour chaque relance (chaque jour) → opérationnel et en cours d’expérimentation chez moi, et update à prévoir si (… le temps le permet, les gens sont intéressés, etc.)

UPDATE 2025-02jan

  • AJOUT: calcul automatique du temps maximum de relance disponible (pas limité à 4h) en considérant l’heure cible comme le lendemain si passée (p. ex. si on lance le calcul à 22h pour une cible à 6h du matin, 8h max de temps de relance)
  • FIXED: correction de bugs sur les valeurs temps calculées
7 « J'aime »

Suite du calcul du temps de relance… l’effet du vent


Pourquoi l’effet du vent

  • Le calcul précédent est déjà très bien… au pire on atteint la température cible un peu trop tôt, ou il ne fait pas si chaud que prévu.
  • Mais on peut observer une véritable dépendance des 2 paramètres RCth et RPth précédents au vent, surtout si comme chez moi c’est bien expo et plutôt pas étanche à l’air.
  • Pour un logement récent sans malfaçon, il ne devrait pas y avoir d’influence notable

Pour le vérifier (et le corriger, ou juste par curiosité)

Pour le vérifier, on peut ajouter les valeurs moyennes de vent dans la feuille EXCEL précédente (en attendant mieux), valeurs historiques de vent qu’on peut facilement avoir dans le monde entier heure par heure sur l’un de ces sites comme celui-ci :
https://www.meteociel.fr/temps-reel/obs_villes.php?code2=7156&jour2=1&mois2=0&annee2=2024

Et en traçant mes valeurs de RCth et RPth en fonction de la vitesse je peux assez facilement établir une corrélation, car évidemment la résistance thermique inclue la conduction dans les murs, mais aussi la ventilation, et surtout les infiltrations qui varient avec la force du vent…

Ça se vérifie assez bien avec mes valeurs de visu par ex. pour RCth

Le risque serait d’extrapoler la droite, ici l’idéal serait de faire un min et un max entre 20 et 55h par exemple. On peut faire facilement une double vérification qu’en prenant les valeurs variables en fonction du vent on arrive à retrouver les temps de chauffage à + ou - 30 minutes en général.

Ça devient un petit peu compliqué, et l’idéal serait aussi d’automatiser ça, car finalement on a tout pour cacher la théorie et rendre tout ça transparent :slight_smile: .

5 « J'aime »

Au top !
Merci bcp. J’ai migré de jeedom à home assistant et cette fonction d’anticipation du chauffage me manquait beaucoup. Je vais faire les tests de mon coté pour voir si çà fonctionne bien chez moi

Dans un 1er temps j’ai reussi à recreer les calculs dans excel à partir de tes données même si tu pars sur des intervales de temps différents des 3h de ta formule et les adapter à ma situation

J’ai un RCTH moyen autour de 110 de mon coté, mais je pense devoir affiner davantage (j’ai testé avec les temperatures durant mes vacances, sans chauffage activé mais la maison était déjà bien refroidie autour de 13/14°C et je pense que la variation de température ne reflète pas la réalité de lorsque l’on est présent, plutot autour des 17/18°C)

En tout cas je vais suivre avec impatience la suite !!!
Merci encore

1 « J'aime »

Merci du retour, je fais une petite série d’essai sur 1 ou 2 semaines avec le calcul automatique et je verrai comment l’ajouter au package pour que ce soit simple…
c’est encore une version très beta, mais je suis preneur de toute amélioration (tout en essayant de rester le plus simple possible, pas facile de ne pas partir dans une usine à gaz avec des scheduler), et en tout cas ne pas hésiter à adapter à sa façon et à combiner avec chacun son usine.

pour les valeurs, il faudra peut-être aussi différencier les paramètres de relance après vacances des relances en semaine… à mon avis les valeurs en semaine sont plus régulières, à tester…

1 « J'aime »

Hello !!
Meilleurs vœux à toi, et surtout belle trouvaille que je vois là, je vais suivre de très près ta solution. Et je suis comme @dedelastuce dedelastuce, venant de jeedom, je trouve que c’est ce qu’il manque le plus à la solution de @jmcollin
Une question me brule les lèvres quand même ! :slight_smile: Pourquoi ne pas vous rapprocher mutuellement et unir vos talents pour proposer le meilleur des 2 mondes ?

2 « J'aime »

Merci pour ce retour bien sympa.
Pour l’instant ça reste bien mon modeste de mon côté, et j’aime bien l’idée que ce soit modulaire et que ça puisse se combiner ou contribuer à d’autres solutions :+1:

Par ex, j’ai un calendrier de chauffage automatique à la semaine, qui se combine sans problème avec cette programmation de la relance, les 2 modules fonctionnent sans interférer.

J’essaie aussi de bien comprendre ce qui se passe avec le moins de paramètres possibles… Du coup je suis impatient aussi mais je manque encore de recul… Et en particulier sur comment l’inclure proprement avec d’autres solutions de thermostat, perso je manque d’exp, mais toutes les infos sont là !

Quelques news sur les nouveautés en test (et à voir ce que je pourrai mettre proprement d’une MàJ… peut-être ce week-end :wink: )

  • [OK] Le calcul automatique de RTch et RPch marche vraiment bien
  • [OK] J’ai ajouté un truc vraiment sympa, c’est le recalcul de l’heure prévue en « permanence » (au tiers du temps restant) avant la relance… même avec des coeffs pas vraiment adaptés (55km/h de vent moyen cette nuit) j’atteins la consigne à 0,1°C près ce matin à 6h (ma target time)

    donc ici pour un calcul assez faux à 23h (target time à 4h20), le recalcul au fil de l’eau m’a conduit à avoir une relance à 3h21 beaucoup plus juste, soit 1h de plus de chauffage en mode BOOST (à cause du vent)… Et comme ça, ça a l’air bien robuste, ça devrait être ok pour le mettre aussi.
  • [En cours] la régression en fonction du vent, a priori plutôt en échelle log, mais ce sera certainement beaucoup plus simple que ça à mettre en place avec 3 valeurs de coeffs: vent faible / moyen / fort (ce sera largement suffisant à mon avis, et en automatique pas besoin de chercher à comprendre)
  • [En cours] l’apprentissage automatique des valeurs et la mise à jour, faut que je teste plus et le moyen de mettre à jour (a priori un coef de relaxation variable en fonction de l’erreur observée en target time si trop tôt, ou en écart à la température de consigne si trop tard), mais ça a l’air bien régulier, donc pas de raison que ça ne marche pas… Et en tout cas il faudra que ça reste une option activable pour éviter de faire dériver les coeff par accident quand tout est bien calé…

Bref, un peu ambitieux tout ça, et peut-être que dans une semaine plus rien ne marche :sweat_smile:

1 « J'aime »

Nouvelle interface pour un minimum d’INPUT et calculs tout automatiques


Seulement 4 inputs:

  • nom du capteur de température intérieur utilisé (sensor)
  • heure d’arrêt du chauffage
  • heure de réveil
  • température souhaitée

Et a priori ça marche plutôt bien ces dernières semaines, à voir la robustesse de l’auto-adaptation.
Seul souci il va me falloir le temps de mettre à jour la doc (le package est prêt)… pas facile de vérifier que tout marche la nuit -_-

Bon je continue à me répondre au fil de l’eau, du coup ça m’a parut plus pratique de tout mettre dans un git :

Je n’ai pour l’instant documenté que la version simplifiée avec la calibration toute automatisée des constantes (en espérant que ça ne foute pas le bazar, mais vu le nombre d’utilisateur -moi- ya pas de risque :see_no_evil: )

Par contre il y a aussi la possibilité d’ajuster correctement à la main en visualisant les outputs détaillés (configuration avancée), là aussi RCth et RPth sont calculés automatiquement (et conservés en mémoire pour vérifier), mais en plus on peut aussi les fixer manuellement pour éviter que ça yoyotte…

Et on pourrait aussi affiner la valeur du coeff de relaxation pour « l’apprentissage » auto, mais du coup je n’ai aucun recul là-dessus et je fais avec ce que j’ai (ma maison :grin: ).

Des courageux pour installer ce package (c’est sûr que ce n’est pas le plus pratique, l’avantage est qu’il n’y a que 4 paramètres à régler ensuite) et pour me faire des retours ?
(et pleins de critiques)… N’hésitez pas ! Et des critiques constructives aussi pourquoi pas.

Et aussi, je débute et je ne sais pas faire mieux que ce système de package et de multiples scripts et variables pour l’instant (j’ai quand même essayé de limiter le nombre de lignes, mais il y aurait du ménage à faire), et il faudrait certainement faire plein d’autres améliorations, cf. ma liste au père noël (la todo list) à laquelle il faudrait vraiment ajouter le fait de tout mettre dans une même entité pour gérer plusieurs pièces par ex (j’ai pas un château, ce n’est pas ma priorité, mais ce serait plus propre).