ioBroker的mqtt适配器
MQTT协议相信对每一个接触智能家居的用户,都不会很陌生。许多智能设备都通过此协议与云端或智能家居平台通信,ioBroker与其他智能家居平台一样,也有系统自带的mqtt适配器。
此图片大概描述了mqtt协议的工作过程。
安装适配器
首先需要明确一下,ioBroker有关mqtt的适配器有两个,一个是MQTT Broker/Client,另一个是MQTT client。
这篇帖子介绍的是MQTT Broker/Client(版本2.0.4)。
安装mqtt适配器和其他适配器一样,在管理员页面,点击添加实例按钮安装即可。
配置适配器
这个适配器分为Broker(也就是接收所有mqtt消息的中枢)和Client(发布mqtt topic或者订阅mqtt topic)两种模式。我们可以创建多个适配器分别工作在Broker和Client状态下,互不影响。此帖先讲Client相关的内容。
Client通信配置
这页是基本的通信配置页面。主要需要配置以下几个参数
- Type:实例的类型,是Broker模式还是Client模式。此处我们选择Client模式。
- URL:创建连接的IP地址,需要和Broker的IP一致。
- port:创建连接的Port,需要和Broker的Port一致。
- Secure:是否ssl连接。
- User:创建连接时的用户名,需要和Broker设置的用户名一致。
- Password:创建连接时的密码,需要和Broker设置的密码一致。
- Password Confirmation:再次输入连接时的密码。
Client MQTT配置
-
Subscribe patterns: 订阅哪些topic。
如果是#
表示Broker收到的所有的topic都会发给该Client。
如果是javascript/#
表示Broker只有以javascript/
开头的topic,才会转发给该Client。
如果要订阅多个匹配,使用英文逗号分隔每一个匹配的模式。 -
Prefix for all topics:当此Client发布任何topic的时候,都会在topic前加上这里定义的前缀。
比如此Client要发布hass-mqtt\0\switch\set
这个topic,如果在此处定义Prefix是haha\
,则发布出去的topic是haha\hass-mqtt\0\switch\set
。 -
Mask to publish own states:需要发布哪些ioBroker系统的状态。
默认不配置的话,此client会监听ioBroker系统所有的对象的状态,并且当状态发生变化时,将这个变化信息发布到Broker。
比如当hass-mqtt.0.switch.state
的值变为false
了,此Client就会向Broker发布这样的topichass-mqtt\0\switch\state
,值为false
。
如果配置此项,仅有此项ioBroker状态变化时才会发布。 -
Publish only on change: 配合上一个描述,如果勾选此项,仅有监听的ioBroker系统状态值发生了变化,才会发布此状态变化到Broker。
-
Publish own states on connection: 配合上上个描述,如果勾选此项,当连接到Broker之后,将监听状态的当前值都发布到mqtt系统中。
-
Trace output for every message:如果勾选此项,在适配器的debug级别的log中,将打印出发出的每一条mqtt消息的详细内容。
-
Send state (ack=true) too:如果勾选此项,监听的ioBroker状态发生变化,不管变化值ack为true与否,都会交与client处理。如果不勾选,只有(ack=false)的状态才会交给client处理。
-
Use different topic for get and set:如果勾选此项,监听的ioBroker状态发生变化后,需要发送给Broker时,会在topic增加
\set
后缀。从Broker获取topic值时,并不会增加。
比如hass-mqtt.0.switch.state
的值发生了变化,发送给Broker的topic将变为hass-mqtt\0\switch\state\set
。而获取state值时,仍然是订阅的hass-mqtt\0\switch\state
topic。 -
Client ID:与Broker建立连接时的ID。
-
Max topic:topic的最长长度。
-
Interval before send topics by connection:当建立连接后,需要等待多久再发送监听的ioBroker状态值。
-
Send interval:发送mqtt消息之间的间隔。
-
Default QoS:发送mqtt消息时QoS值的设置。
-
Default retain flag:发送mqtt消息时retain值的设置。
Client连接后的对象
- info.connection:表示是否与Broker建立了连接。
- 其他对象是Client收到了自己订阅的topic,但是topic并没有能够对应到ioBroker系统的对象。
Client收到MQTT消息
当Client收到订阅的消息后,分两种情况。
- 该消息topic能够符合ioBroker的object的命名规范,比如收到
hass-mqtt\0\switch\state
这样的topic,此时ioBroker系统中也有对应的hass-mqtt.0.switch.state
的对象,那么该消息的值将直接赋值到该ioBroker对象的状态值中。 - 该消息topic不符合ioBroker的object的命名规范,比如收到
homeassistant\switch\config
这样的topic,此时Client适配器会在自己的命名空间内创建这样的对象,并且保存topic的值。
Client发送MQTT消息
MQTT发送消息也有三种方式。
-
如之前Client配置中讲到,Client可以配置监听ioBroker系统的指定的对象状态值,当值改变后,会将此对象按照规则转换为topic,并且将状态值作为payload发送出去。
比如hass-mqtt.0.switch.state
对象状态变为false
。则会发送一条消息,topic是hass-mqtt\0\switch\state
,值为false
。 -
在其他适配器创建ioBroker对象时,如果在
native: {topic: "specific/topic/demo"}
定义了topic这样的字段,那么当此ioBroker状态发生变化时,topic将以此定义的字段为topic发送mqtt消息。 -
mqtt client自己命名空间下的所有对象,如果状态值改变了,则也会发送mqtt消息。比如
mqtt.0.homeassistant.switch.demo.power
的值变为true
,则client会发布一条mqtt消息,topic是homeassistant.switch.demo.power
(注意此处没有mqtt\0\
的前缀),值为true。
下期预告
下一篇帖子将介绍如何配置mqtt server。