🔥 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
Inhaltsverzeichnis
- Inhalt
- Sensorik im Heizsystem
-
🔥 Vorausschauende Heizempfehlung mit Home Assistant, Holzvergaser & OpenEPaperLink
- 1. Problemstellung
- 2. Systemarchitektur
- 3. Regelstrategie – Warum keine „echte KI“?
- 4. Kernprinzip: Restlaufzeit statt Schwellenwert
- 5. Technische Umsetzung
- 6. Schutz- und Prioritätslogik
- 7. Entscheidungsreihenfolge (wichtig!)
- 8. Anzeige auf ePaper
- 9. Warum das System robust ist
- 10. Beobachtungen aus dem Testbetrieb
- 11. Mögliche Erweiterungen
- Fazit
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:
-
Holzvergaser mit Pufferspeicher
-
Solarthermie (unterstützend)
-
ESP-basierte Temperatursensoren (siehe speraten Beitrag klick)
-
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 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
- 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:
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 - 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:



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:

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.