Praxisnahe Tutorials, auf die du zählen kannst.
Einsteiger Guide für Home Assistant

Wie ich eine 14 Jahre alte Wärmepumpe mit Home Assistant smart gemacht habe

In diesem Video zeige ich dir, wie ich meine 14 Jahre alte Wärmepumpe mit Home Assistant smart gemacht habe. Erfahre, wie du deine Stiebel Eltron Wärmepumpe mit MCP2515 und ESPHome verbindest!

Inhaltsverzeichnis


Voraussetzungen

Home Assistant muss schon installiert sein, auf welcher Hardware spielt keine Rolle.

Außerdem sollte du mit den Grundlagen vertraut sein

Sowie mit ESPHome

content-copyCode zum kopieren

Zum kopieren und einfügen von Code findest du übrigens einige spannende Infos im Expertentipps-Video.

ESPHome

Wichtig: Nenne das ESPHome-Projekt heatingpump, ansonsten heißen all deine Entitäten komplett anders! Passe ggf. den API-Key sowie die IP-Adresse an, damit es zu deiner Umgebung passt 👍

Außerdem nicht vergessen, die Stiebeltools-Dateien der GitHub-Repo wie im Video angesprochen in das lokale ESPHome-Verzeichnis zu kopieren.

esphome:
  name: heatingpump
  friendly_name: "Heatingpump CAN Interface"

  platform: ESP32
  board: esp32dev
  includes:
  - stiebeltools/ElsterTable.h
  - stiebeltools/KElsterTable.h
  - stiebeltools/KElsterTable.cpp
  - stiebeltools/NUtils.h
  - stiebeltools/NUtils.cpp
  - stiebeltools/NTypes.h
  - stiebeltools/heatingpump.h

# Enable Home Assistant API
api:
  encryption:
    key: "OxzvqkshTfnnu1EdLE6EAqlurKFBfKLc2Mf5WuZpL1M="

ota:
  - platform: esphome
    password: "6055251ee076f8619304701d8a5f1766"

# Enable logging
logger:
  level: INFO

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.0.231
    gateway: 192.168.0.1
    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Heatingpump Fallback Hotspot"
    password: "ynOFgUJVSeTj"

captive_portal:
    
#globals:

#########################################
#                                       #
#   SELECT                              #
#                                       #
#########################################
select:
  - platform: template
    name: "PROGRAMMSCHALTER_SET"
    id: PROGRAMMSCHALTER_SET
    options:
     - "Notbetrieb"
     - "Bereitschaft"
     - "Automatik"
     - "Tagbetrieb"
     - "Absenkbetrieb"
     - "Warmwasser"
     - "Unbekannt"
    initial_option: "Unbekannt"
    optimistic: true
    on_value:
      then:
        - lambda: |-
            // Prüfe ob Dropdown nicht auf Unbekannt steht
            const char* auswahl = id(PROGRAMMSCHALTER_SET).state.c_str();
            if(strcmp(auswahl, "Unbekannt") != 0) {
              writeSignal(&CanMembers[cm_manager], GetElsterIndex("PROGRAMMSCHALTER"), auswahl);
              readSignal(&CanMembers[cm_manager], GetElsterIndex("PROGRAMMSCHALTER"));
            }
            return;

#########################################
#                                       #
#   SENSORS                             #
#                                       #
#########################################
sensor:

#########################################
#                                       #
#   KESSEL SENSOREN                      #
#                                       #
#########################################
  - platform: template
    name: "AUSSENTEMP"
    id: AUSSENTEMP
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 20min
    lambda: |-
      readSignal(&CanMembers[cm_kessel], GetElsterIndex("AUSSENTEMP"));
      return {};

    #Warmwasser SOLL Komfort Temperatur
  - platform: template
    name: "EINSTELL_SPEICHERSOLLTEMP"
    id: EINSTELL_SPEICHERSOLLTEMP
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_kessel], GetElsterIndex("EINSTELL_SPEICHERSOLLTEMP"));
      return {};

    # Warmwasser SOLL Eco Temperatur
  - platform: template
    name: "EINSTELL_SPEICHERSOLLTEMP2"
    id: EINSTELL_SPEICHERSOLLTEMP2
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_kessel], GetElsterIndex("EINSTELL_SPEICHERSOLLTEMP2"));
      return {};

    #T Heizkreis Soll Abfrage
  - platform: template
    name: "HILFSKESSELSOLL"
    id: HILFSKESSELSOLL
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_kessel], GetElsterIndex("HILFSKESSELSOLL"));
      return {};

  - platform: template
    name: "INITIALISIERUNG_KESSEL"
    id: INITIALISIERUNG_KESSEL
    icon: "mdi:description"
    accuracy_decimals: 0
    update_interval: 30min

    #Rücklauftemperatur SOLL  - platform: template
  - platform: template
    name: "KESSELSOLLTEMP"
    id: KESSELSOLLTEMP
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_kessel], GetElsterIndex("KESSELSOLLTEMP"));
      return {};

    #Rücklauftemperatur IST
  - platform: template
    name: "RUECKLAUFISTTEMP_KESSEL"
    id: RUECKLAUFISTTEMP_KESSEL
    unit_of_measurement: "°C"
    icon: "mdi:waves-arrow-left"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_kessel], GetElsterIndex("RUECKLAUFISTTEMP"));
      return {};

    #Warmwasser-Temperaturabfrage + Gerätespezifischer Offset 3.9 °C
  - platform: template
    name: "SPEICHERISTTEMP"
    id: SPEICHERISTTEMP
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    filters:
      - offset: 3.9
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_kessel], GetElsterIndex("SPEICHERISTTEMP"));
      return {};

    #Warmwasser SOLL Temperatur
  - platform: template
    name: "SPEICHERSOLLTEMP"
    id: SPEICHERSOLLTEMP
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_kessel], GetElsterIndex("SPEICHERSOLLTEMP"));
      return {};

    #Vorlauftemperatur SOLL Heizung
  # - platform: template
  #   name: "VORLAUFSOLLTEMP"
  #   id: VORLAUFSOLLTEMP
  #   unit_of_measurement: "°C"
  #   icon: "mdi:thermometer-lines"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 1
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_kessel], GetElsterIndex("VORLAUFSOLLTEMP"));
  #     return {};

    # Vorlauftemperatur IST Heizung
  # - platform: template
  #   name: "WPVORLAUFIST_KESSEL"
  #   id: WPVORLAUFIST_KESSEL
  #   unit_of_measurement: "°C"
  #   icon: "mdi:thermometer-lines"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 1
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_kessel], GetElsterIndex("WPVORLAUFIST"));
  #     return {};

  - platform: template
    name: "BUSKONTROLLE"
    id: BUSKONTROLLE
    icon: "mdi:description"
    accuracy_decimals: 0

