I have a momentary pushbutton connected to GPIO27 and want to perform different actions (set a global variable value for a countdown timer) depending on whether the button is clicked, or double clicked. A switch is turned on at the first single click, and then off when the countdown reaches zero.
Both single and double click triggers work, but after a double click, a single click is always called immediately after. Single clicks add a number of seconds to a counter, whereas a double click sets it to zero. So I only get the zero value for a very short time.
I’ve tried lengthening the debounce filter time, and have tried many combinations of the min_length and max_length times with no solution.
binary_sensor:
- platform: gpio
pin:
number: GPIO27
inverted: true
mode: INPUT_PULLUP
internal: true # don't publish to Home Assistant
filters:
- delayed_on: 60ms
name: "Push button"
# Single click
# User has requested to turn ON the switch, or wants to add some time to the countdown
on_click:
- min_length: 20ms
max_length: 150ms
then:
# Only turn the switch ON if this is the first press (i.e. don't turn on if user is adding time)
- if:
condition:
lambda: 'return id(countdown) == 0;'
then:
- homeassistant.service:
service: switch.turn_on
data:
entity_id: $switch_name
# Is this the first press to turn ON, or does the user want to add time?
- lambda: |-
if (id(countdown) == 0) {
// First press - Turn ON
id(countdown) = 300;
}
else {
// Switch is on, so add some time to the countdown
id(countdown) += 10;
}
- logger.log: "Short Click"
- light.turn_on:
id: neopixel_single_1
brightness: 50%
red: 0%
green: 100%
blue: 0%
- delay: 200ms
- light.turn_off: neopixel_single_1
# Double click
# Let user turn off before countdown is finished
on_double_click:
- min_length: 50ms
max_length: 600ms
then:
- homeassistant.service:
service: switch.turn_off
data:
entity_id: $switch_name
- lambda: |-
id(countdown) = 1;
- logger.log: "Long Click"
- light.turn_on:
id: neopixel_single_1
brightness: 50%
red: 100%
green: 0%
blue: 0%
- delay: 200ms
- light.turn_off: neopixel_single_1
I realise there are simpler ways of automating turn off of a switch after a timeout period, but I have an OLED display connected which shows the remaining time.