Zum Inhalt springen
Temperaturabhängige Filterlaufzeit

Temperaturabhängige Filterlaufzeit

Temperaturabhängige Filterlaufzeit

Optimierung der Pool-Umwälzung für bessere Wasserqualität bei minimalem Stromverbrauch.

1. Motivation

Die Poolpumpe ist der größte Stromverbraucher im Schwimmbad. Gleichzeitig bestimmt sie maßgeblich die Wasserqualität. Die aktuell nötige Umwälzmenge hängt stark von der Wassertemperatur ab:

WassertemperaturRisikoEmpfohlene Umwälzung
> 26 °CHohes Algenwachstum, TrübungMaximal (8–12 h/Tag)
20–26 °CNormalbetriebStandard (4–8 h/Tag)
< 20 °CKaum AlgenwachstumMinimal (1–4 h/Tag)

Ein starrer Timer arbeitet entweder überdimensioniert (Stromverschwendung bei kühlem Wasser) oder unterdimensioniert (schlechte Wasserqualität bei Hitze).

Ziel: Die tägliche Filterlaufzeit automatisch an die gemessene Pooltemperatur anpassen.

2. Konzept

Die im Timer konfigurierte Laufzeit wird dynamisch verlängert, wenn die Wassertemperatur einen Schwellwert überschreitet. Die Verlängerung ist proportional zur Temperaturdifferenz.

Berechnungsformel

effektiveLaufzeit = basisLaufzeit + max(0, (poolTemp - tempCircThreshold) × tempCircFactor)
effektiveLaufzeit = min(effektiveLaufzeit, tempCircMaxRuntime)

Parameter

ParameterTypDefaultBereichBeschreibung
tempCircThresholddouble24,0 °C0–40 °CAb dieser Temperatur wird die Laufzeit verlängert
tempCircFactoruint16_t30 min/°C0–120 min/°CVerlängerung pro °C über dem Schwellwert
tempCircMaxRuntimeuint16_t720 min60–1440 minAbsolute Obergrenze der Gesamtlaufzeit

Berechnete Felder (nicht konfigurierbar)

FeldBeschreibung
effectiveRuntimeBerechnete Laufzeit in Minuten (für Status/Logging)
effectiveEndTimeResultierende Ausschaltzeit (Uhrzeit)

3. Beispiele

Sommer (Pool 30 °C)

Timer:         10:00 – 18:00  (Basis = 480 min)
Schwellwert:   24 °C
Differenz:     6 °C
Verlängerung:  6 × 30 = 180 min
Effektiv:      480 + 180 = 660 min
Ausschaltzeit: 10:00 + 660 min = 21:00 Uhr

→ Die Pumpe läuft 3 Stunden länger. Bei Hitze wird mehr umgewälzt, Algen haben keine Chance.

Übergang (Pool 22 °C)

Timer:         10:00 – 18:00
Schwellwert:   24 °C
Differenz:     22 < 24 → Keine Verlängerung
Effektiv:      = Basis = 480 min
Ausschaltzeit: 18:00 Uhr

→ Normale Laufzeit, kein Nachteil.

Kühler Sommer (Pool 20 °C)

Timer:         10:00 – 18:00
Schwellwert:   24 °C
Differenz:     20 < 24 → Keine Verlängerung
Effektiv:      = Basis = 480 min

→ Auch hier normale Laufzeit. Eine optionale Kürzung bei Kälte ist für Version 1 nicht vorgesehen, könnte aber später ergänzt werden.

Heiß (Pool 34 °C, Max-Runtime greift)

Timer:         10:00 – 18:00
Differenz:     10 °C
Verlängerung:  10 × 30 = 300 min
Zwischensumme: 480 + 300 = 780 min
Max-Runtime:   720 min (12 h)
Effektiv:      min(780, 720) = 720 min
Ausschaltzeit: 10:00 + 720 min = 22:00 Uhr

→ Die Obergrenze verhindert übermäßigen Pumpenverschleiß.

4. Integration ins System

Betroffene Komponenten

ConfigManager (ControllerSettings)
  + tempCircThreshold: double    — Schwellwert in °C
  + tempCircFactor: uint16_t     — Minuten Verlängerung pro °C
  + tempCircMaxRuntime: uint16_t — Obergrenze in Minuten

RuleTimer / RuleAuto
  + calculateEffectiveRuntime()  — gemeinsame Hilfsfunktion
  + Nutzung der berechneten Laufzeit statt fester Endzeit

MqttPublisher
  + 3 neue Number-Entities per HA Discovery
  + Command-Handler für /temp-circ-*/set

WebPortal (später)
  + Eingabefelder im Config-Tab

Timer-Berechnung (Kernlogik)

uint16_t calculateEffectiveRuntime(uint16_t baseMinutes, float poolTemp) {
    auto &s = ConfigManager::getSettings();

    // Bei NaN oder unter Schwellwert: Basis-Laufzeit
    if (poolTemp != poolTemp || poolTemp <= s.tempCircThreshold) {
        return baseMinutes;
    }

    float diff = poolTemp - s.tempCircThreshold;
    float extraMinutes = diff * s.tempCircFactor;

    // Auf ganze Minuten runden
    uint16_t extra = static_cast<uint16_t>(extraMinutes + 0.5f);
    uint16_t total = baseMinutes + extra;

    // Obergrenze anwenden
    return (total > s.tempCircMaxRuntime) ? s.tempCircMaxRuntime : total;
}

Midnight-Crossing

Die Timer-Logik in checkPoolPumpTimer() unterstützt bereits Endzeiten, die über Mitternacht hinausgehen (z. B. Start 22:00, Ende 02:00). Die temperatur-basierte Verlängerung kann denselben Mechanismus nutzen — die effektive Endzeit wird nicht auf 24:00 begrenzt.

NVS-Persistenz

Die 3 Parameter werden im ControllerSettings-Struct über NVS gespeichert. Sie werden selten geändert (Konfiguration), daher kein Wear-Problem.

5. HA-Integration (MQTT Discovery)

Für jeden Parameter wird ein Number-Entity mit HA Discovery published:

EntityTopic-SuffixMinMaxStep
temp-circ-threshold/number/pool-controller/temp-circ-threshold/…0400,5
temp-circ-factor/number/pool-controller/temp-circ-factor/…01205
temp-circ-max-runtime/number/pool-controller/temp-circ-max-runtime/…60144015

Zusätzlich ein Sensor für die berechnete effektive Laufzeit:

EntityTopic-SuffixUnit
effective-runtime/sensor/pool-controller/effective-runtime/…min

6. Umsetzungsplan

SchrittDatei(en)Aufwand
1. Config-Struct erweiternConfigManager.hpp~10 min
2. Helper-Funktion + DefaultsTimer.hpp, Timer.cpp~15 min
3. RuleTimer::loop() anpassenRuleTimer.cpp~20 min
4. RuleAuto::loop() anpassenRuleAuto.cpp~10 min
5. MQTT Discovery + HandlerMqttPublisher.cpp~30 min
6. Build + Test~10 min
Gesamt~1,5 h

7. Mögliche Erweiterungen (v2)

  • Kürzung bei Kälte: Zusätzlicher Parameter tempCircMinRuntime, der bei Unterschreitung eines Schwellwerts die Laufzeit reduziert
  • Trend-basiert: Berücksichtigung des Temperatur-Trends (steigend/falend), nicht nur des Absolutwerts
  • Saisonaler Kalender: Automatische Anpassung der Basis-Parameter an Sommer/Winter
Zuletzt aktualisiert am