Mirror status fixes into bundled component

This commit is contained in:
christoph
2025-12-17 15:41:27 +01:00
parent 3f9c49d28f
commit 2c94ac2739
2 changed files with 36 additions and 49 deletions

View File

@@ -63,7 +63,6 @@ void tclacClimate::setup() {
}
void tclacClimate::loop() {
// ЕÑ<E280A2>ли в буфере UART что-то еÑ<C2B5>ÑÑŒ, то читаем Ñ<>Ñо что-то
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);
// Ð<> вот еÑ<C2B5>ли Ñ<>овпал заголовок (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 байт нам нужен пÑ<C2BF>ÑÑй- он Ñ<>Ð¾Ð´ÐµÑ€Ð¶Ð¸Ñ Ð´Ð»Ð¸Ð½Ñƒ Ñ<>ообщениÑ<C2B8>
size_t payload_with_checksum = static_cast<size_t>(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());
// ПроверÑ<E282AC>ем контрольную Ñ<>умму
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;
}
// Прочитав вÑ<C2B2>е из буфера приÑ<C2B8>Ñупаем к разбору данныÑ
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;
}
// Включаем или отключаем пищалку в завиÑ<C2B8>имоÑ<C2BE>Ñи от переключаÑелÑ<C2BB> в наÑ<C2B0>ÑройкаÑ
// Включаем или отключаем пищалку в зависимости от переключателя в настройка
if (beeper_status_){
ESP_LOGD("TCL", "Beep mode ON");
@@ -321,11 +307,11 @@ void tclacClimate::takeControl() {
dataTX[7] += 0b00000000;
}
// Включаем или отключаем диÑ<C2B8>плей на кондиционере в завиÑ<C2B8>имоÑ<C2BE>Ñи от переключаÑелÑ<C2BB> в наÑ<C2B0>ÑройкаÑ
// Включаем или отключаем дисплей на кондиционере в зависимости от переключателя в настройка
// Включаем диÑ<C2B8>плей только еÑ<C2B5>ли кондиционер в одном из рабочиÑ
// Включаем дисплей только если кондиционер в одном из рабочи
// ÐÐ<EFBFBD>ИМÐ<EFBFBD>Ð<EFBFBD>ИЕ! При выключении диÑ<C2B8>плеÑ<C2B5> кондиционер Ñ<>ам принудительно переÑ
// ВНИМАНИЕ! При выключении дисплея кондиционер сам принудительно пере
// одит в автоматический режим!
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 - фикÑ<EFBFBD>ациÑ<EFBFBD> вверÑ
// 001 - фиксация ввер
// у
// 010 - фикÑ<EFBFBD>ациÑ<EFBFBD> между верÑ
// 010 - фиксация между вер
// ом и серединой
// 011 - фиксация в середине
// 100 - фиксация между серединой и низом
// 101 - фиксация внизу
// Горизонтальные заслонки
// Качание горизонтальныÑ
// Качание горизонтальны
// 0 - Качание отключено, заслонки в последней позиции или в фиксации
// 1 - Качание включено в выбранном режиме
// Режим качаниÑ<C2B8> горизонтальныÑ
// Режим качания горизонтальны
// 001 - качание слева направо, ПО УМОЛЧАНИЮ
// 010 - качание слева
// 011 - качание по середине
// 100 - качание справа
// Режим фикÑ<C2BA>ации горизонтальныÑ
// Режим фиксации горизонтальны
// 000 - нет фиксации, ПО УМОЛЧАНИЮ
// 001 - фиксация слева
// 010 - фиксация между левой стороной и серединой
@@ -488,7 +474,7 @@ void tclacClimate::takeControl() {
ESP_LOGD("TCL", "Vertical swing: downer");
break;
}
// УÑ<EFBFBD>Ñанавливаем режим длÑ<C2BB> качаниÑ<C2B8> горизонтальныÑ
// Устанавливаем режим для качания горизонтальны
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;
}
// УÑ<EFBFBD>Ñанавливаем положение фикÑ<C2BA>ации горизонтальныÑ
// Устанавливаем положение фиксации горизонтальны
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) {
}
}
}
// Получение режима фикÑ<C2BA>ации горизонтальныÑ
// Получение режима фиксации горизонтальны
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
}
}
}
// Получение доÑ<C2BE>ÑупнÑÑ
// Получение доступны
void tclacClimate::set_supported_modes(const std::set<climate::ClimateMode> &modes) {
this->supported_modes_ = modes;
}
// Получение режима качаниÑ<C2B8> горизонтальныÑ
// Получение режима качания горизонтальны
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
}
}
}
// Получение доÑ<C2BE>ÑупнÑÑ
// Получение доступны
void tclacClimate::set_supported_fan_modes(const std::set<climate::ClimateFanMode> &modes){
this->supported_fan_modes_ = modes;
}
// Получение доÑ<C2BE>ÑупнÑÑ
// Получение доступны
void tclacClimate::set_supported_swing_modes(const std::set<climate::ClimateSwingMode> &modes) {
this->supported_swing_modes_ = modes;
}
// Получение доÑ<C2BE>ÑупнÑÑ
// Получение доступны
void tclacClimate::set_supported_presets(const std::set<climate::ClimatePreset> &presets) {
this->supported_presets_ = presets;
}

View File

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