From ff24023b39834628556b6ba1c3c52f3a2c06e19d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 15 Sep 2020 10:33:37 +1200 Subject: [PATCH] Adds support for Tuya Climate temperature multiplier (#1276) * Adds support for temperature multiplier * Add new multiplier to test file * Remove import * Fixes --- esphome/components/tuya/climate/__init__.py | 11 +++--- .../components/tuya/climate/tuya_climate.cpp | 38 ++++--------------- .../components/tuya/climate/tuya_climate.h | 6 ++- tests/test4.yaml | 1 + 4 files changed, 17 insertions(+), 39 deletions(-) diff --git a/esphome/components/tuya/climate/__init__.py b/esphome/components/tuya/climate/__init__.py index 878c5aefe8..79c6551c14 100644 --- a/esphome/components/tuya/climate/__init__.py +++ b/esphome/components/tuya/climate/__init__.py @@ -7,9 +7,9 @@ from .. import tuya_ns, CONF_TUYA_ID, Tuya DEPENDENCIES = ['tuya'] CODEOWNERS = ['@jesserockz'] -CONF_TARGET_TEMPERATURE_DATAPOINT = "target_temperature_datapoint" -CONF_CURRENT_TEMPERATURE_DATAPOINT = "current_temperature_datapoint" -# CONF_ECO_MODE_DATAPOINT = "eco_mode_datapoint" +CONF_TARGET_TEMPERATURE_DATAPOINT = 'target_temperature_datapoint' +CONF_CURRENT_TEMPERATURE_DATAPOINT = 'current_temperature_datapoint' +CONF_TEMPERATURE_MULTIPLIER = 'temperature_multiplier' TuyaClimate = tuya_ns.class_('TuyaClimate', climate.Climate, cg.Component) @@ -19,7 +19,7 @@ CONFIG_SCHEMA = cv.All(climate.CLIMATE_SCHEMA.extend({ cv.Optional(CONF_SWITCH_DATAPOINT): cv.uint8_t, cv.Optional(CONF_TARGET_TEMPERATURE_DATAPOINT): cv.uint8_t, cv.Optional(CONF_CURRENT_TEMPERATURE_DATAPOINT): cv.uint8_t, - # cv.Optional(CONF_ECO_MODE_DATAPOINT): cv.uint8_t, + cv.Optional(CONF_TEMPERATURE_MULTIPLIER, default=1): cv.positive_float, }).extend(cv.COMPONENT_SCHEMA), cv.has_at_least_one_key( CONF_TARGET_TEMPERATURE_DATAPOINT, CONF_SWITCH_DATAPOINT)) @@ -38,5 +38,4 @@ def to_code(config): cg.add(var.set_target_temperature_id(config[CONF_TARGET_TEMPERATURE_DATAPOINT])) if CONF_CURRENT_TEMPERATURE_DATAPOINT in config: cg.add(var.set_current_temperature_id(config[CONF_CURRENT_TEMPERATURE_DATAPOINT])) - # if CONF_ECO_MODE_DATAPOINT in config: - # cg.add(var.set_eco_mode_id(config[CONF_ECO_MODE_DATAPOINT])) + cg.add(var.set_temperature_multiplier(config[CONF_TEMPERATURE_MULTIPLIER])) diff --git a/esphome/components/tuya/climate/tuya_climate.cpp b/esphome/components/tuya/climate/tuya_climate.cpp index cfd5acccbd..0b66a58af6 100644 --- a/esphome/components/tuya/climate/tuya_climate.cpp +++ b/esphome/components/tuya/climate/tuya_climate.cpp @@ -21,28 +21,20 @@ void TuyaClimate::setup() { } if (this->target_temperature_id_.has_value()) { this->parent_->register_listener(*this->target_temperature_id_, [this](TuyaDatapoint datapoint) { - this->target_temperature = datapoint.value_int; + this->target_temperature = datapoint.value_int * this->temperature_multiplier_; this->compute_state_(); this->publish_state(); - ESP_LOGD(TAG, "MCU reported target temperature is: %d", datapoint.value_int); + ESP_LOGD(TAG, "MCU reported target temperature is: %.1f", this->target_temperature); }); } if (this->current_temperature_id_.has_value()) { this->parent_->register_listener(*this->current_temperature_id_, [this](TuyaDatapoint datapoint) { - this->current_temperature = datapoint.value_int; + this->current_temperature = datapoint.value_int * this->temperature_multiplier_; this->compute_state_(); this->publish_state(); - ESP_LOGD(TAG, "MCU reported current temperature is: %d", datapoint.value_int); + ESP_LOGD(TAG, "MCU reported current temperature is: %.1f", this->current_temperature); }); } - // if (this->eco_mode_id_.has_value()) { - // this->parent_->register_listener(*this->eco_mode_id_, [this](TuyaDatapoint datapoint) { - // this->eco_mode = datapoint.value_bool; - // this->compute_state_(); - // this->publish_state(); - // ESP_LOGD(TAG, "MCU reported eco mode of: %s", ONOFF(datapoint.value_bool)); - // }); - // } } void TuyaClimate::control(const climate::ClimateCall &call) { @@ -56,30 +48,17 @@ void TuyaClimate::control(const climate::ClimateCall &call) { this->parent_->set_datapoint_value(datapoint); ESP_LOGD(TAG, "Setting switch: %s", ONOFF(datapoint.value_bool)); } - if (call.get_target_temperature_low().has_value()) - this->target_temperature_low = *call.get_target_temperature_low(); - if (call.get_target_temperature_high().has_value()) - this->target_temperature_high = *call.get_target_temperature_high(); + if (call.get_target_temperature().has_value()) { this->target_temperature = *call.get_target_temperature(); TuyaDatapoint datapoint{}; datapoint.id = *this->target_temperature_id_; datapoint.type = TuyaDatapointType::INTEGER; - datapoint.value_int = (int) this->target_temperature; + datapoint.value_int = (int) (this->target_temperature / this->temperature_multiplier_); this->parent_->set_datapoint_value(datapoint); - ESP_LOGD(TAG, "Setting target temperature: %d", datapoint.value_int); + ESP_LOGD(TAG, "Setting target temperature: %.1f", this->target_temperature); } - // if (call.get_eco_mode().has_value()) { - // this->eco_mode = *call.get_eco_mode(); - - // TuyaDatapoint datapoint{}; - // datapoint.id = *this->eco_mode_id_; - // datapoint.type = TuyaDatapointType::BOOLEAN; - // datapoint.value_bool = this->eco_mode; - // this->parent_->set_datapoint_value(datapoint); - // ESP_LOGD(TAG, "Setting eco mode: %s", ONOFF(datapoint.value_bool)); - // } this->compute_state_(); this->publish_state(); @@ -89,7 +68,6 @@ climate::ClimateTraits TuyaClimate::traits() { auto traits = climate::ClimateTraits(); traits.set_supports_current_temperature(this->current_temperature_id_.has_value()); traits.set_supports_heat_mode(true); - // traits.set_supports_eco_mode(this->eco_mode_id_.has_value()); traits.set_supports_action(true); return traits; } @@ -102,8 +80,6 @@ void TuyaClimate::dump_config() { ESP_LOGCONFIG(TAG, " Target Temperature has datapoint ID %u", *this->target_temperature_id_); if (this->current_temperature_id_.has_value()) ESP_LOGCONFIG(TAG, " Current Temperature has datapoint ID %u", *this->current_temperature_id_); - // if (this->eco_mode_id_.has_value()) - // ESP_LOGCONFIG(TAG, " Eco Mode has datapoint ID %u", *this->mode_id_); } void TuyaClimate::compute_state_() { diff --git a/esphome/components/tuya/climate/tuya_climate.h b/esphome/components/tuya/climate/tuya_climate.h index a073b0996c..e09e110a35 100644 --- a/esphome/components/tuya/climate/tuya_climate.h +++ b/esphome/components/tuya/climate/tuya_climate.h @@ -18,7 +18,9 @@ class TuyaClimate : public climate::Climate, public Component { void set_current_temperature_id(uint8_t current_temperature_id) { this->current_temperature_id_ = current_temperature_id; } - // void set_eco_mode_id(uint8_t eco_mode_id) { this->eco_mode_id_ = eco_mode_id; } + void set_temperature_multiplier(float temperature_multiplier) { + this->temperature_multiplier_ = temperature_multiplier; + } void set_tuya_parent(Tuya *parent) { this->parent_ = parent; } @@ -38,7 +40,7 @@ class TuyaClimate : public climate::Climate, public Component { optional switch_id_{}; optional target_temperature_id_{}; optional current_temperature_id_{}; - // optional eco_mode_id_{}; + float temperature_multiplier_{1.0f}; }; } // namespace tuya diff --git a/tests/test4.yaml b/tests/test4.yaml index ab78e22fef..51e4c6311f 100644 --- a/tests/test4.yaml +++ b/tests/test4.yaml @@ -87,6 +87,7 @@ climate: id: tuya_climate switch_datapoint: 1 target_temperature_datapoint: 3 + temperature_multiplier: 0.5 switch: - platform: tuya