Okos otthon is fókuszban

Arduino kalandok

Arduino kalandok

Computherm Q8RF - Hardver és Szoftver - part 3

2019. december 05. - denx

Az első és a második részben odáig sikerült eljutnom, hogy megfejtettem milyen modulációval milyen üzenetet küld a termosztát a vevő egységnek. Mivel egy üzenetre alapoztam a teóriámat, így szükségesnek tűnt több mérést is végezni, illetve olyan vevő, illetve adó áramkört keresni, amivel a további elemzés, majd az adás is kivitelezhető. Következzen most ez a rész!

Második termosztát

Nekem a Q8RF-ből egy olyan kiszerelés van, ami 2 termosztátból és egy vevőből áll. Ez nekem tökéletesen meg is felel, az egyik a földszinti fűtéskört kapcsolgatja, a másik az emeletit. A második epizódban a földszinti termosztát jeleit elemeztem, adta magát az ötlet, hogy nézzük meg mit küldözget az emeleti egység. Nyilván való, hogy a két termosztát között csak a biztonsági kódnak nevezett azonosító lesz a különbség, ezt újra is lehet generáltatni, de ekkor a vevővel újra is kell taníttatni az új kódot. Így egyszerűbbnek tűnt inkább a másik termosztát jelét elemezni, aztán majd ha vége a fűtési szezonnak, akkor lehet agyba-főbe játszani a különböző kódokkal!

Ami érdekes, hogy ennek az egységnek a vivőfrekvenciája kicsit arréb volt: 868.275 MHz. (Itt is rengeteg időt sikerült elszórakoznom, mire megtaláltam az ideális frekit, de végül sikerült!)

Jól látható, hogy a magas és alacsony jelszinteket könnyű lesz elkülöníteni. Itt is sikerült egy be- és egy kikapcsolást is rögzítenem, az URH így könnyedén elboldogult a csomagokkal:

Ami érdekes, hogy itt nincs meg az a bizonyos 'A' csomag 'B' csomag rendszer, ugyanazt a csomagot küldi el az adó 8x, pontosabban 2x 8x. A be- és kikapcsolási üzenetek ugyanúgy különböznek mint a másik termosztát esetében, illetve a 0-kkal való feltöltés is megegyezik.

Látok rá esélyt, hogy a csomagok különbsége a földszinti termosztátnál abból adódott, hogy abban épp merülőben volt az elem, amikor próbálgattam a felvételt. Ez a dolog feltehetőleg úgy működik, mint a legtöbb elemes időjárás állomásnál: ha az elem feszültsége egy bizonyos szint alá esik, akkor megjelenik egy ikon a kijelzőn és ezt beleszövi az RF üzenetbe is a cucc. Még nem cseréltem ki az elemet a földszinti adóban, de ez most a lehető legjobb állapotban van épp: ha áll és naponta kell csak kiküldenie 2-2 üzenetet, akkor nem mutatja, hogy merül. Ha próbálgatom és 5 perc alatt kiküldetek vele 10 üzenetet, akkor megjelenik a kis ikonocska. Szóval ha lesz időm megpróbálok a napokban normál és merülő üzeneteket is felvenni, hátha megtalálom az összefüggést!

Hardver

Ugye az csak az első lépés hogy "elkapunk egy levelet", de azt tetszőleges időpontban meg kellene tudjuk ismételni ahhoz, hogy saját kezünkbe vegyük az irányítást. Ehhez indult el a megfelelő hardver felkutatása. Nos ez sokkal nehezebben ment, mint gondoltam! Ha 433 MHz-ről lett volna szó annyi adó és vevő van a piacon, hogy győzzön az ember válogatni! A 868-as sáv szerintem semmivel nem bonyolultabb, csupán kevésbé elterjedt - legalábbis ilyen célra használva.

