ESPHome  2023.11.6
filter.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <queue>
4 #include <utility>
5 #include <vector>
7 #include "esphome/core/helpers.h"
8 
9 namespace esphome {
10 namespace sensor {
11 
12 class Sensor;
13 
19 class Filter {
20  public:
30  virtual optional<float> new_value(float value) = 0;
31 
33  virtual void initialize(Sensor *parent, Filter *next);
34 
35  void input(float value);
36 
37  void output(float value);
38 
39  protected:
40  friend Sensor;
41 
42  Filter *next_{nullptr};
43  Sensor *parent_{nullptr};
44 };
45 
50 class QuantileFilter : public Filter {
51  public:
61  explicit QuantileFilter(size_t window_size, size_t send_every, size_t send_first_at, float quantile);
62 
63  optional<float> new_value(float value) override;
64 
65  void set_send_every(size_t send_every);
66  void set_window_size(size_t window_size);
67  void set_quantile(float quantile);
68 
69  protected:
70  std::deque<float> queue_;
71  size_t send_every_;
72  size_t send_at_;
73  size_t window_size_;
74  float quantile_;
75 };
76 
81 class MedianFilter : public Filter {
82  public:
91  explicit MedianFilter(size_t window_size, size_t send_every, size_t send_first_at);
92 
93  optional<float> new_value(float value) override;
94 
95  void set_send_every(size_t send_every);
96  void set_window_size(size_t window_size);
97 
98  protected:
99  std::deque<float> queue_;
100  size_t send_every_;
101  size_t send_at_;
102  size_t window_size_;
103 };
104 
109 class SkipInitialFilter : public Filter {
110  public:
115  explicit SkipInitialFilter(size_t num_to_ignore);
116 
117  optional<float> new_value(float value) override;
118 
119  protected:
121 };
122 
127 class MinFilter : public Filter {
128  public:
137  explicit MinFilter(size_t window_size, size_t send_every, size_t send_first_at);
138 
139  optional<float> new_value(float value) override;
140 
141  void set_send_every(size_t send_every);
142  void set_window_size(size_t window_size);
143 
144  protected:
145  std::deque<float> queue_;
146  size_t send_every_;
147  size_t send_at_;
148  size_t window_size_;
149 };
150 
155 class MaxFilter : public Filter {
156  public:
165  explicit MaxFilter(size_t window_size, size_t send_every, size_t send_first_at);
166 
167  optional<float> new_value(float value) override;
168 
169  void set_send_every(size_t send_every);
170  void set_window_size(size_t window_size);
171 
172  protected:
173  std::deque<float> queue_;
174  size_t send_every_;
175  size_t send_at_;
176  size_t window_size_;
177 };
178 
185  public:
194  explicit SlidingWindowMovingAverageFilter(size_t window_size, size_t send_every, size_t send_first_at);
195 
196  optional<float> new_value(float value) override;
197 
198  void set_send_every(size_t send_every);
199  void set_window_size(size_t window_size);
200 
201  protected:
202  std::deque<float> queue_;
203  size_t send_every_;
204  size_t send_at_;
205  size_t window_size_;
206 };
207 
214  public:
215  ExponentialMovingAverageFilter(float alpha, size_t send_every, size_t send_first_at);
216 
217  optional<float> new_value(float value) override;
218 
219  void set_send_every(size_t send_every);
220  void set_alpha(float alpha);
221 
222  protected:
223  bool first_value_{true};
224  float accumulator_{NAN};
225  size_t send_every_;
226  size_t send_at_;
227  float alpha_;
228 };
229 
234 class ThrottleAverageFilter : public Filter, public Component {
235  public:
236  explicit ThrottleAverageFilter(uint32_t time_period);
237 
238  void setup() override;
239 
240  optional<float> new_value(float value) override;
241 
242  float get_setup_priority() const override;
243 
244  protected:
245  uint32_t time_period_;
246  float sum_{0.0f};
247  unsigned int n_{0};
248 };
249 
250 using lambda_filter_t = std::function<optional<float>(float)>;
251 
259 class LambdaFilter : public Filter {
260  public:
261  explicit LambdaFilter(lambda_filter_t lambda_filter);
262 
263  optional<float> new_value(float value) override;
264 
265  const lambda_filter_t &get_lambda_filter() const;
266  void set_lambda_filter(const lambda_filter_t &lambda_filter);
267 
268  protected:
270 };
271 
273 class OffsetFilter : public Filter {
274  public:
275  explicit OffsetFilter(float offset);
276 
277  optional<float> new_value(float value) override;
278 
279  protected:
280  float offset_;
281 };
282 
284 class MultiplyFilter : public Filter {
285  public:
286  explicit MultiplyFilter(float multiplier);
287 
288  optional<float> new_value(float value) override;
289 
290  protected:
291  float multiplier_;
292 };
293 
295 class FilterOutValueFilter : public Filter {
296  public:
297  explicit FilterOutValueFilter(float value_to_filter_out);
298 
299  optional<float> new_value(float value) override;
300 
301  protected:
303 };
304 
305 class ThrottleFilter : public Filter {
306  public:
307  explicit ThrottleFilter(uint32_t min_time_between_inputs);
308 
309  optional<float> new_value(float value) override;
310 
311  protected:
312  uint32_t last_input_{0};
314 };
315 
316 class TimeoutFilter : public Filter, public Component {
317  public:
318  explicit TimeoutFilter(uint32_t time_period, float new_value);
319  void set_value(float new_value) { this->value_ = 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_;
327  float value_;
328 };
329 
330 class 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 
342 class 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_;
354  float last_input_;
355  bool has_value_{false};
356 };
357 
358 class 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 
371 class 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_;
391 };
392 
394  public:
395  CalibrateLinearFilter(std::vector<std::array<float, 3>> linear_functions)
396  : linear_functions_(std::move(linear_functions)) {}
397  optional<float> new_value(float value) override;
398 
399  protected:
400  std::vector<std::array<float, 3>> linear_functions_;
401 };
402 
404  public:
405  CalibratePolynomialFilter(std::vector<float> coefficients) : coefficients_(std::move(coefficients)) {}
406  optional<float> new_value(float value) override;
407 
408  protected:
409  std::vector<float> coefficients_;
410 };
411 
412 class ClampFilter : public Filter {
413  public:
414  ClampFilter(float min, float max, bool ignore_out_of_range);
415  optional<float> new_value(float value) override;
416 
417  protected:
418  float min_{NAN};
419  float max_{NAN};
421 };
422 
423 class RoundFilter : public Filter {
424  public:
425  explicit RoundFilter(uint8_t precision);
426  optional<float> new_value(float value) override;
427 
428  protected:
429  uint8_t precision_;
430 };
431 
432 } // namespace sensor
433 } // namespace esphome
void setup()
lambda_filter_t lambda_filter_
Definition: filter.h:269
Simple max filter.
Definition: filter.h:155
void input(float value)
Definition: filter.cpp:13
std::deque< float > queue_
Definition: filter.h:70
This class allows for creation of simple template filters.
Definition: filter.h:259
std::vector< std::array< float, 3 > > linear_functions_
Definition: filter.h:400
std::vector< Filter * > filters_
Definition: filter.h:389
std::vector< float > coefficients_
Definition: filter.h:409
STL namespace.
std::deque< float > queue_
Definition: filter.h:173
void output(float value)
Definition: filter.cpp:19
virtual optional< float > new_value(float value)=0
This will be called every time the filter receives a new value.
Simple median filter.
Definition: filter.h:81
Simple exponential moving average filter.
Definition: filter.h:213
CalibratePolynomialFilter(std::vector< float > coefficients)
Definition: filter.h:405
A simple filter that only forwards the filter chain if it doesn&#39;t receive value_to_filter_out.
Definition: filter.h:295
virtual void initialize(Sensor *parent, Filter *next)
Initialize this filter, please note this can be called more than once.
Definition: filter.cpp:28
A simple filter that adds offset to each value it receives.
Definition: filter.h:273
A simple filter that multiplies to each value it receives by multiplier.
Definition: filter.h:284
std::deque< float > queue_
Definition: filter.h:145
Simple quantile filter.
Definition: filter.h:50
std::function< optional< float >(float)> lambda_filter_t
Definition: filter.h:250
Simple skip filter.
Definition: filter.h:109
Simple min filter.
Definition: filter.h:127
std::deque< float > queue_
Definition: filter.h:99
Apply a filter to sensor values such as moving average.
Definition: filter.h:19
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
Simple throttle average filter.
Definition: filter.h:234
Base-class for all sensors.
Definition: sensor.h:57
void set_value(float new_value)
Definition: filter.h:319
Simple sliding window moving average filter.
Definition: filter.h:184
CalibrateLinearFilter(std::vector< std::array< float, 3 >> linear_functions)
Definition: filter.h:395