4#ifdef USE_SENSOR_FILTER
38 void input(
float value);
58 optional<float>
new_value(
float value)
final;
86 result = std::isnan(result) ? v : (comp(v, result) ? v : result);
123 explicit QuantileFilter(
size_t window_size,
size_t send_every,
size_t send_first_at,
float quantile);
146 using SortedWindowFilter::SortedWindowFilter;
164 optional<float>
new_value(
float value)
override;
184 using MinMaxFilter::MinMaxFilter;
204 using MinMaxFilter::MinMaxFilter;
240 optional<float>
new_value(
float value)
override;
263 optional<float>
new_value(
float value)
override;
288 optional<float>
new_value(
float value)
override;
317 optional<float>
new_value(
float value)
override;
327 optional<float>
new_value(
float value)
override;
334static_assert(
sizeof(
TemplatableFn<float>) ==
sizeof(
void *),
"TemplatableFn<float> must stay a single pointer");
366 optional<float>
new_value(
float value)
override;
379 optional<float>
new_value(
float value)
override;
392 optional<float>
new_value(
float value)
override;
426 void loop()
override;
443 optional<float>
new_value(
float value)
override;
457 optional<float>
new_value(
float value)
override;
471 optional<float>
new_value(
float value)
override;
472 void loop()
override;
482 optional<float>
new_value(
float value)
override;
493 optional<float>
new_value(
float value)
override;
506 explicit DeltaFilter(
float min_a0,
float min_a1,
float max_a0,
float max_a1);
510 optional<float>
new_value(
float value)
override;
518 float (*
baseline_)(float) = [](
float last_value) {
return last_value; };
532 template<
typename... Fs>
533 requires(
sizeof...(Fs) == N)
570 optional<float>
new_value(
float value)
override;
580 optional<float>
new_value(
float value)
override;
588 ClampFilter(
float min,
float max,
bool ignore_out_of_range);
589 optional<float>
new_value(
float value)
override;
600 optional<float>
new_value(
float value)
override;
609 optional<float>
new_value(
float value)
override;
618 if (std::isfinite(value)) {
622 return roundf(value * factor) / factor;
631 optional<float>
new_value(
float value)
override;
642 optional<float>
new_value(
float value)
override;
661 optional<float>
new_value(
float value)
override;
679 optional<float>
new_value(
float value)
final;
void disable_loop()
Disable this component's loop.
Fixed-capacity circular buffer - allocates once at runtime, never reallocates.
Fixed-capacity vector - sized once through init() or try_init(); push_back never reallocates This avo...
Function-pointer-only templatable storage (4 bytes on 32-bit).
Piecewise linear calibration; the segments are a PROGMEM table shared by filters with the same data.
optional< float > new_value(float value) override
const std::array< float, 3 > * functions_
CalibrateLinearFilter(const std::array< float, 3 > *functions)
Polynomial calibration; the coefficients are a PROGMEM table shared by filters with the same data.
const float * coefficients_
CalibratePolynomialFilter(const float *coefficients)
optional< float > new_value(float value) override
bool ignore_out_of_range_
ClampFilter(float min, float max, bool ignore_out_of_range)
optional< float > new_value(float value) override
optional< float > new_value(float value) override
DebounceFilter(uint32_t time_period)
void set_baseline(float(*fn)(float))
DeltaFilter(float min_a0, float min_a1, float max_a0, float max_a1)
optional< float > new_value(float value) override
float(* baseline_)(float)
Simple exponential moving average filter.
void set_send_every(uint16_t send_every)
optional< float > new_value(float value) override
void set_alpha(float alpha)
ExponentialMovingAverageFilter(float alpha, uint16_t send_every, uint16_t send_first_at)
Apply a filter to sensor values such as moving average.
virtual optional< float > new_value(float value)=0
This will be called every time the filter receives a new value.
virtual void initialize(Sensor *parent, Filter *next)
Initialize this filter, please note this can be called more than once.
A simple filter that only forwards the filter chain if it doesn't receive value_to_filter_out.
FilterOutValueFilter(const TemplatableFn< float > *values_to_filter_out)
optional< float > new_value(float value) override
HeartbeatFilter(uint32_t time_period)
optional< float > new_value(float value) override
void initialize(Sensor *parent, Filter *next) override
void set_optimistic(bool optimistic)
This class allows for creation of simple template filters.
const lambda_filter_t & get_lambda_filter() const
LambdaFilter(lambda_filter_t lambda_filter)
lambda_filter_t lambda_filter_
void set_lambda_filter(const lambda_filter_t &lambda_filter)
optional< float > new_value(float value) override
float compute_result() override
float compute_result() override
Base class for Min/Max filters.
float find_extremum_()
Helper to find min or max value in window, skipping NaN values Usage: find_extremum_<std::less<float>...
A simple filter that multiplies to each value it receives by multiplier.
TemplatableFn< float > multiplier_
optional< float > new_value(float value) override
MultiplyFilter(TemplatableFn< float > multiplier)
A simple filter that adds offset to each value it receives.
optional< float > new_value(float value) override
TemplatableFn< float > offset_
OffsetFilter(TemplatableFn< float > offset)
optional< float > new_value(float value) override
PhiNode(OrFilter *or_parent)
N is set by code generation to match the exact number of filters configured in YAML.
std::array< Filter *, N > filters_
void initialize(Sensor *parent, Filter *next) override
optional< float > new_value(float value) override
OrFilter(std::initializer_list< Filter * > filters)
float compute_result() override
void set_quantile(float quantile)
QuantileFilter(size_t window_size, size_t send_every, size_t send_first_at, float quantile)
Construct a QuantileFilter.
RH Temperature correction filter.
TemplatableFn< float > temperature_offset_
optional< float > new_value(float value) override
const Sensor * temperature_sensor_
RHCorrectionFilter(TemplatableFn< float > offset, const Sensor *temperature_sensor, bool use_fahrenheit)
RoundFilter(uint8_t precision)
optional< float > new_value(float value) override
optional< float > new_value(float value) override
RoundMultipleFilter(float multiple)
optional< float > new_value(float value) override
Base-class for all sensors.
SkipInitialFilter(size_t num_to_ignore)
Construct a SkipInitialFilter.
optional< float > new_value(float value) override
Base class for filters that use a sliding window of values.
FixedRingBuffer< float > window_
Sliding window ring buffer - automatically overwrites oldest values when full.
optional< float > new_value(float value) final
SlidingWindowFilter(uint16_t window_size, uint16_t send_every, uint16_t send_first_at)
uint16_t send_every_
Send result every N values.
virtual float compute_result()=0
Called by new_value() to compute the filtered result from the current window.
uint16_t send_at_
Counter for send_every.
Simple sliding window moving average filter.
float compute_result() override
Base class for filters that need a sorted window (Median, Quantile).
FixedVector< float > get_window_values_()
Helper to get non-NaN values from the window (not sorted - caller will use nth_element) Returns empty...
Optimized lambda filter for stateless lambdas (no capture).
optional< float >(* lambda_filter_)(float)
optional< float > new_value(float value) override
StatelessLambdaFilter(optional< float >(*lambda_filter)(float))
Base class for streaming filters (batch windows where window_size == send_every).
StreamingFilter(uint16_t window_size, uint16_t send_first_at)
virtual void process_value(float value)=0
Called by new_value() to process each value in the batch.
virtual float compute_batch_result()=0
Called by new_value() to compute the result after collecting window_size values.
virtual void reset_batch()=0
Called by new_value() to reset internal state after sending a result.
optional< float > new_value(float value) final
Streaming max filter for batch windows (window_size == send_every).
void reset_batch() override
void process_value(float value) override
float compute_batch_result() override
Streaming min filter for batch windows (window_size == send_every).
void reset_batch() override
float compute_batch_result() override
void process_value(float value) override
Streaming moving average filter for batch windows (window_size == send_every).
float compute_batch_result() override
void reset_batch() override
void process_value(float value) override
Simple throttle average filter.
optional< float > new_value(float value) override
ThrottleAverageFilter(uint32_t time_period)
void initialize(Sensor *parent, Filter *next) override
uint32_t min_time_between_inputs_
ThrottleFilter(uint32_t min_time_between_inputs)
optional< float > new_value(float value) override
Same as 'throttle' but will immediately publish values contained in value_to_prioritize.
optional< float > new_value(float value) override
ThrottleWithPriorityFilter(uint32_t min_time_between_inputs, const TemplatableFn< float > *prioritized_values)
uint32_t min_time_between_inputs_
Specialization of ThrottleWithPriorityFilter for the common "prioritize NaN" case: skips the Templata...
uint32_t min_time_between_inputs_
optional< float > new_value(float value) override
ThrottleWithPriorityNanFilter(uint32_t min_time_between_inputs)
uint32_t timeout_start_time_
TimeoutFilterBase(uint32_t time_period)
float get_setup_priority() const override
virtual float get_output_value()=0
float get_output_value() override
TimeoutFilterLast(uint32_t time_period)
optional< float > new_value(float value) override
Codegen use only: timeout (value last) followed by throttle_with_priority (NaN only) with the same pe...
optional< float > new_value(float value) override
TimeoutThrottleFilter(uint32_t time_period)
optional< float > new_value(float value) override
ToNTCResistanceFilter(double a, double b, double c)
optional< float > new_value(float value) override
ToNTCTemperatureFilter(double a, double b, double c)
Base class for filters that compare sensor values against a fixed list of configured values.
bool value_matches_any_(float sensor_value)
Check if sensor value matches any configured value (with accuracy rounding)
const TemplatableFn< float > * values_
ValueListFilter(const TemplatableFn< float > *values)
void or_filter_initialize(Filter **filters, size_t count, Sensor *parent, Filter *phi)
Non-template helpers for OrFilter (implementation in filter.cpp)
std::function< optional< float >(float)> lambda_filter_t
optional< float > or_filter_new_value(Filter **filters, size_t count, float value, bool &has_value)
int8_t ilog10(float value)
Compute floor(log10(fabs(value))) using iterative comparison.
void init_array_from(std::array< T, N > &dest, std::initializer_list< T > src)
Initialize a std::array from an initializer_list.
float pow10_int(int8_t exp)
Compute 10^exp using iterative multiplication/division.