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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user