ESPHome 2026.5.0-dev
Loading...
Searching...
No Matches
pid_climate.h
Go to the documentation of this file.
1#pragma once
2
9#include "pid_controller.h"
10#include "pid_autotuner.h"
11
12namespace esphome {
13namespace pid {
14
15class PIDClimate : public climate::Climate, public Component {
16 public:
17 PIDClimate() = default;
18 void setup() override;
19 void dump_config() override;
20
21 void set_sensor(sensor::Sensor *sensor) { sensor_ = sensor; }
23 void set_cool_output(output::FloatOutput *cool_output) { cool_output_ = cool_output; }
24 void set_heat_output(output::FloatOutput *heat_output) { heat_output_ = heat_output; }
25 void set_kp(float kp) { controller_.kp_ = kp; }
26 void set_ki(float ki) { controller_.ki_ = ki; }
27 void set_kd(float kd) { controller_.kd_ = kd; }
28 void set_min_integral(float min_integral) { controller_.min_integral_ = min_integral; }
29 void set_max_integral(float max_integral) { controller_.max_integral_ = max_integral; }
30 void set_output_samples(int in) { controller_.output_samples_ = in; }
32 controller_.derivative_samples_ = in;
33 if (in > 1) // No allocation needed when samples=1 (ring_buffer_average_ short-circuits)
34 controller_.derivative_window_.init(in);
35 }
36
37 void set_threshold_low(float in) { controller_.threshold_low_ = in; }
38 void set_threshold_high(float in) { controller_.threshold_high_ = in; }
39 void set_kp_multiplier(float in) { controller_.kp_multiplier_ = in; }
40 void set_ki_multiplier(float in) { controller_.ki_multiplier_ = in; }
41 void set_kd_multiplier(float in) { controller_.kd_multiplier_ = in; }
43
44 void set_deadband_output_samples(int in) { controller_.deadband_output_samples_ = in; }
46 if (size > 1) // No allocation needed when samples=1 (ring_buffer_average_ short-circuits)
47 controller_.output_window_.init(size);
48 }
49
50 float get_output_value() const { return output_value_; }
51 float get_error_value() const { return controller_.error_; }
52 float get_kp() { return controller_.kp_; }
53 float get_ki() { return controller_.ki_; }
54 float get_kd() { return controller_.kd_; }
55 float get_min_integral() { return controller_.min_integral_; }
56 float get_max_integral() { return controller_.max_integral_; }
57 float get_proportional_term() const { return controller_.proportional_term_; }
58 float get_integral_term() const { return controller_.integral_term_; }
59 float get_derivative_term() const { return controller_.derivative_term_; }
60 int get_output_samples() { return controller_.output_samples_; }
61 int get_derivative_samples() { return controller_.derivative_samples_; }
62
63 float get_threshold_low() { return controller_.threshold_low_; }
64 float get_threshold_high() { return controller_.threshold_high_; }
65 float get_kp_multiplier() { return controller_.kp_multiplier_; }
66 float get_ki_multiplier() { return controller_.ki_multiplier_; }
67 float get_kd_multiplier() { return controller_.kd_multiplier_; }
68 int get_deadband_output_samples() { return controller_.deadband_output_samples_; }
69 bool in_deadband() { return controller_.in_deadband(); }
70
71 // int get_derivative_samples() const { return controller_.derivative_samples; }
72 // float get_deadband() const { return controller_.deadband; }
73 // float get_proportional_deadband_multiplier() const { return controller_.proportional_deadband_multiplier; }
74
75 template<typename F> void add_on_pid_computed_callback(F &&callback) {
76 this->pid_computed_callback_.add(std::forward<F>(callback));
77 }
78 void set_default_target_temperature(float default_target_temperature) {
79 default_target_temperature_ = default_target_temperature;
80 }
81 void start_autotune(std::unique_ptr<PIDAutotuner> &&autotune);
83
84 protected:
86 void control(const climate::ClimateCall &call) override;
89
90 void update_pid_();
91
92 bool supports_cool_() const { return this->cool_output_ != nullptr; }
93 bool supports_heat_() const { return this->heat_output_ != nullptr; }
94
95 void write_output_(float value);
96
108 std::unique_ptr<PIDAutotuner> autotuner_;
109 bool do_publish_ = false;
110};
111
112template<typename... Ts> class PIDAutotuneAction : public Action<Ts...> {
113 public:
115
116 void set_noiseband(float noiseband) { noiseband_ = noiseband; }
117 void set_positive_output(float positive_output) { positive_output_ = positive_output; }
118 void set_negative_output(float negative_output) { negative_output_ = negative_output; }
119
120 void play(const Ts &...x) {
121 auto tuner = make_unique<PIDAutotuner>();
122 tuner->set_noiseband(this->noiseband_);
123 tuner->set_output_negative(this->negative_output_);
124 tuner->set_output_positive(this->positive_output_);
125 this->parent_->start_autotune(std::move(tuner));
126 }
127
128 protected:
133};
134
135template<typename... Ts> class PIDResetIntegralTermAction : public Action<Ts...> {
136 public:
138
139 void play(const Ts &...x) { this->parent_->reset_integral_term(); }
140
141 protected:
143};
144
145template<typename... Ts> class PIDSetControlParametersAction : public Action<Ts...> {
146 public:
147 PIDSetControlParametersAction(PIDClimate *parent) : parent_(parent) {}
148
149 void play(const Ts &...x) {
150 auto kp = this->kp_.value(x...);
151 auto ki = this->ki_.value(x...);
152 auto kd = this->kd_.value(x...);
153
154 this->parent_->set_kp(kp);
155 this->parent_->set_ki(ki);
156 this->parent_->set_kd(kd);
157 }
158
159 protected:
161 TEMPLATABLE_VALUE(float, ki)
163
164 PIDClimate *parent_;
165};
166
167} // namespace pid
168} // namespace esphome
void init(index_type capacity)
Allocate capacity - can only be called once.
Definition helpers.h:433
This class is used to encode all control actions on a climate device.
Definition climate.h:34
ClimateDevice - This is the base class for all climate integrations.
Definition climate.h:187
Base class for all output components that can output a variable level, like PWM.
void set_noiseband(float noiseband)
void set_negative_output(float negative_output)
void play(const Ts &...x)
PIDAutotuneAction(PIDClimate *parent)
void set_positive_output(float positive_output)
void set_ki(float ki)
Definition pid_climate.h:26
void set_humidity_sensor(sensor::Sensor *sensor)
Definition pid_climate.h:22
void set_kp(float kp)
Definition pid_climate.h:25
void set_kp_multiplier(float in)
Definition pid_climate.h:39
void add_on_pid_computed_callback(F &&callback)
Definition pid_climate.h:75
void start_autotune(std::unique_ptr< PIDAutotuner > &&autotune)
PIDController controller_
output::FloatOutput * cool_output_
sensor::Sensor * sensor_
The sensor used for getting the current temperature.
Definition pid_climate.h:98
void set_threshold_high(float in)
Definition pid_climate.h:38
void set_min_integral(float min_integral)
Definition pid_climate.h:28
float get_proportional_term() const
Definition pid_climate.h:57
void dump_config() override
bool supports_cool_() const
Definition pid_climate.h:92
void write_output_(float value)
void set_sensor(sensor::Sensor *sensor)
Definition pid_climate.h:21
void setup() override
void set_default_target_temperature(float default_target_temperature)
Definition pid_climate.h:78
void set_derivative_samples(int in)
Definition pid_climate.h:31
void set_heat_output(output::FloatOutput *heat_output)
Definition pid_climate.h:24
std::unique_ptr< PIDAutotuner > autotuner_
void set_max_integral(float max_integral)
Definition pid_climate.h:29
void set_output_samples(int in)
Definition pid_climate.h:30
float get_error_value() const
Definition pid_climate.h:51
float get_derivative_term() const
Definition pid_climate.h:59
void control(const climate::ClimateCall &call) override
Override control to change settings of the climate device.
void set_deadband_output_samples(int in)
Definition pid_climate.h:44
float get_integral_term() const
Definition pid_climate.h:58
CallbackManager< void()> pid_computed_callback_
float output_value_
Output value as reported by the PID controller, for PIDClimateSensor.
void init_output_buffer(int size)
Definition pid_climate.h:45
sensor::Sensor * humidity_sensor_
The sensor used for getting the current humidity.
climate::ClimateTraits traits() override
Return the traits of this controller.
void set_kd(float kd)
Definition pid_climate.h:27
void set_cool_output(output::FloatOutput *cool_output)
Definition pid_climate.h:23
void set_starting_integral_term(float in)
Definition pid_climate.h:42
bool supports_heat_() const
Definition pid_climate.h:93
void set_threshold_low(float in)
Definition pid_climate.h:37
float get_output_value() const
Definition pid_climate.h:50
void set_ki_multiplier(float in)
Definition pid_climate.h:40
output::FloatOutput * heat_output_
void set_kd_multiplier(float in)
Definition pid_climate.h:41
PIDResetIntegralTermAction(PIDClimate *parent)
TEMPLATABLE_VALUE(float, kp) TEMPLATABLE_VALUE(float
Base-class for all sensors.
Definition sensor.h:47
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
uint16_t size
Definition helpers.cpp:25
void set_starting_integral_term(float in)
uint16_t x
Definition tt21100.cpp:5