Detekcja wielokrotnych naciśnięć – on_click, double-click i hold w ESPHome

Detekcja wielokrotnych naciśnięć – on_click, double-click i hold w ESPHome

ESPHome pozwala nam na implementację zaawansowanej detekcji naciśnięć przycisków, obejmującej on_click, double click i hold. Podstawą jest użycie komponentu binary_sensor połączonego z timerami i zmiennymi globalnymi w konfiguracji YAML. Precyzyjne ustawienie interwałów czasowych dla double click (200-500 ms) i hold (>1000 ms) zapewnia niezawodność. Efektywne zarządzanie odbiciami styków (debouncing) eliminuje fałszywe wyzwolenia, a kombinacja wielu akcji na jednym przycisku wymaga świadomego ustalania priorytetów. Dzięki ESPHome i płytce ESP32 DevKitC możemy realizować wszystkie te scenariusze w praktyce.

Problem z zaawansowaną detekcją naciśnięć w ESPHome

W wielu projektach automatyki domowej jedno naciśnięcie przycisku okazuje się niewystarczające. Standardowe on_click pozwala nam włączać światło lub uruchamiać pojedynczą akcję, ale gdy chcemy kontrolować kilka funkcji z jednego przycisku, jego użyteczność spada. Brak natywnych rozwiązań dla double click i hold w ESPHome wymusza tworzenie własnej logiki czasowej i zarządzanie stanami, co bez doświadczenia prowadzi do problemów z odbiciami styków, kolizją akcji i błędami timingów. W tym artykule pokażemy, jak te problemy rozwiązać w praktyce.

Czym jest on_click, double click i hold w kontekście ESPHome?

On_click to szybkie naciśnięcie i zwolnienie przycisku, np. do przełączania światła w pokoju.
Double click oznacza dwa szybkie naciśnięcia w określonym przedziale czasowym, przydatne do aktywowania scen lub trybów specjalnych, np. włączania trybu nocnego.
Hold umożliwia przytrzymanie przycisku przez określony czas, co pozwala nam na regulację natężenia światła lub uruchomienie automatycznej procedury, np. zamknięcia rolet.

Każdy typ naciśnięcia możemy wykorzystać w automatyce domowej, tworząc intuicyjne interfejsy dla mieszkańców. ESPHome jako platforma pozwala nam to realizować w pełni elastycznie.

Jak skonfigurować podstawowe on_click w ESPHome?

Podstawę stanowi komponent binary_sensor podłączony do GPIO płytki ESP32 DevKitC. Minimalna konfiguracja YAML wygląda następująco:

binary_sensor:

  • platform: gpio
  • pin: GPIO0
  • name: "Przycisk Salon"
  • on_click:
  • then:
  • light.toggle: light_salon

Różnica między on_press, on_release a on_click polega na tym, że on_press reaguje natychmiast po naciśnięciu, on_release przy zwolnieniu, a on_click wymaga pełnego cyklu naciśnięcia i zwolnienia, co czyni go bardziej intuicyjnym dla użytkowników.

Debouncing – sposób na niezawodnegy on_click

Odbicia mechaniczne styków przycisku powodują wielokrotne wyzwalanie akcji. ESPHome domyślnie obsługuje debouncing, ale możemy go dostosować przy użyciu debounce_filter. Przykład:

  • binary_sensor:
  • platform: gpio
  • pin: GPIO0
  • name: "Przycisk Salon"
  • filters:
  • debounce: 50ms

Odpowiedni debouncing jest fundamentem dla wszystkich zaawansowanych akcji, w tym double click i hold.

Jak wykryć double click w ESPHome?

Do detekcji double click używamy zmiennych globalnych (globals) i logiki czasowej w on_press i on_release.

Deklarujemy zmienną globalną:

  • globals:
  • id: last_press_time
  • type: int
  • initial_value: '0'
  1. W on_press porównujemy aktualny czas z last_press_time.
  2. Jeśli różnica mieści się w zakresie 200-500 ms, wywołujemy double click i resetujemy zmienną.
  3. W przeciwnym przypadku zapisujemy aktualny czas i uruchamiamy opóźnioną akcję single click, jeśli nie nastąpi kolejne naciśnięcie.

