From d5034210ed667357f205db4ea4bcd15ba0d1df81 Mon Sep 17 00:00:00 2001 From: John Ogle Date: Sat, 25 Oct 2025 22:23:04 -0700 Subject: [PATCH] Try using an external counter --- multi_press_action.yaml | 57 ++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/multi_press_action.yaml b/multi_press_action.yaml index 80b514d..333ed1e 100644 --- a/multi_press_action.yaml +++ b/multi_press_action.yaml @@ -9,6 +9,14 @@ blueprint: selector: 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: name: Time Window description: Maximum time between presses (in seconds) @@ -55,7 +63,7 @@ blueprint: selector: action: {} -mode: single +mode: restart max_exceeded: silent trigger: @@ -64,59 +72,56 @@ trigger: action: - variables: - press_count: 1 time_window: !input time_window immediate: !input immediate_single_press - trigger_entity: !input trigger_entity - initial_last_changed: "{{ states[trigger_entity].last_changed }}" + counter_entity: !input press_counter + + # Increment the counter (each restart = new press) + - action: counter.increment + target: + entity_id: !input press_counter # Execute single press immediately if enabled - if: - condition: template - value_template: "{{ immediate }}" + value_template: "{{ immediate and states(counter_entity) | int == 1 }}" then: - choose: - conditions: [] sequence: !input single_press_action - # Wait for additional presses by monitoring last_changed - - repeat: - while: - - condition: template - value_template: "{{ press_count < 4 }}" - sequence: - - wait_template: "{{ states[trigger_entity].last_changed != initial_last_changed }}" - timeout: - seconds: "{{ time_window }}" - continue_on_timeout: true + # Wait for the time window to see if more presses come + - delay: + seconds: "{{ time_window }}" - - if: - - condition: template - value_template: "{{ not wait.completed }}" - then: - - variables: - press_count: "{{ press_count + 1 }}" - initial_last_changed: "{{ states[trigger_entity].last_changed }}" + # Get final press count and execute appropriate action + - variables: + final_count: "{{ states(counter_entity) | int }}" + + # Reset counter before executing actions + - action: counter.reset + target: + entity_id: !input press_counter # Execute action based on final press count - choose: # Only run single press if NOT immediate (delayed mode) - conditions: - condition: template - value_template: "{{ press_count == 1 and not immediate }}" + value_template: "{{ final_count == 1 and not immediate }}" sequence: !input single_press_action - conditions: - condition: template - value_template: "{{ press_count == 2 }}" + value_template: "{{ final_count == 2 }}" sequence: !input double_press_action - conditions: - condition: template - value_template: "{{ press_count == 3 }}" + value_template: "{{ final_count == 3 }}" sequence: !input triple_press_action - conditions: - condition: template - value_template: "{{ press_count == 4 }}" + value_template: "{{ final_count >= 4 }}" sequence: !input quad_press_action