diff --git a/components/aux_ac/aux_ac.h b/components/aux_ac/aux_ac.h index 1bed9af..98308c5 100644 --- a/components/aux_ac/aux_ac.h +++ b/components/aux_ac/aux_ac.h @@ -393,12 +393,12 @@ enum ac_sleep : uint8_t { AC_SLEEP_OFF = 0x00, AC_SLEEP_ON = 0x04, AC_SLEEP_UNTO #define AC_IFEEL_MASK 0b00001000 enum ac_ifeel : uint8_t { AC_IFEEL_OFF = 0x00, AC_IFEEL_ON = 0x08, AC_IFEEL_UNTOUCHED = 0xFF }; -// Вертикальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но додлжна быть такая возможность на уровне железа. +// Вертикальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа. // TODO: надо протестировать значения 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 для ac_louver_V #define AC_LOUVERV_MASK 0b00000111 enum ac_louver_V : uint8_t { AC_LOUVERV_SWING_UPDOWN = 0x00, AC_LOUVERV_OFF = 0x07, AC_LOUVERV_UNTOUCHED = 0xFF }; -// Горизонтальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но додлжна быть такая возможность на уровне железа. +// Горизонтальные жалюзи. В протоколе зашита возможность двигать ими по всякому, но должна быть такая возможность на уровне железа. // TODO: надо протестировать значения 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0 для ac_louver_H #define AC_LOUVERH_MASK 0b11100000 enum ac_louver_H : uint8_t { AC_LOUVERH_SWING_LEFTRIGHT = 0x00, AC_LOUVERH_OFF = 0xE0, AC_LOUVERH_UNTOUCHED = 0xFF }; @@ -1993,7 +1993,8 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { if (_current_ac_state.power == AC_POWER_ON){ switch (_current_ac_state.mode) { case AC_MODE_AUTO: - this->mode = climate::CLIMATE_MODE_HEAT_COOL; // по факту режим, названный в AUX как AUTO, является режимом HEAT_COOL + // по факту режим, названный в AUX как AUTO, является режимом HEAT_COOL + this->mode = climate::CLIMATE_MODE_HEAT_COOL; break; case AC_MODE_COOL: @@ -2049,8 +2050,8 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { _debugMsg(F("Climate fan mode: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, this->fan_mode); /*************************** TURBO FAN MODE ***************************/ - // TURBO работает только в режимах COOL и HEAT - // TODO: проверку на это несовместимые режимы пока выпилили, т.к. нет уверенности, что это поведение одинаково для всех + // TURBO работает в режимах FAN, COOL, HEAT, HEAT_COOL + // в режиме DRY изменение скорости вентилятора никак не влияло на его скорость, может сплит просто не вышел еще на режим? Надо попробовать долгую работу в этом режиме. switch (_current_ac_state.fanTurbo) { case AC_FANTURBO_ON: //if ((_current_ac_state.mode == AC_MODE_HEAT) || (_current_ac_state.mode == AC_MODE_COOL)) { @@ -2067,7 +2068,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { _debugMsg(F("Climate fan TURBO mode: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.fanTurbo); /*************************** MUTE FAN MODE ***************************/ - // MUTE работает только в режиме FAN. В режиме COOL кондей команду принимает, но MUTE не устанавливается + // MUTE работает в режиме FAN. В режимах HEAT, COOL, HEAT_COOL не работает. DRY не проверял. // TODO: проверку на это несовместимые режимы пока выпилили, т.к. нет уверенности, что это поведение одинаково для всех switch (_current_ac_state.fanMute) { case AC_FANMUTE_ON: @@ -2085,7 +2086,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { _debugMsg(F("Climate fan MUTE mode: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.fanMute); //======================== ОТОБРАЖЕНИЕ ПРЕСЕТОВ ================================ - /*************************** iFEEL CUSTOM PRESET ***************************/ // режим поддержки температуры в районе пульта, работает только при включенном конедее if( _current_ac_state.iFeel == AC_IFEEL_ON && @@ -2190,15 +2190,12 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { /*************************** LOUVERs ***************************/ this->swing_mode = climate::CLIMATE_SWING_OFF; if( _current_ac_state.power == AC_POWER_ON) { - if (_current_ac_state.louver.louver_h == AC_LOUVERH_SWING_LEFTRIGHT){ + if ( _current_ac_state.louver.louver_h == AC_LOUVERH_SWING_LEFTRIGHT && _current_ac_state.louver.louver_v == AC_LOUVERV_OFF ){ this->swing_mode = climate::CLIMATE_SWING_HORIZONTAL; - } - if (_current_ac_state.louver.louver_v == AC_LOUVERV_SWING_UPDOWN){ - if (_current_ac_state.louver.louver_h == AC_LOUVERH_SWING_LEFTRIGHT){ - this->swing_mode = climate::CLIMATE_SWING_BOTH; - } else { - this->swing_mode = climate::CLIMATE_SWING_VERTICAL; - } + } else if ( _current_ac_state.louver.louver_h == AC_LOUVERH_OFF && _current_ac_state.louver.louver_v == AC_LOUVERV_SWING_UPDOWN ){ + this->swing_mode = climate::CLIMATE_SWING_VERTICAL; + } else if ( _current_ac_state.louver.louver_h == AC_LOUVERH_SWING_LEFTRIGHT && _current_ac_state.louver.louver_v == AC_LOUVERV_SWING_UPDOWN ){ + this->swing_mode = climate::CLIMATE_SWING_BOTH; } } @@ -2206,7 +2203,8 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { /*************************** TEMPERATURE ***************************/ if(_current_ac_state.mode == AC_MODE_FAN || _current_ac_state.power == AC_POWER_OFF){ - this->target_temperature = _current_ac_state.temp_ambient; // в режиме вентилятора и в выключенном состоянии будем показывать текущую температуру + // в режиме вентилятора и в выключенном состоянии будем показывать текущую температуру + this->target_temperature = _current_ac_state.temp_ambient; } else if (_current_ac_state.mode == AC_MODE_AUTO ){ this->target_temperature = 25; // в AUTO зашита температура 25 градусов } else { @@ -2788,7 +2786,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { // User requested target temperature change if (call.get_target_temperature().has_value()) { // выставлять температуру в режиме FAN не нужно - if ( cmd.fanSpeed != AC_FANSPEED_AUTO && _current_ac_state.fanSpeed != AC_FANSPEED_AUTO ) { + if ( cmd.mode != AC_MODE_FAN && _current_ac_state.mode != AC_MODE_FAN ) { hasCommand = true; float temp = *call.get_target_temperature(); // Send target temp to climate diff --git a/tests/ac_send_packet_for_engineer.py b/tests/ac_send_packet_for_engineer.py index ccc1571..afd4380 100644 --- a/tests/ac_send_packet_for_engineer.py +++ b/tests/ac_send_packet_for_engineer.py @@ -81,12 +81,65 @@ async def main(): if isDallasLog: log_Dallas(isDallasLog) + async def display_off(): + await api.execute_service( + service, + data={ + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + "data_buf": [0xBB, 0x00, 0x06, 0x80, 0x01, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00], + } + ) + + async def display_on(): + await api.execute_service( + service, + data={ + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + "data_buf": [0xBB, 0x00, 0x06, 0x80, 0x01, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00], + } + ) + + async def ac_enable(): + await api.execute_service( + service, + data={ + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + "data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x19, 0x60, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00], + } + ) + + async def ac_disable(): + await api.execute_service( + service, + data={ + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + "data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x19, 0x60, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + } + ) + + async def ac_set_vlouver(lvr): + await api.execute_service( + service, + data={ + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + "data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, lvr, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00], + } + ) + + async def ac_set_hlouver(lvr): + await api.execute_service( + service, + data={ + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + "data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, lvr, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00], + } + ) # Subscribe to the log # await api.subscribe_logs(log_callback, LOG_LEVEL_DEBUG) # print(await api.device_info()) - print(f"%s" % (await api.list_entities_services(),)) + # print(f"%s" % (await api.list_entities_services(),)) # key надо искать в выводе list_entities_services service = aioesphomeapi.UserService( @@ -97,23 +150,57 @@ async def main(): ], ) - await api.execute_service( - service, - data={ - # display off - "data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x7F, 0xE0, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00], - } - ) + #await ac_set_vlouver( 0b10010000 ) # swing on + #await ac_set_vlouver( 0b10010111 ) # swing off + #await ac_set_vlouver( 0b10010001 ) # 1 + #await ac_set_vlouver( 0b10010010 ) # 2 + #await ac_set_vlouver( 0b10010011 ) # 3 + #await ac_set_vlouver( 0b10010100 ) # 4 + #await ac_set_vlouver( 0b10010101 ) # 5 + #await ac_set_vlouver( 0b10010110 ) # не работает, сбрасывает на swing on + #time.sleep(5) - time.sleep(3) + #await ac_set_hlouver( 0b00000000 ) # swing on + #await ac_set_hlouver( 0b11100000 ) # swing off + #await ac_set_hlouver( 0b00100000 ) # не работает, сбрасывает в swing off + #await ac_set_hlouver( 0b01000000 ) # не работает, сбрасывает в swing off + #await ac_set_hlouver( 0b01100000 ) # не работает, сбрасывает в swing off + #await ac_set_hlouver( 0b10000000 ) # не работает, сбрасывает в swing off + #await ac_set_hlouver( 0b10100000 ) # не работает, сбрасывает в swing off + #await ac_set_hlouver( 0b11000000 ) # не работает, сбрасывает в swing off + #time.sleep(5) + + async def test_byte(bt): + await api.execute_service( + service, + data={ + #display on + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + #"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00], + #display off + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + "data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00], + # swing on + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + #"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x90, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00], + # swing off + # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + #"data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x97, 0xE0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00], + } + ) + ''' + не проходит команда, если байт 1 или 7 не 0x00 + не проходит команда, если байт 3 не 0x80 + + проходит и не меняется, если меняю байт 4 или 5 + ''' + + #await test_byte(0b10000110) + #await test_byte(0b01000110) + #await test_byte(0b00100110) + #await test_byte(0b00010110) + time.sleep(2) - await api.execute_service( - service, - data={ - # display on - "data_buf": [0xBB, 0x00, 0x06, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x01, 0x7F, 0xE0, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], - } - ) parser = createParser() namespace = parser.parse_args()