1) 参考网站
https://github.com/Frans-Willem/AqaraHub/blob/master/documentation/mqtt-topics.md
2)zigbee 背景知识
zigbee指定了很多不同的簇,通常每一个设备都会用到其中的一个或者多个簇。例如:
"On/Off" 对于一个简单的状态切换设备
"Window Covering" 自动窗帘
"Temperature Measurement" 温度传感器
每一个簇都有自己的属性,例如"Temperature Measurement"簇中拥有"MeasuredValue"属性;"On/Off" 簇中拥有"On/Off"属性。
有些命令是从设备发送给网关,我们叫做输入命令("Incoming commands");有些命令从网关发送给设备,我们叫作输出命令(Outgoing commands)。
例如输出命令可以是对于"On/Off"属性可以进行"Toggle";对于"Window Covering"属性进行"Go To Lift Percentage"。输入命令可以是"IAS Zone" 簇中的"Zone Status Change Notification"。
除此之外,还有一个通用命令或全局命令列表,这些命令对所有集群都是有效的,并且没有明确定义为适用于特定的方向。例如,“报告属性”在属性更改时从设备发送到网关,或“发现属性”从网关发送到设备。
最后,一个设备可能有一个或多个可以发送和接收这些命令或属性的“端点”。多个端点的一个例子是双开关,其中左边的是端点1,右边的是端点2。对于大多数目的,将端点视为子设备就足够了。
3)Aqarahub项目如果处理命令
为了让AqaraHub正确地处理簇或命令,应该在cluster.info文件中定义它。小米Aqara设备使用的大多数集簇和命令及其参数应该已经存在,但是其他平台的可能不存在。对于任何缺少的簇、命令、属性或命令参数,可以使用“Zigbee集群库规范”的副本谷歌,并使用它来扩展cluster.info文件。如果您扩展这个文件,在Github上发出下拉请求将非常感谢。
注意:由于MQTT使用'/'分隔主题,因此将从AqaraHub的MQTT输入和输出中的集群、命令和属性名称中删除此字符。
4)输入命令(Incoming commands )
输入命令从设备到网关,然后将会触发网关将对应的消息推送给对应的mqtt主题。mqtt主题的格式如下,消息以json的格式放在mqtt负载处。
AqaraHub/[device-id]/[endpoint-id]/in/[cluster name]/[command name]
同样的,上报属性命令也会触发网关将对应的消息推送给对应的mqtt主题。mqtt主题的格式如下,消息以json的格式放在mqtt负载处。
AqaraHub/[device-id]/[endpoint-id]/in/[cluster name]/Report Attributes/[attribute name]
例如:
当按下一个aqara按钮时,AqaraHub将下面的json文件推送到AqaraHub/00158d000152d7b2/1/in/OnOff/Report Attributes主题,消息内容如下:
{
"reports": [{
"Attribute data":
{
"type": "bool",
"value": true
},
"Attribute identifier": "OnOff"
}]
}
同时,因为这是一个报告属性命令,它同样会推送到AqaraHub/00158d000152d7b2/1/in/OnOff/Report Attributes/OnOff,推送消息内容如下:
{
"type": "bool",
"value": true
}
另一方面,一个水浸传感器不会以属性的方式上报,而是推送到AqaraHub/00158d0001bb8d6d/1/in/IAS Zone/Zone Status Change Notification ,推送消息为
{
"Delay":0,
"Extended Status":[false,false,false,false,false,false,false,false],
"Zone ID":255,
"Zone Status": [true,false,false,false,false,false,false,false,
false,false,false,false,false,false,false,false]
}
注意:在水泄漏检测器的情况下,我们所追求的只是“区域状态”中的许多区域中的第一个区域。
5)输出命令(Outgoing commands)
输入命令是从网关发送到设备,可以将对应的json 发送到对应的mqtt主题上。同样的,如果你没有参数可以发送了一个空消息。输出命令有2种方式。1种是将消息推送到对应的全路径主题,一种是将子主题写到json里面。
例如:
我们要操作窗帘。
方式1:
将下面json推送到AqaraHub/00158d000152d7b2/1/out/Window Covering/Go to Lift Percentage主题。
{
"Percentage Lift Value": 50
}
方式2:
将下面json推送到AqaraHub/00158d000152d7b2/1/out/Window Covering主题。
{
"command": "Go To Lift Percentage",
"arguments":
{
"Percentage Lift Value": 50
}
}
这两种方式是等同的。
原文AqaraHub开源项目mqtt说明,我是抄过来的。建议大家看看原文。