#########################################
#                                       #
#   MANAGER SENSOREN                    #
#                                       #
#########################################
  - platform: template
    name: "ANFAHRENT"
    id: ANFAHRENT
    state_class: "measurement"
    accuracy_decimals: 0

  - platform: template
    name: "GERAETEKONFIGURATION"
    id: GERAETEKONFIGURATION
    icon: "mdi:description"
    state_class: "measurement"
    accuracy_decimals: 0

  - platform: template
    name: "HARDWARE_NUMMER_MANAGER"
    id: HARDWARE_NUMMER_MANAGER
    icon: "mdi:description"
    accuracy_decimals: 0

  - platform: template
    name: "INDEX_NOT_FOUND_MANAGER"
    id: INDEX_NOT_FOUND_MANAGER
    icon: "mdi:description"
    accuracy_decimals: 0

  - platform: template
    name: "INITIALISIERUNG_MANAGER"
    id: INITIALISIERUNG_MANAGER
    icon: "mdi:description"
    accuracy_decimals: 0

  - platform: template
    name: "LAUFZEIT_VERD_BEI_SPEICHERBEDARF"
    id: LAUFZEIT_VERD_BEI_SPEICHERBEDARF
    icon: "mdi:timer"
    device_class: "duration"
    state_class: "measurement"
    accuracy_decimals: 0
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("LAUFZEIT_VERD_BEI_SPEICHERBEDARF"));
      return {};

  # - platform: template
  #   name: "LUEFT_PASSIVKUEHLUNG_UEBER_FORTLUEFTER"
  #   id: LUEFT_PASSIVKUEHLUNG_UEBER_FORTLUEFTER
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: 30min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LUEFT_PASSIVKUEHLUNG_UEBER_FORTLUEFTER"));
  #     return {};

  # - platform: template
  #   name: "LZ_VERD_1_2_HEIZBETRIEB_MANAGER"
  #   id: LZ_VERD_1_2_HEIZBETRIEB_MANAGER
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LZ_VERD_1_2_HEIZBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_1_2_KUEHLBETRIEB_MANAGER"
  #   id: LZ_VERD_1_2_KUEHLBETRIEB_MANAGER
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LZ_VERD_1_2_KUEHLBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_1_2_WW_BETRIEB_MANAGER"
  #   id: LZ_VERD_1_2_WW_BETRIEB_MANAGER
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LZ_VERD_1_2_WW_BETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_1_HEIZBETRIEB_MANAGER"
  #   id: LZ_VERD_1_HEIZBETRIEB_MANAGER
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LZ_VERD_1_HEIZBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_1_KUEHLBETRIEB_MANAGER"
  #   id: LZ_VERD_1_KUEHLBETRIEB_MANAGER
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LZ_VERD_1_KUEHLBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_1_WW_BETRIEB_MANAGER"
  #   id: LZ_VERD_1_WW_BETRIEB_MANAGER
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LZ_VERD_1_WW_BETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_2_HEIZBETRIEB_MANAGER"
  #   id: LZ_VERD_2_HEIZBETRIEB_MANAGER
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LZ_VERD_2_HEIZBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_2_KUEHLBETRIEB_MANAGER"
  #   id: LZ_VERD_2_KUEHLBETRIEB_MANAGER
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: 60min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LZ_VERD_2_KUEHLBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_2_WW_BETRIEB_MANAGER"
  #   id: LZ_VERD_2_WW_BETRIEB_MANAGER
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("LZ_VERD_2_WW_BETRIEB"));
  #     return {};
     
  - platform: template
    name: "PARAMETERSATZ_MANAGER"
    id: PARAMETERSATZ_MANAGER
    icon: "mdi:description"
    accuracy_decimals: 0

  # - platform: template
  #   name: "QUELLENPUMPEN_STATUS"
  #   id: QUELLENPUMPEN_STATUS
  #   unit_of_measurement: "°C"
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("PARAMETERSATZ"));
  #     return {};
     
  # - platform: template
  #   name: "RAUMISTTEMP"
  #   id: RAUMISTTEMP
  #   unit_of_measurement: "°C"
  #   icon: "mdi:thermometer-lines"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 1
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("RAUMISTTEMP"));
  #     return {};
     
  - platform: template
    name: "RAUMSOLLTEMP_I"
    id: RAUMSOLLTEMP_I
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("RAUMSOLLTEMP_I"));
      return {};
     
  # - platform: template
  #   name: "RAUMSOLLTEMP_II"
  #   id: RAUMSOLLTEMP_II
  #   unit_of_measurement: "°C"
  #   icon: "mdi:thermometer-lines"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 1
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("RAUMSOLLTEMP_II"));
  #     return {};
     
  # - platform: template
  #   name: "RAUMSOLLTEMP_III"
  #   id: RAUMSOLLTEMP_III
  #   unit_of_measurement: "°C"
  #   icon: "mdi:thermometer-lines"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 1
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("RAUMSOLLTEMP_III"));
  #     return {};
     
  - platform: template
    name: "RAUMSOLLTEMP_NACHT"
    id: RAUMSOLLTEMP_NACHT
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("RAUMSOLLTEMP_NACHT"));
      return {};
     
  # - platform: template
  #   name: "RUECKLAUFISTTEMP_MANAGER"
  #   id: RUECKLAUFISTTEMP_MANAGER
  #   unit_of_measurement: "°C"
  #   icon: "mdi:waves-arrow-left"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 1
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("RUECKLAUFISTTEMP"));
  #     return {};
     
  # - platform: template
  #   name: "SAMMEL_RELAISSTATUS"
  #   id: SAMMEL_RELAISSTATUS
  #   icon: "mdi:switch"
  #   accuracy_decimals: 0

  - platform: template
    name: "SOFTWARE_NUMMER_MANAGER"
    id: SOFTWARE_NUMMER_MANAGER
    icon: "mdi:wysiwyg"
    accuracy_decimals: 0

  - platform: template
    name: "SOFTWARE_VERSION"
    id: SOFTWARE_VERSION
    icon: "mdi:wysiwyg"
    accuracy_decimals: 0

  - platform: template
    name: "SPEICHERBEDARF"
    id: SPEICHERBEDARF
    icon: "mdi:memory"
    state_class: "measurement"
    accuracy_decimals: 0

  - platform: template
    name: "TEILVORRANG_WW"
    id: TEILVORRANG_WW
    state_class: "measurement"
    accuracy_decimals: 0
    update_interval: 60min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("TEILVORRANG_WW"));
      return {};
     
  # - platform: template
  #   name: "TEMPORALE_LUEFTUNGSSTUFE_DAUER"
  #   id: TEMPORALE_LUEFTUNGSSTUFE_DAUER
  #   icon: "mdi:timer"
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: 60min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("TEMPORALE_LUEFTUNGSSTUFE_DAUER"));
  #     return {};
     
  - platform: template
    name: "VERDICHTER_MANAGER"
    id: VERDICHTER_MANAGER
    icon: "mdi:compress"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("VERDICHTER"));
      return {};
     
  - platform: template
    name: "VERSTELLTE_RAUMSOLLTEMP"
    id: VERSTELLTE_RAUMSOLLTEMP
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("VERSTELLTE_RAUMSOLLTEMP"));
      return {};
     
  # - platform: template
  #   name: "WPVORLAUFIST_MANAGER"
  #   id: WPVORLAUFIST_MANAGER
  #   unit_of_measurement: "°C"
  #   icon: "mdi:thermometer-lines"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 1
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("WPVORLAUFIST"));
  #     return {};
     
  # - platform: template
  #   name: "ZWISCHENEINSPRITZUNG_ISTTEMP"
  #   id: ZWISCHENEINSPRITZUNG_ISTTEMP
  #   unit_of_measurement: "°C"
  #   icon: "mdi:thermometer-lines"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("ZWISCHENEINSPRITZUNG_ISTTEMP"));
  #     return {};
     
  - platform: template
    name: "ACCESS_EEPROM"
    id: ACCESS_EEPROM
    icon: "mdi:memory"
    accuracy_decimals: 0

  - platform: template
    name: "JAHR"
    id: JAHR
    icon: "mdi:calendar_month"
    accuracy_decimals: 0
    update_interval: 1440min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("JAHR"));
      return {};

  - platform: template
    name: "MINUTE"
    id: MINUTE
    icon: "mdi:schedule"
    accuracy_decimals: 0
    ## TEST ATTENTION
    update_interval: never
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("MINUTE"));
      return {};

  - platform: template
    name: "MONAT"
    id: MONAT
    icon: "mdi:calendar_month"
    accuracy_decimals: 0
    update_interval: 1440min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("MONAT"));
      return {};

  - platform: template
    name: "SEKUNDE"
    id: SEKUNDE
    icon: "mdi:schedule"
    accuracy_decimals: 0
    update_interval: never
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("SEKUNDE"));
      return {};

  - platform: template
    name: "STUNDE"
    id: STUNDE
    icon: "mdi:schedule"
    accuracy_decimals: 0
    update_interval: 60min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("STUNDE"));
      return {};

  - platform: template
    name: "TAG"
    id: TAG
    icon: "mdi:calendar_month"
    accuracy_decimals: 0
    update_interval: 1440min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("TAG"));
      return {};

  # - platform: template
  #   name: "WP_STATUS"
  #   id: WP_STATUS
  #   accuracy_decimals: 0
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_manager], GetElsterIndex("WP_STATUS"));
  #     return {};

  - platform: template
    name: "EVU_SPERRE_AKTIV_MANAGER"
    id: EVU_SPERRE_AKTIV_MANAGER
    icon: "mdi:dip-switch"
    accuracy_decimals: 0
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("EVU_SPERRE_AKTIV"));
      return {};

#########################################
#                                       #
#   HEIZMODUL SENSORS                   #
#                                       #
#########################################
  - platform: template
    name: "VERDAMPFERTEMP"
    id: VERDAMPFERTEMP
    unit_of_measurement: "°C"
    icon: "mdi:kettle-steam-outline"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 0
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("VERDAMPFERTEMP"));
      return {};
     
  # - platform: template
  #   name: "RUECKLAUFISTTEMP"
  #   id: RUECKLAUFISTTEMP
  #   unit_of_measurement: "°C"
  #   icon: "mdi:waves-arrow-left"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 1
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("RUECKLAUFISTTEMP"));
  #     return {};
     
  - platform: template
    name: "VERDICHTER_HEIZMODUL"
    id: VERDICHTER_HEIZMODUL
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-lines"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("VERDICHTER"));
      return {};
     
  # - platform: template
  #   name: "WPVORLAUFIST"
  #   id: WPVORLAUFIST
  #   unit_of_measurement: "°C"
  #   icon: "mdi:thermometer-lines"
  #   device_class: "temperature"
  #   state_class: "measurement"
  #   accuracy_decimals: 1
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WPVORLAUFIST"));
  #     return {};
     
  - platform: template
    name: "ABTAUUNGAKTIV"
    id: ABTAUUNGAKTIV
    icon: "mdi:description"
    accuracy_decimals: 0
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("AUSSENTEMP"));
      return {};
     
