Versatile Thermostat: Auto TPI Coefficients ( discussion math/algo )

C’est Kext qui réagit dans la boucle de regulation.

En ce moment c’est normal d’avoir beaucoup de saturation vu les températures. C’est pas idéal pour l’apprentissage.
C’est pour ça que je conseille de commencer l’apprentissage avec une valeur Kext quasi nulle ( 0.01 ca suffit ). Ca evitera de saturer trop vite.
Cela dis meme avec un kext à 0.03, avec 0° de T° ext , 1° de difference de consigne ca pousse à 100%.

Augmenter taux de chauffe, plutôt quel ordre 0.7 ?

Oui colle ton taux de chauffe au plus pres de sa capacité ( - 15-20% ) , sauf si surdimensionné.
Dans la nouvelle version, le service call Calibrate Capacity va te sortir un résultat recommandé avec la marge de 20%.

Après faut qd meme se méfier un peu de ce service il est très dépendant de la qualité des data dans l’historique. Ca donne qd même une bonne idée.
L’essentiel étant de ne pas le surestimer sinon il va envoyer ton Kint sur la lune. Mais trop bas, l’auto tpi va croire qu’il chauffe trop et faire tomber Kint.

Jai légèrement sous dimensionné le heating a 5 min par rapport à la réalité de chauffe physique,

Heating/cooling time ( temps de chauffe/reffroidissement ) sont les paramètres les plus importants pour que le système ai une bonne visibilité de l’inertie. Plus te sera pret de la réalité, meilleurs les coeffs calculés seront. C’est facile à tuner, t’as une methode dans la doc qui est assez evidente ( i.e demarrer une chauffe à 100% de puissance alors que le rad est froid. Mesurer le temps qu’il a mis avant d’etre considéré comme chaud. Couper le chauffage. Mesurer le temps qu’il met à refroidir. )

Augmenter temps de cycle de consigne,

Oui laisse le temps de stabiliser que Kext puisse aussi etre calculé correctement.
Kint se calcule pendant la montée en t°( hors saturation ) , Kext une fois près de la consigne.

OK j’avais fait le test et j’étais de l’ordre de 15-20min pour chauffe et 45 min de refroidissement, ce n’est pas contradictoire avec des cycles de 10 min ? J’ai la sensation qu’il avait plus de mal apprendre (saturation plus régulières donc moins de cycles validés)

On parle bien de la chauffe matérielle brute ou faut il inclure le temps de début de propagation vers le capteur comme c’est précisé dans la doc.

Je pense que je vais reprendre mes paramètres comme tu le préconises, faire un reset et laissé faire plusieurs sessions, j’ai trop tendance à ajuster au jour le jour…

Merci a toi

A vrai dire je ne sais pas trop pour l’instant. La logique voudrait qu’il faille compter le temps de propagation, mais j’ai de bons résultats juste avec la chauffe du rad. A moins d’avoir le capteur vraiment très éloigné je ne pense pas que ce soit necessaire.

C’est pas grave si tu as moins de cycles validés, c’est qu’il fait bien son job justement à ignorer ce qui doit l’être. Faut juste lui laisser prendre son temps.

Par contre des cycles TPI de 10mn avec l’inertie de ton radiateur c’est un peu short. Si il met 45mn à refroidir, des cycles de 20mn seront plus adaptés.
Perso j’ai des cycles de 15mn avec des rads qui mettent 5mn à chauffer et moins de 10 à refroidir.

Radiateur à inertie donc ça mets du temps à refroidir :slight_smile:

Je recalibre tout ça et je deviens un peu plus patient (résolution 2026), merci pour tes réponses je reviens vers toi si besoin, ce sera plutôt l’année prochaine :wink:

Bonnes fêtes à tous

1 « J'aime »

Bonjour @KipK,

Je n’attend pas de réponse rapide, sachant ton état grippal, j’en profite pour te souhaiter un prompt rétablissement.

