ESPHome 2025.5.0
Loading...
Searching...
No Matches
filter.h
Go to the documentation of this file.
1#pragma once
2
3#include <queue>
4#include <utility>
5#include <vector>
9
10namespace esphome {
11namespace sensor {
12
13class Sensor;
14
20class Filter {
21 public:
31 virtual optional<float> new_value(float value) = 0;
32
34 virtual void initialize(Sensor *parent, Filter *next);
35
36 void input(float value);
37
38 void output(float value);
39
40 protected:
41 friend Sensor;
42
43 Filter *next_{nullptr};
44 Sensor *parent_{nullptr};
45};
46
51class QuantileFilter : public Filter {
52 public:
62 explicit QuantileFilter(size_t window_size, size_t send_every, size_t send_first_at, float quantile);
63
64 optional<float> new_value(float value) override;
65
66 void set_send_every(size_t send_every);
67 void set_window_size(size_t window_size);
68 void set_quantile(float quantile);
69
70 protected:
71 std::deque<float> queue_;
73 size_t send_at_;
75 float quantile_;
76};
77
82class MedianFilter : public Filter {
83 public:
92 explicit MedianFilter(size_t window_size, size_t send_every, size_t send_first_at);
93
94 optional<float> new_value(float value) override;
95
96 void set_send_every(size_t send_every);
97 void set_window_size(size_t window_size);
98
99 protected:
100 std::deque<float> queue_;
102 size_t send_at_;
104};
105
110class SkipInitialFilter : public Filter {
111 public:
116 explicit SkipInitialFilter(size_t num_to_ignore);
117
118 optional<float> new_value(float value) override;
119
120 protected:
122};
123
128class MinFilter : public Filter {
129 public:
138 explicit MinFilter(size_t window_size, size_t send_every, size_t send_first_at);
139
140 optional<float> new_value(float value) override;
141
142 void set_send_every(size_t send_every);
143 void set_window_size(size_t window_size);
144
145 protected:
146 std::deque<float> queue_;
148 size_t send_at_;
150};
151
156class MaxFilter : public Filter {
157 public:
166 explicit MaxFilter(size_t window_size, size_t send_every, size_t send_first_at);
167
168 optional<float> new_value(float value) override;
169
170 void set_send_every(size_t send_every);
171 void set_window_size(size_t window_size);
172
173 protected:
174 std::deque<float> queue_;
176 size_t send_at_;
178};
179
186 public:
195 explicit SlidingWindowMovingAverageFilter(size_t window_size, size_t send_every, size_t send_first_at);
196
197 optional<float> new_value(float value) override;
198
199 void set_send_every(size_t send_every);
200 void set_window_size(size_t window_size);
201
202 protected:
203 std::deque<float> queue_;
205 size_t send_at_;
207};
208
215 public:
216 ExponentialMovingAverageFilter(float alpha, size_t send_every, size_t send_first_at);
217
218 optional<float> new_value(float value) override;
219
220 void set_send_every(size_t send_every);
221 void set_alpha(float alpha);
222
223 protected:
224 bool first_value_{true};
225 float accumulator_{NAN};
227 size_t send_at_;
228 float alpha_;
229};
230
235class ThrottleAverageFilter : public Filter, public Component {
236 public:
237 explicit ThrottleAverageFilter(uint32_t time_period);
238
239 void setup() override;
240
241 optional<float> new_value(float value) override;
242
243 float get_setup_priority() const override;
244
245 protected:
246 uint32_t time_period_;
247 float sum_{0.0f};
248 unsigned int n_{0};
249 bool have_nan_{false};
250};
251
252using lambda_filter_t = std::function<optional<float>(float)>;
253
261class LambdaFilter : public Filter {
262 public:
263 explicit LambdaFilter(lambda_filter_t lambda_filter);
264
265 optional<float> new_value(float value) override;
266
267 const lambda_filter_t &get_lambda_filter() const;
268 void set_lambda_filter(const lambda_filter_t &lambda_filter);
269
270 protected:
272};
273
275class OffsetFilter : public Filter {
276 public:
277 explicit OffsetFilter(TemplatableValue<float> offset);
278
279 optional<float> new_value(float value) override;
280
281 protected:
283};
284
286class MultiplyFilter : public Filter {
287 public:
288 explicit MultiplyFilter(TemplatableValue<float> multiplier);
289 optional<float> new_value(float value) override;
290
291 protected:
293};
294
297 public:
298 explicit FilterOutValueFilter(std::vector<TemplatableValue<float>> values_to_filter_out);
299
300 optional<float> new_value(float value) override;
301
302 protected:
303 std::vector<TemplatableValue<float>> values_to_filter_out_;
304};
305
306class ThrottleFilter : public Filter {
307 public:
308 explicit ThrottleFilter(uint32_t min_time_between_inputs);
309
310 optional<float> new_value(float value) override;
311
312 protected:
313 uint32_t last_input_{0};
315};
316
317class TimeoutFilter : public Filter, public Component {
318 public:
319 explicit TimeoutFilter(uint32_t time_period, TemplatableValue<float> new_value);
320
321 optional<float> new_value(float value) override;
322
323 float get_setup_priority() const override;
324
325 protected:
326 uint32_t time_period_;
328};
329
330class DebounceFilter : public Filter, public Component {
331 public:
332 explicit DebounceFilter(uint32_t time_period);
333
334 optional<float> new_value(float value) override;
335
336 float get_setup_priority() const override;
337
338 protected:
339 uint32_t time_period_;
340};
341
342class HeartbeatFilter : public Filter, public Component {
343 public:
344 explicit HeartbeatFilter(uint32_t time_period);
345
346 void setup() override;
347
348 optional<float> new_value(float value) override;
349
350 float get_setup_priority() const override;
351
352 protected:
353 uint32_t time_period_;
355 bool has_value_{false};
356};
357
358class DeltaFilter : public Filter {
359 public:
360 explicit DeltaFilter(float delta, bool percentage_mode);
361
362 optional<float> new_value(float value) override;
363
364 protected:
365 float delta_;
368 float last_value_{NAN};
369};
370
371class OrFilter : public Filter {
372 public:
373 explicit OrFilter(std::vector<Filter *> filters);
374
375 void initialize(Sensor *parent, Filter *next) override;
376
377 optional<float> new_value(float value) override;
378
379 protected:
380 class PhiNode : public Filter {
381 public:
382 PhiNode(OrFilter *or_parent);
383 optional<float> new_value(float value) override;
384
385 protected:
387 };
388
389 std::vector<Filter *> filters_;
390 bool has_value_{false};
392};
393
395 public:
396 CalibrateLinearFilter(std::vector<std::array<float, 3>> linear_functions)
397 : linear_functions_(std::move(linear_functions)) {}
398 optional<float> new_value(float value) override;
399
400 protected:
401 std::vector<std::array<float, 3>> linear_functions_;
402};
403
405 public:
406 CalibratePolynomialFilter(std::vector<float> coefficients) : coefficients_(std::move(coefficients)) {}
407 optional<float> new_value(float value) override;
408
409 protected:
410 std::vector<float> coefficients_;
411};
412
413class ClampFilter : public Filter {
414 public:
415 ClampFilter(float min, float max, bool ignore_out_of_range);
416 optional<float> new_value(float value) override;
417
418 protected:
419 float min_{NAN};
420 float max_{NAN};
422};
423
424class RoundFilter : public Filter {
425 public:
426 explicit RoundFilter(uint8_t precision);
427 optional<float> new_value(float value) override;
428
429 protected:
430 uint8_t precision_;
431};
432
434 public:
435 explicit RoundMultipleFilter(float multiple);
436 optional<float> new_value(float value) override;
437
438 protected:
440};
441
443 public:
444 ToNTCResistanceFilter(double a, double b, double c) : a_(a), b_(b), c_(c) {}
445 optional<float> new_value(float value) override;
446
447 protected:
448 double a_;
449 double b_;
450 double c_;
451};
452
454 public:
455 ToNTCTemperatureFilter(double a, double b, double c) : a_(a), b_(b), c_(c) {}
456 optional<float> new_value(float value) override;
457
458 protected:
459 double a_;
460 double b_;
461 double c_;
462};
463
464} // namespace sensor
465} // namespace esphome
optional< float > new_value(float value) override
Definition filter.cpp:426
std::vector< std::array< float, 3 > > linear_functions_
Definition filter.h:401
CalibrateLinearFilter(std::vector< std::array< float, 3 > > linear_functions)
Definition filter.h:396
CalibratePolynomialFilter(std::vector< float > coefficients)
Definition filter.h:406
optional< float > new_value(float value) override
Definition filter.cpp:434
ClampFilter(float min, float max, bool ignore_out_of_range)
Definition filter.cpp:444
optional< float > new_value(float value) override
Definition filter.cpp:446
optional< float > new_value(float value) override
Definition filter.cpp:395
float get_setup_priority() const override
Definition filter.cpp:402
DebounceFilter(uint32_t time_period)
Definition filter.cpp:401
DeltaFilter(float delta, bool percentage_mode)
Definition filter.cpp:335
optional< float > new_value(float value) override
Definition filter.cpp:337
Simple exponential moving average filter.
Definition filter.h:214
optional< float > new_value(float value) override
Definition filter.cpp:227
ExponentialMovingAverageFilter(float alpha, size_t send_every, size_t send_first_at)
Definition filter.cpp:225
Apply a filter to sensor values such as moving average.
Definition filter.h:20
virtual optional< float > new_value(float value)=0
This will be called every time the filter receives a new value.
void output(float value)
Definition filter.cpp:19
virtual void initialize(Sensor *parent, Filter *next)
Initialize this filter, please note this can be called more than once.
Definition filter.cpp:28
void input(float value)
Definition filter.cpp:13
A simple filter that only forwards the filter chain if it doesn't receive value_to_filter_out.
Definition filter.h:296
std::vector< TemplatableValue< float > > values_to_filter_out_
Definition filter.h:303
FilterOutValueFilter(std::vector< TemplatableValue< float > > values_to_filter_out)
Definition filter.cpp:301
optional< float > new_value(float value) override
Definition filter.cpp:304
HeartbeatFilter(uint32_t time_period)
Definition filter.cpp:405
optional< float > new_value(float value) override
Definition filter.cpp:407
float get_setup_priority() const override
Definition filter.cpp:424
This class allows for creation of simple template filters.
Definition filter.h:261
const lambda_filter_t & get_lambda_filter() const
Definition filter.cpp:281
LambdaFilter(lambda_filter_t lambda_filter)
Definition filter.cpp:280
lambda_filter_t lambda_filter_
Definition filter.h:271
void set_lambda_filter(const lambda_filter_t &lambda_filter)
Definition filter.cpp:282
optional< float > new_value(float value) override
Definition filter.cpp:284
Simple max filter.
Definition filter.h:156
void set_send_every(size_t send_every)
Definition filter.cpp:163
void set_window_size(size_t window_size)
Definition filter.cpp:164
std::deque< float > queue_
Definition filter.h:174
optional< float > new_value(float value) override
Definition filter.cpp:165
MaxFilter(size_t window_size, size_t send_every, size_t send_first_at)
Construct a MaxFilter.
Definition filter.cpp:161
Simple median filter.
Definition filter.h:82
void set_send_every(size_t send_every)
Definition filter.cpp:37
void set_window_size(size_t window_size)
Definition filter.cpp:38
MedianFilter(size_t window_size, size_t send_every, size_t send_first_at)
Construct a MedianFilter.
Definition filter.cpp:35
optional< float > new_value(float value) override
Definition filter.cpp:39
std::deque< float > queue_
Definition filter.h:100
Simple min filter.
Definition filter.h:128
void set_window_size(size_t window_size)
Definition filter.cpp:136
void set_send_every(size_t send_every)
Definition filter.cpp:135
MinFilter(size_t window_size, size_t send_every, size_t send_first_at)
Construct a MinFilter.
Definition filter.cpp:133
std::deque< float > queue_
Definition filter.h:146
optional< float > new_value(float value) override
Definition filter.cpp:137
A simple filter that multiplies to each value it receives by multiplier.
Definition filter.h:286
optional< float > new_value(float value) override
Definition filter.cpp:298
MultiplyFilter(TemplatableValue< float > multiplier)
Definition filter.cpp:296
TemplatableValue< float > multiplier_
Definition filter.h:292
A simple filter that adds offset to each value it receives.
Definition filter.h:275
optional< float > new_value(float value) override
Definition filter.cpp:293
OffsetFilter(TemplatableValue< float > offset)
Definition filter.cpp:291
TemplatableValue< float > offset_
Definition filter.h:282
optional< float > new_value(float value) override
Definition filter.cpp:361
PhiNode(OrFilter *or_parent)
Definition filter.cpp:359
std::vector< Filter * > filters_
Definition filter.h:389
optional< float > new_value(float value) override
Definition filter.cpp:369
void initialize(Sensor *parent, Filter *next) override
Definition filter.cpp:376
OrFilter(std::vector< Filter * > filters)
Definition filter.cpp:358
Simple quantile filter.
Definition filter.h:51
void set_window_size(size_t window_size)
Definition filter.cpp:94
void set_send_every(size_t send_every)
Definition filter.cpp:93
std::deque< float > queue_
Definition filter.h:71
void set_quantile(float quantile)
Definition filter.cpp:95
optional< float > new_value(float value) override
Definition filter.cpp:96
QuantileFilter(size_t window_size, size_t send_every, size_t send_first_at, float quantile)
Construct a QuantileFilter.
Definition filter.cpp:91
RoundFilter(uint8_t precision)
Definition filter.cpp:467
optional< float > new_value(float value) override
Definition filter.cpp:468
optional< float > new_value(float value) override
Definition filter.cpp:477
Base-class for all sensors.
Definition sensor.h:57
SkipInitialFilter(size_t num_to_ignore)
Construct a SkipInitialFilter.
Definition filter.cpp:78
optional< float > new_value(float value) override
Definition filter.cpp:79
Simple sliding window moving average filter.
Definition filter.h:185
optional< float > new_value(float value) override
Definition filter.cpp:194
SlidingWindowMovingAverageFilter(size_t window_size, size_t send_every, size_t send_first_at)
Construct a SlidingWindowMovingAverageFilter.
Definition filter.cpp:189
Simple throttle average filter.
Definition filter.h:235
optional< float > new_value(float value) override
Definition filter.cpp:253
ThrottleAverageFilter(uint32_t time_period)
Definition filter.cpp:251
float get_setup_priority() const override
Definition filter.cpp:277
ThrottleFilter(uint32_t min_time_between_inputs)
Definition filter.cpp:324
optional< float > new_value(float value) override
Definition filter.cpp:325
TemplatableValue< float > value_
Definition filter.h:327
optional< float > new_value(float value) override
Definition filter.cpp:385
float get_setup_priority() const override
Definition filter.cpp:392
TimeoutFilter(uint32_t time_period, TemplatableValue< float > new_value)
Definition filter.cpp:390
optional< float > new_value(float value) override
Definition filter.cpp:484
ToNTCResistanceFilter(double a, double b, double c)
Definition filter.h:444
optional< float > new_value(float value) override
Definition filter.cpp:497
ToNTCTemperatureFilter(double a, double b, double c)
Definition filter.h:455
std::function< optional< float >(float)> lambda_filter_t
Definition filter.h:252
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7