#  - platform: template
#    name: "BETRIEBSART_WP"
#    id: BETRIEBSART_WP
#    icon: "mdi:dip-switch"
#    accuracy_decimals: 0
#    update_interval: 10min
#    lambda: |-
#      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("BETRIEBSART_WP"));
#      return {};

  - platform: template
    name: "EL_AUFNAHMELEISTUNG_HEIZ_SUM_KWH"
    id: EL_AUFNAHMELEISTUNG_HEIZ_SUM_KWH
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 0
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("EL_AUFNAHMELEISTUNG_HEIZ_SUM_KWH"));
      return {};
     
  - platform: template
    name: "EL_AUFNAHMELEISTUNG_HEIZ_TAG_WH"
    id: EL_AUFNAHMELEISTUNG_HEIZ_TAG_WH
    unit_of_measurement: Wh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 0
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("EL_AUFNAHMELEISTUNG_HEIZ_TAG_WH"));
      return {};
     
  - platform: template
    name: "EL_AUFNAHMELEISTUNG_WW_SUM_KWH"
    id: EL_AUFNAHMELEISTUNG_WW_SUM_KWH
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 0
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("EL_AUFNAHMELEISTUNG_WW_SUM_KWH"));
      return {};
     
  - platform: template
    name: "EL_AUFNAHMELEISTUNG_WW_TAG_WH"
    id: EL_AUFNAHMELEISTUNG_WW_TAG_WH
    unit_of_measurement: Wh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 0
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("EL_AUFNAHMELEISTUNG_WW_TAG_WH"));
      return {};

  - platform: template
    name: "FATAL_ERROR"
    id: FATAL_ERROR
    icon: "mdi:alert-circle"
    accuracy_decimals: 0

  - platform: template
    name: "FEHLER_PARAMETERSATZ_IWS"
    id: FEHLER_PARAMETERSATZ_IWS
    icon: "mdi:alert-circle"
    accuracy_decimals: 0

  - platform: template
    name: "FEHLERMELDUNG"
    id: FEHLERMELDUNG
    icon: "mdi:alert-circle"
    accuracy_decimals: 0

  - platform: template
    name: "HARDWARE_NUMMER_HEIZMODUL"
    id: HARDWARE_NUMMER_HEIZMODUL
    icon: "mdi:description"
    accuracy_decimals: 0

  - platform: template
    name: "INDEX_NOT_FOUND_HEIZMODUL"
    id: INDEX_NOT_FOUND_HEIZMODUL
    icon: "mdi:description"
    accuracy_decimals: 0

  - platform: template
    name: "INITIALISIERUNG_HEIZMODUL"
    id: INITIALISIERUNG_HEIZMODUL
    icon: "mdi:description"
    accuracy_decimals: 0

  - platform: template
    name: "K_OS_RMX_RESERVE_INFO3"
    id: K_OS_RMX_RESERVE_INFO3
    icon: "mdi:description"
    accuracy_decimals: 0

  # - platform: template
  #   name: "LZ_VERD_1_2_WW_BETRIEB_HEIZMODUL"
  #   id: LZ_VERD_1_2_WW_BETRIEB_HEIZMODUL
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("LZ_VERD_1_2_WW_BETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_1_WW_BETRIEB_HEIZMODUL"
  #   id: LZ_VERD_1_WW_BETRIEB_HEIZMODUL
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("LZ_VERD_1_WW_BETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_2_WW_BETRIEB_HEIZMODUL"
  #   id: LZ_VERD_2_WW_BETRIEB_HEIZMODUL
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 0
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("LZ_VERD_2_WW_BETRIEB"));
  #     return {};
     
  - platform: template
    name: "PARAMETERSATZ_HEIZMODUL"
    id: PARAMETERSATZ_HEIZMODUL
    icon: "mdi:alert-circle"
    accuracy_decimals: 0

  # - platform: template
  #   name: "SCHALTFKT_IWS"
  #   id: SCHALTFKT_IWS
  #   icon: "mdi:description"
  #   accuracy_decimals: 0

  - platform: template
    name: "SOFTWARE_NUMMER_HEIZMODUL"
    id: SOFTWARE_NUMMER_HEIZMODUL
    icon: "mdi:description"
    accuracy_decimals: 0

  # - platform: template
  #   name: "SOLAR_KOLLEKTOR_3_I_ANTEIL"
  #   id: SOLAR_KOLLEKTOR_3_I_ANTEIL
  #   icon: "mdi:solar-power-variant"
  #   accuracy_decimals: 0

  - platform: template
    name: "SPEICHER_STATUS"
    id: SPEICHER_STATUS
    icon: "mdi:description"
    accuracy_decimals: 0

  # - platform: template
  #   name: "STUETZSTELLE_HD1"
  #   id: STUETZSTELLE_HD1
  #   icon: "mdi:description"
  #   accuracy_decimals: 0

  # - platform: template
  #   name: "STUETZSTELLE_HD2"
  #   id: STUETZSTELLE_HD2
  #   icon: "mdi:description"
  #   accuracy_decimals: 0

  # - platform: template
  #   name: "STUETZSTELLE_ND1"
  #   id: STUETZSTELLE_ND1
  #   icon: "mdi:description"
  #   accuracy_decimals: 0

  # - platform: template
  #   name: "STUETZSTELLE_ND2"
  #   id: STUETZSTELLE_ND2
  #   icon: "mdi:description"
  #   accuracy_decimals: 0

  - platform: template
    name: "WAERMEERTRAG_2WE_HEIZ_SUM_KWH"
    id: WAERMEERTRAG_2WE_HEIZ_SUM_KWH
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 0
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_2WE_HEIZ_SUM_KWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_2WE_WW_SUM_KWH"
    id: WAERMEERTRAG_2WE_WW_SUM_KWH
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:water-boiler"
    accuracy_decimals: 0
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_2WE_WW_SUM_KWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_HEIZ_SUM_KWH"
    id: WAERMEERTRAG_HEIZ_SUM_KWH
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 0
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_HEIZ_SUM_KWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_HEIZ_TAG_WH"
    id: WAERMEERTRAG_HEIZ_TAG_WH
    unit_of_measurement: Wh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 0
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_HEIZ_TAG_WH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_WW_SUM_KWH"
    id: WAERMEERTRAG_WW_SUM_KWH
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:water-boiler"
    accuracy_decimals: 0
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_WW_SUM_KWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_WW_TAG_WH"
    id: WAERMEERTRAG_WW_TAG_WH
    unit_of_measurement: Wh
    device_class: energy
    icon: "mdi:water-boiler"
    accuracy_decimals: 0
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_WW_TAG_WH"));
      return {};
     
  - platform: template
    name: "EL_AUFNAHMELEISTUNG_HEIZ_SUM_MWH"
    id: EL_AUFNAHMELEISTUNG_HEIZ_SUM_MWH
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("EL_AUFNAHMELEISTUNG_HEIZ_SUM_MWH"));
      return {};
     
  - platform: template
    name: "EL_AUFNAHMELEISTUNG_HEIZ_TAG_KWH"
    id: EL_AUFNAHMELEISTUNG_HEIZ_TAG_KWH
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("EL_AUFNAHMELEISTUNG_HEIZ_TAG_KWH"));
      return {};
     
  - platform: template
    name: "EL_AUFNAHMELEISTUNG_WW_SUM_MWH"
    id: EL_AUFNAHMELEISTUNG_WW_SUM_MWH
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("EL_AUFNAHMELEISTUNG_WW_SUM_MWH"));
      return {};
     
  - platform: template
    name: "EL_AUFNAHMELEISTUNG_WW_TAG_KWH"
    id: EL_AUFNAHMELEISTUNG_WW_TAG_KWH
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("EL_AUFNAHMELEISTUNG_WW_TAG_KWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_2WE_HEIZ_SUM_MWH"
    id: WAERMEERTRAG_2WE_HEIZ_SUM_MWH
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 3
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_2WE_HEIZ_SUM_MWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_2WE_WW_SUM_MWH"
    id: WAERMEERTRAG_2WE_WW_SUM_MWH
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:water-boiler"
    accuracy_decimals: 3
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_2WE_WW_SUM_MWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_HEIZ_SUM_MWH"
    id: WAERMEERTRAG_HEIZ_SUM_MWH
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 3
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_HEIZ_SUM_MWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_HEIZ_TAG_KWH"
    id: WAERMEERTRAG_HEIZ_TAG_KWH
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 3
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_HEIZ_TAG_KWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_WW_SUM_MWH"
    id: WAERMEERTRAG_WW_SUM_MWH
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:water-boiler"
    accuracy_decimals: 3
    update_interval: 30min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_WW_SUM_MWH"));
      return {};
     
  - platform: template
    name: "WAERMEERTRAG_WW_TAG_KWH"
    id: WAERMEERTRAG_WW_TAG_KWH
    unit_of_measurement: KWh
    device_class: energy
    icon: "mdi:water-boiler"
    accuracy_decimals: 3
    update_interval: 10min
    lambda: |-
      readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("WAERMEERTRAG_WW_TAG_KWH"));
      return {};
     
  # - platform: template
  #   name: "LZ_VERD_1_2_HEIZBETRIEB_HEIZMODUL"
  #   id: LZ_VERD_1_2_HEIZBETRIEB_HEIZMODUL
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("LZ_VERD_1_2_HEIZBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_1_2_KUEHLBETRIEB_HEIZMODUL"
  #   id: LZ_VERD_1_2_KUEHLBETRIEB_HEIZMODUL
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("LZ_VERD_1_2_KUEHLBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_1_HEIZBETRIEB_HEIZMODUL"
  #   id: LZ_VERD_1_HEIZBETRIEB_HEIZMODUL
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("LZ_VERD_1_HEIZBETRIEB"));
  #     return {};

  # - platform: template
  #   name: "LZ_VERD_1_KUEHLBETRIEB_HEIZMODUL"
  #   id: LZ_VERD_1_KUEHLBETRIEB_HEIZMODUL
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("LZ_VERD_1_KUEHLBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_2_HEIZBETRIEB_HEIZMODUL"
  #   id: LZ_VERD_2_HEIZBETRIEB_HEIZMODUL
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: never
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("LZ_VERD_2_HEIZBETRIEB"));
  #     return {};
     
  # - platform: template
  #   name: "LZ_VERD_2_KUEHLBETRIEB_HEIZMODUL"
  #   id: LZ_VERD_2_KUEHLBETRIEB_HEIZMODUL
  #   icon: "mdi:timer"
  #   device_class: "duration"
  #   state_class: "measurement"
  #   accuracy_decimals: 3
  #   update_interval: 10min
  #   lambda: |-
  #     readSignal(&CanMembers[cm_heizmodul], GetElsterIndex("LZ_VERD_2_KUEHLBETRIEB"));
  #     return {};

#########################################
#                                       #
#   BERECHNETE SENSOREN                 #
#                                       #
#########################################
  - platform: template
    name: "EL_AUFNAHMELEISTUNG_HEIZ_SUM"
    id: EL_AUFNAHMELEISTUNG_HEIZ_SUM
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "EL_AUFNAHMELEISTUNG_WW_SUM"
    id: EL_AUFNAHMELEISTUNG_WW_SUM
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "EL_AUFNAHMELEISTUNG_HEIZ_INCREASING"
    id: EL_AUFNAHMELEISTUNG_HEIZ_INCREASING
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "EL_AUFNAHMELEISTUNG_WW_INCREASING"
    id: EL_AUFNAHMELEISTUNG_WW_INCREASING
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "EL_AUFNAHMELEISTUNG_HEIZ_TAG"
    id: EL_AUFNAHMELEISTUNG_HEIZ_TAG
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3

  - platform: template
    name: "EL_AUFNAHMELEISTUNG_WW_TAG"
    id: EL_AUFNAHMELEISTUNG_WW_TAG
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:transmission-tower"
    accuracy_decimals: 3

  - platform: template
    name: "WAERMEERTRAG_2WE_HEIZ_SUM"
    id: WAERMEERTRAG_2WE_HEIZ_SUM
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "WAERMEERTRAG_2WE_WW_SUM"
    id: WAERMEERTRAG_2WE_WW_SUM
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:water-boiler"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "WAERMEERTRAG_HEIZ_SUM"
    id: WAERMEERTRAG_HEIZ_SUM
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "WAERMEERTRAG_HEIZ_INCREASING"
    id: WAERMEERTRAG_HEIZ_INCREASING
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "WAERMEERTRAG_HEIZ_TAG"
    id: WAERMEERTRAG_HEIZ_TAG
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 3

  - platform: template
    name: "WAERMEERTRAG_WW_SUM"
    id: WAERMEERTRAG_WW_SUM
    unit_of_measurement: MWh
    device_class: energy
    icon: "mdi:water-boiler"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "WAERMEERTRAG_WW_INCREASING"
    id: WAERMEERTRAG_WW_INCREASING
    unit_of_measurement: kWh
    device_class: energy
    icon: "mdi:heating-coil"
    accuracy_decimals: 3
    state_class: "total_increasing"

  - platform: template
    name: "WAERMEERTRAG_WW_TAG"
    id: WAERMEERTRAG_WW_TAG
    unit_of_measurement: KWh
    device_class: energy
    icon: "mdi:water-boiler"
    accuracy_decimals: 3

  - platform: template
    name: "COP_WW"
    id: COP_WW
    icon: "mdi:chart-bell-curve-cumulative"
    device_class: "power_factor"
    state_class: "measurement"
    accuracy_decimals: 2

  - platform: template
    name: "COP_HEIZ"
    id: COP_HEIZ
    icon: "mdi:chart-bell-curve-cumulative"
    device_class: "power_factor"
    state_class: "measurement"
    accuracy_decimals: 2

  - platform: template
    name: "COP_GESAMT"
    id: COP_GESAMT
    icon: "mdi:chart-bell-curve-cumulative"
    device_class: "power_factor"
    state_class: "measurement"
    accuracy_decimals: 2

#########################################
#                                       #
#   Other Sensors                       #
#                                       #
#########################################
  - platform: wifi_signal
    name: "WiFi Signal dBm"
    icon: "mdi:wifi" 
    update_interval: 60s
    id: wifi_dbm
    
  - platform: template
    name: "WiFi Signal"
    icon: "mdi:signal"
    unit_of_measurement: "%"
    update_interval: 60s
    id: wifi_percentage
    lambda: |-
      float dBm = id(wifi_dbm).state;
      float MIN_DBM = -100.0; // Minimum RSSI in dBm
      float MAX_DBM = -30.0; // Maximum RSSI in dBm
      if (dBm < MIN_DBM) dBm = MIN_DBM;
      if (dBm > MAX_DBM) dBm = MAX_DBM;
      return ((dBm - MIN_DBM) / (MAX_DBM - MIN_DBM)) * 100;

#########################################
#                                       #
#   TEXT SENSOREN                       #
#                                       #
#########################################
text_sensor:

#########################################
#                                       #
#   HOME ASSISTANT TEXT SENSOREN        #
#                                       #
#########################################
  - platform: homeassistant
    name: "Wärmepumpe Datum Setpoint"
    id: warmepumpe_datum
    entity_id: input_datetime.warmepumpe_datum

  - platform: homeassistant
    name: "Wärmepumpe Uhrzeit Setpoint"
    id: warmepumpe_uhrzeit
    entity_id: input_datetime.warmepumpe_uhrzeit

  - platform: homeassistant
    name: "EINSTELL_SPEICHERSOLLTEMP_SET"
    id: EINSTELL_SPEICHERSOLLTEMP_SET
    entity_id: input_number.speichersolltemp_set
    on_value:
      then:
        lambda: |-
          if(atoi(x.c_str()) != 20) {
            char temp[3];
            strncpy(temp, x.c_str(), sizeof(temp)-1);
            temp[2] ='\0';
            const char* ctemp = temp;
            writeSignal(&CanMembers[cm_manager], GetElsterIndex("EINSTELL_SPEICHERSOLLTEMP"), ctemp);
            id(EINSTELL_SPEICHERSOLLTEMP).update();
            id(SPEICHERISTTEMP).update();
            id(SPEICHERSOLLTEMP).update();

          }
          return;

  - platform: homeassistant
    name: "EINSTELL_SPEICHERSOLLTEMP2_SET"
    id: EINSTELL_SPEICHERSOLLTEMP2_SET
    entity_id: input_number.speichersolltemp2_set
    on_value:
      then:
        lambda: |-
          if(atoi(x.c_str()) != 20) {
            char temp[3];
            strncpy(temp, x.c_str(), sizeof(temp)-1);
            temp[2] ='\0';
            const char* ctemp = temp;
            writeSignal(&CanMembers[cm_manager], GetElsterIndex("EINSTELL_SPEICHERSOLLTEMP2"), ctemp);
            id(EINSTELL_SPEICHERSOLLTEMP2).update();
            id(SPEICHERISTTEMP).update();
            id(SPEICHERSOLLTEMP).update();
          }
          return;

  - platform: homeassistant
    name: "RAUMSOLLTEMP_I_SET"
    id: RAUMSOLLTEMP_I_SET
    entity_id: input_number.raumsolltemp_i_set
    on_value:
      then:
        lambda: |-
          if(atoi(x.c_str()) != 20) {
            char temp[3];
            strncpy(temp, x.c_str(), sizeof(temp)-1);
            // temp[2] ='\0';
            const char* ctemp = temp;
            writeSignal(&CanMembers[cm_manager], GetElsterIndex("RAUMSOLLTEMP_I"), ctemp);
            id(RAUMSOLLTEMP_I).update();
            id(RUECKLAUFISTTEMP_KESSEL).update();
            id(HILFSKESSELSOLL).update();
          }
          return;

  - platform: homeassistant
    name: "RAUMSOLLTEMP_NACHT_SET"
    id: RAUMSOLLTEMP_NACHT_SET
    entity_id: input_number.raumsolltemp_nacht_set
    on_value:
      then:
        lambda: |-
          if(atoi(x.c_str()) != 20) {
            char temp[3];
            strncpy(temp, x.c_str(), sizeof(temp)-1);
            // temp[2] ='\0';
            const char* ctemp = temp;
            writeSignal(&CanMembers[cm_manager], GetElsterIndex("RAUMSOLLTEMP_NACHT"), ctemp);
            id(RAUMSOLLTEMP_NACHT).update();
            id(RUECKLAUFISTTEMP_KESSEL).update();
            id(HILFSKESSELSOLL).update();
          }
          return;


#########################################
#                                       #
#   MANAGER TEXT SENSORS                #
#                                       #
#########################################
  - platform: template
    name: "GERAETE_ID_MANAGER"
    id: GERAETE_ID_MANAGER
    icon: "mdi:description"

  - platform: template
    name: "PROGRAMMSCHALTER"
    id: PROGRAMMSCHALTER
    icon: "mdi:switch"
    update_interval: 60min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("PROGRAMMSCHALTER"));
      return {};

  - platform: template
    name: "SOMMERBETRIEB"
    id: SOMMERBETRIEB
    icon: "mdi:weather-sunny"
    update_interval: 600min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("SOMMERBETRIEB"));
      return {};

  - platform: template
    name: "WW_ECO"
    id: WW_ECO
    icon: "mdi:leaf-circle-outline"
    update_interval: 600min
    lambda: |-
      readSignal(&CanMembers[cm_manager], GetElsterIndex("WW_ECO"));
      return {};