J’arrive au therme de l’apprentissage, et je m’aperçois que plus celui-ci avance moins la consigne est respecté. Le chauffage chauffe même si consigne plus basse que température relevé hors des heures de chauffes du sheluder.

Pour rappel test sur sèche serviette à bain d’huile dans une salle de bain d’environ 6m2.
Capteur de température à environ 2 mètres de celui-ci.

ci joint les graph sur 7 jours.

On s’aperçoit bien que plus l’apprentissage ce fait moins la courbe de descente des températures relevées est franche après la baisse de la température consigne.

Bonne fin d’année 2025 à tous :partying_face:

Salut

Tu peux poster tout tes paramètres auto-tpi ( pas les screenshots please ) ?

Bon le kInt qui descend à 0.03 je pense que t’aurais pu arrêter l’apprentissage avant, il y a un soucis.

je vois que la température monte dans la pièce alors que le rad tourne à peine. Cette pièce à l’air d’être chauffée naturellement par une autre. Ça a complètement faussé Kint.

On voit aussi une nette remontée des températures extérieure le jour sur la fin du graph. Ce qui colle avec les temp qui ne descende pas en bas de de consigne la journée.

Le Kext n’a pas monté tant que ça durant l’apprentissage, c’est pas lui qui empêche la redescente de température. D’autant qu’on voit bein que le rad tourne à peine dans ces phases la.

Salut,

Je voudrais juste une précision avant de me lancer dans les tests.

Il est dit dans la doc qu’il faut une mesure précise de la température extérieure.

Est ce à dire que l’intégration météo n’est pas suffisante et qui faut investir dans une sonde extérieure ?

C’est pareil que pour la régulation TPI. Ca necessite des relevés de temperature exterieur suffisement mis à jours, et qui correspondent à la réalité.

Cela dit si avec la meteo tu juges que les valeurs sont bonnes, ca devrait pas être un soucis. Mais il me semble que c’est mis à jours que toutes les heures non ?

Edit: attends qd même la prochaine release, j’ai corrigé un souci important sur l’algo introduit dans la derniere version.

1 « J'aime »

Bonjour @KipK,

J’espère que tu te remets bien et que tu vas pouvoir profiter du Nouvel An.

Je te fais part de mes retours sur l’auto TPI. Je suis passé sur un apprentissage continu avec trois radiateurs.

  1. Je suis surpris de voir mon Kint ne faire que diminuer, avec pour effet une mise en chauffe très lente (0.0978).
  2. L’anticipation de chauffe s’est effectuée de manière trop brutale et sans respecter le minimum d’activation qui était réglé à 45 secondes (lors de mes tests). À tel point que, malgré un dépassement flagrant de la consigne, ils continuaient à chauffer. Le seul moyen que j’ai trouvé pour revenir à la normale a été de désactiver l’auto TPI et de redémarrer HA.
Courbes d'auto TPI

Courbes du VTherm

Pour info, les données sont celles du 31/12, mais l’auto TPI a été arrêté le 29/12. D’ailleurs, je suis surpris de voir que les dates last_update_date, last_heater_stop_time et cycle_start_date sont à la date du jour alors que l’auto TPI est désactivé.

Attributs du VTherm
hvac_modes:
  - heat
  - "off"
min_temp: 7
max_temp: 35
target_temp_step: 0.1
preset_modes:
  - none
  - frost
  - eco
  - comfort
  - boost
