[thermostat] Optimizations to reduce binary size (#12621)

This commit is contained in:
Keith Burzinski
2025-12-22 13:13:03 -06:00
committed by GitHub
parent 84b5d9b21c
commit cd45fe0c3a
2 changed files with 52 additions and 31 deletions

View File

@@ -3,8 +3,7 @@
#include "esphome/core/helpers.h"
#include "esphome/core/log.h"
namespace esphome {
namespace thermostat {
namespace esphome::thermostat {
static const char *const TAG = "thermostat.climate";
@@ -66,10 +65,12 @@ void ThermostatClimate::setup() {
}
void ThermostatClimate::loop() {
for (auto &timer : this->timer_) {
if (timer.active && (timer.started + timer.time < App.get_loop_component_start_time())) {
uint32_t now = App.get_loop_component_start_time();
for (uint8_t i = 0; i < THERMOSTAT_TIMER_COUNT; i++) {
auto &timer = this->timer_[i];
if (timer.active && (now - timer.started >= timer.time)) {
timer.active = false;
timer.func();
this->call_timer_callback_(static_cast<ThermostatClimateTimerIndex>(i));
}
}
}
@@ -916,8 +917,42 @@ uint32_t ThermostatClimate::timer_duration_(ThermostatClimateTimerIndex timer_in
return this->timer_[timer_index].time;
}
std::function<void()> ThermostatClimate::timer_cbf_(ThermostatClimateTimerIndex timer_index) {
return this->timer_[timer_index].func;
void ThermostatClimate::call_timer_callback_(ThermostatClimateTimerIndex timer_index) {
switch (timer_index) {
case THERMOSTAT_TIMER_COOLING_MAX_RUN_TIME:
this->cooling_max_run_time_timer_callback_();
break;
case THERMOSTAT_TIMER_COOLING_OFF:
this->cooling_off_timer_callback_();
break;
case THERMOSTAT_TIMER_COOLING_ON:
this->cooling_on_timer_callback_();
break;
case THERMOSTAT_TIMER_FAN_MODE:
this->fan_mode_timer_callback_();
break;
case THERMOSTAT_TIMER_FANNING_OFF:
this->fanning_off_timer_callback_();
break;
case THERMOSTAT_TIMER_FANNING_ON:
this->fanning_on_timer_callback_();
break;
case THERMOSTAT_TIMER_HEATING_MAX_RUN_TIME:
this->heating_max_run_time_timer_callback_();
break;
case THERMOSTAT_TIMER_HEATING_OFF:
this->heating_off_timer_callback_();
break;
case THERMOSTAT_TIMER_HEATING_ON:
this->heating_on_timer_callback_();
break;
case THERMOSTAT_TIMER_IDLE_ON:
this->idle_on_timer_callback_();
break;
case THERMOSTAT_TIMER_COUNT:
default:
break;
}
}
void ThermostatClimate::cooling_max_run_time_timer_callback_() {
@@ -1344,7 +1379,7 @@ void ThermostatClimate::set_timer_duration_in_sec_(ThermostatClimateTimerIndex t
ESP_LOGVV(TAG, "timer %d completing immediately (elapsed %d >= new %d)", timer_index, elapsed, new_duration_ms);
this->timer_[timer_index].active = false;
// Trigger the timer callback immediately
this->timer_[timer_index].func();
this->call_timer_callback_(timer_index);
return;
} else {
// Adjust timer to run for remaining time - keep original start time
@@ -1672,5 +1707,4 @@ ThermostatClimateTargetTempConfig::ThermostatClimateTargetTempConfig(float defau
float default_temperature_high)
: default_temperature_low(default_temperature_low), default_temperature_high(default_temperature_high) {}
} // namespace thermostat
} // namespace esphome
} // namespace esphome::thermostat

View File

@@ -10,8 +10,7 @@
#include <array>
#include <cinttypes>
namespace esphome {
namespace thermostat {
namespace esphome::thermostat {
enum HumidificationAction : uint8_t {
THERMOSTAT_HUMIDITY_CONTROL_ACTION_OFF = 0,
@@ -41,13 +40,11 @@ enum OnBootRestoreFrom : uint8_t {
struct ThermostatClimateTimer {
ThermostatClimateTimer() = default;
ThermostatClimateTimer(bool active, uint32_t time, uint32_t started, std::function<void()> func)
: active(active), time(time), started(started), func(std::move(func)) {}
ThermostatClimateTimer(bool active, uint32_t time, uint32_t started) : active(active), time(time), started(started) {}
bool active;
uint32_t time;
uint32_t started;
std::function<void()> func;
};
struct ThermostatClimateTargetTempConfig {
@@ -266,7 +263,8 @@ class ThermostatClimate : public climate::Climate, public Component {
bool cancel_timer_(ThermostatClimateTimerIndex timer_index);
bool timer_active_(ThermostatClimateTimerIndex timer_index);
uint32_t timer_duration_(ThermostatClimateTimerIndex timer_index);
std::function<void()> timer_cbf_(ThermostatClimateTimerIndex timer_index);
/// Call the appropriate timer callback based on timer index
void call_timer_callback_(ThermostatClimateTimerIndex timer_index);
/// Enhanced timer duration setter with running timer adjustment
void set_timer_duration_in_sec_(ThermostatClimateTimerIndex timer_index, uint32_t time);
@@ -534,27 +532,16 @@ class ThermostatClimate : public climate::Climate, public Component {
Trigger<> *prev_humidity_control_trigger_{nullptr};
/// Climate action timers
std::array<ThermostatClimateTimer, THERMOSTAT_TIMER_COUNT> timer_{
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::cooling_max_run_time_timer_callback_, this)),
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::cooling_off_timer_callback_, this)),
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::cooling_on_timer_callback_, this)),
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::fan_mode_timer_callback_, this)),
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::fanning_off_timer_callback_, this)),
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::fanning_on_timer_callback_, this)),
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::heating_max_run_time_timer_callback_, this)),
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::heating_off_timer_callback_, this)),
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::heating_on_timer_callback_, this)),
ThermostatClimateTimer(false, 0, 0, std::bind(&ThermostatClimate::idle_on_timer_callback_, this)),
};
std::array<ThermostatClimateTimer, THERMOSTAT_TIMER_COUNT> timer_{};
/// The set of standard preset configurations this thermostat supports (Eg. AWAY, ECO, etc)
FixedVector<PresetEntry> preset_config_{};
/// The set of custom preset configurations this thermostat supports (eg. "My Custom Preset")
FixedVector<CustomPresetEntry> custom_preset_config_{};
/// Default custom preset to use on start up (pointer to entry in custom_preset_config_)
private:
/// Default custom preset to use on start up (pointer to entry in custom_preset_config_)
const char *default_custom_preset_{nullptr};
};
} // namespace thermostat
} // namespace esphome
} // namespace esphome::thermostat