Bosch Wärmepumpe in Home Assistant integrieren und steuern dieser mit Leistungsüberschuss der PV-Anlage

So ganz komme ich im Moment auch nicht mit nachdem was dir noch passiert. Ich habe alles was notwendig ist eigentlich in dem Package definiert?

Lass uns doch mal etwas konkreter werden. Sag mir, was dir genau fehlt und ich poste das hier noch einmal.

Zunächst fehlt mir das Dashboard um zu sehen welche Parameter eventuell nicht stimmen.Aktuell sind ja alle Parameter unavailable obwohl ich das Package eingespielt habe.

Ok, ich versuche Dir noch einmal alles zur Verfügung zustellen was ich kann, aber das Dashboard musst Du selber erstellen, dass kommt nicht durch das Package mit.

Hier noch einmal, wie das Package aktuell bei mir aussieht:

# config/packages/energy_manager.yaml

# --- Helpers / Controls ---
input_boolean:
  energy_manager_enabled:
    name: "Energy Manager aktiv"
    initial: on
  energy_manager_temp_ok:
    name: "Energy Manager: Temp OK"
    initial: on
  energy_manager_force_zero:
    name: "Energy Manager: Force smoothed zero"
    initial: off
    icon: mdi:power-off
  em_allow_aux:
    name: "EM: Aux-Heater erlauben"
    initial: off
  em_dhw_charging:
    name: "EM DHW Ladung aktiv"
    initial: off
  em_safe_mode:
    name: "EM Safe Mode"
    initial: off
    icon: mdi:shield-alert

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

  em_flow_temp_min:
    name: "EM Vorlauf Minimum (°C)"
    initial: 38
    min: 20
    max: 45
    step: 0.5

  em_flow_temp_max:
    name: "EM Vorlauf Maximum (°C)"
    initial: 50
    min: 40
    max: 60
    step: 0.5

  em_flow_temp_step_k:
    name: "EM Vorlauf Änderung pro Intervall (°C)"
    initial: 0.5
    min: 0.1
    max: 2
    step: 0.1

  em_min_runtime:
    name: "EM Kompressor Mindestlaufzeit (Minuten)"
    initial: 15
    min: 5
    max: 60
    step: 1

  em_pv_threshold_start:
    name: "EM PV Überschuss Startschwelle (kW)"
    initial: 3
    min: 0
    max: 5
    step: 0.1

  em_pv_threshold_stop:
    name: "EM PV Überschuss Stoppschwelle (kW)"
    initial: 1
    min: 0
    max: 5
    step: 0.1

  em_dhw_max_temp:
    name: "EM DHW Max Temperatur (°C)"
    initial: 55
    min: 45
    max: 70
    step: 0.5

  em_dhw_min_temp:
    name: "EM DHW Min Temperatur (°C)"
    initial: 45
    min: 35
    max: 55
    step: 0.5

  em_dhw_charge_min_duration:
    name: "EM DHW Mindestladezeit (Minuten)"
    initial: 20
    min: 5
    max: 60
    step: 1

  # Hysterese: Schwellen für em_available_for_heatpump (Start/Stop)
  em_avail_start:
    name: "EM Avail Start (kW)"
    initial: 0.6
    min: 0
    max: 10
    step: 0.1
    unit_of_measurement: kW

  em_avail_stop:
    name: "EM Avail Stop (kW)"
    initial: 0.4
    min: 0
    max: 10
    step: 0.1
    unit_of_measurement: kW

# --- Scripts ---
script:
  em_reset_to_defaults:
    alias: "EM: Reset auf Standardwerte"
    sequence:
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.em_safe_mode
      - delay: "00:00:01"

      # Input Booleans
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.energy_manager_enabled
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.energy_manager_temp_ok
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.energy_manager_force_zero
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.em_allow_aux
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.em_dhw_charging

      # Input Numbers zurücksetzen
      - service: input_number.set_value
        data:
          entity_id: input_number.pw_max_charge
          value: 4.6
      - service: input_number.set_value
        data:
          entity_id: input_number.energy_manager_temp_start
          value: 14
      - service: input_number.set_value
        data:
          entity_id: input_number.energy_manager_temp_stop
          value: 17
      - service: input_number.set_value
        data:
          entity_id: input_number.em_flow_temp_min
          value: 38
      - service: input_number.set_value
        data:
          entity_id: input_number.em_flow_temp_max
          value: 50
      - service: input_number.set_value
        data:
          entity_id: input_number.em_flow_temp_step_k
          value: 0.5
      - service: input_number.set_value
        data:
          entity_id: input_number.em_min_runtime
          value: 15
      - service: input_number.set_value
        data:
          entity_id: input_number.em_pv_threshold_start
          value: 3
      - service: input_number.set_value
        data:
          entity_id: input_number.em_pv_threshold_stop
          value: 1
      - service: input_number.set_value
        data:
          entity_id: input_number.em_dhw_max_temp
          value: 55
      - service: input_number.set_value
        data:
          entity_id: input_number.em_dhw_min_temp
          value: 45
      - service: input_number.set_value
        data:
          entity_id: input_number.em_dhw_charge_min_duration
          value: 20
      - service: input_number.set_value
        data:
          entity_id: input_number.em_avail_start
          value: 0.6
      - service: input_number.set_value
        data:
          entity_id: input_number.em_avail_stop
          value: 0.4

      # Setze die Soll-Vorlauftemperatur auf ein sicheres Minimum (em_flow_temp_min)
      - service: number.set_value
        data:
          entity_id: number.boiler_selected_flow_temperature
          value: "{{ states('input_number.em_flow_temp_min') | float(38) }}"

      # Schalte WP/DHW-Schalter in sicheren Zustand
      - service: switch.turn_off
        target:
          entity_id:
            - switch.boiler_dhw_one_time_charging
            - switch.boiler_aux_heater_only

      - delay: "00:00:01"
      - service: notify.persistent_notification
        data:
          title: "EM: Reset auf Standardwerte"
          message: "Alle EM-Helper wurden auf Default gesetzt und Safe Mode aktiviert. Prüfe Logs und beobachte Sensoren."
    mode: single

# --- Filter Sensoren (Glättung) ---
sensor:
  - platform: filter
    name: "em_pv_power_smoothed"
    entity_id: sensor.my_home_solar_energie
    filters:
      - filter: lowpass
        time_constant: 2
        precision: 2

  - platform: filter
    name: "em_home_load_smoothed"
    entity_id: sensor.my_home_last_leistung
    filters:
      - filter: time_simple_moving_average
        window_size: 3
        precision: 2

  - platform: filter
    name: "em_powerwall_battery_power_smoothed"
    entity_id: sensor.my_home_batterie_leistung
    filters:
      - filter: lowpass
        time_constant: 6
        precision: 2

