Hallo zusammen,
ich möchte hier meine Erfahrungen und Lösungen teilen, wie ich meine Bosch Wärmepumpe Compress 5800i AW 12 ORE-T zusammen mit einer PV-Anlage in Home Assistant (HA) integriert und ein intelligentes Energiemanagement umgesetzt habe.
Ausgangslage
Seit etwa einem Jahr habe ich die Bosch Wärmepumpe und eine PV-Anlage installiert. Die PV-Anlage und die Tesla Powerwall ließen sich problemlos in HA integrieren (z.B. mit der „SMA Solar“ und der “Tesla Powerwall” Integration). Die Wärmepumpe von Bosch war allerdings schwieriger: Bosch stellt keine offizielle Schnittstelle für die über 150 Entitäten der Wärmepumpe zur Verfügung.
Lösung: EMS-Bus-Gateway von BBQKees Electronics
Nach längerer Recherche bin ich auf das EMS-Bus-Gateway von BBQKees Electronics gestoßen. Dieses Gateway bietet eine umfangreiche Knowledge Base und lässt sich gut über Matter in HA integrieren. So habe ich endlich Zugriff auf die Wärmepumpen-Daten bekommen.
Dashboard
Mein erstes Ziel war ein Dashboard mit den wichtigsten Wärmepumpen-Daten. Dabei hat mir die Webseite bosch-buderus-wp.github.io sehr geholfen.
Hier mein Dashboard:
Energiemanagement – Motivation
Bosch bietet einen kostenpflichtigen Energiemanager an, der die Wärmepumpe abhängig vom PV-Überschuss steuert:
Viel PV-Strom-Überschuss → Wärmepumpe läuft intensiver
Kein PV-Überschuss → Wärmepumpe im Normalmodus
Ich wollte das in Home Assistant selbst umsetzen: Ein umfassendes System, das PV-Überschuss, Hausverbrauch und Powerwall-Ladestatus intelligent auswertet und steuert. Dabei sollten auch Temperaturbedingungen berücksichtigt werden. Das System sollte flexibel über Schalter und Zahlen steuerbar sein und automatisch die Wärmepumpe je nach Restüberschuss regeln.
Bestandteile und Funktionen meines Energy Manager Packages
1. Helpers / Controls
-
input_boolean.energy_manager_enabled
Manuelle Aktivierung des Energy Managers (Standard: an). -
input_boolean.energy_manager_force_on / force_off
Erzwingen oder Deaktivieren unabhängig vom Hauptschalter. -
input_boolean.energy_manager_temp_ok
Zeigt an, ob die Temperaturbedingungen passen (wird über Automationen gesetzt). -
input_number.pw_max_charge
Max. Ladeleistung der Powerwall (kW), z.B. 4,6 kW. -
input_number.energy_manager_temp_start / energy_manager_temp_stop
Temperaturhysterese für Aktivierung des Managers (z.B. 14°C Start, 17°C Stop).
2. Filter Sensoren (Glättung)
Zur Vermeidung von Schwankungen werden Rohdaten geglättet:
-
sensor.pv_power_smoothed – geglättete PV-Leistung (Lowpass-Filter)
-
sensor.home_load_smoothed – geglätteter Hausverbrauch (gleitender Durchschnitt)
-
sensor.powerwall_battery_power_smoothed – geglättete Powerwall-Leistung (Lowpass)
3. Template Sensors (Kernlogik)
Berechnung wichtiger Steuergrößen:
-
energy_surplus
PV-Leistung minus Hausverbrauch (positiv = Überschuss). -
pw_max_charge
Maximal erlaubte Powerwall-Ladeleistung (aus input_number). -
pw_current_charge
Aktuelle Ladeleistung der Powerwall (negative Werte = Laden). -
to_battery_power
Wie viel vom Überschuss maximal in die Powerwall geladen werden kann. -
available_for_heatpump
Verbleibender Überschuss für die Wärmepumpe nach Powerwall-Ladung. -
energy_manager_active
Status, ob der Energy Manager aktiv ist (abhängig von Schaltern und Temperatur).
4. Automationen
-
Temperatur Hysterese
Setztenergy_manager_temp_okje nach Außentemperatur (Start/Stop). -
Wärmepumpe Überschusssteuerung
-
Bei genügend Überschuss und Powerwall SOC ≥ 95 % wird das Thermostat auf 25°C gesetzt (Heizbetrieb).
-
Bei wenig Überschuss wird auf 21°C zurückgestellt.
-
Benachrichtigungen informieren über Start/Stop.
-
-
Powerwall Priorisierung (Variante A)
Versucht bei Überschuss und SOC < 95 % die Powerwall bevorzugt zu laden.
(Hier ist ein Platzhalter für einen Service-Aufruf, der je nach Integration ergänzt werden muss.)
Package Struktur
```yaml
# config/packages/energy_manager.yaml
# --- Helpers / Controls ---
input_boolean:
energy_manager_enabled:
name: "Energy Manager aktiv"
initial: on
energy_manager_force_on:
name: "Energy Manager erzwingen"
initial: off
energy_manager_force_off:
name: "Energy Manager deaktivieren"
initial: off
energy_manager_temp_ok:
name: "Energy Manager: Temp OK"
initial: on
input_number:
pw_max_charge:
name: "Powerwall max Ladeleistung (kW)"
initial: 4.6
min: 0
max: 11.0
step: 0.1
unit_of_measurement: kW
energy_manager_temp_start:
name: "EM Temp Start (°C)"
initial: 14
min: -40
max: 40
step: 0.5
energy_manager_temp_stop:
name: "EM Temp Stop (°C)"
initial: 17
min: -40
max: 40
step: 0.5
# --- Filter Sensoren (Glättung) ---
# Diese Sensoren glätten kurzzeitige Fluktuationen. Die erzeugten entity_ids lauten:
# sensor.pv_power_smoothed, sensor.home_load_smoothed, sensor.powerwall_battery_power_smoothed
sensor:
- platform: filter
name: "PV Power (smoothed)"
entity_id: sensor.my_home_solar_energie # <-- deine PV entity
filters:
- filter: lowpass
time_constant: 5
precision: 0.1
- platform: filter
name: "Home Load (smoothed)"
entity_id: sensor.my_home_last_leistung # <-- dein Hausverbrauch entity
filters:
- filter: time_simple_moving_average
window_size: 5
precision: 0.1
- platform: filter
name: "Powerwall Battery Power (smoothed)"
entity_id: sensor.my_home_batterie_leistung # <-- Powerwall Leistung entity
filters:
- filter: lowpass
time_constant: 10
precision: 0.1
# --- Template Sensors (Kernlogik) ---
# Erzeugt u.a. sensor.energy_surplus, sensor.to_battery_power, sensor.available_for_heatpump
template:
- sensor:
- name: "energy_surplus"
unit_of_measurement: "kW"
state: >
{% set pv = states('sensor.pv_power_smoothed')|float(0) %}
{% set load = states('sensor.home_load_smoothed')|float(0) %}
{{ (pv - load) | round(2) }}
- name: "pw_max_charge"
unit_of_measurement: "kW"
state: >
{{ states('input_number.pw_max_charge') | float(4.6) }}
- name: "pw_current_charge"
unit_of_measurement: "kW"
state: >
{% set p = states('sensor.powerwall_battery_power_smoothed')|float(0) %}
{# Annahme: negative Werte = Laden. Falls bei dir positive Werte Laden anzeigen, ändere p < 0 in p > 0 und entferne das negative Vorzeichen unten. #}
{% if p < 0 %}
{{ (-p) | round(2) }}
{% else %}
0
{% endif %}
- name: "to_battery_power"
unit_of_measurement: "kW"
state: >
{% set surplus = states('sensor.energy_surplus')|float(0) %}
{% set max_in = states('sensor.pw_max_charge')|float(4.6) %}
{% set current = states('sensor.pw_current_charge')|float(0) %}
{% set remaining = (max_in - current) if (max_in - current) > 0 else 0 %}
{% if surplus > 0 %}
{{ [surplus, remaining] | min | round(2) }}
{% else %}
0
{% endif %}
- name: "available_for_heatpump"
unit_of_measurement: "kW"
state: >
{% set surplus = states('sensor.energy_surplus')|float(0) %}
{% set to_batt = states('sensor.to_battery_power')|float(0) %}
{% if surplus > 0 %}
{{ (surplus - to_batt) | round(2) if (surplus - to_batt) > 0 else 0 }}
{% else %}
0
{% endif %}
- name: "energy_manager_active"
state: >
{% set force_on = is_state('input_boolean.energy_manager_force_on','on') %}
{% set force_off = is_state('input_boolean.energy_manager_force_off','on') %}
{% if force_off %}
off
{% elif force_on %}
on
{% else %}
{% set manual = is_state('input_boolean.energy_manager_enabled','on') %}
{% set temp_ok = is_state('input_boolean.energy_manager_temp_ok','on') %}
{{ 'on' if (manual and temp_ok) else 'off' }}
{% endif %}
attributes:
manual_enabled: "{{ states('input_boolean.energy_manager_enabled') }}"
temp_ok: "{{ states('input_boolean.energy_manager_temp_ok') }}"
# --- Automationen ---
automation:
# Temperatur Hysterese: setzt input_boolean.energy_manager_temp_ok
- alias: EM Temp OK einschalten
description: ""
mode: single
trigger:
- platform: state
entity_id: sensor.boiler_air_inlet_temperature_tl2
condition:
- condition: template
value_template: >
{{ states('sensor.boiler_air_inlet_temperature_tl2') | float < states('input_number.energy_manager_temp_start') | float }}
action:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.energy_manager_temp_ok
- alias: EM Temp OK ausschalten
description: ""
mode: single
trigger:
- platform: state
entity_id: sensor.boiler_air_inlet_temperature_tl2
condition:
- condition: template
value_template: >
{{ states('sensor.boiler_air_inlet_temperature_tl2') | float > states('input_number.energy_manager_temp_stop') | float }}
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.energy_manager_temp_ok
# Wärmepumpe: nutzt restlichen Überschuss (setzt Number auf 25 zum Start, 21 zum Stop)
- alias: "EM: Wärmepumpe nur bei Restüberschuss"
description: "Setzt thermostat setpoint auf 25°C wenn genug Restüberschuss und Powerwall SOC >= 95%, sonst 21°C"
trigger:
- platform: state
entity_id: sensor.available_for_heatpump
condition:
- condition: state
entity_id: sensor.energy_manager_active
state: 'on'
- condition: numeric_state
entity_id: sensor.my_home_ladung # Powerwall SOC
above: 95
action:
- choose:
- conditions:
- condition: numeric_state
entity_id: sensor.available_for_heatpump
above: 0.5
sequence:
- service: number.set_value
data:
entity_id: number.thermostat_hc1_manual_temperature
value: 25
- service: notify.persistent_notification
data:
title: "EM: WP Start"
message: "WP Setpoint => 25°C (available_for_heatpump={{ states('sensor.available_for_heatpump') }})"
- delay:
minutes: 10
- conditions:
- condition: numeric_state
entity_id: sensor.available_for_heatpump
below: 0.2
sequence:
- service: number.set_value
data:
entity_id: number.thermostat_hc1_manual_temperature
value: 21
- service: notify.persistent_notification
data:
title: "EM: WP Stop"
message: "WP Setpoint => 21°C (available_for_heatpump={{ states('sensor.available_for_heatpump') }})"
# Variante A: Powerwall direkt priorisieren (Device Action erforderlich)
- alias: "EM: Powerwall zuerst (Device Action Variante)"
description: "Versucht, Powerwall Priorität zu geben wenn Überschuss & SOC < Ziel"
trigger:
- platform: numeric_state
entity_id: sensor.energy_surplus
above: 0.6
condition:
- condition: template
value_template: "{{ is_state('sensor.energy_manager_active','on') }}"
- condition: numeric_state
entity_id: sensor.my_home_ladung # <-- Powerwall SOC
below: 95
action:
- service: notify.persistent_notification
data:
title: "EM: Powerwall Priorität"
message: "Hier noch die Möglichkeit die Battery-Priorität zu aktivieren, was bei mir die Powerwall übernimmt"
# ---- WICHTIG: Ersetze den folgenden Platzhalter mit der Device Action / dem Service, den deine Powerwall Integration unterstützt.
# Beispiel (nur als Hinweis):
# - service: powerwall.set_backup_reserve
# data:
# entity_id: <dein powerwall device>
# backup_reserve_percent: 5
# Wenn deine Integration keine direkte Device Action anbietet, verwende Variante B (Verbrauchssteuerung), die bereits oben steht.
- wait_for_trigger:
- platform: numeric_state
entity_id: sensor.my_home_ladung
above: 90
for:
minutes: 1
- service: notify.persistent_notification
data:
title: "EM: Powerwall - Ladeziel erreicht"
message: "Bitte restore Reserve / Normalbetrieb manuell prüfen"
```
Funktionsweise im Überblick
-
Datenaufnahme & Glättung: Rohdaten von PV, Hausverbrauch und Batterie werden geglättet.
-
Überschussberechnung & Verteilung: Überschuss wird ermittelt und dynamisch auf Powerwall-Ladung und Wärmepumpe verteilt.
-
Temperaturabhängige Aktivierung: Energy Manager arbeitet nur bei passenden Temperaturen.
-
Automatische Steuerung: Wärmepumpe läuft nur bei Restüberschuss; Powerwall wird bei niedrigem SOC bevorzugt geladen.
-
Manuelle Steuerung: Über Input Booleans kann der Manager ein-/ausgeschaltet oder erzwungen werden.
Visualisierung im Dashboard
Im Hauptdashboard zeige ich aktuell nur den Betriebsmodus der Wärmepumpe mit einer custom:button-card an:

