statistics - Werte <= 0 ignorieren

tiermutter

Well-known member
Moin,

ich erfasse bei mir vom Shelly 3EM Statistiken für min. , max. und Durchschnittswerte von Leistung, Strom und Spannung über ein jahr (8760 Stunden).
Das sieht wie folgt aus:

YAML:
  - platform: statistics
    name: 'L1 Leistung max.'
    entity_id: sensor.l1_power
    state_characteristic: value_max
    max_age:
      hours: 8760
    unique_id: 'L1 Leistung max.'
 
  - platform: statistics
    name: 'L1 Leistung min.'
    entity_id: sensor.l1_power
    state_characteristic: value_min
    max_age:
      hours: 8760
    unique_id: 'L1 Leistung min.'

  - platform: statistics
    name: 'L1 Leistung avg.'
    entity_id: sensor.L1_power
    state_characteristic: mean
    max_age:
      hours: 8760
    unique_id: 'L1 Leistung avg.'

Nun hatte ich (bislang nur einmal) das Erlebnis, dass durch einen Neustart von HA oder Shelly 3EM die Werte kurz mit -1 erfasst wurden, was mir die Statistik für die Mindestwerte natürlich versaut. Damit das nicht nochmal passiert würde ich gerne Werte kleiner gleich 0 ignorieren, finde aber nichts, wie ich das umsetze.

Habt ihr eine Idee?
 
Das kannst du so machen
YAML:
- platform: template
    sensors:
      shelly-3em:
        friendly_name: "Shelly 3em"
        unit_of_measurement: 'W'
        device_class: power
        value_template: >
          {% set power = (states('sensor.phase1_active_power')|round ) -  (((states('sensor.phase2_active_power')|round ) + (states('sensor.phase3_active_power') |round))) %}
          {{ 0 if power < 0 else power }}

Oder so...

YAML:
value_template: >
          {{ [0, states('sensor.phase1_active_power')|round - states('sensor.phase2_active_power')|round + states('sensor.phase3_active_power')|round] | max }}
 
Moin, danke für Deine Antwort!

Leider verstehe ich überhaupt nicht, was hierbei passiert...
{{ 0 if power < 0 else power }}
würde ja bedeuten dass der Wert 0 gesetzt wird, wenn der tatsächliche Wert kleiner 0 ist, oder? Damit würde ich den Fehlwert ja aber nicht ignorieren, sondern durch einen anderen falschen Wert ersetzen.

Und das verstehe ich überhaupt nicht 🙈
 
Ja das würde negative Werte gegen 0 ersetzen, denn woher soll home assistant wissen was ein Falscher Wert ist...
Sind 500 Watt falsch weil 1kW erwartet wird?
Oder anstelle von 0 soll HA den zuletzt bekannten Wert eintragen 5kW obwohl nur 500 Watt richtig wären?
Man muss an dieser Stelle eine Entscheidung treffen und 0 ist besser als Negative Werte in der Statistik, man startet HA ja auch nicht alle paar Stunden neu.
Es lassen sich also nur Ausreißer sogenante peak filtern.
 
denn woher soll home assistant wissen was ein Falscher Wert ist
Das will ich ihm ja sagen...
Oder anstelle von 0 soll HA den zuletzt bekannten Wert eintragen 5kW obwohl nur 500 Watt richtig wären?
Das wäre mir hier sogar lieber, ja.
und 0 ist besser als Negative Werte in der Statistik,
Für mich nicht, ich habe folgende Übersicht, in der ich gerne sehen möchte, was jeweils die min und max Werte sind:
1676355121443.png
Solche Werte machen das natürlich unbrauchbar und da die Statistik ja auch über ein Jahr gebildet wird, reicht ein solcher Ausschlag aus um ein Jahr lang Mist da drin stehen zu haben...

Als Workaround kann ich mir vorstellen, diese Werte manuell zu löschen/ korrigieren, über die Entwicklerwerkzeuge/ Statistik geht das für diese Werte aber nicht. Ich habe ja nun mehrfach neu gestartet und das Problem mit diesen Werten ist nur einmal aufgetreten, daher wäre der Aufwand vertretbar das manuell zu machen.
Irgendwo hatte @Nival auch beschrieben wie man diese Werte aus der Datenbank löscht, weiß aber nicht mehr wo...
 
Dann vieleicht über einen Helfer Speicher,
Der sich nur dann aktualisiert wenn dein Eigentlicher sensor
(nicht unbekannt oder nicht erreichbar ist)
Ein negierter Helfer, aber da muss ich erst nochmal drüber nachdenken.
 
Hui, hätte nicht gedacht, dass das so kompliziert und demnach eher ein seltener Wunsch ist...
Wobei ich schon einiges gelesen habe, dass viele auch mit kurzen Spinnereien der Sensoren ähnliche Probleme haben, die sie gerne rausfiltern möchten. Habe auch ein paar Lösungen für die spezifischen Anforderungen gesehen, aber das verstehe ich natürlich nicht und kann es nicht suf mich adaptieren...
 
Jausi, der war das. Nun die große Frage, was von dem was ich gemacht habe wirklich nötig gewesen wäre, die Werte wurden zumindest in der oben gezeigten Karte erst nach einem Neustart anktualisiert, im Verlauf aber sofort. Die hier habe ich gemacht, entsprechend für alle Phasen und auch für Strom und Leistung:

YAML:
DELETE FROM states WHERE entity_id LIKE 'sensor.l1_voltage' AND state LIKE '-1';
DELETE FROM states WHERE entity_id LIKE 'sensor.l1_spannung_min' AND state LIKE '-1.0';

# Bei dem bin ich mir nicht sicher:
DELETE FROM "statistics" WHERE min LIKE '-1.0'
 
