diff --git a/components/aux_ac/aux_ac.h b/components/aux_ac/aux_ac.h index 6db3bed..4c0860c 100644 --- a/components/aux_ac/aux_ac.h +++ b/components/aux_ac/aux_ac.h @@ -1550,12 +1550,13 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { return relevant; } - public: // сенсоры, отображающие параметры сплита - esphome::sensor::Sensor *sensor_ambient_temperature = new esphome::sensor::Sensor(); + //esphome::sensor::Sensor *sensor_indoor_temperature = new esphome::sensor::Sensor(); + esphome::sensor::Sensor *sensor_indoor_temperature_ = nullptr; // TODO: если расшифруем формулу для уличной температуры, то можно будет вернуть //esphome::sensor::Sensor *sensor_outdoor_temperature = new esphome::sensor::Sensor(); + public: AirCon(){ initAC(); }; AirCon(esphome::uart::UARTComponent *parent) { initAC(parent); }; @@ -1583,6 +1584,8 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { float get_setup_priority() const override { return esphome::setup_priority::DATA; } + void set_indoor_temperature_sensor(sensor::Sensor *temperature_sensor) { sensor_indoor_temperature_ = temperature_sensor; } + bool get_hw_initialized(){ return _hw_initialized; }; bool get_has_connection(){ return _has_connection; }; @@ -1825,7 +1828,8 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { /*********************************************************************/ this->publish_state(); // температура в комнате - sensor_ambient_temperature->publish_state(_current_ac_state.temp_ambient); + if (sensor_indoor_temperature_ != nullptr) + sensor_indoor_temperature_->publish_state(_current_ac_state.temp_ambient); // температура уличного блока // TODO: если расшифруем формулу для уличной температуры, то можно будет вернуть //sensor_outdoor_temperature->publish_state(_current_ac_state.temp_outdoor); @@ -1836,7 +1840,26 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { ESP_LOGCONFIG(Constants::TAG, "AUX HVAC:"); ESP_LOGCONFIG(Constants::TAG, " [x] Period: %dms", this->get_period()); ESP_LOGCONFIG(Constants::TAG, " [x] Show action: %s", this->get_show_action() ? "true" : "false"); + if ((this->sensor_indoor_temperature_) != nullptr) { + ESP_LOGCONFIG(Constants::TAG, "%s%s '%s'", " ", LOG_STR_LITERAL("Indoor Temperature"), (this->sensor_indoor_temperature_)->get_name().c_str()); + if (!(this->sensor_indoor_temperature_)->get_device_class().empty()) { + ESP_LOGCONFIG(Constants::TAG, "%s Device Class: '%s'", " ", (this->sensor_indoor_temperature_)->get_device_class().c_str()); + } + ESP_LOGCONFIG(Constants::TAG, "%s State Class: '%s'", " ", state_class_to_string((this->sensor_indoor_temperature_)->get_state_class()).c_str()); + ESP_LOGCONFIG(Constants::TAG, "%s Unit of Measurement: '%s'", " ", (this->sensor_indoor_temperature_)->get_unit_of_measurement().c_str()); + ESP_LOGCONFIG(Constants::TAG, "%s Accuracy Decimals: %d", " ", (this->sensor_indoor_temperature_)->get_accuracy_decimals()); + if (!(this->sensor_indoor_temperature_)->get_icon().empty()) { + ESP_LOGCONFIG(Constants::TAG, "%s Icon: '%s'", " ", (this->sensor_indoor_temperature_)->get_icon().c_str()); + } + if (!(this->sensor_indoor_temperature_)->unique_id().empty()) { + ESP_LOGV(Constants::TAG, "%s Unique ID: '%s'", " ", (this->sensor_indoor_temperature_)->unique_id().c_str()); + } + if ((this->sensor_indoor_temperature_)->get_force_update()) { + ESP_LOGV(Constants::TAG, "%s Force Update: YES", " "); + } + } this->dump_traits_(Constants::TAG); + } // вызывается пользователем из интерфейса ESPHome или Home Assistant diff --git a/components/aux_ac/climate.py b/components/aux_ac/climate.py index d2f3b6d..11f5852 100644 --- a/components/aux_ac/climate.py +++ b/components/aux_ac/climate.py @@ -1,14 +1,17 @@ import logging import esphome.config_validation as cv import esphome.codegen as cg -from esphome.components import climate, uart +from esphome.components import climate, uart, sensor from esphome.const import ( CONF_ID, - CONF_NAME, CONF_UART_ID, CONF_PERIOD, CONF_CUSTOM_FAN_MODES, - CONF_CUSTOM_PRESETS + CONF_CUSTOM_PRESETS, + CONF_INTERNAL, + UNIT_CELSIUS, + DEVICE_CLASS_TEMPERATURE, + STATE_CLASS_MEASUREMENT, ) from esphome.components.climate import ( ClimateMode, @@ -24,6 +27,7 @@ CONF_SUPPORTED_MODES = 'supported_modes' CONF_SUPPORTED_SWING_MODES = 'supported_swing_modes' CONF_SUPPORTED_PRESETS = 'supported_presets' CONF_SHOW_ACTION = 'show_action' +CONF_INDOOR_TEMPERATURE = 'indoor_temperature' aux_ac_ns = cg.esphome_ns.namespace("aux_ac") AirCon = aux_ac_ns.class_("AirCon", climate.Climate, cg.Component) @@ -74,6 +78,16 @@ CONFIG_SCHEMA = cv.All( cv.GenerateID(): cv.declare_id(AirCon), cv.Optional(CONF_PERIOD, default="7s"): cv.time_period, cv.Optional(CONF_SHOW_ACTION, default="true"): cv.boolean, + cv.Optional(CONF_INDOOR_TEMPERATURE): sensor.sensor_schema( + unit_of_measurement=UNIT_CELSIUS, + accuracy_decimals=1, + device_class=DEVICE_CLASS_TEMPERATURE, + state_class=STATE_CLASS_MEASUREMENT, + ).extend( + { + cv.Optional(CONF_INTERNAL, default="true"): cv.boolean, + } + ), cv.Optional(CONF_SUPPORTED_MODES): cv.ensure_list(validate_modes), cv.Optional(CONF_SUPPORTED_SWING_MODES): cv.ensure_list(validate_swing_modes), cv.Optional(CONF_SUPPORTED_PRESETS): cv.ensure_list(validate_presets), @@ -94,6 +108,11 @@ async def to_code(config): parent = await cg.get_variable(config[CONF_UART_ID]) cg.add(var.initAC(parent)) + if CONF_INDOOR_TEMPERATURE in config: + conf = config[CONF_INDOOR_TEMPERATURE] + sens = await sensor.new_sensor(conf) + cg.add(var.set_indoor_temperature_sensor(sens)) + cg.add(var.set_period(config[CONF_PERIOD].total_milliseconds)) cg.add(var.set_show_action(config[CONF_SHOW_ACTION])) if CONF_SUPPORTED_MODES in config: diff --git a/tests/test-local.yaml b/tests/test-local.yaml index c012c44..1826bd4 100644 --- a/tests/test-local.yaml +++ b/tests/test-local.yaml @@ -53,6 +53,10 @@ climate: uart_id: ac_uart_bus period: 7s # период опроса состояния сплита, по дефолту 7 сек show_action: true # надо ли показывать текущий режим работы: при HEAT_COOL mode сплит может греть (HEAT), охлаждать (COOL) или бездействовать (IDLE) + indoor_temperature: + name: AC Indoor Temperature + id: ac_indoor_temp + internal: true # сенсор установлен как внутренний по дефолту visual: min_temperature: 16 max_temperature: 32