Utility Meter zeigt riesige Werte nach reboot

Hallo zusammen,

ich habe Probleme mit einem Utility Meter, dass ich für die Auswertung von einem Watermeter verwende. Da mein Wasserzähler keine Schnittstelle zum Auslesen hat, habe ich das AI-on-the-edge-device Projekt umgesetzt. Dort kommen per MQTT Zählerstände in m³ rein. Der Zählerstand wird im Sensor sensor.watermeter_value abgelegt.

Ich habe drei Utility Meter zur Aufzeichnung von den täglichen, monatlichen und jährlichen Verbräuchen in YAML definiert,

utility_meter:
  watermeter_daily_consumption:
    source: sensor.watermeter_value_in_l
    unique_id: 7800149f-7745-42cb-85c3-6ce0d170758b
    name: Watermeter daily consumption
    cycle: daily

  watermeter_monthly_consumption:
    source: sensor.watermeter_value
    unique_id: 54b18854-61a9-4fa1-95c9-ad616e6237fa
    name: Watermeter monthly consumption
    cycle: monthly


  watermeter_yearly_consumption:
    source: sensor.watermeter_value
    unique_id: 9c19dcfa-61ef-4004-8a8f-e980fd628fad
    name: Watermeter yearly consumption
    cycle: yearly

Den täglichen Verbrauch möchte ich in Litern aufzeichnen. Deshalb habe ich mir einen Sensor definiert, der den Watermeter-Wert einfach mit dem Faktor 1000 multipliziert.

  - sensor:
    - name: "Watermeter value in L"
      unique_id: 0eb6c75a-894d-4eb6-a742-952e2f75bb40
      icon: mdi:water
      unit_of_measurement: "L"
      state: >
        {% if not is_state('sensor.watermeter_value', 'unknown')  %}
          {{ states('sensor.watermeter_value')|float(0) * 1000 }}
        {% elif not is_state('sensor.watermeter_value', 'unavailable')  %}
          {{ states('sensor.watermeter_value')|float(0) * 1000 }}
        {% elif states('sensor.watermeter_value')|float(0) * 1000 > 0 %}
          {{ states('sensor.watermeter_value')|float(0) * 1000 }}
        {% endif %}

Prinzipiell funktioniert das Aufzeichnen und es werden vernünftige Werte angezeigt.

image

Sobald jedoch ein Neustart (Home Assistant neu starten) stattfindet gibt es Probleme; und zwar nur mit dem Utility Meter für den täglichen Verbrauch. Nach dem Restart zeigt es zunächst korrekt den letzten Wert vor dem Restart an. Sobald aber der erste Wert vom Zähler reinkommt springt der Utility Meter Wert auf sehr große Werte. Die anderen beiden Zählerstände arbeiten korrekt.

image

Auffällig ist, dass der neue Zählerstand aus folgenden zwei Parts besteht

  • 6814170 bleibt Konstant
  • 55 war der letzte Zählerwert

Ich habe keine Ahnung woran das liegt. Hat jemand von Euch eine Idee?

Ich gebe zu, es ist ein Schuß ins Blaue.

Lege mal einen zweiten Verbrauchsmesser an.

  watermeter_daily_consumption:
    source: sensor.watermeter_value_in_l
    unique_id: 7800149f-7745-42cb-85c3-6ce0d170758b_test
    name: Watermeter daily consumption Test
    cycle: daily
    availability: "{{ has_value('watermeter_value_in_l') }}"

Ich lernte gestern, daß Verbrauchszähler im Energyboard ein Problem beim Wechsel von “unavailable” haben und unsinnig hohe Werte anzeigen können. Vielleicht hilft das "availability: “{{ has_value(‘watermeter_value_in_l’) }}” hier auch.

Danke für Dein Feedback.
Wenn ich die configuration variable “availability” verwende, bekomme ich eine Fehlermeldung:

‘availability’ is an invalid option for ‘utility_meter’, check: utility_meter->watermeter_daily_consumption_test->availability

Im der aktuellen Utility Meter Integration gibt es einen Parameter always_available. Ich habe den auf true gesetzt. Er wird in der Doku folgendermaßen beschrieben:
If activated, the sensor will always be available with the last totalized value, even if the source entity is unavailable or unknown.

watermeter_daily_consumption:
    source: sensor.watermeter_value_in_l
    unique_id: 7800149f-7745-42cb-85c3-6ce0d170758b
    name: Watermeter daily consumption
    cycle: daily
    always_available: true

Die Änderung hat aber leider nichts gebracht. Ich vermute, dass es eher am template sensor liegt

So ist das mit den Schnellschüssen aber ein Versuch war es dennoch wert.
Ich hab noch eine Idee.

Dieser Sensor wirkt nicht rund / redundant. Die Bemerkung mit den 2 Werten ließ mich darauf kommen.

Nimm mal diesen als zweiten Sensor und vergleiche das Verhalten.

sensor:
  - name: "Watermeter value in L Test 2"
    unique_id: 0eb6c75a-894d-4eb6-a742-952e2f75bb40_test2
    icon: mdi:water
    unit_of_measurement: "L"
    state: >
      {% set invalide_stati = ['unknown', 'unavailable', 'none'] %}
      {% set water_value = states('sensor.watermeter_value') | lower %}
      {% if water_value not in invalide_stati %}
        {{ water_value | float() * 1000 }}
      {% else %}
        0
      {% endif %}

Na dann, ich gespannt :slight_smile:

Ich hab’s hinbekommen.

  - sensor:
    - name: "Watermeter value in L"
      unique_id: 0eb6c75a-894d-4eb6-a742-952e2f75bb40
      icon: mdi:water
      unit_of_measurement: "L"
      state: >
        {% if has_value('sensor.watermeter_value') %}
          {{states('sensor.watermeter_value')|float(0)*1000}}
        {% endif %}  

Ich habe den Template Sensor noch mal überarbeitet. Wenn der Wert von sensor.watermeter_value’ nicht definiert ist, gibt es keinen Rückgabewert. Den Parameter always_available habe ich weiterhin gesetzt gelassen.

Ich teste aber auch noch mal Deine Lösung. Ich bin mir aber nicht so sicher, ob die Rückgabe von “0” problemlos läuft, da ich ja meinen Wasserzähler mit dem absoluten Zählerstand füttere.

1 „Gefällt mir“

Deine Lösung funktioniert leider nicht. Vermutlich darf das Utility Meter wirklich keinen 0 Wert sehen. Ich vermute, dass der Status-Vergleich nicht richtig funktioniert hat und das Script dann im Else-Zweig gelandet ist.

In der Doku steht drin

has_value('sensor.my_sensor') will test if the given entity is not unknown or unavailable. Can be used as a filter or a test.

Das ist doch eine sehr elegante Lösung um auf gültige Sensorwerte zu testen!

Der Parameter always_available wird nicht gebraucht. Ohne diesen funktioniert der Zähler auch.

Vielen Dank noch mal für die Diskussion.

Ja, Diskussion finde ich bei einer Lösungsfindung immer wichtig.

Ich muß mich mal mehr mit diesem has_value beschäftigen. Bisher fange ich diese Zustände wie oben ab oder | float(0) sehe ich Ich auch oft im Forum.