Przykład YAML dla double click:

binary_sensor:

  - platform: gpio

  •   pin: GPIO0
  •   name: "Przycisk Salon"
  •   on_press:
  •   then:
  •   lambda: |-
  •    int now = millis();
  •    if (now - id(last_press_time) < 500) {
  •    // Double click
  •    id(last_press_time) = 0;
  •    // Akcja double click
  •    id(light_salon).turn_on();
  •     } else {
  •     id(last_press_time) = now;
  •     // Opóźnione sprawdzenie single click
  •     id(single_click_timer).start();
  •     }

Logika detekcji double click krok po kroku

  • Naciśnięcie inicjuje timer i zapisuje czas w zmiennej globalnej.
  • Kolejne naciśnięcie w X ms to double click.
  • Jeśli X ms minie bez drugiego naciśnięcia, następuje single click.

Optymalne interwały czasowe dla double click

Typowy zakres to 200-500 ms. Zbyt krótki czas może uniemożliwić prawidłowe wykrycie double click, zbyt długi może powodować pomyłki z single click. Warto eksperymentować i dopasować wartości do fizycznych przycisków.

Detekcja hold (długie naciśnięcie) w ESPHome

Dwie metody:

  1. on_press_for – prosta implementacja dla krótkiego przytrzymania.
  2. Timerowa logika ręczna – daje pełną kontrolę nad czasami i akcjami.

Przykład implementacji hold z timerem:

binary_sensor:

  • platform: gpio
  • pin: GPIO0
  • name: "Przycisk Salon"
  • on_press:
  • then:
  • delay: 1s
  • light.dim_relative:
  • id: light_salon
  • relative_brightness: -20%
  • on_release:
  • then:
  • lambda: |-
  • // Anuluj akcję hold, jeśli przycisk został zwolniony

Wykorzystanie timerów do pomiaru czasu hold

Timer uruchamiamy przy naciśnięciu (id(my_hold_timer).start()) i zatrzymujemy przy zwolnieniu (id(my_hold_timer).stop()). Możemy tworzyć różne akcje dla short hold i long hold, sterując światłem, roletami czy scenami.

Konfiguracja akcji dla różnych czasów hold

Krótkie przytrzymanie 1s może ściemniać światło, a dłuższe 3s wyłączać wszystkie urządzenia w pomieszczeniu. Możemy używać wielu timerów lub zmiennych globalnych do rozróżnienia akcji.

Czy multi click jest możliwy w ESPHome?

Tak, wszystkie trzy typy naciśnięć można łączyć. Wymaga to hierarchii priorytetów i logiki blokowania akcji.

Zarządzanie priorytetami akcji multi click

Priorytety: hold > double click > on_click. Flagi w zmiennych globalnych, np. is_double_click_pending i is_holding, pozwalają blokować mniej istotne akcje po wykryciu bardziej priorytetowej.

Przykładowa konfiguracja dla złożonych scenariuszy

Kompleksowy YAML inicjuje timery w on_press, sprawdza warunki w on_release i wykonuje opóźnione akcje w delay. Dzięki temu jedno przytrzymanie, podwójne kliknięcie i zwykły klik działają w pełnej synchronizacji.

Najlepsze praktyki i debugowanie

Używamy komponentu logger do śledzenia stanu zmiennych i timerów. Testujemy każdą akcję osobno, a następnie wszystkie razem, dostosowując czasy. Fizyczne przyciski wysokiej jakości oraz dobrze dobrany debounce_filter zapewniają powtarzalność działań i eliminują fałszywe wyzwolenia.

Zaawansowane interakcje z przyciskami w ESPHome

Dzięki ESPHome i płytce ESP32 DevKitC możemy łączyć on_click, double click i hold w intuicyjne interfejsy sterowania. Każde naciśnięcie staje się narzędziem kontroli oświetlenia, scen, rolet i innych urządzeń. My koncentrujemy się na precyzji, stabilności i elastyczności, aby system działał niezawodnie i był w pełni konfigurowalny pod indywidualne potrzeby.