Do you want your sensor to return last good value until it changes to another good value? That should probably work (untested):
- trigger:
- trigger: homeassistant
event: start
id: ha_start
- trigger: event
event_type: event_template_reloaded
id: template_reload
- trigger: state
entity_id:
- sensor.pet_last_use_date
id: change
sensor:
- name: "Last Valid Pet Litter Use Date"
unique_id: "last_valid_pet_litter_use_date"
device_class: timestamp
state: >
{% set last_value = states('sensor.last_valid_pet_litter_use_date') %}
{% set last_date = as_datetime(last_value) if last_value is not none and as_datetime(last_value) is datetime else as_datetime('1970-01-01')|as_local %}
{% if trigger.id == 'change' %}
{% set value = states('sensor.pet_last_use_date') %}
{% if value is not none and as_datetime(value) is datetime %}
{{ as_datetime(value) }}
{% else %}
{{ last_date }}
{% endif %}
{% else %}
{{ last_date }}
{% endif %}
Important stuff:
- Return only valid timestamps from this sensor: no weird text, no âunavailableâ. The line
{% set last_date = ... %}
is to produce 100% valid date, in any case (also if the sensor currently contains âgarbageâ). - I added 2 more triggers, so that your sensor will be updated immediately on template reload, and it retains itâs last value on HA restart/template reload.
Edit: two more things
{{ 'none' }}
is a string but{{ none }}
is the null value:{% if states('some_sensor') in ['unknown','unavailable',none] %}
- You can output to logs but youâd have to repeat your logic within âactionâ section. Or you can move your logic there. Top-level variables from âactionâ section are visible to sensors.
Example
- trigger:
- trigger: homeassistant
event: start
id: ha_start
- trigger: event
event_type: event_template_reloaded
id: template_reload
- trigger: state
entity_id:
- sensor.pet_last_use_date
id: change
action:
- variables:
last_value: "{{ states('sensor.last_valid_pet_litter_use_date') }}"
last_date: "{{ as_datetime(last_value) if last_value is not none and as_datetime(last_value) is datetime else as_datetime('1970-01-01')|as_local }}"
value: "{{ states('sensor.pet_last_use_date') }}"
new_sensor_value: >-
{% if trigger.id == 'change' %}
{% if value is not none and as_datetime(value) is datetime %}
{{ as_datetime(value) }}
{% else %}
{{ last_date }}
{% endif %}
{% else %}
{{ last_date }}
{% endif %}
- if: "{{ value in ['unknown','unavailable',none] }}"
then:
- action: system_log.write
data:
level: warning
message: >-
The variable 'value' is {{value}}, new sensor value is {{new_sensor_value}}
sensor:
- name: "Last Valid Pet Litter Use Date"
unique_id: "last_valid_pet_litter_use_date"
device_class: timestamp
state: "{{ new_sensor_value }}"