# --- Template Sensors & Binary Sensors ---
template:
  - sensor:
      - name: "em_pv_power_corrected"
        unit_of_measurement: "kW"
        state: >-
          {% set force = is_state('input_boolean.energy_manager_force_zero', 'on') %}
          {% set raw = states('sensor.my_home_solar_energie') | float(0) %}
          {% set sm = states('sensor.em_pv_power_smoothed') | float(0) %}
          {% if force or raw < 0.02 %}
            0
          {% else %}
            {{ sm | round(2) }}
          {% endif %}

      - name: "em_home_load_corrected"
        unit_of_measurement: "kW"
        state: >-
          {% set force = is_state('input_boolean.energy_manager_force_zero', 'on') %}
          {% set raw = states('sensor.my_home_last_leistung') | float(0) %}
          {% set sm = states('sensor.em_home_load_smoothed') | float(0) %}
          {% if force or raw < 0.02 %}
            0
          {% else %}
            {{ sm | round(2) }}
          {% endif %}

      - name: "em_powerwall_charge_corrected"
        unit_of_measurement: "kW"
        state: >-
          {% set force = is_state('input_boolean.energy_manager_force_zero', 'on') %}
          {% set raw = states('sensor.my_home_batterie_leistung') | float(0) %}
          {% set sm = states('sensor.em_powerwall_battery_power_smoothed') | float(0) %}
          {% if force or (raw | abs) < 0.02 %}
            0
          {% else %}
            {{ sm | round(2) }}
          {% endif %}

      - name: "em_energy_surplus"
        unit_of_measurement: "kW"
        state: >-
          {{ (states('sensor.em_pv_power_corrected') | float(0) - states('sensor.em_home_load_corrected') | float(0)) | round(2) }}

      - name: "em_pw_max_charge"
        unit_of_measurement: "kW"
        state: >-
          {{ states('input_number.pw_max_charge') | float(4.6) }}

      - name: "em_pw_current_charge"
        unit_of_measurement: "kW"
        state: >-
          {{ (states('sensor.em_powerwall_charge_corrected') | float(0)) | abs | round(2) }}

      - name: "em_available_for_heatpump"
        unit_of_measurement: "kW"
        state: >-
          {% set surplus = states('sensor.em_energy_surplus') | float(0) %}
          {% set pw_curr = states('sensor.em_pw_current_charge') | float(0) %}
          {% set threshold = 0.02 %}
          {% if surplus > 0 %}
            {% set used = pw_curr if pw_curr > threshold else 0 %}
            {{ [surplus - used, 0] | max | round(2) }}
          {% else %}
            0
          {% endif %}
        attributes:
          note: "Surplus minus current battery charge (threshold 0.02 kW)"

      - name: "em_target_flow_temp"
        unit_of_measurement: "°C"
        state: >-
          {% set min_t = states('input_number.em_flow_temp_min') | float(0) %}
          {% set max_t = states('input_number.em_flow_temp_max') | float(0) %}
          {% set avail = states('sensor.em_available_for_heatpump') | float(0) %}
          {% set max_power = 6 %}
          {% set ratio = (avail / max_power) | float(0) %}
          {% set ratio = [ratio, 0] | max %}
          {% set ratio = [ratio, 1] | min %}
          {% set target = min_t + (max_t - min_t) * ratio %}
          {{ target | round(1) }}

      - name: "em_current_flow_temp"
        unit_of_measurement: "°C"
        state: "{{ states('sensor.boiler_current_flow_temperature') | float(0) }}"

      - name: "em_dhw_boiler_temp"
        unit_of_measurement: "°C"
        state: "{{ states('sensor.boiler_heat_carrier_forward_tc1') | float(0) }}"

      - name: "em_dhw_charge_state"
        state: >-
          {{ 'on' if is_state('input_boolean.em_dhw_charging', 'on') else 'off' }}

  - binary_sensor:
    - name: "wp_laufzeit_startbedingung"
      unique_id: wp_laufzeit_startbedingung
      device_class: running
      state: >-
        {% set enabled    = is_state('input_boolean.energy_manager_enabled','on') %}
        {% set temp_ok    = is_state('input_boolean.energy_manager_temp_ok','on') %}
        {% set safe_off   = is_state('input_boolean.em_safe_mode','off') %}
        {% set avail      = states('sensor.em_available_for_heatpump') | float(0) %}
        {% set start_th   = states('input_number.em_avail_start') | float(0) %}
        {% set target_t   = states('sensor.em_target_flow_temp') | float(0) %}
        {% set current_t  = states('sensor.em_current_flow_temp') | float(0) %}
        {% set hysteresis = 0.2 %}
        {{ enabled and temp_ok and safe_off and (avail > start_th) and (target_t > current_t + hysteresis) }}
        {# Optional zusätzlich: or is_state('input_boolean.em_dhw_charging','on') #}
      attributes:
        em_enabled: "{{ states('input_boolean.energy_manager_enabled') }}"
        em_temp_ok: "{{ states('input_boolean.energy_manager_temp_ok') }}"
        em_safe_mode: "{{ states('input_boolean.em_safe_mode') }}"
        avail_for_hp_kW: "{{ states('sensor.em_available_for_heatpump') }}"
        avail_start_kW: "{{ states('input_number.em_avail_start') }}"
        target_flow_temp_C: "{{ states('sensor.em_target_flow_temp') }}"
        current_flow_temp_C: "{{ states('sensor.em_current_flow_temp') }}"
        would_set_to_C: >-
          {% set step  = states('input_number.em_flow_temp_step_k') | float(0.5) %}
          {% set max_t = states('input_number.em_flow_temp_max')   | float(50) %}
          {% set cand  = (states('sensor.em_current_flow_temp') | float(0)) + step %}
          {% set tgt   = states('sensor.em_target_flow_temp')  | float(0) %}
          {% set capped = [cand, tgt, max_t] | min %}
          {{ capped | round(1) }}
        reason: >-
          {# Variablen in Attribut-Template erneut setzen, da separat gerendert #}
          {% set enabled    = is_state('input_boolean.energy_manager_enabled','on') %}
          {% set temp_ok    = is_state('input_boolean.energy_manager_temp_ok','on') %}
          {% set safe_off   = is_state('input_boolean.em_safe_mode','off') %}
          {% set avail      = states('sensor.em_available_for_heatpump') | float(0) %}
          {% set start_th   = states('input_number.em_avail_start') | float(0) %}
          {% set target_t   = states('sensor.em_target_flow_temp') | float(0) %}
          {% set current_t  = states('sensor.em_current_flow_temp') | float(0) %}
          {% set hysteresis = 0.2 %}
          {% set reasons = [] %}
          {% if not enabled %}{% set reasons = reasons + ['disabled'] %}{% endif %}
          {% if not temp_ok %}{% set reasons = reasons + ['temp_not_ok'] %}{% endif %}
          {% if not safe_off %}{% set reasons = reasons + ['safe_mode_on'] %}{% endif %}
          {% if not (avail > start_th) %}{% set reasons = reasons + ['avail_below_start'] %}{% endif %}
          {% if not (target_t > current_t + hysteresis) %}{% set reasons = reasons + ['target_not_above_current'] %}{% endif %}
          {{ 'all_conditions_met' if reasons|length == 0 else reasons|join(',') }}
      availability: >-
        {{
          (states('sensor.em_available_for_heatpump') not in ['unknown','unavailable','']) and
          (states('sensor.em_target_flow_temp') not in ['unknown','unavailable','']) and
          (states('sensor.em_current_flow_temp') not in ['unknown','unavailable',''])
        }}

# --- Automationen (alle in einem Block) ---
automation:
  - alias: "EM Temp OK Status aktualisieren"
    description: "Setzt input_boolean.energy_manager_temp_ok basierend auf Temperatur mit Debounce 60s"
    mode: restart
    trigger:
      - platform: state
        entity_id: sensor.boiler_air_inlet_temperature_tl2
    condition: []
    action:
      - choose:
          - conditions:
              - condition: template
                value_template: >-
                  {% set temp = states('sensor.boiler_air_inlet_temperature_tl2') %}
                  {% set start = states('input_number.energy_manager_temp_start') %}
                  {{ temp not in ['unavailable', 'unknown', ''] and
                     start not in ['unavailable', 'unknown', ''] and
                     (temp | float(0)) < (start | float(0)) }}
            sequence:
              - delay: "00:01:00"
              - condition: template
                value_template: >-
                  {% set temp = states('sensor.boiler_air_inlet_temperature_tl2') %}
                  {% set start = states('input_number.energy_manager_temp_start') %}
                  {{ temp not in ['unavailable', 'unknown', ''] and
                     start not in ['unavailable', 'unknown', ''] and
                     (temp | float(0)) < (start | float(0)) }}
              - service: input_boolean.turn_on
                target:
                  entity_id: input_boolean.energy_manager_temp_ok
          - conditions:
              - condition: template
                value_template: >-
                  {% set temp = states('sensor.boiler_air_inlet_temperature_tl2') %}
                  {% set stop = states('input_number.energy_manager_temp_stop') %}
                  {{ temp not in ['unavailable', 'unknown', ''] and
                     stop not in ['unavailable', 'unknown', ''] and
                     (temp | float(0)) > (stop | float(0)) }}
            sequence:
              - delay: "00:01:00"
              - condition: template
                value_template: >-
                  {% set temp = states('sensor.boiler_air_inlet_temperature_tl2') %}
                  {% set stop = states('input_number.energy_manager_temp_stop') %}
                  {{ temp not in ['unavailable', 'unknown', ''] and
                     stop not in ['unavailable', 'unknown', ''] and
                     (temp | float(0)) > (stop | float(0)) }}
              - service: input_boolean.turn_off
                target:
                  entity_id: input_boolean.energy_manager_temp_ok

  # Automation: EM: Vorlauftemperatur regeln (nur Erhöhungen, kein Absenken)
  - alias: "EM: Vorlauftemperatur regeln"
    description: "Erhöht Selected flow temperature stufenlos mit Ramping (nur Anheben, kein aktives Absenken)"
    trigger:
      - platform: state
        entity_id:
          - sensor.em_available_for_heatpump
          - sensor.em_current_flow_temp
          - input_boolean.energy_manager_enabled
          - input_boolean.energy_manager_temp_ok
    condition:
      - condition: state
        entity_id: input_boolean.energy_manager_enabled
        state: 'on'
      - condition: state
        entity_id: input_boolean.energy_manager_temp_ok
        state: 'on'
      - condition: state
        entity_id: input_boolean.em_safe_mode
        state: 'off'
      # Hysterese-Bedingung: nur wenn verfügbar > Start-Schwelle
      - condition: template
        value_template: >-
          {{ (states('sensor.em_available_for_heatpump') | float(0)) > (states('input_number.em_avail_start') | float(0)) }}
    action:
      - variables:
          target_temp_raw: "{{ states('sensor.em_target_flow_temp') | float(0) }}"
          current_temp: "{{ states('sensor.em_current_flow_temp') | float(0) }}"
          step: "{{ states('input_number.em_flow_temp_step_k') | float(0) }}"
          max_t: "{{ states('input_number.em_flow_temp_max') | float(0) }}"
          last_change: "{{ state_attr('number.boiler_selected_flow_temperature', 'last_changed') }}"
          time_since_change_min: >-
            {% if last_change is none %}
              9999
            {% else %}
              ((as_timestamp(now()) - as_timestamp(last_change)) / 60)
            {% endif %}
      - choose:
          - conditions:
              # Nur erhöhen, wenn Ziel > Ist
              - condition: template
                value_template: >-
                  {{ target_temp_raw > current_temp }}
            sequence:
              - variables:
                  # Kandidat ist Ist + Schritt, aber nicht über Ziel
                  candidate_temp: >-
                    {% set cand = current_temp + step %}
                    {% if cand > target_temp_raw %}
                      {{ target_temp_raw }}
                    {% else %}
                      {{ cand }}
                    {% endif %}
                  # Kappe auf maximalen erlaubten Wert
                  new_temp_capped: >-
                    {{ [ (candidate_temp | float), (max_t | float) ] | min | round(1) }}
              - service: number.set_value
                data:
                  entity_id: number.boiler_selected_flow_temperature
                  value: "{{ new_temp_capped }}"
              - service: system_log.write
                data:
                  message: "EM: Vorlaufregelung erhöht von {{ current_temp }}°C auf {{ new_temp_capped }}°C (Ziel {{ target_temp_raw }}°C, Max {{ max_t }}°C)"
                  level: info
        default: []

  - alias: "EM: DHW Ladung steuern"
    description: "Steuert DHW Charging basierend auf PV Überschuss und Boiler Temperatur, mit Hysterese"
    trigger:
      - platform: state
        entity_id:
          - sensor.em_available_for_heatpump
          - sensor.em_dhw_boiler_temp
          - input_boolean.energy_manager_enabled
          - input_boolean.energy_manager_temp_ok
          - input_boolean.em_dhw_charging
    condition:
      - condition: state
        entity_id: input_boolean.energy_manager_enabled
        state: 'on'
      - condition: state
        entity_id: input_boolean.energy_manager_temp_ok
        state: 'on'
      - condition: state
        entity_id: input_boolean.em_safe_mode
        state: 'off'
    action:
      - variables:
          pv_avail: "{{ states('sensor.em_available_for_heatpump') | float(0) }}"
          boiler_temp: "{{ states('sensor.boiler_heat_carrier_forward_tc1') | float(0) }}"
          dhw_charging: "{{ is_state('input_boolean.em_dhw_charging', 'on') }}"
          max_temp: "{{ states('input_number.em_dhw_max_temp') | float(0) }}"
          min_temp: "{{ states('input_number.em_dhw_min_temp') | float(0) }}"
          min_duration: "{{ states('input_number.em_dhw_charge_min_duration') | int }}"
          last_on: "{{ state_attr('input_boolean.em_dhw_charging', 'last_changed') }}"
          time_on_min: >-
            {% if last_on is none %}
              9999
            {% else %}
              ((as_timestamp(now()) - as_timestamp(last_on)) / 60)
            {% endif %}
          start_thresh: "{{ states('input_number.em_avail_start') | float(0) }}"
          stop_thresh: "{{ states('input_number.em_avail_stop') | float(0) }}"
      - choose:
          # Start DHW Charging wenn PV Überschuss über Startschwelle und Boiler Temp < max_temp
          - conditions:
              - condition: template
                value_template: >-
                  {{ pv_avail > start_thresh }}
              - condition: template
                value_template: >-
                  {{ boiler_temp < max_temp }}
              - condition: template
                value_template: >-
                  {{ not dhw_charging or (dhw_charging and time_on_min > min_duration) }}
            sequence:
              - service: input_boolean.turn_on
                target:
                  entity_id: input_boolean.em_dhw_charging
              - service: switch.turn_on
                target:
                  entity_id: switch.boiler_dhw_one_time_charging
              - service: system_log.write
                data:
                  message: "EM: DHW Charging gestartet (Boiler {{ boiler_temp }}°C, PV Überschuss {{ pv_avail }} kW)"
                  level: info

          # Stop DHW Charging wenn PV unter Stop-Schwelle oder Boiler Temp >= max_temp und Mindestladezeit erfüllt
          - conditions:
              - condition: template
                value_template: >-
                  {{ (boiler_temp >= max_temp) or (pv_avail < stop_thresh) }}
              - condition: template
                value_template: >-
                  {{ dhw_charging and time_on_min > min_duration }}
            sequence:
              - service: input_boolean.turn_off
                target:
                  entity_id: input_boolean.em_dhw_charging
              - service: switch.turn_off
                target:
                  entity_id: switch.boiler_dhw_one_time_charging
              - service: system_log.write
                data:
                  message: "EM: DHW Charging gestoppt (Boiler {{ boiler_temp }}°C, PV Überschuss {{ pv_avail }} kW)"
                  level: info

  - alias: "EM: Aux-Heater Steuerung"
    description: "Blockiert Aux-Heater wenn nicht erlaubt oder Boiler Temp ausreichend, mit Hysterese"
    trigger:
      - platform: state
        entity_id:
          - input_boolean.em_allow_aux
          - sensor.boiler_heat_carrier_forward_tc1
          - input_boolean.em_dhw_charging
          - sensor.em_available_for_heatpump
    condition:
      - condition: state
        entity_id: input_boolean.em_safe_mode
        state: 'off'
    action:
      - variables:
          allow_aux: "{{ is_state('input_boolean.em_allow_aux', 'on') }}"
          boiler_temp: "{{ states('sensor.boiler_heat_carrier_forward_tc1') | float(0) }}"
          min_temp: "{{ states('input_number.em_dhw_min_temp') | float(0) }}"
          dhw_charging: "{{ is_state('input_boolean.em_dhw_charging', 'on') }}"
          pv_avail: "{{ states('sensor.em_available_for_heatpump') | float(0) }}"
          start_thresh: "{{ states('input_number.em_avail_start') | float(0) }}"
          stop_thresh: "{{ states('input_number.em_avail_stop') | float(0) }}"
      - choose:
          - conditions:
              - condition: template
                value_template: >-
                  {{ not allow_aux and boiler_temp > min_temp and dhw_charging and pv_avail > stop_thresh }}
            sequence:
              - service: switch.turn_off
                target:
                  entity_id: switch.boiler_aux_heater_only
              - service: system_log.write
                data:
                  message: "EM: Aux-Heater deaktiviert wegen Energiemanager"
                  level: info

          - conditions:
              - condition: template
                value_template: "{{ allow_aux }}"
            sequence:
              - service: switch.turn_on
                target:
                  entity_id: switch.boiler_aux_heater_only
              - service: system_log.write
                data:
                  message: "EM: Aux-Heater erlaubt durch Energiemanager"
                  level: info

  - alias: "EM: Force smoothed zero on startup"
    description: "Setzt beim HA-Start kurzzeitig das Force-Zero-Flag, bis Rohsensoren initialisiert sind"
    mode: single
    trigger:
      - platform: homeassistant
        event: start
    action:
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.energy_manager_force_zero
      - wait_for_trigger:
          - platform: template
            value_template: >-
              {% set s1 = states('sensor.my_home_solar_energie') %}
              {% set s2 = states('sensor.my_home_last_leistung') %}
              {% set s3 = states('sensor.my_home_batterie_leistung') %}
              {{ [s1, s2, s3] | select('match', '^(?!unknown$|^unavailable$|^$).+') | list | count > 0 }}
        timeout: "00:00:20"
      - delay: "00:00:02"
      - service: homeassistant.update_entity
        target:
          entity_id:
            - sensor.em_pv_power_smoothed
            - sensor.em_home_load_smoothed
            - sensor.em_powerwall_battery_power_smoothed
            - sensor.em_pv_power_corrected
            - sensor.em_home_load_corrected
            - sensor.em_powerwall_charge_corrected
            - sensor.em_energy_surplus
            - sensor.em_available_for_heatpump
            - sensor.em_pw_current_charge
            - sensor.em_pw_max_charge
            - sensor.em_target_flow_temp
            - sensor.em_current_flow_temp
            - sensor.boiler_heat_carrier_forward_tc1
      - delay: "00:00:01"
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.energy_manager_force_zero

Und dann kann ich Dir noch den Auszug aus meiner RAW-Konfigurationsdatei zur Verfügung stellen in dem das Dashboard definiert ist.

  - title: WP Automatisierung
    path: WPDaten
    icon: mdi:heat-pump-outline
    theme: Nordic
    cards: []
    type: sections
    layout:
      width: 400
      max_cols: 3
    visible:
      - user: 9c3a30d6645649c386acf6485e8d39e3
    sections:
      - type: grid
        cards:
          - type: heading
            heading_style: title
            heading: Wärmepumpe - Betriebsmodus
            icon: mdi:heat-pump
          - type: custom:button-card
            entity: binary_sensor.wp_laufzeit_startbedingung
            name: Extra Heißmodus
            show_icon: true
            icon: mdi:fire
            show_name: true
            show_state: false
            state:
              - value: 'on'
                color: white
                icon: mdi:fire
                name: Aufheiz-Betrieb
                styles:
                  card:
                    - background: '#FF8C00'
                    - border-radius: 8px
                    - box-shadow: none
                  name:
                    - color: white
                    - font-weight: 600
                  state:
                    - color: white
              - value: 'off'
                color: white
                icon: mdi:fire-off
                name: Normal-Betrieb
                styles:
                  card:
                    - background: '#2E8B57'
                    - border-radius: 8px
                    - box-shadow: none
                  name:
                    - color: white
                    - font-weight: 600
                  state:
                    - color: white
            styles:
              card:
                - padding: 12px
                - font-size: 16px
                - text-align: center
                - color: white
                - border-radius: 6px
                - box-shadow: none
              icon:
                - width: 32px
                - height: 32px
              name:
                - font-size: 16px
              state:
                - font-size: 14px
          - square: false
            type: grid
            cards:
              - type: custom:button-card
                entity: sensor.wp_laufzeit_bei_uberschuss_heute_neu
                name: WP Laufzeit bei Überschuss heute
                icon: mdi:clock-time-five-outline
                show_icon: false
                show_name: true
                show_state: false
                show_label: true
                label: |
                  [[[
                    // raw = Stunden im Dezimalformat (z.B. 1.75 = 1h45min)
                    const raw = states['sensor.wp_laufzeit_bei_uberschuss_heute_neu']?.state;
                    const val = parseFloat(raw);
                    if (isNaN(val)) return "–";

                    // Umrechnung: Dezimalstunden → Sekunden
                    const totalSeconds = Math.round(val * 3600);

                    const hours   = Math.floor(totalSeconds / 3600);
                    const minutes = Math.floor((totalSeconds % 3600) / 60);
                    const seconds = totalSeconds % 60;

                    // Format hh:mm:ss
                    return `${hours.toString().padStart(2,'0')}:` +
                           `${minutes.toString().padStart(2,'0')}:` +
                           `${seconds.toString().padStart(2,'0')}`;
                  ]]]
                styles:
                  card:
                    - font-size: 18px
                    - text-align: center
                    - padding: 8px
                  label:
                    - font-weight: bold
                    - color: var(--primary-text-color)
            columns: 1
          - square: false
            type: grid
            cards:
              - type: custom:button-card
                entity: sensor.wp_laufzeit_bei_uberschuss_monat
                name: WP Laufzeit bei Überschuss Monat
                icon: mdi:clock-time-five-outline
                show_icon: false
                show_name: true
                show_state: false
                show_label: true
                label: |
                  [[[
                    // raw = Stunden im Dezimalformat (z.B. 1.75 = 1h45min)
                    const raw = states['sensor.wp_laufzeit_bei_uberschuss_monat']?.state;
                    const val = parseFloat(raw);
                    if (isNaN(val)) return "–";

                    // Umrechnung: Dezimalstunden → Sekunden
                    const totalSeconds = Math.round(val * 3600);

                    const hours   = Math.floor(totalSeconds / 3600);
                    const minutes = Math.floor((totalSeconds % 3600) / 60);
                    const seconds = totalSeconds % 60;

                    // Format hh:mm:ss
                    return `${hours.toString().padStart(2,'0')}:` +
                           `${minutes.toString().padStart(2,'0')}:` +
                           `${seconds.toString().padStart(2,'0')}`;
                  ]]]
                styles:
                  card:
                    - font-size: 18px
                    - text-align: center
                    - padding: 8px
                  label:
                    - font-weight: bold
                    - color: var(--primary-text-color)
            columns: 1
          - type: horizontal-stack
            cards:
              - type: custom:button-card
                entity: input_boolean.energy_manager_enabled
                name: EM aktiv
                show_state: true
                icon: mdi:flash
                tap_action:
                  action: toggle
                styles:
                  card:
                    - padding: 12px
                    - font-size: 16px
                    - text-align: center
                    - color: white
                    - border-radius: 6px
                    - box-shadow: none
              - type: custom:button-card
                entity: input_boolean.em_safe_mode
                name: SAFE MODE
                show_state: true
                styles:
                  card:
                    - padding: 12px
                    - font-size: 16px
                    - text-align: center
                    - color: white
                    - border-radius: 6px
                    - box-shadow: none
                state:
                  - value: 'on'
                    color: red
                    icon: mdi:shield-alert
                    name: SAFE MODE ON
                  - value: 'off'
                    color: green
                    icon: mdi:shield-check
                    name: Safe Mode
                tap_action:
                  action: toggle
                hold_action:
                  action: more-info
          - type: horizontal-stack
            cards:
              - type: custom:button-card
                entity: sensor.em_dhw_charge_state
                name: DHW State
                show_state: true
                show_icon: false
                tap_action:
                  action: toggle
                styles:
                  card:
                    - padding: 12px
                    - font-size: 16px
                    - text-align: center
                    - color: white
                    - border-radius: 6px
                    - box-shadow: none
              - type: custom:button-card
                entity: input_boolean.em_dhw_charging
                name: DHW Charging
                show_state: true
                show_icon: false
                tap_action:
                  action: toggle
                styles:
                  card:
                    - padding: 12px
                    - font-size: 16px
                    - text-align: center
                    - color: white
                    - border-radius: 6px
                    - box-shadow: none
          - type: horizontal-stack
            cards:
              - type: custom:button-card
                entity: input_boolean.energy_manager_force_zero
                name: Force Zero
                show_state: true
                icon: mdi:power-off
                tap_action:
                  action: toggle
                styles:
                  card:
                    - padding: 12px
                    - font-size: 16px
                    - text-align: center
                    - color: white
                    - border-radius: 6px
                    - box-shadow: none
              - type: custom:button-card
                entity: input_boolean.em_allow_aux
                name: Aux erlauben
                show_state: true
                icon: mdi:radiator
                tap_action:
                  action: toggle
                styles:
                  card:
                    - padding: 12px
                    - font-size: 16px
                    - text-align: center
                    - color: white
                    - border-radius: 6px
                    - box-shadow: none
          - type: horizontal-stack
            cards:
              - type: custom:button-card
                entity: script.em_reset_to_defaults
                name: Reset Defaults
                show_state: false
                icon: mdi:restart-alert
                styles:
                  card:
                    - padding: 12px
                    - font-size: 16px
                    - text-align: center
                    - color: white
                    - border-radius: 6px
                    - box-shadow: none
                tap_action:
                  action: call-service
                  service: script.turn_on
                  service_data:
                    entity_id: script.em_reset_to_defaults
                hold_action:
                  action: more-info
                show_icon: true
                show_name: true
                confirmation:
                  text: Reset auf Standardwerte ausführen?
                  confirm: true
            grid_options:
              columns: 6
              rows: auto
      - type: grid
        cards:
          - type: heading
            heading_style: title
            heading: 'Aktueller Status:'
            icon: mdi:list-status
          - type: vertical-stack
            cards:
              - type: vertical-stack
                cards:
                  - type: horizontal-stack
                    cards:
                      - type: tile
                        entity: sensor.em_pv_power_corrected
                        name: PV (kW)
                        vertical: false
                        features_position: bottom
                      - type: tile
                        entity: sensor.em_home_load_corrected
                        name: Hausverbrauch (kW)
                        vertical: false
                        features_position: bottom
                  - type: horizontal-stack
                    cards:
                      - type: tile
                        entity: sensor.em_pw_current_charge
                        name: Batterie (kW)
                        vertical: false
                        features_position: bottom
                      - type: tile
                        entity: sensor.my_home_ladung
                        name: Powerwall Aufladung
                        vertical: false
                        features_position: bottom
                  - type: horizontal-stack
                    cards:
                      - type: tile
                        entity: sensor.em_target_flow_temp
                        name: Ziel Vorlauf (°C)
                        vertical: false
                        features_position: bottom
                      - type: tile
                        entity: sensor.em_current_flow_temp
                        name: Ist Vorlauf (°C)
                        vertical: false
                        features_position: bottom
                  - type: horizontal-stack
                    cards:
                      - type: tile
                        entity: sensor.em_dhw_boiler_temp
                        name: Boiler (°C)
                        vertical: false
                        features_position: bottom
                      - type: tile
                        entity: number.thermostat_hc1_selected_room_temperature
                        name: Soll-Temp
                        vertical: false
                        features_position: bottom
          - type: tile
            entity: sensor.boiler_air_inlet_temperature_tl2
            name: Außentemp.
            vertical: false
            features_position: bottom
          - type: tile
            entity: input_number.em_flow_temp_step_k
            name: Vorlauf Step (°C)
            vertical: false
            features_position: bottom
          - type: heading
            heading_style: title
            heading: 'Vorgaben:'
            icon: mdi:heat-pump
          - type: vertical-stack
            cards:
              - type: vertical-stack
                cards:
                  - type: horizontal-stack
                    cards:
                      - type: tile
                        entity: input_number.em_pv_threshold_start
                        name: PV Start (kW)
                        vertical: false
                        features_position: bottom
                      - type: tile
                        entity: input_number.em_pv_threshold_stop
                        name: PV Stop (kW)
                        vertical: false
                        features_position: bottom
                  - type: horizontal-stack
                    cards:
                      - type: tile
                        entity: input_number.pw_max_charge
                        name: PW Max (kW)
                        vertical: false
                        features_position: bottom
                      - type: tile
                        entity: input_number.em_flow_temp_step_k
                        name: Vorlauf Step (°C)
                        vertical: false
                        features_position: bottom
                  - type: horizontal-stack
                    cards:
                      - type: tile
                        entity: input_number.em_flow_temp_min
                        name: Vorlauf Min (°C)
                        vertical: false
                        features_position: bottom
                      - type: tile
                        entity: input_number.em_flow_temp_max
                        name: Vorlauf Max (°C)
                        vertical: false
                        features_position: bottom
          - type: tile
            entity: input_number.energy_manager_temp_start
            vertical: false
            features_position: bottom
          - type: tile
            entity: input_number.energy_manager_temp_stop
            vertical: false
            features_position: bottom
      - type: grid
        cards:
          - type: heading
            heading: Geglättete Werte
            heading_style: title
          - type: tile
            entity: sensor.em_pv_power_smoothed
            name: 'Smoothed PV Power '
            vertical: false
            features_position: bottom
          - type: tile
            entity: sensor.em_home_load_smoothed
            name: 'Smoothed Home Load '
            vertical: false
            features_position: bottom
          - type: tile
            entity: sensor.em_powerwall_battery_power_smoothed
            name: Smoothed Ladestrom Batterie
            vertical: false
            features_position: bottom
          - type: heading
            heading: >-
              Aktuelle Ladeleistung der Powerwall (negativer Wert bedeutet
              Laden, wird positiv ausgegeben)
            heading_style: title
          - type: tile
            entity: sensor.em_pw_current_charge
            vertical: false
            features_position: bottom
          - type: heading
            heading: >-
              Überschussleistung, die nach Batterieladung für die Wärmepumpe
              verfügbar bleibt
            heading_style: title
            grid_options:
              columns: full
              rows: 1
          - type: tile
            entity: sensor.em_available_for_heatpump
            vertical: false
            features_position: bottom
          - type: heading
            heading: >-
              Überschussleistung = PV-Leistung minus Hausverbrauch (beide
              geglättet)
            heading_style: title
            grid_options:
              columns: full
              rows: 1
          - type: tile
            entity: sensor.em_energy_surplus
            vertical: false
            features_position: bottom
    max_columns: 3
    header: {}
    subview: true


Vielleicht kannst Du hier noch posten welche Parameter bei Dir mit “unavailable” angezeigt werden, dann kommen wir auch noch weiter.

Alle Parameter die EM enthalten, also binary, input etc. sind unavailable und in dem Dashboard ist auch alles nicht verfügbar, da die die Parameter nicht da sind.

Ok, dann tasten wir uns mal langsam voran:

Liegt Dein Package unter:

  • /homeassistant/packages/energy_manager.yaml

Und hast Du in der “/homeassistant/configuration.yaml” den folgende n Include:

  • packages: !include_dir_named packages

Wenn Du das schon hast, ist die Frage, ob du alle Helfer unter “Einstellungen –> Geräte & Dienste –> Helfer” siehst und wenn ja, ob sie aktiv sind.

Grundsätzlich wird alles was im Package definiert ist, beim starten von Home Assistant erzeugt und sollte dann zur Verfügung stehen. Du musst eigentlich keine Helfer händisch anlegen.

Das Package liegt in dem Verzeichniss und in der Configuration.yaml ist der include auch definiert. Die Helfer sind auch alle definiert, aber die Parameter werden als unavailable ausgegeben. Z.B.: input_boolean_em

Hallo Uwe,

soweit ich weiß müssen alle Entitäten die in dem Package verwendet auch vorhanden sein, da HA sonst alle im Package als unavailable anzeigt.

Versuch doch mal ein Package "(test_package.yaml) zu laden, was ganz einfach ist, so wie das folgende:

input_number:
  em_dhw_max_temp:
    name: "EM DHW Max Temperatur (°C)"
    initial: 55
    min: 45
    max: 70
    step: 0.5

input_boolean:
  test_switch:
    name: "Testschalter"
    initial: off
  1. Speichere das obige Package unter “config/packages/test_package.yaml” bzw. “homeassistant/packages/test_package.yaml”.
  2. Sicherstellen, dass Du folgenden Block in seiner configuration.yaml hast:
homeassistant:
  packages: !include_dir_named packages
  1. Konfiguration prüfen → Einstellungen → Entwicklerwerkzeuge → YAML → „Konfiguration prüfen“
  2. Home Assistant neu starten

Nach dem Neustart sollten im Frontend erscheinen:

  1. input_number.em_dhw_max_temp
  2. input_boolean.test_switch

Bin gespannt was Du berichtest.

Ich habe das alte Package nochmal ganz rausgenommen, die package Definition in der configuration.yaml neu gemacht und das test package eingespielt. Bei der Überprüfung gab es dann aber einen Fehler: Was fehlt?

Home Assistant versucht folgende Blöcke als Integrationen zu laden:

  • em_dhw_max_temp
  • test_switch

Eigentlich passiert das nur, wenn HA das Package nicht als Package erkennt.

Versuchen wir dem mal auf den Grund zu gehen.

  1. Zeig mir bitte mal Deine configuration.yaml
  2. Zeige mir einen Screenshot vom File Editor, der auch oben den Pfad anzeigt

  1. und noch 1:1 den Code den Du jetzt in deiner yaml-Datei hast (am Besten hier als Vorformatierten Yaml Text einfügen)

configuration.yaml

Update:

Habe jetzt gesehen das die Definition in der config nicht übereinstimmt. Das merge_ ist zuviel.
Nach der Änderung sehe ich jetzt auch die beiden Parameter:

Jetzt versuch ich es nochmal mit dem Energy Manager Package

Das war scheinbar der Fehler. Jetzt läuft auch das Energy Manager Package und ich sehe alle Parameter.
Vielen Dank für deine Hilfe. Ich werde jetzt schaue was ich speziell für meine Installation noch anpassen muss.

1 „Gefällt mir“

Ich glaube wir haben den Fehler.

Bei Dir steht in der configuration.yaml:

packages: !include_dir_merge_named packages

Aber es muss heißen:

packages: !include_dir_named packages

Bitte ändere das einmal und dann:

  1. configuration.yaml speichern
  2. In HA: Einstellungen → Entwicklerwerkzeuge → YAML → Konfiguration prüfen
  3. Neustarten

Danach sollten die zwei Test Entitäten erscheinen.

Genau, kleiner Fehler große Wirkung. :smirking_face:
Nochmal VIELEN DANK !

1 „Gefällt mir“

Hallo Reluca, mein Kompliment für diese Lösung, da steckt sehr viel Arbeit darin. Würde ich gerne mal ausprobieren, geht aber wegen der Unterschiede leider nicht so einfach. Mein Szenario: PV Huawai 15 kWp, Akku 20 kWh, EMMA + Backup, Bosch WP CS6800iAW 5kW, ems-esp, Wallbox go-e 11 kW. Home Assistant, MQTT, evcc und alles sonst Wichtige laufen unter Proxmox.
Ich habe in ein Energiemanagement bislang ehrlich nichts investiert. Meine Prios sind einfach: 1. Hausverbrauch inkl. WP, 2. Akku, 3. Auto, 4. Einspeisen. Das lässt sich mit evcc leicht abbilden. D. h. Überschuß wird in den Akku geschoben, ist der voll kommt das Auto dran, ist das auch voll - einspeisen.
Und die WP steuere ich sehr primitiv nach Zeit und ggf. Änderung der Vorlauftemperatur sowie Warmwasser nach Zeit bzw. Wassertemperatur.
Frage: wäre es aus deiner Sicht mit relativ vertretbarem Aufwand möglich, deine Steuerung inkl. tollem Dashboard auf mein Szenario umzubiegen?

Freue mich auf deine Antwort, Gruß H.

Hallo @HFB2024 , ganz ehrlich gesagt glaube ich schon, dass Du die Steuerung an Deine Gegebenheiten anpasst. Der erste Schritt wäre alle notwendigen Entitäten zu ersetzen, dass ist reine Fleißaufgabe. Um die Ladung vom Auto mit ins Spiel zu bringen müsstest Du noch den binary_sensor “wp_laufzeit_startbedingung” erweitern.

Wenn Du Dir das gesamte Package ansiehst, wirst Du sehen, dass es an nur wenigen Stellen darum geht die notwendigen Informationen (Entitäten) zu sammeln. Die Hauptarbeit war damals die ganzen Voraussetzungen zu definieren und dafür zu sorgen, dass die eigentliche Automatisierung nicht gleich bei jedem Sonnenstrahl, der nur für 30 Sekunden da ist, zu starten, weil sie sonst sofort wieder abbricht.

Nochmal, aus meiner Sicht gut machbar.

Bin gespannt ob Du es angehst :grinning_face:

Viele Grüße

Vielen Dank, ich brauche jetzt erst mal Zeit, um mich mit deinem gesamten Paket vertraut zu machen. Beste Grüße

Update: Fachliche Änderungen am Energy Manager (Konzept & Logik)

Nach den ersten Tests habe ich den ursprünglichen Energy‑Manager grundlegend überarbeitet. Dabei habe ich mich bewusst von der simplen Thermostat‑Umschaltung (21 °C / 25 °C) verabschiedet und den Fokus auf eine kontinuierliche, leistungsbasierte Regelung der Wärmepumpe gelegt.

Im Folgenden die wichtigsten fachlichen Änderungen im Überblick.


1. Wegfall der „Thermostat‑Hacks“ (21 °C / 25 °C)

Früher

  • Starre Logik:

    • PV‑Überschuss + Powerwall ≥ 95 % → Thermostat auf 25 °C

    • Wenig Überschuss → zurück auf 21 °C

  • WP wurde indirekt „an/aus“ geschaltet

  • Grobe Regelung, wenig feinfühlig

  • Führte potenziell zu:

    • häufigen Setpoint‑Änderungen

    • ineffizientem Takten

    • unnötigem Temperaturhub im Heizkreis

Jetzt

:white_check_mark: Keine direkte Thermostat‑Manipulation mehr
:white_check_mark: Heizkurve & Regelung der WP bleiben unberührt

:right_arrow: Die Steuerung erfolgt über die Soll‑Vorlauftemperatur, nicht über Raum‑Sollwerte.


2. Kontinuierliche Leistungsanpassung statt binärer Steuerung

Neuer Ansatz

  • PV‑Überschuss wird stetig ausgewertet

  • Daraus wird eine Ziel‑Vorlauftemperatur berechnet:

    PV‑Überschuss → Gradient → Ziel‑Vorlauf (min ↔ max)
    
    
  • Keine festen Zustände mehr („läuft“ / „läuft nicht“), sondern:

    • mehr Überschuss → höhere Vorlauftemperatur

    • weniger Überschuss → Zielwert bleibt niedriger

:white_check_mark: Modulierende statt schaltende Regelung
:white_check_mark: Besser für Effizienz, Lebensdauer & Komfort


3. Sanftes Ramping mit Schrittbegrenzung

  • Vorlauftemperatur wird:

    • nur erhöht

    • in festen Schritten (z. B. +0,5 K)

    • mit Maximalgrenze

  • Kein aktives Absenken durch den Energiemanager

:backhand_index_pointing_right: Absenkung übernimmt weiterhin die interne Regelung der WP.
Der EM greift also nur unterstützend ein, niemals aggressiv.


4. Klare Start-/Stop‑Logik über Hysterese statt Momentwerte

Früher

  • Entscheidung direkt aus dem aktuellen Überschuss

  • Gefahr von Flattern bei Wolken / Verbrauchsspitzen

Jetzt

  • Dedizierte Hysterese:

    • Startschwelle (z. B. 0,6 kW)

    • Stoppschwelle (z. B. 0,4 kW)

  • Zusätzlich:

    • Mindestlaufzeiten

    • Temperatur‑Hysterese

    • Debouncing der Eingangssensoren

:white_check_mark: Deutlich stabileres Laufverhalten
:white_check_mark: Weniger unnötige Regelimpulse


5. Powerwall & WP sauber entkoppelt

  • Powerwall‑Ladung wird nicht mehr implizit vorausgesetzt (z. B. SOC ≥ 95 %)

  • Der verfügbare Überschuss für die WP wird berechnet als:

PV‑Leistung
– Hausverbrauch
– aktuell genutzte Batterieleistung
= verfügbar für Wärmepumpe

:white_check_mark: WP nutzt nur echten Restüberschuss
:white_check_mark: Keine festen SOC‑Abhängigkeiten mehr
:white_check_mark: System funktioniert auch mit anderen Batteriekonfigurationen


6. Eigenständige DHW‑Logik (Warmwasser)

Neu hinzugekommen ist eine separate PV‑optimierte Warmwasser‑Strategie:

  • DHW lädt nur:

    • bei ausreichend PV‑Überschuss

    • unterhalb einer konfigurierbaren Max‑Temperatur

    • mit Mindestlaufzeit

  • Stop:

    • bei Unterschreiten der Stoppschwelle

    • oder erreichter Zieltemperatur

:white_check_mark: Warmwasser wird gezielt als PV‑Verbraucher genutzt
:white_check_mark: Kein Konflikt mehr zwischen Heizung & DHW


7. „Safe Mode“ & Start‑Absicherung

Neu:

  • Safe Mode

    • erzwingt einen sicheren Zustand

    • verhindert Regelung bei Inkonsistenzen

  • Beim HA‑Start:

    • Sensorwerte werden initial auf „0“ gezwungen

    • erst nach Initialisierung wird geregelt

:white_check_mark: Robuster bei Restarts
:white_check_mark: Kein Fehlverhalten beim Systemstart


8. Aktueller Stand des Packages:

Hier findet Ihr den letzten Stand des Packages, wie es bei mir seit 2-3 Monaten stabil läuft:

# config/packages/energy_manager.yaml

# --- Helpers / Controls ---
input_boolean:
  energy_manager_enabled:
    name: "Energy Manager aktiv"
    initial: on
  energy_manager_temp_ok:
    name: "Energy Manager: Temp OK"
    initial: on
  energy_manager_force_zero:
    name: "Energy Manager: Force smoothed zero"
    initial: off
    icon: mdi:power-off
  em_allow_aux:
    name: "EM: Aux-Heater erlauben"
    initial: off
  em_dhw_charging:
    name: "EM DHW Ladung aktiv"
    initial: off
  em_safe_mode:
    name: "EM Safe Mode"
    initial: off
    icon: mdi:shield-alert

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

  em_flow_temp_min:
    name: "EM Vorlauf Minimum (°C)"
    initial: 38
    min: 20
    max: 45
    step: 0.5

  em_flow_temp_max:
    name: "EM Vorlauf Maximum (°C)"
    initial: 50
    min: 40
    max: 60
    step: 0.5

  em_flow_temp_step_k:
    name: "EM Vorlauf Änderung pro Intervall (°C)"
    initial: 0.5
    min: 0.1
    max: 2
    step: 0.1

  em_min_runtime:
    name: "EM Kompressor Mindestlaufzeit (Minuten)"
    initial: 15
    min: 5
    max: 60
    step: 1

  em_pv_threshold_start:
    name: "EM PV Überschuss Startschwelle (kW)"
    initial: 3
    min: 0
    max: 5
    step: 0.1

  em_pv_threshold_stop:
    name: "EM PV Überschuss Stoppschwelle (kW)"
    initial: 1
    min: 0
    max: 5
    step: 0.1

  em_dhw_max_temp:
    name: "EM DHW Max Temperatur (°C)"
    initial: 55
    min: 45
    max: 70
    step: 0.5

  em_dhw_min_temp:
    name: "EM DHW Min Temperatur (°C)"
    initial: 45
    min: 35
    max: 55
    step: 0.5

  em_dhw_charge_min_duration:
    name: "EM DHW Mindestladezeit (Minuten)"
    initial: 20
    min: 5
    max: 60
    step: 1

  # Hysterese: Schwellen für em_available_for_heatpump (Start/Stop)
  em_avail_start:
    name: "EM Avail Start (kW)"
    initial: 0.6
    min: 0
    max: 10
    step: 0.1
    unit_of_measurement: kW

  em_avail_stop:
    name: "EM Avail Stop (kW)"
    initial: 0.4
    min: 0
    max: 10
    step: 0.1
    unit_of_measurement: kW

# --- Scripts ---
script:
  em_reset_to_defaults:
    alias: "EM: Reset auf Standardwerte"
    sequence:
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.em_safe_mode
      - delay: "00:00:01"

      # Input Booleans
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.energy_manager_enabled
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.energy_manager_temp_ok
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.energy_manager_force_zero
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.em_allow_aux
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.em_dhw_charging

      # Input Numbers zurücksetzen
      - service: input_number.set_value
        data:
          entity_id: input_number.pw_max_charge
          value: 4.6
      - service: input_number.set_value
        data:
          entity_id: input_number.energy_manager_temp_start
          value: 14
      - service: input_number.set_value
        data:
          entity_id: input_number.energy_manager_temp_stop
          value: 17
      - service: input_number.set_value
        data:
          entity_id: input_number.em_flow_temp_min
          value: 38
      - service: input_number.set_value
        data:
          entity_id: input_number.em_flow_temp_max
          value: 50
      - service: input_number.set_value
        data:
          entity_id: input_number.em_flow_temp_step_k
          value: 0.5
      - service: input_number.set_value
        data:
          entity_id: input_number.em_min_runtime
          value: 15
      - service: input_number.set_value
        data:
          entity_id: input_number.em_pv_threshold_start
          value: 3
      - service: input_number.set_value
        data:
          entity_id: input_number.em_pv_threshold_stop
          value: 1
      - service: input_number.set_value
        data:
          entity_id: input_number.em_dhw_max_temp
          value: 55
      - service: input_number.set_value
        data:
          entity_id: input_number.em_dhw_min_temp
          value: 45
      - service: input_number.set_value
        data:
          entity_id: input_number.em_dhw_charge_min_duration
          value: 20
      - service: input_number.set_value
        data:
          entity_id: input_number.em_avail_start
          value: 0.6
      - service: input_number.set_value
        data:
          entity_id: input_number.em_avail_stop
          value: 0.4

      # Setze die Soll-Vorlauftemperatur auf ein sicheres Minimum (em_flow_temp_min)
      - service: number.set_value
        data:
          entity_id: number.boiler_selected_flow_temperature
          value: "{{ states('input_number.em_flow_temp_min') | float(38) }}"

      # Schalte WP/DHW-Schalter in sicheren Zustand
      - service: switch.turn_off
        target:
          entity_id:
            - switch.boiler_dhw_one_time_charging
            - switch.boiler_aux_heater_only

      - delay: "00:00:01"
      - service: notify.persistent_notification
        data:
          title: "EM: Reset auf Standardwerte"
          message: "Alle EM-Helper wurden auf Default gesetzt und Safe Mode aktiviert. Prüfe Logs und beobachte Sensoren."
    mode: single

# --- Filter Sensoren (Glättung) ---
sensor:
  - platform: filter
    name: "em_pv_power_smoothed"
    entity_id: sensor.my_home_solar_energie
    filters:
      - filter: lowpass
        time_constant: 2
        precision: 2

  - platform: filter
    name: "em_home_load_smoothed"
    entity_id: sensor.my_home_last_leistung
    filters:
      - filter: time_simple_moving_average
        window_size: 3
        precision: 2

  - platform: filter
    name: "em_powerwall_battery_power_smoothed"
    entity_id: sensor.my_home_batterie_leistung
    filters:
      - filter: lowpass
        time_constant: 6
        precision: 2

# --- Template Sensors & Binary Sensors ---
template:
  - sensor:
      - name: "em_pv_power_corrected"
        unit_of_measurement: "kW"
        state: >-
          {% set force = is_state('input_boolean.energy_manager_force_zero', 'on') %}
          {% set raw = states('sensor.my_home_solar_energie') | float(0) %}
          {% set sm = states('sensor.em_pv_power_smoothed') | float(0) %}
          {% if force or raw < 0.02 %}
            0
          {% else %}
            {{ sm | round(2) }}
          {% endif %}

      - name: "em_home_load_corrected"
        unit_of_measurement: "kW"
        state: >-
          {% set force = is_state('input_boolean.energy_manager_force_zero', 'on') %}
          {% set raw = states('sensor.my_home_last_leistung') | float(0) %}
          {% set sm = states('sensor.em_home_load_smoothed') | float(0) %}
          {% if force or raw < 0.02 %}
            0
          {% else %}
            {{ sm | round(2) }}
          {% endif %}

      - name: "em_powerwall_charge_corrected"
        unit_of_measurement: "kW"
        state: >-
          {% set force = is_state('input_boolean.energy_manager_force_zero', 'on') %}
          {% set raw = states('sensor.my_home_batterie_leistung') | float(0) %}
          {% set sm = states('sensor.em_powerwall_battery_power_smoothed') | float(0) %}
          {% if force or (raw | abs) < 0.02 %}
            0
          {% else %}
            {{ sm | round(2) }}
          {% endif %}

      - name: "em_energy_surplus"
        unit_of_measurement: "kW"
        state: >-
          {{ (states('sensor.em_pv_power_corrected') | float(0) - states('sensor.em_home_load_corrected') | float(0)) | round(2) }}

      - name: "em_pw_max_charge"
        unit_of_measurement: "kW"
        state: >-
          {{ states('input_number.pw_max_charge') | float(4.6) }}

      - name: "em_pw_current_charge"
        unit_of_measurement: "kW"
        state: >-
          {{ (states('sensor.em_powerwall_charge_corrected') | float(0)) | abs | round(2) }}

      - name: "em_available_for_heatpump"
        unit_of_measurement: "kW"
        state: >-
          {% set surplus = states('sensor.em_energy_surplus') | float(0) %}
          {% set pw_curr = states('sensor.em_pw_current_charge') | float(0) %}
          {% set threshold = 0.02 %}
          {% if surplus > 0 %}
            {% set used = pw_curr if pw_curr > threshold else 0 %}
            {{ [surplus - used, 0] | max | round(2) }}
          {% else %}
            0
          {% endif %}
        attributes:
          note: "Surplus minus current battery charge (threshold 0.02 kW)"

      - name: "em_target_flow_temp"
        unit_of_measurement: "°C"
        state: >-
          {% set min_t = states('input_number.em_flow_temp_min') | float(0) %}
          {% set max_t = states('input_number.em_flow_temp_max') | float(0) %}
          {% set avail = states('sensor.em_available_for_heatpump') | float(0) %}
          {% set max_power = 6 %}
          {% set ratio = (avail / max_power) | float(0) %}
          {% set ratio = [ratio, 0] | max %}
          {% set ratio = [ratio, 1] | min %}
          {% set target = min_t + (max_t - min_t) * ratio %}
          {{ target | round(1) }}

      - name: "em_current_flow_temp"
        unit_of_measurement: "°C"
        state: "{{ states('sensor.boiler_current_flow_temperature') | float(0) }}"

      - name: "em_dhw_boiler_temp"
        unit_of_measurement: "°C"
        state: "{{ states('sensor.boiler_heat_carrier_forward_tc1') | float(0) }}"

      - name: "em_dhw_charge_state"
        state: >-
          {{ 'on' if is_state('input_boolean.em_dhw_charging', 'on') else 'off' }}

  - binary_sensor:
    - name: "wp_laufzeit_startbedingung"
      unique_id: wp_laufzeit_startbedingung
      device_class: running
      state: >-
        {% set enabled    = is_state('input_boolean.energy_manager_enabled','on') %}
        {% set temp_ok    = is_state('input_boolean.energy_manager_temp_ok','on') %}
        {% set safe_off   = is_state('input_boolean.em_safe_mode','off') %}
        {% set avail      = states('sensor.em_available_for_heatpump') | float(0) %}
        {% set start_th   = states('input_number.em_avail_start') | float(0) %}
        {% set target_t   = states('sensor.em_target_flow_temp') | float(0) %}
        {% set current_t  = states('sensor.em_current_flow_temp') | float(0) %}
        {% set hysteresis = 0.2 %}
        {{ enabled and temp_ok and safe_off and (avail > start_th) and (target_t > current_t + hysteresis) }}
        {# Optional zusätzlich: or is_state('input_boolean.em_dhw_charging','on') #}
      attributes:
        em_enabled: "{{ states('input_boolean.energy_manager_enabled') }}"
        em_temp_ok: "{{ states('input_boolean.energy_manager_temp_ok') }}"
        em_safe_mode: "{{ states('input_boolean.em_safe_mode') }}"
        avail_for_hp_kW: "{{ states('sensor.em_available_for_heatpump') }}"
        avail_start_kW: "{{ states('input_number.em_avail_start') }}"
        target_flow_temp_C: "{{ states('sensor.em_target_flow_temp') }}"
        current_flow_temp_C: "{{ states('sensor.em_current_flow_temp') }}"
        would_set_to_C: >-
          {% set step  = states('input_number.em_flow_temp_step_k') | float(0.5) %}
          {% set max_t = states('input_number.em_flow_temp_max')   | float(50) %}
          {% set cand  = (states('sensor.em_current_flow_temp') | float(0)) + step %}
          {% set tgt   = states('sensor.em_target_flow_temp')  | float(0) %}
          {% set capped = [cand, tgt, max_t] | min %}
          {{ capped | round(1) }}
        reason: >-
          {# Variablen in Attribut-Template erneut setzen, da separat gerendert #}
          {% set enabled    = is_state('input_boolean.energy_manager_enabled','on') %}
          {% set temp_ok    = is_state('input_boolean.energy_manager_temp_ok','on') %}
          {% set safe_off   = is_state('input_boolean.em_safe_mode','off') %}
          {% set avail      = states('sensor.em_available_for_heatpump') | float(0) %}
          {% set start_th   = states('input_number.em_avail_start') | float(0) %}
          {% set target_t   = states('sensor.em_target_flow_temp') | float(0) %}
          {% set current_t  = states('sensor.em_current_flow_temp') | float(0) %}
          {% set hysteresis = 0.2 %}
          {% set reasons = [] %}
          {% if not enabled %}{% set reasons = reasons + ['disabled'] %}{% endif %}
          {% if not temp_ok %}{% set reasons = reasons + ['temp_not_ok'] %}{% endif %}
          {% if not safe_off %}{% set reasons = reasons + ['safe_mode_on'] %}{% endif %}
          {% if not (avail > start_th) %}{% set reasons = reasons + ['avail_below_start'] %}{% endif %}
          {% if not (target_t > current_t + hysteresis) %}{% set reasons = reasons + ['target_not_above_current'] %}{% endif %}
          {{ 'all_conditions_met' if reasons|length == 0 else reasons|join(',') }}
      availability: >-
        {{
          (states('sensor.em_available_for_heatpump') not in ['unknown','unavailable','']) and
          (states('sensor.em_target_flow_temp') not in ['unknown','unavailable','']) and
          (states('sensor.em_current_flow_temp') not in ['unknown','unavailable',''])
        }}

# --- Automationen (alle in einem Block) ---
automation:
  - alias: "EM Temp OK Status aktualisieren"
    description: "Setzt input_boolean.energy_manager_temp_ok basierend auf Temperatur mit Debounce 60s"
    mode: restart
    trigger:
      - platform: state
        entity_id: sensor.boiler_air_inlet_temperature_tl2
    condition: []
    action:
      - choose:
          - conditions:
              - condition: template
                value_template: >-
                  {% set temp = states('sensor.boiler_air_inlet_temperature_tl2') %}
                  {% set start = states('input_number.energy_manager_temp_start') %}
                  {{ temp not in ['unavailable', 'unknown', ''] and
                     start not in ['unavailable', 'unknown', ''] and
                     (temp | float(0)) < (start | float(0)) }}
            sequence:
              - delay: "00:01:00"
              - condition: template
                value_template: >-
                  {% set temp = states('sensor.boiler_air_inlet_temperature_tl2') %}
                  {% set start = states('input_number.energy_manager_temp_start') %}
                  {{ temp not in ['unavailable', 'unknown', ''] and
                     start not in ['unavailable', 'unknown', ''] and
                     (temp | float(0)) < (start | float(0)) }}
              - service: input_boolean.turn_on
                target:
                  entity_id: input_boolean.energy_manager_temp_ok
          - conditions:
              - condition: template
                value_template: >-
                  {% set temp = states('sensor.boiler_air_inlet_temperature_tl2') %}
                  {% set stop = states('input_number.energy_manager_temp_stop') %}
                  {{ temp not in ['unavailable', 'unknown', ''] and
                     stop not in ['unavailable', 'unknown', ''] and
                     (temp | float(0)) > (stop | float(0)) }}
            sequence:
              - delay: "00:01:00"
              - condition: template
                value_template: >-
                  {% set temp = states('sensor.boiler_air_inlet_temperature_tl2') %}
                  {% set stop = states('input_number.energy_manager_temp_stop') %}
                  {{ temp not in ['unavailable', 'unknown', ''] and
                     stop not in ['unavailable', 'unknown', ''] and
                     (temp | float(0)) > (stop | float(0)) }}
              - service: input_boolean.turn_off
                target:
                  entity_id: input_boolean.energy_manager_temp_ok

  # Automation: EM: Vorlauftemperatur regeln (nur Erhöhungen, kein Absenken)
  - alias: "EM: Vorlauftemperatur regeln"
    description: "Erhöht Selected flow temperature stufenlos mit Ramping (nur Anheben, kein aktives Absenken)"
    trigger:
      - platform: state
        entity_id:
          - sensor.em_available_for_heatpump
          - sensor.em_current_flow_temp
          - input_boolean.energy_manager_enabled
          - input_boolean.energy_manager_temp_ok
    condition:
      - condition: state
        entity_id: input_boolean.energy_manager_enabled
        state: 'on'
      - condition: state
        entity_id: input_boolean.energy_manager_temp_ok
        state: 'on'
      - condition: state
        entity_id: input_boolean.em_safe_mode
        state: 'off'
      # Hysterese-Bedingung: nur wenn verfügbar > Start-Schwelle
      - condition: template
        value_template: >-
          {{ (states('sensor.em_available_for_heatpump') | float(0)) > (states('input_number.em_avail_start') | float(0)) }}
    action:
      - variables:
          target_temp_raw: "{{ states('sensor.em_target_flow_temp') | float(0) }}"
          current_temp: "{{ states('sensor.em_current_flow_temp') | float(0) }}"
          step: "{{ states('input_number.em_flow_temp_step_k') | float(0) }}"
          max_t: "{{ states('input_number.em_flow_temp_max') | float(0) }}"
          last_change: "{{ state_attr('number.boiler_selected_flow_temperature', 'last_changed') }}"
          time_since_change_min: >-
            {% if last_change is none %}
              9999
            {% else %}
              ((as_timestamp(now()) - as_timestamp(last_change)) / 60)
            {% endif %}
      - choose:
          - conditions:
              # Nur erhöhen, wenn Ziel > Ist
              - condition: template
                value_template: >-
                  {{ target_temp_raw > current_temp }}
            sequence:
              - variables:
                  # Kandidat ist Ist + Schritt, aber nicht über Ziel
                  candidate_temp: >-
                    {% set cand = current_temp + step %}
                    {% if cand > target_temp_raw %}
                      {{ target_temp_raw }}
                    {% else %}
                      {{ cand }}
                    {% endif %}
                  # Kappe auf maximalen erlaubten Wert
                  new_temp_capped: >-
                    {{ [ (candidate_temp | float), (max_t | float) ] | min | round(1) }}
              - service: number.set_value
                data:
                  entity_id: number.boiler_selected_flow_temperature
                  value: "{{ new_temp_capped }}"
              - service: system_log.write
                data:
                  message: "EM: Vorlaufregelung erhöht von {{ current_temp }}°C auf {{ new_temp_capped }}°C (Ziel {{ target_temp_raw }}°C, Max {{ max_t }}°C)"
                  level: info
        default: []

  - alias: "EM: DHW Ladung steuern"
    description: "Steuert DHW Charging basierend auf PV Überschuss und Boiler Temperatur, mit Hysterese"
    trigger:
      - platform: state
        entity_id:
          - sensor.em_available_for_heatpump
          - sensor.em_dhw_boiler_temp
          - input_boolean.energy_manager_enabled
          - input_boolean.energy_manager_temp_ok
          - input_boolean.em_dhw_charging
    condition:
      - condition: state
        entity_id: input_boolean.energy_manager_enabled
        state: 'on'
      - condition: state
        entity_id: input_boolean.energy_manager_temp_ok
        state: 'on'
      - condition: state
        entity_id: input_boolean.em_safe_mode
        state: 'off'
    action:
      - variables:
          pv_avail: "{{ states('sensor.em_available_for_heatpump') | float(0) }}"
          boiler_temp: "{{ states('sensor.boiler_heat_carrier_forward_tc1') | float(0) }}"
          dhw_charging: "{{ is_state('input_boolean.em_dhw_charging', 'on') }}"
          max_temp: "{{ states('input_number.em_dhw_max_temp') | float(0) }}"
          min_temp: "{{ states('input_number.em_dhw_min_temp') | float(0) }}"
          min_duration: "{{ states('input_number.em_dhw_charge_min_duration') | int }}"
          last_on: "{{ state_attr('input_boolean.em_dhw_charging', 'last_changed') }}"
          time_on_min: >-
            {% if last_on is none %}
              9999
            {% else %}
              ((as_timestamp(now()) - as_timestamp(last_on)) / 60)
            {% endif %}
          start_thresh: "{{ states('input_number.em_avail_start') | float(0) }}"
          stop_thresh: "{{ states('input_number.em_avail_stop') | float(0) }}"
      - choose:
          # Start DHW Charging wenn PV Überschuss über Startschwelle und Boiler Temp < max_temp
          - conditions:
              - condition: template
                value_template: >-
                  {{ pv_avail > start_thresh }}
              - condition: template
                value_template: >-
                  {{ boiler_temp < max_temp }}
              - condition: template
                value_template: >-
                  {{ not dhw_charging or (dhw_charging and time_on_min > min_duration) }}
            sequence:
              - service: input_boolean.turn_on
                target:
                  entity_id: input_boolean.em_dhw_charging
              - service: switch.turn_on
                target:
                  entity_id: switch.boiler_dhw_one_time_charging
              - service: system_log.write
                data:
                  message: "EM: DHW Charging gestartet (Boiler {{ boiler_temp }}°C, PV Überschuss {{ pv_avail }} kW)"
                  level: info

          # Stop DHW Charging wenn PV unter Stop-Schwelle oder Boiler Temp >= max_temp und Mindestladezeit erfüllt
          - conditions:
              - condition: template
                value_template: >-
                  {{ (boiler_temp >= max_temp) or (pv_avail < stop_thresh) }}
              - condition: template
                value_template: >-
                  {{ dhw_charging and time_on_min > min_duration }}
            sequence:
              - service: input_boolean.turn_off
                target:
                  entity_id: input_boolean.em_dhw_charging
              - service: switch.turn_off
                target:
                  entity_id: switch.boiler_dhw_one_time_charging
              - service: system_log.write
                data:
                  message: "EM: DHW Charging gestoppt (Boiler {{ boiler_temp }}°C, PV Überschuss {{ pv_avail }} kW)"
                  level: info

  - alias: "EM: Aux-Heater Steuerung"
    description: "Blockiert Aux-Heater wenn nicht erlaubt oder Boiler Temp ausreichend, mit Hysterese"
    trigger:
      - platform: state
        entity_id:
          - input_boolean.em_allow_aux
          - sensor.boiler_heat_carrier_forward_tc1
          - input_boolean.em_dhw_charging
          - sensor.em_available_for_heatpump
    condition:
      - condition: state
        entity_id: input_boolean.em_safe_mode
        state: 'off'
    action:
      - variables:
          allow_aux: "{{ is_state('input_boolean.em_allow_aux', 'on') }}"
          boiler_temp: "{{ states('sensor.boiler_heat_carrier_forward_tc1') | float(0) }}"
          min_temp: "{{ states('input_number.em_dhw_min_temp') | float(0) }}"
          dhw_charging: "{{ is_state('input_boolean.em_dhw_charging', 'on') }}"
          pv_avail: "{{ states('sensor.em_available_for_heatpump') | float(0) }}"
          start_thresh: "{{ states('input_number.em_avail_start') | float(0) }}"
          stop_thresh: "{{ states('input_number.em_avail_stop') | float(0) }}"
      - choose:
          - conditions:
              - condition: template
                value_template: >-
                  {{ not allow_aux and boiler_temp > min_temp and dhw_charging and pv_avail > stop_thresh }}
            sequence:
              - service: switch.turn_off
                target:
                  entity_id: switch.boiler_aux_heater_only
              - service: system_log.write
                data:
                  message: "EM: Aux-Heater deaktiviert wegen Energiemanager"
                  level: info

          - conditions:
              - condition: template
                value_template: "{{ allow_aux }}"
            sequence:
              - service: switch.turn_on
                target:
                  entity_id: switch.boiler_aux_heater_only
              - service: system_log.write
                data:
                  message: "EM: Aux-Heater erlaubt durch Energiemanager"
                  level: info

  - alias: "EM: Force smoothed zero on startup"
    description: "Setzt beim HA-Start kurzzeitig das Force-Zero-Flag, bis Rohsensoren initialisiert sind"
    mode: single
    trigger:
      - platform: homeassistant
        event: start
    action:
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.energy_manager_force_zero
      - wait_for_trigger:
          - platform: template
            value_template: >-
              {% set s1 = states('sensor.my_home_solar_energie') %}
              {% set s2 = states('sensor.my_home_last_leistung') %}
              {% set s3 = states('sensor.my_home_batterie_leistung') %}
              {{ [s1, s2, s3] | select('match', '^(?!unknown$|^unavailable$|^$).+') | list | count > 0 }}
        timeout: "00:00:20"
      - delay: "00:00:02"
      - service: homeassistant.update_entity
        target:
          entity_id:
            - sensor.em_pv_power_smoothed
            - sensor.em_home_load_smoothed
            - sensor.em_powerwall_battery_power_smoothed
            - sensor.em_pv_power_corrected
            - sensor.em_home_load_corrected
            - sensor.em_powerwall_charge_corrected
            - sensor.em_energy_surplus
            - sensor.em_available_for_heatpump
            - sensor.em_pw_current_charge
            - sensor.em_pw_max_charge
            - sensor.em_target_flow_temp
            - sensor.em_current_flow_temp
            - sensor.boiler_heat_carrier_forward_tc1
      - delay: "00:00:01"
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.energy_manager_force_zero
1 „Gefällt mir“

Hallo @Reluca , genau das ist der Punkt, der mir Kopfzerbrechen bereitet.

Mein Fronius Gen 24 10 - sendet per Bus-Signal an die WP, dass PV-Überschuss von 3000W vorhanden ist. Die WP geht dann in den “erhöhten Warmwasserbedarf” und macht 65°.

Das Verhalten möchte ich beibehalten, allerdings mit der Maßgabe, dass der Heizstab die “Arbeit” übernimmt. Wenn ich sehe, wieviel kWh ich einspeise und nicht selbst nutze …
Tagsüber ist jede Menge Strom zum Erhitzen vorhanden.

Vielleicht hast Du da eine Idee dazu?

Ich bin zwar kein Experte, habe aber ein hohes technisches Verständnis. Vielleicht liege ich mit meiner folgenden Antwort auf Deine Frage auch falsch oder habe den Kern der Frage noch nicht verstanden.

Ein Heizstab wird nicht geregelt, sondern geschaltet.
Ist er eingeschaltet, läuft er immer mit seiner festen Leistung (z. B. 3 kW oder stufenweise 2/4/6 kW), unabhängig davon, wie viel PV‑Überschuss gerade verfügbar ist.
Er „nimmt sich“ also nicht das, was da ist, sondern das, was er kann – bis die WP ihn wieder abschaltet oder die Zieltemperatur erreicht ist.

Deshalb funktioniert:

  • langsames Temperatur‑Ramping gut für den Kompressor

  • aber nicht proportional für den Heizstab, weil dessen Leistung nicht moduliert wird

Der PV‑Bezug entsteht nur indirekt über die WP‑Logik (an/aus, Stufen), nicht über eine echte Leistungsanpassung des Heizstabs.

Genau deshalb ist es meist sinnvoller, den Heizstab bei PV‑Überschuss nur freizugeben, statt zu versuchen, ihn „PV‑geführt“ zu regeln – das kann er technisch einfach nicht.

In meinem Package wird der Heizstab nicht leistungsgeregelt, sondern ausschließlich situationsabhängig freigegeben oder gesperrt.

Der Energiemanager:

  • erkennt echten PV‑Restüberschuss

  • erlaubt den Aux‑Heater nur dann (em_allow_auxswitch.boiler_aux_heater_only)

  • entzieht die Freigabe sofort wieder bei zu wenig PV

Wie viel Leistung der Heizstab zieht und wann er tatsächlich läuft, entscheidet weiterhin ausschließlich die interne Bosch‑Logik.
So wird PV‑Überschuss genutzt, ohne die WP‑Regelung zu übersteuern oder ungewollten Netzbezug zu riskieren.

Das möchte ich so mal, für den EM bestätigen. :smiley:

Danke, dass Du die Konfiguration mit uns teilst.

Daraus gelernt, passe ich meine Automation, von “eco+” auf “comfort” an. Ich nutze weiter den “erhöhten Warmwasserbedarf” und lasse den Heizstab über die “comfort"-Funktion” zuschalten und lege die “number.boiler_dhw_comfort_stop_temp” auf 65° fest.

Dann geht der PV-Überschuss in die Warmwasserbereitung und die Vorlauftemperatur ändert sich nicht.

1 „Gefällt mir“

Hallo zusammen,

ich scheitere leider daran, die YAML Datei via Konfiguration.yaml einzubinden. Es schaut folgendermaßen aus:

configuration.yaml:

energy_manager.yaml liegt unter /homeassistant/packages/energy_manager.yaml

Fehlermeldung:

Vielleicht hat jemand eine Idee? Wenn ich noch Infos nachliefern kann, gerne. Ich bin Neuling hier auf dem Gebiet…

Beste Grüße
Marcus