3 féle eszköz létezik: transmitter (adó), receiver (vevő) és transceiver (adóvevő). Nekem a legfontosabb, hogy adni tudjak, az RTL segítségével tudom tesztelni hogy jó-e az adásom, de az se baj, ha adóvevőt találok, vagy adó és vevő párosát. Kezdetnek sikerült megtalálnom a CC1101-es típusú Texas Instruments gyártotta csipet és az erre épülő transceiver-eket. Papírón jól hangzott a dolog, tud nagyon sok frekvenciát, több féle modulációt, stb. Azonban eléggé úgy fest, hogy nem lesz jó arra amire nekem kell. Mint a legtöbb hasonló kütyü, ez is arra van kitalálva, hogy vesz az ember belőle kettőt és azt két egymástól távol levő kütyübe építve kommunikációs csatornát létesít velük. Ilyenkor a fő cél, hogy a modul saját magával legyen kompatibilis és tetszőleges, saját modulációt/kódolást is használhat, a lényeg hogy amit az ember az adó oldalon bead, az a vevő oldalon kijöjjön.

cc1101-wireless-433mhz-rf-transceiver-module-technical.jpgEz sajna nekem nem jó, mert ugye itt az a cél, hogy egy általam definiált adássorozatot tudja küldeni az éterbe, ami a lehető legtökéletesebben hasonlít a termosztátom adására, olyannyira, hogy a vevő azt higgye a termosztát szólt neki. A CC1101 adatlapját tanulmányozva arra jutottam, hogy a legjobb, ha letöltöm a TI programját, amivel lehet a modul csipjét konfigurálni. Ez a program olyasmit tud csinálni, hogy sok sok paraméter beadása után megmondja, hogy a modul EEPROM-jában melyik címét mire kell állítani, hogy olyan üzemmódban kommunikáljon a modul, ahogy én szeretném. (értsd: pontos frekvencia, moduláció, sebesség, erősítés, stb.) Ám miközben kattogtattam a programban, rá kellett jönnöm, hogy ez nem lesz jó nekem: itt nem az lesz a működési elv, hogy egy lábat magas és alacsony állapotok között "rángatok" és ennek megfelelően fog adni, vagy nem adni a modul, hanem SPI buszon keresztül kell megmondanom a modulnak, hogy milyen adatot szeretnék átküldeni, mire ő maga állítja majd össze és küldi ki azt a morzejelet, amit a konfigurálás közben meghatározottak szerint kell küldeni az én adataim alapján. Viszont olyasmit nem lehet benne beállítani, hogy a sync jel-et 2x rakja az elejére, a végén hagyjon megadott ideig szünetet, majd ismételje meg, stb. Röviden ez a modul túl fejlett ahhoz amire nekem szükségem van.

Ezután találtam rá a HopeRF nevű méltán híres kínai cég RFM119W-868S1 típusú termékére. Freki stimmelt, leírásban benne volt, hogy OOK, mindössze egy adat lába van, szóval tökéletesnek tűnt. Meg is rendeltem a Farnell-től, 1700 + postaköltségért (sehol nem találtam olcsóbban) azaz 3700-ért. (shit, ez nem kínából jön, többe van a posta, mint a cucc). A Farnell-től még eddig nem rendeltem, de kifejezetten tetszett/szórakoztatott 1-2 érdekesen megfogalmazott státusz üzenetük (pl. "Jelenleg a rendelés gondos feldolgozása zajlik."). Telt-múlt az idő, még mindig dolgozták fel a megrendelést én meg gondoltam addig megnézem az adatlapját a kütyünek. Kiderült, hogy amit írnak az oldalon, az mind igaz és a modul is tudja amit vállalt, de ebben is van egy EEPROM, amit gondosan inicializálni kell hogy tudjuk például OOK-ban adni. Ez még rendben is lenne, de kiderült, hogy kínai barátaink fifikás módon nem adják ki azt a titkot, hogy a modul memóriájában milyen címen mit lehet állítgatni, hanem ajánlanak egy dev kitet, amiben a TI-jéhez hasonlóan az ember összekattogtatja a konfigurációját, majd a devkit saját hardvere ezt be is konfigurálja a rákapcsolt modulon. Ugye milyen jól hangzik? Hát persze, csak az apró betűs rész annyi, hogy a devkit 500 EUR! Na ennyit nem szánok a projektre, pláne hogy a devkitet feltehetőleg életemben egyszer használnám aztán mehetne is a szekrény mélyére! 