current_temperature: 16.2
temperature: 16.2
hvac_action: idle
preset_mode: eco
hvac_mode: heat
ema_temp: 16.27
specific_states:
  is_on: true
  last_central_mode: null
  last_update_datetime: "2025-12-31T14:03:11.944230+01:00"
  ext_current_temperature: 4.1
  last_temperature_datetime: "2025-12-31T13:50:33.464277+01:00"
  last_ext_temperature_datetime: "2025-12-31T14:03:11.934659+01:00"
  is_device_active: false
  device_actives: []
  nb_device_actives: 0
  ema_temp: 16.27
  temperature_slope: 0
  hvac_off_reason: null
  total_energy: 11277.5
  last_change_time_from_vtherm: "2025-12-31T09:00:00.010174+01:00"
  messages:
    - target_temp_absence_detected
  is_sleeping: false
  is_locked: false
  is_recalculate_scheduled: false
  auto_tpi_state: "off"
  auto_tpi_learning:
    coeff_indoor_heat: 0.09776825622825949
    coeff_outdoor_heat: 0.015139316060197562
    coeff_indoor_autolearn: 54
    coeff_outdoor_autolearn: 211
    coeff_indoor_cool: 0.61
    coeff_outdoor_cool: 0.012
    coeff_indoor_cool_autolearn: 1
    coeff_outdoor_cool_autolearn: 0
    max_capacity_heat: 1.25
    max_capacity_cool: 1
    offset: 0
    last_power: 0.2
    last_order: 16.2
    last_temp_in: 16.2
    last_temp_out: 3.2
    last_state: heat
    previous_state: heat
    last_on_temp_in: 0
    last_update_date: "2025-12-31T13:58:23.695342"
    last_heater_stop_time: "2025-12-31T13:58:23.594394"
    cycle_start_date: "2025-12-31T13:58:23.695342"
    cycle_active: true
    current_cycle_cold_factor: 0.00016824666666666666
    consecutive_failures: 0
    autolearn_enabled: false
    last_learning_status: learning_disabled
    total_cycles: 2066
    consecutive_boosts: 0
    recent_errors:
      - -0.11518593274368484
      - -0.11557617809257117
      - -0.11596788029436686
      - -0.11604677285551535
      - -0.11616219697433779
      - -0.11627180120470854
      - -0.11684489255416036
      - -0.117624161938864
      - -0.11792349564804631
      - -0.11833988417699588
      - -0.11723816896964874
      - -0.11661523724089766
      - -0.11808986936785792
      - -0.11816118251697871
      - -0.11644465959240234
      - -0.11676378452720315
      - -0.11719391416530103
      - -0.12063575057874297
      - -0.32041640175215363
      - -0.19676806058236102
    regime_change_detected: true
    learning_start_date: "2025-12-24T09:15:07.985198"
configuration:
  ac_mode: false
  type: over_switch
  is_controlled_by_central_mode: false
  target_temperature_step: 0.1
  timezone: Europe/Paris
  temperature_unit: °C
  is_used_by_central_boiler: false
  max_on_percent: null
  have_valve_regulation: false
  cycle_min: 5
  minimal_activation_delay_sec: 60
  minimal_deactivation_delay_sec: 0
preset_temperatures:
  frost_temp: 10
  eco_temp: 16.2
  boost_temp: 22
  comfort_temp: 18
  frost_away_temp: 7
  eco_away_temp: 16.2
  boost_away_temp: 22
  comfort_away_temp: 17.4
current_state:
  hvac_mode: heat
  target_temperature: 16.2
  preset: eco
requested_state:
  hvac_mode: heat
  target_temperature: 16.2
  preset: eco
is_presence_configured: true
presence_manager:
  presence_sensor_entity_id: binary_sensor.auto_maison_occupee
  presence_state: "off"
is_power_configured: false
power_manager:
  device_power: 1500
  mean_cycle_power: 270
is_motion_configured: false
is_window_configured: true
is_window_auto_configured: false
window_manager:
  window_state: "off"
  window_auto_state: unavailable
  window_action: window_turn_off
  is_window_bypass: false
  window_sensor_entity_id: binary_sensor.0xa4c1389163d5c213_contact
  window_delay_sec: 30
  window_off_delay_sec: 30
  window_auto_open_threshold: null
  window_auto_close_threshold: null
  window_auto_max_duration: null
is_safety_configured: true
safety_manager:
  safety_state: "off"
  safety_delay_min: 120
  safety_min_on_percent: 0.2
  safety_default_on_percent: 0.1
is_lock_configured: true
lock_manager:
  is_locked: false
  lock_users: true
  lock_automations: true
  lock_code: false
