Chart statistik daten auslesen und als rechengrundlage nutzen

oh.. hab mal statt oben auf das copy, direkt markiert und kopiert… das hat wohl geklappt.

nun muss ich meine daten noch setzen

wenn du das Beispiel 1:1 umsetzt genauso wie es da steht sollte dann auf Knopfdruck der Wert berechnet werden.

das ding macht mich fertig..

im editor alles grün.. beim versuch neu laden

so, alles bereinigt..

anscheinend fehlt der name im beispiel script..

wie und wo hast du den im yaml getzt?

welcher Name ?
Wenn du Code richtig kopiert hast und alle Stellen an deine Sensornamen angepasst hast dann sollte da kein Fehler kommen.

wo hast du mein script durchlaufen lassen?

in den entwickler werkzeugen?

aktionen oder template ?

Ein Script kann im GUI Editor erzeugt werden, das hier ist z.B. das Script von dir das bei mir im GUI Editor durchläuft :

sequence:
  # 1. SCHRITT: Statistik abrufen und in 'stats' speichern
  - action: recorder.get_statistics
    data:
      start_time: "{{ states('input_datetime.datum') }}"
      end_time: "{{ now().isoformat() }}"
      period: day
      types:
        - sum
      statistic_ids:
        - sensor.balkon_solar_heutige_erzeugung
    response_variable: stats  # <-- Hier endet die Aktion!

  # 2. SCHRITT: Variablen separat definieren (Achten Sie auf das neue '-' Zeichen)
  - variables:
      daten: "{{ stats['sensor.balkon_solar_heutige_erzeugung'] }}"
      erste_summe: "{{ daten[0]['sum'] | float(0) if daten else 0 }}"
      letzte_summe: "{{ daten[-1]['sum'] | float(0) if daten else 0 }}"
      differenz: "{{ (letzte_summe - erste_summe) | round(2) }}"

Läuft den inzwischen das Beispiel von Orkson bei dir ?

hi :slight_smile: nein leider nicht… wenn ich das script in den template-editor einfüge, gibt es rot..

wenn ich es in aktionen kopiere kann ich es laufen lassen (blau) aber

Keine Aktion definiert. Bitte definiere einen ‘action:’-Schlüssel.

welches ist denn das, was du gui-editor nennst.. ist ja beides gui.

Einstellungen → Automationen&Szenen->Scripte

Wenn das Orginal Beispiel nicht läuft machst du immer noch was falsch.
Welche Fehlermeldung kommt denn da ?

Scripte sind sowas :

sequence:

das ist ein Template :

template:
  - triggers:
      - trigger: state
        entity_id:
          - input_button.statistik_berechnen
    actions:
      - action: recorder.get_statistics
        data:
          start_time: "{{ states('input_datetime.statistik_start') }}"
          end_time: "{{ states('input_datetime.statistik_ende') }}"
          period: day
          statistic_ids:
            - sensor.hauptstromzahler_energy
          types:
            - state
        response_variable: stats
    sensor:
      - name: Statistik Auswertung
        unit_of_measurement: kWh
        unique_id: fe77f5a5-04a9-468c-9f69-3d3e6f750f49
        state: |
          {% set anfang = stats.statistics['sensor.hauptstromzahler_energy'][0].state | float %}
          {% set ende = stats.statistics['sensor.hauptstromzahler_energy'][-1].state | float %}
          {{ (ende - anfang) | round(3) }}

Ein Template wird in der Configuration.yaml eingefügt und ist kein Script also bitte auch nicht so bezeichnen sonst verwirrst du nur.

Wenn du das Template korrekt in der Configuration.yaml ein gefügt hast dann hast du unter
Geräte&Dienste->Entitäten eine Entität mit dem Namen Statistik Auswertung.

Die wird jedesmal aktualisiert wenn du den Button input_button.statistik_berechnen drückst.

Dazu werden die Werte der Inputhelfer input_datetime.statistik_start und input_datetime.statistik_ende benutzt.

hi das orkson script, mit den für mich nicht interessanten helpern interessiert mich im moment gar nicht..

ich habe ein gui datums set und die daraus resultierenden tage erstellt

mir fehlt jetz nur die durchnitts berechnung vom eingegebenen datum bis heute (was mein, was auch immer) machen soll.. das ist mein problem..

action: recorder.get_statistics
data:
  statistic_ids:
    - sensor.balkon_solar_heutige_erzeugung
  start_time: "{{ states('input_datetime.datum') }}"
  end_time: "{{ now().isoformat() }}"
  period: day
  types:
    - sum
response_variable: stats  
          {% set daten = stats['sensor.balkon_solar_heutige_erzeugung'] %}
          {% set erste_summe = daten[0]['sum'] | float(0) %}
          {% set letzte_summe = daten[-1]['sum'] | float(0) %}
          {{ (letzte_summe - erste_summe) | round(2) }}


Hi :slight_smile: den oberen teil bis response variable, habe ich in der config.

und bekomme im protokoll

TemplateError('UndefinedError: 'stats' is undefined') while processing template 'Template<template=(response_variable: stats {% set daten = stats\['sensor.balkon_solar_heutige_erzeugung'\] %} {% set erste_summe = daten\[0\]\['sum'\] | float(0) %} {% set letzte_summe = daten\[-1\]\['sum'\] | float(0) %} {{ (letzte_summe - erste_summe) | round(2) }}) renders=4>' for attribute '\_attr_native_value' in entity 'None'

hänge immer wieder, was auch immer ich mache an der stats variable, die dann natürlich nicht durch andere helfer auswertbar ist.
so wie ich es immer wieder gelesen und verstanden habe ist response var im laufenden system vorhanden. so kenne ich das von anderen systemen. warum ich immer die not definiert meldung bekomme ist mir schleierhaft.
evtl. kann mir da jemand dieses merkwürdige verhalten erklären.. oder einfache frage. wie initialisiere ich eine variabel die im system preäent ist, damit ich sie in anderen programm threads auswerten kann.

:crayon:by HarryP:
. Zusammenführung Doppelpost (bei Änderungen oder hinzufügen von Inhalten bitte die „Bearbeitungsfunktion“anstatt „Antworten“ zu nutzen)
. Code-/Logzeilen formatiert (bitte immer in </> einbinden)
. s.a.: (Neues Update & Features - Hier in der Community 🫶)

Das ist eine Variable, in der das Ergebnis von recorder.get_statistics gespeichert ist. Und dies gilt es dann herauszuholen.

Das hier muß in einem Teil sein, der die Stats auswertet wie z.B. in einer eigenen Variablenberechnung, die Stats verwendet:

- action: recorder.get_statistics
  data:
    statistic_ids:
      - sensor.balkon_solar_heutige_erzeugung
    start_time: "{{ states('input_datetime.datum') }}"
    end_time: "{{ now().isoformat() }}"
    period: day
    types:
      - sum
  response_variable: stats
- variables:
    durchschnitt: |
      {% set daten = stats['sensor.balkon_solar_heutige_erzeugung'] %}
      {% if daten | count > 1 %}
        {% set erste_summe = daten[0]['sum'] | float(0) %}
        {% set letzte_summe = daten[-1]['sum'] | float(0) %}
        {% set gesamt = letzte_summe - erste_summe %}

        {% set tage = (
          now().date() -
          (states('input_datetime.datum') | as_datetime).date()
        ).days %}

        {{ (gesamt / tage) | round(2) if tage > 0 else 0 }}
      {% else %}
        0
      {% endif %}

Mich beschleicht schon vorher, daß Gefühl Du solltest Dich noch etwas mit HA-Grundlagen beschäftigen - die müssen sitzen wenn Copy/Paste nicht mehr ausreicht.

Und deshalb ist Osorkon sein Beispiel wieder richtig gut nachzubauen. Und oft ist er hier auch im Forum und würde helfen.

Manchmal muß man einfach 2 Schritte zurückgehen um dann 3 nach vorne.

ich gebe dir mit den grundlagen absolut recht.. nur finde ich all überall keine erklärung wie man die response variable initiert, (stats im beispiel). da sie bei allem was ich mache angemeckert wird.

mir ist schon klar wir die weitere auswertung funktioniert. nur ohne eine stats variable die ich irgendwo auswerten kann komme ich nicht weiter… hilfe ich möchte nur das die ausgabe von recorder als auswertbare variable weiter nutzbar ist

