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() {
// Если в буфере 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());
// Из первы<D0B2>
// 5 байт нам нужен пятый- он содержит длину сообщения
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());
// Проверяем контрольную сумму
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;
}
// Прочитав все из буфера приступаем к разбору данны<D0BD>
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;
}
// Обработка данны<EFBFBD>
// Обработка данны
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;
}
// Включаем или отключаем пищалку в зависимости от переключателя в настройка<EFBFBD>
// Включаем или отключаем пищалку в зависимости от переключателя в настройка
if (beeper_status_){
ESP_LOGD("TCL", "Beep mode ON");
@@ -321,11 +307,11 @@ void tclacClimate::takeControl() {
dataTX[7] += 0b00000000;
}
// Включаем или отключаем дисплей на кондиционере в зависимости от переключателя в настройка<EFBFBD>
// Включаем или отключаем дисплей на кондиционере в зависимости от переключателя в настройка
// Включаем дисплей только если кондиционер в одном из рабочи<EFBFBD>
// Включаем дисплей только если кондиционер в одном из рабочи
// ВНИМАНИЕ! При выключении дисплея кондиционер сам принудительно пере<EFBFBD>
// ВНИМАНИЕ! При выключении дисплея кондиционер сам принудительно пере
// одит в автоматический режим!
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 - качание свер<EFBFBD>
// 01 - качание свер
// у вниз, ПО УМОЛЧАНИЮ
// 10 - качание в вер<EFBFBD>
// 10 - качание в вер
// ней половине
// 11 - качание в нижней половине
// Режим фиксации заслонки (режим качания заслонки роли не играет, если качание выключено) [32 байт, маска 00000111]:
// 000 - нет фиксации, ПО УМОЛЧАНИЮ
// 001 - фиксация ввер<EFBFBD>
// 001 - фиксация ввер
// у
// 010 - фиксация между вер<EFBFBD>
// 010 - фиксация между вер
// ом и серединой
// 011 - фиксация в середине
// 100 - фиксация между серединой и низом
// 101 - фиксация внизу
// Горизонтальные заслонки
// Качание горизонтальны<EFBFBD>
// Качание горизонтальны
// 0 - Качание отключено, заслонки в последней позиции или в фиксации
// 1 - Качание включено в выбранном режиме
// Режим качания горизонтальны<EFBFBD>
// Режим качания горизонтальны
// 001 - качание слева направо, ПО УМОЛЧАНИЮ
// 010 - качание слева
// 011 - качание по середине
// 100 - качание справа
// Режим фиксации горизонтальны<EFBFBD>
// Режим фиксации горизонтальны
// 000 - нет фиксации, ПО УМОЛЧАНИЮ
// 001 - фиксация слева
// 010 - фиксация между левой стороной и серединой
@@ -488,7 +474,7 @@ void tclacClimate::takeControl() {
ESP_LOGD("TCL", "Vertical swing: downer");
break;
}
// Устанавливаем режим для качания горизонтальны<EFBFBD>
// Устанавливаем режим для качания горизонтальны
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>
// Устанавливаем положение фиксации горизонтальны
switch(horizontal_direction_) {
case AirflowHorizontalDirection::LAST:
dataTX[33] += 0b00000000;
@@ -610,7 +596,7 @@ void tclacClimate::takeControl() {
is_call_control = false;
}
// Отправка данны<EFBFBD>
// Отправка данны
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;
}
// Получение пина светодиода приема данны<EFBFBD>
// Получение пина светодиода приема данны
#ifdef CONF_RX_LED
void tclacClimate::set_rx_led_pin(GPIOPin *rx_led_pin) {
this->rx_led_pin_ = rx_led_pin;
}
#endif
// Получение пина светодиода передачи данны<EFBFBD>
// Получение пина светодиода передачи данны
#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) {
}
}
}
// Получение режима фиксации горизонтальны<EFBFBD>
// Получение режима фиксации горизонтальны
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
}
}
}
// Получение доступны<EFBFBD>
// Получение доступны
void tclacClimate::set_supported_modes(const std::set<climate::ClimateMode> &modes) {
this->supported_modes_ = modes;
}
// Получение режима качания горизонтальны<EFBFBD>
// Получение режима качания горизонтальны
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
}
}
}
// Получение доступны<EFBFBD>
// Получение доступны
void tclacClimate::set_supported_fan_modes(const std::set<climate::ClimateFanMode> &modes){
this->supported_fan_modes_ = modes;
}
// Получение доступны<EFBFBD>
// Получение доступны
void tclacClimate::set_supported_swing_modes(const std::set<climate::ClimateSwingMode> &modes) {
this->supported_swing_modes_ = modes;
}
// Получение доступны<EFBFBD>
// Получение доступны
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