is_over_switch: true
on_percent: 0.18
power_percent: 18
vtherm_over_switch:
  is_inversed: false
  keep_alive_sec: 0
  underlying_entities:
    - select.module_fp_extension_pilot_wire_mode
  on_percent: 0.18
  power_percent: 18
  on_time_sec: 0
  off_time_sec: 300
  function: tpi
  tpi_coef_int: 0.24
  tpi_coef_ext: 0.015
  tpi_threshold_low: 0
  tpi_threshold_high: 0
  minimal_activation_delay: 60
  minimal_deactivation_delay: 0
  calculated_on_percent: 0.18
  vswitch_on_commands:
    - select_option/option:comfort
  vswitch_off_commands:
    - select_option/option:frost_protection
icon: mdi:radiator
friendly_name: Radiateur de l'extension
supported_features: 401
  1. J’ai également utilisé le service de calibration de l’auto TPI, mais il ne retourne des valeurs que pour un seul VTherm. Les radiateurs sont en fonctionnement depuis plusieurs mois et il y a des variations de température ; je ne comprends pas pourquoi je n’ai pas de retours.
Résultats du service
climate.radiateur_de_la_salle_de_jeux:
  success: false
  error: Not enough valid samples (0 found, minimum 2 required)
  samples_used: 0
  rejection_stats:
    low_power: 387
    wrong_direction: 0
    invalid: 354
climate.radiateur_de_la_chambre:
  success: false
  error: Not enough valid samples (1 found, minimum 2 required)
  samples_used: 1
  rejection_stats:
    low_power: 120
    wrong_direction: 0
    invalid: 196
climate.radiateur_de_la_chambre_des_gacons:
  success: false
  error: Not enough valid samples (0 found, minimum 2 required)
  samples_used: 0
  rejection_stats:
    low_power: 393
    wrong_direction: 0
    invalid: 344
climate.radiateur_de_l_extension:
  success: true
  capacity: 0.502
  observed_capacity: 0.32
  kext_compensation: 0.181
  avg_delta_t: 12.1
  samples_used: 3
  samples_before_filter: 3
  outliers_removed: 0
  reliability: 1
  min_power_threshold: 0.95
  period: 10.4
Graph du radiateur de la salle de jeux

Bon réveillon à toi

salut @KipK

climate.chauffage_sdb:
  success: false
  error: Not enough valid samples (0 found, minimum 2 required)
  samples_used: 0
  rejection_stats:
    low_power: 231
    wrong_direction: 3
    invalid: 382

Bizarre lors de la mise en route j’avais un Succes: true

hvac_modes:
  - heat
  - "off"
min_temp: 7
max_temp: 28
target_temp_step: 0.1
friendly_name: Chauffage SDB
supported_features: 401
current_temperature: 18.9
temperature: 17.1
preset_modes:
  - none
  - frost
  - eco
  - comfort
  - boost
hvac_action: idle
preset_mode: eco
hvac_mode: heat
ema_temp: 18.9
specific_states:
  is_on: true
  last_central_mode: null
  last_update_datetime: "2025-12-31T14:44:16.985195+01:00"
  ext_current_temperature: 8.1
  last_temperature_datetime: "2025-12-31T13:27:44.593448+01:00"
  last_ext_temperature_datetime: "2025-12-31T14:36:47.862400+01:00"
  is_device_active: false
  device_actives: []
  nb_device_actives: 0
  ema_temp: 18.9
  temperature_slope: 0
  hvac_off_reason: null
  total_energy: 0
  last_change_time_from_vtherm: "2025-12-31T14:40:13.804438+01:00"
  messages: []
  is_sleeping: false
  is_locked: true
  is_recalculate_scheduled: false
  auto_tpi_state: "on"
  auto_tpi_learning:
    coeff_indoor_heat: 0.03212215718368796
    coeff_outdoor_heat: 0.012262009050398303
    coeff_indoor_autolearn: 46
    coeff_outdoor_autolearn: 666
    coeff_indoor_cool: 0.4
    coeff_outdoor_cool: 0.03
    coeff_indoor_cool_autolearn: 1
    coeff_outdoor_cool_autolearn: 0
    max_capacity_heat: 1
    max_capacity_cool: 1
    offset: 0
    last_power: 0.05
    last_order: 17.1
    last_temp_in: 18.9
    last_temp_out: 8.1
    last_state: heat
    previous_state: heat
    last_on_temp_in: 0
    last_update_date: "2025-12-31T14:40:13.804599"
    last_heater_stop_time: "2025-12-31T14:35:02.064835"
    cycle_start_date: "2025-12-31T14:40:13.804599"
    cycle_active: true
    current_cycle_cold_factor: 0.25978313666666664
    consecutive_failures: 0
    autolearn_enabled: true
    last_learning_status: on_time_too_short_vs_heating_time
    total_cycles: 1294
    consecutive_boosts: 0
    recent_errors: []
    regime_change_detected: false
    learning_start_date: "2025-12-22T12:05:57.037481"
