Intelligente Heizempfehlung mit Home Assistant & OpenEPaperLink

Zum Hauptbeitrag

🔥 Vorausschauende Heizempfehlung mit Home Assistant, Holzvergaser & OpenEPaperLink

Ein Holzvergaser mit Pufferspeicher ist ein sehr effizientes, aber auch stark manuelles Heizsystem.
Der Betreiber entscheidet selbst, wann Holz nachgelegt wird – und genau hier entsteht ein klassisches Problem:

  • Zu früh nachlegen → ineffizienter Betrieb
  • Zu spät nachlegen → Komfortverlust

Zusätzlich verändern Faktoren wie Solarthermie, Außentemperatur oder Warmwasserverbrauch ständig die Situation im System.

Die Frage war also:

Wie kann man eine intelligente Heizempfehlung erstellen, die den richtigen Zeitpunkt zum Nachlegen erkennt?

Mit Home Assistant und einigen Temperatursensoren lässt sich genau das umsetzen.

Das hier vorgestellte System berechnet aus den realen Temperaturverläufen eine Restlaufzeit des Pufferspeichers und leitet daraus eine einfache Empfehlung ab:

  • ✔ Alles OK
  • ⚠ Nachlegen prüfen
  • 🔥 Jetzt heizen

Die Empfehlung wird anschließend z.B. auf einem OpenEPaperLink Display dargestellt und optional über eine Status‑LED signalisiert. Ebenso stelle ich die Daten auf meinem Heizungs Dashboard dar.


Inhalt

Sensorik im Heizsystem

Damit die Heizempfehlung sinnvoll funktioniert, werden mehrere Temperaturen im System erfasst.

Sensor Bedeutung
Puffer oben Energiestand des Speichers
Puffer unten zeigt Entladezustand
Holzvergaser Vorlauf erkennt Ofenbetrieb
Heizung Vorlauf zeigt Wärmeabgabe
Warmwasser Komfortparameter
Außentemperatur Heizbedarf
Wetterprognose Solarabschätzung

Besonders wichtig sind Puffer oben und die Entladerate.

Der obere Bereich des Puffers enthält die nutzbare Wärme für Heizung und Warmwasser.
Sinkt diese Temperatur kontinuierlich, lässt sich daraus berechnen, wie lange die gespeicherte Energie noch ausreicht.

🔥 Vorausschauende Heizempfehlung mit Home Assistant, Holzvergaser & OpenEPaperLink

1. Problemstellung

Ein Holzvergaser mit Pufferspeicher ist ein sehr effizientes, aber manuelles Heizsystem.
Im Gegensatz zu Gas- oder Wärmepumpenheizungen entscheidet der Betreiber selbst, wann nachgelegt wird.

Das Problem:

Zu früh nachlegen → ineffizient

Zu spät nachlegen → Komfortverlust

Solarthermie kann Ladezyklen verschieben

Außentemperatur und Verbrauch ändern sich dynamisch

Eine reine Schwellenwert-Logik wie: „Wenn Puffer < 50°C → Rot“ ist zu statisch und reagiert nicht auf reale Verbrauchsdynamik.

Gesucht war daher eine vorausschauende, kontextabhängige Heizempfehlung, die:

-> thermisch logisch arbeitet

-> ohne komplexe KI auskommt

-> stabil und nachvollziehbar bleibt

-> auf einem energiearmen ePaper-Display angezeigt wird

2. Systemarchitektur

Hardware:

Relevante Messwerte
Messgröße Bedeutung
Puffertemperatur oben Energiestand
Vorlauftemperatur Aktive Einspeisung
Warmwasser Komfortparameter
Außentemperatur Heizbedarf
Wetterprognose Solarabschätzung

3. Regelstrategie – Warum keine „echte KI“?

Maschinelles Lernen wäre theoretisch möglich, aber:

-> wenig transparent

-> unnötig komplex

-> schwer wartbar

Stattdessen wurde ein physikalisch fundierter Ansatz gewählt:

Prognose der Restlaufzeit auf Basis der realen Entladerate

Das System bleibt deterministisch, aber wirkt adaptiv.

4. Kernprinzip: Restlaufzeit statt Schwellenwert

Die zentrale Idee:

Restlaufzeit = (Puffer - Mindesttemperatur) / Entladerate

Das bedeutet wir errechnen, wie lange es noch dauern wird, bis der Puffer sich auf eine bestimmt Temperatur (bei mir 45 Grad) abkühlen wird. Diese Entladerate nehmen wir und weisen ihr eine Farbe zu, die wir dann zum steuern des ePapers nutzen. (Siehe Punkt 7)

Warum das sinnvoll ist

Die Entladerate enthält implizit:

  • Außentemperatur

  • Gebäudedämmung

  • aktuelles Nutzerverhalten

  • Warmwasserverbrauch

  • Wind- und Wettereffekte

