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?