From 832a71380fecd4b695d901f70201ff229b478fff Mon Sep 17 00:00:00 2001 From: mike Date: Fri, 26 Apr 2024 02:28:23 -0700 Subject: [PATCH] Bugfixes and upgrades: - Fix bug where initial timeout wouldn't be interruptted by enabled_helper - Turned scene repeat delay into a variable (non-input for now) - Fixed enabled_helper==off not repeating the ON scene - Tried clarifying some logs, aliases, comments --- mikes-motion-activated-scenes.yaml | 142 +++++++++++++++++------------ 1 file changed, 82 insertions(+), 60 deletions(-) diff --git a/mikes-motion-activated-scenes.yaml b/mikes-motion-activated-scenes.yaml index 15fe2a7..762398b 100644 --- a/mikes-motion-activated-scenes.yaml +++ b/mikes-motion-activated-scenes.yaml @@ -197,22 +197,23 @@ blueprint: variables: - motion_sensor: !input motion_sensor - delay_seconds_helper: !input delay_seconds_helper - delay_seconds_default: !input delay_seconds_default - delay_seconds_multiplier: !input delay_seconds_multiplier - delay_seconds_max: !input delay_seconds_max - notice_seconds: !input notice_seconds - 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 + motion_sensor: !input motion_sensor + delay_seconds_helper: !input delay_seconds_helper + delay_seconds_default: !input delay_seconds_default + delay_seconds_multiplier: !input delay_seconds_multiplier + delay_seconds_max: !input delay_seconds_max + notice_seconds: !input notice_seconds + 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 - scene_repeat_count: !input scene_repeat_count + scene_repeat_count: !input scene_repeat_count + scene_repeat_delay_milliseconds: 500 trigger_variables: - enabled_helper: !input enabled_helper + enabled_helper: !input enabled_helper ############ @@ -311,11 +312,17 @@ action: # If the enabled helper is OFF, we should start by resetting # the countdown timer to default - - alias: "Reset countdown timer when enabled helper is switched OFF." - service: input_number.set_value - data: - entity_id: !input delay_seconds_helper - value: "{{ delay_seconds_default }}" + - alias: "If the enabled helper is OFF, reset countdown timer to default" + if: + - condition: trigger + id: + - Enabled Helper is off + then: + - alias: "Reset countdown timer when enabled helper is switched OFF." + service: input_number.set_value + data: + entity_id: !input delay_seconds_helper + value: "{{ delay_seconds_default }}" # 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. @@ -330,18 +337,30 @@ action: state: "on" then: - alias: "Activate the ON scene" - service: scene.turn_on - target: - entity_id: !input scene_on + repeat: + count: "{{ scene_repeat_count }}" + sequence: + - service: scene.turn_on + target: + entity_id: !input scene_on + - delay: + milliseconds: "{{ scene_repeat_delay_milliseconds }}" else: - alias: "Activate the OFF scene" - service: scene.turn_on - target: - entity_id: !input scene_off - - stop: "" + repeat: + count: "{{ scene_repeat_count }}" + sequence: + - service: scene.turn_on + target: + entity_id: !input scene_off + - delay: + milliseconds: "{{ scene_repeat_delay_milliseconds }}" + - stop: "Enabled helper was on or auto mode was on; Determined scene to activate based on current motion." - # In ON mode, just activate the ON scene - - alias: "on mode: just activate the ON scene" + # At this point, the enabled helper is assumed to be OFF + + # In disabled_scene::ON mode, just activate the ON scene + - alias: "disabled_scene::on mode: just activate the ON scene" if: - condition: template value_template: "{{ disabled_scene == 'on' }}" @@ -353,11 +372,11 @@ action: target: entity_id: !input scene_on - delay: - milliseconds: 500 - - stop: "" + milliseconds: "{{ scene_repeat_delay_milliseconds }}" + - stop: "Enabled helper is off and disabled scene was ON; Set ON scene" - # In OFF mode, just activate the OFF scene - - alias: "off mode: just activate the ON scene" + # In disabled_scene::OFF mode, just activate the OFF scene + - alias: "disabled_scene::off mode: just activate the OFF scene" if: - condition: template value_template: "{{ disabled_scene == 'off' }}" @@ -369,11 +388,11 @@ action: target: entity_id: !input scene_off - delay: - milliseconds: 500 - - stop: "" + milliseconds: "{{ scene_repeat_delay_milliseconds }}" + - stop: "Enabled helper is off and disabled scene was OFF; Set OFF scene" - # In notice mode, just activate the NOTICE scene - - alias: "notice mode: just activate the NOTICE scene" + # In disabled_scene::notice mode, just activate the NOTICE scene + - alias: "disabled_scene::notice mode: just activate the NOTICE scene" if: - condition: template value_template: "{{ disabled_scene == 'notice' }}" @@ -385,11 +404,11 @@ action: target: entity_id: !input scene_notice - delay: - milliseconds: 500 - - stop: "" + milliseconds: "{{ scene_repeat_delay_milliseconds }}" + - stop: "Enabled helper is off and disabled scene was NOTICE; Set NOTICE scene" - # In warning mode, just activate the WARNING scene - - alias: "warning mode: just activate the WARNING scene" + # In disabled_scene::warning mode, just activate the WARNING scene + - alias: "disabed_scene::warning mode: just activate the WARNING scene" if: - condition: template value_template: "{{ disabled_scene == 'warning' }}" @@ -401,8 +420,8 @@ action: target: entity_id: !input scene_warning - delay: - milliseconds: 500 - - stop: "" + milliseconds: "{{ scene_repeat_delay_milliseconds }}" + - stop: "Enabled helper is off and disabled scene was WATNING; Set WARNING scene" # Don't do anything after processing the enabled_helper triggers - stop: "Done handling enabled helper" @@ -448,7 +467,7 @@ action: target: entity_id: !input scene_on - delay: - milliseconds: 500 + milliseconds: "{{ scene_repeat_delay_milliseconds }}" # Motion is not detected @@ -467,8 +486,8 @@ action: # Initial period where nothing happens - alias: "Delay appropriately before doing anything" - wait_template: "{{ states[motion_sensor].state == 'on' }}" - timeout: "{{ states[delay_seconds_helper].state or (enabled_helper != None and is_state(enabled_helper, 'off') ) }}" + wait_template: "{{ states[motion_sensor].state == 'on' or (enabled_helper != None and is_state(enabled_helper, 'off') ) }}" + timeout: "{{ states[delay_seconds_helper].state }}" - alias: "Quit now if the enabled-helper went OFF" if: @@ -477,9 +496,10 @@ action: - condition: template value_template: "{{ is_state( enabled_helper, 'off' ) }}" then: - stop: "Quitting early because the enabled-helper went OFF." + stop: "Interrupted initial delay because the enabled helper turned OFF." - - if: + - alias: "Motion detected again during initial delay; Interrupt initial delay" + if: - condition: state entity_id: !input motion_sensor state: "on" @@ -516,7 +536,7 @@ action: target: entity_id: !input scene_notice - delay: - milliseconds: 500 + milliseconds: "{{ scene_repeat_delay_milliseconds }}" - alias: "Delay during the notice period" wait_template: "{{ states[motion_sensor].state == 'on' or (enabled_helper != None and is_state('enabled_helper', 'off') ) }}" @@ -529,13 +549,14 @@ action: - condition: template value_template: "{{ is_state( enabled_helper, 'off' ) }}" then: - stop: "Quitting early because the enabled-helper went OFF." + stop: "Interrupting NOTICE period because the enabled-helper went OFF." - - if: - - condition: state - entity_id: !input motion_sensor - state: "on" + - alias: "If motion interrupted the NOTICE period, activate the ON scene" + if: + - condition: state + entity_id: !input motion_sensor + state: "on" then: - alias: "Activate Scene: On" @@ -604,7 +625,7 @@ action: target: entity_id: !input scene_warning - delay: - milliseconds: 500 + milliseconds: "{{ scene_repeat_delay_milliseconds }}" - alias: "Delay during the warning period" wait_template: "{{ states[motion_sensor].state == 'on' or (enabled_helper != None and is_state('enabled_helper', 'off') ) }}" @@ -617,12 +638,13 @@ action: - condition: template value_template: "{{ is_state( enabled_helper, 'off' ) }}" then: - stop: "Quitting early because the enabled-helper went OFF." + stop: "Interrupting the WARNING sequence because the enabled-helper went OFF." - - if: - - condition: state - entity_id: !input motion_sensor - state: "on" + - alias: "If motion interrupts the WARNING sequence, just activate the ON scene" + if: + - condition: state + entity_id: !input motion_sensor + state: "on" then: - alias: "Activate Scene: On" @@ -633,7 +655,7 @@ action: target: entity_id: !input scene_on - delay: - milliseconds: 500 + milliseconds: "{{ scene_repeat_delay_milliseconds }}" - alias: "Double countdown timer when user interrupts the warning period." service: input_number.set_value @@ -719,7 +741,7 @@ action: target: entity_id: !input scene_off - delay: - milliseconds: 500 + milliseconds: "{{ scene_repeat_delay_milliseconds }}" - alias: "Reset countdown timer after turning off lights." service: input_number.set_value