Sie bildet den realen Energiebedarf direkt ab.

5. Technische Umsetzung

5.1 Entladerate berechnen

  1. Berechnung eines Puffer-Mittelwerts

Im späteren Ausbau des Systems wurden zwei Sensoren im Pufferspeicher genutzt (oben und unten).

Da der obere Bereich thermisch dominanter ist, wird ein gewichteter Mittelwert berechnet:

- name: "Puffer Mittel"
  unique_id: puffer_mittel
  unit_of_measurement: "°C"
  state: >
    {% set oben = states('sensor.heizung_neu_puffer_oben')|float(0) %}
    {% set unten = states('sensor.heizung_neu_puffer_unten')|float(0) %}
    {{ (0.6 * oben + 0.4 * unten) | round(1) }}

Dieser Wert dient anschließend als Grundlage für die Berechnung der Entladerate.

Kernprinzip: Restlaufzeit statt Schwellenwert

Die zentrale Idee:

Restlaufzeit = (Puffer - Mindesttemperatur) / Entladerate

Damit wird berechnet, wie lange der Pufferspeicher noch ausreichend Energie liefert.

Die Entladerate enthält indirekt bereits:

Außentemperatur

Gebäudedämmung

Warmwasserverbrauch

aktuelles Heizverhalten

Dadurch reagiert das System automatisch auf reale Bedingungen.

Zum errechnen der Entladerate erstellen wir also einen Sensor in der configuration.yaml (oder wie in meinem Fall in der sensors.yaml - da ich diese includiert habe)

Also fügen wir hinzu:

- platform: derivative
  source: sensor.puffer_mittel
  name: puffer_abfallrate
  unit_time: h
  round: 2

Nur bei signifikanter Entladung (< -0.5 °C/h) wird gerechnet.

Glättung der Entladerate

Um Messrauschen zu reduzieren, wird die Entladerate zusätzlich über 30 Minuten geglättet.

- platform: statistics
  name: puffer_abfallrate_geglaettet
  entity_id: sensor.puffer_abfallrate
  state_characteristic: mean
  max_age:
    minutes: 30

5.2 Restlaufzeit berechnen

Hier errechnen wir dann die Zeit, die das System die Wärme noch halten kann.

