From 3fd616ad6f8476bca43d8d7c8f0cfad59ecb2157 Mon Sep 17 00:00:00 2001 From: Naoki Sawada Date: Tue, 8 Sep 2020 17:48:49 +0900 Subject: [PATCH] fix mode discrepancies when using IR control Fixed a problem that the mode is returned to the original mode when the temperature is changed with HA after changing the mode with the infrared remote controller. --- espmhp.cpp | 67 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/espmhp.cpp b/espmhp.cpp index e3a217d..9ad97ae 100644 --- a/espmhp.cpp +++ b/espmhp.cpp @@ -104,60 +104,73 @@ void MitsubishiHeatPump::control(const climate::ClimateCall &call) { ESP_LOGV(TAG, "Control called."); bool updated = false; + bool has_mode = call.get_mode().has_value(); bool has_temp = call.get_target_temperature().has_value(); - if (call.get_mode().has_value()){ + if (has_mode){ this->mode = *call.get_mode(); - switch (*call.get_mode()) { - case climate::CLIMATE_MODE_COOL: - hp->setModeSetting("COOL"); - hp->setPowerSetting("ON"); + } + switch (this->mode) { + case climate::CLIMATE_MODE_COOL: + hp->setModeSetting("COOL"); + hp->setPowerSetting("ON"); + if (has_mode){ if (cool_setpoint.has_value() && !has_temp) { hp->setTemperature(cool_setpoint.value()); this->target_temperature = cool_setpoint.value(); } this->action = climate::CLIMATE_ACTION_IDLE; updated = true; - break; - case climate::CLIMATE_MODE_HEAT: - hp->setModeSetting("HEAT"); - hp->setPowerSetting("ON"); + } + break; + case climate::CLIMATE_MODE_HEAT: + hp->setModeSetting("HEAT"); + hp->setPowerSetting("ON"); + if (has_mode){ if (heat_setpoint.has_value() && !has_temp) { hp->setTemperature(heat_setpoint.value()); this->target_temperature = heat_setpoint.value(); } this->action = climate::CLIMATE_ACTION_IDLE; updated = true; - break; - case climate::CLIMATE_MODE_DRY: - hp->setModeSetting("DRY"); - hp->setPowerSetting("ON"); + } + break; + case climate::CLIMATE_MODE_DRY: + hp->setModeSetting("DRY"); + hp->setPowerSetting("ON"); + if (has_mode){ this->action = climate::CLIMATE_ACTION_DRYING; updated = true; - break; - case climate::CLIMATE_MODE_AUTO: - hp->setModeSetting("AUTO"); - hp->setPowerSetting("ON"); + } + break; + case climate::CLIMATE_MODE_AUTO: + hp->setModeSetting("AUTO"); + hp->setPowerSetting("ON"); + if (has_mode){ if (auto_setpoint.has_value() && !has_temp) { hp->setTemperature(auto_setpoint.value()); this->target_temperature = auto_setpoint.value(); } this->action = climate::CLIMATE_ACTION_IDLE; - updated = true; - break; - case climate::CLIMATE_MODE_FAN_ONLY: - hp->setModeSetting("FAN"); - hp->setPowerSetting("ON"); + } + updated = true; + break; + case climate::CLIMATE_MODE_FAN_ONLY: + hp->setModeSetting("FAN"); + hp->setPowerSetting("ON"); + if (has_mode){ this->action = climate::CLIMATE_ACTION_FAN; updated = true; - break; - case climate::CLIMATE_MODE_OFF: - default: + } + break; + case climate::CLIMATE_MODE_OFF: + default: + if (has_mode){ hp->setPowerSetting("OFF"); this->action = climate::CLIMATE_ACTION_OFF; updated = true; - break; - } + } + break; } if (has_temp){