How to list all sensors with attribute = ‘battery_level’

I’d like an overview of all sensors that have a attribute “battery_level”. And show the sensor name with the value of the battery_level in a list.

With this I get alle my sensors is a list with name and state.

{% set output = namespace(sensors=[]) %}
{% for state in states.sensor %}
{{ state.name }} - {{ state.state }}
{% endfor %}

with this I get a error
“UndefinedError: ‘homeassistant.util.read_only_dict.ReadOnlyDict object’ has no attribute 'battery_level”
But the attribute ‘battery_level’ exist.

{% set output = namespace(sensors=[]) %}
{% for state in states.sensor | selectattr('attributes.battery_level') %}
{{ state.name }} - {{ state.state }}
{% endfor %}

What I am doing wrong?

you are listing all sensors, and calling for all of them the attribute battery. It seems like if there is one sensor without that attribute, it throws an error. You should check before, for each sensor in the list, if the attribute battery exists.

Hi,
If it’s a list of battery states you are after then I recommend to look at the “auto-entities” HACS Lovelace card.
It’s magic for this kinds of thing.

1 Like

Then I think thats the problem. Not all sensors have that attribute. But what i want is just select/filter all the sensors that have that attribute “battery_level”

I now the “auto-entities”. But I want learn more about jinj2 and want to use it in a daily briefing/notifications.

{% for state in states.sensor | selectattr('attributes.battery_level', 'defined') %}
{{ state.name }} - {{ state.state }}
{% endfor %}

This works, thx :ok_hand:

1 Like

Next level :see_no_evil: below I get the sensors with the battery_level state.
But how can I filter to get only the one that are below 20%?

{% for state in states.sensor | selectattr('attributes.battery_level','defined') %}
{{ state.name }} = {{ state_attr(state.entity_id, 'battery_level') }}%
{% endfor %}

I have try it with < 20 add the end of selectattr. And | reject(<, '20')
But that does not work.

{% for state in states.sensor | selectattr('attributes.battery_level', 'defined') | selectattr('attributes.battery_level', 'lt', 20) %}
{{ state.name }} - {{ state.state }}
{% endfor %}

Tnx alot again. Works perfect. I was close But had the ‘ ‘ wrong.
But what means ‘lt’? Lower than?

Yes.

eq ==
ne !=
lt <
le <=
gt >
ge >=

Thank you.