ZigBee přes Tasmotu 3: Neznámé ZigBee zařízení (Danalock)

ZigBee přes Tasmotu 3: Neznámé ZigBee zařízení (Danalock)

How Can We Help?

Categories

ZigBee přes Tasmotu 3: Neznámé ZigBee zařízení (Danalock)

You are here:
< Zpět

ZigBee přes Tasmotu 1: Hardware
ZigBee přes Tasmotu 2: Napojení ZigBee senzorů a aktorů na Loxone
ZigBee přes Tasmotu 3: Neznámé ZigBee zařízení (Danalock)
ZigBee přes Tasmotu 4: Automatické posílání dat senzorem

TL;DR

Přes Tasmotu můžeme číst a ovládat i ZigBee zařízení, které není na seznamu “oficiálně” podporovaných zařízení. Potřebujeme ale zjistit, co zařízení umí (“clusters”), jaká data z něj můžeme číst (“attributes”) a jaké přijímá příkazy (“commands”).

Například ZigBee zámek Danalock můžeme jednoduše ovládat pomocí virtuálního HTTP výstupu s těmito instrukcemi při zapnutí a vypnutí:

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

Seznamy podporovaných ZigBee zařízení

Na netu najdete dva seznamy ZigBee zařízení.

  1. Na www.zigbee2mqtt.io/supported-devices/ najdete seznam ZigBee zařízení, která mají podporu v rámci Zigbee2MQTT. Není pochyb o tom, že co do množství podporovaných zařízení nemá Zigbee2MQTT konkurenci. My ale Zigbee2MQTT nepoužíváme, protože Loxone neumí MQTT protokol a nechceme MQTT složitě převádět pomocí nějakého dalšího serveru (viz první článek tutorialu). Databáze Zigbee2MQTT pro nás i tak může být užitečná, pokud sháníme nějaké zařízení a chceme si ověřit, co umí.
  2. Na zigbee.blakadder.com/index.html najdete další databázi ZigBee zařízení, která je poněkud přívětivější na filtrování a vyhledávání zařízení. Neomezuje se na Zigbee2MQTT, ale můžete si zařízení filtrovat podle toho, zda mají “oficiální” podporu v různých alternativních firmwarech (Tasmota, Zigbee2MQTT, deConz…). Za druhé, můžete si snadno procházet ZigBee zařízení podle typu (senzory, zásuvky, světla, rolety, zámky…).

Seznam zařízení podporovaných v Tasmotě je úctyhodný, ale může se vám stát, že vaše zařízení mezi nimi není – Tasmota například nemá oficiální podporu ZigBee zámků. V databázi se pouze dočtete, že “If the device is following Zigbee standards it is possible it will work with other gateway solutions, it is just not confirmed as working yet!” OK, v tomto článku si ukážeme, jak na Tasmotu (tj. i na Loxone) připojit ZigBee zařízení, u kterého (zatím) není oficiálně potvrzena kompatibilita s Tasmotou. Konkrétně zkusíme zámek Danalock. Ale ještě než se do toho pustíme, dovolím si trochu osvěty a vysvětlování pojmů ze světa ZigBee.

ZigBee Cluster

Clustery jsou skupiny funkčně souvisejících příkazů (commands) a atributů (atributes), které definují, co zařízení může dělat. Každý cluster je identifikován 16-bitovým identifikátorem. Clustery jsou standardizovány (v ZigBee Cluster Library – ZCL), ale někteří výrobci (IKEA, Tuya) si přidávají vlastní specifické clustery (s vlastními attributes a commands). Seznam standardizovaných clusterů najdete tady (pozor, seznam je neúplný).

Koncová ZigBee zařízení si umí přímo mezi sebou posílat příkazy (o tom si víc povíme ve 4. tutorialu), takže ještě musíme rozlišovat, jestli zařízení umí příkazy daného clusteru přijímat nebo odesílat.  InCluster znamená, že zařízení funguje jako server a umí přijímat příkazy definované v rámci daného clusteru (včetně příkazu “read” na čtení atributů). OutCluster znamená, že zařízení umí odesílat příkazy a fungovat jako klient v rámci daného clusteru.

