Energy Dashboard falsche Werte verhindern

Tobbes

New member
Hallo Forum,
ich lese die Energiedaten (Strombezug und Einspeisung) mit tasmota auf einem WEMOS aus.
Die Daten kommen per mqtt in homeassistant an. Leider habe ich immer wieder falche Messungen, die mir das Balkendiagramm im EnergyDashboard zerschiessen.
Diese Daten dann aus der Statistik zu löschen ist doch sehr nervig.

Angeblich habe ich zB mehrer 100 kWh Einspeisung innerhalb von Minuten, obwohl ich nur ein Balkonkraftwerk betreibe.

Meinen Sensor für das Energy Dashboard habe ich in der configuration.yaml so angelegt:

Code:
 - name: "Einspeisung"
     unit_of_measurement: kWh
     state_class: total_increasing
     device_class: energy
     state: >
           {% if states('sensor.tasmota_haus_total_out') == 'unavailable' or states('sensor.tasmota_haus_total_out') < '1' %}
            {{ states('sensor.einspeisung') }}
           {% else %}
            {{ states('sensor.tasmota_haus_total_out') }}
           {% endif %}

Der "sensor.tasmota_haus_total_out" ist der Zählerwert, der die gesamte Einspeisung hochzählt.

Wie kann ich die Sensordaten verwerfen, wenn diese beispielsweise 10% vom vorherigen Wert abweichen?
Oder gibt es einen eleganten Weg, um große Fehlmessungen zu verwerfen?


Gruß tobbes
 
So zum Beispiel lassen sich peak eines read Kontakt Gaszähler abfangen

YAML:
- platform: template
  sensors:
# Gaszähler, kommend von ESPHome, aufbereiten für Energy
    gasincubicmeter:
      value_template: >
        {% if states('sensor.gasverbrauch') | float == 0 %}
        {{ states('sensor.gasincubicmeter') }}
        {% else %}
        {{ states('sensor.gasverbrauch') | float }}
        {% endif %}
      unit_of_measurement: m³
      device_class: gas
      attribute_templates:
        state_class: total_increasing
 
value_template: > {% if states('sensor.gasverbrauch') | float == 0 %} {{ states('sensor.gasincubicmeter') }} {% else %} {{ states('sensor.gasverbrauch') | float }} {% endif %}

Hi alexamend,
danke für den Hinweis. Ich kenne mich mit der Syntax nicht so dolle aus, aber wird hier nicht nur der Nullwert verhindert?

Ich verstehe hier:
Wenn der Wert von 'sensor.gasverbrauch' Null ist - nehme den alten Wert von 'sensor.gasincubicmeter'
Sonst nehme den aktuellen Wert für 'sensor.gasverbrauch'.

Bei mir treten leider zu hohe Werte auf. Ich bräuchte also einen Befehl wie:
Wenn der aktuelle Wert 10% größer ist als der letzte Wert - nehme den letzten Wert
Sonst nehme den aktuellen Wert

Wie muss ich diese Zeile
Code:
 {% if states('sensor.gasverbrauch') | float == 0 %}
anpassen?

Gruß tobbes
 
du könntest in einem range filtern z.B. hier zwischen 40% und 120%
YAML:
value_template: >-
  {%- if states('sensor.gasverbrauch') | float >= 40 and states('sensor.gasverbrauch') | float <= 120 -%}
  {{ states('sensor.gasincubicmeter') | round(1) }}
  {%- else -%}
  {{ states('sensor.gasverbrauch') | float }}
  {%- endif -%}

ob man mit bezug auf den vorherigen Wert filtern kann ??? habe ich bisher nicht benötigt

es gibt noch die Integration Filter eventuell hilft dir diese weiter.
 
Hi,
sind die Werte hinter float wirklich Prozent? Ich dachte hier sind absolute Werte genannt?

Gruß tobbes
 
dies wird zum splitting verwendet, hat nichts mit der Einheit zu tun.
{%- if states('sensor.gasverbrauch') | float >= 40 and states('sensor.gasverbrauch') | float <= 120 -%}
 
Hi, ich muss mich nochmal zu dem Thema melden.

Ich konnte die Messdaten der Einspeisung bereinigen, indem ich den Sensor so anlege:

