Energiedashboard berechnen von Einspeisung und Netzverbrauch

daspixel

New member
Liebes Forum
Durch die letzten Beiträge zu dem Thema habe ich mich durchgelesen, habe aber keine Lösung gefunden. Oder mich einfach zu doof angestellt ;)
Zum Problem:
Meine SolarLog-Integration spuckt nicht alle nötigen Werte für das Dashboard aus. Zur Berechnung habe ich mir für das Dashboard folgendes überlegt.

Definition:
Was produziert die Anlage in Watt
- sensor.solarlog_power_ac

Der aktuelle gesammtverbrauch im Haus in Watt
- sensor.solarlog_consumption_ac

Für das Dashboard:
Solarproduktion: sensor.solarlog_power_ac
- mit dem Riemannsummenintegral, funktioniert.

Netzverbrauch:
- sensor.solarlog_consumption_ac minus sensor.solarlog_power_ac. Der Wert soll nicht kleiner 0 sein. Wenn kleiner 0 -> Ausgabe 0. Wert als Summenintegral ins Dasboard.

Zurück zum Netz:
sensor.solarlog_power_ac minus sensor.solarlog_consumption_ac. Der Wert soll nicht kleiner 0 sein. Wenn kleiner 0 -> Ausgabe 0. Wert als Summenintegral ins Dasboard.

Meine (nicht funktionierende :rolleyes:) Lösung:

YAML:
# Eigener Sensor
template:
  - sensor:
      - name: "Einspeisung"
        unique_id: NetzeinspeisungNichtKleinerNull
        unit_of_measurement: W
        device_class: power
        value_template: >-
          {% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %}
          {{ 0 if power < 0 else power }}

  - sensor:
      - name: "Netzbezug"
        unique_id: NetzbezugNichtKleinerNull
        unit_of_measurement: W
        device_class: power
        value_template: >-
          {% set power = (states('sensor.solarlog_consumption_ac')|round ) -  (states('sensor.solarlog_power_ac')|round ) %}
          {{ 0 if power < 0 else power }}

Bitte habt erbarmen. Dies sind meine ersten Gehversuche in YAML ^^

Hier noch der Auszug aus den Logs:

YAML:
Logger: homeassistant.config
Source: config.py:859
First occurred: 11:38:09 (2 occurrences)
Last logged: 11:38:09

Invalid config for [template]: [value_template] is an invalid option for [template]. Check: template->sensor->0->value_template. (See /config/configuration.yaml, line 24).
Invalid config for [template]: [value_template] is an invalid option for [template]. Check: template->sensor->0->value_template. (See /config/configuration.yaml, line 33).

Danke für die Hilfe!
 
Zuletzt bearbeitet von einem Moderator:
Also zuerst einmal MUSS für das EnergieDashboard die "unit_of_measurment" wh sein und nicht w.
Weiterhin denke ich, das der gesamte Teil
Code:
 device_class: power
        value_template: >-
          {% set power = (states('sensor.solarlog_consumption_ac')|round ) -  (states('sensor.solarlog_power_ac')|round ) %}
          {{ 0 if power < 0 else power }}

nicht passt. Ich würde es so machen.

Code:
 device_class: Energy
 state_class: total_increasing
     state: >-
          {% set power = (states('sensor.solarlog_consumption_ac')|round ) -  (states('sensor.solarlog_power_ac')|round ) %}
          {{ 0 if power < 0 else power }}

Netzverbrauch:
- sensor.solarlog_consumption_ac minus sensor.solarlog_power_ac. Der Wert soll nicht kleiner 0 sein. Wenn kleiner 0 -> Ausgabe 0. Wert als Summenintegral ins Dasboard.
Das verwirrt mich. Wozu benötigst Du diesen Wert ?
Dashboard hat doch nur
- Was produziert die PV
- Was verbrauch ich gerade
- was geht davon ins öffentliche Netz
Daraus kann das Energie Dashboard selbst ermitteln, wieviel Du ins öffentliche Netz einspeist oder wieviel Energie Du dazu kaufen mußt.
 
Lieber RudiP

Danke für die schnelle Antwort. Ich versuche das so bald als möglich.
Die Werte brauche ich wohl leider doch. Wenn man nur den Verbrauch und die Produktion im Dashboard eingibt wird eben keine Rückspeisung ins Netz automatisch errechnet. Darum mein Umweg. Soweit habe ich das bis jetzt verstanden.

Melde mich :)
 
Logs:
YAML:
Logger: homeassistant.config
 Source: config.py:859
  First occurred: 16:16:37 (4 occurrences)
  Last logged: 16:18:47


  • YAML:
    Invalid config for [template]: [template] is an invalid option for [template]. Check: template->sensor->0->template. (See /config/configuration.yaml, line 24).
    Invalid config for [template]: [template] is an invalid option for [template]. Check: template->sensor->0->template. (See /config/configuration.yaml, line 34).
Ich habe Deinen Code so übernommen. Liegt da eventuell der Fehler?

