Реверс-инжиниринг пульта кондиционера Haier

aleXoid
Offline
Зарегистрирован: 15.04.2016

Всем привет!

Поставил недавно себе кондиционер фирмы Haier и решил управлять им при помощи ардуино, но столкнулся с некоторыми сложностями при расшифровке протокола пульта, уже всю голову сломал, но никак не получается понять принцип работы. Опишу свои действия по порядку:

1. Считал отсылаемые пультом импульсы при нажатии определённой кнопки и получил вот такой массив

{3050,3000, 3050,4400, 550,1600, 600,500, 600,1600, 600,500, 550,500, 600,1600, 600,500, 600,1550, 600,1600, 600,500, 600,500, 500,550, 600,500, 600,500, 550,550, 600,450, 550,550, 600,500, 600,1550, 650,1550, 550,550, 600,500, 600,1550, 600,500, 550,550, 600,500, 600,1550, 600,1600, 600,500, 600,500, 550,500, 600,1600, 600,500, 550,500, 600,500, 600,500, 550,1650, 600,1550, 600,500, 550,550, 600,1550, 600,1600, 600,500, 550,500, 600,500, 600,500, 550,550, 600,500, 550,500, 600,500, 600,500, 550,550, 600,500, 600,450, 600,500, 600,500, 550,550, 600,500, 600,450, 600,500, 600,500, 600,500, 550,550, 600,450, 600,500, 600,1600, 550,550, 600,1550, 550,550, 600,1600, 550,500, 600,500, 600};  // UNKNOWN 3F167340

2. Предположив, что если импульс больше 1000, то это 1, и, если импульс меньше 1000, то это 0. Так же отбросив первые 6 имульсов, т.к. это предположительно что-то вроде идентификатора для кондёра,  я проучил 144 бита, т.е. 18 байт.

3. Далее нажимая на разные кнопки и меняя температуру мне удалось вычислить занчения нескольких байт

3 байт - температура
00000000 - 16С
00000010 - 17С
00001000 - 18С 
00001010 - 19С
00100000 - 20С
00100010 - 21С
00101000 - 22С
00101010 - 23С
10000000 - 24С
10000010 - 25С
10001000 - 26С
10001010 - 27С
10100000 - 28С
10100010 - 29С
10101000 - 30С 

4 байт - вкл/выкл
00000000 - выкл
00000010 - вкл
00101000 - включен

5 байт - положение шторки
00001010 - выкл
00101010 - вверх
10001010 - вниз
10101010 - вверх-вниз

11 байт - скорость вентилятора
10100000 - 1 полоска
10000000 - 2 полоски
00100000 - 3 полоски
00000000 - 4 полоски

13 байт - режим
00000000 - авто
00001000 - охлаждение
00100000 - осушение
00101000 - нагрев
10000000 - вентилятор

15 байт - sleep
00100000 - вкл
00000000 - выкл

Ещё понял, что первые два байта всегда одинаковые.

Так вот, проблема в том, что 17 и 18 байты всегда разные и я не могу найти законормерность их изменения. Вероятнее всего один из них является контрольной суммой посылки, но у меня не хватает мозгов разобраться как это работает :( Может кто сталкивался с подобной задачей, помогите разобраться пожалуйста :(

Примеры переведённых в двоичный код посылок можно посмотреть тут http://e-smoker.com.ua/arr.php я написал небольшой скриптик для удобства.
 

vde69
Offline
Зарегистрирован: 10.01.2016

попробуй банально сложить 15 бай (или XOR)

aleXoid
Offline
Зарегистрирован: 15.04.2016

Я пытался складывать, но похоже делал что-то не так. Ещё заметил. что при изменении температуры на включенном кондиционере 17 байт почти всегда совпадает с 3, который по моему мнению и есть значение температуры. Но это не всегда.

А почему 15 байт сложить? Без первых двух и последнего?

http://e-smoker.com.ua/Screenshot_3.png

 

aleXoid
Offline
Зарегистрирован: 15.04.2016

Да, действительно сложив 17 байт (т.е. без последнего) получилась контрольная сумма. Не понятно теперь за что отвечает 17й байт :)

aleXoid
Offline
Зарегистрирован: 15.04.2016

А, нет, совпадение просто :(

aleXoid
Offline
Зарегистрирован: 15.04.2016

В общем разобрался. Получилось, что я изначально не правильно понял как перевести импульсы в двоичный код. На самом деле первые 4 импульса были хэдэром, потом следущие импульсы надо было расшифровывать так:

если первый импульс меньше 1000, а второй больше 1000, то это 1.

если первый и второй импульсы меньше 1000, то это 0

Таким образом у меня получилось 9 байт вместо 18 и теперь если сложить все байты кроме последнего, то получается как раз сумма последнего байта. Теперь делаю из этого библиотеку, там есть некоторые сложности, может кто-то подскажет как такое сделать, например при смене температуры второй байт посылки выглядит так

A6 - 26C
B6 - 27C
C6 - 28C
D6 - 29C
E6 - 30C

 

А если при этом нажать кнопку выключения, то в зависимости от текущей температуры может стать вроде такого

E0 - выкл с темп. 30С
E1 - вкл С темп. 30С

Т.е. меняется часть байта (не знаю как это правильно назвать, простите меня знающие люди за безграмотность)