Добавлена поддержка пресетов

This commit is contained in:
I-am-nightingale
2024-04-12 22:13:07 +03:00
parent e75a852832
commit 842257354a
3 changed files with 72 additions and 8 deletions

View File

@@ -10,6 +10,9 @@ from esphome.const import (
CONF_MIN_TEMPERATURE,
CONF_SUPPORTED_MODES,
CONF_TEMPERATURE_STEP,
CONF_SUPPORTED_PRESETS,
CONF_TARGET_TEMPERATURE,
CONF_CURRENT_TEMPERATURE,
CONF_SUPPORTED_FAN_MODES,
CONF_SUPPORTED_SWING_MODES,
)
@@ -69,6 +72,13 @@ SUPPORTED_CLIMATE_MODES_OPTIONS = {
"FAN_ONLY": ClimateMode.CLIMATE_MODE_FAN_ONLY,
}
SUPPORTED_CLIMATE_PRESETS_OPTIONS = {
"NONE": ClimatePreset.CLIMATE_PRESET_NONE,
"ECO": ClimatePreset.CLIMATE_PRESET_ECO,
"BOOST": ClimatePreset.CLIMATE_PRESET_BOOST,
"SLEEP": ClimatePreset.CLIMATE_PRESET_SLEEP,
"COMFORT": ClimatePreset.CLIMATE_PRESET_COMFORT,
VerticalSwingDirection = tclac_ns.enum("VerticalSwingDirection", True)
VERTICAL_SWING_DIRECTION_OPTIONS = {
"UP_DOWN": VerticalSwingDirection.UPDOWN,
@@ -104,6 +114,7 @@ AIRFLOW_HORIZONTAL_DIRECTION_OPTIONS = {
"MAX_RIGHT": AirflowHorizontalDirection.MAX_RIGHT,
}
# Проверка конфигурации интерфейса и принятие значений по умолчанию
def validate_visual(config):
if CONF_VISUAL in config:
visual_config = config[CONF_VISUAL]
@@ -129,7 +140,7 @@ def validate_visual(config):
config[CONF_VISUAL] = {CONF_MIN_TEMPERATURE: TCLAC_MIN_TEMPERATURE,CONF_MAX_TEMPERATURE: TCLAC_MAX_TEMPERATURE,CONF_TEMPERATURE_STEP: {CONF_TARGET_TEMPERATURE: TCLAC_TARGET_TEMPERATURE_STEP,CONF_CURRENT_TEMPERATURE: TCLAC_CURRENT_TEMPERATURE_STEP,},}
return config
# Проверка данных конфигурации и принятие значений по умолчанию
# Проверка конфигурации компонента и принятие значений по умолчанию
CONFIG_SCHEMA = cv.All(
climate.CLIMATE_SCHEMA.extend(
{
@@ -144,6 +155,7 @@ CONFIG_SCHEMA = cv.All(
cv.Optional(CONF_VERTICAL_SWING_MODE, default="UP_DOWN"): cv.ensure_list(cv.enum(VERTICAL_SWING_DIRECTION_OPTIONS, upper=True)),
cv.Optional(CONF_HORIZONTAL_AIRFLOW, default="CENTER"): cv.ensure_list(cv.enum(AIRFLOW_HORIZONTAL_DIRECTION_OPTIONS, upper=True)),
cv.Optional(CONF_HORIZONTAL_SWING_MODE, default="LEFT_RIGHT"): cv.ensure_list(cv.enum(HORIZONTAL_SWING_DIRECTION_OPTIONS, upper=True)),
cv.Optional(CONF_SUPPORTED_PRESETS,default=["NONE","ECO","BOOST","SLEEP",],): cv.ensure_list(cv.enum(SUPPORTED_CLIMATE_PRESETS_OPTIONS, upper=True)),
cv.Optional(CONF_SUPPORTED_SWING_MODES,default=["OFF","VERTICAL","HORIZONTAL","BOTH",],): cv.ensure_list(cv.enum(SUPPORTED_SWING_MODES_OPTIONS, upper=True)),
cv.Optional(CONF_SUPPORTED_MODES,default=["OFF","AUTO","COOL","HEAT","DRY","FAN_ONLY",],): cv.ensure_list(cv.enum(SUPPORTED_CLIMATE_MODES_OPTIONS, upper=True)),
cv.Optional(CONF_SUPPORTED_FAN_MODES,default=["AUTO","QUIET","LOW","MIDDLE","MEDIUM","HIGH","FOCUS","DIFFUSE",],): cv.ensure_list(cv.enum(SUPPORTED_FAN_MODES_OPTIONS, upper=True)),
@@ -309,6 +321,8 @@ def to_code(config):
cg.add(var.set_force_mode_state(config[CONF_FORCE_MODE]))
if CONF_SUPPORTED_MODES in config:
cg.add(var.set_supported_modes(config[CONF_SUPPORTED_MODES]))
if CONF_SUPPORTED_PRESETS in config:
cg.add(var.set_supported_presets(config[CONF_SUPPORTED_PRESETS]))
if CONF_MODULE_DISPLAY in config:
cg.add(var.set_module_display_state(config[CONF_MODULE_DISPLAY]))
if CONF_SUPPORTED_FAN_MODES in config:

View File

@@ -14,17 +14,19 @@ ClimateTraits tclacClimate::traits() {
traits.set_supports_two_point_target_temperature(false);
traits.set_supported_modes(this->supported_modes_);
traits.set_supported_presets(this->supported_presets_);
traits.set_supported_fan_modes(this->supported_fan_modes_);
traits.set_supported_swing_modes(this->supported_swing_modes_);
traits.add_supported_mode(climate::CLIMATE_MODE_OFF); // Выключенный режим кондиционера доступен всегда
traits.add_supported_mode(climate::CLIMATE_MODE_AUTO); // Автоматический режим кондиционера тоже
traits.add_supported_fan_mode(climate::CLIMATE_FAN_AUTO); // Автоматический режим вентилятора доступен всегда
traits.add_supported_preset(climate::CLIMATE_PRESET_NONE); // На всякий случай без предустановок
traits.add_supported_swing_mode(climate::CLIMATE_SWING_OFF);// Выключенный режим качания заслонок доступен всегда
traits.set_visual_temperature_step(STEP_TEMPERATURE);
traits.set_visual_min_temperature(MIN_SET_TEMPERATURE);
traits.set_visual_max_temperature(MAX_SET_TEMPERATURE);
// traits.set_visual_temperature_step(STEP_TEMPERATURE);
// traits.set_visual_min_temperature(MIN_SET_TEMPERATURE);
// traits.set_visual_max_temperature(MAX_SET_TEMPERATURE);
return traits;
}
@@ -171,11 +173,25 @@ void tclacClimate::readData() {
swing_mode = climate::CLIMATE_SWING_BOTH;
break;
}
// Обработка данных о пресете
preset_mode = climate::CLIMATE_PRESET_NONE;
if (dataRX[7] & (1 << 7)) {
preset_mode = ClimatePreset.CLIMATE_PRESET_BOOST;
} else if (dataRX[7] & (1 << 6)){
preset_mode = ClimatePreset.CLIMATE_PRESET_ECO;
} else if (dataRX[9] & (1 << 2)){
preset_mode = ClimatePreset.CLIMATE_PRESET_COMFORT;
} else if (dataRX[7] & (1 << 7)) && (dataRX[7] & (1 << 7)) && (dataRX[7] & (1 << 7)){
preset_mode = ClimatePreset.CLIMATE_PRESET_SLEEP;
}
} else {
// Если кондиционер выключен, то все режимы показываются, как выключенные
mode = climate::CLIMATE_MODE_OFF;
fan_mode = climate::CLIMATE_FAN_OFF;
swing_mode = climate::CLIMATE_SWING_OFF;
preset_mode = climate::CLIMATE_PRESET_NONE;
}
// Публикуем данные
this->publish_state();
@@ -190,6 +206,15 @@ void tclacClimate::control(const ClimateCall &call) {
} else {
switch_climate_mode = mode;
}
// Запрашиваем данные из переключателя предустановок кондиционера
if (call.get_preset().has_value()){
switch_preset_mode = call.get_preset().value();
} else {
switch_preset_mode = preset_mode;
}
// Запрашиваем данные из переключателя режимов вентилятора
if (call.get_fan_mode().has_value()){
switch_fan_mode = call.get_fan_mode().value();
@@ -225,6 +250,7 @@ void tclacClimate::takeControl() {
dataTX[10] = 0b00000000;//[10] = 0,timerindicator,swingv(3),fan(3) 0=auto 1=low 2=med 3=high
// {0,2,3,5,0};
dataTX[11] = 0b00000000;
dataTX[19] = 0b00000000;
dataTX[32] = 0b00000000;
dataTX[33] = 0b00000000;
@@ -279,7 +305,6 @@ void tclacClimate::takeControl() {
}
// Настраиваем режим вентилятора
switch(switch_fan_mode) {
case climate::CLIMATE_FAN_AUTO:
dataTX[8] += 0b00000000;
@@ -334,6 +359,24 @@ void tclacClimate::takeControl() {
dataTX[11] += 0b00001000;
break;
}
// Устанавливаем предустановки кондиционера
switch(switch_preset_mode) {
case ClimatePreset.CLIMATE_PRESET_NONE:
break;
case ClimatePreset.CLIMATE_PRESET_ECO:
dataTX[7] += 0b10000000;
break;
case ClimatePreset.CLIMATE_PRESET_BOOST:
dataTX[8] += 0b00100000;
break;
case ClimatePreset.CLIMATE_PRESET_SLEEP:
dataTX[19] += 0b00000001;
break;
case ClimatePreset.CLIMATE_PRESET_COMFORT:
dataTX[8] += 0b00001000;
break;
}
//Режим заслонок
// Вертикальная заслонка
@@ -481,7 +524,7 @@ void tclacClimate::takeControl() {
dataTX[16] = 0x00; //??
dataTX[17] = 0x00; //??
dataTX[18] = 0x00; //??
dataTX[19] = 0x00; //sleep on = 1 off=0
//dataTX[19] = 0x00; //sleep on = 1 off=0
dataTX[20] = 0x00; //??
dataTX[21] = 0x00; //??
dataTX[22] = 0x00; //??
@@ -514,7 +557,7 @@ void tclacClimate::sendData(byte * message, byte size) {
tclacClimate::dataShow(1,0);
}
// Преобразование байта в читабельнывй формат
// Преобразование байта в читабельный формат
String tclacClimate::getHex(byte *message, byte size) {
String raw;
for (int i = 0; i < size; i++) {
@@ -652,6 +695,11 @@ void tclacClimate::set_supported_swing_modes(const std::set<climate::ClimateSwin
this->supported_swing_modes_ = modes;
}
void tclacClimate::set_supported_presets(const std::set<climate::ClimatePreset> &presets) {
this->supported_presets_ = presets;
}
// Заготовки функций запроса состояния, может пригодиться в будущем, если делать обратную связь. Очень не хочется, будет очень костыльно.
//bool tclacClimate::get_beeper_state() const { return this->beeper_status_; }

View File

@@ -156,12 +156,14 @@ class tclacClimate : public climate::Climate, public esphome::uart::UARTDevice,
GPIOPin *tx_led_pin_;
ClimateTraits traits() override;
std::set<ClimateMode> supported_modes_{};
std::set<ClimatePreset> supported_presets_{};
AirflowVerticalDirection vertical_direction_;
std::set<ClimateFanMode> supported_fan_modes_{};
AirflowHorizontalDirection horizontal_direction_;
VerticalSwingDirection vertical_swing_direction_;
std::set<ClimateSwingMode> supported_swing_modes_{};
HorizontalSwingDirection horizontal_swing_direction_;
};
}