home assistant中通常需要使用MQTT交换数据。
此篇安装MQTT服务。
关于MQTT参考
安装mosquitto
apt-cache search mosquitto
sudo apt install mosquitto mosquitto-clients mosquitto-dev -y
安装后自动创建mosquitto账户作为mosquitto的操作账户。
常规配置
在使用之前,我们需要对mosquitto进行一些配置。首先打开配置文件
# vim.tiny /etc/mosquitto/mosquitto.conf
在文件中找到如下内容并按要求修改。
# 端口号设置
listener 1883
# 配置pid文件路径
pid_file /run/mosquitto/mosquitto.pid
# 消息持久存储
persistence true
persistence_location /var/lib/mosquitto/
# 日志文件
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
# 禁止匿名访问
allow_anonymous false
# 认证配置
password_file /etc/mosquitto/pwfile
# 权限配置
acl_file /etc/mosquitto/aclfile
没有则创建文件
touch /etc/mosquitto/pwfile
设置用户名和密码
什么是密码文件
用来把需要访问mosquitto的用户名和密码放到单个文件中。当只有少量用户使用mosquitto时,这是一种有效的验证方法。
服务开启后,输入如下命令,根据提示输入两遍密码
mosquitto_passwd /etc/mosquitto/pwfile 用户名
创建密码文件并新增用户
生成一个名为mqtt,密码也为mqtt的用户。
$ mosquitto_passwd -c /etc/mosquitto/pwfile mqtt
执行该语句后需要两次输入密码。
再增加一个名为mqtt1,密码也为mqtt1的用户。
$ mosquitto_passwd /etc/mosquitto/pwfile mqtt1
执行该语句后需要两次输入密码。
创建角色权限
新增一个aclfile文件.
$ touch /etc/mosquitto/aclfile
在里面写入如下内容
# mqtt只能读取以test为前缀的topic消息
user mqtt
topic read test/#
# mqtt1只能往以test为前缀的topic中发消息
user mqtt1
topic write test/#
执行mosquitto 2
在mosquitto用户下,执行如下命令,可启动mosquitto。其中:
-c 指定配置文件
-d 后台运行
# su - mosquitto$ mosquitto -c /etc/mosquitto/mosquitto.conf -d
systemctl start mosquitto
启动后程序应阻塞在控制台中。
- 查看运行状态
systemctl status mosquitto
- 开启/关闭
systemctl start/stop mosquitto
测试mosquitto 2
mosquitto在安装后,自带了两个小程序,一个是订阅端mosquitto_sub,一个是发布端mosquitto_pub。下面我们先启动订阅端,再使用发布端发布消息。
mosquitto_sub
执行如下命令
# su - mosquitto
$ mosquitto_sub -h 127.0.0.1 -p 1883 -t "test/#" -u mqtt -P mqtt -i "sub1"
参数含义如下:
-h mosquitto服务器地址。
-p mosquitto服务器端口号。
-t 需要发布的topic,此处需要匹配订阅端的topic通配符,否则订阅端无法接收。
-u 之前在aclfile中配置过的用户名,注意需要有write权限。
-P 用户名对应的密码,之前在pwfile中配置过。
-i 客户端id,这个字符串在mosquitto服务器中务必唯一。若不加该参数,mosquitto会默认给你唯一id。
启动后程序应阻塞在控制台中。
mosquitto_pub
执行如下命令
# su - mosquitto
$ mosquitto_pub -h 127.0.0.1 -p 1883 -t "test/iot" -u mqtt1 -P mqtt1 -i "pub1" -m "temp:36,humi:75"
参数含义如下:
-h mosquitto服务器地址。
-p mosquitto服务器端口号。
-t 需要发布的topic,此处需要匹配订阅端的topic通配符,否则订阅端无法接收。
-u 之前在aclfile中配置过的用户名,注意需要有write权限。
-P 用户名对应的密码,之前在pwfile中配置过。
-i 客户端id,这个字符串在mosquitto服务器中务必唯一。若不加该参数,mosquitto会默认给你唯一id。
-m 发送的内容正文。在例子中假设temp是温度,humi是湿度。
发布完成后,mosquitto_pub会立刻返回,mosquitto_sub的控制台应显示收到的消息:
若能正常收到消息,则说明mosquitto已经被正确配置。
参考:
在homeassistant中配置MQTT。搜索并选择MQTT。
将搭建好的mosquitto服务信息绑定到Home Assistant中,这样Home Assistant就可以接收MQTT信息并展示。
点击完成,我们就能够看到界面。
创建传感器
使用MQTT Discovery
新建一个温度传感器和一个湿度传感器,内容为json格式,字段含义见附1。
$ mosquitto_pub -h 127.0.0.1 -p 1883 -t "homeassistant/sensor/room1-temp/config" -u mqtt -P mqtt -i "pub1" -m '{"device_class": "temperature", "name": "ROOM1-TEMP", "unique_id":"room1-temp", "state_topic": "homeassistant/sensor/room1/state", "unit_of_measurement": "°C", "value_template": "{{ value_json.temp}}" }'
$ mosquitto_pub -h 127.0.0.1 -p 1883 -t "homeassistant/sensor/room1-humi/config" -u mqtt -P mqtt -i "pub1" -m '{"device_class": "humidity", "name": "ROOM1-HUMI", "unique_id":"room1-humi", "state_topic": "homeassistant/sensor/room1/state", "unit_of_measurement": "%", "value_template": "{{ value_json.humi}}" }'
打开配置->实体注册表,在里面我们应该能够看到刚创建的温度和湿度传感器。
在概览页面(也就是首页),我们可以通过编辑Dashboard的方式把传感器数据放在页面上。
自行发送一个传感器数据
作为测试,我们可以使用mosquitto的工具自己发送一个数据,如果Web页面能够正常展示数据,说明我们的Home Assistant已经彻底配置完成。
$ mosquitto_pub -h 127.0.0.1 -p 1883 -t "homeassistant/sensor/room1/state" -u mqtt -P mqtt -i "pub1" -m '{ "temp": 27.20, "humi": 40.70 }'
附1 discovery参数表
参数 | 含义 |
-t | mqtt中的发送主题,格式为homeassistant/sensor/{name}/config |
-u | mqtt的用户名 |
-P | mqtt的密码 |
-i | mqtt的clientId,注意在连接同一个MQTT Server的时候不要重复 |
-m | device_class:设备类型,支持列表见https://www.home-assistant.io/integrations/sensor/#device-class,若设备与列表中均不匹配(例如甲醛传感器),则在json中不要包含该字段。 |
name:显示在界面上的传感器名称。 | |
unique_id:全局唯一的传感器id,此处若不传数据,在系统中将无法更改属性。 | |
state_topic:当传递传感器数据时需要订阅的主题,格式为homeassistant/sensor/{name}/state | |
unit_of_measurement:量纲,此处可以自由传递字符串,但若不传,前端展示会出现问题。 | |
value_template:在传感器数据中取哪个json字段作为数据。 |
参考文献