YAML:
# Eigener Sensor
template:
  - sensor:
      - name: "Einspeisung"
        unique_id: NetzeinspeisungNichtKleinerNull
        unit_of_measurement: kW
        device_class: Energy
        state_class: total_increasing
        template: >-
          {% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %}
          {{ 0 if power < 0 else power }}

  - sensor:
      - name: "Netzbezug"
        unique_id: NetzbezugNichtKleinerNull
        unit_of_measurement: kW
        device_class: Energy
        state_class: total_increasing
        template: >-
          {% set power = (states('sensor.solarlog_consumption_ac')|round ) -  (states('sensor.solarlog_power_ac')|round ) %}
          {{ 0 if power < 0 else power }}

Edit:
unter template hat es nach dem Minuszeichen 2 Leerzeichen. Ist das korrekt?
 
Zuletzt bearbeitet von einem Moderator:
Lieber RudiP

Danke für die schnelle Antwort. Ich versuche das so bald als möglich.
Die Werte brauche ich wohl leider doch. Wenn man nur den Verbrauch und die Produktion im Dashboard eingibt wird eben keine Rückspeisung ins Netz automatisch errechnet. Darum mein Umweg. Soweit habe ich das bis jetzt verstanden.

Melde mich :)
Du brauchst nur 3 Werte und nicht 5. Und die 3 Werte hast Du, wie ich oben aufgeführt habe.
Wenn deine PV 800 Watt produziert, dein Verbrauch aber nur 200 Watt ist, ist es vollkommen logisch und für das Dashboard einfach zu berechnen, das 600 Watt ins Netz eingespeist werden, sofern kein anderer Verbraucher (Batterie) angegeben ist.
Liefert die PV aber nur 100 Watt und Du verbrauchst gerade 500 Watt, ist es vollkommen klar, das Du 400 Watt einkaufen mußt, sofern auch hier kein weiterer Lieferant, wie eine Batterie vorhanden ist.
Wozu dann also
Netzverbrauch:
- sensor.solarlog_consumption_ac minus sensor.solarlog_power_ac. Der Wert soll nicht kleiner 0 sein. Wenn kleiner 0 -> Ausgabe 0. Wert als Summenintegral ins Dasboard.

Du hast meinen Code nicht übernommen, sondern entscheidende Fehler eingebaut.
Ich sagte doch, dass das Dashboard wh haben will. Wenn Du aber w in kw änderst, hast Du immer noch keine wh.
Also besser wh oder kwh nutzen. Das "h" ist dabei nun mal wichtig.
Du hast "device_class: energy" ich habe "device_class: power"
Du hast "state_class: total_increasing" ich habe "state_class: measurement"
Du hast "template: >-" ich habe "state: >"
Du siehst, dein Code weicht erheblich von meinem ab und über das "template" meckert er auch. Mach das weg. :D
Code:
# Eigener Sensor
template:
  - sensor:
    - name: "Einspeisung"
      unique_id: NetzeinspeisungNichtKleinerNull
      unit_of_measurement: kWh
      device_class: power
      state_class: measurement
      state: >-
        {% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %}
        {{ 0 if power < 0 else power }}

  - sensor:
    - name: "Netzbezug"
      unique_id: NetzbezugNichtKleinerNull
      unit_of_measurement: kWh
      device_class: power
      state_class: measurement
      state: >-
        {% set power = (states('sensor.solarlog_consumption_ac')|round ) -  (states('sensor.solarlog_power_ac')|round ) %}
        {{ 0 if power < 0 else power }}

Versuch das mal so.
 
Du brauchst nur 3 Werte und nicht 5. Und die 3 Werte hast Du, wie ich oben aufgeführt habe.
Wenn deine PV 800 Watt produziert, dein Verbrauch aber nur 200 Watt ist, ist es vollkommen logisch und für das Dashboard einfach zu berechnen, das 600 Watt ins Netz eingespeist werden, sofern kein anderer Verbraucher (Batterie) angegeben ist.

Ahoi RudiP
Ich dachte auch, dass Produktion und Eigenverbrauch reichen. Der rest kann ja berechnet werden. Das Dashboard hat die Netzeinspesung bisher eben nie gemacht. Der Fehler kann aber auch (nicht ganz unwahrscheinlicherweise) vor dem Bildschirm sitzen ^^.

Das Ergebniss von deinem Code:

1694972761230.png

Die Einspeisung hat er gefressen 🍻

Beim Sensor Netzverbrauch sieht es leider nicht so gut aus. Keine Ahnung warum. Und bei der Solarproduktion findet sich neu auch ein Fehler. Das ist aber neu und hat bisher funktioniert.

1694973915733.png

1694973248316.png

Die Logs:

YAML:
Logger: homeassistant.components.sensor

 Source: components/sensor/__init__.py:661

Integration: Sensor (documentation, issues)

  First occurred: 19:36:06 (1 occurrences)

  Last logged: 19:36:06


Entity sensor.netzbezug (<class 'homeassistant.components.template.sensor.SensorTemplate'>) is using native unit of measurement 'kWh' which is not a valid unit for the device class ('power') it is using; expected one of ['W', 'kW']; Please update your configuration if your entity is manually configured, otherwise...

Code:
Logger: homeassistant.components.template.template_entity

 Source: components/template/template_entity.py:478

