🧠 Auto TPI : Guide Technique Approfondi

NOTE

Ce document est destiné aux utilisateurs avancés qui souhaitent comprendre en détail le fonctionnement de l'algorithme Auto TPI. Pour une introduction plus accessible, consultez le Guide Utilisateur Auto TPI.


Sommaire

  1. L'algorithme TPI
  2. Cycle d'apprentissage détaillé
  3. Calibration de la capacité thermique
  4. Algorithmes de calcul des coefficients
  5. Mécanismes de correction automatique
  6. ParamÚtres avancés et constantes
  7. Services et API
  8. Diagnostic et dépannage avancé

L'algorithme TPI

Principe fondamental

L'algorithme TPI (Time Proportional & Integral) calcule un pourcentage de puissance de chauffe à chaque cycle. Ce pourcentage détermine le temps pendant lequel le chauffage sera actif durant le cycle (ex: 60% sur un cycle de 10 minutes = 6 minutes de chauffe).

Formule de base

Power = (Kint × ΔT_intĂ©rieur) + (Kext × ΔT_extĂ©rieur)

OĂč :

  • Kint (tpi_coef_int) : Coefficient intĂ©rieur, rĂ©agit Ă  l'Ă©cart avec la consigne
  • Kext (tpi_coef_ext) : Coefficient extĂ©rieur, compense les pertes thermiques
  • ΔT_intĂ©rieur = Consigne − TempĂ©rature intĂ©rieure
  • ΔT_extĂ©rieur = Consigne − TempĂ©rature extĂ©rieure
graph LR
    subgraph Entrées
        A[Température intérieure]
        B[Température extérieure]
        C[Consigne]
    end
    
    subgraph Calcul TPI
        D["ΔT_int = Consigne - T_int"]
        E["ΔT_ext = Consigne - T_ext"]
        F["Power = Kint×ΔT_int + Kext×ΔT_ext"]
    end
    
    subgraph Sortie
        G["% Puissance (0-100%)"]
        H["Temps ON/OFF"]
    end
    
    A --> D
    C --> D
    B --> E
    C --> E
    D --> F
    E --> F
    F --> G
    G --> H

RĂŽle des coefficients

CoefficientRĂŽleSituation d'apprentissage
KintContrÎle la réactivité : plus il est élevé, plus le chauffage réagit vite aux écartsPendant la montée en température (écart > 0.05°C, puissance < 99%)
KextCompense les pertes thermiques : plus il est élevé, plus le chauffage anticipe le refroidissementPendant la stabilisation autour de la consigne (écart < 0.5°C)

Cycle d'apprentissage détaillé

Vue d'ensemble du flux

flowchart TD
    subgraph Initialisation
        A[Lancement session] --> B{Taux de chauffe = 0?}
        B -->|Oui| C[Pré-calibration historique]
        B -->|Non| G[Apprentissage actif]
        
        C --> D{Fiabilité >= 20%?}
        D -->|Oui| G
        D -->|Non| E[Mode Bootstrap]
        E -->|3 cycles agressifs| F[Capacité estimée]
        F --> G
    end
    
    subgraph "Boucle d'apprentissage"
        G --> H[Début cycle TPI]
        H --> I[Snapshot état initial]
        I --> J[Exécution chauffe ON/OFF]
        J --> K[Fin cycle: mesure ΔT]
        K --> L{Conditions valides?}
        
        L -->|Non| M[Skip learning]
        L -->|Oui| N{Analyse situation}
        
        N -.->|Overshoot| O[🔾 Correction Kext<br/>optionnel]
        N -.->|Stagnation| P[🔾 Boost Kint<br/>optionnel]
        N -->|Montée T°| Q[Apprentissage Kint]
        N -->|Stabilisation| R[Apprentissage Kext]
        
        O -.-> S[Mise Ă  jour coefficients]
        P -.-> S
        Q --> S
        R --> S
        M --> H
        S --> H
    end
    
    subgraph Finalisation
        S --> T{50 cycles Kint ET Kext?}
        T -->|Non| H
        T -->|Oui| U[Sauvegarde config]
        U --> V[Notification fin]
    end
    
    style O fill:#fff3cd,stroke:#ffc107,stroke-width:2px
    style P fill:#fff3cd,stroke:#ffc107,stroke-width:2px

