Welcher Statistikhelper

Bei den vielen Helpern bin ich mir nicht Sicher, welcher der richtige ist.

Ich habe ein Wasserventil, dass mir anzeigt, welche Wassermenge pro Stunde durchfließt. Was ich gerne hätte, ist, dass diese Entität alle Minute (oder weniger) abgefragt wird und die Werte aufsummiert. Nach einer Stunde soll der Wert wieder auf 0 gesetzt werden und die Aufsummierung vorn vorn beginnen.
Damit will ich sehen können, wieviel Wasser die letzte Stunde verbraucht wurde.

Ist dafür die Statustik/Summe geeignet? Das Aufsummieren und Rücksetzen wäre damit machbar. Ich weiß aber nicht, wann immer der aktuelle Wert aufsummiert wird. Er ändert sich eigentlich nie, da der Durchfluss konstant ist.

Ist mein Ansatz richtig?

Mag sein das es übers Statistikhelfer geht. Verbrauchszähler wahrscheinlich

Mir fiel als erstes folgende Alternative ein: Automatisation

  • Trigger jede Minute oder kürzer
  • holt sich die aktuelle Wassermenge
  • addiert diese zu einem input_number Helfer wo der die vorige Summe gespeichert wurde
  • speichert dorthin die neue Summe
  • nächster Trigger jede h und darufhin den Helper auf 0

Mein Vorschlag zur Umsetzung im template.yaml

- trigger: 
    - trigger: time_pattern 
      seconds: /2
	  id: tr_impuls
    - trigger: time_pattern 
      hours: '*'
	  id: tr_delete   
  sensor:
    - name: Wasserverbrauch stunde
      unique_id: "wasserverbrauch_stunde"
      unit_of_measurement: "L"
      device_class: "water"
      state_class: "total_increasing"
      state: >
        {% set gesamt = states('sensor.wasserverbrauch_stunde') | float(0) %}
        {% set flow_rate_l_s = (states('sensor.856_sonoff_swv_water_valve_menge') | float(0) * 3.6) | round(2) %}
        {% set zeit = 2 %}
		{% if trigger.id == 'tr_impuls' and flow_rate_l_s > 0.02 %} 
        {{ (gesamt + (flow_rate_l_s * zeit)) | round(2) }}
		{% endif %}
	    {% if trigger.id == 'tr_delete' %}
          {{ 0 }}
		{% endif %}

Ich weiß nicht, wie oft dein Durchflusssensor die Werte aktualisiert. Ich habe die Aktualisierungszeit zunächst auf zwei Sekunden eingestellt. Alle zwei Sekunden wird ein neuer Wert erfasst und zum alten addiert. Wenn du eine andere Zeit wünschst, musst du zwei Stellen anpassen.
seconds: /2
{% set zeit = 2 %}

Mit der Anweisung
flow_rate_l_s > 0,02
kann eingestellt werden, ab welchem Durchfluss gezählt werden soll. An dieser Stelle musst du eventuell Anpassungen vornehmen.

Danke, diese Idee finde ich super, werde es wohl so auch umsetzen.

Ein kleiner Hinweis, die Maßeinheit von Liter ist “l”, also ein kleines L.

Mir ist auch noch etwas aufgefallen. Ich weiß nicht, ob du das gleiche Ventil von Sonoff hast, ich habe auch eins von Sonoff. Da wird der Durchfluß in m³/h angegeben. Der Wert bei mir ist meist 0.3.

1m³ sind 1000l. Das sind dann also 300l/h. Um da auf l/s zu kommen müsste man das ganze dann durch 3600 teilen.
Um letztendlich aus m³/h l/s zu machen müsste man da nicht, anstatt wie du mit 3.6 zu multiplizieren, durch 3.6 teilen?

Und dann wäre float(0) auch nicht dienlich, da diw Werte dann (zumindest bei mir) immer 0 wären.

:pencil2: by tarag: Doppelpost zusammengeführt

Sorry, ich hätte erwähnen sollen, dass ich gar keinen Durchflusssensor habe. Ich habe diesen Code für einen User hier im Forum erstellt. Leider hat er kein Feedback gegeben, daher weiß ich nicht, ob der Code funktioniert.
Mag ja sein, dass du mit der Umrechnung recht hast: 1 l/s = 3,6 m³/h.

Hast du Interesse an einer Statistik?
Ich habe für meine PV-Anlage ein wenig herumexperimentiert. Ich speichere beispielsweise einmal pro Stunde den Wert…

Ok, das erklärt es. Ich sehe gerade auch noch ein Problem, weiß aber nicht, woran es liegt. Bei mir wird immer als State “unavailable” ausgegeben. Eventuell liegt es ja daran, dass der Sensor zu Beginn beim ersten Trigger noch gar nicht exisitiert. Und wenn er dann einmal “unavailable” ist, kann man damit ja auch nicht mehr rechnen, also bleibt er “unavailable”. Ich experimentiere noch.