configuration:
  ac_mode: false
  type: over_switch
  is_controlled_by_central_mode: false
  target_temperature_step: 0.1
  timezone: Europe/Paris
  temperature_unit: °C
  is_used_by_central_boiler: false
  max_on_percent: null
  have_valve_regulation: false
  cycle_min: 10
  minimal_activation_delay_sec: 60
  minimal_deactivation_delay_sec: 0
preset_temperatures:
  frost_temp: 7
  eco_temp: 17.1
  boost_temp: 22
  comfort_temp: 21
  frost_away_temp: 0
  eco_away_temp: 0
  boost_away_temp: 0
  comfort_away_temp: 0
current_state:
  hvac_mode: heat
  target_temperature: 17.1
  preset: eco
requested_state:
  hvac_mode: heat
  target_temperature: 17.1
  preset: eco
is_presence_configured: false
is_power_configured: false
power_manager:
  device_power: 0.8
  mean_cycle_power: 0
is_motion_configured: false
is_window_configured: true
is_window_auto_configured: true
window_manager:
  window_state: unknown
  window_auto_state: unknown
  window_action: window_eco_temp
  is_window_bypass: false
  window_sensor_entity_id: null
  window_delay_sec: 30
  window_off_delay_sec: 30
  window_auto_open_threshold: 3
  window_auto_close_threshold: 0.5
  window_auto_max_duration: 30
is_safety_configured: true
safety_manager:
  safety_state: "off"
  safety_delay_min: 180
  safety_min_on_percent: 0.7
  safety_default_on_percent: 0.5
is_lock_configured: true
lock_manager:
  is_locked: true
  lock_users: true
  lock_automations: false
  lock_code: true
is_over_switch: true
on_percent: 0.05
power_percent: 5
vtherm_over_switch:
  is_inversed: false
  keep_alive_sec: 0
  underlying_entities:
    - climate.ecosy_sdb
  on_percent: 0.05
  power_percent: 5
  on_time_sec: 0
  off_time_sec: 600
  function: tpi
  tpi_coef_int: 0.03212215718368796
  tpi_coef_ext: 0.012262009050398303
  tpi_threshold_low: 0
  tpi_threshold_high: 0
  minimal_activation_delay: 60
  minimal_deactivation_delay: 0
  calculated_on_percent: 0.05
  vswitch_on_commands:
    - set_hvac_mode/hvac_mode:heat
  vswitch_off_commands:
    - set_hvac_mode/hvac_mode:cool

Que préconises tu comme délais ?

C’est une salle de bain utilisée, donc effectivement la température monte à chaque utilisation (Douches, Bains, Quand ces dames passent 1 heure à ce sécher les cheveux)

Le Sud, en ce moment +15° la journée, +2° au heures les plus froides de la nuit.

Salut

  1. Je suis surpris de voir mon Kint ne faire que diminuer, avec pour effet une mise en chauffe très lente (0.0978).

C’est dépendant de la valeur de Taux de chauffe qui doit être sous estimée. Augmente cette valeur elle sert à ça. Tu as mis quoi ?