Miután ezt realizáltam gyorsan le is mondtam a megrendelésemet, Farnell korrektül törölte is azt.Folytattam hát tovább a keresgélést. Nem tudom hogyan, de a Chipcad oldalára vetődtem, ahol találtam egy ígéretes alkatrészt. Ugyanennek a gyártónak egy feltehetőleg régebbi adó- és vevőcsaládját. Az RFM117W-868S1 és RFM217W-868S1 modulok kicsit primitívebbek, csak ASK/OOK modulációt ismernek és bár ezekben is van EEPROM, de pont arra a frekvenciára vannak hangolva, ami nekem kell! Vettem hát 1 adó és 1 vevő egységet is, személyes átvétel mellett így 1060 Ft-ból meg is voltam. Otthon koaxkábelből kihúzott rézdrótból csináltam nekik antennákat és forrasztottam mindkettőre lábakat is, hogy könnyebb legyen velük bánni. 

Szoftver

Hogy életre tudjam kelteni a modulokat kell valamiféle mikrokontroller. Ami van itthon az vagy Arduino UNO (ebből van több fajta is) illetve ESP8266 (ebből most épp csak NodeMCU-t találtam a szekrényben, kell kell legyen D1 mini is valahol). Ezek különbségeiről már korábban írtam, a lényeg, hogy most az utóbbira esett a választás, mégpedig több okból kifolyólag is:

  • A modulok 1.8 és 3.7 V között képesek működni, az UNO-knál jellemzően 5V rohangál. Ez nem jeletene leküzdhetetlen akadályt (feszültségosztó, szintillesztő, stb.) de...
  • ...az ESP-nek lényegesen gyorsabb a procija (16 MHz vs 80 MHz),
  • ... több a memóriája (1 kB vs 128kB) és
  • ... van benne Wifi is, ami a végleges kivitelnél jól fog jönni!

Programozás szempontjából nincs jelentős különbség, Arduino környezetben fogok C kódot írni, a kész lib a végén mindkét hardveren működni fog (legalábbis remélem!).

Először megpróbáltam kész lib-ekből kiindulni: RC-switch jónak tűnt elsőre, de mélyebben beleásva magam kiderült, hogy annyi helyen kellene hozzányúlni, hogy inkább hagytam. Arra mindenesetre jó volt hogy merítettem belőle ötleteket, ugyanis ebben van adás és vétel is!

Amivel kezdtem foglalkozni, az a vétel és dekódolás lefejlesztése. Ehhez kell megszakításkezelés, pontos idő méricskélése és minimális számítás. Előkapartam pár évvel ezelőtti 433-as próbálkozásaimat, amikor a TFA időjárásállomás jeleit próbáltam visszafejteni. Annak a kódnak a lecsupaszítása és átszabása sokat segített, el is készült a forráskód. Tesztelni legalább annyira körülményes, mint az RTL-lel befogni az adást, de azért nem úrtechnika ez sem. Amire kíváncsi voltam:

  1. Képes-e befogni a vevő egység a gyári termosztát adását? (Elvileg ugyanazon a frekin dolgozik, ASK modulációval.)
  2. Az RTL-lel felvett és megfejtett morzesor időzítése helytálló-e a mikrokontroller mérései szerint?

Hogy ezekre választ kapjak először egy olyan kódot kellett összerakjak, ami csupán a magas és alacsony szintek váltakozásai közötti időket méri és írja ki nekem. Ha nem jön semmi amit mérhetne a vevő modulom DATA lábán a mikrokontroller, akkor szívás van. Vagy a modul szar, vagy a freki nem stimmel, vagy ki tudja... A frekvenciát elvileg lehet ezen a modulon állítani, de csak az 500 EUR-s devkittel, szóval az most úgy tűnik zsákutca. (Hacsak nem jön szembe valami orosz hekker, aki visszafejtette/lelopta a devkit-et és csinált hozzá programot/libet, amivel az EEPROM tartalmát lehet módosítani...)

A bejegyzés trackback címe:

https://ardu.blog.hu/api/trackback/id/tr2914781970

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

nistvan86 2019.12.27. 19:51:24

CC1101-et mindenképp esélytelennek látod? Filléres tétel volt, elvileg hamarosan ideér, gondoltam adok neki egy esélyt, bár én is kezdő vagyok a témában.

