Добавлен задел на переключатель принудительного применения настроек

This commit is contained in:
I-am-nightingale
2024-04-11 16:39:08 +03:00
parent 2b8727bc57
commit 84516b80f6
5 changed files with 77 additions and 11 deletions

View File

@@ -110,5 +110,25 @@ template<typename... Ts> class ModuleDisplayOffAction : public Action<Ts...> {
tclacClimate *parent_;
};
// Шаблон действия: включение принудительного применения настроек
template<typename... Ts> class ForceOnAction : public Action<Ts...> {
public:
ForceOnAction(tclacClimate *parent) : parent_(parent) {}
void play(Ts... x) { this->parent_->set_force_mode_state(true); }
protected:
tclacClimate *parent_;
};
// Шаблон действия: выключение принудительного применения настроек
template<typename... Ts> class ForceOffAction : public Action<Ts...> {
public:
ForceOffAction(tclacClimate *parent) : parent_(parent) {}
void play(Ts... x) { this->parent_->set_force_mode_state(false); }
protected:
tclacClimate *parent_;
};
} // namespace tclac
} // namespace esphome

View File

@@ -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:

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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: