MQTT + 群晖 + HomeAssistant

MQTT概念:

物与物的通讯是物联网永远的主题,MQTT是常用的物与物通讯的信息传输协议。
《MQTT + 群晖 + HomeAssistant》
MQTT通讯的基本逻辑:发布者将要发布的信息传送给MQTT代理(的某个主题下),订阅者从对应的主题中读取信息。

  • MQTT代理(MQTT Broker)
    信息传输的枢纽,发布者将信息发布给MQTT代理,订阅者从MQTT代理那边获得信息。可以将它想象成邮局(不知道现在的年轻人还有没有邮局的概念),发件人和收件人不直接交互,但都与邮局打交道完成发件和收件任务。
  • 主题(Topic)
    主题通俗的说,就是信息的存放位置。信息发布者将信息放入某个位置(主题),关注(订阅)这个位置(主题)的订阅者就获得了对应的信息。
    主题是树状结构,就像文件系统的目录结构一样,例如“homeassistant/binary_sensor/garden/config”
    注意:通常情况下,MQTT代理上,并没有事先定义好的主题,主题只要发布者和订阅者协商一致就可以了(订阅者可以采用类似通配符的方式,接受某种地址结构下的所有主题)。
  • 发布者、订阅者
    指发消息和收消息的程序,这个就不多解释了。
  • 传输质量(QoS)
    MQTT中定义了三种传输质量(发布者和订阅者在与代理通讯的过程中可以指定对应的质量)。
    0:信息仅被传输一次,对于信息是否被收到不做任何确认。
    1:信息可能被传输若干次,只有当信息收取者确认收到后才停止传输。
    2:通过额外的4次握手过程,保证信息仅被传输一次,并且接收者收到了信息。

MQTT的几个概念:代理(Broker)、主题(Topic)、发布(Publish)、订阅(subscribe)、传输质量(QoS)。

MQTT的平台选择:流行的开源项目 Mosquitto(有docker 实现)、Homeassistant 内嵌的 HBMQTT、 MQTT云服务(比如:https://www.cloudmqtt.com/)

MQTT设备配置:

MQTT设备和HomeAssistant分别与MQTT代理服务器通讯,从而实现相互的交互。
在HomeAssistant中,通过简单配置,可以联动各种种类的MQTT设备,包括灯(light)、开关(switch)、传感器(sensor)、开关状态传感器(binary_sensor)、报警面板(alarm_control_panel)、锁(lock)、照相机(camera)、风扇(fan)、设备位置(device_tracker)等。
《MQTT + 群晖 + HomeAssistant》
MQTT设备在HomeAssitant中主要的配置项就是主题:MQTT设备和HomeAssistant都是MQTT代理服务器的客户端,它们之间通过信箱号(主题)相互传递消息。

下面我们以一盏简单的灯(仅实现了开关命令控制),来说明MQTT设备的配置和逻辑:

被控端(灯)将状态发布到主题“hachina/hardware/led01/state”中,控制端(HomeAssistant)订阅这个主题,用于当前状态显示;控制端(Home Assistant)将控制命令发布到主题“hachina/hardware/led01/switch”中,被控端(灯)订阅这个主题,根据其内容进行实际的开关动作。
《MQTT + 群晖 + HomeAssistant》
我们也可以不配置state_topic,这时候HomeAssistant虽然能实施开关动作,但不能准确获得灯的当前状态了(进行开操作后由于各种原因,灯的状态不一定就是开),因此前端界面变成了这样(灯是开着还是关着的状态靠的是推测,而不是反馈):
《MQTT + 群晖 + HomeAssistant》

使用MQTT连接多个HomeAssistant:

可以使用mqtt_eventstream组件将多个HomeAssistant实例通过MQTT代理服务器连接起来。

HomeAssistant还有个mqtt_statestream 组件用于将 HA的事件发布到个人 MQTT  代理服务器去。

基本原理:事件总线是HomeAssistant中最核心的机制,实体的状态变化会产生事件,服务的调用也是基于事件的。因此,同步两个HomeAssistant实例的事件,就能同步其中的实体与服务。

【一主二从HA配置样例】
《MQTT + 群晖 + HomeAssistant》
三个HA实例通过以下的配置连接在一起。

# 主HA的configuration.yaml配置
mqtt_eventstream:
# 将事件发布到master/topic中
publish_topic: master/topic
# 接收slave/#下的事件(#是通配符)
subscribe_topic: slaves/#

 

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注