Sensor für Leistung einzelner Strings erstellen

Hallo,
ich habe eine Solaranlage mit Speicher von Huawei.
Die Solaranlage hat zwei Strings.
Ich bekomme vom Wechselrichter die Gesamtleistung der Solaranlage aber nicht die Leistung der einzelnen Strings.
Da ich aber die Spannung und den Strom für jeden String einzeln bekomme wollte ich mir einen eigenen Sensor basteln, der die Leistung errechnet, sodass ich sie in einem Diagramm darstellen kann.
Meine Datei sieht so aus:

template:
  - sensor:
      - name: "Solarertrag Dach"
        unique_id: "solar_ertrag_dach"
        state: >
          {% set spannung = states('sensor.wechselrichter_pv_2_spannung') | float(0) %}
{% set strom = states('sensor.wechselrichter_pv_2_strom') | float(0) %}
{{ 'spannung: ' ~ spannung }}
{{ 'strom: ' ~ strom }}
{% if spannung > 0 and strom > 0 %}
  {{ (spannung * strom) | round(2) }}
{% else %}
  0
{% endif %}

        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        suggested_display_precision: 2

Hier scheint aber etwas nicht zu stimmen, ich bekomme folgende Fehlermeldung:

Sensor None has device class 'power', state class 'measurement' unit 'W' and suggested precision 'None' thus indicating it has a numeric value; however, it has the non-numeric value: 'template: - sensor: - name: "Solarertrag Dach" unique_id: "solar_ertrag_dach" state: > spannung: 0.0 strom: 0.0 0 unit_of_measurement: "W" device_class: "power" state_class: "measurement" suggested_display_precision: 2' (<class 'str'>)

Die Sensoren für Spannung und Strom liefern Werte die ich auch in einem Diagramm darstellen kann. Aber das Produkt aus beidem liefert scheinbar keinen numerischen Wert. Warum auch immer.
Kann jemand helfen?
Was habe ich falsch gemacht?

Gruß Silvio

Hallo Silvio!
der Fehler liegt wohl daran, dass du in deinem state-Block zusätzlich zu der eigentlichen Berechnung auch Debug-Text wie spannung: … und strom: … ausgibst. Dadurch wird der Rückgabewert der Template-Funktion kein reiner Zahlenwert mehr, sondern ein String, der nicht nur aus einer Zahl besteht. Das mag Home Assistant in diesem Kontext nicht, weil er bei device_class: power und unit_of_measurement: „W“ eine reine Zahl erwartet.

Von daher Versuche es mal:

template:
  - sensor:
      - name: "Solarertrag Dach"
        unique_id: "solar_ertrag_dach"
        state: >
          {% set spannung = states('sensor.wechselrichter_pv_2_spannung') | float(0) %}
          {% set strom = states('sensor.wechselrichter_pv_2_strom') | float(0) %}
          {% if spannung > 0 and strom > 0 %}
            {{ (spannung * strom) | round(2) }}
          {% else %}
            0
          {% endif %}
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        suggested_display_precision: 2

tippe mal das die „“ falsch sind :hugs:

ändere mal bitte:

        unit_of_measurement: 'W'
        device_class: power
        state_class: measurement

Danke euch beiden für die schnelle Antwort.
Ist scheinbar aber noch nicht die Lösung.
jetzt bekomme ich folgende Fehlermeldung:

Sensor None has device class 'power', state class 'measurement' unit 'W' and suggested precision 'None' thus indicating it has a numeric value; however, it has the non-numeric value: 'template: - sensor: - name: "Solarertrag Dach" unique_id: "solar_ertrag_dach" state: > 0.0 # Setze den Wert explizit auf eine Zahl unit_of_measurement: 'W' device_class: power state_class: measurement suggested_display_precision: 2' (<class 'str'>)

Was wird denn ausgegeben in den Entwicklerwerkzeuge Template?

In welche yaml packst du das template hinein? Configuration oder sensor .yaml?