NOTE

Les cases jaunes avec lignes pointillĂ©es (🔾) reprĂ©sentent les mĂ©canismes de correction optionnels. Ils doivent ĂȘtre activĂ©s explicitement via les paramĂštres du service set_auto_tpi_mode.

Détail du snapshot de cycle

À chaque dĂ©but de cycle, l'algorithme capture l'Ă©tat actuel :

Donnée capturéeUtilisation
last_temp_inTempérature intérieure au début du cycle
last_temp_outTempérature extérieure au début du cycle
last_orderConsigne au début du cycle
last_powerPuissance calculée pour ce cycle (0.0 à 1.0)
last_stateMode HVAC (heat/cool)

À la fin du cycle, on compare ces valeurs avec les mesures actuelles pour calculer la progression.

Conditions de validation d'un cycle

Un cycle est ignoré pour l'apprentissage si :

ConditionRaison
Puissance = 0% ou 100%Saturation : pas d'information exploitable sur l'efficacité
Consigne modifiéeL'objectif a changé en cours de cycle
Délestage actifLe chauffage a été forcé OFF par le Power Manager
Détection panneAnomalie détectée (chauffage inefficace)
ChaudiÚre centrale OFFLe thermostat demande mais la chaudiÚre ne répond pas
Premier cycle aprÚs redémarragePas de donnée de référence valide

Calibration de la capacité thermique

Définition

La capacité thermique (ou taux de chauffe) représente la vitesse de montée en température maximale de votre systÚme, exprimée en °C par heure (°C/h).

Exemple : Une capacité de 2.0 °C/h signifie que votre radiateur peut faire monter la température de 2°C en une heure à pleine puissance (dans des conditions adiabatiques idéales).

Méthodes de détermination

graph TD
    A[Taux de chauffe = 0?] -->|Oui| B[Pré-calibration]
    A -->|Non| C[Utiliser valeur configurée]
    
    B --> D{Historique disponible?}
    D -->|Oui| E[Analyse historique]
    D -->|Non| F[Mode Bootstrap]
    
    E --> G{Fiabilité >= 20%?}
    G -->|Oui| H[Capacité calibrée]
    G -->|Non| F
    
    F --> I[3 cycles agressifs Kint=1.0 Kext=0.1]
    I --> J[Mesure montée réelle]
    J --> K[Capacité estimée]
    
    H --> L[Apprentissage Kint/Kext]
    K --> L
    C --> L

Pré-calibration par analyse d'historique

Le service auto_tpi_calibrate_capacity analyse l'historique des capteurs :

  1. Récupération des données temperature_slope et power_percent sur 30 jours
  2. Filtrage : ne conserve que les points oĂč power >= 95%
  3. Élimination des outliers par mĂ©thode IQR (Interquartile Range)
  4. Calcul du 75Úme percentile des pentes (plus représentatif que la médiane)
  5. Correction adiabatique : CapacitĂ© = P75 + Kext × ΔT
  6. Application marge de sécurité : 20% par défaut

Mode Bootstrap

Si l'historique est insuffisant (fiabilité < 20%), le systÚme entre en mode bootstrap :

  • Coefficients agressifs : Kint = 1.0, Kext = 0.1
  • DurĂ©e : 3 cycles minimum
  • Objectif : Provoquer une montĂ©e en tempĂ©rature significative pour mesurer la capacitĂ© rĂ©elle
  • SĂ©curitĂ© timeout : Si Ă©chec aprĂšs 5 cycles, capacitĂ© par dĂ©faut = 0.3 °C/h (systĂšmes lents)

Algorithmes de calcul des coefficients

Apprentissage de Kint (Coefficient Intérieur)

L'algorithme ajuste Kint quand la température monte en direction de la consigne.

Formule détaillée

flowchart LR
    subgraph "1. Capacité effective"
        A["C_eff = C_ref × (1 - Kext × ΔT_ext)"]
    end
    
    subgraph "2. Montée max possible"
        B["max_rise = C_eff × durĂ©e_cycle × efficiency"]
    end
    
    subgraph "3. Cible ajustée"
        C["target = min(écart_consigne, max_rise)"]
    end
    
    subgraph "4. Ratio"
        D["ratio = (target / montĂ©e_rĂ©elle) × aggressiveness"]
    end
    
    subgraph "5. Nouveau Kint"
        E["Kint_new = Kint_old × ratio"]
    end
    
    A --> B --> C --> D --> E

