🧠 Auto TPI: Detaillierter technischer Leitfaden

NOTE

Dieses Dokument richtet sich an fortgeschrittene Benutzer, die den Auto-TPI-Algorithmus im Detail verstehen möchten. Eine zugĂ€nglichere EinfĂŒhrung finden Sie im Auto TPI Benutzerleitfaden.


Inhaltsverzeichnis

  1. Der TPI-Algorithmus
  2. Detaillierter Lernzyklus
  3. Kalibrierung der thermischen KapazitÀt
  4. Algorithmen zur Koeffizientenberechnung
  5. Automatische Korrekturmechanismen
  6. Erweiterte Parameter und Konstanten
  7. Dienste und API
  8. Erweiterte Diagnose und Fehlerbehebung

Der TPI-Algorithmus

Grundlegendes Prinzip

Der TPI-Algorithmus (Time Proportional & Integral) berechnet bei jedem Zyklus einen Leistungsprozentsatz. Dieser Prozentsatz bestimmt, wie lange die Heizung wÀhrend des Zyklus aktiv ist (z. B. 60 % bei einem 10-Minuten-Zyklus = 6 Minuten Heizen).

Basiskonzept

Leistung = (Kint × ΔT_innen) + (Kext × ΔT_außen)

Wobei:

  • Kint (tpi_coef_int): Innenkoeffizient, reagiert auf die Differenz zum Sollwert
  • Kext (tpi_coef_ext): Außenkoeffizient, kompensiert thermische Verluste
  • ΔT_innen = Sollwert − Innentemperatur
  • ΔT_außen = Sollwert − Außentemperatur
graph LR
    subgraph Eingaben
        A[Innentemperatur]
        B[Außentemperatur]
        C[Sollwert]
    end
    
    subgraph TPI-Berechnung
        D["ΔT_int = Sollwert - T_int"]
        E["ΔT_ext = Sollwert - T_ext"]
        F["Leistung = Kint×ΔT_int + Kext×ΔT_ext"]
    end
    
    subgraph Ausgabe
        G["Leistung % (0-100%)"]
        H["AN/AUS-Zeit"]
    end
    
    A --> D
    C --> D
    B --> E
    C --> E
    D --> F
    E --> F
    F --> G
    G --> H

Rolle der Koeffizienten

KoeffizientRolleLern-Situation
KintSteuert die ReaktivitÀt: Je höher er ist, desto schneller reagiert die Heizung auf AbweichungenWÀhrend des Temperaturanstiegs (Abweichung > 0,05°C, Leistung < 99%)
KextKompensiert thermische Verluste: Je höher er ist, desto mehr antizipiert die Heizung die AbkĂŒhlungWĂ€hrend der Stabilisierung um den Sollwert (Abweichung < 0,5°C)

Detaillierter Lernzyklus

Ablauf-Übersicht

flowchart TD
    subgraph Initialisierung
        A[Sitzung starten] --> B{Heizrate = 0?}
        B -->|Ja| C[Historische Vorkalibrierung]
        B -->|Nein| G[Aktives Lernen]
        
        C --> D{ZuverlÀssigkeit >= 20%?}
        D -->|Ja| G
        D -->|Nein| E[Bootstrap-Modus]
        E -->|3 aggressive Zyklen| F[GeschÀtzte KapazitÀt]
        F --> G
    end
    
    subgraph "Lernschleife"
        G --> H[TPI-Zyklus starten]
        H --> I[Anfangszustand erfassen]
        I --> J[Heizung AN/AUS ausfĂŒhren]
        J --> K[Zyklusende: ΔT messen]
        K --> L{GĂŒltige Bedingungen?}
        
        L -->|Nein| M[Lernen ĂŒberspringen]
        L -->|Ja| N{Situation analysieren}
        
        N -.->|Überschwingen| O[🔾 Kext-Korrektur<br/>optional]
        N -.->|Stagnation| P[🔾 Kint-Boost<br/>optional]
        N -->|T° steigt| Q[Kint-Lernen]
        N -->|Stabilisierung| R[Kext-Lernen]
        
        O -.-> S[Koeffizienten aktualisieren]
        P -.-> S
        Q --> S
        R --> S
        M --> H
        S --> H
    end
    
    subgraph Finalisierung
        S --> T{50 Zyklen Kint UND Kext?}
        T -->|Nein| H
        T -->|Ja| U[In Konfig speichern]
        U --> V[End-Benachrichtigung]
    end
    
    style O fill:#fff3cd,stroke:#ffc107,stroke-width:2px
    style P fill:#fff3cd,stroke:#ffc107,stroke-width:2px

