5 Commits

View File

@ -5,11 +5,11 @@
######################## ########################
mode: queued mode: queued
max: 10 max: 25
blueprint: blueprint:
name: "Mike's Motion Activated Light" name: "Mike's Motion Activated Scenes"
description: "Turn lights on or off based on motion, plus an increasing delay when motion is continuously detected." description: "Activate scenes based on motion with notice and warning phases, plus an increasing delay when motion is continuously detected."
domain: automation domain: automation
input: input:
@ -69,7 +69,7 @@ blueprint:
notice_seconds: notice_seconds:
name: "Notice seconds" name: "Notice seconds"
description: "The number of seconds to wait in the Prep1 (Notice) scene." description: "The number of seconds to wait in the Notice scene."
default: 15 default: 15
selector: selector:
number: number:
@ -81,7 +81,7 @@ blueprint:
warning_seconds: warning_seconds:
name: "Warning seconds" name: "Warning seconds"
description: "The number of seconds to wait in the Prep2 (Warning) scene." description: "The number of seconds to wait in the Warning scene."
default: 15 default: 15
selector: selector:
number: number:
@ -99,16 +99,16 @@ blueprint:
domain: scene domain: scene
scene_off_prep_1: scene_notice:
name: "Off Prep Scene 1 (Notice)" name: "Notice Scene"
description: "The first scene to activate when motion is no longer detected (notice phase)." description: "The first scene to activate when motion is no longer detected (notice phase)."
selector: selector:
entity: entity:
domain: scene domain: scene
scene_off_prep_2: scene_warning:
name: "Off Prep Scene 2 (Warning)" name: "Warning Scene"
description: "The second scene to activate when motion is no longer detected (warning phase)." description: "The second scene to activate when motion is no longer detected (warning phase)."
selector: selector:
entity: entity:
@ -153,6 +153,21 @@ blueprint:
domain: input_boolean domain: input_boolean
disabled_scene:
name: "Disabled scene"
description: >
Choose the scene that will be activated when the "enabled_helper" is set to off.
In the "auto" mode, the "on" or "off" scene will be chosen based on whether motion is currently detected.
selector:
select:
options:
- "auto"
- "on"
- "off"
- "notice"
- "warning"
debug_mode: debug_mode:
name: "Debug mode." name: "Debug mode."
description: "Enable debug mode, which increases logging." description: "Enable debug mode, which increases logging."
@ -176,6 +191,7 @@ variables:
warning_seconds: !input warning_seconds warning_seconds: !input warning_seconds
on_just_before_off_seconds: !input on_just_before_off_seconds on_just_before_off_seconds: !input on_just_before_off_seconds
enabled_helper: !input enabled_helper enabled_helper: !input enabled_helper
disabled_scene: !input disabled_scene
debug_mode: !input debug_mode debug_mode: !input debug_mode
@ -212,10 +228,11 @@ trigger:
action: action:
# Action #0
- alias: "Debug log whether the enabled_helper was set" - alias: "Debug log whether the enabled_helper was set"
if: if:
- condition: template - condition: template
value_template: "{{ debug_mode == true or true }}" value_template: "{{ debug_mode == true }}"
then: then:
- if: - if:
- condition: template - condition: template
@ -231,6 +248,8 @@ action:
name: "Enabled helper" name: "Enabled helper"
message: "Enabled helper is not set." message: "Enabled helper is not set."
# Action #1
- alias: "Debug log the enabled_helper name" - alias: "Debug log the enabled_helper name"
if: if:
- condition: template - condition: template
@ -241,6 +260,8 @@ action:
name: "Enabled helper" name: "Enabled helper"
message: "Enabled helper name is: {{ enabled_helper }}" message: "Enabled helper name is: {{ enabled_helper }}"
# Action #2
- alias: "Debug log the current delay_seconds value" - alias: "Debug log the current delay_seconds value"
if: if:
- condition: template - condition: template
@ -251,6 +272,8 @@ action:
name: "Delay seconds" name: "Delay seconds"
message: "Delay seconds is: {{ states[delay_seconds_helper].state }}" message: "Delay seconds is: {{ states[delay_seconds_helper].state }}"
# Action #3
- alias: "Debug log the on_just_before_off_seconds value" - alias: "Debug log the on_just_before_off_seconds value"
if: if:
- condition: template - condition: template
@ -263,43 +286,109 @@ action:
# Take actions based on whether the "Enabled helper" was just toggled on or off # Take actions based on whether the "Enabled helper" was just toggled on or off
# Action #4
- if: - if:
- condition: trigger - condition: trigger
id: id:
- Enabled helper is on - Enabled helper is on
- Enabled helper is off - Enabled helper is off
then: then:
# Debug log # Debug log
- alias: "Debug log" - alias: "Debug log - Enabled Helper On/Off"
if: if:
- condition: template - condition: template
value_template: "{{ debug_mode == true }}" value_template: "{{ debug_mode == true }}"
then: then:
- service: logbook.log - service: logbook.log
data: data:
name: "Debug: Trigger" name: "Debug: Trigger"
message: "Enabled helper was toggled, and has triggered this automation" message: "Enabled helper was toggled, and has triggered this automation"
- alias: "Debug log - Disabled scene"
# Activate the "On" scene, if motion is currently detected
- alias: "Activate ON scene, if motion is currently detected, otherwise activate the OFF scene"
if: if:
- condition: state - condition: template
entity_id: !input motion_sensor value_template: "{{ debug_mode == true }}"
state: "on" then:
- service: logbook.log
data:
name: "Debug: Disabled scene"
message: "Disabled scene is currently set to: {{ disabled_scene }}"
# In "auto" mode, activate the ON or OFF scene based on whether motion is currently detected
# Also use "auto" mode if motion activation is ENABLED.
- alias: "auto mode: Activate ON scene, if motion is currently detected, otherwise activate the OFF scene"
if:
- condition: template
value_template: "{{ disabled_scene == 'auto' or (enabled_helper != None and is_state( enabled_helper, 'on' )) }}"
then:
- if:
- condition: state
entity_id: !input motion_sensor
state: "on"
then:
- parallel:
- alias: "Activate the ON scene"
service: scene.turn_on
target:
entity_id: !input scene_on
else:
- parallel:
- alias: "Activate the OFF scene"
service: scene.turn_on
target:
entity_id: !input scene_off
- stop: ""
# In ON mode, just activate the ON scene
- alias: "on mode: just activate the ON scene"
if:
- condition: template
value_template: "{{ disabled_scene == 'on' }}"
then: then:
- parallel: - parallel:
- alias: "Activate the ON scene" - service: scene.turn_on
service: scene.turn_on
target: target:
entity_id: !input scene_on entity_id: !input scene_on
else: - stop: ""
# In OFF mode, just activate the OF scene
- alias: "off mode: just activate the ON scene"
if:
- condition: template
value_template: "{{ disabled_scene == 'off' }}"
then:
- parallel: - parallel:
- alias: "Activate the OFF scene" - service: scene.turn_on
service: scene.turn_on
target: target:
entity_id: !input scene_off entity_id: !input scene_off
- stop: ""
# In notice mode, just activate the NOTICE scene
- alias: "notice mode: just activate the NOTICE scene"
if:
- condition: template
value_template: "{{ disabled_scene == 'notice' }}"
then:
- parallel:
- service: scene.turn_on
target:
entity_id: !input scene_notice
- stop: ""
# In warning mode, just activate the WARNING scene
- alias: "warning mode: just activate the WARNING scene"
if:
- condition: template
value_template: "{{ disabled_scene == 'warning' }}"
then:
- parallel:
- service: scene.turn_on
target:
entity_id: !input scene_warning
- stop: ""
# Don't do anything after processing the enabled_helper triggers
- stop: "Done handling enabled helper" - stop: "Done handling enabled helper"
@ -307,7 +396,7 @@ action:
# Take actions based on whether Motion is detected # Take actions based on whether Motion is detected
- alias: "Refuse to do anything if the enabled-helper says we're OFF." - alias: "Refuse to do anything if the enabled-helper says we're OFF."
if: if:
- condition: template - condition: template
value_template: "{{ enabled_helper != None }}" value_template: "{{ enabled_helper != None }}"
- condition: template - condition: template
@ -324,11 +413,15 @@ action:
# Motion is detected # Motion is detected
then: then:
- alias: "Log that motion was detected." - alias: "Debug Log that motion was detected."
service: logbook.log if:
data: - condition: template
name: "Motion On" value_template: "{{ debug_mode == true }}"
message: "Motion was detected." then:
service: logbook.log
data:
name: "Motion On"
message: "Motion was detected."
- parallel: - parallel:
- alias: "Activate the ON scene" - alias: "Activate the ON scene"
@ -340,17 +433,31 @@ action:
# Motion is not detected # Motion is not detected
else: else:
- alias: "Log that the motion-off sequence will run, due to motion no longer detected." - alias: "Debug Log that the motion-off sequence will run, due to motion no longer detected."
service: logbook.log if:
data: - condition: template
name: "Motion Off" value_template: "{{ debug_mode == true }}"
message: "Initiating motion-off sequence, because motion no longer detected." then:
service: logbook.log
data:
name: "Motion Off"
message: "Initiating motion-off sequence, because motion no longer detected."
# Initial period where nothing happens # Initial period where nothing happens
- alias: "Delay appropriately before doing anything" - alias: "Delay appropriately before doing anything"
wait_template: "{{ states[motion_sensor].state == 'on' }}" wait_template: "{{ states[motion_sensor].state == 'on' }}"
timeout: "{{ states[delay_seconds_helper].state }}" timeout: "{{ states[delay_seconds_helper].state or (enabled_helper != None and is_state(enabled_helper, 'off') ) }}"
- alias: "Quit now if the enabled-helper went OFF"
if:
- condition: template
value_template: "{{ enabled_helper != None }}"
- condition: template
value_template: "{{ is_state( enabled_helper, 'off' ) }}"
then:
stop: "Quitting early because the enabled-helper went OFF."
- if: - if:
- condition: state - condition: state
entity_id: !input motion_sensor entity_id: !input motion_sensor
@ -358,27 +465,46 @@ action:
then: then:
- stop: "Motion detected again during initial delay." - stop: "Motion detected again during initial delay."
- alias: "Log that the initial delay has finished." - alias: "Log that the initial delay has finished."
service: logbook.log if:
data: - condition: template
name: "Motion Off" value_template: "{{ debug_mode == true }}"
message: "Finished initial no-motion delay" then:
service: logbook.log
data:
name: "Motion Off"
message: "Finished initial no-motion delay"
# Notice period, where the notice scene is shown # Notice period, where the notice scene is shown
- alias: "Log that the notice period has begun." - alias: "Log that the notice period has begun."
service: logbook.log if:
data: - condition: template
name: "Begin notice period" value_template: "{{ debug_mode == true }}"
message: "Begin notice period; Waiting while motion is still off." then:
service: logbook.log
data:
name: "Begin notice period"
message: "Begin notice period; Waiting while motion is still off."
- parallel: - parallel:
- alias: "Activate Scene: Off Prep 1 (Notice)" - alias: "Activate Scene: Notice"
service: scene.turn_on service: scene.turn_on
target: target:
entity_id: !input scene_off_prep_1 entity_id: !input scene_notice
- alias: "Delay during the notice period" - alias: "Delay during the notice period"
wait_template: "{{ states[motion_sensor].state == 'on' }}" wait_template: "{{ states[motion_sensor].state == 'on' or (enabled_helper != None and is_state('enabled_helper', 'off') ) }}"
timeout: "{{ notice_seconds }}" timeout: "{{ notice_seconds }}"
- alias: "Quit now if the enabled-helper went OFF"
if:
- condition: template
value_template: "{{ enabled_helper != None }}"
- condition: template
value_template: "{{ is_state( enabled_helper, 'off' ) }}"
then:
stop: "Quitting early because the enabled-helper went OFF."
- if: - if:
- condition: state - condition: state
entity_id: !input motion_sensor entity_id: !input motion_sensor
@ -421,26 +547,47 @@ action:
name: "New delay" name: "New delay"
message: "New delay is {{ states[delay_seconds_helper].state }} seconds" message: "New delay is {{ states[delay_seconds_helper].state }} seconds"
- stop: "Motion detected during notice period." - stop: "Motion detected during notice period."
- service: logbook.log - if:
data: condition: template
name: "Notice period finished." value_template: "{{ debug_mode == true }}"
message: "Notice period has finished (motion is still off)." then:
- service: logbook.log
data:
name: "Notice period finished."
message: "Notice period has finished (motion is still off)."
# Warning period, just before the light turns off. The warning scene is shown. # Warning period, just before the light turns off. The warning scene is shown.
- alias: "Log that the warning period has begun." - alias: "Log that the warning period has begun."
service: logbook.log if:
data: - condition: template
name: "Begin warning period" value_template: "{{ debug_mode == true }}"
message: "Begin warning period; Waiting while motion is still off." then:
service: logbook.log
data:
name: "Begin warning period"
message: "Begin warning period; Waiting while motion is still off."
- parallel: - parallel:
- alias: "Activate Scene: Off Prep 2 (Warning)" - alias: "Activate Scene: Warning"
service: scene.turn_on service: scene.turn_on
target: target:
entity_id: !input scene_off_prep_2 entity_id: !input scene_warning
- alias: "Delay during the warning period" - alias: "Delay during the warning period"
wait_template: "{{ states[motion_sensor].state == 'on' }}" wait_template: "{{ states[motion_sensor].state == 'on' or (enabled_helper != None and is_state('enabled_helper', 'off') ) }}"
timeout: "{{ warning_seconds }}" timeout: "{{ warning_seconds }}"
- alias: "Quit now if the enabled-helper went OFF"
if:
- condition: template
value_template: "{{ enabled_helper != None }}"
- condition: template
value_template: "{{ is_state( enabled_helper, 'off' ) }}"
then:
stop: "Quitting early because the enabled-helper went OFF."
- if: - if:
- condition: state - condition: state
entity_id: !input motion_sensor entity_id: !input motion_sensor
@ -483,10 +630,14 @@ action:
name: "New delay seconds" name: "New delay seconds"
message: "New delay is {{ states[delay_seconds_helper].state }} seconds." message: "New delay is {{ states[delay_seconds_helper].state }} seconds."
- stop: "Motion detected during the warning period." - stop: "Motion detected during the warning period."
- service: logbook.log - if:
data: - condition: template
name: "Warning period finished." value_template: "{{ debug_mode == true }}"
message: "Warning period has finished and motion is still off." then:
- service: logbook.log
data:
name: "Warning period finished."
message: "Warning period has finished and motion is still off."
# Finally, we decide to actually turn off the lights with the "Off" scene. # Finally, we decide to actually turn off the lights with the "Off" scene.
@ -533,10 +684,14 @@ action:
entity_id: !input delay_seconds_helper entity_id: !input delay_seconds_helper
value: "{{ delay_seconds_default }}" value: "{{ delay_seconds_default }}"
- service: logbook.log - if:
data: - condition: template
name: "Turning off light, due to motion off." value_template: "{{ debug_mode == true }}"
message: "Activated off-scene and reset delay." then:
- service: logbook.log
data:
name: "Turning off light, due to motion off."
message: "Activated off-scene and reset delay."