OK, dost bylo teorie, jdeme to vyzkoušet. Jaké InClustery a OutClustery vaše zařízení umí zjistíte pomocí příkazu

ZbProbe ZB4.01_Obyvak_zamek

a konzole nám (mimo jiné) vyplivne tento řádek:

{"ZbState":{"Status":33,"Device":"0x76C6","Endpoint":"0x01","ProfileId":"0x0104","DeviceId":"0x000A","DeviceVersion":1,"InClusters":["0x0000","0x0001","0x0003","0x0009","0x0020","0x0101","0x0B05","0xFCFF"],"OutClusters":["0x0019"]}}

Zjistili jsme, že Danalock umí přijímat příkazy definované v rámci 8 různých clusterů, ale odesílat příkazy pouze jediného. Ty nejdůležitější a nejzajímavější clustery jsou:

  • 0x0000 Basic             (základní info o zařízení)
  • 0x0001 Power Configuration       (napájení a baterka)
  • 0x0101 Door Lock

Pro ilustraci pár dalších clusterů, se kterými se můžete potkat v běžných ZigBee zařízeních (senzory, tlačítka, zásuvky, žárovky):

  • 0x0006 On/Off              (vypínání a zapínání věcí)
  • 0x0008 Level Control         (např. stmívání světel)
  • 0x0402 Temperature Measurement
  • 0x0405 Relative Humidity Measurement
  • 0x0500 IAS Zone        (okenní kontakty, čidla pohybu)

ZigBee Attribute

Atribut je proměnná definovaná uvnitř konkrétního clusteru, identifikovaná 16-bitovým identifikátorem. Atributy mohou uchovávat informace o zařízení (např. Manufacturer – jméno výrobce zařízení), stav zařízení (např. LockState – aktuální stav zámku) nebo měřené veličiny (např. Temperature). ZigBee zařízení nám může na vyžádání poslat hodnotu attributu (pokud mu pošleme příkaz “read”) nebo je dokonce může posílat automaticky (o tom si povíme příště).

ZigBee atributy můžeme přirovnat k Modbus registrům, ale s jedním podstatným rozdílem: attributy v ZigBee jsou standardizované (v ZigBee Cluster Library). Takže pokud budeme číst atribut 0x0021 v clusteru 0x0001, vždycky se nám vrátí BatteryPercentage.

Pár zajímavých atributů

  • cluster
    • attribute
  • 0x0000 Basic
    • 0x0004 Manufacturer
    • 0x0005 ModelId
  • 0x0001 Power Configuration
    • 0x0020 BatteryVoltage
    • 0x0021 BatteryPercentage
  • 0x0402 Temperature Measurement
    • 0x0000 Temperature
  • 0x0405 Relative Humidity Measurement
    • 0x0000 Humidity

Standardizace je super. Průser je v tom, že oficiální dokumentace ZigBee Cluster Library je šílená (přes 1300 stránek!) a na netu se nikde nedá najít nějaká přehledná tabulka s clustery a atributy. Vlastně jedinou cestou, jak se dopátrat seznamu atributů, je podívat se do kódu Tasmoty. Jděte do /tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_converters.ino a hledejte const Z_AttributeConverter . V druhém sloupci máte ID clusteru, ve třetím ID atributu a ve čtvrtém máte human-readable název atributu. Dobrá zpráva, v clusteru 0x0101 Door Lock máme v Tasmotě nadefinovaných prvních pět atributů, včetně 0x0000 “LockState”.

  • 0x0101 Door Lock
    • 0x0000 LockState
    • 0x0001 LockType

ZigBee Command

ZigBee commands jsou obdobou Modbus functions. Pomocí příkazů můžeme číst atributy, ovládat zařízení nebo dokonce nastavovat zařízení. Rozlišujeme dvě kategorie příkazů: 1) generic commands a 2) cluster-specific commands.

