4 identisch formulierte Sensoren in template.yaml - aber einer funktioniert nicht

Hallo!
Habe 2 batteriebetriebene Sensoren (Zigbee), die jeweils Temperatur und Luftfeuchtigkeit messen. Die Sensoren liefern nicht dauernd Werte, sonder nur sporadisch, insbesondere, wenn sich die genannten Werte ändern. Ansonsten sind sie offline, haben also “Nicht verfügbar” als Status. Nun habe ich 4 virtuelle Sensoren in template.yaml angelegt, die den letztgemeldeten Wert des physischen Sensors melden, falls dieser grade keinen Wert meldet. Der Syntax der 4 virtuellen Sensoren ist exakt gleich, bei 3 der 4 Entitäten funktioniert das prima, aber einer wird gar nicht angelegt, weil HA an der Syntax-Logik meckert.

#--- THS ZigBee Kizi Temperatur ---#
- sensor:
  - name: "kizi_temp_permanent"
    unique_id: "kizi_temp_permanent"
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"
    state: >
      {% set sensorstatus = states('sensor.zigbee_ths_kizi_temperatur', 'raw_state') %}
      {% if sensorstatus != 'unavailable' %}
          {% set valuetokeep = sensorstatus %}
          {{ states('sensor.zigbee_ths_kizi_temperatur', 'raw_state') | float}}
      {% else %}
          valuetokeep
      {% endif %}
      
#--- THS ZigBee Kinderzimmer Luftfeuchtigkeit ---#
- sensor:
  - name: "kizi_hum_permanent"
    unique_id: "kizi_hum_permanent"
    unit_of_measurement: "%"
    device_class: "humidity"
    state_class: "measurement"
    state: >
      {% set sensorstatus = states('sensor.zigbee_ths_kizi_luftfeuchtigkeit', 'raw_state') %}
      {% if sensorstatus != 'unavailable' %}
          {% set valuetokeep = sensorstatus %}
          {{ states('sensor.zigbee_ths_kizi_luftfeuchtigkeit', 'raw_state') | float }}
      {% else %}
          valuetokeep
      {% endif %}

#--- THS ZigBee Anna Schlafzimmer Temperatur ---#
- sensor:
  - name: "anna_temp_permanent"
    unique_id: "anna_temp_permanent"
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"
    state: >
      {% set sensorstatus = states('sensor.zigbee_ths_anna_schlafzimmer_temperatur', 'raw_state') %}
      {% if sensorstatus != 'unavailable' %}
          {% set valuetokeep = sensorstatus %}
          {{ states('sensor.zigbee_ths_anna_schlafzimmer_temperatur', 'raw_state') | float }}
      {% else %}
          valuetokeep
      {% endif %}

#--- THS ZigBee Anna Schlafzimmer Luftfeuchtigkeit ---#
- sensor:
  - name: "anna_hum_permanent"
    unique_id: "_anna_hum_permanent"
    unit_of_measurement: "%"
    device_class: "humidity"
    state_class: "measurement"
    state: >
      {% set sensorstatus = states('sensor.zigbee_ths_anna_schlafzimmer_luftfeuchtigkeit', 'raw_state') %}
      {% if sensorstatus != 'unavailable' %}
          {% set valuetokeep = sensorstatus %}
          {{ states('sensor.zigbee_ths_anna_schlafzimmer_luftfeuchtigkeit', 'raw_state') | float }}
      {% else %}
          valuetokeep
      {% endif %}

Und hier die Fehlermeldung im Log:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/sensor/__init__.py", line 663, in state
    numerical_value = float(value)  # type:ignore[arg-type]
                      ^^^^^^^^^^^^
