🔥 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:

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.