ESPHome 2025.8.0b2
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 float accumulator_{NAN};
225 float alpha_;
227 size_t send_at_;
228 bool first_value_{true};
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 float sum_{0.0f};
247 unsigned int n_{0};
248 uint32_t time_period_;
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
319 public:
320 explicit ThrottleWithPriorityFilter(uint32_t min_time_between_inputs,
321 std::vector<TemplatableValue<float>> prioritized_values);
322
323 optional<float> new_value(float value) override;
324
325 protected:
326 uint32_t last_input_{0};
328 std::vector<TemplatableValue<float>> prioritized_values_;
329};
330
331class TimeoutFilter : public Filter, public Component {
332 public:
333 explicit TimeoutFilter(uint32_t time_period);
334 explicit TimeoutFilter(uint32_t time_period, const TemplatableValue<float> &new_value);
335
336 optional<float> new_value(float value) override;
337
338 float get_setup_priority() const override;
339
340 protected:
341 uint32_t time_period_;
343};
344
345class DebounceFilter : public Filter, public Component {
346 public:
347 explicit DebounceFilter(uint32_t time_period);
348
349 optional<float> new_value(float value) override;
350
351 float get_setup_priority() const override;
352
353 protected:
354 uint32_t time_period_;
355};
356
357class HeartbeatFilter : public Filter, public Component {
358 public:
359 explicit HeartbeatFilter(uint32_t time_period);
360
361 void setup() override;
362
363 optional<float> new_value(float value) override;
364
365 float get_setup_priority() const override;
366
367 protected:
368 uint32_t time_period_;
370 bool has_value_{false};
371};
372
373class DeltaFilter : public Filter {
374 public:
375 explicit DeltaFilter(float delta, bool percentage_mode);
376
377 optional<float> new_value(float value) override;
378
379 protected:
380 float delta_;
382 float last_value_{NAN};
384};
385
386class OrFilter : public Filter {
387 public:
388 explicit OrFilter(std::vector<Filter *> filters);
389
390 void initialize(Sensor *parent, Filter *next) override;
391
392 optional<float> new_value(float value) override;
393
394 protected:
395 class PhiNode : public Filter {
396 public:
397 PhiNode(OrFilter *or_parent);
398 optional<float> new_value(float value) override;
399
400 protected:
402 };
403
404 std::vector<Filter *> filters_;
406 bool has_value_{false};
407};
408
410 public:
411 CalibrateLinearFilter(std::vector<std::array<float, 3>> linear_functions)
412 : linear_functions_(std::move(linear_functions)) {}
413 optional<float> new_value(float value) override;
414
415 protected:
416 std::vector<std::array<float, 3>> linear_functions_;
417};
418
420 public:
421 CalibratePolynomialFilter(std::vector<float> coefficients) : coefficients_(std::move(coefficients)) {}
422 optional<float> new_value(float value) override;
423
424 protected:
425 std::vector<float> coefficients_;
426};
427
428class ClampFilter : public Filter {
429 public:
430 ClampFilter(float min, float max, bool ignore_out_of_range);
431 optional<float> new_value(float value) override;
432
433 protected:
434 float min_{NAN};
435 float max_{NAN};
437};
438
439class RoundFilter : public Filter {
440 public:
441 explicit RoundFilter(uint8_t precision);
442 optional<float> new_value(float value) override;
443
444 protected:
445 uint8_t precision_;
446};
447
449 public:
450 explicit RoundMultipleFilter(float multiple);
451 optional<float> new_value(float value) override;
452
453 protected:
455};
456
458 public:
459 ToNTCResistanceFilter(double a, double b, double c) : a_(a), b_(b), c_(c) {}
460 optional<float> new_value(float value) override;
461
462 protected:
463 double a_;
464 double b_;
465 double c_;
466};
467
469 public:
470 ToNTCTemperatureFilter(double a, double b, double c) : a_(a), b_(b), c_(c) {}
471 optional<float> new_value(float value) override;
472
473 protected:
474 double a_;
475 double b_;
476 double c_;
477};
478
479} // namespace sensor
480} // namespace esphome
optional< float > new_value(float value) override
Definition filter.cpp:465
std::vector< std::array< float, 3 > > linear_functions_
Definition filter.h:416
CalibrateLinearFilter(std::vector< std::array< float, 3 > > linear_functions)
Definition filter.h:411
CalibratePolynomialFilter(std::vector< float > coefficients)
Definition filter.h:421
optional< float > new_value(float value) override
Definition filter.cpp:473
ClampFilter(float min, float max, bool ignore_out_of_range)
Definition filter.cpp:483
optional< float > new_value(float value) override
Definition filter.cpp:485
optional< float > new_value(float value) override
Definition filter.cpp:434
float get_setup_priority() const override
Definition filter.cpp:441
DebounceFilter(uint32_t time_period)
Definition filter.cpp:440
DeltaFilter(float delta, bool percentage_mode)
Definition filter.cpp:371
optional< float > new_value(float value) override
Definition filter.cpp:373
Simple exponential moving average filter.
Definition filter.h:214
optional< float > new_value(float value) override
Definition filter.cpp:229
ExponentialMovingAverageFilter(float alpha, size_t send_every, size_t send_first_at)
Definition filter.cpp:227
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:20
virtual void initialize(Sensor *parent, Filter *next)
Initialize this filter, please note this can be called more than once.
Definition filter.cpp:29
void input(float value)
Definition filter.cpp:14
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:303
optional< float > new_value(float value) override
Definition filter.cpp:306
HeartbeatFilter(uint32_t time_period)
Definition filter.cpp:444
optional< float > new_value(float value) override
Definition filter.cpp:446
float get_setup_priority() const override
Definition filter.cpp:463
This class allows for creation of simple template filters.
Definition filter.h:261
const lambda_filter_t & get_lambda_filter() const
Definition filter.cpp:283
LambdaFilter(lambda_filter_t lambda_filter)
Definition filter.cpp:282
lambda_filter_t lambda_filter_
Definition filter.h:271
void set_lambda_filter(const lambda_filter_t &lambda_filter)
Definition filter.cpp:284
optional< float > new_value(float value) override
Definition filter.cpp:286
Simple max filter.
Definition filter.h:156
void set_send_every(size_t send_every)
Definition filter.cpp:165
void set_window_size(size_t window_size)
Definition filter.cpp:166
std::deque< float > queue_
Definition filter.h:174
optional< float > new_value(float value) override
Definition filter.cpp:167
MaxFilter(size_t window_size, size_t send_every, size_t send_first_at)
Construct a MaxFilter.
Definition filter.cpp:163
Simple median filter.
Definition filter.h:82
void set_send_every(size_t send_every)
Definition filter.cpp:38
void set_window_size(size_t window_size)
Definition filter.cpp:39
MedianFilter(size_t window_size, size_t send_every, size_t send_first_at)
Construct a MedianFilter.
Definition filter.cpp:36
optional< float > new_value(float value) override
Definition filter.cpp:40
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:138
void set_send_every(size_t send_every)
Definition filter.cpp:137
MinFilter(size_t window_size, size_t send_every, size_t send_first_at)
Construct a MinFilter.
Definition filter.cpp:135
std::deque< float > queue_
Definition filter.h:146
optional< float > new_value(float value) override
Definition filter.cpp:139
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:300
MultiplyFilter(TemplatableValue< float > multiplier)
Definition filter.cpp:298
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:295
OffsetFilter(TemplatableValue< float > offset)
Definition filter.cpp:293
TemplatableValue< float > offset_
Definition filter.h:282
optional< float > new_value(float value) override
Definition filter.cpp:395
PhiNode(OrFilter *or_parent)
Definition filter.cpp:393
std::vector< Filter * > filters_
Definition filter.h:404
optional< float > new_value(float value) override
Definition filter.cpp:403
void initialize(Sensor *parent, Filter *next) override
Definition filter.cpp:410
OrFilter(std::vector< Filter * > filters)
Definition filter.cpp:392
Simple quantile filter.
Definition filter.h:51
void set_window_size(size_t window_size)
Definition filter.cpp:96
void set_send_every(size_t send_every)
Definition filter.cpp:95
std::deque< float > queue_
Definition filter.h:71
void set_quantile(float quantile)
Definition filter.cpp:97
optional< float > new_value(float value) override
Definition filter.cpp:98
QuantileFilter(size_t window_size, size_t send_every, size_t send_first_at, float quantile)
Construct a QuantileFilter.
Definition filter.cpp:93
RoundFilter(uint8_t precision)
Definition filter.cpp:506
optional< float > new_value(float value) override
Definition filter.cpp:507
optional< float > new_value(float value) override
Definition filter.cpp:516
Base-class for all sensors.
Definition sensor.h:59
SkipInitialFilter(size_t num_to_ignore)
Construct a SkipInitialFilter.
Definition filter.cpp:80
optional< float > new_value(float value) override
Definition filter.cpp:81
Simple sliding window moving average filter.
Definition filter.h:185
optional< float > new_value(float value) override
Definition filter.cpp:196
SlidingWindowMovingAverageFilter(size_t window_size, size_t send_every, size_t send_first_at)
Construct a SlidingWindowMovingAverageFilter.
Definition filter.cpp:191
Simple throttle average filter.
Definition filter.h:235
optional< float > new_value(float value) override
Definition filter.cpp:255
ThrottleAverageFilter(uint32_t time_period)
Definition filter.cpp:253
float get_setup_priority() const override
Definition filter.cpp:279
ThrottleFilter(uint32_t min_time_between_inputs)
Definition filter.cpp:326
optional< float > new_value(float value) override
Definition filter.cpp:327
Same as 'throttle' but will immediately publish values contained in value_to_prioritize.
Definition filter.h:318
std::vector< TemplatableValue< float > > prioritized_values_
Definition filter.h:328
ThrottleWithPriorityFilter(uint32_t min_time_between_inputs, std::vector< TemplatableValue< float > > prioritized_values)
Definition filter.cpp:337
optional< float > new_value(float value) override
Definition filter.cpp:341
optional< float > new_value(float value) override
Definition filter.cpp:419
optional< TemplatableValue< float > > value_
Definition filter.h:342
TimeoutFilter(uint32_t time_period)
Definition filter.cpp:428
float get_setup_priority() const override
Definition filter.cpp:431
optional< float > new_value(float value) override
Definition filter.cpp:523
ToNTCResistanceFilter(double a, double b, double c)
Definition filter.h:459
optional< float > new_value(float value) override
Definition filter.cpp:536
ToNTCTemperatureFilter(double a, double b, double c)
Definition filter.h:470
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