Tagesertrag Balkonkraftwerk/Stündliche aktualisierung

Hallo, ich hoffe diese Problematik wurde nicht schon hundert mal diskutiert. Leider habe ich über die Suche nichts passendes gefunden.
Es ist auch ein Problem das ich immer wieder über alte Syntaxs stolpere.
Ich möchte es gerne in YAML schaffen.
Nun mein Problem:
Mein Sensor “sensor.gartenkraftwerk_hms_2000_yieldday” gibt mir einen Wert solange Strom erzeugt wird. Wenn kein Strom erzeugt wird steht im Wert unknown oder unavailable.
Das möchte ich natürlich nicht auf meinem Dashboard haben.
Habe zwei Möglichkeiten aber bei keinem zu einem Ergebnis gekommen.

Möglichkeit 1:
Den maximalwert des Sensors versuchen zu speichern bzw abzurufen
Möglichkeit 2:
Den aktuellen Wert einer Shelly (sensor.balkonkraftwerk_switch_0_energy) zu erfassen und diesen von einem um 00:00 Uhr erfasstem Wert abzuziehen.

Zu Möglichkeit 1, hier ein kopiertes Werk mit meinen Werten. Leider alte Syntax.

Bekomme in Studio Code Server jede menge Fehler.
Vielleicht kann mir hier jemand helfen.
Der Code wird in der Configuration.yaml eingefügt und zwar ohne template, da bereits einige Sensoren unter template vorhanden sind die auch funktionieren.

template:
  - trigger:
      - platform: time_pattern
        hours: 0
        minutes: 0
        id: 'midnight'
      - platform: state
        entity_id: sensor.gartenkraftwerk_hms_2000_yieldday
        id: 'change'
    sensor:
      - name: "tagesertrag_solar_gesamt"
        state: >
          {% set outt = states('sensor.gartenkraftwerk_hms_2000_yieldday')|float(None) %}
          {% set maxt = states('sensor.tagesertrag_solar_gesamt')|float(None) %}
          {% if  outt != None  and (trigger.id == 'midnight' or maxt == None
            or outt > maxt) %} {{ outt }}
          {% else %} {{ maxt }} {% endif %}
        unit_of_measurement: "kWh"

Wofür brauche ich die id?
Warum muss ich das mit der Uhrzeit so kompliziert machen?

Vielen Dank im vorraus falls jemand Zeit hat zu helfen.

oder Möglichkeit 3 …

Wenn der Wert invalide wird, nimm den Vorgängerwert

