Switch strategy: No longer "on before off" but instead just retry each scene a configurable number of times.

This commit is contained in:
mike 2023-12-27 21:59:46 -08:00
parent 914b9f7449
commit 65a542484d

View File

@ -122,30 +122,45 @@ blueprint:
entity: entity:
domain: scene domain: scene
scene_repeat_count:
on_just_before_off_seconds: name: "Scene repeat/retry count"
name: "\"On\" just before \"Off\""
description: > description: >
When the "Off" scene is about to be shown, you may wish to quickly show the "On" scene for a number of seconds just before. Whenever activating a scene, try this many times at 1-second intervals.
This is sometimes helpful to mitigate an issue where the "On" scene doesn't apply all colors and settings correctly from an "Off" state. This is sometimes useful when the network seems buggy or laggy,
Set this to a value greater than 0 to enable. or for certain lights that fail to correctly apply brightness/color when first turning on.
A value of 0 will disable this feature.
Note that sometimes, a value that is too short (e.g., 1) may also cause issues.
default: 1 default: 1
selector: selector:
number: number:
min: 1 min: 1
max: 86400 max: 60
step: 1 step: 1
mode: box mode: box
# on_just_before_off_seconds:
# name: "\"On\" just before \"Off\""
# description: >
# When the "Off" scene is about to be shown, you may wish to quickly show the "On" scene for a number of seconds just before.
# This is sometimes helpful to mitigate an issue where the "On" scene doesn't apply all colors and settings correctly from an "Off" state.
# Set this to a value greater than 0 to enable.
# A value of 0 will disable this feature.
# Note that sometimes, a value that is too short (e.g., 1) may also cause issues.
#
# default: 1
# selector:
# number:
# min: 1
# max: 86400
# step: 1
# mode: box
enabled_helper: enabled_helper:
name: "Enabled helper" name: "Enabled helper"
description: > description: >
Helper variable that will control whether motion activation is enabled or disabled. Helper variable that will control whether motion activation is enabled or disabled.
This will allow this blueprint to correctly select the "On" or "Off" scene, based on whether motion is currently detected when disabled. This will allow the automation to correctly select the "On" or "Off" scene, based on whether motion is currently detected when disabled.
An example would be a "Toggle" helper. An example would be a "Toggle" helper.
default: # Allows no selection default: # Allows no selection
selector: selector:
@ -189,11 +204,12 @@ variables:
delay_seconds_max: !input delay_seconds_max delay_seconds_max: !input delay_seconds_max
notice_seconds: !input notice_seconds notice_seconds: !input notice_seconds
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 disabled_scene: !input disabled_scene
debug_mode: !input debug_mode debug_mode: !input debug_mode
scene_repeat_count: !input scene_repeat_count
trigger_variables: trigger_variables:
enabled_helper: !input enabled_helper enabled_helper: !input enabled_helper
@ -262,11 +278,11 @@ 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 }}"
- alias: "Debug log the on_just_before_off_seconds value" # - alias: "Debug log the on_just_before_off_seconds value"
service: logbook.log # service: logbook.log
data: # data:
name: "Debug: On just before off seconds" # name: "Debug: On just before off seconds"
message: "On just before off is: {{ on_just_before_off_seconds }} " # message: "On just before off is: {{ on_just_before_off_seconds }} "
# 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 #1 # Action #1
@ -278,26 +294,21 @@ action:
then: then:
# Debug log # 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 - alias: "Debug log that the enabled helper is toggled"
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" - alias: "Debug log the disabled scene"
if: service: logbook.log
- condition: template
value_template: "{{ debug_mode == true }}"
then:
- service: logbook.log
data: data:
name: "Debug: Disabled scene" name: "Debug: Disabled scene"
message: "Disabled scene is currently set to: {{ 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 # 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. # 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" - alias: "auto mode: Activate ON scene, if motion is currently detected, otherwise activate the OFF scene"
@ -327,20 +338,30 @@ action:
- condition: template - condition: template
value_template: "{{ disabled_scene == 'on' }}" value_template: "{{ disabled_scene == 'on' }}"
then: then:
- service: scene.turn_on - repeat:
target: count: "{{ scene_repeat_count }}"
entity_id: !input scene_on sequence:
- service: scene.turn_on
target:
entity_id: !input scene_on
- delay:
seconds: 1
- stop: "" - stop: ""
# In OFF mode, just activate the OF scene # In OFF mode, just activate the OFF scene
- alias: "off mode: just activate the ON scene" - alias: "off mode: just activate the ON scene"
if: if:
- condition: template - condition: template
value_template: "{{ disabled_scene == 'off' }}" value_template: "{{ disabled_scene == 'off' }}"
then: then:
- service: scene.turn_on - repeat:
target: count: "{{ scene_repeat_count }}"
entity_id: !input scene_off sequence:
- service: scene.turn_on
target:
entity_id: !input scene_off
- delay:
seconds: 1
- stop: "" - stop: ""
# In notice mode, just activate the NOTICE scene # In notice mode, just activate the NOTICE scene
@ -349,9 +370,14 @@ action:
- condition: template - condition: template
value_template: "{{ disabled_scene == 'notice' }}" value_template: "{{ disabled_scene == 'notice' }}"
then: then:
- service: scene.turn_on - repeat:
target: count: "{{ scene_repeat_count }}"
entity_id: !input scene_notice sequence:
- service: scene.turn_on
target:
entity_id: !input scene_notice
- delay:
seconds: 1
- stop: "" - stop: ""
# In warning mode, just activate the WARNING scene # In warning mode, just activate the WARNING scene
@ -360,9 +386,14 @@ action:
- condition: template - condition: template
value_template: "{{ disabled_scene == 'warning' }}" value_template: "{{ disabled_scene == 'warning' }}"
then: then:
- service: scene.turn_on - repeat:
target: count: "{{ scene_repeat_count }}"
entity_id: !input scene_warning sequence:
- service: scene.turn_on
target:
entity_id: !input scene_warning
- delay:
seconds: 1
- stop: "" - stop: ""
# Don't do anything after processing the enabled_helper triggers # Don't do anything after processing the enabled_helper triggers
@ -402,14 +433,20 @@ action:
message: "Motion was detected." message: "Motion was detected."
- alias: "Activate the ON scene" - alias: "Activate the ON scene"
service: scene.turn_on repeat:
target: count: "{{ scene_repeat_count }}"
entity_id: !input scene_on sequence:
- service: scene.turn_on
target:
entity_id: !input scene_on
- delay:
seconds: 1
# Motion is not detected # Motion is not detected
else: else:
# Debug log
- alias: "Debug 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."
if: if:
- condition: template - condition: template
@ -420,7 +457,6 @@ action:
name: "Motion Off" name: "Motion Off"
message: "Initiating motion-off sequence, because motion no longer detected." 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' }}"
@ -465,9 +501,14 @@ action:
message: "Begin notice period; Waiting while motion is still off." message: "Begin notice period; Waiting while motion is still off."
- alias: "Activate Scene: Notice" - alias: "Activate Scene: Notice"
service: scene.turn_on repeat:
target: count: "{{ scene_repeat_count }}"
entity_id: !input scene_notice sequence:
- service: scene.turn_on
target:
entity_id: !input scene_notice
- delay:
seconds: 1
- alias: "Delay during the notice period" - alias: "Delay during the notice period"
wait_template: "{{ states[motion_sensor].state == 'on' 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') ) }}"
@ -548,15 +589,19 @@ action:
message: "Begin warning period; Waiting while motion is still off." message: "Begin warning period; Waiting while motion is still off."
- alias: "Activate Scene: Warning" - alias: "Activate Scene: Warning"
service: scene.turn_on repeat:
target: count: "{{ scene_repeat_count }}"
entity_id: !input scene_warning sequence:
- service: scene.turn_on
target:
entity_id: !input scene_warning
- delay:
seconds: 1
- alias: "Delay during the warning period" - alias: "Delay during the warning period"
wait_template: "{{ states[motion_sensor].state == 'on' 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: "{{ warning_seconds }}" timeout: "{{ warning_seconds }}"
- alias: "Quit now if the enabled-helper went OFF" - alias: "Quit now if the enabled-helper went OFF"
if: if:
- condition: template - condition: template
@ -566,8 +611,6 @@ action:
then: then:
stop: "Quitting early because the enabled-helper went OFF." 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
@ -575,9 +618,14 @@ action:
then: then:
- alias: "Activate Scene: On" - alias: "Activate Scene: On"
service: scene.turn_on repeat:
target: count: "{{ scene_repeat_count }}"
entity_id: !input scene_on sequence:
- service: scene.turn_on
target:
entity_id: !input scene_on
- delay:
seconds: 1
- alias: "Double countdown timer when user interrupts the warning period." - alias: "Double countdown timer when user interrupts the warning period."
service: input_number.set_value service: input_number.set_value
@ -626,39 +674,44 @@ action:
# 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.
# Maybe turn on the "On" scene just before the "Off" scene, if the user enabled this option # Maybe turn on the "On" scene just before the "Off" scene, if the user enabled this option
- if: # - if:
- condition: template # - condition: template
value_template: "{{ on_just_before_off_seconds > 0 }}" # value_template: "{{ on_just_before_off_seconds > 0 }}"
then: # then:
- alias: "Log the number of on-before-off seconds" # - alias: "Log the number of on-before-off seconds"
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: "On-Before-Off seconds" # name: "On-Before-Off seconds"
message: "Will turn on for {{ on_just_before_off_seconds }} seconds before off." # message: "Will turn on for {{ on_just_before_off_seconds }} seconds before off."
- service: scene.turn_on # - service: scene.turn_on
target: # target:
entity_id: !input scene_on # entity_id: !input scene_on
- alias: "Wait a second to set the \"On\" scene." # - alias: "Wait a second to set the \"On\" scene."
delay: # delay:
seconds: "{{ on_just_before_off_seconds }}" # seconds: "{{ on_just_before_off_seconds }}"
else: # else:
- 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: "Won't run on-before-off" # name: "Won't run on-before-off"
message: "Won't run on-before-off because seconds was less than 1" # message: "Won't run on-before-off because seconds was less than 1"
- alias: "Activate Scene: Off (Done)" - alias: "Activate Scene: Off (Done)"
service: scene.turn_on repeat:
target: count: "{{ scene_repeat_count }}"
entity_id: !input scene_off sequence:
- service: scene.turn_on
target:
entity_id: !input scene_off
- delay:
seconds: 1
- alias: "Reset countdown timer after turning off lights." - alias: "Reset countdown timer after turning off lights."
service: input_number.set_value service: input_number.set_value