Mirror status fixes into bundled component
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user