#########################################
#                                       #
#   HEIZMODUL TEXT SENSORS             #
#                                       #
#########################################
  - platform: template
    name: "GERAETE_ID_HEIZMODUL"
    id: GERAETE_ID_HEIZMODUL
    icon: "mdi:description"

#########################################
#                                       #
#   BERECHNETE TEXT SENSORS            #
#                                       #
#########################################
  - platform: template
    name: "DATUM"
    id: DATUM
    icon: "mdi:calendar"

  - platform: template
    name: "ZEIT"
    id: ZEIT
    icon: "mdi:clock"

#########################################
#                                       #
#   BUTTON                              #
#                                       #
#########################################
button:

  - platform: template
    name: "Update Uhrzeit"
    id: update_uhrzeit
    on_press:
      then:      
        lambda: |-
          ESP_LOGI("WRITE UHRZEIT VIA BUTTON", "%s", id(warmepumpe_datum).state.c_str());

          char stunde[3];
          char minute[3];
          char sekunde[3];

          strncpy(stunde, id(warmepumpe_uhrzeit).state.c_str(), sizeof(stunde)-1);
          stunde[2] ='\0';
          strncpy(minute, id(warmepumpe_uhrzeit).state.c_str()+3, sizeof(minute)-1);
          minute[2] ='\0';
          strncpy(sekunde, id(warmepumpe_uhrzeit).state.c_str()+6, sizeof(sekunde)-1);
          sekunde[2] ='\0';
          const char* cstunde = stunde;
          const char* cminute = minute;
          const char* csekunde = sekunde;
          ESP_LOGI("WRITE", "Stunde: %s, Minute: %s, Sekunde: %s", cstunde, cminute, csekunde);
          writeSignal(&CanMembers[cm_manager], GetElsterIndex("STUNDE"), cstunde);
          id(STUNDE).update();
          writeSignal(&CanMembers[cm_manager], GetElsterIndex("MINUTE"), cminute);
          id(MINUTE).update();
          writeSignal(&CanMembers[cm_manager], GetElsterIndex("SEKUNDE"), csekunde);
          id(SEKUNDE).update();

  - platform: template
    name: "Update Datum"
    id: update_datum
    on_press:
      then:      
        lambda: |-
          ESP_LOGI("WRITE DATUM VIA BUTTON", "%s", id(warmepumpe_datum).state.c_str());
          char year[3];
          char month[3];
          char day[3];

          strncpy(year, id(warmepumpe_datum).state.c_str()+2, sizeof(year)-1);
          year[2] ='\0';
          strncpy(month, id(warmepumpe_datum).state.c_str()+5, sizeof(month)-1);
          month[2] ='\0';
          strncpy(day, id(warmepumpe_datum).state.c_str()+8, sizeof(day)-1);
          day[2] ='\0';

          const char* cyear = year;
          const char* cmonth = month;
          const char* cday = day;
          ESP_LOGI("WRITE", "Year: %s, Month: %s, Day: %s", cyear, cmonth, cday);
          writeSignal(&CanMembers[cm_manager], GetElsterIndex("JAHR"), cyear);
          id(JAHR).update();
          writeSignal(&CanMembers[cm_manager], GetElsterIndex("MONAT"), cmonth);
          id(MONAT).update();
          writeSignal(&CanMembers[cm_manager], GetElsterIndex("TAG"), cday);
          id(TAG).update();


#########################################
#                                       #
#   SPI Konfiguration                   #
#                                       #
#########################################
spi:
  id: McpSpi
  clk_pin: GPIO18
  mosi_pin: GPIO23
  miso_pin: GPIO19

#########################################
#                                       #
#   canbus Konfiguration                #
#                                       #
#########################################
canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO4
    can_id: 700
    use_extended_id: false
    bit_rate: 20kbps
    on_frame:

#########################################
#                                       #
#   KESSEL Nachrichten                  #
#                                       #
#########################################
    - can_id: 0x180
      then:
        - lambda: |-
            unsigned short canId = 180;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

            if(ei->Name == "AUSSENTEMP") {
              id(AUSSENTEMP).publish_state(std::stof(value));
              return;
            }
            if(ei->Name == "BUSKONTROLLE") {
              id(BUSKONTROLLE).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "EINSTELL_SPEICHERSOLLTEMP") {
              id(EINSTELL_SPEICHERSOLLTEMP).publish_state(std::stof(value));
              return;
            }
            if(ei->Name == "EINSTELL_SPEICHERSOLLTEMP2") {
              id(EINSTELL_SPEICHERSOLLTEMP2).publish_state(std::stof(value));
              return;
            }
            if(ei->Name == "HILFSKESSELSOLL") {
              id(HILFSKESSELSOLL).publish_state(std::stof(value));
              return;
            }
            if(ei->Name == "INITIALISIERUNG") {
              id(INITIALISIERUNG_KESSEL).publish_state(std::stoi(value));
              return;
            }          
            if(ei->Name == "KESSELSOLLTEMP") {
              id(KESSELSOLLTEMP).publish_state(std::stof(value));
              return;
            }
            if(ei->Name == "RUECKLAUFISTTEMP") {
              id(RUECKLAUFISTTEMP_KESSEL).publish_state(std::stof(value));
              return;
            }
            if(ei->Name == "SPEICHERISTTEMP") {
              id(SPEICHERISTTEMP).publish_state(std::stof(value));
              return;
            }
            if(ei->Name == "SPEICHERSOLLTEMP") {
              id(SPEICHERSOLLTEMP).publish_state(std::stof(value));
              return;
            }
            // if(ei->Name == "VORLAUFSOLLTEMP") {
            //   id(VORLAUFSOLLTEMP).publish_state(std::stof(value));
            //   return;
            // }
            // if(ei->Name == "WPVORLAUFIST") {
            //   id(WPVORLAUFIST_KESSEL).publish_state(std::stof(value));
            //   return;
            // }            