NOTE

Gelbe Boxen mit gestrichelten Linien (🔾) stellen optionale Korrekturmechanismen dar. Diese mĂŒssen explizit ĂŒber die Parameter des Dienstes set_auto_tpi_mode aktiviert werden.

Details zur Zustandserfassung (Snapshot)

Zu Beginn jedes Zyklus erfasst der Algorithmus den aktuellen Zustand:

Erfasste DatenVerwendung
last_temp_inInnentemperatur zu Zyklusbeginn
last_temp_outAußentemperatur zu Zyklusbeginn
last_orderSollwert zu Zyklusbeginn
last_powerBerechnete Leistung fĂŒr diesen Zyklus (0,0 bis 1,0)
last_stateHVAC-Modus (Heizen/KĂŒhlen)

Am Ende des Zyklus werden diese Werte mit den aktuellen Messungen verglichen, um den Fortschritt zu berechnen.

Validierungsbedingungen fĂŒr Zyklen

Ein Zyklus wird fĂŒr das Lernen ignoriert, wenn:

BedingungGrund
Leistung = 0% oder 100%SĂ€ttigung: Keine verwertbaren Informationen zur Effizienz
Sollwert geÀndertZielwert mitten im Zyklus geÀndert
Lastabwurf aktivHeizung wurde vom Power Manager zwangsweise AUS geschaltet
Fehler erkanntAnomalie festgestellt (Heizung ohne Wirkung)
Zentralheizkessel AUSThermostat fordert an, aber Kessel reagiert nicht
Erster Zyklus nach NeustartKeine gĂŒltigen Referenzdaten

Kalibrierung der thermischen KapazitÀt

Definition

Die thermische KapazitĂ€t (oder Heizrate) reprĂ€sentiert die maximale Geschwindigkeit des Temperaturanstiegs Ihres Systems, ausgedrĂŒckt in °C pro Stunde (°C/h).

Beispiel: Eine KapazitÀt von 2,0 °C/h bedeutet, dass Ihr Heizkörper die Temperatur unter idealen (adiabatischen) Bedingungen bei voller Leistung in einer Stunde um 2 °C anheben kann.

Bestimmungsmethoden

graph TD
    A[Heizrate = 0?] -->|Ja| B[Vorkalibrierung]
    A -->|Nein| C[Konfigurierten Wert nutzen]
    
    B --> D{Historie verfĂŒgbar?}
    D -->|Ja| E[Historien-Analyse]
    D -->|Nein| F[Bootstrap-Modus]
    
    E --> G{ZuverlÀssigkeit >= 20%?}
    G -->|Ja| H[Kalibrierte KapazitÀt]
    G -->|No| F
    
    F --> I[3 aggressive Zyklen Kint=1.0 Kext=0.1]
    I --> J[TatsÀchlichen Anstieg messen]
    J --> K[GeschÀtzte KapazitÀt]
    
    H --> L[Kint/Kext Lernen]
    K --> L
    C --> L

Vorkalibrierung via Historien-Analyse

Der Dienst auto_tpi_calibrate_capacity analysiert die Sensorhistorie:

  1. Abruf der Daten von temperature_slope und power_percent ĂŒber 30 Tage
  2. Filterung: BehÀlt nur Punkte bei, an denen power >= 95 % war
  3. Ausreißer-Eliminierung mittels IQR-Methode (Interquartile Range)
  4. Berechnung des 75. Perzentils der Steigungen (reprÀsentativer als der Median)
  5. Adiabatische Korrektur: KapazitĂ€t = P75 + Kext × ΔT
  6. Anwendung einer Sicherheitsmarge: standardmĂ€ĂŸig 20 %

Bootstrap-Modus

