Wirkungsgrad Berechnungen Home Assistant

Hallo Zusammen,

Ich bekomme von meiner Heizung die einzelnen Energiewerte in mein Home Assistant und möchte hieraus den Wirkungsgrad berechnen. Folgende Rechnungen würde ich gerne durchführen:

Gesamtenergie:

Gesamtenergie_Erzeugt = Erzeugte_Energie_Heizung + Erzeugte_Energie_Brauchwasser

Gesamtenergie_Eingebracht = Eingebrachte_Energie_Heizung + Eingebrachte_Energie_Brauchwasser

Erzeugte_Energie_Differenz:

Erzeugte_Energie_Differenz = Gesamtenergie_Erzeugt_Aktueller_Wert - Gesamtenergie_Erzeugt_Letzter_Wert

Eingebrachte_Energie_Differenz:

Eingebrachte_Energie_Differenz = Gesamtenergie_Eingebracht_Aktueller_Wert - Gesamtenergie_Eingebracht_Letzter_Wert

Wirkungsgrad:

Wirkungsgrad = Erzeugte_Energie_Differenz / Eingebrachte_Energie_Differenz

Leider bekomme ich dies nicht so recht hin. Es gibt entweder einen Fehler in der .yaml oder die Werte aktualisieren sich einfach nicht auf dem Dashboard. Wie könnte eine richtige Lösung aussehen? Hier mal mein Dashboard (Letzter Versuch, der Wert aktualisiert sich nicht) :

default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

influxdb:
  host: **************
  port: ***************
  database: ***************
  username: ***************
  password: ***************
  ssl: false
  verify_ssl: false
  max_retries: 3
  default_measurement: state

  tags:
    instance: prod
    source: hass

luxtronik:
  host: ***************
  port: ***************

input_number:
  wp_erzeugte_energie_previous_value:
    name: "Erzeugte Energie Vorheriger Wert"
    initial: 0
    min: 0
    max: 10000
    step: 0.01
  wp_eingesetzte_energie_previous_value:
    name: "Eingesetzte Energie Vorheriger Wert"
    initial: 0
    min: 0
    max: 10000
    step: 0.01


sensor:
  - platform: luxtronik
    sensors:
      - group: calculations
        id: ID_WEB_BIV_Stufe_akt
        friendly_name: Bivalenzstufe
        icon: mdi:step-forward-2
      - group: calculations
        id: ID_WEB_WP_BZ_akt
        friendly_name: Betriebszustand
        icon: mdi:state-machine
      - group: calculations 
        id: ID_WEB_Time_WPein_akt
        friendly_name: WP läuft seit
        icon: mdi:clock-start
      - group: calculations
        id: ID_WEB_Time_ZWE1_akt
        friendly_name: ZWE1 läuft seit
        icon: mdi:clock-start
      - group: calculations
        id: ID_WEB_Time_SSPEIN_akt
        friendly_name: 	SSP Ein
        icon: mdi:clock-start
      - group: calculations
        id: ID_WEB_Time_SSPAUS_akt
        friendly_name: 	SSP Aus
        icon: mdi:clock-start
      - group: calculations
        id: ID_WEB_Time_VDStd_akt
        friendly_name: VD Standby Zeit
        icon: mdi:clock-start
      - group: calculations
        id: ID_WEB_Time_HRM_akt
        friendly_name: HRM Zeit
        icon: mdi:clock-start
      - group: calculations
        id: ID_WEB_Time_HRW_akt
        friendly_name: 	HRW Zeit
        icon: mdi:clock-start
      - group: calculations
        id: ID_WEB_Time_LGS_akt
        friendly_name: TDI läuft seit
        icon: mdi:clock-start


  # Template-Sensoren
  - platform: template
    sensors:
      # Erzeugte Energie Differenz
       wp_erzeugte_energie_differenz:
        friendly_name: "WP Erzeugte Energie Differenz"
        unit_of_measurement: "kWh"
        value_template: >
          {% set previous = states('input_number.wp_erzeugte_energie_previous_value') | float(0) %}
          {% set current = states('sensor.wp_gesamtenergie_erzeugt') | float(0) %}
          {{ (current - previous) | round(2) }}

      # Eingesetzte Energie Differenz
       wp_eingesetzte_energie_differenz:
        friendly_name: "WP Eingesetzte Energie Differenz"
        unit_of_measurement: "kWh"
        value_template: >
          {% set previous = states('input_number.wp_eingesetzte_energie_previous_value') | float(0) %}
          {% set current = states('sensor.wp_gesamtenergie_eingebracht') | float(0) %}
          {{ (current - previous) | round(2) }}

      # Wirkungsgrad WP
       wp_wirkungsgrad_wp:
        friendly_name: "WP Wirkungsgrad"
        unit_of_measurement: ""
        value_template: >
          {% set erzeugt = states('sensor.wp_erzeugte_energie_differenz') | float(0) %}
          {% set eingesetzt = states('sensor.wp_eingesetzte_energie_differenz') | float(1) %}
          {% if eingesetzt > 0 %}
            {{ (erzeugt / eingesetzt) | round(2) }}
          {% else %}
            0
          {% endif %}

      # Bivalenzstufe Zahl
       wp_bivalenzstufe_zahl:
        friendly_name: "Bivalenzstufe Zahl"
        unit_of_measurement: ""
        value_template: >
          {% set bivalenzstufe = states('sensor.wp_bivalenzstufe') %}
          {% if bivalenzstufe == 'one compressor allowed to run' %}
            1  # one compressor allowed to run
          {% elif bivalenzstufe == 'two compressors allowed to run' %}
            2  # two compressors allowed to run
          {% elif bivalenzstufe == 'additional heat generator allowed' %}
            3  # Zusätzlicher Wärmeerzeuger darf mitlaufen
          {% else %}
            0  # Defaultwert, wenn keiner der Bedingungen zutrifft
          {% endif %}
		  
		  
		  