Egy másik fórumon hívták fel a figyelmemet arra hogy itt próbálkozol Te is a visszafejtéssel. Én egy Computherm / Delta Q7RF-nek mentem neki ugyanígy. Az rtl_433-mal elemeztem a protokollt, az elég jól kiírta az OOK kódolás adatait a szimbólum időzítésekkel és a dekódolt bit-ekkel (egészen meglepődtem). Továbbá az rpitx nevű Raspberry progival GPIO-n keresztül sikerült egy rögzített IQ fájlt visszajátszani, amivel kapcsolt is a kazán ki/be, szóval abban már biztos voltam hogy nincs ugrókódja a termosztátnak, csak egy egyszeri összepárosítás.

nistvan86 2019.12.27. 20:00:14

Elvileg a CC1101-nél van egy olyan használati mód amit "Asynchronous Serial Operations"-nek hívnak. Elvileg ez valamennyi oversampling-el képes bármilyen nyers jel fogadására és küldésére is. Kézikönyv 63. oldala www.manualslib.com/download/1516557/Texas-Instruments-Cc1101.html Gyakorlatban nem tudom mennyire fog ez működik, de majd kiderül.

denx 2019.12.28. 20:38:07

@nistvan86: Nem emlékszem már pontosan, hogy a C1101 mennyire tűnt esélytelennek, de az RFM117/217 páros visziont kiválóan bevállt. Lehet a TI egysége is beállítható úgy, hogy a vevő elhigyje amit küldünk, de nekem a promitívebb modul szimpatikusabb volt - és a használata is sokkal egyzserűbbnek tűnt.

nistvan86 2020.01.12. 21:21:54

Én kicsit máshogy bontottam fel a jelet. Az UHR-ben a szimbólum hosszt 200us-re állítottam. Így minden PWM szimbólumot három modulációs bit ír le. 001 = 1, 011 = 0, az 111 és 000-ák pedig eldobhatók, mert ezek csak a preamble-nél és a szüneteknél vannak használva. Ezeken túl beállítottam az interpretation-nél egy egyedi decoding-ben hogy 11100011 határokon vágja a jelet és ezt a mintát dobja is ki belőle. Így tisztán csak az adat marad.

Így minden elküldött parancsra 28 adatbit-et kapok. Ez ismétlődik 4x egy üzenetben.

A bit-eket hex-re alakítottam ezután. Majd kíváncsiságból felvettem ahhoz a termosztáttal generáltatok új párosító kódot, és ki/bekapcsolom a fűtést. Az alábbiakat kaptam a 3 futásban:

#1 run
0b76800 (tanulás)
0b768ff (fűtés be)
0b7680f (fűtés ki)

#2 run
151e800 (tanulás)
151e8ff (fűtés be)
151e80f (fűtés ki)

#3 run
6ed5800 (tanulás)
6ed58ff (fűtés be)
6ed580f (fűtés ki)

Még nem próbáltam ki, de szerintem az első 16 bit teljesen véletlenszerűen áll elő újratanításkor, írhatnék oda akarámit. A tanulás módba rakott vevő egy olyan üzenetet vár, amiben az utolsó 8 bit értéke 0. Ilyenkor az üzenet első 16 bit-jét elmenti mint azonosítót. Ezután csak az ezzel kezdődő üzenetekre reagál. Az üzenet végi ff a fűtés be, és az üzenet végi 0f a fűtés ki. A közbenső 4 bit tippre valamilyen státusz flag-ek, gondolom itt látszana az elem merülés is, ez nálam mindig 8.

nistvan86 2020.01.12. 21:24:29

*UHR -> URH
*kíváncsiságból felvettem ahhoz -> kíváncsiságból felvettem ahogy

Kár hogy nem szerkeszthető már.

nistvan86 2020.01.12. 21:25:46

