Hallo Community,
nun zum letzten Teil: Automations, Scripts und Sensoren. Wie im letzten Teil beschrieben “denkt” evcc unsere Wärmepumpe wäre ein “Smart Sensor” und schaltet diesen, sofern …
- Priorität
- Wert und Dauer des PV-Überschuss
… stimmen, ein. Auf dieses “Einschalten” reagiert nun …
# trigger start PV-optimization for heatpump
- id: sg_ready_request_start_pv_optimization
alias: Heatpump PV Optimization Starter (including delay)
trigger:
- platform: state
entity_id: input_boolean.anforderung_sg_ready_betriebszustand_3
to: 'on'
for: '00:01:00' # must be active for at least 1 min
action:
- service: script.heatpump_start_pv_optimization
data: {}
… und aktiviert …
# turn on PV-Optimization
heatpump_start_pv_optimization:
alias: Start PV Optimization for Heatpump
sequence:
- if:
# if sg_ready_vorbedingung
- condition: state
entity_id: sensor.heatpump_pv_optimization_precondition
state: "bereit"
then:
- service: timer.cancel
data:
entity_id: timer.heatpump_pv_optimization_timeout
- service: switch.turn_on
data:
entity_id: switch.sgreadycontroller_sg_ready_betriebszustand_3
- service: logbook.log
data:
name: Heatpump PV-Optimization
message: "Heatpump PV-Optimization: start script called - SG Ready Betriebszustand 3 activated."
else:
# ensure, that switch requesting Betriebszustand 3 is turned off
- service: input_boolean.turn_off
data:
entity_id: input_boolean.anforderung_sg_ready_betriebszustand_3
- service: logbook.log
data:
name: Heatpump PV-Optimization
message: "Heatpump PV-Optimization: start script called - SG Ready condition not met, nothing to be done here."
… das als erstes überprüft “sind alle Bedingungen zum Versetzen der Wärmepumpe in Betriebszustand 3 innerhalb von Home Assistant erfüllt” (diese Bedingung ist als eigenständiger Sensor “heatpump_pv_optimization_precondition” definiert, so dass er sehr schnell auf individuelle Bedürfnisse angepasst werden kann). Warum ist diese Abprüfung notwendig?
Home Assistant “kennt” mehr Parameter bzgl. der Wärmepumpe als evcc z.B.: befindet sich die Wärmpumpe im …
- “Sommer Betrieb” … aus unserer Sicht macht im Sommer ein Betriebszustand 3 wenig Sinn, da genügend Solarstrom exisitert, so dass die reguläre Zeitsteuerung, ausreichend ist
- “Programmbetrieb” … nur in diesem Zustand sollte Betriebszustand 3 aktiviert werden. Dies im “Ferienbetrieb” zu machen, macht ebenfalls weniger Sinn