automation:	  
		  
		  
- id: '1741886598380'
  alias: Automatische Mail
  description: ''
  triggers:
  - entity_id: input_boolean.test_mail
    from: 'off'
    to: 'on'
    trigger: state
  - trigger: state
    entity_id:
    - sensor.wp_vl
    for:
      hours: 0
      minutes: 10
      seconds: 0
  conditions: []
  actions:
  - data:
      message: ***************
      title: ***************
      target: ***************
    action: ***************
  mode: single
- alias: Speichern des aktuellen Werts der Erzeugten Energie
  trigger:
  - platform: state
    entity_id: sensor.wp_gesamtenergie_erzeugt
  action:
  - service: input_number.set_value
    target:
      entity_id: input_number.wp_erzeugte_energie_previous_value
    data:
      value: '{{ states(''sensor.wp_gesamtenergie_erzeugt'') | float(0) }}'
  id: 3c4c3a58eea84c6ea9de08aa25ce2047
- alias: Speichern des aktuellen Werts der Eingesetzten Energie
  trigger:
  - platform: state
    entity_id: sensor.wp_gesamtenergie_eingebracht
  action:
  - service: input_number.set_value
    target:
      entity_id: input_number.wp_eingesetzte_energie_previous_value
    data:
      value: '{{ states(''sensor.wp_gesamtenergie_eingebracht'') | float(0)
        }}'
  id: 6a43db2ce27544ce90a9242f8bab5b7c

Hallo SPSler,

ich beschäftige mich seit einigen Tagen mit einer sehr ähnlichen Aufgabenstellung und habe es für mich weitgehend gelöst.
Vielleicht hilft Dir das Folgende im Sinne der “Hilfe zur Selbsthilfe”:

  • Was Du gepostet hast ist kein Dashboard, sondern Deine configuration.yaml
  • HA, yaml und Jinja als Templating Sprache sind extrem pingelig was Einrückungen und Syntax angeht, die Fehlermeldungen sind oft nur indirekt hilfreich - meistens läuft es oder eben nicht…
  • Auch Kommentare mit # können zu Fehlern führen, wenn sie an der falschen Stelle stehen, z.B. hinter anderem Code am Ende einer Zeile
  • Das ganze Gerödel mit Energie Differenzen kannst Du Dir m.E. sparen, weshalb ich auf Deinen Code nicht weiter eingehe
  • Du kannst mit den aktuellen Leistungswerten arbeiten, also W oder kW und nicht Wh oder kWh

Meine Logik ist folgende:
1.) wp_eletrische_leistung wird aus einem Fronius Smart Meter abgeleitet, über das die gesamte WP Anlage inkl. aller Zusatzaggregate und Pumpen läuft.
(Leider hat der Elektriker den Stromfluss “verpolt” - was noch geändert wird - d.h. die Leistung (W) ist negativ und ich drehe hier schlicht das Vorzeichen um… nur mal als Beispiel für einen sehr simplen aber funktionierenden Template-Sensor.)

2.) wp_thermische_leistung: wird berechnet aus dem Volumenstrom der WP (über die Viessmann ViCare Integration meiner Vitocal 252-A10 und der Temperaturdifferenz von Vorlauf und Rücklauf, unabhängig von der WP gemessen, über zwei DS18B20 Sensoren mit ESP Home)

3.) wp_cop: der aktuelle Wirkungsgrad ist dann einfach wp_thermische_leistung / wp_elektrische_leistung, gerundet auf drei Nachkommastellen

