diff --git a/components/samsung_ac/__init__.py b/components/samsung_ac/__init__.py index afccc90..8894100 100644 --- a/components/samsung_ac/__init__.py +++ b/components/samsung_ac/__init__.py @@ -53,6 +53,7 @@ CONF_DEVICE_ROOM_TEMPERATURE = "room_temperature" CONF_DEVICE_ROOM_TEMPERATURE_OFFSET = "room_temperature_offset" CONF_DEVICE_TARGET_TEMPERATURE = "target_temperature" +CONF_DEVICE_WATER_OUTLET_TARGET = "water_outlet_target" CONF_DEVICE_OUTDOOR_TEMPERATURE = "outdoor_temperature" CONF_DEVICE_WATER_TEMPERATURE = "water_temperature" CONF_DEVICE_WATER_TARGET_TEMPERATURE = "water_target_temperature" @@ -61,7 +62,6 @@ CONF_DEVICE_MODE = "mode" CONF_DEVICE_CLIMATE = "climate" CONF_DEVICE_ROOM_HUMIDITY = "room_humidity" -CONF_DEVICE_WATER_TEMPERATURE = "water_temperature" CONF_DEVICE_CUSTOM = "custom_sensor" CONF_DEVICE_CUSTOM_MESSAGE = "message" CONF_DEVICE_CUSTOM_RAW_FILTERS = "raw_filters" @@ -180,6 +180,7 @@ def humidity_sensor_schema(message: int): state_class=STATE_CLASS_MEASUREMENT, ), cv.Optional(CONF_DEVICE_TARGET_TEMPERATURE): NUMBER_SCHEMA, + cv.Optional(CONF_DEVICE_WATER_OUTLET_TARGET): NUMBER_SCHEMA, cv.Optional(CONF_DEVICE_WATER_TARGET_TEMPERATURE): NUMBER_SCHEMA, cv.Optional(CONF_DEVICE_POWER): switch.switch_schema(Samsung_AC_Switch), cv.Optional(CONF_DEVICE_WATER_HEATER_POWER): switch.switch_schema(Samsung_AC_Switch), @@ -332,6 +333,16 @@ async def to_code(config): max_value=30.0, step=1.0) cg.add(var_dev.set_target_temperature_number(num)) + + if CONF_DEVICE_WATER_OUTLET_TARGET in device: + conf = device[CONF_DEVICE_WATER_OUTLET_TARGET] + conf[CONF_UNIT_OF_MEASUREMENT] = UNIT_CELSIUS + conf[CONF_DEVICE_CLASS] = DEVICE_CLASS_TEMPERATURE + num = await number.new_number(conf, + min_value=15.0, + max_value=55.0, + step=0.1) + cg.add(var_dev.set_water_outlet_target_number(num)) if CONF_DEVICE_MODE in device: conf = device[CONF_DEVICE_MODE] diff --git a/components/samsung_ac/protocol.h b/components/samsung_ac/protocol.h index cb60a0c..0ed552c 100644 --- a/components/samsung_ac/protocol.h +++ b/components/samsung_ac/protocol.h @@ -70,6 +70,7 @@ namespace esphome virtual void set_water_heater_power(const std::string address, bool value) = 0; virtual void set_room_temperature(const std::string address, float value) = 0; virtual void set_target_temperature(const std::string address, float value) = 0; + virtual void set_water_outlet_target(const std::string address, float value) = 0; virtual void set_outdoor_temperature(const std::string address, float value) = 0; virtual void set_target_water_temperature(const std::string address, float value) = 0; virtual void set_mode(const std::string address, Mode mode) = 0; @@ -88,6 +89,7 @@ namespace esphome optional water_heater_power; optional mode; optional target_temp; + optional water_outlet_target; optional target_water_temp; optional fan_mode; optional swing_mode; diff --git a/components/samsung_ac/protocol_nasa.cpp b/components/samsung_ac/protocol_nasa.cpp index bd3e0c4..06a12cf 100644 --- a/components/samsung_ac/protocol_nasa.cpp +++ b/components/samsung_ac/protocol_nasa.cpp @@ -401,6 +401,13 @@ namespace esphome packet.messages.push_back(targettemp); } + if (request.water_outlet_target) + { + MessageSet wateroutlettarget(MessageNumber::VAR_in_temp_water_outlet_target_f); + wateroutlettarget.value = request.water_outlet_target.value() * 10.0; + packet.messages.push_back(wateroutlettarget); + } + if (request.target_water_temp) { MessageSet targetwatertemp(MessageNumber::VAR_in_temp_water_heater_target_f); @@ -535,7 +542,13 @@ namespace esphome target->set_target_temperature(source, temp); return; } - + case MessageNumber::VAR_in_temp_water_outlet_target_f: // unit = 'Celsius' from XML + { + double temp = (double)message.value / (double)10; + ESP_LOGW(TAG, "s:%s d:%s VAR_in_temp_water_outlet_target_f %f", source.c_str(), dest.c_str(), temp); + target->set_water_outlet_target(source, temp); + return; + } case MessageNumber::VAR_in_temp_water_heater_target_f: // unit = 'Celsius' from XML { double temp = (double)message.value / (double)10; diff --git a/components/samsung_ac/protocol_nasa.h b/components/samsung_ac/protocol_nasa.h index 22572ef..edae300 100644 --- a/components/samsung_ac/protocol_nasa.h +++ b/components/samsung_ac/protocol_nasa.h @@ -81,6 +81,7 @@ namespace esphome ENUM_in_state_humidity_percent = 0x4038, VAR_in_temp_room_f = 0x4203, VAR_in_temp_target_f = 0x4201, + VAR_in_temp_water_outlet_target_f = 0x4247, VAR_in_temp_water_tank_f = 0x4237, VAR_out_sensor_airout = 0x8204, VAR_in_temp_water_heater_target_f = 0x4235, diff --git a/components/samsung_ac/protocol_non_nasa.cpp b/components/samsung_ac/protocol_non_nasa.cpp index fbdb619..392edc8 100644 --- a/components/samsung_ac/protocol_non_nasa.cpp +++ b/components/samsung_ac/protocol_non_nasa.cpp @@ -573,6 +573,8 @@ namespace esphome last_command20s_[nonpacket_.src] = nonpacket_.command20; target->set_target_temperature(nonpacket_.src, nonpacket_.command20.target_temp); // TODO + target->set_water_outlet_target(nonpacket_.src, false); + // TODO target->set_target_water_temperature(nonpacket_.src, false); target->set_room_temperature(nonpacket_.src, nonpacket_.command20.room_temp); target->set_power(nonpacket_.src, nonpacket_.command20.power); diff --git a/components/samsung_ac/samsung_ac.h b/components/samsung_ac/samsung_ac.h index 55618c3..0a5bd30 100644 --- a/components/samsung_ac/samsung_ac.h +++ b/components/samsung_ac/samsung_ac.h @@ -86,6 +86,13 @@ namespace esphome if (dev != nullptr) dev->update_target_temperature(value); } + + void /*MessageTarget::*/ set_water_outlet_target(const std::string address, float value) override + { + Samsung_AC_Device *dev = find_device(address); + if (dev != nullptr) + dev->update_water_outlet_target(value); + } void /*MessageTarget::*/ set_target_water_temperature(const std::string address, float value) override { @@ -100,7 +107,6 @@ namespace esphome if (dev != nullptr) dev->update_power(value); } - void /*MessageTarget::*/ set_water_heater_power(const std::string address, bool value) override { Samsung_AC_Device *dev = find_device(address); diff --git a/components/samsung_ac/samsung_ac_device.h b/components/samsung_ac/samsung_ac_device.h index ce3214f..bc202da 100644 --- a/components/samsung_ac/samsung_ac_device.h +++ b/components/samsung_ac/samsung_ac_device.h @@ -90,6 +90,7 @@ namespace esphome sensor::Sensor *room_temperature{nullptr}; sensor::Sensor *outdoor_temperature{nullptr}; Samsung_AC_Number *target_temperature{nullptr}; + Samsung_AC_Number *water_outlet_target{nullptr}; Samsung_AC_Number *target_water_temperature{nullptr}; Samsung_AC_Switch *power{nullptr}; Samsung_AC_Switch *water_heater_power{nullptr}; @@ -167,6 +168,17 @@ namespace esphome publish_request(request); }; }; + + void set_water_outlet_target_number(Samsung_AC_Number *number) + { + water_outlet_target = number; + water_outlet_target->write_state_ = [this](float value) + { + ProtocolRequest request; + request.water_outlet_target = value; + publish_request(request); + }; + }; void set_target_water_temperature_number(Samsung_AC_Number *number) { @@ -195,6 +207,12 @@ namespace esphome climate->publish_state(); } } + + void update_water_outlet_target(float value) + { + if (water_outlet_target != nullptr) + water_outlet_target->publish_state(value); + } void update_target_water_temperature(float value) {