Als Design Principle wählten wir KISS, “Keep It Simple and Stupid” gewählt, was an dieser Stelle bedeutet: das System reagiert, neben dem PV-Überschuss und den Prioritäten der Verbraucher, rein Zeit getrieben. Wie schon in einem unserer früheren Beiträge dargestellt bedeutet dies, dass eine Zeit am …
… vorgegeben werden kann, ab der Betriebszustand 3 potentiell aktiviert wird.
Die Grundlegende Annahme an dieser Stelle ist, dass damit sichergestellt wird, dass für uns …
… nachvollziehbar ist, welches Subsystem (Wallbox, Wärmepumpe, …), wann aktiv ist und was genau macht. Hatten kurz darüber nachgedacht, die PV-Prognose von Home Assistant an dieser Stelle mit einzubeziehen … das wurde dann aber etwas zu komplex und wir waren uns nicht sicher, ob sich diese Komplexität wirklich ausgezahlt hätte
.
Aber zurück zum Script: heatpump_start_pv_optimization kommandiert nun unser SG Ready Controller Betriebszustand 3 zu aktivieren. Die Wärmepumpe reagiert entsprechend. Der interessante Teil ist nun …
# Calculate virtual SoC of heatpump
- name: "heatpump_pv_optimization_soc"
unique_id: "heatpump.sg_ready_soc"
icon: mdi:water-percent
unit_of_measurement: "%"
state: >
{% set precondition = states('sensor.sg_ready_vorbedingungen') == 'bereit' %}
{% set request_betriebszustand_1 = is_state('switch.sgreadycontroller_sg_ready_betriebszustand_1', 'on') %}
{% set request_betriebszustand_3 = is_state('switch.sgreadycontroller_sg_ready_betriebszustand_3', 'on') %}
{% set request_betriebszustand_4 = is_state('switch.sgreadycontroller_sg_ready_betriebszustand_4', 'on') %}
{# ensure, that average grid feed-in is within range #}
{% set is_grid_feed_in = is_state('sensor.heatpump_pv_optimization_avg_grid_feed_in', 'bereit') %}
{% set actual_betriebszustand = states('sensor.sgreadycontroller_sg_ready_betriebszustand') | float %}
{% set betriebszustand_is_error = actual_betriebszustand < 0 %}
{% set betriebszustand_is_0 = actual_betriebszustand > -0.5 and actual_betriebszustand < 0.5 %}
{% set betriebszustand_is_3 = actual_betriebszustand > 2.5 and actual_betriebszustand < 3.5 %}
{% if betriebszustand_is_error %}
unknown
{% elif precondition or (not request_betriebszustand_1 and request_betriebszustand_3 and not request_betriebszustand_4 and betriebszustand_is_0) %}
{# value must be bigger than 0, otherwise it will be rejected by evcc #}
1
{% elif not request_betriebszustand_1
and request_betriebszustand_3
and not request_betriebszustand_4
and is_grid_feed_in
and betriebszustand_is_3 %}
{# calculate real SoC #}
{{ [ (states('sensor.stiebel_eltron_isg_actual_temperature_water') | float
/ states('number.stiebel_eltron_isg_comfort_water_temperature_target') | float(1) * 100) | round(1), 100 ] | min }}
{% else %}
100
{% endif %}
… ein Sensor, der evcc einen SoC simuliert. Letzten Endes wird hier die Zieltemperatur des warmen Wassers in Relation zur aktuellen Temperatur gesetzt
… wird 100% erreicht, wird unser virtueller “Smart Switch” wieder über …
# trigger heatpump 'fully charged' after PV-optimization
- id: sg_ready_pv_optimization_finalized
alias: Stop Heatpump PV Optimization when SoC full
trigger:
- platform: numeric_state
entity_id: sensor.heatpump_pv_optimization_soc
above: 99.9
condition:
- condition: state
entity_id: input_boolean.anforderung_sg_ready_betriebszustand_3
state: 'on'
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.anforderung_sg_ready_betriebszustand_3
- service: logbook.log
data:
name: Heatpump PV-Optimization
message: "Heatpump PV-Optimization: SoC > 99.9% – Anforderung Betriebszustand 3 deactivated."
entity_id: input_boolean.anforderung_sg_ready_betriebszustand_3
mode: single
… zurückgesetzt und kann erneut aktiviert werden.
Das ganze läuft nun schon seit mehrere Wochen. Die Prioritätssteuerung von evcc funktioniert ohne Probleme, so dass das Laden unseres E-Autos Betriebszustand 3 der Wärmepumpe verhindert hat.
Das Verhalten des Gesamtsystem ist nun deutlich nachvollziehbarer, was den WAF um einiges erhöht hat 
Es hat Spass gemacht, das Ganze umzusetzen. In einem der nächsten Schritte, der aber vermutlich erst später erfolgen wird, soll mehr Intelligenz in den Controller verlagert werden, so dass Home Assistant “lediglich” …
- Precondition für Betriebsart 3
- SoC-Berechnung
… liefert. Alles andere soll dann im Controller laufen …
Hoffen das unser kleines Projekt euer Interesse findet und euch zum Nachbau anregt 