[sensor] Use std::array in CalibratePolynomialFilter

This commit is contained in:
J. Nick Koston
2026-03-27 13:32:13 -10:00
parent a075f63b59
commit 7137f615e2
3 changed files with 22 additions and 11 deletions
+1 -1
View File
@@ -822,7 +822,7 @@ async def calibrate_polynomial_filter_to_code(config, filter_id):
# Column vector
b = [[v] for v in y]
res = [v[0] for v in _lstsq(a, b)]
return cg.new_Pvariable(filter_id, res)
return cg.new_Pvariable(filter_id, cg.TemplateArguments(len(res)), res)
def validate_clamp(config):
+3 -6
View File
@@ -424,14 +424,11 @@ optional<float> CalibrateLinearFilter::new_value(float value) {
return NAN;
}
CalibratePolynomialFilter::CalibratePolynomialFilter(std::initializer_list<float> coefficients)
: coefficients_(coefficients) {}
optional<float> CalibratePolynomialFilter::new_value(float value) {
optional<float> calibrate_polynomial_compute(const float *coefficients, size_t count, float value) {
float res = 0.0f;
float x = 1.0f;
for (const auto &coefficient : this->coefficients_) {
res += x * coefficient;
for (size_t i = 0; i < count; i++) {
res += x * coefficients[i];
x *= value;
}
return res;
+18 -4
View File
@@ -3,6 +3,7 @@
#include "esphome/core/defines.h"
#ifdef USE_SENSOR_FILTER
#include <array>
#include <utility>
#include <vector>
#include "esphome/core/automation.h"
@@ -498,13 +499,26 @@ class CalibrateLinearFilter : public Filter {
FixedVector<std::array<float, 3>> linear_functions_;
};
class CalibratePolynomialFilter : public Filter {
/// Non-template helper for polynomial calibration (implementation in filter.cpp)
optional<float> calibrate_polynomial_compute(const float *coefficients, size_t count, float value);
/// N is set by code generation to match the exact number of polynomial coefficients.
template<size_t N> class CalibratePolynomialFilter : public Filter {
public:
explicit CalibratePolynomialFilter(std::initializer_list<float> coefficients);
optional<float> new_value(float value) override;
explicit CalibratePolynomialFilter(std::initializer_list<float> coefficients) {
size_t i = 0;
for (float c : coefficients) {
if (i >= N)
break;
this->coefficients_[i++] = c;
}
}
optional<float> new_value(float value) override {
return calibrate_polynomial_compute(this->coefficients_.data(), N, value);
}
protected:
FixedVector<float> coefficients_;
std::array<float, N> coefficients_{};
};
class ClampFilter : public Filter {