Wenn die Historie unzureichend ist (ZuverlÀssigkeit < 20 %), wechselt das System in den Bootstrap-Modus:

  • Aggressive Koeffizienten: Kint = 1.0, Kext = 0.1
  • Dauer: mindestens 3 Zyklen
  • Ziel: Einen signifikanten Temperaturanstieg auslösen, um die tatsĂ€chliche KapazitĂ€t zu messen
  • Sicherheits-Timeout: Wenn nach 5 Zyklen kein Erfolg eintritt, wird eine StandardkapazitĂ€t von 0,3 °C/h angenommen (fĂŒr langsame Systeme)

Algorithmen zur Koeffizientenberechnung

Kint-Lernen (Innenkoeffizient)

Der Algorithmus passt Kint an, wenn die Temperatur in Richtung des Sollwerts steigt.

Detaillierte Formel

flowchart LR
    subgraph "1. Effektive KapazitÀt"
        A["C_eff = C_ref × (1 - Kext × ΔT_ext)"]
    end
    
    subgraph "2. Max. möglicher Anstieg"
        B["max_rise = C_eff × Zyklusdauer × Effizienz"]
    end
    
    subgraph "3. Angepasstes Ziel"
        C["target = min(Sollwert-Differenz, max_rise)"]
    end
    
    subgraph "4. VerhÀltnis"
        D["ratio = (target / tatsĂ€chlicher_Anstieg) × AggressivitĂ€t"]
    end
    
    subgraph "5. Neues Kint"
        E["Kint_neu = Kint_alt × ratio"]
    end
    
    A --> B --> C --> D --> E

Verwendete Variablen

VariableBeschreibungTypischer Wert
C_refKalibrierte ReferenzkapazitÀt1.5 °C/h
KextAktueller Außenkoeffizient0.02
ΔT_extDifferenz Innen-/Außentemp15°C
ZyklusdauerIn Stunden0.167 (10 Min.)
EffizienzVerwendeter Leistungsprozentsatz0.70
AggressivitÀtModerationsfaktor0.9

Kext-Lernen (Außenkoeffizient)

Der Algorithmus passt Kext an, wenn die Temperatur nahe am Sollwert ist (|Abweichung| < 0,5°C).

Formel

Korrektur = Kint × (Abweichung_innnen / Abweichung_außen)
Kext_neu = Kext_alt + Korrektur
  • Wenn Abweichung_innen negativ (Überschwingen) → Negative Korrektur → Kext sinkt
  • Wenn Abweichung_innen positiv (Unterschreiten) → Positive Korrektur → Kext steigt

GlÀttungsmethoden

Es stehen zwei Methoden zur GlĂ€ttung neuer Werte zur VerfĂŒgung:

Gewichteter Durchschnitt ("Discovery"-Modus)

Kint_final = (Kint_alt × ZĂ€hler + Kint_neu) / (ZĂ€hler + 1)
ZyklusAltes GewichtNeues GewichtEinfluss des neuen Wertes
11150%
101019%
505012%

Der ZÀhler ist bei 50 gedeckelt, um eine minimale ReaktivitÀt zu erhalten.

EWMA ("Fine Tuning"-Modus)

Kint_final = (1 - α) × Kint_alt + α × Kint_neu
α(n) = α₀ / (1 + decay_rate × n)
ParameterStandardBeschreibung
α₀ (initiales Alpha)0.08UrsprĂŒngliches Gewicht neuer Werte
decay_rate0.12Verringerungsgeschwindigkeit von Alpha

Automatische Korrekturmechanismen

Überschwing-Korrektur (Kext Deboost)

Aktivierung: Parameter allow_kext_compensation_on_overshoot im Dienst set_auto_tpi_mode

Erkennt und korrigiert, wenn die Temperatur den Sollwert ĂŒberschreitet, ohne wieder zu sinken.

flowchart TD
    A{T° > Sollwert + 0.2°C?} -->|Ja| B{Leistung > 5%?}
    B -->|Ja| C{T° sinkt nicht?}
    C -->|Ja| D[Kext-Korrektur]
    
    A -->|Nein| E[Keine Korrektur]
    B -->|Nein| E
    C -->|Nein| E
    
    D --> F["Reduktion = Überschwingen × Kint / ΔT_außen"]
    F --> G["Kext_Ziel = max(0.001, Kext - Reduktion)"]
    G --> H[Anwenden mit Alpha-Boost ×2]

