So will ich es umsetzen ohne Relais das der Heizung was vorgaukelt.
Aber ich nutze auch einen Heizstab im Sommer und Pelletsheizung statt einer WP
Nach ca. 20 Jahren konnte ich mit Home Assistant und einem ESP32 die Kontrolle über meine Wärmepumpe übernehmen und diese damit steuern. Kombiniert mit den Leistungsdaten der PV-Anlage ist Home Assistant in der Lage, den PV Überschuss möglichst direkt für das Heizen zu verwenden und somit den Eigenverbrauch zu steigern:
Dank der sehr trägen Fußbodenheizung kann die Heizung für einige Stunden deaktiviert werden, ohne die Raumtemperatur zu beeinflussen. Der Estrich hat ein enormes Speicherpotential und übertrifft einen typischen Pufferspeicher um ein Vielfaches. Idealerweise ist die Heizung nach Sonnenuntergang nicht mehr aktiv, wodurch die Batterie der PV-Anlage abends und in der Nacht rein für den Haushaltsstrom verwendet werden kann.
Wie beschrieben ist meine Wärmepumpe über 20 Jahre alt und besitzt weder eine Smart Grid Ready (SG Ready) - Schnittstelle noch eine andere Möglichkeit in die Steuerung einzugreifen. Ein Blick in die Dokumentation der Heizungssteuerung hat mir verraten, dass es sich bei den Temperatursensoren des Boilers und Pufferspeichers um PTC-Widerstände handelt, einfache Widerstände die sich mit der Temperatur verändern. Dies hat mich auf die Idee gebracht andere Widerstände einzusetzen und dadurch die Pufferspeicher- und Boilertemperatur vorzutäuschen. Wichtig dabei war mir, dass die Heizung auch ohne Home Assistant weiter funktioniert, daher verwende ich die verbauten PTC-Temperatursensoren weiter und ersetze diesen mit einem niedrigen Widerstandswert für das Einschalten und einem hohen Widerstandswert für das Ausschalten. Erste Versuche mit einem digitalen Potentiometer führten nicht zum Erfolg. Letztlich griff ich auf simple Relays und feste Widerstände zurück.
Für eine Heizung mit SG-Ready Schnittstelle, könnten das hier verwendete Relaisboard alternativ auch direkt für das Schalten der SG-Ready Zustände verwendet werden, dazu würde ein 2-Kanal-Relay-Board reichen. Das SG-Ready-Label definiert vier Betriebszustände für die Steuerung der Heizung, hier vereinfacht:
Besitzt die Wärmepumpe kein SG-Ready, kann eine ähnliche Funktionalität mit Widerständen umgesetzt werden. Wie hier beschrieben, sind beim Einsatz von Widerständen wesentlich mehr Betriebszustände, als mit SG-Ready möglich: z.B. die Unterscheidung zwischen Heizung und Warmwasser:
Für die Überwachung der Temperaturwerte des Boilers und Pufferspeichers in Home Assistant habe ich bereits einen ESP32 im Einsatz. Durch eine Erweiterung mit einem 4-Kanal Relay Board kann ich jeweils 2 Relays für die Steuerung des Warmwassers und 2 Relays für das Steuern des Pufferspeichers verwenden: Relay 1 und 2 wird für den Boiler und Relay 3 und 4 für den Pufferspeicher. Als Widerstände habe ich 1kOhm zur Verfügung, was bei dem verbauten PTC-Temperatursensor einen Temperaturwert von 25°C entspricht. Ein Wert von 1,25 kOhm würde bereits über 50°C bedeuten: ähnlich einem aufgeheizten Boiler. Keinen 250 Ohm Widerstand zur Hand, habe ich für den Boiler 4 Stück 1kOhm in einer Parallelschaltung verwendet. Hier die schematische Darstellung für das Warmwasser Relays 1 und 2:
Wenn die beiden Relays nicht aktiv sind, wird der ursprüngliche PTC-Temperatursensor verwendet. Das Aktivieren des ersten Relays unterbricht den PTC und ersetzt diesen mit den optionalen Widerständen, was einer Temperatur von über 50°C entspricht und die Warmwasseraufbereitung deaktiviert. Schalte ich das 2te Relay zu, werden die Widerstände für den 250Ohm-Wert überbrückt und der verbleibende 1kOhm-Widerstand täuscht der Heizung 25°C vor: Zeit für die Warmwasseraufbereitung.
Die Schaltung ermöglicht also 3 Zustände für den Boiler
Hier die 4 Relays: Für Boiler und Pufferspeicher: Die dreipoligen Kabel: Gelbgrün, Blau und Braun führen zum bestehenden PTC-Anschlusskabel.
Für das Warmwasser funktioniert das so weit. Bei der Heizung sind die simulierten 25°C zu hoch, daher habe ich die Widerstände im Pufferspeicher wie folgt angepasst: Den 1kOhm Widerstand habe ich durch zwei 470 Ohm Widerstände ersetzt, was 940Ohm ergibt und einer Temperatur von 17°C entspricht. Ein zusätzlicher 300Ohm-Widerstand ergibt 1,24kOhm, was einer Temperatur von etwas über 50°C entspricht.
Der Drehstromkompressor der alten Grundwasser-Wärmepumpe besitzt lediglich die beiden Betriebszustände ein und aus. Beim Einschalten der Heizung steigt der Druck allmählich an, wobei der Stromverbrauch je nach Zieltemperatur auf maximal 4,5 kW klettert. Ein integrierter Pufferspeicher dient lediglich als hydraulische Entkopplung. Die Wärmeversorgung für die Fußbodenheizung erfolgt über Umwälzpumpen, die den Pufferspeicher durchströmen. Die Wärmepumpe wird aktiviert, sobald die Temperatur im Pufferspeicher unter einen bestimmten Wert fällt, und schaltet sich ab, wenn eine festgelegte Temperatur erreicht ist. Technisch gesehen ähnelt die Beladung des Pufferspeichers also der Warmwasseraufbereitung, mit einem kleinen Unterschied: Die Druck und somit die Zieltemperatur wird anhand einer hinterlegten Heizkurve und mithilfe eines Außenfühlers angepasst.
Mein Setup kombiniert die Informationen der folgenden Artikel:
Den ESP32 Mikrocontroller habe ich nicht direkt in die Steuerung der Heizung integriert, auch ersetzt er diese nicht. Ich habe den ESP32-Mikrocontroller vielmehr um die bestehende Steuerung herumgebaut: mit eigenen Sensoren und eigenen Relais für das Manipulieren der bestehenden Heizungssteuerung. Vom ESP32 für die Heizungs(über)steuerung führen dutzende Kabel zu mehreren Temperatursensoren: verbaut an den unterschiedlichsten Stellen der Heizung und des Hauses:
Hier ein grober Überblick der wesentlichen Komponenten (zusätzlich zu Home-Assistant, ESP-Home und einem ESP32):
Das komplette ESP-Home-Projekt für den ESP habe ich wie folgt zusammengestellt:
esphome:
name: heating
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "???"
ota:
platform: esphome
password: "???"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Heating Fallback Hotspot"
password: "???"
on_disconnect:
if:
condition:
switch.is_on: relay4
then:
- switch.turn_off: relay3
- switch.turn_off: relay4
captive_portal:
one_wire:
- platform: gpio
pin: GPIO13
id: hub_1
# Relais
switch:
- platform: gpio
pin: GPIO32
name: Relay-Heizung-Wasser-fake
id: relay1
inverted: true
- platform: gpio
pin: GPIO33
name: Relay-Heizung-Wasser-kalt
id: relay2
inverted: true
- platform: gpio
pin: GPIO25
name: Relay-Heizung-Puffer-fake
id: relay3
inverted: true
- platform: gpio
pin: GPIO26
name: Relay-Heizung-Puffer-kalt
id: relay4
inverted: true
# Individual sensors
sensor:
- platform: uptime
name: heating.uptime
- platform: dht
pin: GPIO23
model: DHT11
temperature:
name: "Kueche.Temperature"
id: kueche_temperature
humidity:
name: "Kueche.Humidity"
- platform: dht
pin: GPIO1
model: DHT11
temperature:
name: "Wohnzimmer.Temperature"
id: wohnzimmer_temperature
humidity:
name: "Wohnzimmer.Humidity"
- platform: dallas_temp
one_wire_id: hub_1
address: 0x???
name: "heating.Warmwasser"
on_value_range:
- below: 40.0
then:
- switch.turn_off: relay1
- switch.turn_off: relay2
- above: 48.0
then:
- switch.turn_on: relay1
- switch.turn_off: relay2
- platform: dallas_temp
one_wire_id: hub_1
address: 0x???
name: "heating.Pufferspeicher"
- platform: combination
type: median
name: "EG.Temperatur"
sources:
- source: kueche_temperature
- source: wohnzimmer_temperature
Wie aus dem Projekt ersichtlich ist, habe ich bestimmte Aktionen direkt über Trigger des ESP32 umgesetzt. Damit ist der ESP32 in der Lage beim Ausfall des WLANs, oder falls Home Assistant einmal nicht verfügbar ist, die Kontrolle an die eigentliche Steuerung der Heizung zu übergeben. Zudem wird die Warmwasseraufbereitung gestoppt, wenn das Warmwasser seine Zieltemperatur erreicht hat, oder alle Relais deaktiviert, wenn die Wassertemperatur einen bestimmten Wert unterschreitet.
Die Wärmepumpe kann nicht mehr als 48 °C für die Warmwasseraufbereitung und ab dem Erreichen dieser Temperatur, lasse ich die Relais deaktivieren, wodurch die Wärmepumpe nicht weiter mit falschen Temperaturwerten getäuscht wird. Zudem gibt der ESP32 die Kontrolle wieder an die Heizung zurück, wenn das Wasser unter 40 °C fällt: Eine Art Notfall, damit das Wasser nicht ganz kalt wird.
Die Temperaturwerte der Wohnräume habe ich über einen "Combination-Sensor" vom Typ Median zu einem Wert kombiniert und dienen als Basis für die in Home Assistant umgesetzte Heizungsübersteuerung. Der Median kann im Gegensatz zum Mittelwert besser mit einzelnen Ausreißern umgehen.
Denkbar wäre auch, dass der ESP32 direkt die Daten des Smartmeter abfragt und selbstständig Entscheidungen für das Aktivieren der Heizung im Falle eines PV-Überschusses trifft. Ich überlasse diese Aufgabe Home Assistant.
Die folgenden Skripte und Helfer erleichtern es, die Automatisierung für die Steuerung der Heizung übersichtlich und nachvollziehbar zu halten.
Dank ESP-Home-Integration sind alle Sensoren und das 4-Kanal-Relay des ESP32 in Home-Assistant verfügbar:

