larsvb88
(coax)
November 3, 2023, 8:45am
1
Hi
can anyone help me with what is wrong with this template. want to show sensor in my sidebar where the date is either equal or after current date. the sensor have a timestamp state.
chores: |
{% set sensor_entities = [
'sensor.clean_doors',
'sensor.clean_drain',
'sensor.clean_fridge',
'sensor.clean_behind_furnitures',
'sensor.clean_humdifier'
] %}
{% set current_date = now().date() %}
{%- for sensor in entities if states(sensor) < current_date.strftime('%Y-%m-%d') %}
{% set chore_name = state_attr(sensor_entity, 'friendly_name') %}
{{ "Overdue Chore: " + chore_name }}
{% else %}
{{ "No overdue chores today." }}
{%- endfor %}
koying
(Chris B)
November 3, 2023, 9:44am
2
Not sure if it actually works, but it seems, at least that
for sensor in entities
should be
for sensor_entity in sensor_entities
koying
(Chris B)
November 3, 2023, 10:20am
4
Never use screenshots for code
I guess you forget to change if states(sensor)
by if states(sensor_entity)
larsvb88
(coax)
November 3, 2023, 10:41am
5
Now it shows all the sensors is overdue… is that something with the date format
the humdifier sensor state is formated like this
2023-08-02T13:00:51+00:00
koying
(Chris B)
November 3, 2023, 10:50am
6
You are comparing strings that do not even have the same format.
Try
chores: |
{% set sensor_entities = [
'sensor.clean_doors',
'sensor.clean_drain',
'sensor.clean_fridge',
'sensor.clean_behind_furnitures',
'sensor.clean_humdifier'
] %}
{% set current_date = now().date() %}
{%- for sensor in entities if as_datetime(states(sensor)) > now() %}
{% set chore_name = state_attr(sensor_entity, 'friendly_name') %}
{{ "Overdue Chore: " + chore_name }}
{% else %}
{{ "No overdue chores today." }}
{%- endfor %}
petro
(Petro)
November 3, 2023, 10:57am
7
Optimized
chores: |
{%- set entities = [
'sensor.clean_doors',
'sensor.clean_drain',
'sensor.clean_fridge',
'sensor.clean_behind_furnitures',
'sensor.clean_humdifier'
] %}
{%- for name in expand(entities) | selectattr('state', '<', utcnow().isoformat()) | map(attribute='name') %}
Overdue Chore: {{ name }}
{%- else %}
No overdue chores today.
{%- endfor %}
1 Like
koying
(Chris B)
November 3, 2023, 11:08am
8
Nice, but I doubt the else
will work
Now, it didn’t do what I think the OP wanted it to do, either… Looks like bits and pieces of code patched together without actually understanding how it works.
petro
(Petro)
November 3, 2023, 11:10am
9
Yes it will. That’s normal syntax, just rare
1 Like
larsvb88
(coax)
November 3, 2023, 11:17am
10
if I paste this in template test
chores: |
{% set sensor_entities = [
'sensor.clean_doors',
'sensor.clean_drain',
'sensor.clean_fridge',
'sensor.clean_behind_furnitures',
'sensor.clean_humdifier'
] %}
{% set current_date = now().date() %}
{%- for sensor_entity in sensor_entities if as_datetime(states(sensor_entity)) > now() %}
{% set chore_name = state_attr(sensor_entity, 'friendly_name') %}
{{ "Overdue Chore: " + chore_name }}
{% else %}
{{ "No overdue chores today." }}
{%- endfor %}
It says no overdue chores today
but at least clean_humdifer is the state 2023-08-02T13:00:51+00:00 , so it should show…
If I change the > to < it show all sensor…
koying
(Chris B)
November 3, 2023, 11:22am
11
What dates do those sensors contain?
Dates when cleaning is due, or…
What are the date from the other sensors?
petro
(Petro)
November 3, 2023, 11:23am
12
Overdue should be using <
because lower than now() is in the past. Greather than (>) now is in the future.
Did you try the template I posted?
1 Like
TheFes
(The Fes)
November 5, 2023, 8:37pm
13
@petro I tried it, and it complains about a missing {% endfor %}
Seems you accidentally used {% endif %}
instead of {% endfor %}
Your example in the screenshot helped me in finding out what what was wrong. Good to know you can use {% else %}
in a for loop
larsvb88
(coax)
November 5, 2023, 9:03pm
14
when i try it in template i get an error
TemplateRuntimeError: No filter named ‘name’.
larsvb88
(coax)
November 5, 2023, 9:06pm
15
The sensors contain due date example
sensor.clean_humdifier state: 2023-08-02T13:00:51+00:00
sensor.clean_doors state: 2023-10-28T15:59:57+00:00
i tried just using only one sensor, it shows it correct then
{% set sensor_entity = 'sensor.clean_humdifier' %}
{% set current_date = now().date() %}
{% set sensor_state = states(sensor_entity) %}
{% if sensor_state %}
{% set sensor_date = sensor_state %}
{% if sensor_date <= current_date.strftime('%Y-%m-%d') %}
{% set chore_name = state_attr(sensor_entity, 'friendly_name') %}
{{ "Overdue Chore: " + chore_name }}
{% else %}
{{ "No overdue chores today." }}
{% endif %}
{% endif %}
larsvb88
(coax)
November 6, 2023, 2:40pm
17
Thanks. Now it says No overdue chores today but it should show these to
petro
(Petro)
November 6, 2023, 2:42pm
18
what’s your current time? Do {{ now() }}
in the template editor and paste the results here
larsvb88
(coax)
November 6, 2023, 2:46pm
19
petro:
Do {{ now() }}
2023-11-06 15:45:56.601114+01:00
TheFes
(The Fes)
November 6, 2023, 2:47pm
20
You should use <
here
{%- for sensor_entity in sensor_entities if as_datetime(states(sensor_entity)) > now() %}
As a chore will be overdue if the sensor datatime is lower than the current datetime
You said before it shows all then, what is the state of a chore you wouldn’t expect to show up (so is there a chore which is not overdue yet)?