some tests

This commit is contained in:
GrKoR
2022-05-28 05:01:48 +03:00
parent 9e4ee7f946
commit 576c6e249e
2 changed files with 118 additions and 33 deletions

View File

@@ -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 #define AC_IFEEL_MASK 0b00001000
enum ac_ifeel : uint8_t { AC_IFEEL_OFF = 0x00, AC_IFEEL_ON = 0x08, AC_IFEEL_UNTOUCHED = 0xFF }; 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 // TODO: надо протестировать значения 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 для ac_louver_V
#define AC_LOUVERV_MASK 0b00000111 #define AC_LOUVERV_MASK 0b00000111
enum ac_louver_V : uint8_t { AC_LOUVERV_SWING_UPDOWN = 0x00, AC_LOUVERV_OFF = 0x07, AC_LOUVERV_UNTOUCHED = 0xFF }; 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 // TODO: надо протестировать значения 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0 для ac_louver_H
#define AC_LOUVERH_MASK 0b11100000 #define AC_LOUVERH_MASK 0b11100000
enum ac_louver_H : uint8_t { AC_LOUVERH_SWING_LEFTRIGHT = 0x00, AC_LOUVERH_OFF = 0xE0, AC_LOUVERH_UNTOUCHED = 0xFF }; 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){ if (_current_ac_state.power == AC_POWER_ON){
switch (_current_ac_state.mode) { switch (_current_ac_state.mode) {
case AC_MODE_AUTO: 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; break;
case AC_MODE_COOL: 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); _debugMsg(F("Climate fan mode: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, this->fan_mode);
/*************************** TURBO FAN MODE ***************************/ /*************************** TURBO FAN MODE ***************************/
// TURBO работает только в режимах COOL и HEAT // TURBO работает в режимах FAN, COOL, HEAT, HEAT_COOL
// TODO: проверку на это несовместимые режимы пока выпилили, т.к. нет уверенности, что это поведение одинаково для всех // в режиме DRY изменение скорости вентилятора никак не влияло на его скорость, может сплит просто не вышел еще на режим? Надо попробовать долгую работу в этом режиме.
switch (_current_ac_state.fanTurbo) { switch (_current_ac_state.fanTurbo) {
case AC_FANTURBO_ON: case AC_FANTURBO_ON:
//if ((_current_ac_state.mode == AC_MODE_HEAT) || (_current_ac_state.mode == AC_MODE_COOL)) { //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); _debugMsg(F("Climate fan TURBO mode: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.fanTurbo);
/*************************** MUTE FAN MODE ***************************/ /*************************** MUTE FAN MODE ***************************/
// MUTE работает только в режиме FAN. В режиме COOL кондей команду принимает, но MUTE не устанавливается // MUTE работает в режиме FAN. В режимах HEAT, COOL, HEAT_COOL не работает. DRY не проверял.
// TODO: проверку на это несовместимые режимы пока выпилили, т.к. нет уверенности, что это поведение одинаково для всех // TODO: проверку на это несовместимые режимы пока выпилили, т.к. нет уверенности, что это поведение одинаково для всех
switch (_current_ac_state.fanMute) { switch (_current_ac_state.fanMute) {
case AC_FANMUTE_ON: 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); _debugMsg(F("Climate fan MUTE mode: %i"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, _current_ac_state.fanMute);
//======================== ОТОБРАЖЕНИЕ ПРЕСЕТОВ ================================ //======================== ОТОБРАЖЕНИЕ ПРЕСЕТОВ ================================
/*************************** iFEEL CUSTOM PRESET ***************************/ /*************************** iFEEL CUSTOM PRESET ***************************/
// режим поддержки температуры в районе пульта, работает только при включенном конедее // режим поддержки температуры в районе пульта, работает только при включенном конедее
if( _current_ac_state.iFeel == AC_IFEEL_ON && if( _current_ac_state.iFeel == AC_IFEEL_ON &&
@@ -2190,15 +2190,12 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
/*************************** LOUVERs ***************************/ /*************************** LOUVERs ***************************/
this->swing_mode = climate::CLIMATE_SWING_OFF; this->swing_mode = climate::CLIMATE_SWING_OFF;
if( _current_ac_state.power == AC_POWER_ON) { 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; this->swing_mode = climate::CLIMATE_SWING_HORIZONTAL;
} } else if ( _current_ac_state.louver.louver_h == AC_LOUVERH_OFF && _current_ac_state.louver.louver_v == AC_LOUVERV_SWING_UPDOWN ){
if (_current_ac_state.louver.louver_v == AC_LOUVERV_SWING_UPDOWN){ this->swing_mode = climate::CLIMATE_SWING_VERTICAL;
if (_current_ac_state.louver.louver_h == AC_LOUVERH_SWING_LEFTRIGHT){ } 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; this->swing_mode = climate::CLIMATE_SWING_BOTH;
} else {
this->swing_mode = climate::CLIMATE_SWING_VERTICAL;
}
} }
} }
@@ -2206,7 +2203,8 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
/*************************** TEMPERATURE ***************************/ /*************************** TEMPERATURE ***************************/
if(_current_ac_state.mode == AC_MODE_FAN || _current_ac_state.power == AC_POWER_OFF){ 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 ){ } else if (_current_ac_state.mode == AC_MODE_AUTO ){
this->target_temperature = 25; // в AUTO зашита температура 25 градусов this->target_temperature = 25; // в AUTO зашита температура 25 градусов
} else { } else {
@@ -2788,7 +2786,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
// User requested target temperature change // User requested target temperature change
if (call.get_target_temperature().has_value()) { if (call.get_target_temperature().has_value()) {
// выставлять температуру в режиме FAN не нужно // выставлять температуру в режиме 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; hasCommand = true;
float temp = *call.get_target_temperature(); float temp = *call.get_target_temperature();
// Send target temp to climate // Send target temp to climate

View File

@@ -81,12 +81,65 @@ async def main():
if isDallasLog: if isDallasLog:
log_Dallas(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 # Subscribe to the log
# await api.subscribe_logs(log_callback, LOG_LEVEL_DEBUG) # await api.subscribe_logs(log_callback, LOG_LEVEL_DEBUG)
# print(await api.device_info()) # 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 # key надо искать в выводе list_entities_services
service = aioesphomeapi.UserService( service = aioesphomeapi.UserService(
@@ -97,23 +150,57 @@ async def main():
], ],
) )
await api.execute_service( #await ac_set_vlouver( 0b10010000 ) # swing on
service, #await ac_set_vlouver( 0b10010111 ) # swing off
data={ #await ac_set_vlouver( 0b10010001 ) # 1
# display off #await ac_set_vlouver( 0b10010010 ) # 2
"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( 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() parser = createParser()
namespace = parser.parse_args() namespace = parser.parse_args()