diff --git a/motion-activated-light.yaml b/motion-activated-light.yaml index 918bbfc..8d13261 100644 --- a/motion-activated-light.yaml +++ b/motion-activated-light.yaml @@ -5,7 +5,7 @@ ######################## mode: queued -max: 10 +max: 25 blueprint: name: "Mike's Motion Activated Light" @@ -153,6 +153,21 @@ blueprint: 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: name: "Debug mode." description: "Enable debug mode, which increases logging." @@ -176,6 +191,7 @@ variables: warning_seconds: !input warning_seconds on_just_before_off_seconds: !input on_just_before_off_seconds enabled_helper: !input enabled_helper + disabled_scene: !input disabled_scene debug_mode: !input debug_mode @@ -212,10 +228,11 @@ trigger: action: + # Action #0 - alias: "Debug log whether the enabled_helper was set" if: - condition: template - value_template: "{{ debug_mode == true or true }}" + value_template: "{{ debug_mode == true }}" then: - if: - condition: template @@ -231,6 +248,8 @@ action: name: "Enabled helper" message: "Enabled helper is not set." + + # Action #1 - alias: "Debug log the enabled_helper name" if: - condition: template @@ -241,6 +260,7 @@ action: name: "Enabled helper" message: "Enabled helper name is: {{ enabled_helper }}" + # Action #2 - alias: "Debug log the current delay_seconds value" if: - condition: template @@ -251,6 +271,7 @@ action: name: "Delay seconds" message: "Delay seconds is: {{ states[delay_seconds_helper].state }}" + # Action #3 - alias: "Debug log the on_just_before_off_seconds value" if: - condition: template @@ -263,6 +284,7 @@ action: # Take actions based on whether the "Enabled helper" was just toggled on or off + # Action #4 - if: - condition: trigger id: @@ -271,35 +293,100 @@ action: then: # Debug log - - alias: "Debug log" + - alias: "Debug log - Enabled Helper On/Off" if: - - condition: template - value_template: "{{ debug_mode == true }}" + - condition: template + value_template: "{{ debug_mode == true }}" then: - service: logbook.log data: name: "Debug: Trigger" message: "Enabled helper was toggled, and has triggered this automation" - - - # Activate the "On" scene, if motion is currently detected - - alias: "Activate ON scene, if motion is currently detected, otherwise activate the OFF scene" + - alias: "Debug log - Disabled scene" if: - - condition: state - entity_id: !input motion_sensor - state: "on" + - condition: template + value_template: "{{ debug_mode == true }}" + 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 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: - parallel: - - alias: "Activate the ON scene" - service: scene.turn_on + - service: scene.turn_on target: 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: - - alias: "Activate the OFF scene" - service: scene.turn_on + - service: scene.turn_on target: 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_off_prep_1 + - 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_off_prep_2 + - stop: "" + + # Don't do anything after processing the enabled_helper triggers - stop: "Done handling enabled helper" @@ -324,11 +411,15 @@ action: # Motion is detected then: - - alias: "Log that motion was detected." - service: logbook.log - data: - name: "Motion On" - message: "Motion was detected." + - alias: "Debug Log that motion was detected." + if: + - condition: template + value_template: "{{ debug_mode == true }}" + then: + service: logbook.log + data: + name: "Motion On" + message: "Motion was detected." - parallel: - alias: "Activate the ON scene" @@ -340,11 +431,15 @@ action: # Motion is not detected else: - - alias: "Log that the motion-off sequence will run, due to motion no longer detected." - service: logbook.log - data: - name: "Motion Off" - message: "Initiating motion-off sequence, because motion no longer detected." + - alias: "Debug Log that the motion-off sequence will run, due to motion no longer detected." + if: + - condition: template + value_template: "{{ debug_mode == true }}" + then: + service: logbook.log + data: + name: "Motion Off" + message: "Initiating motion-off sequence, because motion no longer detected." # Initial period where nothing happens @@ -358,19 +453,27 @@ action: then: - stop: "Motion detected again during initial delay." - alias: "Log that the initial delay has finished." - service: logbook.log - data: - name: "Motion Off" - message: "Finished initial no-motion delay" + if: + - condition: template + value_template: "{{ debug_mode == true }}" + then: + service: logbook.log + data: + name: "Motion Off" + message: "Finished initial no-motion delay" # Notice period, where the notice scene is shown - alias: "Log that the notice period has begun." - service: logbook.log - data: - name: "Begin notice period" - message: "Begin notice period; Waiting while motion is still off." + if: + - condition: template + value_template: "{{ debug_mode == true }}" + then: + service: logbook.log + data: + name: "Begin notice period" + message: "Begin notice period; Waiting while motion is still off." - parallel: - alias: "Activate Scene: Off Prep 1 (Notice)" service: scene.turn_on @@ -421,18 +524,26 @@ action: name: "New delay" message: "New delay is {{ states[delay_seconds_helper].state }} seconds" - stop: "Motion detected during notice period." - - service: logbook.log - data: - name: "Notice period finished." - message: "Notice period has finished (motion is still off)." + - if: + condition: template + value_template: "{{ debug_mode == true }}" + 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. - alias: "Log that the warning period has begun." - service: logbook.log - data: - name: "Begin warning period" - message: "Begin warning period; Waiting while motion is still off." + if: + - condition: template + value_template: "{{ debug_mode == true }}" + then: + service: logbook.log + data: + name: "Begin warning period" + message: "Begin warning period; Waiting while motion is still off." - parallel: - alias: "Activate Scene: Off Prep 2 (Warning)" service: scene.turn_on @@ -483,10 +594,14 @@ action: name: "New delay seconds" message: "New delay is {{ states[delay_seconds_helper].state }} seconds." - stop: "Motion detected during the warning period." - - service: logbook.log - data: - name: "Warning period finished." - message: "Warning period has finished and motion is still off." + - if: + - condition: template + value_template: "{{ debug_mode == true }}" + 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. @@ -533,10 +648,14 @@ action: entity_id: !input delay_seconds_helper value: "{{ delay_seconds_default }}" - - service: logbook.log - data: - name: "Turning off light, due to motion off." - message: "Activated off-scene and reset delay." + - if: + - condition: template + value_template: "{{ debug_mode == true }}" + then: + - service: logbook.log + data: + name: "Turning off light, due to motion off." + message: "Activated off-scene and reset delay."