1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-25 13:13:48 +01:00

more filter cleanups

This commit is contained in:
J. Nick Koston
2025-10-20 19:13:12 -10:00
parent 1808d43fce
commit f7bcf87213
3 changed files with 80 additions and 12 deletions

View File

@@ -313,7 +313,7 @@ optional<float> DeltaFilter::new_value(float value) {
} }
// OrFilter // OrFilter
OrFilter::OrFilter(std::vector<Filter *> filters) : filters_(std::move(filters)), phi_(this) {} OrFilter::OrFilter(std::initializer_list<Filter *> filters) : filters_(filters), phi_(this) {}
OrFilter::PhiNode::PhiNode(OrFilter *or_parent) : or_parent_(or_parent) {} OrFilter::PhiNode::PhiNode(OrFilter *or_parent) : or_parent_(or_parent) {}
optional<float> OrFilter::PhiNode::new_value(float value) { optional<float> OrFilter::PhiNode::new_value(float value) {
@@ -326,14 +326,14 @@ optional<float> OrFilter::PhiNode::new_value(float value) {
} }
optional<float> OrFilter::new_value(float value) { optional<float> OrFilter::new_value(float value) {
this->has_value_ = false; this->has_value_ = false;
for (Filter *filter : this->filters_) for (auto *filter : this->filters_)
filter->input(value); filter->input(value);
return {}; return {};
} }
void OrFilter::initialize(Sensor *parent, Filter *next) { void OrFilter::initialize(Sensor *parent, Filter *next) {
Filter::initialize(parent, next); Filter::initialize(parent, next);
for (Filter *filter : this->filters_) { for (auto *filter : this->filters_) {
filter->initialize(parent, &this->phi_); filter->initialize(parent, &this->phi_);
} }
this->phi_.initialize(parent, nullptr); this->phi_.initialize(parent, nullptr);
@@ -386,18 +386,24 @@ void HeartbeatFilter::setup() {
} }
float HeartbeatFilter::get_setup_priority() const { return setup_priority::HARDWARE; } float HeartbeatFilter::get_setup_priority() const { return setup_priority::HARDWARE; }
CalibrateLinearFilter::CalibrateLinearFilter(std::initializer_list<std::array<float, 3>> linear_functions)
: linear_functions_(linear_functions) {}
optional<float> CalibrateLinearFilter::new_value(float value) { optional<float> CalibrateLinearFilter::new_value(float value) {
for (std::array<float, 3> f : this->linear_functions_) { for (const auto &f : this->linear_functions_) {
if (!std::isfinite(f[2]) || value < f[2]) if (!std::isfinite(f[2]) || value < f[2])
return (value * f[0]) + f[1]; return (value * f[0]) + f[1];
} }
return NAN; return NAN;
} }
CalibratePolynomialFilter::CalibratePolynomialFilter(std::initializer_list<float> coefficients)
: coefficients_(coefficients) {}
optional<float> CalibratePolynomialFilter::new_value(float value) { optional<float> CalibratePolynomialFilter::new_value(float value) {
float res = 0.0f; float res = 0.0f;
float x = 1.0f; float x = 1.0f;
for (float coefficient : this->coefficients_) { for (const auto &coefficient : this->coefficients_) {
res += x * coefficient; res += x * coefficient;
x *= value; x *= value;
} }

View File

@@ -422,7 +422,7 @@ class DeltaFilter : public Filter {
class OrFilter : public Filter { class OrFilter : public Filter {
public: public:
explicit OrFilter(std::vector<Filter *> filters); explicit OrFilter(std::initializer_list<Filter *> filters);
void initialize(Sensor *parent, Filter *next) override; void initialize(Sensor *parent, Filter *next) override;
@@ -438,28 +438,27 @@ class OrFilter : public Filter {
OrFilter *or_parent_; OrFilter *or_parent_;
}; };
std::vector<Filter *> filters_; FixedVector<Filter *> filters_;
PhiNode phi_; PhiNode phi_;
bool has_value_{false}; bool has_value_{false};
}; };
class CalibrateLinearFilter : public Filter { class CalibrateLinearFilter : public Filter {
public: public:
CalibrateLinearFilter(std::vector<std::array<float, 3>> linear_functions) explicit CalibrateLinearFilter(std::initializer_list<std::array<float, 3>> linear_functions);
: linear_functions_(std::move(linear_functions)) {}
optional<float> new_value(float value) override; optional<float> new_value(float value) override;
protected: protected:
std::vector<std::array<float, 3>> linear_functions_; FixedVector<std::array<float, 3>> linear_functions_;
}; };
class CalibratePolynomialFilter : public Filter { class CalibratePolynomialFilter : public Filter {
public: public:
CalibratePolynomialFilter(std::vector<float> coefficients) : coefficients_(std::move(coefficients)) {} explicit CalibratePolynomialFilter(std::initializer_list<float> coefficients);
optional<float> new_value(float value) override; optional<float> new_value(float value) override;
protected: protected:
std::vector<float> coefficients_; FixedVector<float> coefficients_;
}; };
class ClampFilter : public Filter { class ClampFilter : public Filter {

View File

@@ -173,3 +173,66 @@ sensor:
timeout: 1000ms timeout: 1000ms
value: [42.0] value: [42.0]
- multiply: 2.0 - multiply: 2.0
# CalibrateLinearFilter - piecewise linear calibration
- platform: copy
source_id: source_sensor
name: "Calibrate Linear Two Points"
filters:
- calibrate_linear:
- 0.0 -> 0.0
- 100.0 -> 100.0
- platform: copy
source_id: source_sensor
name: "Calibrate Linear Multiple Segments"
filters:
- calibrate_linear:
- 0.0 -> 0.0
- 50.0 -> 55.0
- 100.0 -> 102.5
- platform: copy
source_id: source_sensor
name: "Calibrate Linear Least Squares"
filters:
- calibrate_linear:
method: least_squares
datapoints:
- 0.0 -> 0.0
- 50.0 -> 55.0
- 100.0 -> 102.5
# CalibratePolynomialFilter - polynomial calibration
- platform: copy
source_id: source_sensor
name: "Calibrate Polynomial Degree 2"
filters:
- calibrate_polynomial:
degree: 2
datapoints:
- 0.0 -> 0.0
- 50.0 -> 55.0
- 100.0 -> 102.5
- platform: copy
source_id: source_sensor
name: "Calibrate Polynomial Degree 3"
filters:
- calibrate_polynomial:
degree: 3
datapoints:
- 0.0 -> 0.0
- 25.0 -> 26.0
- 50.0 -> 55.0
- 100.0 -> 102.5
# OrFilter - filter branching
- platform: copy
source_id: source_sensor
name: "Or Filter with Multiple Branches"
filters:
- or:
- multiply: 2.0
- offset: 10.0
- lambda: return x * 3.0;