Stagnations-Korrektur (Kint Boost)

Aktivierung: Parameter allow_kint_boost_on_stagnation im Dienst set_auto_tpi_mode

Erkennt und korrigiert, wenn die Temperatur trotz signifikantem Bedarf stagniert.

flowchart TD
    A{Abweichung > 0.5°C?} -->|Ja| B{Fortschritt < 0.02°C?}
    B -->|Ja| C{Leistung < 99%?}
    C -->|Ja| D{Konsektutive Boosts < 5?}
    D -->|Ja| E[Kint-Boost]
    
    A -->|No| F[Keine Korrektur]
    B -->|No| F
    C -->|No| F
    D -->|No| G[Alarm: Unterdimensionierte Heizung]
    
    E --> H["Boost = 8% × min(Abweichung/0.3, 2.0)"]
    H --> I["Kint_Ziel = Kint × (1 + Boost)"]

Erweiterte Parameter und Konstanten

Interne Konstanten (Nicht konfigurierbar)

KonstanteWertBeschreibung
MIN_KINT0.01Untergrenze fĂŒr Kint zur Aufrechterhaltung der ReaktivitĂ€t
OVERSHOOT_THRESHOLD0.2°CSchwelle fĂŒr Überschwingen zur Auslösung der Korrektur
OVERSHOOT_POWER_THRESHOLD5%Mindestleistung, um Überschwingen als Kext-Fehler zu werten
OVERSHOOT_CORRECTION_BOOST2.0Alpha-Multiplikator wÀhrend der Korrektur
NATURAL_RECOVERY_POWER_THRESHOLD20%Max Leistung, um Lernen bei natĂŒrlicher Erholung zu ĂŒberspringen
INSUFFICIENT_RISE_GAP_THRESHOLD0.5°CMindestabweichung fĂŒr Kint-Boost
MAX_CONSECUTIVE_KINT_BOOSTS5Limit vor Alarm wegen Unterdimensionierung
MIN_PRE_BOOTSTRAP_CALIBRATION_RELIABILITY20%MindestzuverlÀssigkeit zur Umgehung des Bootstrap

Konfigurierbare Parameter

ParameterTypStandardBereich
AggressivenessSlider1.00.5 - 1.0
Heating TimeMinuten51 - 30
Cooling TimeMinuten71 - 60
Heating Rate°C/h0 (auto)0 - 5.0
Initial Weight (Discovery)Ganzzahl11 - 50
Alpha (Fine Tuning)Float0.080.01 - 0.3
Decay RateFloat0.120.0 - 0.5

Dienste und API

versatile_thermostat.set_auto_tpi_mode

Steuert den Start/Stopp des Lernens.

service: versatile_thermostat.set_auto_tpi_mode
target:
  entity_id: climate.mein_thermostat
data:
  auto_tpi_mode: true                    # true = Start, false = Stopp
  reinitialise: true                     # true = VollstÀndiger Reset, false = Fortsetzen
  allow_kint_boost_on_stagnation: false  # Kint bei Stagnation boosten
  allow_kext_compensation_on_overshoot: false  # Kext bei Überschwingen korrigieren

versatile_thermostat.auto_tpi_calibrate_capacity

Kalibriert die thermische KapazitÀt anhand der Historie.

service: versatile_thermostat.auto_tpi_calibrate_capacity
target:
  entity_id: climate.mein_thermostat
data:
  start_date: "2024-01-01T00:00:00+00:00"  # Optional
  end_date: "2024-02-01T00:00:00+00:00"    # Optional
  min_power_threshold: 95                   # Min. Leistung in %
  capacity_safety_margin: 20                # Sicherheitsmarge in %
  save_to_config: true                      # In Konfig speichern

RĂŒckgabewerte des Dienstes:

