начал вычищать информацию о протоколе, новую переношу в GitHub

This commit is contained in:
GrKoR
2022-05-26 02:45:33 +03:00
parent 06e3d7e65e
commit 7c9ee25010

View File

@@ -112,6 +112,7 @@ enum acsm_state : uint8_t {
#define AC_PACKET_TIMEOUT 150 // 150 мсек - отработка буфера UART за раз, 600 мсек - отработка буфера UART по 1 байту за вызов loop
// типы пакетов
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_types
#define AC_PTYPE_PING 0x01 // ping-пакет, рассылается кондиционером каждые 3 сек.; модуль на него отвечает
#define AC_PTYPE_CMD 0x06 // команда сплиту; модуль отправляет такие команды, когда что-то хочет от сплита
#define AC_PTYPE_INFO 0x07 // информационный пакет; бывает 3 видов; один из них рассылается кондиционером самостоятельно раз в 10 мин. и все 3 могут быть ответом на запросы модуля
@@ -129,25 +130,20 @@ enum acsm_state : uint8_t {
#define AC_PACKET_ANSWER 0x80 // признак ответа wifi-модуля
// заголовок пакета
// описание тут: https://github.com/GrKoR/AUX_HVAC_Protocol#packet_header
struct packet_header_t {
uint8_t start_byte; // стартовый бит пакета, всегда 0xBB
uint8_t _unknown1; // не расшифрован
uint8_t packet_type; // тип пакета:
// 0x01 - пинг
// 0x06 - команда кондиционеру
// 0x07 - информационный пакет со статусом кондиционера
// 0x09 - (не разбирался) инициирование коннекта wifi-модуля с приложением на телефоне, с ESP работает и без этого
// 0x0b - (не разбирался) wifi-модуль так сигналит, когда не получает пинги от кондиционера и в каких-то еще случаях
uint8_t wifi; // признак пакета от wifi-модуля
// 0x80 - для всех сообщений, посылаемых модулем
// 0x00 - для всех сообщений, посылаемых кондиционером
uint8_t ping_answer_01; // не расшифрован, почти всегда 0x00, только в ответе на ping этот байт равен 0x01
uint8_t _unknown2; // не расшифрован
uint8_t body_length; // длина тела пакета в байтах
uint8_t _unknown3; // не расшифрован
uint8_t start_byte = AC_PACKET_START_BYTE;
uint8_t _unknown1;
uint8_t packet_type; // https://github.com/GrKoR/AUX_HVAC_Protocol#packet_header_2
uint8_t wifi;
uint8_t ping_answer_01;
uint8_t _unknown2;
uint8_t body_length;
uint8_t _unknown3;
};
// CRC пакета
// описание тут: https://github.com/GrKoR/AUX_HVAC_Protocol#packet_crc
union packet_crc_t {
uint16_t crc16;
uint8_t crc[2];
@@ -163,76 +159,37 @@ struct packet_t {
};
// тело ответа на пинг
// описание тут: https://github.com/GrKoR/AUX_HVAC_Protocol#packet_type_ping
struct packet_ping_answer_body_t {
uint8_t byte_1C = 0x1C; // первый байт всегда 0x1C
uint8_t byte_27 = 0x27; // второй байт тела пинг-ответа всегда 0x27
uint8_t zero1 = 0; // всегда 0x00
uint8_t zero2 = 0; // всегда 0x00
uint8_t zero3 = 0; // всегда 0x00
uint8_t zero4 = 0; // всегда 0x00
uint8_t zero5 = 0; // всегда 0x00
uint8_t zero6 = 0; // всегда 0x00
uint8_t zero1 = 0; // всегда 0x00
uint8_t zero2 = 0; // всегда 0x00
uint8_t zero3 = 0; // всегда 0x00
uint8_t zero4 = 0; // всегда 0x00
uint8_t zero5 = 0; // всегда 0x00
uint8_t zero6 = 0; // всегда 0x00
};
// тело большого информационного пакета
// описание тут: https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21
struct packet_big_info_body_t {
uint8_t byte_01; // всегда 0x01
uint8_t cmd_answer; // код команды, ответом на которую пришел данный пакет (0x21);
// пакет может рассылаться и в дежурном режиме (без запроса со стороны wifi-модуля)
// в этом случае тут могут быть значения, отличные от 0x21
uint8_t byte_C0; // не расшифрован, всегда 0xC0 11000000
// для RoyalClima18HNI: всегда 0xE0 11100000
// Brokly: для Energolux Bern: 0xE0; иногда, с равными промежутками во времени проскакивает )xE4
// предполагаю, что это байт конфига кондиционера (5 бит - инвертер), (2 бит - периодический мпульсный сигнал,период пимерно 500 сек)
uint8_t byte_01;
uint8_t cmd_answer; // особенности тут: https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_2x
uint8_t config; // https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_conf
// БАЙТ 3
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_mode
bool power:1;
bool sleep:1;
bool v_louver:1;
bool h_louver:1;
bool louvers_on:1;
uint8_t mode:3; // enum { AC_BIG_MODE_AUTO = 0,
// AC_BIG_MODE_COOL = 1,
// AC_BIG_MODE_DRY = 2,
// AC_BIG_MODE_HEAT = 4,
// AC_BIG_MODE_FAN = 6}
//
//
// Встречались такие значения:
// 0x04 100 - сплит выключен, до этого работал (статус держится 1 час после выкл.)
// 0x05 101 - режим AUTO
// 0x24 100100 - режим OFF
// 0x25 100101 - режим COOL
// 0x39 111001 - ??
// 0x45 1000101 - режим DRY
// 0x85 10000101 - режим HEAT
// 0xC4 11000100 - режим OFF, выключен давно, зима
// 0xC5 11000101 - режим FAN
// Brokly:
// Встречались такие значения :
// 0x00 00000000 - OFF
// 0x01 00000001 - AUTO // режим авто, нет отдельного бита
// 0x41 1000001 - DRY
// 0x21 100001 - COOL
// 0x81 10000001 - HEAT
// 0xC1 11000001 - FAN // 7 и 6 бит связаны
// 0x80 10000000 - продувка после переключения из HEAT в OFF
// 0xC5 11000101 - FAN+шторки верх-низ
// 0xDD 11011101 - FAN+шторки лево-право/верх-низ
// 0xD9 11011001 - FAN+шторки лево-право
// 0xD8 11011000 - из FAN+шторки лево-право в OFF
// 0x39 111001 - COOL+шторки лево-право
// Очевидно битовые, но связные, поля, предположительные зависимости
// ВНИМАНИЕ : режимы номинальны, например в режиме АВТО нагрев или охлаждение не отображаются
// 7+6+5 4 3 2 1 0
// MODE LouvON LouH LouV SLEEP ON/OFF
//
// ФУНКЦМЯ CLEEN, HEALTH, ANTIFUNGUS на данный байт не влияют
//
// #define AC_BIG_MASK_MODE b11100000
// enum { AC_BIG_MODE_DRY = 0x40,
// AC_BIG_MODE_COOL = 0x20,
// AC_BIG_MODE_HEAT = 0x80,
// AC_BIG_MODE_FAN = 0xC0}
uint8_t mode:3; // #define AC_BIG_MASK_MODE b11100000
// enum { AC_BIG_MODE_DRY = 0x40, // 0100 0000
// AC_BIG_MODE_COOL = 0x20, // 0010 0000
// AC_BIG_MODE_HEAT = 0x80, // 1000 0000
// AC_BIG_MODE_FAN = 0xC0} // 1100 0000
// #define AC_BIG_MASK_POWER b00000001
// #define AC_BIG_MASK_LOUVERS_ON b00010000
// #define AC_BIG_MASK_LOUVERS_H b00000100
@@ -240,21 +197,22 @@ struct packet_big_info_body_t {
// #define AC_BIG_MASK_LOUVERS_L b00001000
// #define AC_BIG_MASK_SLEEP b00000010
// #define AC_BIG_MASK_COOL b00100000
//
// БАЙТ 4
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_frst
uint8_t reserv40:4; // 8
bool needDefrost:1; // 5 бит начало разморозки(накопление тепла)
bool defrostMode:1; // 6 бит режим разморозки внешнего блока (прогрев испарителя)
bool reserv41:1; // для RoyalClima18HNI: режим разморозки внешнего блока - 0x20, в других случаях 0x00
bool cleen:1; // 8 бит CLEAN
// БАЙТ5
uint8_t realFanSpeed:3; // Brokly: Energolux Bern - подтверждаю, ВАЖНО !!!! Это реальная скорость фена
uint8_t reserv30:5; // та которая в данный момент. Например может быть установлен нагрев со скоростью
// вентилятора HI, но кондей еще не произвел достаточно тепла, и крутит на LOW,
// Тут будет отображаться LOW
// fanSpeed: OFF=0x00, LOW=0x02, MID=0x04, HIGH=0x06, TURBO=0x07; режим CLEAN=0x01
// в дежурных пакетах тут похоже что-то другое
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_fspd
uint8_t realFanSpeed:3;
uint8_t reserv30:5;
// БАЙТ6
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_fpwm
bool reserv60:1;
uint8_t fanPWM:7; // скорость шима вентилятора
// 126...128 - turbo
@@ -264,6 +222,7 @@ struct packet_big_info_body_t {
// 0 - off
//
// БАЙТ7
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_tint
uint8_t ambient_temperature_int; // Brokly: ПОДТВЕРЖДАЮ это точно показания датчика под крышкой внутреннего блока,
// физически доступен для пользователя
// целая часть комнатной температуры воздуха с датчика на внутреннем блоке сплит-системы
@@ -276,95 +235,68 @@ struct packet_big_info_body_t {
// А значит это термодатчики внутри внутреннего блока !!!!!!
// БАЙТ8
uint8_t in_temperature_int; // Brokly: скорее всего это действительно какая то температура или дельта температур
// СКОРЕЕ ВСЕГО ЭТО ТЕМПЕРАТУРА ПОДАЧИ !!!!!! При охлаждении - холодная, при нагреве теплая
// холоднее или горячее температуры в команте. В выключеном состоянии стремится к комнатной темп.
// у меня на трех инверторных кондиционерах Energolux серии Bern
// в выключеном состоянии значение этого байта находится на уровне 57-68 (мощность 0%)
// зависит от мощности работы компрессора (измерения при 12гр на улице)
// в режиме охлаждения уменьшается и при мощности 47% = 40 / 73% = 38
// в режиме нагрева увеличивается и при мощности 47% = 70 / 73% = 75 / 84% = 84
// изменение этого значения более вялое, с западыванием относительно изменения мощности
// видимо является реакцией (следствием работы) на изменение мощности инвертора
// учитывая стиль записи температур имеет смысл рассматривать это значение как увеличенное на 0x20
// этот байт как-то связан с температурой во внешнем блоке. Требуются дополнительные исследования.
// При выключенном сплите характер изменения значения примерно соответствует изменению температуры на улице.
// При включенном сплите значение может очень сильно скакать.
// По схеме wiring diagram сплит-системы, во внешнем блоке есть термодатчик, отслеживающий температуру испарителя.
// Возможно, этот байт как раз и отражает изменение температуры на испарителе.
// Но я не смог разобраться, как именно перевести эти значения в градусы.
// Кроме того, зимой даже в минусовую температуру этот байт не уходит ниже 0x33 по крайней мере
// для температур в диапазоне -5..-10 градусов Цельсия.
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_int
uint8_t in_temperature_int;
// БАЙТ9
uint8_t zero3; // Brokly: полностью повторяет значение 8 байта
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_int2
uint8_t zero3;
// БАЙТ10
uint8_t zero4; // Brokly: полностью повторяет значение 8 байта
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_int3
uint8_t zero4;
// БАЙТ11
uint8_t zero5; // всегда = 100 (0x64)
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b19
uint8_t zero5;
// БАЙТ12
uint8_t outdoor_temperature; // Brokly Energolux Bern: Внешняя температура формула T=БАЙТ12 - 0x20
// Датчик на радиаторе внешнего блока, доступен для пользователя, без разборки блока
// температура внешнего теплообменника влияет на это значение (при работе на обогрев - понижает, при охлаждении или при разморозке - повышает)
// для RoyalClima18HNI: похоже на какую-то температуру, точно неизвестно
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b20
uint8_t outdoor_temperature;
// БАЙТ13
uint8_t out_temperature_int; // всегда 0x00
// для RoyalClima18HNI: 0x20
// Brokly Energolux Bern: похоже не какой то Термодатчик T=БАЙТ13 - 0x20
// При охлаждении растет, при нагреве падает, можно делать вывод о режиме COOL или HEAT
// ПОХОЖЕ НА ТЕМПЕРАТУРУ ОБРАТКИ !!!
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b21
uint8_t out_temperature_int;
// БАЙТ14
uint8_t strange_temperature_int;// всегда 0x00
// для RoyalClima18HNI: 0x20
// Brokly Energolux Bern: похоже не какой то Термодатчик T=БАЙТ14 - 0x20
// показания РАСТЕТ ПРИ ВКЛЮЧЕНИИ ИНВЕРТОРА, при выключении падают до комнатной
// от режима охлаждения или нагрева не зависит !!!
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b22
uint8_t strange_temperature_int;
// БАЙТ15
uint8_t zero9; // всегда 0x00, Brokly: Energolux Bern, всегда 0x39 111001
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b23
uint8_t zero9;
// БАЙТ16
uint8_t invertor_power; // МОщность инвертера (Brokly: подтверждаю)
// для RoyalClima18HNI: мощность инвертора (от 0 до 100) в %
// например, разморозка внешнего блока происходит при 80%
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b24
uint8_t invertor_power;
// БАЙТ17
uint8_t zero11; // всегда 0x00
// Brokly: Energolux Bern : полное наложение на показания инвертора (от 0 до 22, когда инвертор отключен и тут 0
// при включении инвертора плавно растет, при выключении резко падает в 0, форма графика достаточно плавна
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b25
uint8_t zero11;
// БАЙТ18
uint8_t zero13; //
// Brokly: Energolux Bern : наложение на показания инвертора (от 144 до 174, когда инвертор отключен
// показания немного скачут в районе 149...154, при включении инвертора быстро растет, при выключении
// моментально падает до 149...154, бывают опускания ниже этих значений до 144, чаще в момент первоначального
// включения инвертора, а потом вверх, не всегда. При включении уходит в 0 на одну посылку
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b26
uint8_t zero13;
// БАЙТ19
uint8_t zero12; // Brokly: Energolux Bern : включение 144 -> 124 -> 110 далее все время держим 110
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b27
uint8_t zero12;
// БАЙТ20
uint8_t zero14; //
// Brokly: Energolux Bern : полное наложение на показания инвертора (от 0 до 45, когда инвертор отключен и тут 0
// при включении инвертора плавно растет, при выключении резко падает в 0, форма графика дрожащая нестабильная
// колебания в районе +-2...4 единицы
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b28
uint8_t zero14;
// БАЙТ21
uint8_t zero15; // всегда 0x00 Brokly: подтверждаю
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b29
uint8_t zero15;
// БАЙТ22
uint8_t zero16; // всегда 0x00 Brokly: подтверждаю
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b30
uint8_t zero16;
// БАЙТ23
uint8_t ambient_temperature_frac:4; // младшие 4 бита - дробная часть комнатной температуры воздуха с датчика на внутреннем блоке сплит-системы
// подробнее смотреть ambient_temperature_int
// для RoyalClima18HNI: старшие 4 бита - 0x2
// https://github.com/GrKoR/AUX_HVAC_Protocol#packet_cmd_21_b31
uint8_t ambient_temperature_frac:4;
uint8_t reserv023:4;
};