From 84516b80f609ff7f41fed89fd143a18cc7542200 Mon Sep 17 00:00:00 2001 From: I-am-nightingale Date: Thu, 11 Apr 2024 16:39:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B7=D0=B0=D0=B4=D0=B5=D0=BB=20=D0=BD=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=20=D0=BF=D1=80=D0=B8=D0=BD=D1=83=D0=B4=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/tclac/automation.h | 20 ++++++++++++++++++++ components/tclac/climate.py | 19 ++++++++++++++++++- components/tclac/tclac.cpp | 11 +++++++++++ components/tclac/tclac.h | 10 ++++++---- packages/core.yaml | 28 ++++++++++++++++++++++------ 5 files changed, 77 insertions(+), 11 deletions(-) diff --git a/components/tclac/automation.h b/components/tclac/automation.h index d55547c..88ee1a5 100644 --- a/components/tclac/automation.h +++ b/components/tclac/automation.h @@ -110,5 +110,25 @@ template class ModuleDisplayOffAction : public Action { tclacClimate *parent_; }; +// Шаблон действия: включение принудительного применения настроек +template class ForceOnAction : public Action { + public: + ForceOnAction(tclacClimate *parent) : parent_(parent) {} + void play(Ts... x) { this->parent_->set_force_mode_state(true); } + + protected: + tclacClimate *parent_; +}; + +// Шаблон действия: выключение принудительного применения настроек +template class ForceOffAction : public Action { + public: + ForceOffAction(tclacClimate *parent) : parent_(parent) {} + void play(Ts... x) { this->parent_->set_force_mode_state(false); } + + protected: + tclacClimate *parent_; +}; + } // namespace tclac } // namespace esphome diff --git a/components/tclac/climate.py b/components/tclac/climate.py index 0a1df5a..aded06d 100644 --- a/components/tclac/climate.py +++ b/components/tclac/climate.py @@ -25,6 +25,7 @@ DEPENDENCIES = ["climate", "uart"] CONF_RX_LED = "rx_led" CONF_TX_LED = "tx_led" CONF_DISPLAY = "show_display" +CONF_FORCE_MODE = "force_mode" CONF_MODULE_DISPLAY = "show_module_display" CONF_VERTICAL_AIRFLOW = "vertical_airflow" CONF_HORIZONTAL_AIRFLOW = "horizontal_airflow" @@ -104,6 +105,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_DISPLAY, default=True): cv.boolean, cv.Optional(CONF_RX_LED): pins.gpio_output_pin_schema, cv.Optional(CONF_TX_LED): pins.gpio_output_pin_schema, + cv.Optional(CONF_FORCE_MODE, default=True): cv.boolean, cv.Optional(CONF_MODULE_DISPLAY, default=True): cv.boolean, 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)), @@ -114,7 +116,8 @@ CONFIG_SCHEMA = cv.All( .extend(cv.COMPONENT_SCHEMA) ) - +ForceOnAction = tclac_ns.class_("ForceOnAction", automation.Action) +ForceOffAction = tclac_ns.class_("ForceOffAction", automation.Action) BeeperOnAction = tclac_ns.class_("BeeperOnAction", automation.Action) BeeperOffAction = tclac_ns.class_("BeeperOffAction", automation.Action) DisplayOnAction = tclac_ns.class_("DisplayOnAction", automation.Action) @@ -163,6 +166,18 @@ async def module_display_action_to_code(config, action_id, template_arg, args): paren = await cg.get_variable(config[CONF_ID]) var = cg.new_Pvariable(action_id, template_arg, paren) return var + +# Регистрация событий включения и отключения принудительного применения настроек +@automation.register_action( + "climate.tclac.force_mode_on", ForceOnAction, cv.Schema +) +@automation.register_action( + "climate.tclac.force_mode_off", ForceOffAction, cv.Schema +) +async def force_mode_action_to_code(config, action_id, template_arg, args): + paren = await cg.get_variable(config[CONF_ID]) + var = cg.new_Pvariable(action_id, template_arg, paren) + return var # Регистрация события установки вертикальной фиксации заслонки @automation.register_action( @@ -253,6 +268,8 @@ def to_code(config): cg.add(var.set_beeper_state(config[CONF_BEEPER])) if CONF_DISPLAY in config: cg.add(var.set_display_state(config[CONF_DISPLAY])) + if CONF_FORCE_MODE in 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_MODULE_DISPLAY in config: diff --git a/components/tclac/tclac.cpp b/components/tclac/tclac.cpp index 98d983a..34aa315 100644 --- a/components/tclac/tclac.cpp +++ b/components/tclac/tclac.cpp @@ -516,6 +516,7 @@ void tclacClimate::control(const ClimateCall &call) { tclacClimate::sendData(dataTX, sizeof(dataTX)); } + // Отправка данных в кондиционер void tclacClimate::sendData(byte * message, byte size) { tclacClimate::dataShow(1,1); @@ -525,6 +526,7 @@ void tclacClimate::sendData(byte * message, byte size) { ESP_LOGD("TCL", "Message to TCL sended..."); tclacClimate::dataShow(1,0); } + // Преобразование байта в читабельнывй формат String tclacClimate::getHex(byte *message, byte size) { String raw; @@ -534,6 +536,7 @@ String tclacClimate::getHex(byte *message, byte size) { raw.toUpperCase(); return raw; } + // Вычисление контрольной суммы byte tclacClimate::getChecksum(const byte * message, size_t size) { byte position = size - 1; @@ -542,6 +545,7 @@ byte tclacClimate::getChecksum(const byte * message, size_t size) { crc ^= message[i]; return crc; } + // Мигаем светодиодами void tclacClimate::dataShow(bool flow, bool shine) { if (module_display_status_){ @@ -580,6 +584,13 @@ void tclacClimate::set_beeper_state(bool state) { void tclacClimate::set_display_state(bool state) { this->display_status_ = state; } + +// Получение состояния режима принудительного применения настроек +void tclacClimate::set_force_mode_state(bool state) { + this->force_mode_status_ = state; +} + + // Получение пина светодиода приема данных #ifdef CONF_RX_LED void tclacClimate::set_rx_led_pin(GPIOPin *rx_led_pin) { diff --git a/components/tclac/tclac.h b/components/tclac/tclac.h index 59898ca..62dc3b7 100644 --- a/components/tclac/tclac.h +++ b/components/tclac/tclac.h @@ -101,6 +101,7 @@ class tclacClimate : public climate::Climate, public esphome::uart::UARTDevice, // Инициализация и начальное наполнение переменных состоянй переключателей bool beeper_status_; bool display_status_; + bool force_mode_status_; bool module_display_status_; esphome::climate::ClimateTraits traits_; @@ -110,10 +111,10 @@ class tclacClimate : public climate::Climate, public esphome::uart::UARTDevice, checksum = 0; } - void setup() override; - void loop() override; - void update() override; void readData(); + void loop() override; + void setup() override; + void update() override; void dataShow(bool flow, bool shine); void sendData(byte * message, byte size); static String getHex(byte *message, byte size); @@ -130,8 +131,9 @@ class tclacClimate : public climate::Climate, public esphome::uart::UARTDevice, //VerticalSwingDirection tclacClimate::get_vertical_swing_direction() const; //HorizontalSwingDirection tclacClimate::get_horizontal_swing_direction() const; - void set_beeper_state(bool state); + void set_beeper_state(bool state); void set_display_state(bool state); + void set_force_mode_state(bool state); void set_rx_led_pin(GPIOPin *rx_led_pin); void set_tx_led_pin(GPIOPin *tx_led_pin); void set_module_display_state(bool state); diff --git a/packages/core.yaml b/packages/core.yaml index bba9739..8f0e73a 100644 --- a/packages/core.yaml +++ b/packages/core.yaml @@ -168,6 +168,22 @@ switch: then: lambda: !lambda |- id(${device_name}climate).set_module_display_state(false); + + - name: Force config + platform: template + device_class: switch + id: force_mode + entity_category: config + restore_mode: RESTORE_DEFAULT_ON + optimistic: true + on_turn_on: + then: + lambda: !lambda |- + id(${device_name}climate).set_force_mode(true); + on_turn_off: + then: + lambda: !lambda |- + id(${device_name}climate).set_force_mode(false); # - Выпадающие списки select: @@ -224,12 +240,12 @@ select: id: vfixing entity_category: config options: - - Last - - Max_Up - - Up - - Center - - Down - - Max_Down + - "Последнее положение" + - "До упора вверх" + - "В верхней половине" + - "По середине" + - "В нижней половине" + - "До упора вниз" optimistic: true restore_value: true set_action: