Statistik Auswertung ohne SQL

Hier mal ein kleines Beispiel wie man über die Aktion recorder.get_statistics
Recorder Daten auswerten kann. Als Beispiel der Energie Verbrauch von Datum 1 bis Datum 2.

ImBsp. verwende ich 3 Helfer

  • input_datetime.statistik_start
  • input_datetime.statistik_ende
  • input_button.statistik_berechnen

Ausgewertet wird der Sensor sensor.hauptstromzahler_energy

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) }} 

Diese Aktion ermittelt den täglichen stand (state) vom der angegebenen Entität und Speicher es in die Variable stats ab

      - 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

Der Template Sensor ermittelt dann der Ersten und den Letzen Wert und berechnet die Differenz.

Der Button ist der Auslöser zur Berechnung

      - trigger: state
        entity_id:
          - input_button.statistik_berechnen

Die 4 Element schnell in eine Entitäten Karte gepackt, dann schaut das so aus.

Statistik Auswertung

Gruß Osorkon

3 „Gefällt mir“

Hier das ganze ein wenig erweitert.
Zusätzlich kommen weitere Helfer zum Einsatz, zur Auswahl der Sensors, dem Statistik Typs und Statistik Zeitraums.

Nicht jeder Sensor lässt auch alle Statistik Typen zu.
Das hängt von der Device Class ab.

  • mesauremant lässt nur min, max und mean zu
  • wo gegen total oder total increasing nur state, sum und change erlaubt.

Wird einen unzulässige Kombination ausgewählt, wechslet der Sensor zur nicht verfügbar.

Der Tempalte Sensor dazu sieht dann so aus:

template:
  - triggers:
      - trigger: state
        entity_id:
          - input_button.statistik_berechnen
        variables:
          sensor: "sensor.{{ states('input_select.statistik_sensor') }}"
          zeitraum: "{{ states('input_select.statistik_zeitraum') }}"
          typ: "{{ states('input_select.statistik_typ') }}"
          unit: "{{ state_attr(sensor, 'unit_of_measurement') }}"
    actions:
      - action: recorder.get_statistics
        data:
          start_time: "{{ states('input_datetime.statistik_start') }}"
          end_time: "{{ states('input_datetime.statistik_ende') }}"
          period: "{{ zeitraum }}"
          statistic_ids:
            - "{{ sensor }}"
          types:
            - "{{ typ }}"
        response_variable: stats
    sensor:
      - name: Statistik Auswertung
        unique_id: fe77f5a5-04a9-468c-9f69-3d3e6f750f49
        state: |
          {% if typ == "state" %}
              {% set anfang = stats.statistics[sensor][0].state | float %}
              {% set ende = stats.statistics[sensor][-1].state | float %}
              {{ ((ende - anfang) | round(3)) | string + " " + unit }} 
          {% elif typ == "change" %}
              {% set total = namespace(sum=0) %}
              {% for item in stats.statistics[sensor] %}
              {% if 'change' in item %}
              {% set total.sum = total.sum + item.change %}
              {% endif %}
              {% endfor %}
              {{ (total.sum | round(3)) | string + " " + unit }}
          {% 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}}
          {% elif typ == "max" %}
              {% set max = stats.statistics[sensor] | map(attribute='max') | list %}
              {{ (max | max) | string + " " + unit }}
          {% elif typ == "min" %}
              {% set min = stats.statistics[sensor] | map(attribute='min') | list %}
              {{ (min | min) | string + " " + unit  }}
          {% endif %}

So kann man relativ unkompliziert verschiedene Statistiken auswerten, ohne gleich unzählige Template Sensoren erstellen zu müssen.

Viel Spaß beim nachbauen. :grinning:

Gruß Osorkon

2 „Gefällt mir“