Several minor updates to the existing blueprints
This commit is contained in:
@@ -951,6 +951,125 @@ action:
|
||||
{% set new_automation_state = (automation_state | combine({ state_motion_light_state: automation_state_none })) %}
|
||||
{{ automation_state_global | combine({ automation_state_key: new_automation_state }) | tojson }}
|
||||
|
||||
# Re-evaluate: if an external source turned off the light while
|
||||
# the automation was actively controlling it, wait briefly and
|
||||
# re-enable if conditions are still met.
|
||||
# Safety: state_is_enabled/state_is_enabling reflect the state at
|
||||
# run start (before reset). When CASE 3 turns off the light, it
|
||||
# sets state to NONE first, so on restart state_is_none=true and
|
||||
# this block is skipped — preventing unwanted re-enable.
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ state_is_enabled or state_is_enabling }}"
|
||||
sequence:
|
||||
# Wait for the off-transition to finish
|
||||
- delay:
|
||||
seconds: "{{ transition_duration }}"
|
||||
|
||||
# Fresh condition check (evaluates current entity states)
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set e = sensors if sensors is iterable else [sensors] %}
|
||||
{% set motion_active = e | select('is_state', 'on') | list | length > 0 %}
|
||||
{% set cond_ok = true %}
|
||||
{% set cs = condition_switches if condition_switches is iterable else [condition_switches] %}
|
||||
{% if cs | length > 0 %}
|
||||
{% set cond_ok = (cs | select('is_state', 'on') | list | length) == (cs | length) %}
|
||||
{% endif %}
|
||||
{{ motion_active and cond_ok }}
|
||||
|
||||
# Re-read state from input_text (may have changed during delay)
|
||||
- variables:
|
||||
re_eval_state_global: >
|
||||
{% set text = states(automation_state_entity) | string %}
|
||||
{% if text in ['unknown','unavailable','none',''] %}
|
||||
{{ dict() }}
|
||||
{% else %}
|
||||
{{ text | from_json }}
|
||||
{% endif %}
|
||||
re_eval_state: "{{ re_eval_state_global.get(automation_state_key, dict()) }}"
|
||||
re_eval_motion_light_state: "{{ re_eval_state.get(state_motion_light_state, automation_state_none) }}"
|
||||
|
||||
# Only proceed if state is still NONE (no other run claimed it)
|
||||
- condition: template
|
||||
value_template: "{{ (re_eval_motion_light_state | string) == automation_state_none }}"
|
||||
|
||||
# --- Re-enable path (mirrors CASE 2) ---
|
||||
|
||||
# Set state to ENABLING before turning on
|
||||
- service: input_text.set_value
|
||||
target:
|
||||
entity_id: "{{ automation_state_entity }}"
|
||||
data:
|
||||
value: >
|
||||
{% set new_automation_state = (re_eval_state | combine({
|
||||
state_motion_light_state: automation_state_enabling,
|
||||
state_motion_light_last_action_timestamp: now(),
|
||||
state_motion_light_last_brightness: 0
|
||||
})) %}
|
||||
{{ re_eval_state_global | combine({ automation_state_key: new_automation_state }) | tojson }}
|
||||
|
||||
# Scene or light activation
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ use_scene_instead and effective_scene is not none }}"
|
||||
sequence:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: "{{ effective_scene }}"
|
||||
data:
|
||||
transition: "{{ transition_duration }}"
|
||||
|
||||
default:
|
||||
# Turn ON lights
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ resolved_all_lights | length > 0 }}"
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id: "{{ resolved_all_lights }}"
|
||||
data: >
|
||||
{% set d = effective_light_data if effective_light_data else {} %}
|
||||
{% if transition_duration > 0 %}
|
||||
{% set d = d | combine({'transition': transition_duration}) %}
|
||||
{% endif %}
|
||||
{{ d }}
|
||||
|
||||
# Turn ON switches
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ resolved_all_switches | length > 0 }}"
|
||||
sequence:
|
||||
- service: switch.turn_on
|
||||
target:
|
||||
entity_id: "{{ resolved_all_switches }}"
|
||||
|
||||
# Execute enable callback
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ enable_action != [] }}"
|
||||
sequence: !input enable_action
|
||||
|
||||
# Debug notification
|
||||
- choose:
|
||||
- conditions: "{{ enable_debug_notifications }}"
|
||||
sequence:
|
||||
- service: persistent_notification.create
|
||||
data:
|
||||
title: "Motion Light Debug"
|
||||
message: >
|
||||
Action: RE-ENABLE (external turn-off recovery)
|
||||
Time: {{ now().strftime('%H:%M:%S') }}
|
||||
Lights: {{ resolved_all_lights }}
|
||||
Switches: {{ resolved_all_switches }}
|
||||
Scene: {{ effective_scene if use_scene_instead else 'N/A' }}
|
||||
|
||||
# ----- Sub-case: Automation just turned on the light -----
|
||||
# Transition from ENABLING to ENABLED, or disable immediately
|
||||
# if motion already cleared during the ENABLING phase
|
||||
|
||||
Reference in New Issue
Block a user