- name: "Puffer Restlaufzeit neu"
  unique_id: puffer_restlaufzeit_neu
  unit_of_measurement: "h"
  state: >
    {% set puffer = states('sensor.puffer_mittel')|float(0) %}
    {% set rate = states('sensor.puffer_abfallrate_geglaettet')|float(0) %}

    {% if puffer > 60 %}
      {% set min_temp = 45 %}
    {% elif puffer > 50 %}
      {% set min_temp = 43 %}
    {% else %}
      {% set min_temp = 40 %}
    {% endif %}

    {# unrealistische Werte ignorieren #}
    {% if rate > -0.3 %}
      99

    {% elif rate < -10 %}
      99

    {% else %}
      {{ ((puffer - min_temp) / (-rate)) | round(1) }}
    {% endif %}

Das ist gleichzeitig unser Sensor, aus dem dann die entsprechende Empfehlung heraus entsteht.

Hier musste cih auch nochmal ein wenig einstellen, da der Sensor oft mal nachdem zb Solar aktiv war werte von -90 und mehr ausgegeben hat. Somar war der Puffer voll aber rechnersich ergab sich eine restlaufzeit von 20 min. So viel Wärme kann ich Haus gar ncicht abgeben um den Puffer in 20 min von 75 auf unter 45 Grad zu entladen.

Richtig wären in etwa die Werte für einen typischer Pufferverbrauch:

Situation Rate
milder Tag -1 °C/h
kalter Tag -2 °C/h
sehr kalt -3 °C/h

Bei meinem Puffer:

30°C / 2°C/h ≈ 15h Restlaufzeit

Das wäre plausibel. Auch hier sieht man wieder - Versuchen und testen lohnt sich.

6. Schutz- und Prioritätslogik

6.1 Ofen läuft-Erkennung

Verhindert Fehlalarme beim Anheizen:

vorlauf > 60°C und vorlauf > puffer + 5K

Also erstellen wir noch einen Sensor unter Tempaltes:

- name: "Holzvergaser aktiv"
  unique_id: holzvergaser_aktiv
  state: >
    {% set vl = states('sensor.heizung_neu_holzvergaser_vorlauf')|float(0) %}
    {% set last = this.state %}

    {% if vl > 70 %}
      true
    {% elif vl < 60 %}
      false
    {% else %}
      {{ last }}
    {% endif %}

Hier wird geprüft ob der Holzvergaser überhaut an ist. Am anfang hatte ich da noch kleiner Probleme, da er nach erreichen des Zustanden "An" zwar noch Warm genug war aber dann trotzdem aus "Aus" gewechelt hat. Das habe ich mit den erhöten abschaltwerten gut geregelt bekommen.

Im nächsten Schritt schauen wir, ob die Außentemperatur auch so hoch ist, das ein Wärmebedarf besteht:

6.2 Heizgrenze

Der Wert resultiert aus dem Sensor "Heizbedarf aktiv". Und sagt aus, dass die Heizempfehlung nicht oberhalb von 18°C Außentemperatur gegeben wird.

- name: "Heizbedarf aktiv"
  unique_id: heizbedarf_aktiv
  state: >
    {% set at = states('sensor.gw1100a_outdoor_temperature')|float(20) %}
    {{ at < 18 }}

6.3 Warmwasser-Priorisierung

Warmwasser < 40°C → sofort Rot
Warmwasser < 45°C → Gelb

Das verhindert Komfortverluste und ist direkt im Sensor ofen.empfehlung integriert (Siehe Punkt 7.)

7. Entscheidungsreihenfolge (wichtig!)

Die Reihenfolge ist entscheidend:

Ofen läuft → Weiß

Kein Heizbedarf → Weiß

Warmwasser kritisch → Rot

Puffer unter Mindesttemperatur → Gelb/Rot

Restlaufzeit < 1h → Rot

Restlaufzeit < 3h → Gelb

Sonst → Weiß

Diese Hierarchie verhindert logische Konflikte. Und ist das Kernstück unserer Arbeit. Hier entsteht jetzt der reale Wert, den wir dann weiter nutzen können, sei es auf dem Display, im Dashboard oder für andere Automatisierungen.

Das ganze setzen wir dann in Code wie folgt um:

- name: "Ofen Empfehlung"
  unique_id: ofen_empfehlung
  state: >
    {% set rest = states('sensor.puffer_restlaufzeit_neu')|float(99) %}
    {% set ww = states('sensor.heizung_neu_warmwasser_temperatur')|float(50) %}
    {% set puffer = states('sensor.puffer_mittel')|float(50) %}
    {% set ofen = is_state('binary_sensor.holzvergaser_aktiv','on') %}
    {% set solar = is_state('binary_sensor.solar_aktiv','on') %}
    {% set last = this.state %}

    {% if ofen %}
      weiss

    {% elif solar and rest == 99 %}
      weiss

    {% elif ww < 43 %}
      rot

    {% elif ww < 45 %}
      gelb

    {% elif ww > 47 %}
      weiss

    {% elif rest < 1 %}
      rot

    {% elif rest < 3 %}
      gelb

    {% elif puffer < 47 %}
      gelb

    {% else %}
      {{ last }}
    {% endif %}

Auch hier musste ich die Werte gerade für Warmwassr wieder glätten da er sonst alle 10 min zwischen weiss und gelb gesprungen ist.

Daher habe ich entschieden: Der Warmwasserbereich bekommt eine Hysterese Damit bei den "Zwischenwerten" kein Flackern entsteht. Da freut sich auch das ePaper Display (-:
Warmwasser Ergebnis

47 | weiss |
45–47 | bleibt wie vorher |
< 45 | gelb |
< 43 | rot |

Damit verschwindet dein Flackern komplett.

Die ganze Logig habe ich hier nocheinmal in eimem Flowchart zusammengefasst:

Heizungslogik_Diagramm

8. Anzeige auf ePaper

Warum ePaper?

extrem geringer Energieverbrauch

gute Lesbarkeit

kein Dauerstrom notwendig

ideal für Statusanzeigen

Das Display aktualisiert nur bei Statusänderung.

Anzeige-Design
Zustand Anzeige
Weiß ✔ ALLES OK
Gelb ⚠ NACHLEGEN PRÜFEN
Rot 🔥 JETZT HEIZEN

Vorbereitung: Ich habe noch 3 png Dateien in den Ordner: www/Heizungshinweis/ gelegt und diese werden dann mit angezeigt auf dem Display.
Hier die Beispielbilder:

hinweis
feuer
alles_ok
*Hinweis - Bilder mittels KI erzeugt

Zusätzlich:

Hintergrundfarbe

LED-Blinksignal bei Rot (alle 10 Sekunden)

Hierzu noch ein Hinweis - ich habe das LED Blinken dann nach einiger Zeit wieder deaktiviert. Es hat sich herausgestellt, das es doch die Batterie des kleinen Displays ganz schön leer Saugt und an sich kaum einen Vorteil bringt. Man könnte die LED aber nutzen wenn man wirklich einen sehr kritischen wert der Anlage anzeigen möchte.

Hier der yaml code für die Automatisierung:

alias: Heizungsempfehlung Display
triggers:
  - trigger: state
    entity_id: sensor.ofen_empfehlung
    to:
      - rot
      - gelb
      - weiss
actions:
  - action: open_epaper_link.drawcustom
    target:
      device_id: 6f93a2b3fbc3814262d945bb8b5376d1
    data:
      background: "{{ background }}"
      payload:
        - type: dlimg
          url: "{{ icon }}"
          x: 26
          "y": 18
          xsize: 100
          ysize: 100
        - type: text
          value: "{{ text1 }}"
          x: 18
          "y": 122
          size: 22
        - type: text
          value: "{{ text2 }}"
          x: 20
          "y": 150
          size: 22
        - type: text
          value: "{{ text3 }}"
          x: 10
          "y": 178
          size: 14
  - choose:
      - conditions:
          - condition: state
            entity_id: sensor.ofen_empfehlung
            state: rot
          - condition: time
            after: "07:00:00"
            before: "20:00:00"
        sequence:
          - action: open_epaper_link.setled
            target:
              device_id: 6f93a2b3fbc3814262d945bb8b5376d1
            data:
              mode: flash
              brightness: 4
              repeats: 255
              color1:
                - 255
                - 0
                - 0
              flashSpeed1: 0.2
              flashCount1: 1
              delay1: 10
            enabled: false
    default:
      - action: open_epaper_link.setled
        target:
          device_id: 6f93a2b3fbc3814262d945bb8b5376d1
        data:
          mode: "off"
        enabled: false
variables:
  zustand: "{{ states('sensor.ofen_empfehlung') }}"
  background: |
    {% if zustand == 'rot' %}
      red
    {% elif zustand == 'gelb' %}
      yellow
    {% else %}
      white
    {% endif %}
  icon: |
    {% if zustand == 'rot' %}
      http://homeassistant.local:8123/local/Heizungshinweis/feuer.png
    {% elif zustand == 'gelb' %}
      http://homeassistant.local:8123/local/Heizungshinweis/hinweis.png
    {% else %}
      http://homeassistant.local:8123/local/Heizungshinweis/alles_ok.png
    {% endif %}
  text1: |
    {% if zustand == 'rot' %}
      JETZT
    {% elif zustand == 'gelb' %}
      NACHLEGEN
    {% else %}
      ALLES
    {% endif %}
  text2: |
    {% if zustand == 'rot' %}
      HEIZEN
    {% elif zustand == 'gelb' %}
      PRÜFEN
    {% else %}
      OK
    {% endif %}
  text3: |
    {% if zustand == 'weiss' %}
      Nicht nachlegen.
    {% else %}

    {% endif %}

Daraus ergeben sich dann aus dem ePaper Display folgende Anzeigen:

AllesOK
nachlegen
JetztHeizen

Wer kein ePaper nutzt kann natürlich auch die Werte nutzen und die Daten dann auf dem Dahboard anzeigen. Zum Theme Heizungs Dashboard möchte ich bei gelegenheit einmal einen seperaten artikel schreiben, das kommt also bald. Bis dahin nur erstmal hier noch den einblick wie ich die Daten noch auf meinem Dahboard anzeige:

Ofendaten_Dashbord_HA

9. Warum das System robust ist

Keine festen Außentemperatur-Schwellen nötig

Kein ständiges Neuberechnen von Heizkurven

Kein Machine Learning

Keine instabilen Forecast-Abhängigkeiten

Keine unnötigen Display-Updates

Die Restlaufzeit passt sich automatisch an reale Bedingungen an.

10. Beobachtungen aus dem Testbetrieb

Bereits in der ersten Testphase zeigte sich:

Deutlich weniger „zu spätes Nachlegen“

Ruhiges, nachvollziehbares Verhalten

Kein hektisches Umspringen

Solarthermie verzögert realistisch

11. Mögliche Erweiterungen

Solarthermie-Erkennung über Kollektortemperatur

Nachtmodus (LED deaktivieren)

Zweite Detailseite mit Temperaturen

Logging der Heizzyklen

Adaptive Mindesttemperatur

Fazit

Mit wenigen, sauber durchdachten Template‑Sensoren lässt sich in Home Assistant eine erstaunlich leistungsfähige Heizempfehlung realisieren.

Der Ansatz basiert auf drei einfachen Prinzipien:

  • reale thermische Dynamik statt statischer Schwellenwerte
  • klare Prioritätenlogik
  • minimale Systemkomplexität

Das System ersetzt keine Heizungsregelung –
aber es unterstützt den Betreiber dabei, den richtigen Zeitpunkt zum Nachlegen zu finden.

Durch die Restlaufzeitberechnung reagiert die Empfehlung automatisch auf:

  • Außentemperatur
  • Warmwasserverbrauch
  • Solarthermie
  • tatsächlichen Wärmebedarf

Damit entsteht eine vorausschauende, aber nachvollziehbare Heizlogik, die im Alltag erstaunlich gut funktioniert.

Previous Post Next Post

Kommentare