Variables utilisées

VariableDescriptionValeur typique
C_refCapacité de référence calibrée1.5 °C/h
KextCoefficient extérieur actuel0.02
ΔT_extÉcart T° intĂ©rieure/extĂ©rieure15°C
durée_cycleEn heures0.167 (10 min)
efficiencyPourcentage de puissance utilisée0.70
aggressivenessFacteur de modération0.9

Apprentissage de Kext (Coefficient Extérieur)

L'algorithme ajuste Kext quand la température est proche de la consigne (|écart| < 0.5°C).

Formule

Correction = Kint × (Ă©cart_intĂ©rieur / Ă©cart_extĂ©rieur)
Kext_new = Kext_old + Correction
  • Si Ă©cart_intĂ©rieur nĂ©gatif (overshoot) → Correction nĂ©gative → Kext diminue
  • Si Ă©cart_intĂ©rieur positif (undershoot) → Correction positive → Kext augmente

Méthodes de lissage

Deux méthodes sont disponibles pour lisser les nouvelles valeurs :

Moyenne Pondérée (mode "Découverte")

Kint_final = (Kint_old × count + Kint_new) / (count + 1)
CyclePoids ancienPoids nouveauImpact nouvelle valeur
11150%
101019%
505012%

Le compteur est plafonné à 50 pour maintenir une réactivité minimale.

EWMA (mode "Ajustement fin")

Kint_final = (1 - α) × Kint_old + α × Kint_new
α(n) = α₀ / (1 + decay_rate × n)
ParamÚtreDéfautDescription
α₀ (alpha initial)0.08Poids initial des nouvelles valeurs
decay_rate0.12Vitesse de diminution de alpha

Apprentissage Continu du Kext

Ce mécanisme permet une adaptation à long terme de KextK_{ext} sans session d'apprentissage active.

Conditions d'éligibilité

Un cycle est utilisé pour l'apprentissage continu uniquement si :

  1. Fonctionnalité activée : auto_tpi_continuous_kext est à true.
  2. Bootstrap terminé : Au moins un cycle d'apprentissage extérieur a été effectué précédemment pour le mode actuel.
  3. Puissance non saturĂ©e : 0<Preˊelle<Psaturation0 < P_{rĂ©elle} < P_{saturation}.
  4. SystĂšme stable : Pas d'interruption de cycle, pas de chaudiĂšre arrĂȘtĂ©e, pas de panne de chauffage, et pas d'Ă©checs consĂ©cutifs excessifs.
  5. Delta extĂ©rieur significatif : ∣Consigne−TextâˆŁâ‰„1,0°C|Consigne - T_{ext}| \ge 1,0°C.
  6. Pas de changement de consigne : La température cible n'a pas changé pendant le cycle.

Formule d'apprentissage continu

La correction est calculĂ©e de maniĂšre similaire Ă  l'apprentissage KextK_{ext} standard : Kextcible=Kextancien+Kint×ΔTintΔTextK_{ext}^{cible} = K_{ext}^{ancien} + K_{int} \times \frac{\Delta T_{int}}{\Delta T_{ext}}

Ensuite, elle est appliquĂ©e via un EWMA avec un alpha spĂ©cifique : Kextnouveau=(1−αcont)×Kextancien+αcont×KextcibleK_{ext}^{nouveau} = (1 - \alpha_{cont}) \times K_{ext}^{ancien} + \alpha_{cont} \times K_{ext}^{cible}

Par défaut, αcont=0,04\alpha_{cont} = 0,04.


Mécanismes de correction automatique

Correction d'overshoot (Deboost Kext)

Activation : ParamĂštre allow_kext_compensation_on_overshoot dans le service set_auto_tpi_mode

Détecte et corrige quand la température dépasse la consigne sans redescendre.

flowchart TD
    A{T° > Consigne + 0.2°C?} -->|Oui| B{Puissance > 5%?}
    B -->|Oui| C{T° ne descend pas?}
    C -->|Oui| D[Correction Kext]
    
    A -->|Non| E[Pas de correction]
    B -->|Non| E
    C -->|Non| E
    
    D --> F["reduction = overshoot × Kint / ΔT_ext"]
    F --> G["Kext_cible = max(0.001, Kext - reduction)"]
    G --> H[Application avec boost alpha ×2]