#########################################
#                                       #
#   MANAGER Nachrichten                 #
#                                       #
#########################################
    - can_id: 0x480
      then:
        - lambda: |-
            unsigned short canId = 480;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

            if(ei->Name == "ACCESS_EEPROM") {
              id(ACCESS_EEPROM).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "ANFAHRENT") {
              id(ANFAHRENT).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "GERAETEKONFIGURATION") {
              id(GERAETEKONFIGURATION).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "GERAETE_ID") {
              id(GERAETE_ID_MANAGER).publish_state(value);
              return;
            }
            if(ei->Name == "HARDWARE_NUMMER") {
              id(HARDWARE_NUMMER_MANAGER).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "INDEX_NOT_FOUND") {
              id(INDEX_NOT_FOUND_MANAGER).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "INITIALISIERUNG") {
              id(INITIALISIERUNG_MANAGER).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "JAHR") {
              id(JAHR).publish_state(std::stoi(value));
              publishDate();
              return; 
            }
            if(ei->Name == "LAUFZEIT_VERD_BEI_SPEICHERBEDARF") {
              id(LAUFZEIT_VERD_BEI_SPEICHERBEDARF).publish_state(std::stoi(value));
              return;
            }
            // if(ei->Name == "LUEFT_PASSIVKUEHLUNG_UEBER_FORTLUEFTER") {
            //   id(LUEFT_PASSIVKUEHLUNG_UEBER_FORTLUEFTER).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_2_HEIZBETRIEB") {
            //   id(LZ_VERD_1_2_HEIZBETRIEB_MANAGER).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_2_KUEHLBETRIEB") {
            //   id(LZ_VERD_1_2_KUEHLBETRIEB_MANAGER).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_2_WW_BETRIEB") {
            //   id(LZ_VERD_1_2_WW_BETRIEB_MANAGER).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_HEIZBETRIEB") {
            //   id(LZ_VERD_1_HEIZBETRIEB_MANAGER).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_KUEHLBETRIEB") {
            //   id(LZ_VERD_1_KUEHLBETRIEB_MANAGER).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_WW_BETRIEB") {
            //   id(LZ_VERD_1_WW_BETRIEB_MANAGER).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_2_HEIZBETRIEB") {
            //   id(LZ_VERD_2_HEIZBETRIEB_MANAGER).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_2_KUEHLBETRIEB") {
            //   id(LZ_VERD_2_KUEHLBETRIEB_MANAGER).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_2_WW_BETRIEB") {
            //   id(LZ_VERD_2_WW_BETRIEB_MANAGER).publish_state(std::stoi(value));
            //   return;
            // }
            if(ei->Name == "MINUTE") {
              id(MINUTE).publish_state(std::stoi(value));
              publishTime();
              return;
            }
            if(ei->Name == "MONAT") {
              id(MONAT).publish_state(std::stoi(value));
              publishDate();
              return;
            }
            if(ei->Name == "PARAMETERSATZ") {
              id(PARAMETERSATZ_MANAGER).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "PROGRAMMSCHALTER") {
              id(PROGRAMMSCHALTER).publish_state(value);
              return;
            }
            // if(ei->Name == "QUELLENPUMPEN_STATUS") {
            //   id(QUELLENPUMPEN_STATUS).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "RAUMISTTEMP") {
            //   id(RAUMISTTEMP).publish_state(std::stof(value));
            //   return;
            // }
            if(ei->Name == "RAUMSOLLTEMP_I") {
              id(RAUMSOLLTEMP_I).publish_state(std::stof(value));
              return;
            }
            // if(ei->Name == "RAUMSOLLTEMP_II") {
            //   id(RAUMSOLLTEMP_II).publish_state(std::stof(value));
            //   return;
            // }
            // if(ei->Name == "RAUMSOLLTEMP_III") {
            //   id(RAUMSOLLTEMP_III).publish_state(std::stof(value));
            //   return;
            // }
            if(ei->Name == "RAUMSOLLTEMP_NACHT") {
              id(RAUMSOLLTEMP_NACHT).publish_state(std::stof(value));
              return;
            }
            // if(ei->Name == "RUECKLAUFISTTEMP") {
            //   id(RUECKLAUFISTTEMP_MANAGER).publish_state(std::stof(value));
            //   return;
            // }
            // if(ei->Name == "SAMMEL_RELAISSTATUS") {
            //   id(SAMMEL_RELAISSTATUS).publish_state(std::stoi(value));
            //   return;
            // }
            if(ei->Name == "SEKUNDE") {
              id(SEKUNDE).publish_state(std::stoi(value));
              publishTime();
              return;
            }
            if(ei->Name == "SOFTWARE_NUMMER") {
              id(SOFTWARE_NUMMER_MANAGER).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "SOFTWARE_VERSION") {
              id(SOFTWARE_VERSION).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "SOMMERBETRIEB") {
              id(SOMMERBETRIEB).publish_state(value);
              return;
            }
            if(ei->Name == "SPEICHERBEDARF") {
              id(SPEICHERBEDARF).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "STUNDE") {
              id(STUNDE).publish_state(std::stoi(value));
              publishTime();
              return;
            }
            if(ei->Name == "TAG") {
              id(TAG).publish_state(std::stoi(value));
              publishDate();
              return;
            }
            if(ei->Name == "TEILVORRANG_WW") {
              id(TEILVORRANG_WW).publish_state(std::stoi(value));
              return;
            }
            // if(ei->Name == "TEMPORALE_LUEFTUNGSSTUFE_DAUER") {
            //   id(TEMPORALE_LUEFTUNGSSTUFE_DAUER).publish_state(std::stoi(value));
            //   return;
            // }
            if(ei->Name == "VERDICHTER") {
              id(VERDICHTER_MANAGER).publish_state(std::stof(value));
              return;
            }
            if(ei->Name == "VERSTELLTE_RAUMSOLLTEMP") {
              id(VERSTELLTE_RAUMSOLLTEMP).publish_state(std::stof(value));
              return;
            }
            // if(ei->Name == "WP_STATUS") {
            //   id(WP_STATUS).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "WPVORLAUFIST") {
            //   id(WPVORLAUFIST_MANAGER).publish_state(std::stof(value));
            //   return;
            // }
            if(ei->Name == "WW_ECO") {
              id(WW_ECO).publish_state(value);
              return;
            }
            // if(ei->Name == "ZWISCHENEINSPRITZUNG_ISTTEMP") {
            //   id(ZWISCHENEINSPRITZUNG_ISTTEMP).publish_state(std::stoi(value));
            //   return;
            // }
            if(ei->Name == "EVU_SPERRE_AKTIV") {
              id(EVU_SPERRE_AKTIV_MANAGER).publish_state(std::stoi(value));
              return;
            }

