indoor ambient temperature sensor was lost when external component realized

Fixes #13
This commit is contained in:
GrKoR
2021-11-02 15:32:12 +03:00
parent c096e18611
commit 7267109330
3 changed files with 52 additions and 6 deletions

View File

@@ -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

View File

@@ -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:

View File

@@ -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