Intelligente Heizempfehlung mit Home Assistant & OpenEPaperLink

🔥 Vorausschauende Heizempfehlung mit Home Assistant, Holzvergaser & OpenEPaperLink

Ein praxisnaher Ansatz zwischen Regeltechnik und Automatisierung

Ich habe zuhause bei der Heizung einen Holzvergaser der das Haus komplett heizt. Aber die Frage war - wir kann ich die nachlegezyklen so gestallten, das man nicht zu viel und nicht zu wenig Heitz. WEnn man zu oft nachlegt wird zu viel Holz "Verheizt" und wenn man zu spät nachlegt wird es ggf. zu kalt. Wie also eine Empfehlung zum nachheizen erstellen? Zum Glück gibt es ja Home Assistant und Open E paper link.

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:

  • Holzvergaser mit Pufferspeicher

  • Solarthermie (unterstützend)

  • ESP-basierte Temperatursensoren

  • OpenEPaperLink Nebular Pro 1.9"

  • Home Assistant als Zentrale

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 50 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

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:

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

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

5.2 Restlaufzeit berechnen

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

- sensor:
    - name: "Puffer Restlaufzeit"
      unique_id: puffer_restlaufzeit
      unit_of_measurement: "h"
      state: >
        {% set puffer = states('sensor.heizung_temperatur_f_hler_2')|float %}
        {% set min_temp = 50 %}
        {% set rate = states('sensor.puffer_abfallrate')|float %}

        {% if rate < -0.5 %}
          {{ ((puffer - min_temp) / (-rate)) | round(1) }}
        {% else %}
          99
        {% endif %}

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:

- binary_sensor:
    - name: "Ofen läuft"
      unique_id: ofen_laeuft
      state: >
        {% set vorlauf = states('sensor.heizung_temperatur_f_hler_4')|float %}
        {% set puffer = states('sensor.heizung_temperatur_f_hler_2')|float %}

        {{ vorlauf > 60 and vorlauf > (puffer + 5) }}

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

6.2 Heizgrenze

Keine Heizempfehlung oberhalb 16°C Außentemperatur.

6.3 Warmwasser-Priorisierung

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

Das verhindert Komfortverluste.

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.

Das ganze setzen wir dann in Code wie folgt um:

- sensor:
    - name: "Ofen Empfehlung"
      unique_id: ofen_empfehlung
      state: >
        {% set puffer = states('sensor.heizung_temperatur_f_hler_2')|float %}
        {% set rest = states('sensor.puffer_restlaufzeit')|float %}
        {% set ww = states('sensor.heizung_temperatur_f_hler_1')|float %}
        {% set ofen = is_state('binary_sensor.ofen_laeuft','on') %}
        {% set heizbedarf = is_state('binary_sensor.heizbedarf_aktiv','on') %}

        {% set hour = now().hour %}
        {% set forecast = state_attr('weather.bad_gottleuba','forecast') %}
        {% set solar = false %}

        {% if forecast and forecast | length > 1 %}
          {% set cond = forecast[1].condition %}
          {% set temp_future = forecast[1].temperature %}

          {% if hour >= 9 and hour <= 15
                and cond in ['sunny','clear','partlycloudy']
                and temp_future > 3 %}
            {% set solar = true %}
          {% endif %}
        {% endif %}

        {% if solar %}
          {% set rot_grenze = 0.5 %}
          {% set gelb_grenze = 2 %}
        {% else %}
          {% set rot_grenze = 1 %}
          {% set gelb_grenze = 3 %}
        {% endif %}

        {% set aktueller_status = states('sensor.ofen_empfehlung') %}

        {% if ofen %}
          weiss

        {% elif not heizbedarf %}
          weiss

        {% elif ww < 40 %}
          rot

        {% elif ww < 45 %}
          gelb

        {% elif puffer < 45 %}
          rot

        {% elif puffer < 50 %}
          gelb

        {% elif rest < rot_grenze %}
          rot

        {% elif rest < (gelb_grenze - 0.5) %}
          gelb

        {% elif rest > (gelb_grenze + 0.5) %}
          weiss

        {% else %}
          {{ aktueller_status }}

        {% endif %}

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

Zusätzlich:

Hintergrundfarbe

LED-Blinksignal bei Rot (alle 10 Sekunden)

Hier der yaml code für die Automatisierung:

alias: Heizungsempfehlung Display
triggers:
  - entity_id: sensor.ofen_empfehlung
    trigger: state
actions:
  - target:
      device_id: 6f93a2b3fbc3814262d945bb8b5376d1
    data:
      background: |
        {% if is_state('sensor.ofen_empfehlung','rot') %}
          red
        {% elif is_state('sensor.ofen_empfehlung','gelb') %}
          yellow
        {% else %}
          white
        {% endif %}
      payload:
        - type: dlimg
          url: |
            {% if is_state('sensor.ofen_empfehlung','rot') %}
              http://homeassistant.local:8123/local/Heizungshinweis/feuer.png
            {% elif is_state('sensor.ofen_empfehlung','gelb') %}
              http://homeassistant.local:8123/local/Heizungshinweis/hinweis.png
            {% else %}
              http://homeassistant.local:8123/local/Heizungshinweis/alles_ok.png
            {% endif %}
          x: 26
          "y": 18
          xsize: 100
          ysize: 100
        - type: text
          value: |
            {% if is_state('sensor.ofen_empfehlung','rot') %}
              JETZT
            {% elif is_state('sensor.ofen_empfehlung','gelb') %}
              NACHLEGEN
            {% else %}
              ALLES
            {% endif %}
          x: 18
          "y": 122
          size: 22
        - type: text
          value: |
            {% if is_state('sensor.ofen_empfehlung','rot') %}
              HEIZEN
            {% elif is_state('sensor.ofen_empfehlung','gelb') %}
              PRÜFEN
            {% else %}
              OK
            {% endif %}
          x: 20
          "y": 150
          size: 22
        - type: text
          value: |
            {% if is_state('sensor.ofen_empfehlung','weiss') %}
              Nicht nachlegen.
            {% else %}

            {% endif %}
          x: 10
          "y": 178
          size: 14
    action: open_epaper_link.drawcustom
  - choose:
      - conditions:
          - condition: state
            entity_id: sensor.ofen_empfehlung
            state: rot
          - condition: time
            after: "07:00:00"
            before: "20:00:00"
        sequence:
          - target:
              device_id: 6f93a2b3fbc3814262d945bb8b5376d1
            data:
              mode: flash
              brightness: 4
              repeats: 255
              color1:
                - 255
                - 0
                - 0
              flashSpeed1: 0.2
              flashCount1: 1
              delay1: 10
            action: open_epaper_link.setled
    default:
      - target:
          device_id: 6f93a2b3fbc3814262d945bb8b5376d1
        data:
          mode: "off"
        action: open_epaper_link.setled

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.

Das System basiert auf:

realer thermischer Dynamik

klarer Prioritätenlogik

minimaler Komplexität

hoher Transparenz

Es ersetzt keine Heizungsregelung – aber es unterstützt den Betreiber intelligent und vorausschauend.

Previous Post