From 045e87fe7300b3007e326f0ab7aa64bf2f1ed932 Mon Sep 17 00:00:00 2001 From: mike Date: Tue, 10 Oct 2023 06:46:35 -0700 Subject: [PATCH] Turn scene on twice to account for laggy networks Also quoted some things and improved logging a bit. --- motion-activated-light.yaml | 114 ++++++++++++++++++++++++------------ 1 file changed, 75 insertions(+), 39 deletions(-) diff --git a/motion-activated-light.yaml b/motion-activated-light.yaml index 2b557ed..f913f59 100644 --- a/motion-activated-light.yaml +++ b/motion-activated-light.yaml @@ -1,5 +1,9 @@ +######################## +### Blueprint definition +######################## + blueprint: name: "Mike's Motion Activated Light" @@ -8,22 +12,22 @@ blueprint: input: motion_sensor: - name: Motion Sensor - description: Entity ID of the motion sensor + name: "Motion Sensor" + description: "Entity ID of the motion sensor" selector: entity: domain: binary_sensor delay_seconds_helper: - name: Delay seconds (helper) - description: The delay before the motion-off sequence will be initiated. Must be a helper so it can persist across activations. + name: "Delay seconds (helper)" + description: "The delay before the motion-off sequence will be initiated. Must be a helper so it can persist across activations." selector: entity: domain: input_number delay_seconds_default: - name: Default delay seconds - description: The default delay before the motion-off sequence begins. Will be used to reset the running delay. + name: "Default delay seconds" + description: "The default delay before the motion-off sequence begins. Will be used to reset the running delay." default: 30 selector: number: @@ -33,7 +37,7 @@ blueprint: mode: box notice_seconds: - name: Notice seconds + name: "Notice seconds" description: "The number of seconds to wait in the Prep1 (Notice) scene." default: 15 selector: @@ -44,7 +48,7 @@ blueprint: mode: box warning_seconds: - name: Warning seconds + name: "Warning seconds" description: "The number of seconds to wait in the Prep2 (Warning) scene." default: 15 selector: @@ -55,33 +59,38 @@ blueprint: mode: box scene_on: - name: On Scene - description: The scene to activate when motion is detected + name: "On Scene" + description: "The scene to activate when motion is detected" selector: entity: domain: scene scene_off_prep_1: - name: Off Prep Scene 1 (Notice) - description: The first scene to activate when motion is no longer detected (notice phase). + name: "Off Prep Scene 1 (Notice)" + description: "The first scene to activate when motion is no longer detected (notice phase)." selector: entity: domain: scene scene_off_prep_2: - name: Off Prep Scene 2 (Warning) - description: The second scene to activate when motion is no longer detected (warning phase). + name: "Off Prep Scene 2 (Warning)" + description: "The second scene to activate when motion is no longer detected (warning phase)." selector: entity: domain: scene scene_off: - name: Off Scene + name: "Off Scene" description: "The scene to activate when the user has failed to produce motion, and the light should be considered \"off\"." selector: entity: domain: scene + +############# +### Variables +############# + variables: motion_sensor: !input motion_sensor @@ -90,6 +99,10 @@ variables: notice_seconds: !input notice_seconds warning_seconds: !input warning_seconds +############ +### Triggers +############ + trigger: - platform: state @@ -99,12 +112,16 @@ trigger: - "on" - "off" +########### +### Actions +########### + action: - service: logbook.log data: - name: First log - message: "Test Poop Blueprint has started. Motion delay counter is: {{ states[delay_seconds].state }}" + name: "First log" + message: "Motion automation has started. Delay counter is: {{ states[delay_seconds].state }}" - if: - condition: state @@ -114,50 +131,63 @@ action: # Take actions based on Motion being detected! then: - - alias: Trying to log the motion state + - alias: "Log that motion was detected." service: logbook.log data: - name: Motion On - message: Motion Detected + name: "Motion On" + message: "Motion was detected." - alias: "Activate the ON scene" service: scene.turn_on target: entity_id: !input scene_on + - delay: + seconds: 1 + - alias: "Activate the ON scene again, after a delay (to help laggy setups)" + service: scene.turn_on + target: + entity_id: !input scene_on + # Take actions based on Motion being undetected else: - - alias: Announce motion-off sequence + - 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. + name: "Motion Off" + message: "Initiating motion-off sequence, because motion no longer detected." - - alias: Delay appropriately before doing anything - wait_template: "{{ states[motion_sensor].state == 'on' }}" + - alias: "Delay appropriately before doing anything" + wait_template: "{{ states[motion_sensor].state == 'on' }}" timeout: "{{ states[delay_seconds].state }}" - if: - condition: state entity_id: !input motion_sensor state: "on" then: - - stop: "Motion detected during initial delay." - - service: logbook.log + - 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 + name: "Motion Off" + message: "Finished initial no-motion delay" + - 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." - alias: "Activate Scene: Off Prep 1 (Notice)" service: scene.turn_on target: entity_id: !input scene_off_prep_1 - alias: "Delay during the notice period" - wait_template: "{{ states[motion_sensor].state == 'on' }}" - timeout: "{{ notice_seconds }}" + wait_template: "{{ states[motion_sensor].state == 'on' }}" + timeout: "{{ notice_seconds }}" - if: - condition: state entity_id: !input motion_sensor @@ -175,16 +205,21 @@ action: - stop: "Motion detected during notice period." - service: logbook.log data: - name: Motion Off - message: Finished notice delay + name: "Notice period finished." + message: "Notice period has finished (motion is still off)." + - 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." - alias: "Activate Scene: Off Prep 2 (Warning)" service: scene.turn_on target: entity_id: !input scene_off_prep_2 - alias: "Delay during the warning period" wait_template: "{{ states[motion_sensor].state == 'on' }}" - timeout: "{{ warning_seconds }}" + timeout: "{{ warning_seconds }}" - if: - condition: state entity_id: !input motion_sensor @@ -202,15 +237,16 @@ action: - stop: "Motion detected during the warning period." - service: logbook.log data: - name: Motion Off - message: Finished warning delay + name: "Warning period finished." + message: "Warning period has finished and motion is still off." + - alias: "Activate Scene: Off (Done)" service: scene.turn_on target: entity_id: !input scene_off - - alias: "Reset countdown timer after turning on lights." + - alias: "Reset countdown timer after turning off lights." service: input_number.set_value data: entity_id: !input delay_seconds_helper @@ -218,8 +254,8 @@ action: - service: logbook.log data: - name: Motion Off - message: Activated off-scene and reset delay. + name: "Turning off light, due to motion off." + message: "Activated off-scene and reset delay."