Generic Commands

Generické příkazy můžeme použít v jakémkoliv clusteru, v syntaxi Tasmoty je poznáte podle podtržítka _ . Je jich jenom pár (seznam zde) a ve skutečnosti nás zajímá jenom jediný z nich:

    • 0x00 Read Attributes

Jdeme do konzole Tasmoty otestovat generický command “Read Attributes”. Na cluster 0x0101 (Door Lock) posíláme generický command 0x00, přičemž v payloadu příkazu dáváme ID atributu, který nás zajímá – tedy 0x0000 LockState (v little endian, prohozené bajty).

ZbSend {"Device":"ZB4.01_Obyvak_zamek","Send":"0101_00/0000"}

a protože Tasmota zná generický příkaz 0x00 jako “Read”, můžeme jako ekvivalent použít:

ZbSend { "Device":"ZB4.01_Obyvak_zamek", "Cluster":"0x0101", "Read":"0x0000" }

V konzoli se mi vrátí v human-readable podobě (protože Tasmota zná atribut 0x0000 v clusteru 0x0101 jako “LockState”):

{"ZbReceived":{"0x76C6":{"Device":"0x76C6","Name":"ZB4.01_Obyvak_zamek","LockState":2,"Endpoint":1,"LinkQuality":55}}}

Paráda. LockState je 2, podle dokumentace to znamená “Unlocked”.

Cluster Specific Commands

Tyto příkazy jsou unikátní pro každý cluster, v syntaxi Tasmoty je poznáte podle vykřičníku ! . Prvním místem, kde hledám příkazy z clusteru 0x0101 na zamykání a odemykání je dokumentace  Tasmoty. Jak vidíte, Tasmotou podporovaných příkazů je docela dost, najdeme dokonce i příkazy pro sousední cluster 0x102 (Window Covering cluster, tedy okenní rolety). Ale pro cluster 0x0101 nic. Zkouším ještě zdrojový kód Tasmoty. Pokud chcete vědět, jaké všechny cluster-specific příkazy Tasmota podporuje, jděte do /tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_6_commands.ino a hledejte const Z_CommandConverter . V prvním sloupci je human-readable název příkazu používaný Tasmotou, v druhém je ID clusteru a ve třetím je samotný příkaz. Příkazy pro cluster 0x0101 opravdu chybí.

Obecně řečeno, existují dvě možná vysvětlení: A) pro daný cluster žádné cluster-specific commands nejsou (i to se může stát, některé clustery postrádají commandy) nebo B) příkazy existují, ale Tasmota je nezná. V případě clusteru 0x0101: B je správně, protože se mi na netu podařilo vyhrabat neoficiální, leaknutou, starou (z let 2016/2017)  dokumentaci Danalocku , kde příkazy z clusteru 0x0101 jsou. Nechápu, proč to Danalock nedává jako přílohu oficiální dokumentace? A nebo ještě líp, definice příkazů není nic, co by si vymyslel Danalock, je to standardizované v rámci ZCL. Tak proč slavná ZigBee Alliance nezvedne prdel a neudělá někde na webu přehlednou tabulku clusterů a commandů? No nic, máme dva commandy specifické pro cluster 0x0101 Door Lock:

    • 0x00 Lock Door
    • 0x01 Unlock Door

Na cluster 0x0101 (Door Lock) posíláme cluster-specific command 0x00. Podle dokumentace  by v payloadu mohl být PIN uživatele, já ho vynechávám:

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

a Danalock vrčí, svítí červeně a zamyká. Zkusíme ještě cluster-specific command 0x01:

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

a Danalock odemyká.

Samotná integrace do Loxonu je banální. 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"}

 

Pomohl Vám náš blog? Chcete nás podpořit? I málo udělá radost 😉
Become a patron at Patreon!
Table of Contents

Leave a Reply

Your email address will not be published. Required fields are marked *