Hallo,
kurze Vorstellung und Einleitung:
seit etwas mehr als 1 Jahr beschäftige ich mich mit HA. Nachdem das Projekt länger ruhen musste und dann auch noch die DB korrupt war, habe ich im Januar mit einer frischen Instanz nochmal neu angefangen. Bislang nutze ich HA noch wenig für Steuerungen, sondern für die Werteerfassung / Statistiken. Dafür habe ich viele Entitäten in der configuration.yaml angelegt. Im Prinzip funktioniert das auch, aber…
Ich habe sehr häufige Ausreißer - nicht nur bei nachfolgender Entität für den Gesamtertrag PV alt, sondern bei sehr vielen Entitäten, die in der configuration.yaml definiert sind. Manche ergeben sich dadurch, dass neue Entitäten aus anderen berechnet werden, z.B. Gesamtertrag PV aus den Erträgen PV alt und PV neu.
Nachfolgende Entität für den Gesamtertrag PV alt steht nur stellvertretend für das grundsätzliche Problem.
Ausgangslage:
Ein Sensor liefert den Zählerstand für PV alt und hatte am 09.08.2026 um 10:30 Uhr den Wert
sensor.bitshake_smartmeterreader_ertrag_pv_alt = 6866.38
Daraus liefert folgende Entity den tatsächlichen Gesamtwert für PV alt:
# Entität für den Gesamtertrag PV alt
- sensor:
- name: Gesamtertrag PV alt (mit Langzeitkorrektur)
unique_id: gesamtertrag_pv_alt
device_class: Energy
state_class: total_increasing
unit_of_measurement: “kWh”
state: “{{ states(‘sensor.bitshake_smartmeterreader_ertrag_pv_alt’) | float(2) + 56120.32 | float(2) }}”
Das liefert korrekt
sensor.gesamtertrag_pv_alt = 62986.7
und funktioniert seit längerem auch grundsätzlich. wenn sensor.bitshake_smartmeterreader_ertrag_pv_alt steigt, dann steigt auch sensor.gesamtertrag_pv_alt um denselben Betrag.
Aber: Es entstehen regelmäßig, zu oft, um das bei allen betroffenen Entitäten händisch korrigieren zu können, extreme Ausreißer von mehreren tausend bis zehntausend kWh (meist nach oben, teilweise aber auch negative).
Ansatz um die Ausreißer abzufangen:
# Entität für den Gesamtertrag PV alt
- sensor:
- name: Gesamtertrag PV alt (mit Langzeitkorrektur)
unique_id: gesamtertrag_pv_alt
device_class: Energy
state_class: total_increasing
unit_of_measurement: “kWh”
# neu wegen ständiger Ausreißer
# nachfolgende Bedingung behält den alten Wert bei, wenn der neue Wert
# a) kleiner ist als der alte Wert
# b) mehr als 0,5 größer ist
state: >
{% set neuer_wert = states(‘sensor.bitshake_smartmeterreader_ertrag_pv_alt’) | float(2) + 56120.32 | float(2) %}
{% set alter_wert = states(‘sensor.gesamtertrag_pv_alt’) | float(2) %}
{% set differenz = neuer_wert - alter_wert %}
{% if 0 < differenz <= 0.5 %}
{{neuer_wert}}
{% else %}
{{alter_wert}}
{% endif %}
Das liefert dann nur noch
gesamtertrag_pv_alt = 2.0
Da aber unmittelbar davoch noch
gesamtertrag_pv_alt = 62986.7
war, ist das vollkommen aus der Luft gegriffen und nicht nachvollziehbar. Der Wert von sensor.bitshake_smartmeterreader_ertrag_pv_alt steigt weiterhin völlig korrekt.
Angenommen der neue Wert ist um 10:35 Uhr
sensor.bitshake_smartmeterreader_ertrag_pv_alt = 3866.78
Dann ist
neuer_wert = 6866.78 + 56120.32 = 62987.1
alter_wert 62986.7 (= sensor.gesamtertrag_pv_alt von 10:30 Uhr - was auch so ist, wenn man sich den Wert im Zustandsdiagramm der Entität zu dem Zeitpunkt anschaut)
differenz = 62987.1 - 62986.7 = 0.4
Damit trifft 0 < differenz < 0.5 zu und es muss neuer_wert gesetzt werden, der ja bekanntlich 62987.1 ist. Es wird aber neuer_wert = 2,0 gesetzt ?!?
Folgender Test
state: >
{% set neuer_wert = states(‘sensor.bitshake_smartmeterreader_ertrag_pv_alt’) | float(2) + 56120.32 | float(2) %}
{% set alter_wert = states(‘sensor.gesamtertrag_pv_alt’) | float(2) + 10000 %}
{% set differenz = neuer_wert - alter_wert %}
{% if 0 < differenz <= 0.5 %}
{{neuer_wert}}
{% else %}
{{alter_wert}}
{% endif %}
liefert
gesamtertrag_pv_alt auf 20.002,0
Die Addition von 10000 zu sensor.gesamtertrag_pv_alt wird also verdoppelt - wie auch immer sich das erklären soll.
Für mich bleibt aktuell eigentlich nur ein Schluss:
Homeasistant kann nicht rechnen bzw. nicht mit if else Bedingungen umgehen, obwohl derartige Skripte für state zahlreich zu finden sind.
Aber vielleicht gibt’s ja auch eine Erklärung für das Phänomen und eine Anpassung für state, die das macht, was gebraucht wird: neuen Wert nur schreiben, wenn dieser
a) größer ist als der bisherige Wert
b) nicht mehr als 0.5 größer ist als der alte Wert
ansonsten alten Wert beibehalten.