Ich hab mir schnell ein Beispielscript zusammengeklickt.

  • Es holt über get_statistics die Werte der letzten 10 Tage (now() - timedelta(days=10)) (bei Dir ist das Dein input_date)
  • Alles landet in der Response Variable stats
  • Dann schicke ich mir eine Mail und im Body nehme ich Jinja und
    • lasse mir die komplette stats Variable ausgeben (mache ich am Anfang immer um zu sehen was wirklich ankommt)
    • dann nehme ich erste und letzte Summe, bilde Differenz und teile durch Anzahl Tage die ich aus der Anzahl der Einträge schließe
sequence:
  - action: recorder.get_statistics
    data:
      statistic_ids:
        - sensor.om_help_vz_solar
      start_time: "{{ (now() - timedelta(days=10)).isoformat() }}"
      end_time: "{{ now().isoformat() }}"
      period: day
      types:
        - sum
    response_variable: stats
  - action: notify.gmxolaf3
    metadata: {}
    data:
      message: >
        {{stats}}

        -------

        {% set daten = stats.statistics['sensor.om_help_vz_solar'] %}
        {% set erste = daten[0]['sum'] | float %}
        {% set letzte = daten[-1]['sum'] | float %}

        Der Durchschnitt beträgt: {{ ((letzte - erste) / (daten | count - 1)) |
        round(2) }}
      title: Test stats
alias: 1 forum stats test
description: ""

Und in Email steht

-----Ursprüngliche Nachricht-----
Von: Homeassi <xxx> 
Gesendet: Donnerstag, 4. Juni 2026 21:38
An: Olaf <xxx>
Betreff: Test stats

{'statistics': {'sensor.om_help_vz_solar': [{'start': '2026-05-24T22:00:00+00:00', 'end': '2026-05-25T22:00:00+00:00', 'sum': 2104.287269999957}, {'start': '2026-05-25T22:00:00+00:00', 'end': '2026-05-26T22:00:00+00:00', 'sum': 2108.570080999958}, {'start': '2026-05-26T22:00:00+00:00', 'end': '2026-05-27T22:00:00+00:00', 'sum': 2113.086659999959}, {'start': '2026-05-27T22:00:00+00:00', 'end': '2026-05-28T22:00:00+00:00', 'sum': 2117.5654299999596}, {'start': '2026-05-28T22:00:00+00:00', 'end': '2026-05-29T22:00:00+00:00', 'sum': 2121.1688659999595}, {'start': '2026-05-29T22:00:00+00:00', 'end': '2026-05-30T22:00:00+00:00', 'sum': 2124.7556309999595}, {'start': '2026-05-30T22:00:00+00:00', 'end': '2026-05-31T22:00:00+00:00', 'sum': 2128.429828999964}, {'start': '2026-05-31T22:00:00+00:00', 'end': '2026-06-01T22:00:00+00:00', 'sum': 2131.946452999964}, {'start': '2026-06-01T22:00:00+00:00', 'end': '2026-06-02T22:00:00+00:00', 'sum': 2134.939951999964}, {'start': '2026-06-02T22:00:00+00:00', 'end': '2026-06-03T22:00:00+00:00', 'sum': 2137.6330659999635}, {'start': '2026-06-03T22:00:00+00:00', 'end': '2026-06-04T22:00:00+00:00', 'sum': 2139.5566159999635}]}}

-------

Der Durchschnitt beträgt: 3.53

Versuche dieses Script nachzubauen und wenn Du auch so eine Mail bekommst, mach Dich noch einmal an Dein Beispiel.

EDIT

Ich glaube jetzt weiß ich wo es ein Mißverständnis geben könnte am Variablen Scope. Diese Variable stats lebt nur im Scope des Aufrufes (bei mir mein Script) und kann auch nur in diesem ausgewertet wertet. Es ist keine globale sondern lokale Variable. Irgendwas hatte sich hier geändert mit irgendeinem Update in den letzten Monaten hin zu mehr global aber ich müßte nachlesen was das war aber heute reichts mir :wink:

EDIT

Ich bin die Release Note der letzten 12 Monate durchgegangen und ich denke ein Satz im Juli Update war bei mir falsch hängengeblieben und nehme die Aussage zurück.

Globale Variable sind eher einige Helfer wie input_text
Lokale Variablen sind die in Scripts und Automatisationen oder Templates und gelten nur während des Aufrufes bzw. Beim Templates während des Rendern.

