mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Thermostat delayed fan mode fix (#2158)
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user