ESPHome 2026.5.0-dev
Loading...
Searching...
No Matches
filter.h
Go to the documentation of this file.
1#pragma once
2
4#ifdef USE_BINARY_SENSOR_FILTER
5
6#include <array>
7
11
12namespace esphome::binary_sensor {
13
14class BinarySensor;
15
16class Filter {
17 public:
18 virtual optional<bool> new_value(bool value) = 0;
19
20 virtual void input(bool value);
21
22 void output(bool value);
23
24 protected:
26
27 Filter *next_{nullptr};
30};
31
32class TimeoutFilter : public Filter, public Component {
33 public:
34 optional<bool> new_value(bool value) override { return value; }
35 void input(bool value) override;
36 template<typename T> void set_timeout_value(T timeout) { this->timeout_delay_ = timeout; }
37
38 protected:
40};
41
42class DelayedOnOffFilter final : public Filter, public Component {
43 public:
44 optional<bool> new_value(bool value) override;
45
46 float get_setup_priority() const override;
47
48 template<typename T> void set_on_delay(T delay) { this->on_delay_ = delay; }
49 template<typename T> void set_off_delay(T delay) { this->off_delay_ = delay; }
50
51 protected:
54};
55
56class DelayedOnFilter : public Filter, public Component {
57 public:
58 optional<bool> new_value(bool value) override;
59
60 float get_setup_priority() const override;
61
62 template<typename T> void set_delay(T delay) { this->delay_ = delay; }
63
64 protected:
66};
67
68class DelayedOffFilter : public Filter, public Component {
69 public:
70 optional<bool> new_value(bool value) override;
71
72 float get_setup_priority() const override;
73
74 template<typename T> void set_delay(T delay) { this->delay_ = delay; }
75
76 protected:
78};
79
80class InvertFilter : public Filter {
81 public:
82 optional<bool> new_value(bool value) override;
83};
84
90
93class AutorepeatFilterBase : public Filter, public Component {
94 public:
95 optional<bool> new_value(bool value) override;
96 float get_setup_priority() const override;
99
100 protected:
102 void next_timing_();
103 void next_value_(bool val);
104
106 uint8_t timings_count_{0};
107 uint8_t active_timing_{0};
108};
109
112template<size_t N> class AutorepeatFilter : public AutorepeatFilterBase {
113 public:
114 explicit AutorepeatFilter(std::initializer_list<AutorepeatFilterTiming> timings) {
115 init_array_from(this->timings_storage_, timings);
116 this->timings_ = this->timings_storage_.data();
117 this->timings_count_ = N;
118 }
119
120 protected:
121 std::array<AutorepeatFilterTiming, N> timings_storage_{};
122};
123
124class LambdaFilter : public Filter {
125 public:
126 explicit LambdaFilter(std::function<optional<bool>(bool)> f);
127
128 optional<bool> new_value(bool value) override;
129
130 protected:
131 std::function<optional<bool>(bool)> f_;
132};
133
140 public:
141 explicit StatelessLambdaFilter(optional<bool> (*f)(bool)) : f_(f) {}
142
143 optional<bool> new_value(bool value) override { return this->f_(value); }
144
145 protected:
146 optional<bool> (*f_)(bool);
147};
148
149class SettleFilter : public Filter, public Component {
150 public:
151 optional<bool> new_value(bool value) override;
152
153 float get_setup_priority() const override;
154
155 template<typename T> void set_delay(T delay) { this->delay_ = delay; }
156
157 protected:
159 bool steady_{true};
160};
161
162} // namespace esphome::binary_sensor
163
164#endif // USE_BINARY_SENSOR_FILTER
Helper class to deduplicate items in a series of values.
Definition helpers.h:1985
Function-pointer-only templatable storage (4 bytes on 32-bit).
Definition automation.h:40
Non-template base for AutorepeatFilter — all methods in filter.cpp.
Definition filter.h:93
AutorepeatFilterBase(const AutorepeatFilterBase &)=delete
optional< bool > new_value(bool value) override
Definition filter.cpp:80
float get_setup_priority() const override
Definition filter.cpp:113
const AutorepeatFilterTiming * timings_
Definition filter.h:105
AutorepeatFilterBase & operator=(const AutorepeatFilterBase &)=delete
Template wrapper that provides inline std::array storage for timings.
Definition filter.h:112
std::array< AutorepeatFilterTiming, N > timings_storage_
Definition filter.h:121
AutorepeatFilter(std::initializer_list< AutorepeatFilterTiming > timings)
Definition filter.h:114
Base class for all binary_sensor-type classes.
float get_setup_priority() const override
Definition filter.cpp:75
optional< bool > new_value(bool value) override
Definition filter.cpp:65
TemplatableFn< uint32_t > delay_
Definition filter.h:77
optional< bool > new_value(bool value) override
Definition filter.cpp:53
TemplatableFn< uint32_t > delay_
Definition filter.h:65
float get_setup_priority() const override
Definition filter.cpp:63
TemplatableFn< uint32_t > on_delay_
Definition filter.h:52
TemplatableFn< uint32_t > off_delay_
Definition filter.h:53
float get_setup_priority() const override
Definition filter.cpp:51
optional< bool > new_value(bool value) override
Definition filter.cpp:42
virtual void input(bool value)
Definition filter.cpp:27
virtual optional< bool > new_value(bool value)=0
Deduplicator< bool > dedup_
Definition filter.h:29
void output(bool value)
Definition filter.cpp:20
optional< bool > new_value(bool value) override
Definition filter.cpp:77
LambdaFilter(std::function< optional< bool >(bool)> f)
Definition filter.cpp:115
std::function< optional< bool >(bool)> f_
Definition filter.h:131
optional< bool > new_value(bool value) override
Definition filter.cpp:117
TemplatableFn< uint32_t > delay_
Definition filter.h:158
float get_setup_priority() const override
Definition filter.cpp:133
optional< bool > new_value(bool value) override
Definition filter.cpp:119
Optimized lambda filter for stateless lambdas (no capture).
Definition filter.h:139
StatelessLambdaFilter(optional< bool >(*f)(bool))
Definition filter.h:141
optional< bool > new_value(bool value) override
Definition filter.h:143
TemplatableFn< uint32_t > timeout_delay_
Definition filter.h:39
void input(bool value) override
Definition filter.cpp:36
optional< bool > new_value(bool value) override
Definition filter.h:34
mopeka_std_values val[3]
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:505
void HOT delay(uint32_t ms)
Definition core.cpp:28
static void uint32_t