Template Sensor creating errors on start up

I’m working on cleaning up my different yaml files (removing template sensors from sensors.yaml and binary_sensors.yaml) and in doing so I’ve been monitoring my logs to make sure I didn’t cause any issues. I have most of it cleaned up but have two remaining errors I can’t seem to get rid of on a restart of HA.

The this template sensor looks at my four AC Air Filter Life sensors (also templated) and gives me the lowest of them i.e. which one needs changed the soonest. Here is the current snippet of that sensor from my templates.yaml file.

##################################################################################
### AC Air Filter Lowest Days Remaining Template Sensor                        ###
##################################################################################
  - sensor:
    - name: "Lowest Air Filter Life Remaining"
      unique_id: lowest_air_filter_life_remaining
      unit_of_measurement: "days"
      state: >
        {% set sensors = [
          states('sensor.basement_air_filter_life_remaining'),
          states('sensor.furnace_air_filter_life_remaining'),
          states('sensor.master_bedroom_air_filter_life_remaining'),
          states('sensor.hallway_air_filter_life_remaining')
        ] %}
        {% set values = sensors
          | map('regex_findall', '([0-9.]+)')
          | map('first')
          | reject('none')
          | map('float')
          | list %}
        {{ values | min if values else '999' }}

It gives me the lowest of the four sensors, but on start up it throws an error.

Logger: homeassistant.helpers.event
Source: helpers/template.py:646
First occurred: 4:57:57 PM (1 occurrence)
Last logged: 4:57:57 PM

Error while processing template: Template<template=({% set sensors = [ states('sensor.basement_air_filter_life_remaining'), states('sensor.furnace_air_filter_life_remaining'), states('sensor.master_bedroom_air_filter_life_remaining'), states('sensor.hallway_air_filter_life_remaining') ] %} {% set values = sensors | map('regex_findall', '([0-9.]+)') | map('first') | reject('none') | map('float') | list %} {{ values | min if values else '999' }}) renders=2>
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 644, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2969, in _render_with_context
    return template.render(**kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 1295, in render
    self.environment.handle_exception()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 942, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 6, in top-level template code
  File "/usr/local/lib/python3.13/site-packages/jinja2/async_utils.py", line 48, in wrapper
    return normal_func(*args, **kwargs)
  File "/usr/local/lib/python3.13/site-packages/jinja2/filters.py", line 1365, in sync_do_list
    return list(value)
  File "/usr/local/lib/python3.13/site-packages/jinja2/filters.py", line 1503, in sync_do_map
    yield func(item)
          ~~~~^^^^^^
  File "/usr/local/lib/python3.13/site-packages/jinja2/filters.py", line 1745, in func
    return context.environment.call_filter(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        name, item, args, kwargs, context=context
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 569, in call_filter
    return self._filter_test_common(
           ~~~~~~~~~~~~~~~~~~~~~~~~^
        name, value, args, kwargs, context, eval_ctx, True
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/site-packages/jinja2/environment.py", line 550, in _filter_test_common
    return func(*args, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2443, in forgiving_float_filter
    return float(value)
jinja2.exceptions.UndefinedError: No first item, sequence was empty.

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

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 761, in async_render_to_info
    render_info._result = self.async_render(  # noqa: SLF001
                          ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
        variables, strict=strict, log_fn=log_fn, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 646, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: UndefinedError: No first item, sequence was empty.

Followed by this error.

Logger: homeassistant.components.template.template_entity
Source: components/template/template_entity.py:215
integration: Template (documentation, issues)
First occurred: 4:57:57 PM (1 occurrence)
Last logged: 4:57:57 PM

TemplateError('UndefinedError: No first item, sequence was empty.') while processing template 'Template<template=({% set sensors = [ states('sensor.basement_air_filter_life_remaining'), states('sensor.furnace_air_filter_life_remaining'), states('sensor.master_bedroom_air_filter_life_remaining'), states('sensor.hallway_air_filter_life_remaining') ] %} {% set values = sensors | map('regex_findall', '([0-9.]+)') | map('first') | reject('none') | map('float') | list %} {{ values | min if values else '999' }}) renders=4>' for attribute '_attr_native_value' in entity 'sensor.lowest_air_filter_life_remaining'

ChatGPT seems to think the sensors are loaded when HA starts which results in unavailable but the template is looking for a number instead of string. But every version of update to the template sensor it has tried either still gives the same error or make the sensor go unavailable.

Any ideas? I’m way out of my depth on this on.

Thanks!!!

Add an availability… that’s what they’re for.

Also, there’s no reason to use regex…

##################################################################################
### AC Air Filter Lowest Days Remaining Template Sensor                        ###
##################################################################################
  - sensor:
    - name: "Lowest Air Filter Life Remaining"
      unique_id: lowest_air_filter_life_remaining
      unit_of_measurement: "days"
      availability: >
        {% set sensors = [
        'sensor.basement_air_filter_life_remaining',
        'sensor.furnace_air_filter_life_remaining',
        'sensor.master_bedroom_air_filter_life_remaining',
        'sensor.hallway_air_filter_life_remaining'
        ] %}
        {{ sensors | select('has_value') | count > 0 }} 
      state: >
        {% set sensors = [
        'sensor.basement_air_filter_life_remaining',
        'sensor.furnace_air_filter_life_remaining',
        'sensor.master_bedroom_air_filter_life_remaining',
        'sensor.hallway_air_filter_life_remaining'
        ] %}
        {% set lowest = sensors
          | select('has_value')
          | map('states')
          | map('float')
          | min %}
        {{ lowest | default('999',1) }}
1 Like

I assume this portion of your template attempts to produce a list containing exclusively numbers.

        {% set values = sensors
          | map('regex_findall', '([0-9.]+)')
          | map('first')
          | reject('none')
          | map('float')
          | list %}

I suggest you consider replacing it with this:

        {% set values = sensors
          | map('float', none)
          | reject('none')
          | list %}

It assumes each sensor’s value is simply a single number (like 24 or 6). If it’s more complicated than that, please let me know.

1 Like

ChatGPT gave me this. It works, but probably could be cleaned up/simplified I’m sure.

##################################################################################
### AC Air Filter Lowest Days Remaining Template Sensor                        ###
##################################################################################
- sensor:
    - name: "Lowest Air Filter Life Remaining"
      unique_id: lowest_air_filter_life_remaining
      unit_of_measurement: "days"
      state: >
        {% set raw_states = [
          states('sensor.basement_air_filter_life_remaining'),
          states('sensor.furnace_air_filter_life_remaining'),
          states('sensor.master_bedroom_air_filter_life_remaining'),
          states('sensor.hallway_air_filter_life_remaining')
        ] %}
        {% set values = raw_states
          | reject('in', ['unknown', 'unavailable', 'none', ''])
          | map('regex_findall', '([0-9.]+)')
          | selectattr(0, 'defined')
          | map('first')
          | reject('none')
          | map('float')
          | list %}
        {{ values | min if values else 999 }}
      availability: >
        {% set entities = [
          'sensor.basement_air_filter_life_remaining',
          'sensor.furnace_air_filter_life_remaining',
          'sensor.master_bedroom_air_filter_life_remaining',
          'sensor.hallway_air_filter_life_remaining'
        ] %}
        {{ entities
            | map('states')
            | reject('in', ['unknown', 'unavailable', 'none', ''])
            | list
            | count > 0 }}