mirror of
https://github.com/esphome/esphome.git
synced 2026-05-26 03:07:04 +08:00
[climate_ir] Add optional humidity sensor (#9805)
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Djordje Mandic <6750655+DjordjeMandic@users.noreply.github.com> Co-authored-by: J. Nick Koston <nick@koston.org> Co-authored-by: J. Nick Koston <nick@home-assistant.io> Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
This commit is contained in:
@@ -3,7 +3,12 @@ import logging
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components import climate, remote_base, sensor
|
from esphome.components import climate, remote_base, sensor
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_SENSOR, CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT
|
from esphome.const import (
|
||||||
|
CONF_HUMIDITY_SENSOR,
|
||||||
|
CONF_SENSOR,
|
||||||
|
CONF_SUPPORTS_COOL,
|
||||||
|
CONF_SUPPORTS_HEAT,
|
||||||
|
)
|
||||||
from esphome.cpp_generator import MockObjClass
|
from esphome.cpp_generator import MockObjClass
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@@ -32,6 +37,7 @@ def climate_ir_schema(
|
|||||||
cv.Optional(CONF_SUPPORTS_COOL, default=True): cv.boolean,
|
cv.Optional(CONF_SUPPORTS_COOL, default=True): cv.boolean,
|
||||||
cv.Optional(CONF_SUPPORTS_HEAT, default=True): cv.boolean,
|
cv.Optional(CONF_SUPPORTS_HEAT, default=True): cv.boolean,
|
||||||
cv.Optional(CONF_SENSOR): cv.use_id(sensor.Sensor),
|
cv.Optional(CONF_SENSOR): cv.use_id(sensor.Sensor),
|
||||||
|
cv.Optional(CONF_HUMIDITY_SENSOR): cv.use_id(sensor.Sensor),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.extend(cv.COMPONENT_SCHEMA)
|
.extend(cv.COMPONENT_SCHEMA)
|
||||||
@@ -61,6 +67,9 @@ async def register_climate_ir(var, config):
|
|||||||
if sensor_id := config.get(CONF_SENSOR):
|
if sensor_id := config.get(CONF_SENSOR):
|
||||||
sens = await cg.get_variable(sensor_id)
|
sens = await cg.get_variable(sensor_id)
|
||||||
cg.add(var.set_sensor(sens))
|
cg.add(var.set_sensor(sens))
|
||||||
|
if sensor_id := config.get(CONF_HUMIDITY_SENSOR):
|
||||||
|
sens = await cg.get_variable(sensor_id)
|
||||||
|
cg.add(var.set_humidity_sensor(sens))
|
||||||
|
|
||||||
|
|
||||||
async def new_climate_ir(config, *args):
|
async def new_climate_ir(config, *args):
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ climate::ClimateTraits ClimateIR::traits() {
|
|||||||
if (this->sensor_ != nullptr) {
|
if (this->sensor_ != nullptr) {
|
||||||
traits.add_feature_flags(climate::CLIMATE_SUPPORTS_CURRENT_TEMPERATURE);
|
traits.add_feature_flags(climate::CLIMATE_SUPPORTS_CURRENT_TEMPERATURE);
|
||||||
}
|
}
|
||||||
|
if (this->humidity_sensor_ != nullptr) {
|
||||||
|
traits.add_feature_flags(climate::CLIMATE_SUPPORTS_CURRENT_HUMIDITY);
|
||||||
|
}
|
||||||
traits.set_supported_modes({climate::CLIMATE_MODE_OFF, climate::CLIMATE_MODE_HEAT_COOL});
|
traits.set_supported_modes({climate::CLIMATE_MODE_OFF, climate::CLIMATE_MODE_HEAT_COOL});
|
||||||
if (this->supports_cool_)
|
if (this->supports_cool_)
|
||||||
traits.add_supported_mode(climate::CLIMATE_MODE_COOL);
|
traits.add_supported_mode(climate::CLIMATE_MODE_COOL);
|
||||||
@@ -39,9 +41,16 @@ void ClimateIR::setup() {
|
|||||||
this->publish_state();
|
this->publish_state();
|
||||||
});
|
});
|
||||||
this->current_temperature = this->sensor_->state;
|
this->current_temperature = this->sensor_->state;
|
||||||
} else {
|
|
||||||
this->current_temperature = NAN;
|
|
||||||
}
|
}
|
||||||
|
if (this->humidity_sensor_ != nullptr) {
|
||||||
|
this->humidity_sensor_->add_on_state_callback([this](float state) {
|
||||||
|
this->current_humidity = state;
|
||||||
|
// current humidity changed, publish state
|
||||||
|
this->publish_state();
|
||||||
|
});
|
||||||
|
this->current_humidity = this->humidity_sensor_->state;
|
||||||
|
}
|
||||||
|
|
||||||
// restore set points
|
// restore set points
|
||||||
auto restore = this->restore_state_();
|
auto restore = this->restore_state_();
|
||||||
if (restore.has_value()) {
|
if (restore.has_value()) {
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class ClimateIR : public Component,
|
|||||||
void set_supports_cool(bool supports_cool) { this->supports_cool_ = supports_cool; }
|
void set_supports_cool(bool supports_cool) { this->supports_cool_ = supports_cool; }
|
||||||
void set_supports_heat(bool supports_heat) { this->supports_heat_ = supports_heat; }
|
void set_supports_heat(bool supports_heat) { this->supports_heat_ = supports_heat; }
|
||||||
void set_sensor(sensor::Sensor *sensor) { this->sensor_ = sensor; }
|
void set_sensor(sensor::Sensor *sensor) { this->sensor_ = sensor; }
|
||||||
|
void set_humidity_sensor(sensor::Sensor *sensor) { this->humidity_sensor_ = sensor; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
float minimum_temperature_, maximum_temperature_, temperature_step_;
|
float minimum_temperature_, maximum_temperature_, temperature_step_;
|
||||||
@@ -67,6 +68,7 @@ class ClimateIR : public Component,
|
|||||||
climate::ClimatePresetMask presets_{};
|
climate::ClimatePresetMask presets_{};
|
||||||
|
|
||||||
sensor::Sensor *sensor_{nullptr};
|
sensor::Sensor *sensor_{nullptr};
|
||||||
|
sensor::Sensor *humidity_sensor_{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace climate_ir
|
} // namespace climate_ir
|
||||||
|
|||||||
@@ -1,4 +1,16 @@
|
|||||||
|
sensor:
|
||||||
|
- platform: template
|
||||||
|
id: temp_sensor
|
||||||
|
lambda: return 22.0;
|
||||||
|
update_interval: 60s
|
||||||
|
- platform: template
|
||||||
|
id: humidity_sensor
|
||||||
|
lambda: return 50.0;
|
||||||
|
update_interval: 60s
|
||||||
|
|
||||||
climate:
|
climate:
|
||||||
- platform: climate_ir_lg
|
- platform: climate_ir_lg
|
||||||
name: LG Climate
|
name: LG Climate
|
||||||
transmitter_id: xmitr
|
transmitter_id: xmitr
|
||||||
|
sensor: temp_sensor
|
||||||
|
humidity_sensor: humidity_sensor
|
||||||
|
|||||||
Reference in New Issue
Block a user