#########################################
#                                       #
#   HEIZMODUL Nachrichten               #
#                                       #
#########################################
    - can_id: 0x500
      then:
        - lambda: |-
            unsigned short canId = 500;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

            if(ei->Name == "VERDAMPFERTEMP") {
              id(VERDAMPFERTEMP).publish_state(std::stof(value));
              return;
            }
            if(ei->Name == "INITIALISIERUNG") {
              id(INITIALISIERUNG_HEIZMODUL).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "SPEICHER_STATUS") {
              id(SPEICHER_STATUS).publish_state(std::stoi(value));
              return;
            }
            // if(ei->Name == "RUECKLAUFISTTEMP") {
            //   id(RUECKLAUFISTTEMP).publish_state(std::stof(value));
            //   return;
            // }
            if(ei->Name == "VERDICHTER") {
              id(VERDICHTER_HEIZMODUL).publish_state(std::stof(value));
              return;
            }
            // if(ei->Name == "WPVORLAUFIST") {
            //   id(WPVORLAUFIST).publish_state(std::stof(value));
            //   return;
            // }
            if(ei->Name == "ABTAUUNGAKTIV") {
              id(ABTAUUNGAKTIV).publish_state(std::stoi(value));
              return;
            }
            // if(ei->Name == "BETRIEBSART_WP") {
            //   id(ABTAUUNGAKTIV).publish_state(std::stoi(value));
            //   return;
            // }
            if(ei->Name == "EL_AUFNAHMELEISTUNG_HEIZ_SUM_KWH") {
              id(EL_AUFNAHMELEISTUNG_HEIZ_SUM_KWH).publish_state(std::stoi(value));
              id(EL_AUFNAHMELEISTUNG_HEIZ_SUM).publish_state(id(EL_AUFNAHMELEISTUNG_HEIZ_SUM_MWH).state + id(EL_AUFNAHMELEISTUNG_HEIZ_SUM_KWH).state / 1000 );
              update_COP_HEIZ();
              update_COP_GESAMT();
              return;
            }
            if(ei->Name == "EL_AUFNAHMELEISTUNG_HEIZ_TAG_WH") {
              id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_WH).publish_state(std::stoi(value));
              id(EL_AUFNAHMELEISTUNG_HEIZ_TAG).publish_state(id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_KWH).state + id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_WH).state / 1000);
              id(EL_AUFNAHMELEISTUNG_HEIZ_INCREASING).publish_state(id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_KWH).state + id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_WH).state / 1000);
              return;
            }
            if(ei->Name == "EL_AUFNAHMELEISTUNG_WW_SUM_KWH") {
              id(EL_AUFNAHMELEISTUNG_WW_SUM_KWH).publish_state(std::stoi(value));
              id(EL_AUFNAHMELEISTUNG_WW_SUM).publish_state(id(EL_AUFNAHMELEISTUNG_WW_SUM_MWH).state + id(EL_AUFNAHMELEISTUNG_WW_SUM_KWH).state / 1000);
              update_COP_WW();
              update_COP_GESAMT();
              return;
            }
            if(ei->Name == "EL_AUFNAHMELEISTUNG_WW_TAG_WH") {
              id(EL_AUFNAHMELEISTUNG_WW_TAG_WH).publish_state(std::stoi(value));
              id(EL_AUFNAHMELEISTUNG_WW_TAG).publish_state(id(EL_AUFNAHMELEISTUNG_WW_TAG_KWH).state + id(EL_AUFNAHMELEISTUNG_WW_TAG_WH).state / 1000);
              id(EL_AUFNAHMELEISTUNG_WW_INCREASING).publish_state(id(EL_AUFNAHMELEISTUNG_WW_TAG_KWH).state + id(EL_AUFNAHMELEISTUNG_WW_TAG_WH).state / 1000);
           
              return;
            }
            if(ei->Name == "FATAL_ERROR") {
              id(FATAL_ERROR).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "FEHLER_PARAMETERSATZ_IWS") {
              id(FEHLER_PARAMETERSATZ_IWS).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "FEHLERMELDUNG") {
              id(FEHLERMELDUNG).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "HARDWARE_NUMMER") {
              id(HARDWARE_NUMMER_HEIZMODUL).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "INDEX_NOT_FOUND") {
              id(INDEX_NOT_FOUND_HEIZMODUL).publish_state(std::stoi(value));
              return;
            }
            if(ei->Name == "K_OS_RMX_RESERVE_INFO3") {
              id(K_OS_RMX_RESERVE_INFO3).publish_state(std::stoi(value));
              return;
            }
            // if(ei->Name == "LZ_VERD_1_2_WW_BETRIEB") {
            //   id(LZ_VERD_1_2_WW_BETRIEB_HEIZMODUL).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_WW_BETRIEB") {
            //   id(LZ_VERD_1_WW_BETRIEB_HEIZMODUL).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_2_WW_BETRIEB") {
            //   id(LZ_VERD_2_WW_BETRIEB_HEIZMODUL).publish_state(std::stoi(value));
            //   return;
            // }
            if(ei->Name == "PARAMETERSATZ") {
              id(PARAMETERSATZ_HEIZMODUL).publish_state(std::stoi(value));
              return;
            }
            // if(ei->Name == "SCHALTFKT_IWS") {
            //   id(SCHALTFKT_IWS).publish_state(std::stoi(value));
            //   return;
            // }
            if(ei->Name == "SOFTWARE_NUMMER") {
              id(SOFTWARE_NUMMER_HEIZMODUL).publish_state(std::stoi(value));
              return;
            }
            // if(ei->Name == "SOLAR_KOLLEKTOR_3_I_ANTEIL") {
            //   id(SOLAR_KOLLEKTOR_3_I_ANTEIL).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "STUETZSTELLE_HD1") {
            //   id(STUETZSTELLE_HD1).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "STUETZSTELLE_HD2") {
            //   id(STUETZSTELLE_HD2).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "STUETZSTELLE_ND1") {
            //   id(STUETZSTELLE_ND1).publish_state(std::stoi(value));
            //   return;
            // }
            // if(ei->Name == "STUETZSTELLE_ND2") {
            //   id(STUETZSTELLE_ND2).publish_state(std::stoi(value));
            //   return;
            // }
            if(ei->Name == "WAERMEERTRAG_2WE_HEIZ_SUM_KWH") {
              id(WAERMEERTRAG_2WE_HEIZ_SUM_KWH).publish_state(std::stoi(value));
              id(WAERMEERTRAG_2WE_HEIZ_SUM).publish_state(id(WAERMEERTRAG_2WE_HEIZ_SUM_MWH).state+id(WAERMEERTRAG_2WE_HEIZ_SUM_KWH).state/1000);           
              return;
            }
            if(ei->Name == "WAERMEERTRAG_2WE_WW_SUM_KWH") {
              id(WAERMEERTRAG_2WE_WW_SUM_KWH).publish_state(std::stoi(value));
              id(WAERMEERTRAG_2WE_WW_SUM).publish_state(id(WAERMEERTRAG_2WE_WW_SUM_MWH).state+id(WAERMEERTRAG_2WE_WW_SUM_KWH).state/1000);           
              return;
            }
            if(ei->Name == "WAERMEERTRAG_HEIZ_SUM_KWH") {
              id(WAERMEERTRAG_HEIZ_SUM_KWH).publish_state(std::stoi(value));
              id(WAERMEERTRAG_HEIZ_SUM).publish_state(id(WAERMEERTRAG_HEIZ_SUM_MWH).state+id(WAERMEERTRAG_HEIZ_SUM_KWH).state/1000);
              update_COP_HEIZ();
              update_COP_GESAMT();
              return;
            }
            if(ei->Name == "WAERMEERTRAG_HEIZ_TAG_WH") {
              id(WAERMEERTRAG_HEIZ_TAG_WH).publish_state(std::stoi(value));
              id(WAERMEERTRAG_HEIZ_TAG).publish_state(id(WAERMEERTRAG_HEIZ_TAG_KWH).state+id(WAERMEERTRAG_HEIZ_TAG_WH).state/1000);      
              id(WAERMEERTRAG_HEIZ_INCREASING).publish_state(id(WAERMEERTRAG_HEIZ_TAG_KWH).state+id(WAERMEERTRAG_HEIZ_TAG_WH).state/1000);           
     
              return;
            }
            if(ei->Name == "WAERMEERTRAG_WW_SUM_KWH") {
              id(WAERMEERTRAG_WW_SUM_KWH).publish_state(std::stoi(value));
              id(WAERMEERTRAG_WW_SUM).publish_state(id(WAERMEERTRAG_WW_SUM_MWH).state+id(WAERMEERTRAG_WW_SUM_KWH).state/1000);
              update_COP_WW();
              update_COP_GESAMT();
              return;
            }
            if(ei->Name == "WAERMEERTRAG_WW_TAG_WH") {
              id(WAERMEERTRAG_WW_TAG_WH).publish_state(std::stoi(value));
              id(WAERMEERTRAG_WW_TAG).publish_state(id(WAERMEERTRAG_WW_TAG_KWH).state+id(WAERMEERTRAG_WW_TAG_WH).state/1000);
              id(WAERMEERTRAG_WW_INCREASING).publish_state(id(WAERMEERTRAG_WW_TAG_KWH).state+id(WAERMEERTRAG_WW_TAG_WH).state/1000);           
           
              return;
            }
            if(ei->Name == "EL_AUFNAHMELEISTUNG_HEIZ_SUM_MWH") {
              id(EL_AUFNAHMELEISTUNG_HEIZ_SUM_MWH).publish_state(std::stod(value));
              id(EL_AUFNAHMELEISTUNG_HEIZ_SUM).publish_state(id(EL_AUFNAHMELEISTUNG_HEIZ_SUM_MWH).state+id(EL_AUFNAHMELEISTUNG_HEIZ_SUM_KWH).state/1000);
              update_COP_HEIZ();
              update_COP_GESAMT();
              return;
            }
            if(ei->Name == "EL_AUFNAHMELEISTUNG_HEIZ_TAG_KWH") {
              id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_KWH).publish_state(std::stod(value));
              id(EL_AUFNAHMELEISTUNG_HEIZ_TAG).publish_state(id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_KWH).state+id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_WH).state/1000);      
              id(EL_AUFNAHMELEISTUNG_HEIZ_INCREASING).publish_state(id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_KWH).state + id(EL_AUFNAHMELEISTUNG_HEIZ_TAG_WH).state / 1000);
              return;
            }
            if(ei->Name == "EL_AUFNAHMELEISTUNG_WW_SUM_MWH") {
              id(EL_AUFNAHMELEISTUNG_WW_SUM_MWH).publish_state(std::stod(value));
              id(EL_AUFNAHMELEISTUNG_WW_SUM).publish_state(id(EL_AUFNAHMELEISTUNG_WW_SUM_MWH).state+id(EL_AUFNAHMELEISTUNG_WW_SUM_KWH).state/1000);
              update_COP_WW();
              update_COP_GESAMT();
              return;
            }
            if(ei->Name == "EL_AUFNAHMELEISTUNG_WW_TAG_KWH") {
              id(EL_AUFNAHMELEISTUNG_WW_TAG_KWH).publish_state(std::stod(value));
              id(EL_AUFNAHMELEISTUNG_WW_TAG).publish_state(id(EL_AUFNAHMELEISTUNG_WW_TAG_KWH).state+id(EL_AUFNAHMELEISTUNG_WW_TAG_WH).state/1000);      
              id(EL_AUFNAHMELEISTUNG_WW_INCREASING).publish_state(id(EL_AUFNAHMELEISTUNG_WW_TAG_KWH).state + id(EL_AUFNAHMELEISTUNG_WW_TAG_WH).state / 1000);
              return;
            }
            if(ei->Name == "WAERMEERTRAG_2WE_HEIZ_SUM_MWH") {
              id(WAERMEERTRAG_2WE_HEIZ_SUM_MWH).publish_state(std::stod(value));
              id(WAERMEERTRAG_2WE_HEIZ_SUM).publish_state(id(WAERMEERTRAG_2WE_HEIZ_SUM_MWH).state+id(WAERMEERTRAG_2WE_HEIZ_SUM_KWH).state/1000);           
              return;
            }
            if(ei->Name == "WAERMEERTRAG_2WE_WW_SUM_MWH") {
              id(WAERMEERTRAG_2WE_WW_SUM_MWH).publish_state(std::stod(value));
              id(WAERMEERTRAG_2WE_WW_SUM).publish_state(id(WAERMEERTRAG_2WE_WW_SUM_MWH).state+id(WAERMEERTRAG_2WE_WW_SUM_KWH).state/1000);           
              return;
            }
            if(ei->Name == "WAERMEERTRAG_HEIZ_SUM_MWH") {
              id(WAERMEERTRAG_HEIZ_SUM_MWH).publish_state(std::stod(value));
              id(WAERMEERTRAG_HEIZ_SUM).publish_state(id(WAERMEERTRAG_HEIZ_SUM_MWH).state+id(WAERMEERTRAG_HEIZ_SUM_KWH).state/1000);
              update_COP_HEIZ();
              update_COP_GESAMT();
              return;
            }
            if(ei->Name == "WAERMEERTRAG_HEIZ_TAG_KWH") {
              id(WAERMEERTRAG_HEIZ_TAG_KWH).publish_state(std::stod(value));
              id(WAERMEERTRAG_HEIZ_TAG).publish_state(id(WAERMEERTRAG_HEIZ_TAG_KWH).state+id(WAERMEERTRAG_HEIZ_TAG_WH).state/1000);
              id(WAERMEERTRAG_HEIZ_INCREASING).publish_state(id(WAERMEERTRAG_HEIZ_TAG_KWH).state+id(WAERMEERTRAG_HEIZ_TAG_WH).state/1000);           
           
              return;
            }
            if(ei->Name == "WAERMEERTRAG_WW_SUM_MWH") {
              id(WAERMEERTRAG_WW_SUM_MWH).publish_state(std::stod(value));
              id(WAERMEERTRAG_WW_SUM).publish_state(id(WAERMEERTRAG_WW_SUM_MWH).state+id(WAERMEERTRAG_WW_SUM_KWH).state/1000);           
              return;
            }
            if(ei->Name == "WAERMEERTRAG_WW_TAG_KWH") {
              id(WAERMEERTRAG_WW_TAG_KWH).publish_state(std::stod(value));
              id(WAERMEERTRAG_WW_TAG).publish_state(id(WAERMEERTRAG_WW_TAG_KWH).state+id(WAERMEERTRAG_WW_TAG_WH).state/1000);           
              id(WAERMEERTRAG_WW_INCREASING).publish_state(id(WAERMEERTRAG_WW_TAG_KWH).state+id(WAERMEERTRAG_WW_TAG_WH).state/1000);           

              return;
            }
            // if(ei->Name == "LZ_VERD_1_2_HEIZBETRIEB") {
            //   id(LZ_VERD_1_2_HEIZBETRIEB_HEIZMODUL).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_2_KUEHLBETRIEB") {
            //   id(LZ_VERD_1_2_KUEHLBETRIEB_HEIZMODUL).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_HEIZBETRIEB") {
            //   id(LZ_VERD_1_HEIZBETRIEB_HEIZMODUL).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_1_KUEHLBETRIEB") {
            //   id(LZ_VERD_1_KUEHLBETRIEB_HEIZMODUL).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_2_HEIZBETRIEB") {
            //   id(LZ_VERD_2_HEIZBETRIEB_HEIZMODUL).publish_state(std::stod(value));
            //   return;
            // }
            // if(ei->Name == "LZ_VERD_2_KUEHLBETRIEB") {
            //   id(LZ_VERD_2_KUEHLBETRIEB_HEIZMODUL).publish_state(std::stod(value));
            //   return;
            // }
            if(ei->Name == "GERAETE_ID") {
              id(GERAETE_ID_HEIZMODUL).publish_state(value);
              return;
            }

#########################################
#                                       #
#   Sonstige Nachrichten                #
#                                       #
#########################################
    - can_id: 0x000
      then:
        - lambda: |-
            unsigned short canId = 000;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

    - can_id: 0x100
      then:
        - lambda: |-
            unsigned short canId = 100;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);
        
    - can_id: 0x301
      then:
        - lambda: |-
            unsigned short canId = 301;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

    - can_id: 0x302
      then:
        - lambda: |-
            unsigned short canId = 302;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

    - can_id: 0x509
      then:
        - lambda: |-
            unsigned short canId = 509;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);
  
    - can_id: 0x514
      then:
        - lambda: |-
            unsigned short canId = 514;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

    - can_id: 0x601
      then:
        - lambda: |-
            unsigned short canId = 601;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

    - can_id: 0x602
      then:
        - lambda: |-
            unsigned short canId = 602;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

    - can_id: 0x603
      then:
        - lambda: |-
            unsigned short canId = 603;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

    - can_id: 0x680
      then:
        - lambda: |-
            unsigned short canId = 680;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

    - can_id: 0x700
      then:
        - lambda: |-
            unsigned short canId = 700;
            std::string value;
            const ElsterIndex* ei = processCanMessage(canId, value, x);

