Motion Automations

I’ve moved my home automation logic from the ISY994i to Home Assistant but it took me a while to get the responses to activity outside the house right. What I want is for motion to trigger a response (i.e. lights come on) which is simple. Then I want the system to wait until the motion sensors have been off for a while before reverting the initial response. This turned out to be harder than I expected.

Edit: The scheme described below to split the logic into two automations proved messy and brittle though I’m not entirely sure why. After fiddling and asking around in the Discord channels, I switched back to using the original wait_for_trigger scheme below and it’s now working. A glitch in the matrix of some kind… TL;DR, use the initial scheme below, not the one later in this post.

My initial automations to respond to motion sensors going on looked like the one below. It’s triggered when the sensor goes on, remembers the current state of the lights, turns those lights on, waits for the sensor to be off for five minutes, then returns the lights to their initial state. The “wait” step didn’t work.

- alias: Front Motion
  description: ''
  trigger:
  - platform: state
    entity_id: binary_sensor.front_motion
    from: 'off'
    to: 'on'
  condition: []
  action:
  - service: scene.create
    data:
      scene_id: before_front_motion
      snapshot_entities:
      - light.porch_dimmer
      - light.driveway_dimmer
  - type: turn_on
    entity_id: light.porch_dimmer
    domain: light
    brightness_pct: 100
  - type: turn_on
    entity_id: light.driveway_dimmer
    domain: light
    brightness_pct: 100
  - wait_for_trigger:
    platform: state
    entity_id: binary_sensor.front_motion
    from: 'on'
    to: 'off'
    for: 00:05:00
  - scene: scene.before_front_motion

I’ve not confirmed this but I suspect there is something different between the trigger for the automation and the wait_for_trigger action. This automation keeps getting stuck at that action.

I ended up breaking this into two automations that turn each other on and off. The first one starts like the original but where the wait was, it instead turns the second automation on and itself off.

- alias: Front Motion
  description: ''
  trigger:
  - platform: state
    entity_id: binary_sensor.front_motion
    from: 'off'
    to: 'on'
  condition: []
  action:
  - service: scene.create
    data:
      scene_id: before_front_motion
      snapshot_entities:
      - light.porch_dimmer
      - light.driveway_dimmer
  - type: turn_on
    entity_id: light.porch_dimmer
    domain: light
    brightness_pct: 100
  - type: turn_on
    entity_id: light.driveway_dimmer
    domain: light
    brightness_pct: 100
  - service: automation.turn_on
    data: {}
    entity_id: automation.front_motion_after
  - service: automation.turn_off
    data: {}
    entity_id: automation.front_motion

The second one triggers on the sensor being off for five minutes then reverts to the saved state, turns the first automation on and itself off.

- alias: Front Motion (After)
  description: ''
  trigger:
    platform: state
    entity_id: binary_sensor.front_motion
    from: 'on'
    to: 'off'
    for: 00:05:00
  condition: []
  action:
  - scene: scene.before_front_motion
  - service: automation.turn_on
    data: {}
    entity_id: automation.front_motion
  - service: automation.turn_off
    data: {}
    entity_id: automation.front_motion_after

This appears to be working as expected. <fingers-crossed> I’d love to figure out how to accomplish this with a single automation though.

comments powered by Disqus