Wichtig: Wenn du das so in einem Editor oder Forum einfügst, entferne die äußeren Anführungszeichen hier, damit die Backticks korrekt erkannt werden.
Also in deinem Beitrag einfach so einfügen (ohne die erklärenden Zeilen):
type: custom:button-card
name: null
show_icon: false
show_state: true
state_display: |
[[[
const val = states['number.thermostat_hc1_selected_room_temperature']?.state;
if (val === '21.0') return 'Normalbetrieb';
if (val === '25.0') return 'Extra aufheizen';
return 'Status unbekannt';
]]]
styles:
card:
- padding: 12px
- font-size: 16px
- text-align: center
- color: white
- background-color: |
[[[
const val = states['number.thermostat_hc1_selected_room_temperature']?.state;
if (val === '21.0') return 'green';
if (val === '25.0') return 'orange';
return 'gray';
]]]
Zusätzlich habe ich ein rudimentäres Dashboard mit allen relevanten Entitäten zur Steuerung der Wärmepumpe erstellt (rein zur Übersicht und prüfen der Daten die alles steuern):
Fazit und Ausblick
Das System läuft bei mir seit kurzem und der Winter steht noch bevor. Ich hoffe auf viel Sonne und werde hier berichten, wenn ich weitere Optimierungen vornehme.
Ich freue mich auf Feedback, Fragen oder Anregungen!
Viele Grüße
René






