След като научих
LIRC-а да говори CCF команди дойде време да се захвана с протокола, който "говори" самият Daikin.
На няколко места в Интернет можете да намерите някои от командите, както в RAW формат, така и примерен код, който ги генерира. Мартин Харизанов има
код, както и цяло
устройство, което предлага за да управлявате климатика си през Интернет. Разглеждайки обаче кода ми направи впечатление, че някои от функциите, които ги има на дистанционното ми, липсваха от неговия код - например при него вентилатора работи на три степени, докато на дистанционното имате пет. Като за начало обаче този код можеше да ми послужи за да генерирам собствени команди през LIRC-а.
Както се вижда от кода на Харизанов, командата която се подава към Daikin-а е с дължина от 26 байта. Тя обаче е разделена на две групи, с две отделни чексуми като групите са отделени една от друга с пауза. И двете групи започват с еднакви водещи импулси.
CCF поредицата трябва винаги да започва с 0000, следва честотата в hex, броя импулси които ще пращаме и броя на повторенията на командата, което би трябвало да симулира натискане на бутон.
Тъй като WEB-а ми щеше да ползва PHP си направих един
клас, който генерира въпросните команди. До тук всичко работеше и то правилно и съответно работата беше почти свършена.
Само, че липсващите функции леко ме дразнеха. Нещица, като ECONO, SENSOR и разни други екстри ме накара да ги потърся. Логично беше да ги има някъде из протокола.
И така, писнах mode2 /dev/lirc0 и натиснах произволно копче на дистанционното. В резултат на което получих един хубав
dump, който обаче още на пръв поглед изглеждаше доста дълъг. Какво обаче връща mode2?
Много просто поредица от pause и pulse които представляват съответно ниско и високо ниво за определено време. Как да го декодираме? Е, оказа се, че не е толкова трудно, колкото изглежда на пръв поглед.
В началото на dump-а има малко на пръв поглед случайна информация. По-късно се оказа, че не е за пренебрегване, но за това по-късно. Къде обаче започваше важната за мен информация?
Дългия space в самото начело определено беше паузата преди да натисна бутона. Следваха 16 реда, които завършваха с дълга пауза. Същата дълга пауза се намира и на още две места по-назад в dump-а. Игнорирах всичко преди въпросната пауза. След това се намира водещ импулс, който също можете да намерите по-назад във файла. Логично беше това да означава, че следва реалната информация. Бързо подреждане на файла в текстов редактор потвърди съмненията ми, но търсенето на някаква логика по този начин си е хамалогия, затова се роди
mode2_decode.
Съмненията ми обаче, че имам работа с нещо различно от декодирания протокол на Харизанов се потвърдиха. Вместо 26 байта аз получавах 35 и вместо две групи информацията беше в три групи съответно с три чексуми.
Интересно е, че климатика работи и с другия протокол от 26 байта, което пък означава, че някъде из хедера на протокола (или пък в импулсите преди информацията) вероятно се съдържа и версията на протокола. Тази информация обаче е трудно да се каже къде точно се съдържа, тъй като не разполагам с различни дистанционни. Все пак е любопитно, че се поддържат няколко протокола.
Последва малко упражнение по натискане на копчета и записване на dump-ве. В крайна сметка ето какво успях да измъкна от протокола:
00 - 0x11 - константа
01 - 0xDA - константа
02 - 0x27 - константа
03 - 0x00 - константа
04 - 0xC5 - константа
05 - 0x00 - константа
06 - 0x00 - комфорт
07 - 0xD7 - чексума
08 - 0x11 - константа
09 - 0xDA - константа
10 - 0x27 - константа
11 - 0x00 - константа
12 - 0x42 - константа
13 - 0xBB - час LSB
14 - 0x01 - час MSB
15 - 0x10 - чексума
16 - 0x11 - константа
17 - 0xDA - константа
18 - 0x27 - константа
19 - 0x00 - константа
20 - 0x00 - константа
21 - 0x49 - включен, таймери, режим
22 - 0x28 - температура
23 - 0x00 - константа
24 - 0xA0 - вентилатор, клапа нагоре/надолу
25 - 0x00 - константа (клапа ляво/дясно)
26 - 0x00 - време включване LSB
27 - 0x06 - време на изключване LSB, време на включване MSB
28 - 0x60 - време изключване MSB
29 - 0x00 - мощен режим, тих режим
30 - 0x00 - константа
31 - 0xC0 - константа
32 - 0x04 - сензор
33 - 0x00 - константа
34 - 0x4D - чексума
Както се вижда някои от някои байтове се ползват определени битове за определени функции.
Комфорт режима се активира като бит четири на байт шест стане единица.
Дали климатика е включен или изключен зависи от бит нула в байт 21.
Режима пък се съдържа в старшите битове на байт 21:
0 - автоматичен
2 - dry
3 - cool
4 - heat
6 - fan
Температурата се намира в байт 28, като е умножена по две.
Режима на вентилатора е в старшите битове на байт 24, като значението им е следното:
3 - 1
4 - 2
5 - 3
6 - 4
7 - 5
10 - auto
11 - night
Управлението на клапата в младшите битове на байт 24. Ако всички са единици клапата се движи нагоре надолу. Ако всички са нули, то клапата е неподвижна.
Тихият режим е в бит пет на байт 29.
Мощния решим е в бит нула на байт 29.
Сензора се активира от бит 1 на байт 32.
Икономичният режим е в бит 2 на байт 32.
Не съм си играл да правя функции за управлението на таймерите, защото не ми трябват при положение, че Pi-то ще мисли и ще управлява климатика.
Все пак ако някой се вълнува, времената са разделени на старши и младши битове в байтове 26, 27 и 28, като се подава броя минути от денонощието - умножавате часа на включване или изключване по 60 и добавяте минутите. Получения резултат записвате съответно в младшите и старшите битове на съответните байтове.
Изпращането само на тези 35 байта обаче не даде резултат. Затова трябваше да добавя водещите шест импулса, за които стана дума по-рано и чат тогава да започне изпращането.
Ето и самият клас за протокола, който говори моя Daikin -
http://www.jeckyll.net/images/JeckyllNet/daikin/daikin.php.gz Не може без картинка, затова ето и как изглежда моето управление през Интернет:
А ако някой иска да "усети" и какво е да поцъка по копчетата:
URL:
http://automatico.jeckyll.net Потребител: test
Парола: test
С тези данни, можете само да разглеждате, но не и да управлявате :)
P.S. Климатика ми се нарича Daikin FTXS35D3VMM, а дистанционното е ACR433B50.
напиши нов коментар