From 2c94ac27395b07f450d546b52ec8a77bebf187c5 Mon Sep 17 00:00:00 2001 From: christoph Date: Wed, 17 Dec 2025 15:41:27 +0100 Subject: [PATCH] Mirror status fixes into bundled component --- components/tclac/tclac.cpp | 82 ++++++++++++++++---------------------- components/tclac/tclac.h | 3 +- 2 files changed, 36 insertions(+), 49 deletions(-) diff --git a/components/tclac/tclac.cpp b/components/tclac/tclac.cpp index 6389ad2..ff1a8c6 100644 --- a/components/tclac/tclac.cpp +++ b/components/tclac/tclac.cpp @@ -63,7 +63,6 @@ void tclacClimate::setup() { } void tclacClimate::loop() { - // Если в буфере UART что-то есть, то читаем это что-то if (esphome::uart::UARTDevice::available() > 0) { dataShow(0, true); size_t skipped = 0; @@ -75,7 +74,7 @@ void tclacClimate::loop() { header_found = true; break; } - skipped++; + skipped += 1; } if (!header_found) { if (skipped > 0) @@ -85,7 +84,6 @@ void tclacClimate::loop() { } if (skipped > 0) ESP_LOGV("TCL", "Resynced after skipping %u byte(s)", (unsigned) skipped); - // А вот если совпал заголовок (0xBB), то начинаем чтение по цепочке еще 4 байт delay(5); dataRX[1] = esphome::uart::UARTDevice::read(); delay(5); @@ -95,12 +93,6 @@ void tclacClimate::loop() { delay(5); dataRX[4] = esphome::uart::UARTDevice::read(); - //auto raw = getHex(dataRX, 5); - - //ESP_LOGD("TCL", "first 5 byte : %s ", raw.c_str()); - - // Из первы - // 5 байт нам нужен пятый- он содержит длину сообщения size_t payload_with_checksum = static_cast(dataRX[4]) + 1; size_t frame_size = payload_with_checksum + 5; if (frame_size > sizeof(dataRX)) { @@ -111,18 +103,10 @@ void tclacClimate::loop() { esphome::uart::UARTDevice::read_array(dataRX + 5, payload_with_checksum); uint8_t check = getChecksum(dataRX, frame_size); - - //raw = getHex(dataRX, sizeof(dataRX)); - - //ESP_LOGD("TCL", "RX full : %s ", raw.c_str()); - - // Проверяем контрольную сумму if (check != dataRX[frame_size - 1]) { ESP_LOGD("TCL", "Invalid checksum %x", check); tclacClimate::dataShow(0,0); return; - } else { - //ESP_LOGD("TCL", "checksum OK %x", check); } tclacClimate::dataShow(0,0); uint8_t frame_type = dataRX[3]; @@ -130,8 +114,10 @@ void tclacClimate::loop() { ESP_LOGV("TCL", "Ignoring frame type 0x%02X", frame_type); return; } - // Прочитав все из буфера приступаем к разбору данны - + if (frame_size < TCL_STATUS_FRAME_MIN_SIZE) { + ESP_LOGV("TCL", "Ignoring short status frame (%u bytes)", (unsigned) frame_size); + return; + } tclacClimate::readData(); } } @@ -151,7 +137,7 @@ void tclacClimate::readData() { //ESP_LOGD("TCL", "TEMP: %f ", current_temperature); - bool device_is_on = (dataRX[MODE_POS] & MODE_POWER_FLAG) != 0; + bool device_is_on = (dataRX[MODE_POS] & MODE_STATUS_POWER_FLAG) != 0; if (device_is_on) { // Если кондиционер включен, то разбираем данные для отображения // ESP_LOGD("TCL", "AC is on"); @@ -223,7 +209,7 @@ void tclacClimate::readData() { break; } - // Обработка данны + // Обработка данны preset = ClimatePreset::CLIMATE_PRESET_NONE; if (dataRX[7] & (1 << 6)){ preset = ClimatePreset::CLIMATE_PRESET_ECO; @@ -311,7 +297,7 @@ void tclacClimate::takeControl() { target_temperature_set = 31-(int)target_temperature; } - // Включаем или отключаем пищалку в зависимости от переключателя в настройка + // Включаем или отключаем пищалку в зависимости от переключателя в настройка if (beeper_status_){ ESP_LOGD("TCL", "Beep mode ON"); @@ -321,11 +307,11 @@ void tclacClimate::takeControl() { dataTX[7] += 0b00000000; } - // Включаем или отключаем дисплей на кондиционере в зависимости от переключателя в настройка + // Включаем или отключаем дисплей на кондиционере в зависимости от переключателя в настройка - // Включаем дисплей только если кондиционер в одном из рабочи + // Включаем дисплей только если кондиционер в одном из рабочи - // ВНИМАНИЕ! При выключении дисплея кондиционер сам принудительно пере + // ВНИМАНИЕ! При выключении дисплея кондиционер сам принудительно пере // одит в автоматический режим! if ((display_status_) && (switch_climate_mode != climate::CLIMATE_MODE_OFF)){ @@ -343,23 +329,23 @@ void tclacClimate::takeControl() { dataTX[8] += 0b00000000; break; case climate::CLIMATE_MODE_AUTO: - dataTX[7] += MODE_POWER_FLAG; + dataTX[7] += MODE_COMMAND_POWER_FLAG; dataTX[8] += 0b00001000; break; case climate::CLIMATE_MODE_COOL: - dataTX[7] += MODE_POWER_FLAG; + dataTX[7] += MODE_COMMAND_POWER_FLAG; dataTX[8] += 0b00000011; break; case climate::CLIMATE_MODE_DRY: - dataTX[7] += MODE_POWER_FLAG; + dataTX[7] += MODE_COMMAND_POWER_FLAG; dataTX[8] += 0b00000010; break; case climate::CLIMATE_MODE_FAN_ONLY: - dataTX[7] += MODE_POWER_FLAG; + dataTX[7] += MODE_COMMAND_POWER_FLAG; dataTX[8] += 0b00000111; break; case climate::CLIMATE_MODE_HEAT: - dataTX[7] += MODE_POWER_FLAG; + dataTX[7] += MODE_COMMAND_POWER_FLAG; dataTX[8] += 0b00000001; break; } @@ -441,30 +427,30 @@ void tclacClimate::takeControl() { // 000 - Качание отключено, заслонка в последней позиции или в фиксации // 111 - Качание включено в выбранном режиме // Режим качания вертикальной заслонки (режим фиксации заслонки роли не играет, если качание включено) [32 байт, маска 00011000]: - // 01 - качание свер + // 01 - качание свер // у вниз, ПО УМОЛЧАНИЮ - // 10 - качание в вер + // 10 - качание в вер // ней половине // 11 - качание в нижней половине // Режим фиксации заслонки (режим качания заслонки роли не играет, если качание выключено) [32 байт, маска 00000111]: // 000 - нет фиксации, ПО УМОЛЧАНИЮ - // 001 - фиксация ввер + // 001 - фиксация ввер // у - // 010 - фиксация между вер + // 010 - фиксация между вер // ом и серединой // 011 - фиксация в середине // 100 - фиксация между серединой и низом // 101 - фиксация внизу // Горизонтальные заслонки - // Качание горизонтальны + // Качание горизонтальны // 0 - Качание отключено, заслонки в последней позиции или в фиксации // 1 - Качание включено в выбранном режиме - // Режим качания горизонтальны + // Режим качания горизонтальны // 001 - качание слева направо, ПО УМОЛЧАНИЮ // 010 - качание слева // 011 - качание по середине // 100 - качание справа - // Режим фиксации горизонтальны + // Режим фиксации горизонтальны // 000 - нет фиксации, ПО УМОЛЧАНИЮ // 001 - фиксация слева // 010 - фиксация между левой стороной и серединой @@ -488,7 +474,7 @@ void tclacClimate::takeControl() { ESP_LOGD("TCL", "Vertical swing: downer"); break; } - // Устанавливаем режим для качания горизонтальны + // Устанавливаем режим для качания горизонтальны switch(horizontal_swing_direction_) { case HorizontalSwingDirection::LEFT_RIGHT: dataTX[33] += 0b00001000; @@ -534,7 +520,7 @@ void tclacClimate::takeControl() { ESP_LOGD("TCL", "Vertical fix: down"); break; } - // Устанавливаем положение фиксации горизонтальны + // Устанавливаем положение фиксации горизонтальны switch(horizontal_direction_) { case AirflowHorizontalDirection::LAST: dataTX[33] += 0b00000000; @@ -610,7 +596,7 @@ void tclacClimate::takeControl() { is_call_control = false; } -// Отправка данны +// Отправка данны void tclacClimate::sendData(uint8_t * message, uint8_t size) { tclacClimate::dataShow(1,1); //Serial.write(message, size); @@ -698,14 +684,14 @@ void tclacClimate::set_display_state(bool 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) { this->rx_led_pin_ = rx_led_pin; } #endif -// Получение пина светодиода передачи данны +// Получение пина светодиода передачи данны #ifdef CONF_TX_LED void tclacClimate::set_tx_led_pin(GPIOPin *tx_led_pin) { @@ -725,7 +711,7 @@ void tclacClimate::set_vertical_airflow(AirflowVerticalDirection direction) { } } } -// Получение режима фиксации горизонтальны +// Получение режима фиксации горизонтальны void tclacClimate::set_horizontal_airflow(AirflowHorizontalDirection direction) { this->horizontal_direction_ = direction; if (force_mode_status_){ @@ -743,11 +729,11 @@ void tclacClimate::set_vertical_swing_direction(VerticalSwingDirection direction } } } -// Получение доступны +// Получение доступны void tclacClimate::set_supported_modes(const std::set &modes) { this->supported_modes_ = modes; } -// Получение режима качания горизонтальны +// Получение режима качания горизонтальны void tclacClimate::set_horizontal_swing_direction(HorizontalSwingDirection direction) { horizontal_swing_direction_ = direction; if (force_mode_status_){ @@ -756,15 +742,15 @@ void tclacClimate::set_horizontal_swing_direction(HorizontalSwingDirection direc } } } -// Получение доступны +// Получение доступны void tclacClimate::set_supported_fan_modes(const std::set &modes){ this->supported_fan_modes_ = modes; } -// Получение доступны +// Получение доступны void tclacClimate::set_supported_swing_modes(const std::set &modes) { this->supported_swing_modes_ = modes; } -// Получение доступны +// Получение доступны void tclacClimate::set_supported_presets(const std::set &presets) { this->supported_presets_ = presets; } diff --git a/components/tclac/tclac.h b/components/tclac/tclac.h index fbb6959..4a816a1 100644 --- a/components/tclac/tclac.h +++ b/components/tclac/tclac.h @@ -28,7 +28,8 @@ using byte = uint8_t; #define MODE_POS 7 #define MODE_MASK 0b00111111 -#define MODE_POWER_FLAG 0b00000100 +#define MODE_STATUS_POWER_FLAG 0b00010000 +#define MODE_COMMAND_POWER_FLAG 0b00000100 #define MODE_AUTO 0b00110101 #define MODE_COOL 0b00110001