ESPHome 2026.10.2
Loading...
Searching...
No Matches
automation.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <cinttypes>
5#include <utility>
6
9#include "esphome/core/hal.h"
12
13namespace esphome::binary_sensor {
14
20
21bool match_interval(uint32_t min_length, uint32_t max_length, uint32_t length);
22
23class ClickTrigger final : public Trigger<> {
24 public:
25 explicit ClickTrigger(BinarySensor *parent, uint32_t min_length, uint32_t max_length)
26 : min_length_(min_length), max_length_(max_length) {
27 parent->add_on_state_callback([this](bool state) {
28 if (state) {
29 this->start_time_ = millis();
30 } else {
31 const uint32_t length = millis() - this->start_time_;
32 if (match_interval(this->min_length_, this->max_length_, length))
33 this->trigger();
34 }
35 });
36 }
37
38 protected:
42};
43
44class DoubleClickTrigger final : public Trigger<> {
45 public:
46 explicit DoubleClickTrigger(BinarySensor *parent, uint32_t min_length, uint32_t max_length)
47 : min_length_(min_length), max_length_(max_length) {
48 parent->add_on_state_callback([this](bool state) {
49 const uint32_t now = millis();
50
51 if (state && this->start_time_ != 0 && this->end_time_ != 0) {
52 if (match_interval(this->min_length_, this->max_length_, this->end_time_ - this->start_time_) &&
53 match_interval(this->min_length_, this->max_length_, now - this->end_time_)) {
54 this->trigger();
55 this->start_time_ = 0;
56 this->end_time_ = 0;
57 return;
58 }
59 }
60
61 this->start_time_ = this->end_time_;
62 this->end_time_ = now;
63 });
64 }
65
66 protected:
71};
72
74class MultiClickTriggerBase : public Trigger<>, public Component {
75 public:
76 explicit MultiClickTriggerBase(BinarySensor *parent) : parent_(parent) {}
77
78 void setup() override {
79 this->last_state_ = this->parent_->get_state_default(false);
80 this->parent_->add_on_state_callback([this](bool state) { this->on_state_(state); });
81 }
82
83 float get_setup_priority() const override { return setup_priority::HARDWARE; }
84
85 void set_invalid_cooldown(uint32_t invalid_cooldown) { this->invalid_cooldown_ = invalid_cooldown; }
86
87 void cancel();
90
91 protected:
92 void on_state_(bool state);
93 void schedule_cooldown_();
94 void schedule_is_valid_(uint32_t min_length);
95 void schedule_is_not_valid_(uint32_t max_length);
96 void trigger_();
97
101 optional<size_t> at_index_{};
102 uint8_t timing_count_{0};
103 bool last_state_{false};
104 bool is_in_cooldown_{false};
105 bool is_valid_{false};
106};
107
110template<size_t N> class MultiClickTrigger final : public MultiClickTriggerBase {
111 public:
112 MultiClickTrigger(BinarySensor *parent, std::initializer_list<MultiClickTriggerEvent> timing)
113 : MultiClickTriggerBase(parent) {
114 init_array_from(this->timing_storage_, timing);
115 this->timing_ = this->timing_storage_.data();
116 this->timing_count_ = N;
117 }
118
119 protected:
120 std::array<MultiClickTriggerEvent, N> timing_storage_{};
121};
122
123} // namespace esphome::binary_sensor
void add_on_state_callback(F &&callback)
T get_state_default(T default_value) const
Return the current state if available, otherwise return the provided default.
void trigger(const Ts &...x) ESPHOME_ALWAYS_INLINE
Definition automation.h:528
Base class for all binary_sensor-type classes.
uint32_t min_length_
The millis() time when the click started.
Definition automation.h:40
uint32_t max_length_
Minimum length of click. 0 means no minimum.
Definition automation.h:41
ClickTrigger(BinarySensor *parent, uint32_t min_length, uint32_t max_length)
Definition automation.h:25
DoubleClickTrigger(BinarySensor *parent, uint32_t min_length, uint32_t max_length)
Definition automation.h:46
uint32_t max_length_
Minimum length of click. 0 means no minimum.
Definition automation.h:70
Non-template base for MultiClickTrigger (keeps large method bodies out of the header).
Definition automation.h:74
MultiClickTriggerBase & operator=(const MultiClickTriggerBase &)=delete
void set_invalid_cooldown(uint32_t invalid_cooldown)
Definition automation.h:85
void schedule_is_not_valid_(uint32_t max_length)
const MultiClickTriggerEvent * timing_
Definition automation.h:99
void schedule_is_valid_(uint32_t min_length)
MultiClickTriggerBase(const MultiClickTriggerBase &)=delete
Template wrapper that provides inline std::array storage for timing events.
Definition automation.h:110
std::array< MultiClickTriggerEvent, N > timing_storage_
Definition automation.h:120
MultiClickTrigger(BinarySensor *parent, std::initializer_list< MultiClickTriggerEvent > timing)
Definition automation.h:112
bool state
Definition fan.h:2
bool match_interval(uint32_t min_length, uint32_t max_length, uint32_t length)
constexpr float HARDWARE
For components that deal with hardware and are very important like GPIO switch.
Definition component.h:43
void init_array_from(std::array< T, N > &dest, std::initializer_list< T > src)
Initialize a std::array from an initializer_list.
Definition helpers.h:596
uint32_t IRAM_ATTR HOT millis()
Definition hal.cpp:25
static void uint32_t
uint16_t length
Definition tt21100.cpp:0