Weird automation execution on config refresh

So here is my automation:

- alias: battery low detection
  trigger:
    - platform: template
      value_template: >
       {%- for state in states.sensor -%}
         {%- if ('battery_level' in state.entity_id | lower) -%}
             {%- if state.state | int < 10 -%}
                 true
             {%- endif -%}
          {%- endif -%}
        {%- endfor -%}
  condition:
    - condition: state
      entity_id: input_boolean.zwave_up
      state: 'on'
  action:
    - data_template:
        message: >-
          node battery level low {{ trigger.entity_id }}, ({{ trigger.to_state.attributes.friendly_name }}).
        title: HASS
      service: notify.jurgen
    - service: system_log.write
      data_template:
        message: 'node battery level low {{ trigger.entity_id }},{{ trigger.to_state.attributes.friendly_name }}'
        level: warning

I changed some automations and run the config reload for automations and I get this execution:

2020-07-27 09:50:37 WARNING (MainThread) [homeassistant.components.system_log.external] node battery level low sensor.memory_free,Memory free

as you can see, that entity_id does not have “battery_level” in it.

Just running

       {%- for state in states.sensor -%}
         {%- if ('battery_level' in state.entity_id | lower) -%}
                 {{ state.entity_id }}
         {% endif -%}
        {%- endfor -%}

in the template builder I only have:

sensor.aarlo_battery_level_babymonitor
         sensor.black_button_battery_level
         sensor.front_door_battery_level
         sensor.garage_side_door_battery_level
         sensor.kitchen_battery_level
         sensor.laundry_door_battery_level
         sensor.master_bedroom_ensuite_battery_level
         sensor.motion1_battery_level
         sensor.motion2_battery_level
         sensor.motion3_battery_level
         sensor.motion4_battery_level
         sensor.sm_t510_battery_level
         sensor.storage_door_battery_level
         sensor.terry_battery_level

so why does the sensor.memory_free trigger this automation?

doing it again it was a different trigger, not the sensor.memory_free.

A template trigger, like most triggers, needs to watch for entities to change to know when to evaluate it. However, given the way you wrote your trigger template it can’t extract any entity_id’s, so it will be re-evaluated whenever any entity in the system changes.

So, sensor.memory_free changes, which causes the template to be evaluated. It evaluates to true, so it runs the actions. But since sensor.memory_free is the entity that changed that caused the trigger to be evaluated, that’s what trigger.entity_id is set to.

Also, your template will not work if more than one entity meets the criteria, because the template will result in, e.g., 'true true'. But a template trigger will only fire when the template evaluates to 'true'.

I’d suggest this:

- alias: battery low detection
  trigger:
    - platform: event
      event_type: state_changed
  condition:
    - condition: template
      value_template: >
        {{ trigger.event.data.entity_id|regex_match('sensor\..*battery_level.*') and
           trigger.event.data.new_state.state|int < 10 }}
    - condition: state
      entity_id: input_boolean.zwave_up
      state: 'on'
  action:
    - data_template:
        message: >
          node battery level low {{
            trigger.event.data.entity_id
          }}, ({{
            trigger.event.data.new_state.name
          }}).
        title: HASS
      service: notify.jurgen
    - service: system_log.write
      data_template:
        message: >
          node battery level low {{
            trigger.event.data.entity_id
          }},{{
            trigger.event.data.new_state.name
          }}
        level: warning
1 Like

I get ya, i’ll give it a whirl. Thanks

1 Like