Und was die Statistik betrifft, so weit bin ich mit meinem Dashboard noch nicht, dass ich so etwas anzeigen will. Vlt. kommt das ja noch. Aber vielen Dank.

Es ist auch richtig so: Warte die volle Stunde ab, dann wird der Sensor initialisiert. Ab 20 Uhr wird dann auch die Rechnung funktionieren. Wenn du nicht bis 20 Uhr warten möchtest, kannst du den Wert durch einen anderen Trigger auf null setzen.

Das war mir klar.

Ich hatte aber noch einen anderen Fehler.
Da ich einige Versuche unternommen habe, hatte ich noch Kommentare im Code und die waren nicht richtig eingerückt, so dass die # mit in den State gewandert sind. Dann funktioniert die Mathematik dann natürlich auch nicht.

Jetzt geht es.

Kannst du bitte deinen funktionierenden Code hier posten? Das wäre für mich hilfreich, um zu wissen, was ich falsch gemacht habe, und auch für andere User, die vielleicht etwas Ähnliches vorhaben.

Kann ich natürlich machen. Außer, dass du halt wirklich durch 3.6 teilen musst, anstatt zu multiplizieren, war eigentlich nichts falsch. Deshalb hatte ich es auch nicht gemacht. Der Fehler lag bei mir.

Aber hier mein funktionierender Sensor:

trigger: 
  - trigger: time_pattern 
    seconds: /2
    id: tr_impuls
  - trigger: time_pattern 
    hours: '*'
    id: tr_reset
sensor:
  - name: irrigation tomatoes water amount per hour
    unique_id: "irrigation_tomatoes_water_amount_per_hour"
    unit_of_measurement: "l"
    device_class: "water"
    state_class: "total_increasing"
    state: >
      {% set total = states('sensor.irrigation_tomatoes_water_amount_per_hour') | float %}
      {% set flow_rate_l_s = (states('sensor.irrigation_tomatoes_flow') | float / 3.6) %}
      {% set time = 2 %}
      {% if trigger.id == 'tr_impuls' %}{{ (total + (flow_rate_l_s * time)) | round(1) }}{% endif %}
      {% if trigger.id == 'tr_reset' %}{{ 0.0 }}{% endif %}

Ich habe auf den Schwellwert von 0.02 aus deinem Beispiel verzichtet, da mein Ventil, wenn es aus ist, immer 0 liefert.

Und btw. habe ich noch ein Script, bei dem ich dem Ventil sagen kann, dass es mit x-Litern bewässert. Und der Sensor wird dann auch ziemlich genau um die x-Liter erhöht. Die Ungenauigkeit, die ich habe, kommt daher, dass der Durchfluss nur mit einer Nachkommastelle vom Device kommt, das Device selbst aber die Menge genauer bestimmt um dann selbständig abzuschalten.
Ich könnte natürlich jetzt auch die Abschaltung dem HAS überlassen, so ist es mir aber sicherer.

Ich überlege aber noch, das round(1), oder auch wie bei dir round(2) zu entfernen, da sich dadurch alle 2s die Rundungsfehler aufsummieren. Es ist wohl besser, das Runden erst in der Anzeige zu machen.

1 „Gefällt mir“

Ich habe heute wieder ein Problem mit dem Sensor gesehen und den Code noch einmal geändert:

trigger: 
  - trigger: time_pattern 
    seconds: /2
    id: tr_impuls
  - trigger: time_pattern 
    hours: '*'
    id: tr_reset
sensor:
  - name: irrigation tomatoes water amount per hour
    unique_id: "irrigation_tomatoes_water_amount_per_hour"
    unit_of_measurement: "l"
    device_class: "water"
    state_class: "total_increasing"
    state: >
      {% if trigger.id == 'tr_reset' %}{{ 0.0 }}{% endif %}
      {% if trigger.id == 'tr_impuls' %}
        {% set total = states('sensor.irrigation_tomatoes_water_amount_per_hour') | float %}
        {% set flow_rate_l_s = (states('sensor.irrigation_tomatoes_flow') | float / 3.6) | round(2) %}
        {% set time = 2 %}
        {{ (total + (flow_rate_l_s * time)) | round(2) }}
      {% endif %}

Es war beim alten Code nämlich so, wenn der Zustand aus irgendeinem Gund (Flow-Sensor ausgefallen) zu “unavailable” wurde, der Trigger “tr_reset” nicht mehr zum Tragen kam, weil das Template schon vorher abstürzte. Demzufolge wurd der Wert am Ende der Stund auch nicht auf 0 gesetzt, sondern blieb “unavailable”.
Jetzt sollte das korrigiert sein.

Danke dir für die Rückmeldung.