From 005d94c1b55a6b9cf0141156181d7ab978180d83 Mon Sep 17 00:00:00 2001 From: Conor Mongey Date: Sun, 11 Feb 2024 17:10:47 +0000 Subject: [PATCH] Add outdoor temperature sensor --- components/samsung_ac/__init__.py | 12 ++++++++++++ components/samsung_ac/protocol.h | 1 + components/samsung_ac/protocol_nasa.cpp | 8 ++++++++ components/samsung_ac/samsung_ac.h | 7 +++++++ components/samsung_ac/samsung_ac_device.h | 12 ++++++++++++ test/test_stuff.h | 9 +++++++++ 6 files changed, 49 insertions(+) diff --git a/components/samsung_ac/__init__.py b/components/samsung_ac/__init__.py index ddef7842..7bf08cd7 100644 --- a/components/samsung_ac/__init__.py +++ b/components/samsung_ac/__init__.py @@ -50,6 +50,7 @@ CONF_DEVICE_ROOM_HUMIDITY = "room_humidity" CONF_DEVICE_TARGET_TEMPERATURE = "target_temperature" CONF_DEVICE_WATER_TEMPERATURE = "water_temperature" +CONF_DEVICE_OUTDOOR_TEMPERATURE = "outdoor_temperature" CONF_DEVICE_POWER = "power" CONF_DEVICE_MODE = "mode" CONF_DEVICE_CLIMATE = "climate" @@ -71,6 +72,12 @@ device_class=DEVICE_CLASS_TEMPERATURE, state_class=STATE_CLASS_MEASUREMENT, ), + cv.Optional(CONF_DEVICE_OUTDOOR_TEMPERATURE): sensor.sensor_schema( + unit_of_measurement=UNIT_CELSIUS, + accuracy_decimals=1, + device_class=DEVICE_CLASS_TEMPERATURE, + state_class=STATE_CLASS_MEASUREMENT, + ), cv.Optional(CONF_DEVICE_ROOM_HUMIDITY): sensor.sensor_schema( unit_of_measurement=UNIT_PERCENT, accuracy_decimals=0, @@ -134,6 +141,11 @@ async def to_code(config): sens = await sensor.new_sensor(conf) cg.add(var_dev.set_room_temperature_sensor(sens)) + if CONF_DEVICE_OUTDOOR_TEMPERATURE in device: + conf = device[CONF_DEVICE_OUTDOOR_TEMPERATURE] + sens = await sensor.new_sensor(conf) + cg.add(var_dev.set_outdoor_temperature_sensor(sens)) + if CONF_DEVICE_WATER_TEMPERATURE in device: conf = device[CONF_DEVICE_WATER_TEMPERATURE] sens = await sensor.new_sensor(conf) diff --git a/components/samsung_ac/protocol.h b/components/samsung_ac/protocol.h index 9ee42f39..7f38675d 100644 --- a/components/samsung_ac/protocol.h +++ b/components/samsung_ac/protocol.h @@ -71,6 +71,7 @@ namespace esphome virtual void set_water_temperature(const std::string address, float value) = 0; virtual void set_room_humidity(const std::string address, float value) = 0; virtual void set_target_temperature(const std::string address, float value) = 0; + virtual void set_outdoor_temperature(const std::string address, float value) = 0; virtual void set_mode(const std::string address, Mode mode) = 0; virtual void set_fanmode(const std::string address, FanMode fanmode) = 0; virtual void set_altmode(const std::string address, AltMode fanmode) = 0; diff --git a/components/samsung_ac/protocol_nasa.cpp b/components/samsung_ac/protocol_nasa.cpp index 89aed10f..be89b283 100644 --- a/components/samsung_ac/protocol_nasa.cpp +++ b/components/samsung_ac/protocol_nasa.cpp @@ -699,6 +699,14 @@ namespace esphome ESP_LOGW(TAG, "s:%s d:%s NASA_OUTDOOR_CONTROL_WATTMETER_TOTAL_SUM_ACCUM %f", source.c_str(), dest.c_str(), value); return; } + if ((uint16_t)message.messageNumber == 0x8204) + { // VAR_OUTDOOR_TEMP + double temp = (double)message.value / (double)10; + ESP_LOGW(TAG, "s:%s d:%s VAR_OUTDOOR_TEMP %li", source.c_str(), dest.c_str(), message.value); + // possibly outdoor temperature? + target->set_outdoor_temperature(source, temp); + return; + } } } } diff --git a/components/samsung_ac/samsung_ac.h b/components/samsung_ac/samsung_ac.h index cb9a18f5..4ac97700 100644 --- a/components/samsung_ac/samsung_ac.h +++ b/components/samsung_ac/samsung_ac.h @@ -82,6 +82,13 @@ namespace esphome dev->update_room_humidity(value); } + void /*MessageTarget::*/ set_outdoor_temperature(const std::string address, float value) override + { + Samsung_AC_Device *dev = find_device(address); + if (dev != nullptr) + dev->update_outdoor_temperature(value); + } + void /*MessageTarget::*/ set_target_temperature(const std::string address, float 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 fb62648e..acdf456c 100644 --- a/components/samsung_ac/samsung_ac_device.h +++ b/components/samsung_ac/samsung_ac_device.h @@ -78,6 +78,7 @@ namespace esphome std::string address; sensor::Sensor *room_temperature{nullptr}; sensor::Sensor *water_temperature{nullptr}; + sensor::Sensor *outdoor_temperature{nullptr}; sensor::Sensor *room_humidity{nullptr}; Samsung_AC_Number *target_temperature{nullptr}; Samsung_AC_Switch *power{nullptr}; @@ -89,6 +90,11 @@ namespace esphome room_temperature = sensor; } + void set_outdoor_temperature_sensor(sensor::Sensor *sensor) + { + outdoor_temperature = sensor; + } + void set_water_temperature_sensor(sensor::Sensor *sensor) { water_temperature = sensor; @@ -138,6 +144,12 @@ namespace esphome climate->device = this; } + void update_outdoor_temperature(float value) + { + if (outdoor_temperature != nullptr) + outdoor_temperature->publish_state(value); + } + void update_target_temperature(float value) { if (target_temperature != nullptr) diff --git a/test/test_stuff.h b/test/test_stuff.h index f59bb92f..55eda90c 100644 --- a/test/test_stuff.h +++ b/test/test_stuff.h @@ -69,6 +69,15 @@ class DebugTarget : public MessageTarget last_set_target_temperature_value = value; } + std::string last_set_outdoor_temperature_address; + float last_set_outdoor_temperature_value; + void set_outdoor_temperature(const std::string address, float value) + { + cout << "> " << address << " set_outdoor_temperature=" << to_string(value) << endl; + last_set_outdoor_temperature_address = address; + last_set_outdoor_temperature_value = value; + } + std::string last_set_room_humidity_address; float last_set_room_humidity_value; void set_room_humidity(const std::string address, float value)