Correction de stagnation (Boost Kint)

Activation : ParamĂštre allow_kint_boost_on_stagnation dans le service set_auto_tpi_mode

Détecte et corrige quand la température stagne malgré un écart significatif.

flowchart TD
    A{Écart > 0.5°C?} -->|Oui| B{Progression < 0.02°C?}
    B -->|Oui| C{Puissance < 99%?}
    C -->|Oui| D{Boosts consécutifs < 5?}
    D -->|Oui| E[Boost Kint]
    
    A -->|Non| F[Pas de correction]
    B -->|Non| F
    C -->|Non| F
    D -->|Non| G[Alerte chauffage sous-dimensionné]
    
    E --> H["boost = 8% × min(Ă©cart/0.3, 2.0)"]
    H --> I["Kint_cible = Kint × (1 + boost)"]

ParamÚtres avancés et constantes

Constantes internes (non configurables)

ConstanteValeurDescription
MIN_KINT0.01Plancher de Kint pour garder une réactivité
OVERSHOOT_THRESHOLD0.2°CSeuil de dépassement pour déclencher correction
OVERSHOOT_POWER_THRESHOLD5%Puissance min pour considérer un overshoot comme erreur Kext
OVERSHOOT_CORRECTION_BOOST2.0Multiplicateur alpha pendant correction
NATURAL_RECOVERY_POWER_THRESHOLD20%Puissance max pour skip apprentissage en retour naturel
INSUFFICIENT_RISE_GAP_THRESHOLD0.5°CÉcart min pour dĂ©clencher boost Kint
MAX_CONSECUTIVE_KINT_BOOSTS5Limite avant alerte sous-dimensionnement
MIN_PRE_BOOTSTRAP_CALIBRATION_RELIABILITY20%Fiabilité min pour skip bootstrap

ParamĂštres configurables

ParamÚtreTypeDéfautRange
AgressivitéSlider1.00.5 - 1.0
Temps de chauffeMinutes51 - 30
Temps de refroidissementMinutes71 - 60
Taux de chauffe°C/h0 (auto)0 - 5.0
Poids initial (Découverte)Entier11 - 50
Alpha (Ajustement fin)Float0.080.01 - 0.3
Decay rateFloat0.120.0 - 0.5

Services et API

versatile_thermostat.set_auto_tpi_mode

ContrĂŽle le dĂ©marrage/arrĂȘt de l'apprentissage.

service: versatile_thermostat.set_auto_tpi_mode
target:
  entity_id: climate.mon_thermostat
data:
  auto_tpi_mode: true                    # true = dĂ©marrer, false = arrĂȘter
  reinitialise: true                     # true = reset complet, false = reprendre
  allow_kint_boost_on_stagnation: false  # Boost Kint si stagnation
  allow_kext_compensation_on_overshoot: false  # Correction Kext si overshoot

versatile_thermostat.auto_tpi_calibrate_capacity

Calibre la capacité thermique à partir de l'historique.

service: versatile_thermostat.auto_tpi_calibrate_capacity
target:
  entity_id: climate.mon_thermostat
data:
  start_date: "2024-01-01T00:00:00+00:00"  # Optionnel
  end_date: "2024-02-01T00:00:00+00:00"    # Optionnel
  min_power_threshold: 95                   # % min de puissance
  capacity_safety_margin: 20                # Marge de sécurité %
  save_to_config: true                      # Sauvegarder dans config

Retours du service :

CléDescription
max_capacityCapacité brute calculée (°C/h)
recommended_capacityCapacité aprÚs marge (°C/h)
reliabilityIndice de fiabilité (%)
samples_usedNombre d'échantillons
outliers_removedNombre d'outliers éliminés

Diagnostic et dépannage avancé

Capteur de diagnostic

Entité : sensor.<nom>_auto_tpi_learning_state

AttributDescription
activeApprentissage en cours
heating_cycles_countTotal cycles observés
coeff_int_cyclesCycles Kint validés
coeff_ext_cyclesCycles Kext validés
model_confidenceConfiance 0.0 - 1.0
calculated_coef_intKint actuel
calculated_coef_extKext actuel
last_learning_statusRaison dernier cycle
capacity_heat_statuslearning ou learned
capacity_heat_valueCapacité actuelle (°C/h)