Damit die Schaltvorgänge der Relais einfacher angesprochen werden können, habe ich Skripts für die einzelnen Zustände angelegt:

Mithilfe eines "Zahlenwert-Eingabe"-Helfer kann die gewünschte Raumtemperatur komfortabel in der Home-Assistant-Oberfläche angepasst werden kann:
Folgender Hilfssensor verwendet die Raum-Solltemperatur: input_number.heizung_raum_solltemperatur, die aktuelle Innentemperatur: sensor.eg_temperatur, die Innentemperatur im 24h Mittel: sensor.aussen_temperature_24 und den Energiebedarf des Haushalts: sensor.sensor_household_energy_24h und berechnet anhand der Variablen für die Wohnfläche (qm), dem Raumheizfakter (0,8) und dem COP der Wärmepumpe (cop) den für 24h notwendigen Heizbedarf:
sensor.heating_energy_demand_forecast_today
{% set qm = 180 %}
{% set raumheizfaktor = 0.8 %}
{% set cop = 4 %}
{# Sensoren auslesen #}
{% set soll = states('input_number.heizung_raum_solltemperatur') | float(0) %}
{% set ist_eg = states('sensor.eg_temperatur') | float(0) %}
{% set aussen_24 = states('sensor.aussen_temperature_24') | float(0) %}
{% set haus_pwr_24 = states('sensor.sensor_household_energy_24h') | float(0) %}
{# Thermischer Bedarf basierend auf Gebäudecharakteristik #}
{# Formel: (Temperaturdifferenz) * Fläche * Raumheizfaktor * Stunden / Watt-zu-kW #}
{% set thermischer_bedarf = (2 * soll - ist_eg - aussen_24) * qm * 24 * raumheizfaktor / 1000 %}
{# Abzug der Abwärme von Haushaltsgeräten #}
{# Faktor 1.2 korrigiert den Hausstrom auf geschätzte Wärmeabgabe #}
{% set verlustwaerme_haushaltsgeraete = haus_pwr_24 / 1.2 %}
{# Finale Berechnung elektrische Energiebedarf (geteilt durch COP) #}
{{ ((thermischer_bedarf - verlustwaerme_haushaltsgeraete) / cop) | round(2) }}
Verbrauchszähler für die Heizung für den heutigen Tag: sensor.heating_energy_consumed_today
Eingangssensor ist die gesamte verbrauchte Heizenergie:
Template-Sensor: sensor.heating_energy_progress_percent
{% set forecast = states('sensor.heating_energy_demand_forecast_today') | float(0) %}
{% set consumed = states('sensor.heating_energy_consumed_today') | float(0) %}
{% if forecast > 0 %}
{# Berechne Prozentwert, maximal 100% #}
{{ min((consumed / forecast) * 100, 100) | round(1) }}
{% else %}
{# Wenn kein Bedarf prognostiziert (Sommer/Warm), dann 100% (Ziel erreicht) #}
100
{% endif %}
Zusätzlich zur Wärmepumpe ermöglicht eine Zigbee-Steckdose das Aktivieren eines Heizstabs im Boiler und somit höhere Warmwassertemperaturen. Um die Steckdose nicht zu überfordern, habe ich den Heizstab mit nur 2kW angeschlossen: funktionell zumindest für die Warmwasseraufbereitung ein Low-Cost Ersatz für den Fronius Ohmpilot. Mithilfe der folgenden Seite kann die benötigte Energiemenge für die Warmwasseraufbereitung berechnet werden: Online Energie-Rechner: elektrischer Strom vs. Wärmepumpe.
Nachdem ich die Automatisierung mehrfach neu erstellt und überarbeitet habe, hier etwas vereinfacht meine finale Variante:

Die Automatisierung wird alle 15 Minuten gestartet, was den Vorteil hat, dass ein Neustart von Home Assistant keinen Einfluss auf die Automatisierung hat:

Dank der Trigger direkt im ESP-Home Projekt und der zuvor erstellten Skripts und Template-Sensoren bleibt die Logik in der Automatisierung relativ übersichtlich:
Der ESP übernimmt das Abschalten beim Erreichen der Zieltemperatur und verhindert das vollständige Abkühlen des Warmwassers. Die Automatisierung muss lediglich den Startzeitpunkt der Warmwasseraufbereitung bestimmen. Zur Festlegung des optimalen Zeitpunkts nutze ich den zuvor erstellten Template-Sensor für den PV-Überschuss (PV+) und setze als Aktion das Skript "Warmwasser ein" ein.

Die Logik für den Heizstab ermöglicht höhere Warmwassertemperaturen, was die Chance erhöht, dass das Warmwasser bei Sonnenschein erwärmt wird und Abends oder Nachts mehr Warmwasser zur Verfügung steht. Dies macht natürlich nur Sinn, wenn zu viel Strom produziert wird, da der Heizstab nicht so effizient ist wie die Wärmepumpe:
Der Heizstab wird aktiv, wenn mehr als 2kW ins Netz eingespeist werden: "Grid_power_kw < -2". 2kW. Schaltet sich der Heizstab ein, verkleinert dieser den Überschuss, daher verwende an dieser Stelle ein Wert-Template, um dessen Verbrauch abzuziehen.
{{( states("sensor.grid_power_kw") | float -
(states("sensor.warmwasser_active_power") | float(0) / 1000))
< - 2 }}
Meine Logik für die Raumheizung basiert auf einem Auswählen Baustein und Optionen für das Aktivieren oder Deaktivieren der Heizung:
Die ist eine Art Notfallregel, wenn die Innentemperatur um 1 °C unter die Solltemperatur absinkt, wird die Heizung zu jeder Tageszeit aktiviert:
In der Nacht bei niedrigen Außentemperaturen und einer niedrignen PV-Prognose soll die Wärmepumpe zwischen 2:00 und 3:30 Uhr aktiviert werden.
Um die Innentemperatur auch bei einer Wetteränderung stabil zu halten, wird mindestens 70 % der berechneten Heizenergie aufgebracht:
Wird diese Aktion aktiv, werden die weiteren Aktionen nicht ausgeführt:
die Standardoption des Auswählenbausteins schaltet die Heizung aus, falls keine der 7 Optionen aktiv wurde:

alias: Heizungssteuerung
description: ""
triggers:
- trigger: time_pattern
minutes: /15
conditions: []
actions:
- choose:
- conditions:
- condition: or
conditions:
- alias: Juli oder August
condition: template
value_template: "{{ now().month in [7,8] }}"
- condition: numeric_state
entity_id: sensor.aussen_temperature_24
above: 16
- condition: numeric_state
entity_id: sensor.aussen_temperature
above: 23
sequence:
- action: script.warmwasser_vor_dem_ausschalten_pufferspeicher_aus
metadata: {}
data: {}
alias: Stoppen wenn aussen zu warm
- conditions:
- alias: unter Soll -1 °C
condition: numeric_state
entity_id: sensor.heating_target_temp
above: sensor.eg_temperatur
value_template: "{{ state.state | float - 1 }}"
sequence:
- action: script.pufferspeicher_heizen
metadata: {}
data: {}
- conditions:
- condition: time
after: "02:00:00"
before: "03:30:00"
- condition: numeric_state
entity_id: input_number.heizung_raum_solltemperatur
above: sensor.eg_temperatur
- condition: numeric_state
entity_id: sensor.pv_panels_energy_forecast_today_remaining
below: 20
- condition: numeric_state
entity_id: sensor.aussen_temperature_24
below: 5
sequence: []
alias: Nachts starten wenn PV-Prognose gering
- conditions:
- condition: or
conditions:
- condition: time
after: "13:00:00"
- condition: state
entity_id: binary_sensor.flowmeter_on_2
state:
- "on"
- condition: sun
before: sunset
after: sunrise
after_offset: "2:00:00"
- condition: numeric_state
entity_id: sensor.heating_energy_progress_percent
below: 70
- condition: numeric_state
entity_id: input_number.heizung_raum_solltemperatur
above: sensor.eg_temperatur
value_template: "{{ state.state | float + 1 }}"
sequence:
- action: script.pufferspeicher_heizen
metadata: {}
data: {}
alias: Tag und Wärmebedarf < 70%
- conditions:
- condition: numeric_state
entity_id: sensor.heating_energy_demand_forecast_today
below: sensor.pv_panels_energy_forecast_today_remaining
value_template: >-
{{ (state.state | float) -
(states("sensor.heating_energy_consumed_today") | float) }}
- condition: sun
after: sunrise
after_offset: "2:00:00"
before: sunset
- alias: unter Soll
condition: numeric_state
entity_id: sensor.heating_target_temp
above: sensor.eg_temperatur
- condition: numeric_state
entity_id: sensor.grid_feed_power_filtered
below: 2800
- condition: state
entity_id: binary_sensor.flowmeter_on_2
state:
- "off"
sequence: []
alias: Warte wenn Tag & unter Soll & Heizbedarf < PV heute
- conditions:
- condition: numeric_state
entity_id: input_number.heizung_raum_solltemperatur
above: sensor.eg_temperatur
- condition: sun
before: sunset
after: sunrise
after_offset: "2:00:00"
sequence:
- action: script.pufferspeicher_heizen
metadata: {}
data: {}
- action: input_text.set_value
metadata: {}
target:
entity_id: input_text.heizungssteuerung_protokoll
data:
value: "Heizung gestartet: Tag und unter Solltemperatur"
alias: "Starten wenn Tag & unter Soll "
- conditions:
- condition: numeric_state
entity_id: input_number.heizung_raum_solltemperatur
above: sensor.eg_temperatur
value_template: "{{ state.state | float + 1 }}"
- condition: numeric_state
entity_id: sensor.grid_feed_power_filtered
value_template: >-
{{ state.state | float + states("sensor.heating_wp_power") |
float(0) }}
above: 2800
sequence:
- action: script.pufferspeicher_heizen
metadata: {}
data: {}
alias: Starten wenn PV Überschuss & unter Soll +1 °C
default:
- action: script.warmwasser_vor_dem_ausschalten_pufferspeicher_aus
metadata: {}
data: {}
mode: single
trace:
stored_traces: 100
Die Automatisierung arbeitet erst dann so richtig, wenn die Sonne scheint: An Tagen an denen genügend PV-Strom erzeugt wird (in grün), kann die Heizung (in gelb) während des Tages gestartet werden. Bei einer niedrigen PV-Prognose erlaubt die Automatisierung bereits nach 2 Uhr früh die eingestellte Zieltemperatur (bei mir 22,5 °C), wodurch die Heizung bereits früher aktiviert wird. Bei einer guten PV-Vorhersage wartet die Automatisierung, bis die Sonne scheint. Hier ein weiteres Beispiel einiger Tage mit 100 % Eigenverbrauch inkl. Batteriestatus:
Für die letzten 365-Tage, schaut die Energieverteilung meines Hauses in Home Assistant wie folgt aus:


Das Steuern der Heizung ist eine einfache und kostengünstige Maßnahme um den Eigenverbrauch der PV-Anlage zu erhöhen. Wird der Boiler, oder Pufferspeicher tagsüber erwärmt, muss die Energie in der Nacht nicht wieder zugekauft werden: Davon profitieren nicht nur PV-Anlagen ohne Stromspeicher, auch beim Einsatz eines Akkus kann dieser entlastet und unter Umständen sogar etwas kleiner dimensioniert werden.
Zugegeben ist mein Setup weit von Plug-and-Play entfernt, auch funktionierte die Automatisierung erst nach einigem Tuning. Wer sich aber gerne mit automatischen Abläufen beschäftigt kann sich mit ESP-Home und Home Assistant ordentlich austoben und damit richtig Strom sparen.
({{pro_count}})
({{con_count}})
Fragen / Kommentare