MQTT协议
mqtt协议是物联网常用的一个协议,具体的可以查查资料,简单说下我的理解。
他是基于TCP协议的,有一个服务器和若干个客户端,服务器叫broker。
客户端第一步要连接服务器,需要指定用户名或者key。连接后设备就在线了可以双向通信。具体的通信是可以往一个指定的topic发送一段内容,比如json或者普通文本。也可以订阅一个topic,这样其他设备往这个topic发送数据的时候就会收到相应的内容。
安装MQTT broker
我装的EMQX,主要是他会有一个webUI,配置起来比较方便。而且是国内的所以汉化的也好点。。。
在配置》》加载项》》加载项商店 找到EMQX安装就行。
装好后启动然后打开侧边栏的选项就能在侧边栏看到了
点进去默认用户名和密码是admin和public
然后要在客户端认证里面创建用户以便HA和传感器连接。
MQTT集成
在设备与服务》》添加集成 里面添加mqtt集成
因为emqx安装在本机,所以设置里面ip地址填127.0.0.1就行
configuration.yaml
为了编辑文件,可以先装一个file editor,或者一个vs code的插件
然后找到Homeassistant/下面的configuration.yaml
这里我主要参考的两个文章https://www.home-assistant.io/integrations/binary_sensor.mqtt/
和https://blog.csdn.net/qq_31400983/article/details/128967768。后面这个是当HA里面的内容发生变化时推送给EMQX,前面这个是传感器发生变化时同步给HA。
HA接收传感器消息
在configuration.yaml里面输入下面的内容
# Example configuration.yaml entry
mqtt:
- binary_sensor:
name: "Window Contact Sensor"
state_topic: "home-assistant/window/contact"
payload_on: "ON"
availability:
- topic: "home-assistant/window/availability"
payload_available: "online"
payload_not_available: "offline"
qos: 0
device_class: opening
value_template: "{{ value_json.state }}"
重启HA后会在面板看到这个东西
然后在emqx看到HA已经订阅了这几个topic
在MQTTX里面可以控制设备上线、状态开关
HA推送信息给MQTT
在configuration.yaml里面添加下面内容后重启HA
# add light
mqtt:
light:
# Device name
- name: "Bookcase_Light"
# State topic
state_topic: "LED_Switch"
# Command topic
command_topic: "LED_Switch"
# Command type
payload_on: "1"
payload_off: "0"
# unique_ID
unique_id: "LED1"
# optimistic set
optimistic: false
看到界面显示
EMQX显示
在MQTTX里面订阅LED_Switch这个topic,在界面切换状态时MQTTX就能收到相关的推送了
mqtt light的其他可以配置的内容
可以通过配置,让light变成rgb或者亮度可调的灯,并且每一个都有state传入和command下发两个topic
# Example configuration.yaml entry
mqtt:
- light:
name: "Office Light RGB"
state_topic: "office/rgb1/light/status"
command_topic: "office/rgb1/light/switch"
brightness_state_topic: "office/rgb1/brightness/status"
brightness_command_topic: "office/rgb1/brightness/set"
rgb_state_topic: "office/rgb1/rgb/status"
rgb_command_topic: "office/rgb1/rgb/set"
state_value_template: "{{ value_json.state }}"
brightness_value_template: "{{ value_json.brightness }}"
rgb_value_template: "{{ value_json.rgb | join(',') }}"
qos: 0
payload_on: "ON"
payload_off: "OFF"
optimistic: false
注意,类似下面这种写法已经不被支持了
light:
- platform: mqtt
name: "Office light"
state_topic: "status"
command_topic: "switch"
brightness_state_topic: 'brightness'
brightness_command_topic: 'brightness/set'
qos: 0
payload_on: "ON"
payload_off: "OFF"
optimistic: false