Das wird ausgegeben.

Über die grafische Oberfläche habe ich Helfer - Template - Sensor gewählt.

gehe mal bitte in die Entwicklerwerkzeuge und dann Template und gebe genau das ein:

          {% set spannung = states('sensor.wechselrichter_pv_2_spannung') | float(0) %}
          {% set strom = states('sensor.wechselrichter_pv_2_strom') | float(0) %}
          {% if spannung > 0 and strom > 0 %}
            {{ (spannung * strom) | round(2) }}
          {% else %}
            0
          {% endif %}

auf der Rechten Seite gibs die Ausgabe

So mache ich das immer, bevor ich das irgendwo verwende (z.B. Yaml)

1 „Gefällt mir“

das geht eher nicht, der Code ist für die Yaml gedacht

Ich kenne mich mit Programmierung so gut wie nicht aus, aber bastel zur Zeit mit einer KI an meinem eigenen PV Projekt. Ich habe einfach dein Script und die Fehlermeldung eingegeben. Das hat „Copilot“ geantwortet.

Der Fehler scheint darauf hinzudeuten, dass der Sensorwert, der erwartet wird, numerisch sein sollte, aber tatsächlich als String dargestellt ist. Das Problem liegt vermutlich in der Art und Weise, wie die state-Variable im Script formatiert wird. Durch die Kombination von Text (spannung:, strom:) und einer Berechnung wird der Zustand (state) nicht als reine Zahl erkannt, sondern als String.

Um diesen Fehler zu beheben, sollten Sie sicherstellen, dass der state des Sensors ausschließlich die numerische Berechnung ohne zusätzlichen Text zurückgibt. Hier ist eine mögliche Korrektur:

template:
  - sensor:
      - name: "Solarertrag Dach"
        unique_id: "solar_ertrag_dach"
        state: >
          {% set spannung = states('sensor.wechselrichter_pv_2_spannung') | float(0) %}
          {% set strom = states('sensor.wechselrichter_pv_2_strom') | float(0) %}
          {% if spannung > 0 and strom > 0 %}
            {{ (spannung * strom) | round(2) }}
          {% else %}
            0
          {% endif %}
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        suggested_display_precision: 2

In dieser Version wird nur der berechnete numerische Wert ausgegeben, ohne zusätzliche Texte wie spannung: oder strom:. Dies sollte den Fehler beheben und sicherstellen, dass der state als numerischer Wert erkannt wird.

Probieren Sie diese Anpassung aus und teilen Sie mit, ob der Fehler dadurch behoben wurde! :blush:

Der Code ist für eine yaml Datei gedacht.

Teste mal wie schon erwünscht, was das template dir zurück gibt.

Teste ich Heute Abend und gebe Bescheid.

Das habe ich auch schon ausprobiert.
Irgendwann dreht man sich aber im Kreis, da die KI nicht auf die Idee kommt zu fragen wie ich den Sensor erstellt habe.
Die KI geht scheinbar davon aus, dass er als yaml erstellt wurde.

Für die template Erstellung über die Helfer - Versuche dies mal

{% set spannung = states('sensor.wechselrichter_pv_2_spannung') | float(0) %}
{% set strom = states('sensor.wechselrichter_pv_2_strom') | float(0) %}
{% if spannung > 0 and strom > 0 %}
  {{ (spannung * strom) | round(2) }}
{% else %}
  0
{% endif %}
1 „Gefällt mir“

Habe ich gemacht.
Jetzt bekomme ich einen Wert angezeigt.
Super Danke.
Wo muss ich die yaml jetzt eingeben?
Ich tu mich da immer etwas schwer.

Den Code kannst du für die template Helfer nutzen.

Siehe Beitrag über deinem.

2 „Gefällt mir“

geht auch ohne :flushed:
wir sind ja da :clap:

2 „Gefällt mir“

Danke FelixFr und Dreckfresse für eure Hilfe.
Es funktioniert jetzt.