Integration: Template (documentation, issues)

  First occurred: 19:36:06 (1 occurrences)

  Last logged: 19:36:06


TemplateError('ValueError: Template error: round got invalid input 'unknown' when rendering template '{% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}' but no default was specified') while processing template 'Template<template=({% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.einspeisung'

Code:
Logger: homeassistant.helpers.event

Source: helpers/template.py:570

First occurred: 19:36:06 (1 occurrences)

Last logged: 19:36:06


Error while processing template: Template<template=({% set power = (states('sensor.solarlog_power_ac')|round ) - (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}) renders=2>

Traceback (most recent call last):

  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1647, in forgiving_round

    value = round(float(value), precision)

                  ^^^^^^^^^^^^

ValueError: could not convert string to float: 'unknown'


During handling of the above exception, another exception occurred:


Traceback (most recent call last):

  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 568, in async_render

    render_result = _render_with_context(self.template, compiled, **kwargs)

                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2198, in _render_with_context

    return template.render(**kwargs)

           ^^^^^^^^^^^^^^^^^^^^^^^^^

  File "/usr/local/lib/python3.11/site-packages/jinja2/environment.py", line 1301, in render

    self.environment.handle_exception()

  File "/usr/local/lib/python3.11/site-packages/jinja2/environment.py", line 936, in handle_exception

    raise rewrite_traceback_stack(source=source)

  File "<template>", line 1, in top-level template code

  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1652, in forgiving_round

    raise_no_default("round", value)

  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1628, in raise_no_default

    raise ValueError(

ValueError: Template error: round got invalid input 'unknown' when rendering template '{% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}' but no default was specified


The above exception was the direct cause of the following exception:


Traceback (most recent call last):

  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 694, in async_render_to_info

    render_info._result = self.async_render(

                          ^^^^^^^^^^^^^^^^^^

  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 570, in async_render

    raise TemplateError(err) from err

homeassistant.exceptions.TemplateError: ValueError: Template error: round got invalid input 'unknown' when rendering template '{% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}' but no default was specified

Danke.
 
Verdammt, ja. Mein Fehler.

Code:
# Eigener Sensor
template:
  - sensor:
    - name: "Einspeisung"
      unique_id: NetzeinspeisungNichtKleinerNull
      unit_of_measurement: kWh
      device_class: Energy
      state_class: total_increasing
      state: >-
        {% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %}
        {{ 0 if power < 0 else power }}

  - sensor:
    - name: "Netzbezug"
      unique_id: NetzbezugNichtKleinerNull
      unit_of_measurement: kWh
      device_class: Energy
      state_class: total_increasing
      state: >-
        {% set power = (states('sensor.solarlog_consumption_ac')|round ) -  (states('sensor.solarlog_power_ac')|round ) %}
        {{ 0 if power < 0 else power }}

Ich habe bei mir in der falschen Zeile geschaut. Dein Code war soweit richtig, nur das "unit_of_measurement" hat die Einheit mit kWh bzw. wH braucht und unten anstatt template: >- ein state: >-
 
Also. Netzbezug funktioniert. Einspeisung wird nicht angezeigt.

1695135942943.png

Immerhin schon mal ein riesen Fortschritt! 🍾

Die Logs:
Code:
Logger: homeassistant.helpers.event
Source: helpers/template.py:570
First occurred: 16:11:58 (1 occurrences)
Last logged: 16:11:58

Error while processing template: Template<template=({% set power = (states('sensor.solarlog_power_ac')|round ) - (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1647, in forgiving_round
    value = round(float(value), precision)
                  ^^^^^^^^^^^^
ValueError: could not convert string to float: 'unknown'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 568, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2198, in _render_with_context
    return template.render(**kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/jinja2/environment.py", line 1301, in render
    self.environment.handle_exception()
  File "/usr/local/lib/python3.11/site-packages/jinja2/environment.py", line 936, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1652, in forgiving_round
    raise_no_default("round", value)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1628, in raise_no_default
    raise ValueError(
ValueError: Template error: round got invalid input 'unknown' when rendering template '{% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 694, in async_render_to_info
    render_info._result = self.async_render(
                          ^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 570, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: round got invalid input 'unknown' when rendering template '{% set power = (states('sensor.solarlog_power_ac')|round ) -  (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}' but no default was specified

Code:
Logger: homeassistant.components.template.template_entity
Source: components/template/template_entity.py:478
Integration: Template (documentation, issues)
First occurred: 16:11:58 (1 occurrences)
Last logged: 16:11:58

TemplateError('ValueError: Template error: round got invalid input 'unknown' when rendering template '{% set power = (states('sensor.solarlog_power_ac')|round ) - (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}' but no default was specified') while processing template 'Template<template=({% set power = (states('sensor.solarlog_power_ac')|round ) - (states('sensor.sensor.solarlog_consumption_ac')|round ) %} {{ 0 if power < 0 else power }}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.einspeisung'

Ich hoffe jemand hat noch eine gute Idee...
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
4.676
Beiträge
47.748
Mitglieder
4.325
Neuestes Mitglied
Tim Schroth
Zurück
Oben