Meine Input-Numbers & Templates

Einige der Templates für das Wetter findest du im Blog-Beitrag dazu, die übrigens Helfer (wenn auch nicht alle) lasse ich dir hier mal als Datei da:

sensor:
- platform: template
  sensors:
    programmschalter_with_icon:
      friendly_name: "Programmschalter with Icon"
      value_template: "{{ states('sensor.heatingpump_programmschalter') }}"
      icon_template: >-
        {% if is_state('sensor.heatingpump_programmschalter', 'Notbetrieb') %}
          mdi:power-off
        {% elif is_state('sensor.heatingpump_programmschalter', 'Bereitschaft') %}
          mdi:flash
        {% elif is_state('sensor.heatingpump_programmschalter', 'Automatik') %}
          mdi:weather-sunny
        {% elif is_state('sensor.heatingpump_programmschalter', 'Tagbetrieb') %}
          mdi:white-balance-sunny
        {% elif is_state('sensor.heatingpump_programmschalter', 'Absenkbetrieb') %}
          mdi:thermometer-chevron-down
        {% elif is_state('sensor.heatingpump_programmschalter', 'Warmwasser') %}
          mdi:water
        {% else %}
          mdi:help-circle
        {% endif %}
    sommerbetrieb_text:
      unique_id: 0c0078f8-8347-4b47-8bff-8510815b71f3
      friendly_name: "Betriebsart"
      value_template: >-
        {% if is_state('sensor.sommerbetrieb', 'on') %}
          Sommerbetrieb
        {% else %}
          Normalbetrieb
        {% endif %}
      icon_template: >-
        {% if is_state('sensor.sommerbetrieb', 'on') %}
          mdi:white-balance-sunny
        {% else %}
          mdi:circle-outline
        {% endif %}
    waermepumpe_status:
      friendly_name: "Wärmepumpe Status"
      value_template: >-
        {% if is_state('sensor.heatingpump_abtauungaktiv', '768') %}
          Abtauen
        {% elif is_state('sensor.heatingpump_teilvorrang_ww', '256') %}
          Warmwasser-Vorrang
        {% elif is_state('sensor.heatingpump_abtauungaktiv', '512') or is_state('sensor.heatingpump_abtauungaktiv', '256') %}
          Läuft
        {% elif is_state('sensor.heatingpump_abtauungaktiv', '0') %}
          Standby
        {% else %}
          Unbekannt
        {% endif %}
      icon_template: >-
        {% if is_state('sensor.heatingpump_abtauungaktiv', '768') %}
          mdi:car-defrost-rear
        {% elif is_state('sensor.heatingpump_abtauungaktiv', '512') or is_state('sensor.heatingpump_abtauungaktiv', '256') %}
          mdi:heat-pump-outline
        {% elif is_state('sensor.heatingpump_abtauungaktiv', '0') %}
          mdi:power-standby
        {% else %}
          mdi:help-box-outline
        {% endif %}
input_number:
  speichersolltemp2_set:
    name: "SPEICHERSOLLTEMP2_SET"
    initial: 20
    min: 20
    max: 60
    mode: box
    step: 1
    unit_of_measurement: "°C"
    icon: mdi:thermometer-low
  speichersolltemp_set:
    name: "SPEICHERSOLLTEMP_SET"
    initial: 20
    min: 20
    max: 60
    mode: box
    step: 1
    unit_of_measurement: "°C"
    icon: mdi:thermometer-high
  raumsolltemp_i_set:
    name: "RAUMSOLLTEMP_I_SET"
    initial: 20
    min: 20
    max: 60
    mode: box
    step: 1
    unit_of_measurement: "°C"
    icon: mdi:thermometer-high
  raumsolltemp_nacht_set:
    name: "RAUMSOLLTEMP_NACHT_SET"
    initial: 20
    min: 20
    max: 60
    mode: box
    step: 1
    unit_of_measurement: "°C"
    icon: mdi:thermometer-high

Diese Packst du in /homeassistant/packages/ha_stiebel_control.yaml und fügst danach (falls noch nicht vorhanden) den Eintrag in diene Configuration.yaml hinzu:

homeassistant:
  packages: !include_dir_named packages

Nach einem Neustart sollten die Helfer angelegt sein!

Dashboard

Und hier noch, der Code des Keller-Dashboards (mit Apex-Charts)

Um solchen Dashboard-Code einzufügen, erstelle dir am besten ein den Einstellungen von Home Assistant zuerst ein neues Dashboard (Dann kannst du es auch einfach wieder löschen).

In diesem neuen Dashboard gehst du in den Bearbeiten-Modus, dann oben rechts in die Ecke (3 Punkte) und wählst den “Raw-Konfigurationseditor”.

Nun kannst du den Code einfügen und ggf. die Entitäts-IDs auf deine eigenen Anpassen. Suchen und ersetzen kannst du mit “STRG+F” (Windows) oder “CMD+F” (Mac).

views:
  - title: Heizungskeller
    path: heizungskeller
    icon: mdi:heating-coil
    cards: []
    badges:
      - type: entity
        show_name: false
        show_state: true
        show_icon: true
        entity: sensor.heatingpump_aussentemp
        color: ''
      - type: entity
        show_name: false
        show_state: true
        show_icon: true
        entity: sensor.programmschalter_with_icon
        color: ''
      - type: entity
        entity: sensor.sommerbetrieb_text
    type: sections
    sections:
      - type: grid
        cards:
          - type: heading
            heading: Übersicht
            heading_style: title
            icon: mdi:hvac
          - type: tile
            entity: sensor.waermepumpe_status
            name: Status
            state_content:
              - state
              - last_updated
            layout_options:
              grid_columns: 4
              grid_rows: 1
          - type: tile
            entity: sensor.heatingpump_datum
            name: Datum
          - type: tile
            entity: sensor.heatingpump_zeit
            name: Zeit
          - type: tile
            entity: select.heatingpump_programmschalter_set
            name: Programm ändern
          - type: tile
            entity: sensor.sommerbetrieb_text
          - type: tile
            entity: sensor.heatingpump_fatal_error
            color: red
            name: Fatal Error
            visibility:
              - condition: state
                entity: sensor.heatingpump_fatal_error
                state_not: '0'
          - type: tile
            entity: sensor.heatingpump_fehlermeldung
            name: Fehlermeldung
            color: red
            visibility:
              - condition: state
                entity: sensor.heatingpump_fehlermeldung
                state_not: '0'
          - type: heading
            heading: Optimierung
            heading_style: title
            icon: mdi:transmission-tower-export
          - type: tile
            entity: input_datetime.start_wp_uberbuchung
            layout_options:
              grid_columns: full
          - type: tile
            entity: input_number.wp_gewunschte_rt_max_temp
          - type: tile
            entity: input_number.wp_gewunschte_ww_max_temp
          - show_current: true
            show_forecast: true
            type: weather-forecast
            entity: weather.forecast_home
            forecast_type: hourly
            name: met.no
          - show_current: true
            show_forecast: true
            type: weather-forecast
            entity: weather.openweathermap
            forecast_type: hourly
            name: OpenWeatherMap
      - type: grid
        cards:
          - type: heading
            heading: Warmwasser
            heading_style: title
            icon: mdi:thermometer-water
          - type: custom:swipe-card
            cards:
              - type: custom:apexcharts-card
                apex_config:
                  chart:
                    stacked: true
                  xaxis:
                    labels:
                      format: HH
                  legend:
                    show: false
                graph_span: 1d
                span:
                  end: day
                show:
                  last_updated: false
                header:
                  show: true
                  show_states: true
                  colorize_states: true
                series:
                  - entity: sensor.heatingpump_el_aufnahmeleistung_ww_increasing
                    name: Aufnahmeleistung
                    type: area
                    group_by:
                      func: max
                      duration: 1h
                    show:
                      datalabels: false
                  - entity: sensor.heatingpump_waermeertrag_ww_increasing
                    name: Wärmeertrag
                    type: area
                    group_by:
                      func: max
                      duration: 1h
                    show:
                      datalabels: false
              - type: custom:apexcharts-card
                apex_config:
                  chart:
                    stacked: true
                  xaxis:
                    labels:
                      format: dd
                  legend:
                    show: false
                graph_span: 7d1s
                span:
                  end: day
                show:
                  last_updated: false
                header:
                  show: true
                  show_states: true
                  colorize_states: true
                series:
                  - entity: sensor.heatingpump_el_aufnahmeleistung_ww_increasing
                    name: Aufnahmeleistung
                    type: column
                    group_by:
                      func: max
                      duration: 1d
                    show:
                      datalabels: true
                  - entity: sensor.heatingpump_waermeertrag_ww_increasing
                    name: Wärmeertrag
                    type: column
                    group_by:
                      func: max
                      duration: 1d
                    show:
                      datalabels: true
          - type: custom:apexcharts-card
            header:
              show: true
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 1
              curve: stepline
            series:
              - entity: sensor.heatingpump_speicheristtemp
                name: Ist
              - entity: sensor.heatingpump_speichersolltemp
                name: Soll
          - type: tile
            entity: input_number.warmwassersoll_standard
            layout_options:
              grid_columns: full
          - type: tile
            entity: sensor.heatingpump_einstell_speichersolltemp
          - type: tile
            entity: sensor.heatingpump_einstell_speichersolltemp2
          - type: tile
            entity: input_number.speichersolltemp_set
            name: Set Speichersolltemp
          - type: tile
            entity: input_number.speichersolltemp2_set
            name: Set Speichersolltemp2
      - type: grid
        cards:
          - type: heading
            heading: Heizung
            heading_style: title
            icon: mdi:heating-coil
          - type: custom:swipe-card
            cards:
              - type: custom:apexcharts-card
                apex_config:
                  chart:
                    stacked: true
                  xaxis:
                    labels:
                      format: HH
                  legend:
                    show: false
                graph_span: 1d
                span:
                  end: day
                show:
                  last_updated: false
                header:
                  show: true
                  show_states: true
                  colorize_states: true
                series:
                  - entity: sensor.heatingpump_el_aufnahmeleistung_heiz_increasing
                    name: Aufnahmeleistung
                    type: area
                    group_by:
                      func: max
                      duration: 1h
                    show:
                      datalabels: false
                  - entity: sensor.heatingpump_waermeertrag_heiz_increasing
                    name: Wärmeertrag
                    type: area
                    group_by:
                      func: max
                      duration: 1h
                    show:
                      datalabels: false
              - type: custom:apexcharts-card
                apex_config:
                  chart:
                    stacked: true
                  xaxis:
                    labels:
                      format: dd
                  legend:
                    show: false
                graph_span: 7d1s
                span:
                  end: day
                show:
                  last_updated: false
                header:
                  show: true
                  show_states: true
                  colorize_states: true
                series:
                  - entity: sensor.heatingpump_el_aufnahmeleistung_heiz_increasing
                    name: Aufnahmeleistung
                    type: column
                    group_by:
                      func: max
                      duration: 1d
                    show:
                      datalabels: true
                  - entity: sensor.heatingpump_waermeertrag_heiz_increasing
                    name: Wärmeertrag
                    type: column
                    group_by:
                      func: max
                      duration: 1d
                    show:
                      datalabels: true
          - type: custom:apexcharts-card
            header:
              show: true
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 1
              curve: smooth
            series:
              - entity: sensor.heatingpump_ruecklaufisttemp_kessel
                name: Rücklauf Ist
              - entity: sensor.heatingpump_hilfskesselsoll
                name: Rücklauf Soll
          - type: tile
            entity: input_number.raumsoll_tag_standard
            layout_options:
              grid_columns: full
          - type: tile
            entity: sensor.heatingpump_raumsolltemp_i
            name: WP Raumsoll Tag
          - type: tile
            entity: sensor.heatingpump_raumsolltemp_nacht
            name: WP Raumsoll Nacht
          - type: tile
            entity: input_number.raumsolltemp_i_set
            name: Set Raumsoll Tag
            icon: mdi:cog-play-outline
          - type: tile
            entity: input_number.raumsolltemp_nacht_set
            name: Set Raumsoll Nacht
            icon: mdi:cog-play-outline
    max_columns: 3