ValueError: could not convert string to float: 'valuetokeep'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 600, in _async_add_entities
    await coro
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 914, in _async_add_entity
    await entity.add_to_platform_finish()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1354, in add_to_platform_finish
    await self.async_added_to_hass()
  File "/usr/src/homeassistant/homeassistant/components/template/template_entity.py", line 545, in async_added_to_hass
    async_at_start(self.hass, self._async_template_startup)
  File "/usr/src/homeassistant/homeassistant/helpers/start.py", line 71, in async_at_start
    return _async_at_core_state(
           ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/start.py", line 36, in _async_at_core_state
    hass.async_run_hass_job(at_start_job, hass)
  File "/usr/src/homeassistant/homeassistant/core.py", line 936, in async_run_hass_job
    hassjob.target(*args)
  File "/usr/src/homeassistant/homeassistant/components/template/template_entity.py", line 486, in _async_template_startup
    result_info.async_refresh()
  File "/usr/src/homeassistant/homeassistant/helpers/event.py", line 1071, in async_refresh
    self._refresh(None)
  File "/usr/src/homeassistant/homeassistant/helpers/event.py", line 1257, in _refresh
    self.hass.async_run_hass_job(self._job, event, updates)
  File "/usr/src/homeassistant/homeassistant/core.py", line 936, in async_run_hass_job
    hassjob.target(*args)
  File "/usr/src/homeassistant/homeassistant/components/template/template_entity.py", line 435, in _handle_results
    self.async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1000, in async_write_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1126, in _async_write_ha_state
    state, attr, capabilities, shadowed_attr = self.__async_calculate_state()
                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1061, in __async_calculate_state
    state = self._stringify_state(available)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1006, in _stringify_state
    if (state := self.state) is None:
                 ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/sensor/__init__.py", line 665, in state
    raise ValueError(
ValueError: Sensor sensor.kizi_temp_permanent has device class 'temperature', state class 'measurement' unit '°C' and suggested precision 'None' thus indicating it has a numeric value; however, it has the non-numeric value: 'valuetokeep' (<class 'str'>)

Es wird bemängelt, dass der Sensor einen non-numerischen Wert haben sollte, was er bei “unavailable” aber nicht hat. Deswegen kann HA die Variable valuetokeep nicht in eine float umwandeln. Klingt ja logisch, aber warum funktioniert es bei den anderen 3 Sensoren ohne Probleme?

Beim ersten fehlt das | float.

Die Syntax in deiner YAML ist falsch. Wenn du den Wert von valuetokeep benutzen möchtest, musst du ihn mit doppelt geschweiften Klammern umschließen {{ valuetokeep }}, ansonsten wird der String valuetokeep benutzt un der führt zu der Fehlermeldung. Das es bei den anderen Sensoren funktioniert liegt vermutlich daran, dass sie Werte liefern und nur der eine Sensor nicht.

Sorry, ist irgendwie bei C & P verloren gegangen. Steht im HA drin und ich hab es jetzt auch oben ausgebessert.

Ok, teste ich. Aber wieso funktioniert dieser falsche Syntax bei den drei anderen Sensoren?

Weil die anderen Sensoren vermutlich Werte liefern.

{{ valuetokeep }} liefert exakt dieselbe Fehlermeldung.

Der betreffende (physische) Sensor liefert schon Werte, in ca derselben Häufigkeit wie die anderen drei.

Ich würde gerne verstehen, wieso ein falscher Syntax 3x das korrekte Ergebnis liefert und einmal von HA abgelehnt wird.

Jeder einzelne Deiner Sensoren ist falsch und wird bei Wert unavailable einen Fehler aufwerfen. Es ist kein Syntax Fehler, mit der stimmt alles.
Der Wert “valuetokeep” kann es nur geben, wenn zuvor der Sensor einen Wert geliefert hat.

Auch gibst Du mit
valuetokeep
einen String “valuetokeep” aus und nicht die Variable valuetokeep
{{ valuetokeep }}

Der Sensor egal wie Du ihn aufbaust, wird nach einen Home Assistant Neustart nicht funktionieren. Weil die Variable sensorstatus nach einen Neustart verloren geht.

Wenn Überhaupt, musst Du mit einen Tigger Based Template Sensor arbeiten.
Dieser behält seinen letzen Wert auch nach einem Home Assistant Neustart.

Aber das alles ist eigentlich gar nicht notwendig im Fall von ZigBee Sensoren.

Das diese nur Werte senden wenn es einen Änderung gibt und sonst schlafen ist ganz normal. Wenn diese in der Zeit bei Dir als nicht Verfügbar angezeigt werden, liegt an Deiner Konfiguration!

Nutzt Du ZigBee2MQTT? Wen ja, schalte die Verfügbarkeit für die Sensoren aus.

Gruß
Osorkon

Es ist richtig, dass alle 3 funktionierenden virtuellen Sensoren nach einem Neustart “Nicht verfügbar” anzeigen. Allerdings nur wenige Minuten, sobald die physischen Sensoren den ersten Wert liefern, wird dieser in valuetokeep “behalten”, bis der nächste Wert eintrudelt, dann ändert sich valuetokeep auf den neuen Wert. Diese Sensoren arbeiten dann wie sie sollen. Dass es nach einem Neustartkurz einmal 3-5 Minuten keine Werte gibt, stört nicht, ich starte ja nicht ständig neu.

Ich verstehe aber nicht, warum das beim 1. Sensor nicht geht, denn der wird von HA erst gar nicht als Entität angelegt, die anderen drei schon. Warum wird valuetokeep nur beim ersten Sensor bekrittelt, bei den anderen dreien nicht?

Nein, Zigbee2MQTT nutze ich nicht.

Auch gibst Du mit
valuetokeep
einen String “valuetokeep” aus und nicht die Variable valuetokeep
{{ valuetokeep }}

Wenn das stimmen würde, würden die 3 funktionierenden Sensoren ja “valuetokeep” ausgeben, tun sie aber nicht. Sie geben einen Wert aus.

Schau dir den Sensornamen mal genau an :wink:
image

1 „Gefällt mir“

Welche ZigBee Integration, den dann?
Es ist nicht normal, dass ZigBee Sensoren als nicht verfügbar geführt werden, wenn sie schlafen. Außer Du hast das explizit so eingestellt!

Weil sie aktuell einen numerischen Wert besitzen und nicht den Status unavailable.

Dein CODE für die 4 Sensoren von Dir 1:1 kopiert, lediglich die 4 Entitäten gegen 4 von meinen ersetzt. Alle 4 Template Sensoren werden erstellt und liefern Werte.

Bei einen der Sensoren habe ich den Status manuell auf unavailable gesetzt.
Und siehe da, der der zugehörige Template Sensor bekommt ebenfalls den Wert unavaulable.

Wie schon erwähnt würde ich Trigger based Template Sensoren verwenden, würde dann so aussehen.

template:
#--- THS ZigBee Kizi Temperatur ---#
  - trigger:
      - platform: state
        entity_id:
          - sensor.zigbee_ths_kizi_temperatur
        not_to:
          - unavailable
          - unknown
    sensor:
      name: "kizi_temp_permanent"
      unique_id: 1a979f57-4162-48ca-80d7-5ca936abf67e
      unit_of_measurement: "°C"
      device_class: "temperature"
      state_class: "measurement"
      state: |
        {{ trigger.to_state.state}}
          
    #--- THS ZigBee Kinderzimmer Luftfeuchtigkeit ---#
  - trigger:
      - platform: state
        entity_id:
          - sensor.zigbee_ths_kizi_luftfeuchtigkeit
        not_to:
          - unavailable
          - unknown
    sensor:
      name: "kizi_hum_permanent"
      unique_id: 2684735e-737f-4ee4-8889-f0cdda851331
      unit_of_measurement: "%"
      device_class: "humidity"
      state_class: "measurement"
      state: |
        {{ trigger.to_state.state}}

    #--- THS ZigBee Anna Schlafzimmer Temperatur ---#
  - trigger:
      - platform: state
        entity_id:
          - sensor.zigbee_ths_anna_schlafzimmer_temperatur
        not_to:
          - unavailable
          - unknown
    sensor:
      name: "anna_temp_permanent"
      unique_id: 983cc7a4-918e-4ccd-aa71-b0495187901c
      unit_of_measurement: "°C"
      device_class: "temperature"
      state_class: "measurement"
      state: |
        {{ trigger.to_state.state}}

    #--- THS ZigBee Anna Schlafzimmer Luftfeuchtigkeit ---#
  - trigger:
      - platform: state
        entity_id:
          - sensor.zigbee_ths_anna_schlafzimmer_luftfeuchtigkeit
        not_to:
          - unavailable
          - unknown
    sensor:
      name: "anna_hum_permanent"
      unique_id: 1df6d407-514a-476f-ad97-5ed2e8c5496e
      unit_of_measurement: "%"
      device_class: "humidity"
      state_class: "measurement"
      state: |
        {{ trigger.to_state.state}}

Gruß
Osorkon

Oh Gott, danke :sweat_smile:. Ein kleines “r” vergessen. Jetzt funktioniert es​:innocent:.

Und offenbar ist es egal, ob

valuetokeep

oder

{{ valuetokeep }}

Danke euch allen für die Hilfestellung, auch das mit dem Trigger werd ich mir mal anschauen. Stehe noch ganz am Anfang bei HA😇

Die Sensoren sind über tuya eingebunden. Wahrscheinlich sollte ich mir Zigbee2MQTT auch gleich zu Gemüte führen😅

Und diese hast Du über die Tuya Cloud in Home Assistant eingebunden? Dann liegt es nicht an den Sensoren, sondern an der Verbindung zur Cloud die ständig unterbrochen wird.

Schaffe Dir was locales an, dan braucht es auch keine Template Sensoren. :wink:

Gruß
Osorkon

“Lokal” in puncto Hard- oder Software? Localtuya hab ich für 3 Switches, damit liefen aber andere 2 Switches nicht bzw. nicht verlässlich.