Par contre je vois qu’il n’y a quasi aucun changements de consigne sur toute ta période d’apprentissage. Pour que l’algo ai de quoi calculer Kint correctement, il faut qu’il ai le plus de cycles de chauffe.
Kint est calculé quand le delta t°/consigne est suffisant ( et que le cycle n’était pas à 100% ) , sinon c’est juste Kext qui travaille.

Je viens aussi de corriger et améliorer quelques trucs dans la prochaine version.

L’anticipation de chauffe s’est effectuée de manière trop brutale et sans respecter le minimum d’activation qui était réglé à 45 secondes (lors de mes tests). À tel point que, malgré un dépassement flagrant de la consigne, ils continuaient à chauffer. Le seul moyen que j’ai trouvé pour revenir à la normale a été de désactiver l’auto TPI et de redémarrer HA.

La je ne vois pas du tout en quoi ça peut etre lié, auto-tpi ne touche pas à la régulation. Il ne fait qu’injecter les coefficients pendant l’apprentissage. Enfin normalement, faudrait qd même comprendre. Tu as des logs ?

HA ne garde les données brutes que 10-15j je crois par défaut.
Donc ca dépend vraiment de ce qui s’est passé les 2 dernières semaines finalement. Les données ensuites sont filtrées et bcp moins fiables, souvent éliminées.

Mais baisse le seuil de puissance min jusqu’à ce que ca te sorte un résultat. C’est que le radiateurs ne tourne que rarement autour de ces puissances.
Comme marqué dans la doc, le service est pas essentiel, une estimation de la valeur suffit.

J ai mis 1,25C/h ne pouvant avoir le retour du service je me suis basé sur le radiateur de 1500W alors qu il en fait 1000W. En passant à 80% sur trois mois j obtiens deux exemples avec come résultat.

observed_capacity: 1.04
 kext_compensation: 0.204

Je vais fouiller

Salut @KipK,
pour la carte auto tpi, on a besoin de quel historique ?
celui du climate et auto_tpi_learning_state ?
il faut les deux , le climate et auto_tpi_learning_state ou le auto_tpi_learning_state suffit ?
comme j’avais tout exclu dans mon recorder, je n’avais pas d’historique. Je les est ajouter, mais me suis retrouver avec 30mo de plus sur ma DB.

Salut,

yes il faut les 2. Les climates VT font à peu près 30-40mo avec la retention par défaut.

1 « J'aime »

Merci pour cette belle contribution. Je viens de l’activer et je me demande si la limite de puissance globale ne va pas empêcher le bon calcul ?

1 « J'aime »

Hello,

Petite question sur les Paramétres pour la méthode EMA. j’ai laisser par défaut les valeurs de base car c’est le début de l’apprentissage mais si je comprend bien le tableau :

Situation Alpha (ema_alpha) Taux de Décroissance (ema_decay_rate)
Apprentissage initial 0.15 0.08
Apprentissage fin 0.08 0.12
Apprentissage continu 0.05 0.02

Je dois changer les paramètres au fur & a mesure ou je met direct apprentissage continu (ce que j’ai cocher dans les paramètres)

Merci

ne coche pas apprentissage continu pour l’instant. Fait un apprentissage complet déjà. Pour un apprentissage de départ je conseille qd meme la methode average.. Et l’ema pour partir de coeff existants.
Mettre Kint à 0.4 et Kext à 0.02 pour commencer c’est bien.

Je coniseille de ne pas cocher le deboost Kext en démarrant l’apprentissage. Je pense qu’avec les dernières modifs il n’y a pas besoin.
Pour le boost Kint pour l’instant je fais sans et ca fonctionne bien chez moi. Les maths derrières ont tendances à dire qu’on ne devrait pas avoir à influencer, malheureusement il y a toujours des edges cases qui viennent perturber tout ça.

1 « J'aime »

Ok top par contre j’ai tous le temps cette erreur : last_learning_status: on_time_too_short_vs_heating_time

c’est pas une erreur. C’est juste que ce cycle il n’avait rien à apprendre.