PocketHome

Z wiki.n0rthpo1e.net

Přejít na: navigace, hledání

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

konstantavýznammožné hodnoty
MIminimální regulovaná teplota0x04 = 2˚C .. 0x14 = 10˚C
MXmaximální regulovaná teplota0x0E = 15˚C .. 0x50 = 39˚C
PZrežim0x00 = normální režim, 0x01 = předčasné zapnutí topení, 0x02 = letní režim
RDden servisu0x01 = 1. den měsíce .. 0x1F = 31. den měsíce
RMměsíc servisu0x00 = leden .. 0x0B = prosinec
RRrok servisu0x00 = 2000 .. 0x19 = 2025
TCzatím nezjištěno, pravděpodobně typ regulace
ZHprocentuální otevření hlavice0x05 = 5% .. 0x32 = 50%
GSpovolit GSM modul0x4E ~ N = ne, 0x41 ~ A = ano
P0 .. P3PIN k SIM kartě v GSM modulu0x00 = 0 .. 0x09 = 9
T0 .. T11telefonní číslo na které chodí SMS0x00 = 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.

Osobní nástroje