Die ersten zwei kannst Du - sofern alle Daten gemeint sind, die mit "-1" beginnen - abkürzen mit AND state LIKE '-1%'; - % steht dabei als Wildcard für alles eventuell folgende.

Welches editieren / löschen was bewirkt ist bei mir halt auch nur "ausprobieren, bzw. schauen was wo auftaucht und stört".

Kann man sowas automatisieren bzw. per one-click ausführbar machen?
In der Theorie sollte das mittels einen Python-Scripts machbar sein denke ich, dann als Dienst ausführbar.
 
Das hier in die template.yaml:

YAML:
- trigger:
    - platform: numeric_state
      entity_id:
        - sensor.phase1_active_power
      above: 0
  sensor:
    name: "Shelly 3em"
    unit_of_measurement: 'W'
    device_class: power
    state: >-
      {{ states('sensor.phase1_active_power') }}

Das aktualisiert seinen State nur, wenn sensor.phase1_active_power Werte größer 0 liefert.
 
Das aktualisiert seinen State nur, wenn sensor.phase1_active_power Werte größer 0 liefert.
Das verstehe ich dann so, dass sensor.phase1_active_power Werte nur dann in die Datenbank übernommen werden, wenn der Wert von sensor.phase1_active_power selbst größer 0 ist. Demnach muss ich nichts weiter anpassen, richtig?
 
Yes, richtig verstanden. Allerdings müssen die Werte des neuen Sensors in der Datenbank landen, nicht die Werte vom sensor.phase1_active_power
 
Das bedeutet dann, dass ich meine min-statistics auf
name: "Shelly 3em"
(...) umändern muss, richtig?
Könnte ich dann nicht einfach
in den statistics zufügen, sprich
YAML:
  - platform: statistics
    name: 'Leistung gesamt min.'
    entity_id: sensor.power_total
    above: 0
    state_characteristic: value_min
    max_age:
      hours: 8760
    unique_id: 'Leistung gesamt min.'
machen? Wäre wohl zu einfach 🙃
 
Das wäre zu einfach und geht deswegen auch nicht 😅
Du müsstest den ändern - wenn du den Code 1 zu 1 nimmst - auf sensor.shelly_3em
Den Namen kannst du natürlich frei wählen und die Entität entsprechend anpassen, wie du möchtest
 
Das wäre zu einfach und geht deswegen auch nicht
Schade :rolleyes:

Bevor ich mir das jetzt 9x einbaue und an 9 Stellen umbaue, behalte ich das erstmal im Hinterkopf... ich habe es gerne einfach gehalten.
Da das mit den negativen Werten ja nun doch auch nur einmal vorgekommen ist, würde ich zunächst auf die Bereinigung der Datenbank zurückgreifen und das noch etwas beobachten... denn wenn er übermorgen statt -1 eine 10000 draus macht, müsste ich ja schonwieder umbauen. In dem Moment ist also wichtig dass es möglich ist und ich es auch so halbwegs verstanden habe :)

Vielen Dank bis hierhin!
 
Ich habe nun festgestellt, dass diese negativen Werte immer dann auftauchen, wenn Shelly neustartet. Komischerweise ist es gestern aber auch zwischendurch aufgetreten, sodass ich dann doch lieber die Lösung mit dem "filtern" umsetzen möchte.
Außerdem werden dadurch auch andere Werte beeinflusst, die nicht -1 ergeben und somit etwas aufwändiger aus der Datenbank gelöscht werden müssen.

Allerdings....
Das hier in die template.yaml:
kriege ich das nicht hin.
Die template.yaml gibt es bei mir nicht, diese habe ich erstellt und versucht mit template: !include template.yaml in der configuration.yaml einzubinden. Der Inhalt davon war zB
YAML:
- trigger:
    - platform: numeric_state
      entity_id:
        - sensor.l1_voltage
      above: 0
  sensor:
    name: "sensor.l1_voltage_filtered"
    unit_of_measurement: 'V'
    device_class: voltage
    state: >-
      {{ states('sensor.l1_voltage') }}
Entsprechend habe ich auch alles in der configuration.yaml auf sensor.l1_voltage_filtered angepasst, ich erhalte aber keine Werte.
Ich habe auch versucht das direkt in die configuration.yaml einzubauen, leider mit dem selben Ergebnis.
Was mache ich da falsch?
 
Probier mal so:

YAML:
- trigger:
    - platform: numeric_state
      entity_id:
        - sensor.l1_voltage
      above: 0
  sensor:
    name: "L1 voltage filtered"
    unit_of_measurement: 'V'
    device_class: voltage
    state: >-
      {{ states('sensor.l1_voltage') | float(0) }}

Und lösch mal vorher alles im Log. Wenn dann Fehler mit dem Code kommen, bitte posten.
 
Verdammt, darauf hätte ich beim Vergleich mit den anderen Dingen die ich irgendwo abgeguckt habe kommen können. :D

Das sieht schonmal besser aus, der Sensor liefert nun einen Wert. Zumindest beim zweiten Versuch.
Keine Ahnung was beim ersten Versuch falsch war (eigentlich ist es identisch zu jetzt), aber dort haben mir plötzlich andere Sensoren keine Werte mehr angezeigt.

So, nun gilt es also erstmal das für alle anderen Sensoren umzusetzen und dann alles darauf zu referenzieren.
Ich hoffe der Test ist dann auch erfolgreich, dann bin ich endlich durch mit der "Grundeinrichtung" von HA :D

Vielen Dank!
 

Zurzeit aktive Besucher

Keine Mitglieder online.

Letzte Anleitungen

Statistik des Forums

Themen
5.021
Beiträge
50.325
Mitglieder
4.712
Neuestes Mitglied
ChristianH
Zurück
Oben