Добавлена поддержка пресетов
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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_; }
|
||||
|
||||
@@ -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_;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user