Statuts d'apprentissage courants

StatutSignificationAction suggérée
learned_indoor_heatKint mis Ă  jour avec succĂšsNormal
learned_outdoor_heatKext mis Ă  jour avec succĂšsNormal
power_out_of_rangePuissance à 0% ou 100%Attendre un cycle non saturé
real_rise_too_smallMontée < 0.01°CVérifier capteur ou durée cycle
setpoint_changed_during_cycleConsigne modifiĂ©eÉviter de toucher la consigne
no_capacity_definedPas de capacité calibréeAttendre calibration/bootstrap
corrected_kext_overshootCorrection overshoot appliquéeNormal si Kext trop élevé
corrected_kint_insufficient_riseBoost Kint appliquéNormal si Kint trop bas
max_kint_boosts_reached5 boosts consécutifsChauffage sous-dimensionné

Arbre de décision de diagnostic

flowchart TD
    A[ProblÚme détecté] --> B{Kint ou Kext?}
    
    B -->|Kint trop bas| C[T° monte lentement]
    C --> D{AprĂšs 10 cycles?}
    D -->|Oui| E[Vérifier temps chauffe/refroid]
    D -->|Non| F[Attendre convergence]
    
    B -->|Kint trop haut| G[Oscillations T°]
    G --> H[Réduire agressivité]
    
    B -->|Kext trop bas| I[T° chute en dessous consigne]
    I --> J[Vérifier capteur T° ext]
    
    B -->|Kext trop haut| K[Overshoot persistant]
    K --> L[Activer allow_kext_compensation]
    
    A --> M{Pas d'apprentissage?}
    M -->|power_out_of_range| N[Chauffage saturé]
    N --> O[Attendre conditions favorables]
    M -->|no_capacity_defined| P[Pas de calibration]
    P --> Q[Vérifier historique ou forcer valeur]

Fichier de persistance

Emplacement : .storage/versatile_thermostat_{unique_id}_auto_tpi_v2.json

Ce fichier contient l'Ă©tat complet de l'apprentissage et est restaurĂ© au redĂ©marrage de Home Assistant. Il peut ĂȘtre supprimĂ© pour forcer un reset complet (non recommandĂ©).

Synchronisation au démarrage

À chaque dĂ©marrage, si l'Apprentissage Continu du Kext est activĂ©, le systĂšme effectue un Alignement entre les donnĂ©es stockĂ©es (JSON) et la configuration Home Assistant (ConfigEntry) :

  1. Plafonnement : Les coefficients chargés sont immédiatement limités par la borne max_coef_int (sécurité standard).
  2. Synchronisation Kext et Puissance : Si le KextK_{ext} ou la puissance de chauffe/clim en configuration diffÚrent de la valeur apprise stockée (capturée via l'adaptation en arriÚre-plan sans rechargement immédiat), l'intégration effectue une mise à jour atomique de la configuration. Cela garantit que l'interface utilisateur et la configuration restent synchronisées avec le modÚle de bùtiment le plus précis.

Annexes

Références aux valeurs recommandées

Type de chauffageTemps chauffeTemps refroidCapacité typique
Convecteur électrique2-5 min3-7 min2.0-3.0 °C/h
Radiateur à inertie5-10 min10-20 min1.0-2.0 °C/h
Plancher chauffant15-30 min30-60 min0.3-0.8 °C/h
ChaudiÚre centrale5-15 min10-30 min1.0-2.5 °C/h

Formules mathématiques complÚtes

CapacitĂ© effective : Ceff=Cref×(1−Kext×ΔText)C_{eff} = C_{ref} \times (1 - K_{ext} \times \Delta T_{ext})

Alpha adaptatif (EWMA) : α(n)=α01+k×n\alpha(n) = \frac{\alpha_0}{1 + k \times n}

FiabilitĂ© calibration : reliability=100×min⁥(samples20,1)×max⁥(0,1−CV2)reliability = 100 \times \min\left(\frac{samples}{20}, 1\right) \times \max\left(0, 1 - \frac{CV}{2}\right)

OĂč CV = Coefficient de Variation (Ă©cart-type / moyenne)