Diesen kann man dann in ein Dashboard integrieren, was aber etwas unschön ist, weil er als Verhältniszahl dimensionslos ist und deshalb keine “unit of measure” hat. Damit wird der Wert defaultmäßig als “state” angesehen und die Darstellung ist nicht das, was man sich wünschen würde… also keine Kurve, sondern ein Statusverlauf. Vielleicht hat hier jemand von den Experten einen Tipp wie man für einen dimensionslosen Template Sensor eine geeignete state_class setzt und wenn ja, welche…

Die Darstellung von wp_cop mit Grafana/InfluxDB ist aber überhaupt kein Problem - siehe Abbildungen unten:

Der Wirkungsgrad ist die graue Kurve, bezogen auf die rechte Skala.
Interessant ist, dass der COP bei Trinkwasserbereitung von ca. 4 auf fast 1 fällt, je mehr sich die Temperatur 55° nähert. Beim Heizbetrieb bleibt der COP fast konstant bei 4. Anhand des Volumenstroms und der Temperaturspreizung (unteres Bild) kann man sehr genau verfolgen, was die Pumpe gerade macht… :wink: [Heizung: geringes dT, Volumenstrom fast 1,5m³/h vs. Trinkwasser im ECO Modus: doppeltes dT aber ca. halber Volumenstrom 0,8m³/h]

Selbst die “Spikes” nach einer WP Laufphase machen Sinn. Wenn die WW Bereitung gestartet wird, beginnt zunächst die Pumpe in der WP (Grundfos UPM3) zu laufen. Das kalte Wasser aus dem Rohr im Garten führt zunächst zu einer “umgedrehten” Temperaturspreizung, d.h. Vorlauf kälter als Rücklauf.
Nach ca. 90s sind die 20L Wasser abgeflossen und der Verdichter startet. Es folgt eine schöne Darstellung dessen, was man aufgrund des Carnot Prozesses erwarten würden :slight_smile: [sorry, ich bin Physiker] Bei Erreichen der Solltemperatur wird zunächst der Verdichter abgeschaltet. In den ca. 90-120s Restlaufzeit, erzeugt die WP aus sehr wenig elektrischer Leistung (~33W für die Pumpe und Elektronik) sehr viel thermische Leistung aus der “Restwärme”, die durch die 20L Wasser noch ins Haus befördert werden. Was den COP angeht ist das beinahe eine “Division durch Null” (oder zumindest sehr wenig) und daher die Spikes…

Hier ein gekürzter Auszug aus meiner configuration.yaml mit den relevanten Stellen

sensor:
  - platform: template
    sensors:
    # Vorzeichen Leistungswert invertieren, weil Smart Meter falsch eingebaut!
      wp_elektrische_leistung:
        friendly_name: "WP Elektrische Leistung"
        unit_of_measurement: W
        device_class: power
        value_template: >
          {% set Leistung = states('sensor.smart_meter_ts_65a_3_warmepumpe_wirkleistung') | float %}
          {{ ( Leistung * -1 ) | round(3) }} 

    # Thermische Leistung P_th = Cp * m * dT
    # Cp: Wärmekapazität von Heizwasser: 4,18 kJ/(kg K) bzw. 4180 J/(kg K)
    # m: Massenstrom Heizwasser kg/s (berechnet sich aus: Volumenstrom/3600 * Dichte)
    # volumenstrom: Volumenstrom Heizwasser der Wärmepumpe m³/h
    # D: Dichte Heizwasser 998 kg/m3
    # VL: Vorlauftemperatur WP gemessen am Übergabepunkt im Haus °C
    # RL: Rücklauftemperatur WP gemessen am Übergabepunkt im Haus °C
    # dT: Temperaturdifferenz zw. VL - RL °C
      wp_thermische_leistung:
        friendly_name: "WP Thermische Leistung"
        unit_of_measurement: W
        device_class: power
        value_template: >
          {% set volumenstrom = states('sensor.e3_vitocal_volumenstrom') | float %}
          {% set Cp = 4180 | float %}
          {% set D = 998 | float %}
          {% set m = volumenstrom / 3600 * D | float %}
          {% set VL = states('sensor.wp_wp_vorlauf') | float %}          
          {% set RL = states('sensor.wp_wp_ruecklauf') | float %}
          {% set dT = VL - RL | float %}
          {% set P_th = Cp * m * dT | float %}   
          {{ ( P_th ) | round(3) }}

    # WP Coefficient of Performance
      wp_cop:
        friendly_name: "WP Coefficient of Performance"
        value_template: >
          {% set wp_thermische_leistung = states('sensor.wp_thermische_leistung') | float %}  
          {% set wp_elektrische_leistung = states('sensor.wp_elektrische_leistung') | float %}  
          {% set cop = ( wp_thermische_leistung / wp_elektrische_leistung ) | float %}
          {{ ( cop ) | round(3) }}

Schöne Grüße,
Guido