PocketHome
Z wiki.n0rthpo1e.net
INFO: 31. října 2010 jsem na adrese http://pockethome.n0rthpo1e.net/ spustil PocketHome fórum pro všechny příznivce tohoto systému
PocketHome je bezdrátový systém pro inteligentní řízení vytápění v domácnostech. Hlavními prvky jsou řídicí jednotka, bezdrátové digitální hlavice a ovládací jednotka kotle. Všechny tyto prvky spolu komunikují rádiově na frekvenci 433.92 MHz. Řídící jednotku lze dále připojit k PC, se kterým komunikuje po rozhraní RS232.
Více info na stránkách výrobce.
Obsah |
Popis protokolu
Komunikační protokol mezi jednotkou PH-CJ37/PH-CJ37plus je bohužel proprietární a není k němu dostupná dokumentace. Ale vzhledem k tomu, že probíhá po rozhraní RS232 není problém komunikaci odchytit a zaznamenat. Samotný protokol není příliš složitý a tak ho lze relativně dobře pochopit metodou reverzního inženýrství.
Následující popis není kompletní, bude aktualizován průběžně, tak jak bude protokol analyzován.
Poznámka: slovní významy dat psané za rovnítkem kurzívou jsou z mé hlavy, vznikly v průběhu dokumentace protokolu pro lepší orientaci
Základ komunikace
Centrální jednotka (dále jen CJ) posílá periodicky data do komunikačního portu, ať už je k PC připojena, či nikoliv. Tato data se opakují v intervalech 17.5, 17.5 a 25 sekund. Mohou chodit tyto typy dat:
04 5A 00 00 PK ?? 00 FD FE 0D 0A = Echo - v PK je poslána doba běhu kotle, v ?? pak neznámá hodnota, která se ale v průběhu času zvyšuje 04 5A 00 00 19 B7 00 FD FE 0D 0A - doba běhu kotle PK = 25, ?? = 183 04 5A 01 01 00 04 01 FD FE 0D 0A =ErrVy - chodí na střídačku s Echo daty pokud na CJ svítí ErrVy, tedy chyba vysílaní, nenese žádná data= ? - chodí na střídačku s Echo daty, význam neznamý
Pokud PC okamžitě po přijetí těchto dat nepošle nějakou odpověď, CJ data pošle znovu, v intervalu menším než jedna sekunda. Tato data CJ také posílá po potvrzení přijetí nějakého příkazu nebo po odpovědi na stav hlavice.
PC na to odpovídá jistou formou keep alive odpovědi, která nenese žádná konkretní data, ale pouze udržuje spojení:
03 00 00 00 20 04 20 FD FE 0D 0A = Keep Alive
Pokud CJ pošle více než 20 těchto zpráv a nevrátí se jí žádná odpověď, začne místo toho posílat následující data, kterými žádá PC o poslání aktuálního data a času.
04 56 00 S1 S2 ?? ?? FD FE 0D 0A = Date Request - S1 a S2 obsahují sériové číslo jednotky, ?? a ?? možná počet připojení (nutno ověřit) 04 56 00 01 B4 01 B5 FD FE 0D 0A - příklad co skutečně přišlo, 0x01 0xB4 = 436
Na to PC odpovídá odesláním data a času ve tvaru:
07 RR MM DD HH MM SS FD FE 0D 0A = Date Response - RR MM DD HH MM SS označují rok, měsíc, den, hodiny, minuty a sekundy 07 09 05 19 14 37 35 FD FE 0D 0A - 2009-05-25 20:55:53
CJ přijetí těchto dat potvrdí následujícími daty a podle obsahu nastaví datum a čas nejen sobě, ale i hlavicím a dalším k ní přípojeným zařízením.
04 50 B1 B2 B3 B4 B5 FD FE 0D 0A = OK - B1 až B5 je prvních 5 bajtů z dat, které jsme předtím do CJ odeslali 04 50 07 09 05 19 14 FD FE 0D 0A
Takto jednotka potvrzuje všechny příkazy, na které nevrací v odpovědi data, ale pouze potvrzuje jejich přijetí.
Před samotnou komunikací (ale po nastavení data a času, pokud ho jednotka požaduje, je potřeba inicializovat hlavice nastavením programu a teploty. PC proto pošle do jednotky tato data:
02 00 HD 48 PR 01 PT FD FE 0D 0A = HD Set Request - HD označuje hlavici, PR program a PT požadovanou teplotu 02 00 01 48 14 01 28 FD FE 0D 0A - hlavice č.1, program 20, teplota 20˚C
CJ nám opět potvrdí přijetí:
04 50 B1 B2 B3 B4 B5 FD FE 0D 0A = OK - B1 až B5 je prvních 5 bajtů z dat, které jsme předtím do CJ odeslali 04 50 02 00 01 48 14 FD FE 0D 0A
Pokud takto nastavíme všechny hlavice, bude s námi jednotka komunikovat a odpovídat na naše dotazy a provádět naše příkazy.
Pokud chceme z CJ zjistit stavy jednotlivých hlavic, PC pošle jednotce dotaz ve formátu:
06 00 HD 48 20 20 20 FD FE 0D 0A = HD Status Request - HD označuje hlavici 06 00 01 48 20 20 20 FD FE 0D 0A - zjištění stavu hlavice č.1
A CJ nám zpět pošle data obsahující stav hlavice:
05 00 HD 48 %% TC TD FD FE 0D 0A = HD Status Response - HD označuje hlavici, %% vyjadřuje procento otevření a TC a TD pak teplotu v desetinném formátu TC.TD 05 00 01 48 02 1b 01 FD FE 0D 0A - hlavice č.1, 2% otevření, 27.1˚C
Pokud dojde k chybě komunikace (potřeba ověřit, nevím jistě), odešle CJ stav hlavice, ale s teplotou 0˚C a otevřením 128%.
Má-li hlavice slabé baterie, přijde normální odpověď, ale s TD > 128. Desetiny teploty pak získáme odečtením 128 od TD.
Programy
Programy se přenáší z PC do CJ v tomto formátu:
0D 00 PR 20 - PR označuje číslo programu Č1 T1 Č2 T2 Č3 T3 Č4 T4 Č5 T5 Č6 T6 = pondělí Č1 T1 Č2 T2 Č3 T3 Č4 T4 Č5 T5 Č6 T6 = úterý Č1 T1 Č2 T2 Č3 T3 Č4 T4 Č5 T5 Č6 T6 = středa Č1 T1 Č2 T2 Č3 T3 Č4 T4 Č5 T5 Č6 T6 = čtvrtek Č1 T1 Č2 T2 Č3 T3 Č4 T4 Č5 T5 Č6 T6 = pátek Č1 T1 Č2 T2 Č3 T3 Č4 T4 Č5 T5 Č6 T6 = sobota Č1 T1 Č2 T2 Č3 T3 Č4 T4 Č5 T5 Č6 T6 = neděle FD FE 0D 0A
Reálný příklad:
0D 00 01 20 30 2F 48 2B 88 2F B0 27 B0 27 B0 27 30 2F 48 2B 88 2F B0 27 B0 27 B0 27 30 2F 48 2B 88 2F B0 27 B0 27 B0 27 30 2F 48 2B 88 2F B0 27 B0 27 B0 27 30 2F 48 2B 88 2F B0 27 B0 27 B0 27 30 2F 48 2B 88 2F B0 27 B0 27 B0 27 30 2F 48 2B 88 2F B0 27 B0 27 B0 27 FD FE 0D 0A
Každý řádek vyjadřuje jeden den, každý den pak může obsahovat maximálně 6 změn teploty, které jsou vyjádřeny časem změny a teplotou do další změny. Pokud je během dne použito méně než 6 změn, poslední se opakuje až do konce dne, tedy tak aby vyplnila všechny možné změny. Viz následující data.
Č1 T1 Č2 T2 Č3 T3 Č4 T4 Č5 T5 Č6 T6 - Č# vyjadřuje čas změny a T# pak teplotu 30 2F 48 2B 88 2F B0 27 B0 27 B0 27 - poslední 3 změny jsou stejné, použili jsme tedy pouze 4 změny z 6 možných
Teplota je vyjádřena tak, že co +1, to půl stupně, proto 0x2F = 47 = 23.5˚C. Čas je pak vyjádřen tak, že co +8, to hodina, a co +1, to 10 minut. Máme-li tedy 30, znamená to 06:00, 88 pak 17:00. Teplota nastavená před půlnoci "přetéká" do dalšího dne, stejně tak jako teplota z nedělního večera pokračuje i v pondělí ráno. Jednotka nám přijetí programu potvrdí stejně jako přijetí jiného příkazu:
04 50 B1 B2 B3 B4 B5 FD FE 0D 0A = OK - B1 až B5 je prvních 5 bajtů z dat, které jsme předtím do CJ odeslali 04 50 0D 00 01 20 30 FD FE 0D 0A
Konstanty
Všechny konstanty se do CJ odesílají v tomto jednotném tvaru:
09 AA BB XX 20 20 20 FD FE 0D 0A = Const Set - byty AA a BB znakově označují konstantu (např. MI, MX, PZ, ...), XX obsahuje nastavenou hodnotu
CJ přijetí těchto dat potvrdí následujícími daty a podle obsahu nastaví datum a čas nejen sobě, ale i hlavicím a dalším k ní přípojeným zařízením.
04 50 B1 B2 B3 B4 B5 FD FE 0D 0A = OK - B1 až B5 je prvních 5 bajtů z dat, které jsme předtím do CJ odeslali
Příklady nastavení konkrétních konstant:
09 4D 49 14 20 20 20 FD FE 0D 0A - nastavení minimální teploty (0x4D 0x49 => MI) na 10˚C (0x14 = 20 => 10˚C) 09 4D 58 3C 20 20 20 FD FE 0D 0A - nastavení maximální teploty (0x4D 0x58 => MX) na 30˚C (0x3C = 60 => 30˚C)
Význam konstant
| konstanta | význam | možné hodnoty |
|---|---|---|
| MI | minimální regulovaná teplota | 0x04 = 2˚C .. 0x14 = 10˚C |
| MX | maximální regulovaná teplota | 0x0E = 15˚C .. 0x50 = 39˚C |
| PZ | režim | 0x00 = normální režim, 0x01 = předčasné zapnutí topení, 0x02 = letní režim |
| RD | den servisu | 0x01 = 1. den měsíce .. 0x1F = 31. den měsíce |
| RM | měsíc servisu | 0x00 = leden .. 0x0B = prosinec |
| RR | rok servisu | 0x00 = 2000 .. 0x19 = 2025 |
| TC | zatím nezjištěno, pravděpodobně typ regulace | |
| ZH | procentuální otevření hlavice | 0x05 = 5% .. 0x32 = 50% |
| GS | povolit GSM modul | 0x4E ~ N = ne, 0x41 ~ A = ano |
| P0 .. P3 | PIN k SIM kartě v GSM modulu | 0x00 = 0 .. 0x09 = 9 |
| T0 .. T11 | telefonní číslo na které chodí SMS | 0x00 = 0 .. 0x09 = 9 |
Záludnosti
- vlezeme-li na CJ do menu pomocí tlačítka Fce, přestane jednotka komunikovat s PC, dokud menu opět neopustíme
- změníme-li z PC konstantu jejíž stav je přímo vidět na displeji (letní režim), zobrazí se až po přepnutí zobrazení na CJ (např. přepnutí do menu a zpět)
- pokud je CJ komunikuje s PC, není možné ji plně ovládat, nelze například změnit konstanty, je třeba ji asi na 2 minuty odpojit od PC, nebo jí přestat odpovídat
Vlastní implementace
Vzhledem k tomu, že originální software mi nevyhovoval, rozhodl jsem se pokusit se o implementaci protokolu a napsání vlastního softwaru.
Popis programu, zdrojové kódy a veškeré informace naleznete na stránce pockethome.pl.
