ESPHome 2026.10.0-dev
Loading...
Searching...
No Matches
thermostat_climate.h
Go to the documentation of this file.
1#pragma once
2
5#include "esphome/core/hal.h"
9
10#include <array>
11#include <cinttypes>
12
13namespace esphome::thermostat {
14
21
35
36enum OnBootRestoreFrom : uint8_t {
37 MEMORY = 0,
39};
40
49
71
77
83
84class ThermostatClimate final : public climate::Climate, public Component {
85 public:
88
90 void setup() override;
91 void dump_config() override;
92 void loop() override;
93
94 void set_default_preset(const char *custom_preset);
97 this->on_boot_restore_from_ = on_boot_restore_from;
98 }
99 void set_set_point_minimum_differential(float differential) { this->set_point_minimum_differential_ = differential; }
100 void set_cool_deadband(float deadband) { this->cooling_deadband_ = deadband; }
101 void set_cool_overrun(float overrun) { this->cooling_overrun_ = overrun; }
102 void set_heat_deadband(float deadband) { this->heating_deadband_ = deadband; }
103 void set_heat_overrun(float overrun) { this->heating_overrun_ = overrun; }
104 void set_supplemental_cool_delta(float delta) { this->supplemental_cool_delta_ = delta; }
105 void set_supplemental_heat_delta(float delta) { this->supplemental_heat_delta_ = delta; }
116 void set_sensor(sensor::Sensor *sensor) { this->sensor_ = sensor; }
117 void set_humidity_sensor(sensor::Sensor *humidity_sensor) { this->humidity_sensor_ = humidity_sensor; }
118 void set_humidity_hysteresis(float humidity_hysteresis);
119 void set_use_startup_delay(bool use_startup_delay) { this->use_startup_delay_ = use_startup_delay; }
120 void set_supports_auto(bool supports_auto) { this->supports_auto_ = supports_auto; }
121 void set_supports_heat_cool(bool supports_heat_cool) { this->supports_heat_cool_ = supports_heat_cool; }
122 void set_supports_cool(bool supports_cool) { this->supports_cool_ = supports_cool; }
123 void set_supports_dry(bool supports_dry) { this->supports_dry_ = supports_dry; }
124 void set_supports_fan_only(bool supports_fan_only) { this->supports_fan_only_ = supports_fan_only; }
125 void set_supports_fan_only_action_uses_fan_mode_timer(bool supports_fan_only_action_uses_fan_mode_timer) {
126 this->supports_fan_only_action_uses_fan_mode_timer_ = supports_fan_only_action_uses_fan_mode_timer;
127 }
128 void set_supports_fan_only_cooling(bool supports_fan_only_cooling) {
129 this->supports_fan_only_cooling_ = supports_fan_only_cooling;
130 }
131 void set_supports_fan_with_cooling(bool supports_fan_with_cooling) {
132 this->supports_fan_with_cooling_ = supports_fan_with_cooling;
133 }
134 void set_supports_fan_with_heating(bool supports_fan_with_heating) {
135 this->supports_fan_with_heating_ = supports_fan_with_heating;
136 }
137 void set_supports_heat(bool supports_heat) { this->supports_heat_ = supports_heat; }
138 void set_supports_fan_mode_on(bool supports_fan_mode_on) { this->supports_fan_mode_on_ = supports_fan_mode_on; }
139 void set_supports_fan_mode_off(bool supports_fan_mode_off) { this->supports_fan_mode_off_ = supports_fan_mode_off; }
140 void set_supports_fan_mode_auto(bool supports_fan_mode_auto) {
141 this->supports_fan_mode_auto_ = supports_fan_mode_auto;
142 }
143 void set_supports_fan_mode_low(bool supports_fan_mode_low) { this->supports_fan_mode_low_ = supports_fan_mode_low; }
144 void set_supports_fan_mode_medium(bool supports_fan_mode_medium) {
145 this->supports_fan_mode_medium_ = supports_fan_mode_medium;
146 }
147 void set_supports_fan_mode_high(bool supports_fan_mode_high) {
148 this->supports_fan_mode_high_ = supports_fan_mode_high;
149 }
150 void set_supports_fan_mode_middle(bool supports_fan_mode_middle) {
151 this->supports_fan_mode_middle_ = supports_fan_mode_middle;
152 }
153 void set_supports_fan_mode_focus(bool supports_fan_mode_focus) {
154 this->supports_fan_mode_focus_ = supports_fan_mode_focus;
155 }
156 void set_supports_fan_mode_diffuse(bool supports_fan_mode_diffuse) {
157 this->supports_fan_mode_diffuse_ = supports_fan_mode_diffuse;
158 }
159 void set_supports_fan_mode_quiet(bool supports_fan_mode_quiet) {
160 this->supports_fan_mode_quiet_ = supports_fan_mode_quiet;
161 }
162 void set_supports_swing_mode_both(bool supports_swing_mode_both) {
163 this->supports_swing_mode_both_ = supports_swing_mode_both;
164 }
165 void set_supports_swing_mode_horizontal(bool supports_swing_mode_horizontal) {
166 this->supports_swing_mode_horizontal_ = supports_swing_mode_horizontal;
167 }
168 void set_supports_swing_mode_off(bool supports_swing_mode_off) {
169 this->supports_swing_mode_off_ = supports_swing_mode_off;
170 }
171 void set_supports_swing_mode_vertical(bool supports_swing_mode_vertical) {
172 this->supports_swing_mode_vertical_ = supports_swing_mode_vertical;
173 }
174 void set_supports_dehumidification(bool supports_dehumidification);
175 void set_supports_humidification(bool supports_humidification);
176 void set_supports_two_points(bool supports_two_points) { this->supports_two_points_ = supports_two_points; }
177
178 void set_preset_config(std::initializer_list<PresetEntry> presets) { this->preset_config_ = presets; }
179 void set_custom_preset_config(std::initializer_list<CustomPresetEntry> presets);
180
216 float cool_deadband() { return this->cooling_deadband_; }
217 float cool_overrun() { return this->cooling_overrun_; }
218 float heat_deadband() { return this->heating_deadband_; }
219 float heat_overrun() { return this->heating_overrun_; }
221 void refresh();
230 bool hysteresis_valid(); // returns true if valid
231 bool humidity_hysteresis_valid(); // returns true if valid
232 bool limit_setpoints_for_heat_cool(); // returns true if set points should be further limited within visual range
234 void validate_target_temperatures(bool pin_target_temperature_high);
238
241
242 protected:
244 void control(const climate::ClimateCall &call) override;
245
250 this->change_custom_preset_(custom_preset, strlen(custom_preset));
251 }
252 void change_custom_preset_(const char *custom_preset, size_t len);
256
261
264
266 climate::ClimateAction compute_action_(bool ignore_timers = false);
269
275
278
281
284
287
290
292 bool idle_action_ready_();
295 bool fan_mode_ready_();
298
308
320
322 bool cooling_required_();
323 bool fanning_required_();
324 bool heating_required_();
329
330 void dump_preset_config_(const char *preset_name, const ThermostatClimateTargetTempConfig &config);
331
333 const uint8_t min_timer_duration_{1};
334
341
344
347
351
356 bool supports_auto_{false};
358 bool supports_cool_{false};
359 bool supports_dry_{false};
361 bool supports_heat_{false};
369
376
382
393
401
406
412
416
419
421 bool setup_complete_{false};
422
430
433
439
442
446
451
456
460
465
468
471
475
479
491
497
500
503
506
511
521
523 std::array<ThermostatClimateTimer, THERMOSTAT_TIMER_COUNT> timer_{};
524
529
530 private:
532 const char *default_custom_preset_{nullptr};
533};
534
535} // namespace esphome::thermostat
BedjetMode mode
BedJet operating mode.
Fixed-capacity vector - allocates once at runtime, never reallocates This avoids std::vector template...
Definition helpers.h:545
StringRef is a reference to a string owned by something else.
Definition string_ref.h:26
constexpr const char * c_str() const
Definition string_ref.h:73
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
ClimateMode mode
The active mode of the climate device.
Definition climate.h:304
optional< ClimateFanMode > fan_mode
The active fan mode of the climate device.
Definition climate.h:298
ClimateSwingMode swing_mode
The active swing mode of the climate device.
Definition climate.h:310
ClimateAction action
The active state of the climate device.
Definition climate.h:307
void publish_state()
Publish the state of the climate device, to be called from integrations.
Definition climate.cpp:437
optional< ClimatePreset > preset
The active preset of the climate device.
Definition climate.h:301
Base-class for all sensors.
Definition sensor.h:47
void set_supports_humidification(bool supports_humidification)
void set_supports_swing_mode_horizontal(bool supports_swing_mode_horizontal)
void switch_to_action_(climate::ClimateAction action, bool publish_state=true)
Switch the climate device to the given climate action.
void change_custom_preset_(StringRef custom_preset)
void set_custom_preset_config(std::initializer_list< CustomPresetEntry > presets)
void set_supports_fan_mode_on(bool supports_fan_mode_on)
FixedVector< CustomPresetEntry > custom_preset_config_
The set of custom preset configurations this thermostat supports (eg. "My Custom Preset")
float cooling_deadband_
Hysteresis values used for computing climate actions.
void control(const climate::ClimateCall &call) override
Override control to change settings of the climate device.
void validate_target_temperatures(bool pin_target_temperature_high)
HumidificationAction humidification_action
The current humidification action.
void set_timer_duration_in_sec_(ThermostatClimateTimerIndex timer_index, uint32_t time)
Enhanced timer duration setter with running timer adjustment.
void set_supports_fan_only_action_uses_fan_mode_timer(bool supports_fan_only_action_uses_fan_mode_timer)
bool use_startup_delay_
Used to start "off" delay timers at boot.
Trigger temperature_change_trigger_
Trigger for target temperature changes.
float cool_deadband()
Get current hysteresis values.
bool climate_action_change_delayed()
Returns true if a climate action/fan mode transition is being delayed.
void set_supports_fan_with_heating(bool supports_fan_with_heating)
bool cooling_max_runtime_exceeded_
Flags indicating if maximum allowable run time was exceeded.
const uint8_t min_timer_duration_
Minimum allowable duration in seconds for action timers.
OnBootRestoreFrom on_boot_restore_from_
If set to DEFAULT_PRESET then the default preset is always used.
void change_custom_preset_(const char *custom_preset)
Change to a provided custom preset setting; will reset temperature, mode, fan, and swing modes accord...
void set_supports_two_points(bool supports_two_points)
void set_preset_config(std::initializer_list< PresetEntry > presets)
void set_supports_fan_only_cooling(bool supports_fan_only_cooling)
bool supports_dehumidification_
Whether the controller supports dehumidification and/or humidification.
bool supports_fan_mode_on_
Whether the controller supports turning on or off just the fan.
float set_point_minimum_differential_
Minimum differential required between set points.
bool supports_fan_with_cooling_
Special flags – enables fan_only action to be called with cooling/heating actions.
void set_supports_fan_mode_diffuse(bool supports_fan_mode_diffuse)
void switch_to_swing_mode_(climate::ClimateSwingMode swing_mode, bool publish_state=true)
Switch the climate device to the given climate swing mode.
bool change_preset_internal_(const ThermostatClimateTargetTempConfig &config)
Applies the temperature, mode, fan, and swing modes of the provided config.
void set_supports_dehumidification(bool supports_dehumidification)
bool hysteresis_valid()
Set point and hysteresis validation.
float humidity_hysteresis_
Hysteresis values used for computing humidification action.
void set_supports_fan_mode_auto(bool supports_fan_mode_auto)
Trigger cool_action_trigger_
Trigger for cooling action/mode.
float prev_target_humidity_
Store previously-known humidity and temperatures.
void check_humidity_change_trigger_()
Check if the humidity change trigger should be called.
void switch_to_supplemental_action_(climate::ClimateAction action)
void switch_to_mode_(climate::ClimateMode mode, bool publish_state=true)
Switch the climate device to the given climate mode.
void set_supports_swing_mode_vertical(bool supports_swing_mode_vertical)
void set_supports_fan_only(bool supports_fan_only)
void set_sensor(sensor::Sensor *sensor)
bool supports_fan_only_action_uses_fan_mode_timer_
Special flag – enables fan_modes to share timer with fan_only climate action.
void switch_to_humidity_control_action_(HumidificationAction action)
void set_supports_swing_mode_off(bool supports_swing_mode_off)
void switch_to_fan_mode_(climate::ClimateFanMode fan_mode, bool publish_state=true)
Switch the climate device to the given climate fan mode.
void dump_preset_config_(const char *preset_name, const ThermostatClimateTargetTempConfig &config)
bool supports_swing_mode_both_
Whether the controller supports various swing modes.
climate::ClimateTraits traits() override
Return the traits of this controller.
climate::ClimateFanMode locked_fan_mode()
Returns the fan mode that is locked in (check fan_mode_change_delayed(), first!)
void set_humidity_sensor(sensor::Sensor *humidity_sensor)
Trigger humidity_change_trigger_
Trigger for target humidity changes.
void set_supports_fan_mode_middle(bool supports_fan_mode_middle)
void set_supports_fan_mode_low(bool supports_fan_mode_low)
bool timer_active_(ThermostatClimateTimerIndex timer_index)
float supplemental_cool_delta_
Maximum allowable temperature deltas before engaging supplemental cooling/heating actions.
void set_supports_heat_cool(bool supports_heat_cool)
void set_supports_fan_mode_quiet(bool supports_fan_mode_quiet)
climate::ClimateAction delayed_climate_action()
Returns the climate action that is being delayed (check climate_action_change_delayed(),...
sensor::Sensor * sensor_
The sensor used for getting the current temperature.
void set_default_preset(const char *custom_preset)
void call_timer_callback_(ThermostatClimateTimerIndex timer_index)
Call the appropriate timer callback based on timer index.
void set_supports_fan_mode_medium(bool supports_fan_mode_medium)
Trigger idle_action_trigger_
Trigger for idle action/off mode.
void set_on_boot_restore_from(thermostat::OnBootRestoreFrom on_boot_restore_from)
uint32_t timer_duration_(ThermostatClimateTimerIndex timer_index)
Trigger humidity_control_dehumidify_action_trigger_
Humidity control triggers.
Trigger fan_only_action_trigger_
Trigger for fan-only action/mode.
void set_supports_swing_mode_both(bool supports_swing_mode_both)
void start_timer_(ThermostatClimateTimerIndex timer_index)
Start/cancel/get status of climate action timer.
void set_set_point_minimum_differential(float differential)
bool supports_fan_mode_low_
Whether the controller supports various fan speeds and/or positions.
bool supports_fan_only_cooling_
Special flag – enables fan to be switched based on target_temperature_high.
Trigger * prev_action_trigger_
A reference to the trigger that was previously active.
bool supports_auto_
Whether the controller supports auto/cooling/drying/fanning/heating.
Trigger swing_mode_both_trigger_
Swing mode triggers.
climate::ClimateAction supplemental_action_
The current supplemental action.
std::array< ThermostatClimateTimer, THERMOSTAT_TIMER_COUNT > timer_
Climate action timers.
void set_fan_mode_minimum_switching_time_in_sec(uint32_t time)
Trigger heat_cool_mode_trigger_
Trigger for heat/cool mode.
void set_supports_fan_with_cooling(bool supports_fan_with_cooling)
void set_supports_fan_mode_focus(bool supports_fan_mode_focus)
Trigger preset_change_trigger_
Trigger for preset mode changes.
void check_temperature_change_trigger_()
Check if the temperature change trigger should be called.
HumidificationAction compute_humidity_control_action_()
void set_supports_fan_mode_off(bool supports_fan_mode_off)
FixedVector< PresetEntry > preset_config_
The set of standard preset configurations this thermostat supports (Eg. AWAY, ECO,...
climate::ClimateFanMode prev_fan_mode_
Store previously-known states.
void set_use_startup_delay(bool use_startup_delay)
void set_humidity_hysteresis(float humidity_hysteresis)
bool cancel_timer_(ThermostatClimateTimerIndex timer_index)
climate::ClimateAction compute_supplemental_action_()
climate::ClimatePreset default_preset_
Default standard preset to use on start up.
sensor::Sensor * humidity_sensor_
The sensor used for getting the current humidity.
void cooling_max_run_time_timer_callback_()
set_timeout() callbacks for various actions (see above)
bool supports_fan_mode_auto_
Whether the controller supports fan auto mode.
Trigger fan_mode_on_trigger_
Fan mode triggers.
climate::ClimateAction compute_action_(bool ignore_timers=false)
Re-compute the required action of this climate controller.
bool supports_two_points_
Whether the controller supports two set points.
bool setup_complete_
setup_complete_ blocks modifying/resetting the temps immediately after boot
void set_supports_fan_mode_high(bool supports_fan_mode_high)
Trigger auto_mode_trigger_
Trigger for auto mode.
bool idle_action_ready_()
Is the action ready to be called? Returns true if so.
Trigger dry_action_trigger_
Trigger for dry (dehumidification) mode.
void change_preset_(climate::ClimatePreset preset)
Change to a provided preset setting; will reset temperature, mode, fan, and swing modes accordingly.
void refresh()
Call triggers based on updated climate states (modes/actions)
Trigger heat_action_trigger_
Trigger for heating action/mode.
bool cooling_required_()
Check if cooling/fanning/heating actions are required; returns true if so.
ClimateSwingMode swing_mode
Definition climate.h:11
uint8_t custom_preset
Definition climate.h:9
ClimateFanMode fan_mode
Definition climate.h:3
ClimatePreset
Enum for all preset modes NOTE: If adding values, update ClimatePresetMask in climate_traits....
ClimateSwingMode
Enum for all modes a climate swing can be in NOTE: If adding values, update ClimateSwingModeMask in c...
@ CLIMATE_SWING_OFF
The swing mode is set to Off.
ClimateMode
Enum for all modes a climate device can be in.
@ CLIMATE_MODE_OFF
The climate device is off.
ClimateAction
Enum for the current action of the climate device. Values match those of ClimateMode.
@ CLIMATE_ACTION_OFF
The climate device is off (inactive or no power)
ClimateFanMode
NOTE: If adding values, update ClimateFanModeMask in climate_traits.h to use the new last value.
@ CLIMATE_FAN_ON
The fan mode is set to On.
const void size_t len
Definition hal.h:64
static void uint32_t
void set_swing_mode(climate::ClimateSwingMode swing_mode)
optional< climate::ClimateSwingMode > swing_mode_
void set_fan_mode(climate::ClimateFanMode fan_mode)
ThermostatClimateTimer(bool active, uint32_t time, uint32_t started)
Entry for custom preset lookup.
const char * name
ThermostatClimateTargetTempConfig config
Entry for standard preset lookup.
ThermostatClimateTargetTempConfig config
climate::ClimatePreset preset