打造一个智能温湿度监测平台
前言
最近需要整一个智能物联网平台来接入机房温湿度监控,旧有的设备是 Konnad 的温湿度传感器 ,是 RS485 协议的 ModBus RTU 设备,通过 ZLAN 的串口服务器转成 ModBus 设备,这套价格比较贵,而且用起来非常麻烦,必须用十六进制的指令码去查数据,返回的数据还是一个低位前置的十六进制浮点,想用起来需要自己开发。所以趁这次机会换成低价方便的 ESPHome+小米米家蓝牙温湿度计2 的方案,平台选择了 Home Assistant(以下简称 HA)的方案
硬件准备
HA
Home Assistant(HA) 是物联网智能系统的中枢,在各物联网平台中,目前 HA 是最广泛使用的物联网平台,有着最广泛的生态。能够将不同品牌厂商的设备连接到本地服务器上,而无需依赖厂商的云服务,也可以将不支持苹果 HomeKit 的设备接入 HomeKit 平台,能够在本地控制智能物联网设备(HA无需联网也可控制)。HA 能够连接 TCP/IP 设备、BLE 设备、ZigBee 设备、Z-Wave 设备等多种协议的设备。
在较大规模部署中,设备往往分布在多处,直接将蓝牙接收器设置在 HA 的机器上往往难以连接所有设备,处于迁移方便的考虑,推荐将 HA 设置在虚拟机上, HA 对硬件的要求不高,ARM 和 X86 设备均可,这里推荐部署在以下配置的虚拟机上:
- 4c/4t CPU
- 4G RAM
- 50 G HDD(存储视需要存储的数据量确定)
- 1 NIC
- OS:Ubuntu 20.04 LTS 或以上
ESP 开发板
ESP 开发板的作用是充当蓝牙网关,连接多个蓝牙设备(本例只使用该功能,ESP还可以把 ModBus RTU 转 ModBus TCP 等等,之后打算试试用 ESP32-C3 加上 485 转 UART 的板子去读取 Konnad 的 ModBus RTU 数据),把蓝牙设备转换成 HA 能够连接的 TCP/IP 设备
ESP 开发板有很多变形,本例中需要的 ESP 开发板要求有 WIFI 和 BLE 功能即可,出于成本并兼顾易用性考虑,这里推荐购买合宙的 ESP32-C3 开发板-标准版(参考价 12.9 元),合宙 ESP32-C3 简化版(参考价 9.9 元)去除了串口芯片,目前与其它平台兼容性不好,可以使用但是不大推荐。ESP32 WROOM 等板子也可以但是价格就稍贵一些
- ESP32-C3
- 4M Flash (还有 2M Flash 的版本,差几毛钱,不支持 OTA ,不推荐)
- USB Type-C 数据线一根(刷机、供电)
设备如图:
因为本例只使用开发板的 WIFI 和 BLE 功能,故无需焊接排针,同时,如果没有 3D 打印机,可以使用附带的防静电带保护设备,设备供电/刷机需要用 USB Type-C 数据线
温湿度传感器
这个页面的设备均可
个人推荐选择小米米家蓝牙温湿度计2 (参考价 19.9 元)【产品型号:LYWSD03MMC】,并刷入 ATC 的第三方固件使用,该设备的电池是 CR2032 ,请提前准备以备不时之需
设备如图:
部署各设备
推荐顺序:温湿度计->ESP32->HA
HA
HA 部署部分环节可能需要科学上网,遇到这种情况文档会指明,并提供替代方案
另外:HA默认使用 SQLite ,这里我们更换成 PGSQL 和 influxdb2
准备环境
提前创建以下文件夹
/data/HASS |
- docker
apt update -y && apt upgrade -y && apt install docker.io |
- PGSQL
docker run -d --net=host --restart=always --name pgsql -e POSTGRES_PASSWORD=passwd -v /data/pgdata:/var/lib/postgresql/data postgres |
- pgAdmin
docker run -d --restart=always -p 80:80 --name pgAdmin -e PGADMIN_DEFAULT_EMAIL=123@email.com -e PGADMIN_DEFAULT_PASSWORD=passwd dpage/pgadmin4 |
pgAdmin 连接 PGSQL 数据库,并新建名为 hass 的数据库
- influxdb2 (时序数据库)
docker run -d --restart=always -p 8086:8086 --name influxdb2 -v /data/influxdb2Data:/var/lib/influxdb2 influxdb:2.0 |
在 web http 8086 完成初始设置,记下组织名,bucket 名(hass)和 API Token
部署 HA 并更换数据库
docker run -d --name homeassistant --privileged --restart=always -e TZ=Asia/Shanghai -v /data/HASS --network=host ghcr.io/home-assistant/home-assistant:stable |
先进入 http://IP:8123 完成初始设置,再进行下面的操作
cd /data/HASS |
configuration.yaml 参考如下:
# Loads default set of integrations. Do not remove. |
在 WEB 面板校验并重启 HA ,完成配置,如果 log 没有错误即配置完成
安装 HACS
HACS 是第三方插件商店,进一步扩展了 HA 的生态
参考:https://hacs.xyz/docs/setup/download/ -> Container
cd /data/HASS |
安装完成后在 web 面板重启 HA 后搜索 HACS 并添加
连接 ESP 开发板
在 HA 的 WEB 面板
配置 -> 设备 -> 添加设备/集成 -> 搜索 ESPHome -> 输入 IP 及 api key 完成连接,此时温湿度传感器上线并自动添加到“概览”,之后你可以在“概览”页面看到温湿度变化头像,也可以在时序数据库 influxdb2 内绘图,如下图
HA 的温湿度
实现邮件及微信推送
邮件推送
邮件推送不需要添加第三方插件
修改 HA 的配置文件 configuration.yaml 添加下面的内容:
# Notify |
在 WEB 面板重启 HA ,之后在配置->自动化添加即可
这里给出示例(高于26度即邮件告警)
alias: 测试-温度告警 |
手动触发一次,效果如下:
微信推送
需要使用企业微信建立应用,2022年6月起需要设置可信IP方可完成设置流程,也就是说需要有固定IP
接收方使用普通微信扫描应用二维码即可,不需要下载企业微信
微信推送设置完成后,先在 custom_components 中上传微信推送插件 wework_notify ,在 web 面板重启一次后再修改 configuration.yaml 配置:
在 notify: 一节添加,如下:
# Notify |
之后使用类似邮件的设置方法即可完成推送,在微信即可接受推送,成功示例如下:
ESP32-C3
准备本地编译固件环境(Docker)
注:这个环节必须使用科学的上网方式,否则极大概率编译失败
部署 ESPHome 编译环境, Docker 镜像部署命令如下:
## 本例使用的系统是 Rocky Linux 9,不同的系统可能有细微差别 |
部署完成后访问:http://IP:6052/ ,如下图
点击右下角 New Devices 添加设备,并选择相应型号开发板,添加后点 EDIT 编辑 yaml 配置文件,这里给出参考
# esphome32-c3 for HeZhou Esp32-C3 Standard Edition, Powered By Luckykeeper<luckykeeper@luckykeeper.site|luckykeeper.site> 2022/10/28 |
yaml 配置文件写好后选择配置->Validate,校验无误后 Install->Manual Download->Modern Format 编译并下载 .bin 格式的固件
刷机
使用 USB Type-C 数据线连接 ESP32-C3 ,等待电脑安装好驱动并确定串口
使用以下网站完成刷机:
刷机时间较长,耐心等待,刷机时不能使用 putty 等软件连接串口否则会导致占用,之后断电重启 ESP32-C3 并通过串口确认启动状态,正常启动如下图所示:
稍等片刻,看到能够如下图显示蓝牙广播信息,说明配置成功
能够正常看到两个传感器节点的温度、湿度、电量、电压、信号
小米米家蓝牙温湿度计2
官方固件每 10 分钟向平台回报一次,且若数据没有变化不会上报数据,故需要使用第三方固件实现更及时的数据监测
需要刷入第三方固件,方法如下:
使用带有蓝牙的手机或电脑(推荐手机),使用谷歌 Chrome 点开以下网站
https://pvvx.github.io/ATC_MiThermometer/TelinkMiFlasher.html
(注意:这个网站很可能需要使用科学的访问方式)
首先复制下面的 Chrome 链接并在新标签页打开,开启 Chrome 的实验性功能(用于获取温湿度计的 MAC 地址)
然后勾选上面的“Get Advertising MAC”(获取广播地址)(后面 ESP32 使用温湿度计的广播数据获取信息,比直接连接设备更省电,降低更换电池频率)
点击 Connect 连接设备(设备名称类似:LYWSD03MMC)根据提示选择 Custom 固件并刷入,等待刷入完成,此时设备会自动断开,点击 Disconnect 再重新 Connect,并按照下图的设置对设备进行设置:
下图中的设置注意事项总结如下:
- 刷机前记录设备的 MI Token 和 MI Bind Key 备用
- 记录下最下面的 MAC 广播地址,后面要用
- 没有提及的设置不要改动
- Smiley 一栏选中“Comfort | Show Batt | Clock”三项,并先后点击“Get Time | Set Time”(设置时间的操作建议在发送配置后再点一次,Tips:这里时间设置不对没有任何影响)
- 勾选 “Sensor in LowPower Mode” 减缓耗电速度(如果发现数据不准,则不勾选该设置,实测开启低功耗模式影响不大)
- 勾选 “BT5+ 以及 CSA2”
- “Advertising Type”(广播类型)选择 PVVX
- “Advertising Interval”(广播间隔)输入值 9999 ms(增加广播间隔减少耗电)
- Minimum LCD Refresh Rate 设置为 10 ,增加 LCD 屏刷新时间减少耗电
- Get Delta Time && Set Delta Time 修正时间
- Send Config 发送配置
- Get Device Name & 修改为 “Hbfu001” 这样的格式方便识别 && Set Device Name
- 在“河北金融学院温湿度传感器参数.xlsx”中做好相关数据记录
- 在设备的显著位置贴上如 “001” 的编号方便识别
- 全部设置完成后点击“Disconnect”断开设备,并清除下面的日志,进行下一设备的刷机