Wenn man den Inhalt der lokalen Variablen Variablen stats wirklich global haben wollte, müßte sie in einen Helfer gespeichert werden oder wie Osorkon in einen Sensor. In meinem obigen Testscript versende ich per Email den Durschnitt und danach sind die Daten weg.

hi :slight_smile: danke .. mache ich morgen… wo muss welches hin.. helfer oder script unter automationen?

Anforderungen 2.0

Bitte beschreibe mit dem Wissen der letzten Diskussionen noch einmal was genau Du erreichen willst. Was soll wann passieren und wo soll das Ergebnis angezeigt bzw. verwendet werden?

Hi :slight_smile:

ziel

datumseingabe input_datetime.datum funktioniert

errechng der tage seit datum funktioniert

auslesen der langzeitstatistik mit recorder
ermittlung wert am datum 1ster wert
ermittlung wert heute

berechnung erzeugung seit datum (wert heute - 1ster wert

durchnittsberechnung erzeugung durch tage

das ist alles

ausgabe recorder brauche 1 und letzen wert daran hängt es. ohne button drücken oder automatisierung.

`action: recorder.get_statistics`
`data:`
`start_time: “{{ states(‘input_datetime.datum’) }}”`
`end_time: “{{ now().isoformat() }}”`
`period: day`
`types:`
`- sum`
`statistic_ids:`
`- sensor.balkon_solar_heutige_erzeugung`
`response_variable: stats`

`statistics:`
`sensor.balkon_solar_heutige_erzeugung:`
`- start: “2026-05-29T22:00:00+00:00”`
`end: “2026-05-30T22:00:00+00:00”`
`sum: 195.39438000000328`
`- start: “2026-05-30T22:00:00+00:00”`
`end: “2026-05-31T22:00:00+00:00”`
`sum: 196.35990000000336`
`- start: “2026-05-31T22:00:00+00:00”`
`end: “2026-06-01T22:00:00+00:00”`
`sum: 198.59705000000343`
`- start: “2026-06-01T22:00:00+00:00”`
`end: “2026-06-02T22:00:00+00:00”`
`sum: 200.70618000000343`

anzeige im dashboard

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)
s.a.: (Neues Update & Features - Hier in der Community 🫶)

@harryp
hi schon klar… habe nur die erste ausgabe zur veranschaulichung kopiert. richtige posts sind im thread vorhanden.

oder bist du ein bot?

Das ist zu 99 % genau was Osorkon in seinem Beitrag Statistik Auswertung ohne SQL - Templates Sammlung - SmartHome for Dummies Du aber nicht nachbauen willst, sorry der mußte sein :slight_smile:

Hier der Durchscnittsteil aus seinem Code.

          {% elif typ == "mean" %}
              {% set anzahl =  stats.statistics[sensor] | length %}
              {% set total = namespace(sum=0) %}
              {% for item in stats.statistics[sensor] %}
              {% if 'mean' in item %}
              {% set total.sum = total.sum + item.mean %}
              {% endif %}
              {% endfor %}
              {{ ((total.sum / anzahl) | round(2)) | string + " " + unit}}

Die Frage ist was soll bei Dir diesen Befehl anstoßen?

  • Osorkon nutzt dafür einen Button und dessen Statusänderung. D.h. erst wenn der geklickt wird, wird recorder.get_statistics einmalig ausgeführt.
  • Dann packt/wertet er die Stats Variable aus und legt das Ergebnis in einen Sensor

Mit diesem Sensor Wert kannst Du überall anzeigen oder etwas berechnen lassen.

Nein, bin ich nicht!!

Hi :slight_smile: anstossen… veränderung der werte. tage ist auch ohne weitere buttons oder automatisierungen sofort aktuell.

könnte mir aber eine automatisierung vorstellen, morgens einmal die berechnung als systemvariable setzt,
so das man sie entität ins dashbord, wie angedacht (siehe shot), setzen kann.

tage ist als gui erstelltes template (sensor.tage) erstellt und ist immer aktuell

{{ ((as_timestamp(now()) - as_timestamp(states('input_datetime.datum'))) / 86400) | int }}

btw. wie schon x mal erwähnt, laufe ich mit dem beispiel immer in den response_variable: stats fehler