diff --git a/components/tclac/climate.py b/components/tclac/climate.py index 1286364..1a610a9 100644 --- a/components/tclac/climate.py +++ b/components/tclac/climate.py @@ -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: diff --git a/components/tclac/tclac.cpp b/components/tclac/tclac.cpp index 875e714..cf6f13c 100644 --- a/components/tclac/tclac.cpp +++ b/components/tclac/tclac.cpp @@ -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::setsupported_swing_modes_ = modes; } + +void tclacClimate::set_supported_presets(const std::set &presets) { + this->supported_presets_ = presets; +} + // Заготовки функций запроса состояния, может пригодиться в будущем, если делать обратную связь. Очень не хочется, будет очень костыльно. //bool tclacClimate::get_beeper_state() const { return this->beeper_status_; } diff --git a/components/tclac/tclac.h b/components/tclac/tclac.h index 153b631..aa83a24 100644 --- a/components/tclac/tclac.h +++ b/components/tclac/tclac.h @@ -156,12 +156,14 @@ class tclacClimate : public climate::Climate, public esphome::uart::UARTDevice, GPIOPin *tx_led_pin_; ClimateTraits traits() override; std::set supported_modes_{}; + std::set supported_presets_{}; AirflowVerticalDirection vertical_direction_; std::set supported_fan_modes_{}; AirflowHorizontalDirection horizontal_direction_; VerticalSwingDirection vertical_swing_direction_; std::set supported_swing_modes_{}; HorizontalSwingDirection horizontal_swing_direction_; + }; }