mirror of
https://github.com/esphome/esphome.git
synced 2024-12-23 16:47:57 +01:00
Thermostat delayed fan mode fix (#2158)
This commit is contained in:
parent
303b699005
commit
117b58ebe6
@ -57,29 +57,34 @@ void ThermostatClimate::refresh() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ThermostatClimate::climate_action_change_delayed() {
|
bool ThermostatClimate::climate_action_change_delayed() {
|
||||||
|
bool state_mismatch = this->action != this->compute_action_(true);
|
||||||
|
|
||||||
switch (this->compute_action_(true)) {
|
switch (this->compute_action_(true)) {
|
||||||
case climate::CLIMATE_ACTION_OFF:
|
case climate::CLIMATE_ACTION_OFF:
|
||||||
case climate::CLIMATE_ACTION_IDLE:
|
case climate::CLIMATE_ACTION_IDLE:
|
||||||
return !this->idle_action_ready_();
|
return state_mismatch && (!this->idle_action_ready_());
|
||||||
case climate::CLIMATE_ACTION_COOLING:
|
case climate::CLIMATE_ACTION_COOLING:
|
||||||
return !this->cooling_action_ready_();
|
return state_mismatch && (!this->cooling_action_ready_());
|
||||||
case climate::CLIMATE_ACTION_HEATING:
|
case climate::CLIMATE_ACTION_HEATING:
|
||||||
return !this->heating_action_ready_();
|
return state_mismatch && (!this->heating_action_ready_());
|
||||||
case climate::CLIMATE_ACTION_FAN:
|
case climate::CLIMATE_ACTION_FAN:
|
||||||
return !this->fanning_action_ready_();
|
return state_mismatch && (!this->fanning_action_ready_());
|
||||||
case climate::CLIMATE_ACTION_DRYING:
|
case climate::CLIMATE_ACTION_DRYING:
|
||||||
return !this->drying_action_ready_();
|
return state_mismatch && (!this->drying_action_ready_());
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ThermostatClimate::fan_mode_change_delayed() { return !this->fan_mode_ready_(); }
|
bool ThermostatClimate::fan_mode_change_delayed() {
|
||||||
|
bool state_mismatch = this->fan_mode.value_or(climate::CLIMATE_FAN_ON) != this->prev_fan_mode_;
|
||||||
|
return state_mismatch && (!this->fan_mode_ready_());
|
||||||
|
}
|
||||||
|
|
||||||
climate::ClimateAction ThermostatClimate::delayed_climate_action() { return this->compute_action_(true); }
|
climate::ClimateAction ThermostatClimate::delayed_climate_action() { return this->compute_action_(true); }
|
||||||
|
|
||||||
climate::ClimateFanMode ThermostatClimate::delayed_fan_mode() { return this->desired_fan_mode_; }
|
climate::ClimateFanMode ThermostatClimate::locked_fan_mode() { return this->prev_fan_mode_; }
|
||||||
|
|
||||||
bool ThermostatClimate::hysteresis_valid() {
|
bool ThermostatClimate::hysteresis_valid() {
|
||||||
if ((this->supports_cool_ || (this->supports_fan_only_ && this->supports_fan_only_cooling_)) &&
|
if ((this->supports_cool_ || (this->supports_fan_only_ && this->supports_fan_only_cooling_)) &&
|
||||||
@ -510,7 +515,7 @@ void ThermostatClimate::switch_to_fan_mode_(climate::ClimateFanMode fan_mode) {
|
|||||||
// already in target mode
|
// already in target mode
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this->desired_fan_mode_ = fan_mode; // needed for timer callback
|
this->fan_mode = fan_mode;
|
||||||
|
|
||||||
if (this->fan_mode_ready_()) {
|
if (this->fan_mode_ready_()) {
|
||||||
Trigger<> *trig = this->fan_mode_auto_trigger_;
|
Trigger<> *trig = this->fan_mode_auto_trigger_;
|
||||||
@ -564,7 +569,6 @@ void ThermostatClimate::switch_to_fan_mode_(climate::ClimateFanMode fan_mode) {
|
|||||||
this->start_timer_(thermostat::TIMER_FAN_MODE);
|
this->start_timer_(thermostat::TIMER_FAN_MODE);
|
||||||
assert(trig != nullptr);
|
assert(trig != nullptr);
|
||||||
trig->trigger();
|
trig->trigger();
|
||||||
this->fan_mode = fan_mode;
|
|
||||||
this->prev_fan_mode_ = fan_mode;
|
this->prev_fan_mode_ = fan_mode;
|
||||||
this->prev_fan_mode_trigger_ = trig;
|
this->prev_fan_mode_trigger_ = trig;
|
||||||
}
|
}
|
||||||
@ -733,7 +737,7 @@ void ThermostatClimate::cooling_on_timer_callback_() {
|
|||||||
void ThermostatClimate::fan_mode_timer_callback_() {
|
void ThermostatClimate::fan_mode_timer_callback_() {
|
||||||
ESP_LOGVV(TAG, "fan_mode timer expired");
|
ESP_LOGVV(TAG, "fan_mode timer expired");
|
||||||
this->timer_[thermostat::TIMER_FAN_MODE].active = false;
|
this->timer_[thermostat::TIMER_FAN_MODE].active = false;
|
||||||
this->switch_to_fan_mode_(this->desired_fan_mode_);
|
this->switch_to_fan_mode_(this->fan_mode.value_or(climate::CLIMATE_FAN_ON));
|
||||||
if (this->supports_fan_only_action_uses_fan_mode_timer_)
|
if (this->supports_fan_only_action_uses_fan_mode_timer_)
|
||||||
this->switch_to_action_(this->compute_action_());
|
this->switch_to_action_(this->compute_action_());
|
||||||
}
|
}
|
||||||
|
@ -136,8 +136,8 @@ class ThermostatClimate : public climate::Climate, public Component {
|
|||||||
bool fan_mode_change_delayed();
|
bool fan_mode_change_delayed();
|
||||||
/// Returns the climate action that is being delayed (check climate_action_change_delayed(), first!)
|
/// Returns the climate action that is being delayed (check climate_action_change_delayed(), first!)
|
||||||
climate::ClimateAction delayed_climate_action();
|
climate::ClimateAction delayed_climate_action();
|
||||||
/// Returns the fan mode that is being delayed (check fan_mode_change_delayed(), first!)
|
/// Returns the fan mode that is locked in (check fan_mode_change_delayed(), first!)
|
||||||
climate::ClimateFanMode delayed_fan_mode();
|
climate::ClimateFanMode locked_fan_mode();
|
||||||
/// Set point and hysteresis validation
|
/// Set point and hysteresis validation
|
||||||
bool hysteresis_valid(); // returns true if valid
|
bool hysteresis_valid(); // returns true if valid
|
||||||
void validate_target_temperature();
|
void validate_target_temperature();
|
||||||
@ -377,9 +377,6 @@ class ThermostatClimate : public climate::Climate, public Component {
|
|||||||
Trigger<> *prev_mode_trigger_{nullptr};
|
Trigger<> *prev_mode_trigger_{nullptr};
|
||||||
Trigger<> *prev_swing_mode_trigger_{nullptr};
|
Trigger<> *prev_swing_mode_trigger_{nullptr};
|
||||||
|
|
||||||
/// Desired fan_mode -- used to store desired mode for callback when switching is delayed
|
|
||||||
climate::ClimateFanMode desired_fan_mode_{climate::CLIMATE_FAN_ON};
|
|
||||||
|
|
||||||
/// Store previously-known states
|
/// Store previously-known states
|
||||||
///
|
///
|
||||||
/// These are used to determine when a trigger/action needs to be called
|
/// These are used to determine when a trigger/action needs to be called
|
||||||
|
Loading…
Reference in New Issue
Block a user