Code:
 - sensor:
          - name: "Einspeisung_korr"
            unique_id: "Einspeisung_korr"
            unit_of_measurement: "kWh"
            state_class: total_increasing
            device_class: energy
            state: >
          {% if states('sensor.einspeisung_korr') | int > 5 %}
             {{ states('sensor.tasmota_haus_total_out') }}
          {% else %}
             {{ states('sensor.tasmota_haus_total_out') | int }}
          {% endif %}

Leider funktioniert nun die Anzeige mit der Berechnung der Netzneutralität und der Selbstverbrauchten Solarenergie nicht mehr.
Es steht dort, dass diese Werte nicht berechnet werden konnten.

Ändere ich den Sensor der Einspeisung und nehme die Berechnung zum Wert weg, funktioniert die Berechnung von Netzneutralität und der Selbstverbrauchten Solarenergie wieder. Allerdings habe ich dann wieder das Ursprungsproblem mit den Ausreißeren.

Wie kann ich den Sensorwert der Einspeisung korrigieren und trotzdem die Berechnung der weiteren Werte bekommen?

Gruß Tobbes
 
Danke für den Hinweis.

Leider bringt die Änderung von int nach float keine Besserung.

Habt ihr noch weitere Ideen?

Gruß Tobbes
 
das Ganze schaut auch etwas komisch aus ist das in deiner config so drin

YAML:
 - sensor:
          - name: "Einspeisung_korr"
            unique_id: "Einspeisung_korr"
            unit_of_measurement: "kWh"
            state_class: total_increasing
            device_class: energy
            state: >
          {% if states('sensor.einspeisung_korr') | int > 5 %}
             {{ states('sensor.tasmota_haus_total_out') }}
          {% else %}
             {{ states('sensor.tasmota_haus_total_out') | int }}
          {% endif %}

das müsset wohl eher so ausschauen und ist dies absicht ? # sendor Identisch ? absicht ?

YAML:
- sensor:
  - name: "Einspeisung_korr"
    unique_id: "Einspeisung_korr"       # sendor Identisch ? absicht ?
    unit_of_measurement: "kWh"
    state_class: total_increasing
    device_class: energy
    state: >
      {% if states('sensor.einspeisung_korr') | int > 5 %}       # sendor Identisch ? absicht ?
      {{ states('sensor.tasmota_haus_total_out') }}
      {% else %}
      {{ states('sensor.tasmota_haus_total_out') | int }}
      {% endif %}
 
Damit kannst du einen Bereich für ausgegebene Werte festlegen:

Code:
{% set x = states('sensor.xxxxxx') | float(0) %}
  {{ ([0, x, 9999]|sort)[1] }}

Für die 9999 trägst du ein, was du als möglichen Maximalwert erachtest. Alles was über dem Wert liegt, wird auf den eingetragenen Wert korrigiert.
 
Damit kannst du einen Bereich für ausgegebene Werte festlegen:

Code:
{% set x = states('sensor.xxxxxx') | float(0) %}
  {{ ([0, x, 9999]|sort)[1] }}

Für die 9999 trägst du ein, was du als möglichen Maximalwert erachtest. Alles was über dem Wert liegt, wird auf den eingetragenen Wert korrigiert.
Das hört sich gut an. Was ist der "eingetragene Wert"? Ist es ein fester vorgewählter Wert?
Könnte ich hier den letzten guten Wert (sensor.einspeisung_korr) verwenden?

Gruß Tobbes
 
das Ganze schaut auch etwas komisch aus ist das in deiner config so drin

YAML:
 - sensor:
          - name: "Einspeisung_korr"
            unique_id: "Einspeisung_korr"
            unit_of_measurement: "kWh"
            state_class: total_increasing
            device_class: energy
            state: >
          {% if states('sensor.einspeisung_korr') | int > 5 %}
             {{ states('sensor.tasmota_haus_total_out') }}
          {% else %}
             {{ states('sensor.tasmota_haus_total_out') | int }}
          {% endif %}

das müsset wohl eher so ausschauen und ist dies absicht ? # sendor Identisch ? absicht ?