Fazit

Zusammenfassend lässt sich sagen, dass die Umrüstung meiner 14 Jahre alten Wärmepumpe mit Home Assistant nicht nur meine Heizkosten gesenkt hat, sondern auch den Komfort in meinem Zuhause erheblich verbessert hat.

Wenn ich das schaffen kann, kannst du das auch! Ich hoffe, meine Erfahrungen inspirieren dich, deine eigenen Smart Home-Projekte anzugehen.

Aber trotzdem, nur um es nochmal zu erwähnen: Wenn du dir wochenlanges rumprobieren sparen willst, lohnt sich die Investition in ein Herstellereigenes-Gateway höchstwahrscheinlich doch.

Vergiss nicht, den Kanal zu abonnieren und die Glocke zu aktivieren, um keine weiteren Tipps und Tricks zu verpassen!

Verpasse keine Tipps!

Ich senden keinen Spam! Erfahre mehr in der Datenschutzerklärung.

Transparenz: In diesem Artikel sind Partnerlinks enthalten. Durch einen Klick darauf ge­lan­gt ihr direkt zum Anbieter. Solltet ihr euch dort für einen Kauf entscheiden, erhalte ich ei­ne kleine Provision. Für euch ändert sich am Preis nichts & Partnerlinks haben keinerlei Einfluss auf meine Berichterstattung. Vielen Dank für deine Unterstützung!

Gründer von simon42. Schreibt hier ehrlich und leidenschaftlich über Smart Home und Technik Themen, denn das Zuhause wurde bereits von Sprachassistenten übernommen und die Kontrolle abgegeben 😁

Nennenswerte Antworten

  1. Avatar for olbu olbu says:

    Hallo Zusammen,

    Spannend das so etwas geht, denn in der Gateway Kompatibilitätsliste ist z.B. mein Modell nicht dabei (nur der Nachfolger mit dem 3er Modul). Auf jeden Fall vielen Dank für die Informationen zum Einstieg,

    Geht das Projekt jemand an? Ich habe eine Stiebel Eltron WPW 10 (Grundwasserwärmepumpe aus 2008). Sie scheint diesen WPM-2 verbaut zu haben, also auch über diesen CANBUS zu funktionieren. Naiv habe ich die Hardware mal eben bestellt. Die Anleitung im Video und im Blog ist etwas dürftig. Würde mich wohler fühlen, wenn ich mich nicht alleine durch das Thema quälen müsste und suche Leidensgenossen.

    VG,
    Oliver

  2. Hallo Oliver,

    ich habe das Video auch gerade gesehen. Und werde mich dem Thema auch annehmen. Habe einen WPW18m und auch dem WPM-2.

    Gruß
    Dennis

  3. Avatar for olbu olbu says:

    Vielleicht können wir uns gegenseitig hier etwas auf dem Laufenden halte. Ich bin nur eine Woche unterwegs. Das Wochenende darauf würde ich gerne mal zumindest die Hardware löten und an die WP anschließen… Keine Ahnung wie es dann weitergeht. Wenn ich in dem Video von “Adressen” höre. Sind die indviduell? Wie finde ich die raus? Wie lausche ich am Bus und gebe mir den Input aus… viele Fragen noch… Vermutlich die Antwort in dem km langen Blog auf den Simon sich bezog

  4. Hab das Video gesehen, den Canbus Controller bestellt und wollte das heute mal ausprobieren. Die Verkabelung ist eine Sache, die richtigen Pins angeben ist schlecht verständlich.

    Aber das schlimmste ist, ich wollte es mal testen und hab die files in esphome kopiert, package folder angelegt und den Code eingetragen um in mal zu installieren. Bekomme hie aber jede Menge Fehlermeldungen wie zb.

    src/heatingpump.h:123:8: error: 'cop_water' was not declared in this scope
         id(cop_water).publish_state((id(HEATING_DHW_DAY_KWH).state) / id(ELECTRICITY_INTAKE_DHW_DAY_KWH).state);
            ^~~~~~~~~
    src/heatingpump.h:123:37: error: 'HEATING_DHW_DAY_KWH' was not declared in this scope
    

    Die Files findet er also aber ich hab keine Ahnung warum der Fehler wirft.

    Hatte da jemand meh Glück mit?

  5. Hallo Skycryer,
    ich hatte das Problem auch und ich verstehe den Chaos in Github nicht!

    Du musst den Inhalt aus der Datei heatingpump_en_prod.yaml nehmen. In der Datei heatingpump.yaml sind Funktionen mit deutschen Namen enthalten während die Datei heatingpump.h, die in dem Ordner stiebeltools abliegt, englische Funktionsname führt. Da die Verweise natürlich falsch sind findet der Compiler die Funktionen nicht und geht auf Error.

    Ich hoffe ich konnte dir helfen.

    Gruß
    Viktor

Setze die Diskussion fort unter community.simon42.com

33 mehr antworten

Teilnehmer

Avatar for system Avatar for simon42 Avatar for anilini Avatar for Runningelmi Avatar for mragain Avatar for olbu Avatar for plh4 Avatar for demrios Avatar for Dennis84 Avatar for skycryer Avatar for v-vilex Avatar for RobertW Avatar for kilhaasi Avatar for Rocket

44 Gedanken zu „Wie ich eine 14 Jahre alte Wärmepumpe mit Home Assistant smart gemacht habe“

  1. Hallo Zusammen

    Ich hatte das selbe Problem wie oben schon erwähnt:
    “error: ‘cop_water’ was not declared in this scope”
    Die Lösung mit dem Inhalt aus der Datei “heatingpump_en_prod.yaml” anstelle die oben aufgelistete “heatingpump.yaml” zu nehme hat bei mir auf anhieb Funktioniert. Nun kann ich diverse Werte aus meiner ebenfalls 14 Jahre alten Stiebel Eltron Wärmepumpe auslesen. 🙂
    Nun wollte ich das oben vorgeschlagene Dashboard ergänzen. Da dort natürlich nur die Deutschen begriffe verwendet werden funktioniert dies natürlich mit dem Englischen begriffen vom “heatingpump_en_prod.yaml” nicht.
    Ich hab versucht die Dateien umzuschreiben. Da die Begriffe nicht immer ganz klar sind und ich die Übersicht verloren habe, habe ich es wieder auf die Seite gelegt.
    @Simon könntest du die Deutschen umgeschriebenen stiebeltools Funktionen zur Verfügung stellen?
    Oder verstehe ich Etwas falsch? 😉

    Vielen Dank Gruss Didi

    Antworten
  2. ja das ist schon richtig.

    Im Video wird es aber so dargestellt, dass wenn es gerade Effizient ist zu heizen (Weil die Außentemperatur gerade gut ist) du besonders mehr heizt. Also die Energie thermisch puffern. Um eben viel aus diesem effizienten Moment rauszuholen.

    thermisch zu puffern heißt aber auch den VL zu erhöhen. Und genau das macht deine gerade in dem Moment effiziente Heizung wieder etwas ineffizienter.

    deswegen kann sich dein System trotzdem lohnen aber das ist halt ein Fakt der erwähnt gehört.

    Antworten
    • Unbedingt, da kann ich dir nur zustimmen 🙂

      Die Auswertung steht noch an, aber aktuell sieht es nach 25-30 % Einsparung (für unseren ganz konkreten Fall) aus 🎉

  3. Hallo 🙂
    vielen Dank für das Video und vor allem die Automationen!
    Ich möchte die Automationen gern nachbauen aber finde die Code Snippets hier nicht. Kannst Du die noch hochladen?
    Danke und LG Anna

    Antworten
  4. Moin,

    ich glaube du hast an etwas hier nicht gedacht. Du sagst, die WP wird ineffizienter jeh kälter es außen ist. Das ist leider nur die halbe Wahrheit.
    Sie wird nämlich auch ineffizienter wenn der Vorlauf erhöht wird.

    Was maßgeblich die Effizienz bestimmt ist die Differenz zwischen Außentemperatur und Vorlauf.

    Du machst deine WP effizienter, wenn du am wärmsten Zeitpunk heizt aber auch ineffizienten wenn du am wärmsten Zeitpunkt Temperaturen erhöhst.

    Das heißt nicht, dass sich dein System nicht lohnt. Aber es ist nicht so effizient wie im Video dargestellt.

    Falls die Außentemperatur von +10 auf -10 sinkt und du gleichzeitig auf die Idee kommst die Raumtemperatur um 30 Grad abzusenken wird die WP sogar effizienter trotz sinkender Außentemp. Aber das Beispiel ist natürlich nur konstruiert 🙂

    Was dem aber zu Gute kommt ist, dass der wärmste Zeitpunkt am Tag auch der ist wo der Strom am billigsten ist und die PV am meisten liefert.

    Allgemein könnte man noch mehr auf den Strompreis achten, denn wenn die Strom günstig/kostenlos ist kann einem die Effizienz ziemlich egal sein. Aber damit macht man sich natürlich die JAZ kaputt.

    Antworten
    • Doch, habe ich. Sie wird nämlich ineffizienter, je kälter es draußen ist und je kälter es draußen ist, desto wärmer muss auch das Wasser gemacht werden. Also die Differenz wird immer höher und dadurch immer ineffizienter.

      Wenn ich den RL-Soll tagsüber erhöhe, verschiebt sich nur die „eine Seite“ in die schlechtere Richtung 😅

Schreibe einen Kommentar

Send this to a friend