Forum

Forum

Notifications
Clear all

Zigbee nad RPi4

184 Posts
15 Users
14 Likes
19.3 K Views
(@smotek7)
Member
Joined: 7 years ago
Posts: 1896
 

@budulinek no chcel som si to zjednodusit 😀
Lebo on tam ponuka link na to co skompiloval a aj nejaky dalsi co skompiloval.
To zas bude pre mna boj.


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
 

Mám tu další díl seriálu "Zigbee nad Tasmotou"....

Zatím jsem si hrál jenom se senzory, nastal čas na nějaké ty ZigBee aktory. Nebudou to žádná světýlka, ale rovnou motůrek! Potřeboval jsem konečně vyřešit centrální zamykání baráku. Nechtěl jsem to řešit nějakejma Číňanama (Tuya), takže 🇩🇰 🇪🇺 :

Danalock V3

Párování s Tasmotou bez problémů. Zasekl jsem se v okamžiku, kdy jsem chtěl Danalock ovládat. Tasmota oficiálně podporuje jenom příkazy na světýlka, zásuvečky a podobné věci (viz https://tasmota.github.io/docs/Zigbee/#sending-device-commands ). No jo, ale Danalock je přece zámek a ne nějaká zásuvka....

Takže jsem strávil (naštěstí jenom jeden) večer dumáním nad "clusterama" a "commandama". Někde jsem někde našel, že cluster pro dveřní zámky je 0x0101 - takže se mi nakonec podařilo zámek roztočit. Musím pochválit Tasmotu. Stačilo skočit do konzole v Tamotě, házel jsem tam naslepo "low-level" příkazy ( https://tasmota.github.io/docs/Zigbee/#low-level-commands ). U jednoho pokusu se Danalock roztočil a měl jsem vyhráno:

zamknout

ZbSend { "device":"ZB4.01_Obyvak_zamek", "Send":"0101!00"}

odemknout

ZbSend { "device":"ZB4.01_Obyvak_zamek", "Send":"0101!01"}

Integrace do Loxonu naprosto primitivní. Ten samý příkaz, který funguje v konzoli Tasmoty hodíte do virtuálního HTTP výstupu (instrukce při zapnutí a instrukce při vypnutí):

/cm?cmnd=ZbSend { "device":"ZB4.01_Obyvak_zamek", "Send":"0101!00"}
/cm?cmnd=ZbSend { "device":"ZB4.01_Obyvak_zamek", "Send":"0101!01"}

Pro úplnost, Danalock můžete samozřejmě ovládat u manuálně otočením zámku, bylo by fajn aby se Loxone dozvěděl, že jste zámek ručně otočili. Bohužel nevím, jak přinutit Danalock, aby mi přes ZigBee sám reportoval změnu stavu, takže to řeším periodickým dotazem z Loxonu. Můžete si to sami zkusit v konzoli Tasmoty (a pak si to vložit do HTTP výstupu v Loxonu):

ZbSend { "device":"ZB4.01_Obyvak_zamek", "cluster":"0x0101", "read":"0x0000" }

To samé, co se vám vrátí v konzoli Tasmoty dostane Loxone přes UDP zprávu, takže stačí parsovat v UDP vstupu:

"Name":"ZB4.01_Obyvak_zamek"\i"LockState":\i\v

Akorát si dejte pozor při parsování. "LockState":1 znamená zamčeno, "LockState":2 je odemčeno.

Ano, musel jsem na Danalock použít "low-level" příkazy v Tasmotě. Ale připomínám - na rozdíl od zigbee2mqtt neřeším nějaké moskyty nebo noudredy nebo Loxberry ani jiné maliny. Neřeším nefunkční "loxberry plugin zigbee2mqtt" ( viz https://www.vodnici.net/community/loxone-a-arduino/inteligentni-zamek-vstupni-dvere/paged/5/ ).

Všechno jde přímo Danalock <-> ZigBee brána (Tasmota) <-> Loxone.

 


   
smotek7 reacted
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
 

OK, tak jsem zjistil, jak přinutit Danalock, aby mi sám reportoval změnu stavu (např. pokud ručně otočím zámek nebo ho otočím přes modrozuba).

TL;DR  Stačí jeden příkaz v Tasmotě:

ZbBind {"Device":"ZB4.01_Obyvak_zamek","Cluster":"0x0101"}

 

 

A nějaká ta osvěta. Pár pojmů ZigBee:

Cluster

Clustery jsou skupiny příkazů a atributů, které definují, co zařízení může dělat. Tak např. čidlo teploty a vlhkosti Sonoff umí clustery 0x0000 (Basic), 0x0001 (Power Configuration), 0x0402 (Temperature Measurement), 0x0405 (Relative Humidity Measurement). Naopak Danalock umí 0x0000 (Basic), 0x0001 (Power Configuration), 0x0101 (Door Lock) a pár dalších servisních a diagnostických clusterů. Uvnitř clusterů jsou attributes a commands, které můžete číst (attributes) nebo jimi můžete zařízení ovládat (commands). Můžeme je přirovnat k registrům v Modbusu, ale jsou tu dva rozdíly

  • dobrá zpráva: clustery, attributy a commandy v ZigBee jsou (na rozdíl od registrů v Modbusu) standardizované. Takže atribut 0x0000 v clusteru 0x0101 bude vždy znamenat Lock state (stav zámku zamčeno/odemčeno) bez ohledu na výrobce zámku.
  • špatná zpráva: informace o tom, jaké clustery vaše zařízení podporuje, nejsou (většinou) veřejně dostupné. Prostě se nepředpokládá, že by se v tom enduser hrabal, i když to není nijak složité (ne složitější než Modbus).

U čínských ZigBee věcí od Tuya se třeba dozvíte, jaké clustery které zařízení umí ( https://developer.tuya.com/en/docs/iot-device-dev/access-standard-zigbee?id=Kaiuyf28lqebl), ale Danalock mlčí..... Akorát se dá najít leaknutý manuál:

a pak jsem našel manuál od jiného výrobce chytrých zámků. Vzhledem k tomu, že to jsou standardizované věci, fungují i u Danalocku:

Co teda můžete uvnitř jednotlivých clusterů:

  • poslat na zařízení dotaz na stav (read) nějakého atributu
  • poslat zařízení příkaz (write)  na nějaký command
  • říct zařízení, aby vám automaticky posílal zprávy, pokud se změní atributy v daném clusteru

Čtení v Tasmotě vypadá takto (viz https://tasmota.github.io/docs/Zigbee/#low-level-commands):

ZbSend { "device":"ZB4.01_Obyvak_zamek", "cluster":"0x0001", "read":"0x0021" }

je to samé jako

ZbSend {"Device":"ZB4.01_Obyvak_zamek","Send":"0001_00/2100"}
  • na device ZB4.01_Obyvak_zamek
  • na cluster 0x0001 (Power Configuration) posílám
  • _00 generický příkaz "read", přičemž chci číst
  • attribute 0x0021 (Battery percentage), v little endian, takže prohozené bajty

A Tasmota mi v konzoli vyplivne stav baterky Danalocku v procentech.

A zápis (write), tj. odeslání commandu vypadá takto:

ZbSend { "device":"ZB4.01_Obyvak_zamek", "Send":"0101!01"}
  • na device ZB4.01_Obyvak_zamek
  • na cluster 0x0101 (Door lock) posílám
  • !01 cluster-specific příkaz "unlock door"
  • v tomto commandu za lomítkem nic není, ale některé příkazy (např. 0x05: Set PIN) tam posílají data (PIN)

A zámek zavrčí a odemkne se. Doteď to vypadalo podobně jako u Modbusu, tedy požadavek na čtení dat  a požadavek na zápis - posílání příkazů. Ale ZigBee zařízení umí na rozdíl od pitomého Modbusu jednu krásnou věc: automaticky posílat data. K tomu slouží:

Bind

Zaprvé: rozlišujte "pairing" a "binding". Párování znáte - párujete koncové zařízení ke koordinátorovi (ZigBee hub). Je to připojení k síti na fyzické vrstvě.

Binding je propojení na datové vrstvě. Pokud jsou dvě zařízení propojena přes "binding", vyměňují si data v rámci daného clusteru. Zdrojové zařízení pošle cílovému zařízení zprávu, pokud se změní hodnota nějakého attributu v daném clusteru. Samozřejmě, abyste mohli udělat binding, musí zdrojové zařízení podporovat odesílání dat daného clusteru a cílové zase  musí umět přijímat daný cluster. Nemůžete udělat binding mezi Danalockem a Ikea žárovkou, protože Ikea žárovka neumí přijímat cluster 0x0101 (Door Lock). Zato ale bude umět přijímat cluster 0x0006 (On/Off).

ZigBee "bind" se možná dá přirovnat k MQTT "publish" a "subscribe", ale s jedním podstatným rozdílem: MQTT je centralizovaný protože informace o tom co se komu má (pře)poslat jsou uložena centrálně v "MQTT broker" (např. Mosquitto). V ZigBee si každé zařízení (vč. zdánlivě "pitomých" senzorů a tlačítek) umí zapamatovat (v EEPROM), jaká data ("Cluster") má komu ("ToDevice") posílat. Takže k tomu, aby nějaké ZigBee tlačítko automaticky posílalo změny attributů (zmáčknutí tlačítka) v rámci clusteru 0x0006 (On/Off) na ZigBee žárovku (která umí cluster 0x0006 přijímat), nepotřebujete ZigBee koordinátora (Tasmotu). Stačí, kdy vytvoříte binding mezi tlačítkem a žárovkou. Přesněji řečeno řeknete tlačítku ("Device"), aby si zapamatovalo, že změny clusteru ("Cluster") má automaticky posílat žárovce ("ToDevice"). V Tasmotě to uděláte přes ZbBind - viz https://tasmota.github.io/docs/Zigbee/#zigbee-binding . "Endpoint" a "ToEndpoint" nás v tuto chvíli nezajímá, můžete vynechat, Tasmota si to dokáže odvodit sama.

Zajímavá situace nastane, pokud v příkazu ZbBind vynecháte "ToDevice". Vlastně tím naučíte cílové zařízení ("Device") automaticky posílat data daného clusteru koordinátorovi (Tasmota hubu) samotnému. A Tasmota to automaticky přepošle na Loxone. A jsme doma.

OK, trocha praxe. Nejdřív by stálo za to zjistit, kam všude ZigBee zařízení svá data posílá:

ZbBindState ZB2.02_Digestor

ZB2.02_Digestor je senzor teploty a vlhkosti. Z výsledku zjistím, že tenhle senzor má v paměti uložené celkem 3 bindings (pokud se vám vrátí "ZbRouteError", znamená to, že senzor usnul - zkoušejte příkaz ZbBindState znova). Ty 3 bindings se týkají clusterů 0x0001 (Power Configuration, ve kterém je i atribut ke stavu baterky), 0x0402 (Temperature Measurement), 0x0405 (Relative Humidity Measurement). Všechny bindings mají stejné "ToDevice", v mém případě tajuplné "0x04CD15FFFEBB3F81". To není nikdo jiný než moje Tasmota. Znamená to, že senzor automaticky posílá změny v těchto clusterech (tj. stav baterky, teploty a vlhkosti) na koordinátora (Tasmotu). Jak je možné, že sensor má v paměti tyhle 3 bindings? No protože Tasmota v okamžiku, kdy proběhlo párování, tak zjistila, že se jedná o senzor vlhkosti a teploty. A sama automaticky naučila senzor tyhle ty tři bindings (poslala tři příkazy ZbBind). Teď zkusíme:

ZbBindState ZB4.01_Obyvak_zamek

mi vyplivne jenom jedno binding (na cluster 0x0001 - baterka). Tasmota bohužel neumí door locks, takže během párování udělala automatické binding jenom na baterku. To musíme napravit tím, že naučíme Danalock nové binding na cluster 0x0101 (Door Lock). "ToDevice" vynecháme, což znamená, že cílovým zařízením odesílaných dat bude Tasmota samotná:

ZbBind {"Device":"ZB4.01_Obyvak_zamek","Cluster":"0x0101"}

OK, a pro úplnost ještě:

Groups

ZigBee protokol umí sloučit vícero zařízení do "groups". Přesněji řečeno, můžete své ZigBee zařízení naučit, aby se stalo členem nějaké ZigBee skupiny (group) (viz https://tasmota.github.io/docs/Zigbee/#zigbee-groups ). Jakmile máte zařízení přiřazená do skupiny, můžete příkazy ZbSend, ale i ZbBind posílat nikoliv na jedno konkrétní zařízení, ale na celou grupu. Můžete jedno ZigBee tlačítko "bindovat" s celou skupinou ZigBee žárovek najednou.

Podobně jako "bindings" (informace o tom, jakému koncovému zařízení nebo koncové skupině se mají posílat informace z daného clusteru), tak i informace o členství v "groups" není uložena v koordinátorovi (Tasmotě), ale v EEPROM paměti samotných koncových zařízení.

Uff, trochu jsem se rozepsal. No, jednak osvěta pro ostatní, jednak reference pro mě až zapomenu, jak vlastně ZigBee funguje 🙂 Nechávám na @L jestli to nechce hodit do wiki nebo třeba jako blog post (že bychom místo truhlíků měli něco k ZigBee 🙂 ).


   
Aleq reacted
ReplyQuote
 L
(@l)
Famed Member Admin
Joined: 9 years ago
Posts: 3062
 

@budulinek toto by bylo super hodit do wiki, koukam ze pristup mas, tak to tam klidne zkopiruj/poupravuj pls. Ja zatim klasicky casove nestiham vubec nic a honim vse na posledni chvili.

(a btw, truhliky a dalsi clanky mi jedou stale ze zasoby, co sem napsal tenkrat jeden ten viken jak sem se hecl ;-))) )


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
 

První dva díly tutoriálu jsou na wiki:

https://www.vodnici.net/wiki/zigbee-pres-tasmotu-1-hardware/

https://www.vodnici.net/wiki/zigbee-pres-tasmotu-2-napojeni-zigbee-senzoru-a-aktoru-na-loxone/

 

@smotek7 najdeš tam i zkompilovanou Tasmotu, pokud sis ji ještě nezkompiloval sám.


   
ReplyQuote
(@smotek7)
Member
Joined: 7 years ago
Posts: 1896
 

@budulinek dik, este to odkladam. 
 
Ale ked je takyto navod tak to skusim.


   
ReplyQuote
 L
(@l)
Famed Member Admin
Joined: 9 years ago
Posts: 3062
 

@budulinek jeste jednou diky moc za clanky!


   
ReplyQuote
(@smotek7)
Member
Joined: 7 years ago
Posts: 1896
 

@budulinek pouzil som tu tvoju "zavaraninu".
Najviac casu som stavil hladanim v ktorom sufliku je GW03 a kym som rozchodil prevodnik na WIN11.
Inak zaujimava vec, ze ked je prve prevodnik v PC a potom pripojim napajanie k GW tak to nespusti flasch. Musel som najskor pripojit vsetky kabliky a potom USB. 

Cele rozchodenie po prve funkcne zariadenie je tak 15min casu. (ak by som sa netrapil s prevodnikom)

Parovanie je fakt jednoduche.
To premenovanie ide len cez konzolu?
Nedari sa mi spraovat IKEA SYMFONISK 603.704.80
https://www.ikea.com/sk/sk/p/symfonisk-dialkovy-ovladac-zvuku-biela-60370480/
Je mozne ze to Tasmota nepodporuje?

Viem nejak donutit zariadenie aby sa prehodilo na repeater?

Zda sa mi ze odozva je o nieco pomalsia ako pri zigbee2mqtt na loxberry.
Ale to este odsledujem.


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
 
Posted by: @smotek7

To premenovanie ide len cez konzolu?

Ano.

ZbName 0x12AB,Muj_senzor

Pozor na syntaxi, je tam čárka, ne mezera.

Posted by: @smotek7

Je mozne ze to Tasmota nepodporuje?

Ne 🙂

Dovolím si tvrdit, že Tasmota si poradí se vším, co splňuje standardy ZigBee. IKEA si občas ZigBee trochu "ohýbá" a párování (ze strany jejích zařízení) může být složitější ve stylu "open the battery cover and press the button 4 times rapidly":

https://zigbee.blakadder.com/Ikea_E1744.html

Posted by: @smotek7

Viem nejak donutit zariadenie aby sa prehodilo na repeater?

Ano i ne.

Můžeš zkusit zařízení Tasmotě nejdřív odebrat (ZbForget) a pak znovu spárovat. Zařízení by se mělo připojit k routeru (repeateru), pokud je blíž. Ale obecně řečeno, o tom, přes koho se připojí, si ZigBee zařízení rozhodují sama. Pokud do sítě přidáš router (repeater), blízká zařízení se k němu sama postupně připojí (dej jim trochu času). A pokud ho odebereš, budou si zařízení sama hledat jinou cestu jak se připojit.

 

Posted by: @smotek7

Zda sa mi ze odozva je o nieco pomalsia ako pri zigbee2mqtt na loxberry.

Já Ikeu (a vlastně ani žádé jiné tlačítko) nemám. Ale je pravda, že i @l-adamek si stěžoval na zpoždění:

https://www.vodnici.net/community/postid/31936/

Řešením by mělo být udělat binding mezi tlačítkem a světlem. Dá se to udělat tak, aby povel tlačítka šel do žárovky (přímo, bez zprostředkování koordinátorem a tudíž okamžitě) a zároveň do koordinátora (tj. do Loxone, se zpožděním, aby i Loxone věděl, že se tlačítko zmáčklo). Bindings budou ve 4. dílu tutoriálu.


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
 
Posted by: @smotek7

Zda sa mi ze odozva je o nieco pomalsia ako pri zigbee2mqtt na loxberry.

Aha..... Tak tohle asi bude příčinou toho zpoždění.

https://tasmota.github.io/docs/Zigbee-Internals/#7-publish-the-final-message-to-mqtt-or-defer-the-message

 


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
 

@smotek7

@l-adamek

Zkuste tohle, jestli budete mít rychlejší odezvu.

Kompilováno s těmito parametry:

#ifdef FIRMWARE_EWELINK
#warning * Build: FIRMWARE FOR EWELINK ZB-GW03-V1.3 *

#undef SERIAL_LOG_LEVEL
#define SERIAL_LOG_LEVEL LOG_LEVEL_NONE
#undef SYS_LOG_LEVEL
#define SYS_LOG_LEVEL LOG_LEVEL_INFO

#define USE_ZIGBEE
#undef USE_ZIGBEE_ZNP
#define USE_ZIGBEE_EZSP
#define USE_UFILESYS
#define USE_ZIGBEE_EEPROM // T24C512A
// #define USE_TCP_BRIDGE
#undef USE_ZIGBEE_CHANNEL
#define USE_ZIGBEE_CHANNEL 11 // (11-26)

#undef USE_ZIGBEE_COALESCE_ATTR_TIMER
#define USE_ZIGBEE_COALESCE_ATTR_TIMER 0
#undef USE_ZIGBEE_DEBOUNCE_COMMANDS
#define USE_ZIGBEE_DEBOUNCE_COMMANDS 20

#define USE_ETHERNET
#undef ETH_TYPE
#define ETH_TYPE 0 // ETH_PHY_LAN8720
#undef ETH_CLKMODE
#define ETH_CLKMODE 3 // ETH_CLOCK_GPIO17_OUT
#undef ETH_ADDRESS
#define ETH_ADDRESS 1 // PHY1

#define USE_TLS
#endif

 


   
ReplyQuote
(@smotek7)
Member
Joined: 7 years ago
Posts: 1896
 

Ja najskor skusim nejak zmerat aky je rozdiel voci tomu zigbee2mqtt.

Aby sme vedeli porovnat.


   
ReplyQuote
(@smotek7)
Member
Joined: 7 years ago
Posts: 1896
 

No po trapeni preco nejdu sparovat IKEA tlacitka som zistil, ze mam v zigbee2mqtt zabudnute aktivne parovanie a Z2M je pazravejsie ako Z2T. Cize skor tlacitko chyti Z2M.

Rychlost:
Z2T pomalsie o 0,3s ako Z2M, nikedy to ale vyskoci aj na 0,6s.
To je rozdiel nie odozva. 
Po update na tu novu kompilaciu je to rovnake.

Ma Z2T nieco take ako T2M Reset after send?
Ked dam kratky klik tak to posle 1 a hned 0. 
Z2T posiela len 1, ze sa stlacilo.


   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
 

Bohužel nemám žádné ZigBee tlačítko, takže nemůžu pořádně testovat. Můžu jenom sledovat jak rychle dostane Loxone zprávu pokud zamknu/odemknu Danalock zámek a tam je to v zásadě okamžité.

V Tasmota logu mám zpoždění mezi příjmem dat ze ZigBee modulu a odesláním naformátovaného JSONu v řádu desítek ms.

22:10:28.352 ZIG: {"ZbEZSPReceived2":"698689697900000000000000000709000000000000000002"}
......
22:10:28.366 RSL: SENSOR = {"Device":"0xXXXX","Name":"ZB4.01_Obyvak_zamek","0101<20":"02010000000000000000","Endpoint":1,"LinkQuality":58}
....
22:10:28.421 RSL: SENSOR = {"Device":"0xXXXX","Name":"ZB4.01_Obyvak_zamek","LockState":1,"Endpoint":1,"LinkQuality":58}

Pro jistotu ověř, že máš na Tasmotě:

  • vypnuté WiFi rozhraní
  • vypnuté MQTT
  • Syslog host () nastav na 255.255.255.255 (= zprávy budou posílané jako UDP broadcast, bývá to o pár desítek ms rychlejší než unicast na konkrétní IP adresu)

   
ReplyQuote
(@budulinek)
Reputable Member
Joined: 7 years ago
Posts: 355
 
Posted by: @smotek7

Ma Z2T nieco take ako T2M Reset after send?
Ked dam kratky klik tak to posle 1 a hned 0. 
Z2T posiela len 1, ze sa stlacilo.

Když uvolníš tlačítko tak do Tasmota logu nedostaneš žádnou zprávu?


   
ReplyQuote
Page 8 / 13
Share: