Tasmota stromzähler auslesen falschwerte

Hallo zusammen,

ich brauche mal Eure Hilfe. So langsam bin ich leicht überfragt und hoffe auf Eure Kompetenz.
Wie Simon in seinem Block beschrieben hat, habe ich erfolgreich seit einem Jahr einen Hichi IR-WiFi mit Tasmota-SML Stromzähler im Einsatz.
Auch die Template Sensoren konnte ich nahezu übernehmen.
Beim näheren prüfen ist nun mit der Spook Integration und den neuen Updates von HA ein paar Fehlermeldungen aufgetreten.
Ursprünglicher code in der configurtion. yaml unter den Punkt template:

   - sensor:
    # Stromzähler Keller Verbrauch
      - name: "Stromzähler Verbrauch"
        unique_id: "StromVerbrauch"
        unit_of_measurement: 'kWh'
        device_class: "energy"
        state_class: "total_increasing"
        state: >-
            {{ float(states('sensor.tasmota_sml_total_kwh')) | round(3) }}

geänderte Code um die float Default Problematik zu lösen

- sensor:
    # Stromzähler Keller Verbrauch
      - name: "Stromzähler Verbrauch"
        unique_id: "StromVerbrauch"
        unit_of_measurement: 'kWh'
        device_class: "energy"
        state_class: "total_increasing"
        state: >-
            {{ states('sensor.tasmota_sml_total_kwh') | float(default=0) | round(3) }}

nun bekomme ich zwar keine Fehlermeldungen mehr jedoch bekomme ich jetzt Werte die utopisch und falsch sind. Dabei werden die Gesamtjahreswerte angegeben und nicht wie üblich immer nur die Differenz. Das passiert mal öfter mal weniger aber fast täglich. Und ja das liegt höchstwahrscheinlich am schlechten Wlan empfang im Keller.
Jedoch hat Chat GPT und folgender Post gezeigt dass dies auch gelöst werden kann.

https://community.simon42.com/t/fehlerhafte-messwerte-energie-dashboard/8936/9

Chat GPT hatte mir folgendes gezeigt:

- sensor:
    # Stromzähler Keller Verbrauch
      - name: "Stromzähler Verbrauch"
        unique_id: "StromVerbrauch"
        unit_of_measurement: 'kWh'
        device_class: "energy"
        state_class: "total_increasing"
    state: >-
        {% set new_value = states('sensor.tasmota_sml_total_kwh') | float(default=0) %}
        {% set last_value = states('sensor.stromzahler_verbrauch') | float(default=0) %}
        {% if new_value >= last_value and (new_value - last_value) < 10 %}
          {{ new_value | round(3) }}
        {% else %}
          {{ last_value | round(3) }}
        {% endif %}

Leider funktioniert dieser code nicht wirklich, da die bekannten Templatesensoren (obwohl die Angabe des Namens ja identisch ist und nur die Berechnung angepasst wurde) nicht mehr erkannt wurden zu den vorhandenen im Energiedashboard.

Daher meine Frage an Euch: Wie kann ich diesen Code zum laufen bringen, sodass diese utopischen Werte herausgefiltert werden und die gleichen Sensoren benutzt werden um keine Daten zu verlieren oder neue Sensoren im Enegiedashboard hinzufügen zu müssen?
Oder wie habt ihr diese Problematik behoben?
VG Markus

Ich vermute, es liegt am “default=0” hinter dem float. (Warum nutzt du das überhaupt?)

Ich schätze, wenn mal kein Wert für “tasmota_sml_total_kwh” kommt, er halt als Standard die 0 setzt. Danach kommt wieder ein Wert und dann war dein Verbrauch nicht die Differenz vom vorherigen zum neuen Wert, sondern von 0 zum neuen Wert.

1 „Gefällt mir“

Ja genau.
Ich habe ab und zu einen unavailable wert anstatt eines zahlen Wertes. Float kann damit nicht umgehen und daher muss ein default Wert gesetzt werden.
0 ist somit mehr als falsch und es müsste der alte Wert sein.
Wie mache ich das?

Setz deinen last_value mal auf this.state und lasse die defaults weg.
Ob der new_value eine Zahl enthält, kannst du dann mit is_number prüfen

{% set new_value = states('sensor.tasmota_sml_total_kwh') | float %}
{% set last_value = this.state | float %}
{% if new_value | is_number %}

leider kommt eine Fehlermeldung dass this.state unbekannt ist
daher habe ich nochmal weiter gesucht und bin auf folgende Lösung gestoßen

# Template strom Verbrauch
  - trigger:
      - platform: state
        entity_id:
          - sensor.tasmota_sml_total_kwh
    sensor:
      - name: "Stromzähler Verbrauch"
        unique_id: "StromVerbrauch"
        unit_of_measurement: 'kWh'
        device_class: "energy"
        state_class: "total_increasing"
        state: |
          {{ iif(is_state('sensor.tasmota_sml_total_kwh', 'unavailable'), states('sensor.stromzahler_verbrauch'), states('sensor.tasmota_sml_total_kwh')) }}

somit wird nun der Status bei einem unavailable nicht mehr 0 gesetzt sondern der letzte Wert bleibt bestehen. Es gibt so keine Fehlermeldungen mehr im Protokoll zu diesen template sensoren bei mir.

Danke an Alle!