SchlĂŒsselBeschreibung
max_capacityBerechnete BruttokapazitÀt (°C/h)
recommended_capacityKapazitÀt nach Marge (°C/h)
reliabilityZuverlÀssigkeitsindex (%)
samples_usedAnzahl verwendeter Proben
outliers_removedAnzahl entfernter Ausreißer

Erweiterte Diagnose und Fehlerbehebung

Diagnose-Sensor

EntitÀt: sensor.<Name>_auto_tpi_learning_state

AttributBeschreibung
activeLernen lÀuft
heating_cycles_countGesamtzahl beobachteter Zyklen
coeff_int_cyclesValidierte Kint-Zyklen
coeff_ext_cyclesValidierte Kext-Zyklen
model_confidenceVertrauen 0.0 - 1.0
calculated_coef_intAktuelles Kint
calculated_coef_extAktuelles Kext
last_learning_statusStatus des letzten Zyklus
capacity_heat_statuslearning oder learned
capacity_heat_valueAktuelle KapazitÀt (°C/h)

HĂ€ufige Lernstatus-Meldungen

StatusBedeutungEmpfohlene Aktion
learned_indoor_heatKint erfolgreich aktualisiertNormal
learned_outdoor_heatKext erfolgreich aktualisiertNormal
power_out_of_rangeLeistung bei 0 % oder 100 %Auf nicht-gesÀttigten Zyklus warten
real_rise_too_smallAnstieg < 0,01 °CSensor oder Zyklusdauer prĂŒfen
setpoint_changed_during_cycleSollwert geÀndertSollwert wÀhrend des Zyklus nicht verÀndern
no_capacity_definedKeine kalibrierte KapazitÀtAuf Kalibrierung/Bootstrap warten
corrected_kext_overshootÜberschwing-Korrektur angewandtNormal, falls Kext zu hoch
corrected_kint_insufficient_riseKint-Boost angewandtNormal, falls Kint zu niedrig
max_kint_boosts_reached5 konsekutive BoostsHeizung unterdimensioniert

Diagnose-Entscheidungsbaum

flowchart TD
    A[Problem erkannt] --> B{Kint oder Kext?}
    
    B -->|Kint zu niedrig| C[T° steigt zu langsam]
    C --> D{Nach 10 Zyklen?}
    D -->|Ja| E[Heiz-/KĂŒhlzeiten prĂŒfen]
    D -->|Nein| F[Konvergenz abwarten]
    
    B -->|Kint zu hoch| G[T°-Oszillationen]
    G --> H[AggressivitÀt reduzieren]
    
    B -->|Kext zu niedrig| I[T° fÀllt unter Sollwert]
    I --> J[Außensensor prĂŒfen]
    
    B -->|Kext zu hoch| K[Anhaltendes Überschwingen]
    K --> L[allow_kext_compensation aktivieren]
    
    A --> M{Kein Lernen?}
    M -->|power_out_of_range| N[GesÀttigte Heizung]
    N --> O[GĂŒnstige Bedingungen abwarten]
    M -->|no_capacity_defined| P[Keine Kalibrierung]
    P --> Q[Historie prĂŒfen oder Wert erzwingen]

Persistenzdatei

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

Diese Datei enthÀlt den kompletten Lernzustand und wird bei einem Neustart von Home Assistant wiederhergestellt. Sie kann gelöscht werden, um einen vollstÀndigen Reset zu erzwingen (nicht empfohlen).


AnhÀnge

Empfohlene Referenzwerte

HeizungstypAufheizzeitAbkĂŒhlzeitTypische KapazitĂ€t
Elektrokonvektor2-5 Min.3-7 Min.2.0-3.0 °C/h
Speicherheizung5-10 Min.10-20 Min.1.0-2.0 °C/h
Fußbodenheizung15-30 Min.30-60 Min.0.3-0.8 °C/h
Zentralheizkessel5-15 Min.10-30 Min.1.0-2.5 °C/h

VollstÀndige mathematische Formeln

Effektive KapazitĂ€t: Ceff=Cref×(1−Kext×ΔText)C_{eff} = C_{ref} \times (1 - K_{ext} \times \Delta T_{ext})

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

ZuverlĂ€ssigkeit der Kalibrierung: 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)

Wobei CV = Variationskoeffizient (Standardabweichung / Mittelwert)