Régóta foglalkoztatott ez a téma és most végre munkába állt az első beavatkozó is a lakásban. Már korábban is voltak szenzoraim, amiket egy Raspberry PI és az RRDtool segítségével látványos formában fel tudtam használni.

A hőség kapcsán viszont felvetődött, hogy a lakásban lévő légkondicionálót jó lenne távolról vezérelni. Amikor elindulok munkából bekapcsolom (vagy magától bekapcsolódik) és mire hazaérek kellemes hűvös fogad. Alapból nem volt erre kész megoldás, így a reverse engineering rögös útjára léptem.
Első lépésként egy oszcilloszkóppal megnéztem, hogy a távirányító LED-je 38kHz-es vivót használ. Ezután rákötöttem egy 38kHz-es infra vevőt a Raspberry-re és beizzítottam a LIRC-et. Készítettem egy kis programot, amely a már demodulált impulzusok szélességéből készített egy hisztogramot. Hamar kiderült, hogy a header egy 3525ms hosszú pulse-ból és egy 1575ms hosszú space-ből áll, az adatbitek pedig 525ms hosszú és 110ms rövid értékkel dolgoznak. Az adatbiteknél először mindig egy rövid pulse kezd, ami az adatbit értéke szerinti rövid vagy hosszú space követ.
A fentieket megállapítva már képes voltam byte-okat fogadni, így elkezdtem végignyomkodni az összes gomb össze állapotát. Az rögtön kiderült, hogy a távirányító mindig egy teljes állapotot közöl (kivéve a timer léptetéseknél, mert ilyenkor az aktiválásig nem csinál semmit). Nagyjából fél óra után elő is állt az alábbi kódrészlet:
enum OperationMode {
Heat = 0x1,
Dry = 0x2,
Cool = 0x3,
Fan = 0x7,
Auto = 0x8,
};
enum FanSpeed {
AutoFan = 0x0,
Sleep = 0x1,
Low = 0x2,
Medium = 0x3,
High = 0x5
};
enum Swing {
Forward = 0x1,
AlmostForward = 0x2,
Middle = 0x3,
AlmostDownward = 0x4,
Downward = 0x5,
AutoSwing = 0x7
};
union Packet {
struct Bits {
uint8_t preamble[5];
uint8_t reserved1 :2;
uint8_t on :1;
uint8_t offTimerEnable :1;
uint8_t onTimerEnable :1;
uint8_t reserved2 :3;
uint8_t operationMode :4;
uint8_t reserved3 :4;
uint8_t temperature :4;
uint8_t reserved4 :4;
uint8_t fanSpeed :3;
uint8_t swing :3;
uint8_t reserved5 :2;
uint8_t offTime :8;
uint8_t onTime :8;
uint8_t ending[2];
uint8_t checkSum;
} bits;
uint8_t raw[14];
};
Gyorsan elkészítettem azt a kódot, amely képes ilyen IR jelek küldésére és máris képes voltam távolról vezérelni a légkondit, ám egyelőre elég kényelmetlenül, telefonról SSH-val bejelentkezve.
MQTT
További fejlesztésként beizzítottam egy MQTT brokert is (megfelelő titkosítással és autentikációval) és ez már eggyel kényelmesebb volt, mivel Androidra elérhetőek olyan appok (mint például az MQTT Dash), amelyekkel egyszerűen összeállíthatók MQTT-s vezérlések.
Ami még cél, hogy a hőmérős részt is ide drótozzam be, illetve az Androidos fejlesztések kapcsán kalandozok abba az irányba, hogy egy saját app vigye a rendszert a telefonon is.