Ja meg 11100011 -> 111000111 :( Bocsi.

denx 2020.01.27. 15:53:45

Örülök ha tudott segíteni amit én összeszedtem! Látom Te is fektettél bele energiát! Nekem az a tapasztalatom, hogy a merülő elem (termosztáton megjelenő kis ikon) nem febolyásolja a küldött csomagot, de lehet volt valami amit én nem vettem észre...

CptCaveman 2021.10.22. 22:32:13

@nistvan86: Sikerült esetleg a tanulás funkciót megoldanod időközben valahogy? Kíváncsi lennék mire jutottál.
Nekem a fenti "tanítás" sorozatra nem reagál a központ, továbbra is tanítás üzemmódban marad.

nistvan86 2021.10.23. 18:10:36

@CptCaveman: időközben írtam belőle egy ESPHome komponenst CC1101-hez, amiben a konfigban be tudsz írni tetszőleges deviceId-t, és a fali vevőt ehhez tudod társítani. github.com/nistvan86/esphome-q7rf

CptCaveman 2021.10.24. 23:33:38

Köszönöm, zseniális vagy!

Időközben kísérleteztem és arra jutottam, hogy a device ID nem feltétlenül statikus.
A párosításnál finnyás arra, hogy mit fogad be, különösen, ha egy új kört akarok létrehozni csak szofveres verzérléssel.

(nálam az flogi féle kód alapján pont a te kódod inverze van, de ez nem változtat sokat)
device id utolsó 8 bit (16+8)
zone 1 --> 0111
zone 2 --> 1011
zone 3 --> 0011
zone 4 ? --> talán 1101

CptCaveman 2022.01.09. 13:36:21

Köszi az ötleteket, különösen nistvan86.

Elkészítettem egy ESPHome modult is hozzá, így könnyebben lehet egy gyors projektre rátenni és akár mással is kombinálni.

github.com/afarago/esphome_component_computhermqrf/tree/main/components/computhermqrf

Fincy GO · http://fincy.hu 2022.10.13. 12:54:26

Üdv, én még csak most találtam rá erre a blogra és társaira szerte a neten. Nagyon tetszik, szép munka amit összehoztatok! Gondolkodom, hogy használnám (bár ezek az RF modulok már nehezen beszerezhetőek), de előtte kérdezem: Használjátok, bevált, vannak tapasztalatok?

(Én egy másik megoldásban gondolkodtam az okosítás terén, a központi egység és a kazán/szelepek közé gondoltam beállni saját relékkel, de nagyon tetszik ez a másik irány is.)

kisZelo 2022.12.29. 18:09:14

@CptCaveman:
Üdv!

Én is belekezdetem a megvélő fűtési rendszerem okosításába. Mivel csak CC1101-et tudtam beszerezni nistvan86 esphome komponensével próbálkozok. A problémám a párosítással van, fentebb te is írod, hogy finnyás device id-ra. Tudnál valami tanácsot adni mivel próbálkozzak? Próbáltam kiindulni a te komponensed leírásából is de te 5 számjegyű hexadecimális kódot használsz míg nistvan86 csak 4 számjegyűt.

@nistvan86:
Esetleg neked van ölelteted?

CptCaveman 2022.12.29. 19:31:02

@kisZelo: karácsony utáni hobbyprojekt a legjobb.

Használd nistvan kódját, annyi van, hogy ami neki fix státusznak látszik, abban kódolva van, hogy Q8RF melyik zónáját akarod kapcsolni (azaz a generált id 16 bit random, míg a maradék 4 bit zóna+talán státusz).

Ha egy zónát vezerelsz akkor jó a köszi ha nem, akkor ezt kell majd atirnod, kiterjesztened az általam leírt kódolás szerint (+inverz!)

// Command
encode_bits(device_id, 16, &cursor);
encode_bits(8, 4, &cursor); // zone #1 = 0x8 avagy ~0x7
encode_bits(cmd, 8, &cursor);

Sok sikert! Remélem tudtam segíteni.

CptCaveman 2022.12.29. 19:33:44

elnézést, autocorrect:
Ha egy zónát vezérelsz, akkor jó a kód, így ahogy van.

kisZelo 2022.12.29. 20:23:14

@CptCaveman: Kösz a választ, igen segítettél ezzel is bár idáig eljutottam magam is, de legalább valaki megerősített benne. A mondott kódot átírtam ez alapján:

1000 = 8 - 1st zone
0100 = 4 - 2nd zone
1100 = 12 - 3rd zone
0010 = 2 - 4th zone

A konkrét problémám, hogy akármilyen device_id-t adok meg és küldök pairing üzenetet a zónavezérlőnek miközben villog az adott zóna melletti led, nem akar működni a párosítás. Mivel más is írta már, hogy használta már sikeresen nistvan86 komponensét és ő is a device id nehézségeire panaszkodott gondoltam rákérdek itt. Ha tudnál mondani egy olyan device id-t ami biztosan működik akkor annyival előrébb lennék. Lehet persze hogy teljesen máshol van a hiba, de legalább ezt ki tudnám zárni.
süti beállítások módosítása