# 🧠 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](feature-autotpi.md). --- ## Sommaire 1. [L'algorithme TPI](#lalgorithme-tpi) 2. [Cycle d'apprentissage dĂ©taillĂ©](#cycle-dapprentissage-dĂ©taillĂ©) 3. [Calibration de la capacitĂ© thermique](#calibration-de-la-capacitĂ©-thermique) 4. [Algorithmes de calcul des coefficients](#algorithmes-de-calcul-des-coefficients) 5. [MĂ©canismes de correction automatique](#mĂ©canismes-de-correction-automatique) 6. [ParamĂštres avancĂ©s et constantes](#paramĂštres-avancĂ©s-et-constantes) 7. [Services et API](#services-et-api) 8. [Diagnostic et dĂ©pannage avancĂ©](#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 ```mermaid 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 | Coefficient | RĂŽle | Situation d'apprentissage | |-------------|------|---------------------------| | **Kint** | ContrĂŽle la **rĂ©activitĂ©** : plus il est Ă©levĂ©, plus le chauffage rĂ©agit vite aux Ă©carts | Pendant la **montĂ©e en tempĂ©rature** (Ă©cart > 0.05°C, puissance < 99%) | | **Kext** | Compense les **pertes thermiques** : plus il est Ă©levĂ©, plus le chauffage anticipe le refroidissement | Pendant la **stabilisation** autour de la consigne (Ă©cart < 0.5°C) | --- ## Cycle d'apprentissage dĂ©taillĂ© ### Vue d'ensemble du flux ```mermaid 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
optionnel] N -.->|Stagnation| P[🔾 Boost Kint
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Ă©e | Utilisation | |-----------------|-------------| | `last_temp_in` | TempĂ©rature intĂ©rieure au dĂ©but du cycle | | `last_temp_out` | TempĂ©rature extĂ©rieure au dĂ©but du cycle | | `last_order` | Consigne au dĂ©but du cycle | | `last_power` | Puissance calculĂ©e pour ce cycle (0.0 Ă  1.0) | | `last_state` | Mode 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 : | Condition | Raison | |-----------|--------| | Puissance = 0% ou 100% | Saturation : pas d'information exploitable sur l'efficacitĂ© | | Consigne modifiĂ©e | L'objectif a changĂ© en cours de cycle | | DĂ©lestage actif | Le chauffage a Ă©tĂ© forcĂ© OFF par le Power Manager | | DĂ©tection panne | Anomalie dĂ©tectĂ©e (chauffage inefficace) | | ChaudiĂšre centrale OFF | Le thermostat demande mais la chaudiĂšre ne rĂ©pond pas | | Premier cycle aprĂšs redĂ©marrage | Pas 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 ```mermaid 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 ```mermaid 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 | Variable | Description | Valeur typique | |----------|-------------|----------------| | `C_ref` | CapacitĂ© de rĂ©fĂ©rence calibrĂ©e | 1.5 °C/h | | `Kext` | Coefficient extĂ©rieur actuel | 0.02 | | `ΔT_ext` | Écart T° intĂ©rieure/extĂ©rieure | 15°C | | `durĂ©e_cycle` | En heures | 0.167 (10 min) | | `efficiency` | Pourcentage de puissance utilisĂ©e | 0.70 | | `aggressiveness` | Facteur de modĂ©ration | 0.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) ``` | Cycle | Poids ancien | Poids nouveau | Impact nouvelle valeur | |-------|--------------|---------------|------------------------| | 1 | 1 | 1 | 50% | | 10 | 10 | 1 | 9% | | 50 | 50 | 1 | 2% | > 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Ăštre | DĂ©faut | Description | |-----------|--------|-------------| | `α₀` (alpha initial) | 0.08 | Poids initial des nouvelles valeurs | | `decay_rate` | 0.12 | Vitesse de diminution de alpha | ### Apprentissage Continu du Kext Ce mĂ©canisme permet une adaptation Ă  long terme de $K_{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 < 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 - 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 $K_{ext}$ standard : $$K_{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 : $$K_{ext}^{nouveau} = (1 - \alpha_{cont}) \times K_{ext}^{ancien} + \alpha_{cont} \times K_{ext}^{cible}$$ Par dĂ©faut, $\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. ```mermaid 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. ```mermaid 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) | Constante | Valeur | Description | |-----------|--------|-------------| | `MIN_KINT` | 0.01 | Plancher de Kint pour garder une rĂ©activitĂ© | | `OVERSHOOT_THRESHOLD` | 0.2°C | Seuil de dĂ©passement pour dĂ©clencher correction | | `OVERSHOOT_POWER_THRESHOLD` | 5% | Puissance min pour considĂ©rer un overshoot comme erreur Kext | | `OVERSHOOT_CORRECTION_BOOST` | 2.0 | Multiplicateur alpha pendant correction | | `NATURAL_RECOVERY_POWER_THRESHOLD` | 20% | Puissance max pour skip apprentissage en retour naturel | | `INSUFFICIENT_RISE_GAP_THRESHOLD` | 0.5°C | Écart min pour dĂ©clencher boost Kint | | `MAX_CONSECUTIVE_KINT_BOOSTS` | 5 | Limite avant alerte sous-dimensionnement | | `MIN_PRE_BOOTSTRAP_CALIBRATION_RELIABILITY` | 20% | FiabilitĂ© min pour skip bootstrap | ### ParamĂštres configurables | ParamĂštre | Type | DĂ©faut | Range | |-----------|------|--------|-------| | **AgressivitĂ©** | Slider | 1.0 | 0.5 - 1.0 | | **Temps de chauffe** | Minutes | 5 | 1 - 30 | | **Temps de refroidissement** | Minutes | 7 | 1 - 60 | | **Taux de chauffe** | °C/h | 0 (auto) | 0 - 5.0 | | **Poids initial** (DĂ©couverte) | Entier | 1 | 1 - 50 | | **Alpha** (Ajustement fin) | Float | 0.08 | 0.01 - 0.3 | | **Decay rate** | Float | 0.12 | 0.0 - 0.5 | --- ## Services et API ### `versatile_thermostat.set_auto_tpi_mode` ContrĂŽle le dĂ©marrage/arrĂȘt de l'apprentissage. ```yaml 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. ```yaml 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_capacity` | CapacitĂ© brute calculĂ©e (°C/h) | | `recommended_capacity` | CapacitĂ© aprĂšs marge (°C/h) | | `reliability` | Indice de fiabilitĂ© (%) | | `samples_used` | Nombre d'Ă©chantillons | | `outliers_removed` | Nombre d'outliers Ă©liminĂ©s | --- ## Diagnostic et dĂ©pannage avancĂ© ### Capteur de diagnostic EntitĂ© : `sensor._auto_tpi_learning_state` | Attribut | Description | |----------|-------------| | `active` | Apprentissage en cours | | `heating_cycles_count` | Total cycles observĂ©s | | `coeff_int_cycles` | Cycles Kint validĂ©s | | `coeff_ext_cycles` | Cycles Kext validĂ©s | | `model_confidence` | Confiance 0.0 - 1.0 | | `calculated_coef_int` | Kint actuel | | `calculated_coef_ext` | Kext actuel | | `last_learning_status` | Raison dernier cycle | | `capacity_heat_status` | `learning` ou `learned` | | `capacity_heat_value` | CapacitĂ© actuelle (°C/h) | ### Statuts d'apprentissage courants | Statut | Signification | Action suggĂ©rĂ©e | |--------|---------------|-----------------| | `learned_indoor_heat` | Kint mis Ă  jour avec succĂšs | Normal | | `learned_outdoor_heat` | Kext mis Ă  jour avec succĂšs | Normal | | `power_out_of_range` | Puissance Ă  0% ou 100% | Attendre un cycle non saturĂ© | | `real_rise_too_small` | MontĂ©e < 0.01°C | VĂ©rifier capteur ou durĂ©e cycle | | `setpoint_changed_during_cycle` | Consigne modifiĂ©e | Éviter de toucher la consigne | | `no_capacity_defined` | Pas de capacitĂ© calibrĂ©e | Attendre calibration/bootstrap | | `corrected_kext_overshoot` | Correction overshoot appliquĂ©e | Normal si Kext trop Ă©levĂ© | | `corrected_kint_insufficient_rise` | Boost Kint appliquĂ© | Normal si Kint trop bas | | `max_kint_boosts_reached` | 5 boosts consĂ©cutifs | **Chauffage sous-dimensionnĂ©** | ### Arbre de dĂ©cision de diagnostic ```mermaid 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 $K_{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 chauffage | Temps chauffe | Temps refroid | CapacitĂ© typique | |-------------------|---------------|---------------|------------------| | Convecteur Ă©lectrique | 2-5 min | 3-7 min | 2.0-3.0 °C/h | | Radiateur Ă  inertie | 5-10 min | 10-20 min | 1.0-2.0 °C/h | | Plancher chauffant | 15-30 min | 30-60 min | 0.3-0.8 °C/h | | ChaudiĂšre centrale | 5-15 min | 10-30 min | 1.0-2.5 °C/h | ### Formules mathĂ©matiques complĂštes **CapacitĂ© effective** : $$C_{eff} = C_{ref} \times (1 - K_{ext} \times \Delta T_{ext})$$ **Alpha adaptatif (EWMA)** : $$\alpha(n) = \frac{\alpha_0}{1 + k \times n}$$ **FiabilitĂ© calibration** : $$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)