YAML:
- sensor:
  - name: "Einspeisung_korr"
    unique_id: "Einspeisung_korr"       # sendor Identisch ? absicht ?
    unit_of_measurement: "kWh"
    state_class: total_increasing
    device_class: energy
    state: >
      {% if states('sensor.einspeisung_korr') | int > 5 %}       # sendor Identisch ? absicht ?
      {{ states('sensor.tasmota_haus_total_out') }}
      {% else %}
      {{ states('sensor.tasmota_haus_total_out') | int }}
      {% endif %}
Danke für Dein Feedback.
Ja es war so beabsichtigt. Habe es mir so aus dem Internet zusammengebaut (ohne es zu durchschauen ...) und hat soweit ganz gut funktioniert.
 
Ein fester Wert, nämlich das was du statt der beispielhaften 9999 einträgst.
Hi, leider mache ich es offensichtlich falsch. Habe statt 9999 nun 5 gewählt. Nun ist allerdings die Einspeisung immer 5.
So sieht mein Sensor nun aus:
Code:
  - sensor:
       - name: "Einspeisung_bereinigt"
         unique_id: "Einspeisung_bereinigt"
         unit_of_measurement: "kWh"
         state_class: total_increasing
         device_class: energy
         state: >
           {% set x = states('sensor.tasmota_haus_total_out') | float(0) %}
            {{ ([0, x, 5]|sort)[1] }}

Könnt ihr helfen?

Positiv ist, dass nun die Diagramme der Netzneutralität und der Selbstverbrauchten Solarenergie wieder erscheinen!(y)
 
Das hast du falsch verstanden. Trag da den höchsten plausiblen Wert ein, den dein Balkonkraftwerk einspeisen kann. Also zb. 600.
Alles was an Daten über diesem Wert per MQTT ankommt, wird auf 600 begrenzt.
Also wenn MQTT den Wert 1000 liefert, wird daraus eine 600. Das filtert also deine gelegentlichem unplausiblen Spikes weg.
 
Das hast du falsch verstanden. Trag da den höchsten plausiblen Wert ein, den dein Balkonkraftwerk einspeisen kann. Also zb. 600.
Alles was an Daten über diesem Wert per MQTT ankommt, wird auf 600 begrenzt.
Also wenn MQTT den Wert 1000 liefert, wird daraus eine 600. Das filtert also deine gelegentlichem unplausiblen Spikes weg.
Danke für die Rückmeldung.
Leider ist der Sensor nicht direkt der Ertrag der PV sondern die Einspeisung am Stromzähler. Der Wert wächst also bei jeder Einspeisung. Derzeit steht er bei 18kWh und ich werde den Wert hier {{ ([0, x, 50]|sort)[1] }} setzen.
Muss ihn dann halt entsprechend anpassen wenn der Zähler diesen Wert erreicht hat.
Ich dachte ich könnte einen Filter nutzen "neuer Wert soll verworfen werden, wenn er um x höher ist als der alte Wert".
Dann müßte ich nicht daran denken, den Wert anzupassen.


Gruß Tobbes
 
Hallo zusammen,
ich hatte exakt dieses Problem mit dem Tasmota Hichi IR Lesekopf.

Auf Home Assitant Ebene konnte ich das Problem lösen, indem ich einen Filter verwende (Filter - Home Assistant) der alle unbrauchbaren Werte verwirft.
Und so sieht der Filter in meiner sensor.yaml aus:
YAML:
# Filtert Ausreißer bei der Abfrage des aktuellen Gesamtverbrauchs / des aktuellen Zählerstands
  - platform: filter
    name: "Gefilterter Gesamtverbrauch"
    entity_id: sensor.tasmota_lk13be_power_total_in
    unique_id: "Gefiltert_power_total_in"
    filters:
     - filter: outlier
       window_size: 7
       radius: 3.0
Wobei die window_size: 7 festlegt, wie viele der vergangenen Zustände/Werte für den Vergleich herangezogen werden. sensor.tasmota_lk13be_power_total_in ist der vom Lesekopf bereitgestellte Tasmota-Sensor und name: “Gefilterter Gesamtverbrauch” erzeugt einen neuen Sensor (sensor.gefilterter_gesamtverbrauch) der die bereinigten Werte enthält.
 
Zuletzt bearbeitet:

Letzte Anleitungen

Statistik des Forums

Themen
4.519
Beiträge
46.340
Mitglieder
4.149
Neuestes Mitglied
Kolloge
Zurück
Oben