template:
  - trigger:
      - platform: state
        entity_id:
          - sensor.gartenkraftwerk_hms_2000_yieldday
    sensor:
      - name: "tagesertrag_solar_gesamt"
        unique_id: tagesertrag_solar_gesamt
        state_class: measurement
        device_class: power
        unit_of_measurement: "W"
        state: >
          {% set status = states('sensor.gartenkraftwerk_hms_2000_yieldday') %}
          {% set invalid_states = ['unavailable', 'unknown', 'none'] %}
          {% set old = trigger.from_state.state | float(0) %}
          {% set new = trigger.to_state.state | float(0) %}
          {{new if status | lower not in invalid_states else old %}

Ich habe den Code nicht nachgestellt/probiert aber im besten Fall kannst Du ihn 1:1 übernehmen.

Gutes Gelingen!

Edit
Ich sehe gerade, daß der Sensor und Name Quatsch ist. Korrigierte Stromerzeugung wäre passender. Sry, ich sollte nichts auf die Schnelle posten.

Erstmal vielen Dank für die schnelle Antwort und dieser Möglichkeit.
Ich bin mir nicht immer sicher ob es unter template in der configuration.yaml gehört oder in die automations.yaml.
Laut dem Update von 2024.8 auf 2024.10 wurden einige YAML Änderungen durchgeführt. Vermutlich deshalb auch meine Verwirrtheit. Das soll jetzt auch nur ein Hinweis sein.
Aufgrund dessen kommt bei Studio Code Server (Mein bevorzugter Editor für YAML) bei

  • platform: state string does not match the pattern of “LEGAZY SYNTAX”
    Laut neuer Schreibweise muss ich es in - trigger ändern.

Und am Ende deines Codes fehlte noch eine geschwungene Klammer. Ich wusste es nicht ich hab es einfach ausprobiert :slight_smile:

Laut Studio Code Server kein Fehler in der Syntax aber leider nach Neustart von HA, wird kein Sensor mit dem Namen “tagesertrag_solar_gesamt” bei den Entwicklerwerkzeugen angezeigt.
So wie ich den Code lese, wird bei jeder Änderung des Wertes von “sensor.gartenkraftwerk_hms_2000_yieldday” ein neuer Wert in den Sensor “Tagesertrag_solar_gesamt” geschrieben, solange er nicht die Ausnahmen ‘unavailable’, ‘unknown’, ‘none’ annimmt. Sehe ich das richtig?

Nun sieht mein Code so aus:

- trigger:
      - trigger: state
        entity_id:
          - sensor.gartenkraftwerk_hms_2000_yieldday
    sensor:
      - name: "tagesertrag_solar_gesamt"
        unique_id: tagesertrag_solar_gesamt
        state_class: measurement
        device_class: power
        unit_of_measurement: "kWh"
        state: >
          {% set status = states('sensor.gartenkraftwerk_hms_2000_yieldday') %}
          {% set invalid_states = ['unavailable', 'unknown', 'none'] %}
          {% set old = trigger.from_state.state | float(0) %}
          {% set new = trigger.to_state.state | float(0) %}
          {{new if status | lower not in invalid_states else old %}}

Vielleicht hast du oder jemand noch eine Idee?

Nimm mal das % weg

EDIT:
Bei der Device_class bin ich mir inhaltlich nicht sicher. Der initiale Sensor liefert Watt? und nur durch unit_of_measurement: “kWh” erfolgt keine Summierung. Es gibt noch die “device_class: total_increasing”. Das sollte ein Verbrauchszähler sein.

Alternativ könnte man sich auch von der Idee eines yaml Sensors trennen und über UI anlegen.

Dort gibt es die untere Option. Vielleicht reicht Dir das auch völlig aus.

Da es jetzt funktioniert möchte ich mich als erstes für die grandiose Hilfe bedanken.
Danke! Ich habe zwar den Helfer in der UI gesehen aber der Ansporn war halt es ohne zu schaffen.
Ich will aber noch abwarten was heute abend passiert, wenn der Wert wieder auf die besagten Werte springt. Wenn nichts mehr kommt diesbezüglich dann läuft es. Abschließend möche ich noch den funktionieren Code präsentieren.
P.s. Also der Initialsensor “sensor.gartenkraftwerk_hms_2000_yieldday” liefert “Wh”

  - trigger:
      - trigger: state
        entity_id:
          - sensor.gartenkraftwerk_hms_2000_yieldday
    sensor:
      - name: "tagesertrag_solar_gesamt"
        unique_id: tagesertrag_solar_gesamt
        device_class: "energy"
        state_class: total_increasing
        unit_of_measurement: "kWh"
        state: >
          {% set status = states('sensor.gartenkraftwerk_hms_2000_yieldday') %}
          {% set invalid_states = ['unavailable', 'unknown', 'none'] %}
          {% set old = trigger.from_state.state | float(0) %}
          {% set new = trigger.to_state.state | float(0) %}
          {{new if status | lower not in invalid_states else old }}

Zähle doch den Ertrag dauerhaft in einen Riemannhelper ein und lese diesen dann mittels Utillitymeter aus. So kann man sehr schön jeden erdenklichen Zeitraum auswerten :wink:

# calculate cycle consumption pv
utility_meter:
  hourly_energy:
    source: sensor.solarproduktion
    name: PV_Stundenproduktion
    unique_id: "PV_Stundenproduktion"
    cycle: hourly
  daily_energy:
    source: sensor.solarproduktion
    name: PV_Tagesproduktion
    unique_id: "PV_Tagesproduktion"
    cycle: daily
  weekly_energy:
    source: sensor.solarproduktion
    name: PV_Wochenproduktion
    unique_id: "PV_Wochenproduktion"
    cycle: weekly
  monthly_energy:
    source: sensor.solarproduktion
    name: PV_Monatsproduktion
    unique_id: "PV_Monatsproduktion"
    cycle: monthly

Bei mir schaut das dann so aus.

Bildschirmfoto vom 2024-12-21 14-20-30

Ps: Stündlich habe ich nicht mit drin bei mir, habe es nur im Code oben mit zugefügt, ist also noch ungetestet :slightly_smiling_face:

Also das ist ja schon spuki :slight_smile:
Habe mich gerade gefragt wie bekomme ich den Ertrag von gestern angezeigt.

Das sieht so wie bei dir recht einfach aus.
Wenn ich das aber richtig verstehe muss ich einen
Riemann-Summenintegralsensor erstellen.
Da habe ich aber mehrer Fragen.
Nehme ich als Eingangssensor den

“sensor.gartenkraftwerk_hms_2000_yieldday” oder jetzt den neu erstellten
“tagesertrag_solar_gesamt”?

Utility_meter kommt in die configuation.yaml habe ich gesehen.

Ich probiere das morgen mal aus. So auf die Schnelle scheint es da Probleme zu geben mit Unit. Ich hätte da gerne auch lieber einen YAML Code zu.

Er gibt mir unit_of_measurement: kWhh in den Entwicklerwerkzeugen aus bei dem Riemenhelper Sensor “sensor.solarproduktion”

Mit OpenDTU kann man sich den ganzen Aufwand sparen.

Wäre schön wenn Sie das etwas genauer formulieren würden.
Ich habe eine OpenDTU-OnBattery und die liefert mir halt bei dunkelheit keine Sensorwerte
sensor.gartenkraftwerk_hms_2000_yieldtotal = unavailable via MQTT.

In den Mqtt Einstellungen ganz unten “Ablauffunktion aktivieren” ausschalten
Speichern nicht vergessen.

1 „Gefällt mir“

@Nein_danke
Vielen Dank, das scheint es gewesen zu sein.

Für das andere Thema bezüglich der vergangenen Tage habe ich ja jetzt schon einen guten Ansatz.

Ich wünsche besinnliche Feiertage und nochmals Danke

Gerade mal deaktiviert. Das dient dazu, dass die Entität nach Einbruch der Dunkelheit nicht auf unavailable gesetzt wird?