Try using an external counter

This commit is contained in:
2025-10-25 22:23:04 -07:00
parent 3f82719fa4
commit d5034210ed

View File

@@ -9,6 +9,14 @@ blueprint:
selector: selector:
entity: {} entity: {}
press_counter:
name: Multi-Press Counter
description: House-wide counter helper for tracking presses (create counter.multi_press_counter)
default: counter.multi_press_counter
selector:
entity:
domain: counter
time_window: time_window:
name: Time Window name: Time Window
description: Maximum time between presses (in seconds) description: Maximum time between presses (in seconds)
@@ -55,7 +63,7 @@ blueprint:
selector: selector:
action: {} action: {}
mode: single mode: restart
max_exceeded: silent max_exceeded: silent
trigger: trigger:
@@ -64,59 +72,56 @@ trigger:
action: action:
- variables: - variables:
press_count: 1
time_window: !input time_window time_window: !input time_window
immediate: !input immediate_single_press immediate: !input immediate_single_press
trigger_entity: !input trigger_entity counter_entity: !input press_counter
initial_last_changed: "{{ states[trigger_entity].last_changed }}"
# Increment the counter (each restart = new press)
- action: counter.increment
target:
entity_id: !input press_counter
# Execute single press immediately if enabled # Execute single press immediately if enabled
- if: - if:
- condition: template - condition: template
value_template: "{{ immediate }}" value_template: "{{ immediate and states(counter_entity) | int == 1 }}"
then: then:
- choose: - choose:
- conditions: [] - conditions: []
sequence: !input single_press_action sequence: !input single_press_action
# Wait for additional presses by monitoring last_changed # Wait for the time window to see if more presses come
- repeat: - delay:
while:
- condition: template
value_template: "{{ press_count < 4 }}"
sequence:
- wait_template: "{{ states[trigger_entity].last_changed != initial_last_changed }}"
timeout:
seconds: "{{ time_window }}" seconds: "{{ time_window }}"
continue_on_timeout: true
- if: # Get final press count and execute appropriate action
- condition: template
value_template: "{{ not wait.completed }}"
then:
- variables: - variables:
press_count: "{{ press_count + 1 }}" final_count: "{{ states(counter_entity) | int }}"
initial_last_changed: "{{ states[trigger_entity].last_changed }}"
# Reset counter before executing actions
- action: counter.reset
target:
entity_id: !input press_counter
# Execute action based on final press count # Execute action based on final press count
- choose: - choose:
# Only run single press if NOT immediate (delayed mode) # Only run single press if NOT immediate (delayed mode)
- conditions: - conditions:
- condition: template - condition: template
value_template: "{{ press_count == 1 and not immediate }}" value_template: "{{ final_count == 1 and not immediate }}"
sequence: !input single_press_action sequence: !input single_press_action
- conditions: - conditions:
- condition: template - condition: template
value_template: "{{ press_count == 2 }}" value_template: "{{ final_count == 2 }}"
sequence: !input double_press_action sequence: !input double_press_action
- conditions: - conditions:
- condition: template - condition: template
value_template: "{{ press_count == 3 }}" value_template: "{{ final_count == 3 }}"
sequence: !input triple_press_action sequence: !input triple_press_action
- conditions: - conditions:
- condition: template - condition: template
value_template: "{{ press_count == 4 }}" value_template: "{{ final_count >= 4 }}"
sequence: !input quad_press_action sequence: !input quad_press_action