前言

最近需要整一个智能物联网平台来接入机房温湿度监控,旧有的设备是 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
/data/influxdb2Data
/data/pgdata
  • docker
apt update -y && apt upgrade -y && apt install docker.io
systemctl enable docker
systemctl start docker
  • PGSQL
docker run -d --net=host --restart=always --name pgsql -e POSTGRES_PASSWORD=passwd -v /data/pgdata:/var/lib/postgresql/data postgres
vi /data/pgdata/pg_hba.conf # 允许远程访问
  • 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
cp configuration.yaml configuration.yaml.bk
vi configuration.yaml

configuration.yaml 参考如下:

# Loads default set of integrations. Do not remove.
default_config:

# Text to speech
tts:
- platform: google_translate

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

#PGSQL
recorder:
db_url: postgresql://postgres:PGSQL的密码@PGSQL的IP:5432/hass # hass 数据库名


#时序数据库
influxdb:
api_version: 2
ssl: false
host: 数据库IP
port: 8086
token: 123 # 在influxdb的web管理页面中可以获取
organization: luckykeeper
bucket: hass
tags:
source: HA
tags_attributes:
- HA
default_measurement: units

在 WEB 面板校验并重启 HA ,完成配置,如果 log 没有错误即配置完成

安装 HACS

HACS 是第三方插件商店,进一步扩展了 HA 的生态

参考:https://hacs.xyz/docs/setup/download/ -> Container

cd /data/HASS
# 注意:此步需要科学上网,如果机器不能科学上网,则 wget 脚本后更改脚本内链接的地址为内网 Nginx 文件服务的地址(下载该文件上传到 Nginx 服务器)
wget -O - https://get.hacs.xyz | bash -

安装完成后在 web 面板重启 HA 后搜索 HACS 并添加

连接 ESP 开发板

在 HA 的 WEB 面板

配置 -> 设备 -> 添加设备/集成 -> 搜索 ESPHome -> 输入 IP 及 api key 完成连接,此时温湿度传感器上线并自动添加到“概览”,之后你可以在“概览”页面看到温湿度变化头像,也可以在时序数据库 influxdb2 内绘图,如下图

HA 的温湿度

influxdb2

实现邮件及微信推送

邮件推送

邮件推送不需要添加第三方插件

修改 HA 的配置文件 configuration.yaml 添加下面的内容:

# Notify
notify:
- name: email
platform: smtp
server: smtp.qq.com
port: 587
timeout: 15
sender: user@foxmail.com
sender_name: HbfuIOT Platform
encryption: starttls
username: user@foxmail.com
password: passwd
recipient:
- receiver@foxmail.com

在 WEB 面板重启 HA ,之后在配置->自动化添加即可

这里给出示例(高于26度即邮件告警)

alias: 测试-温度告警
description: ""
trigger:
- platform: numeric_state
entity_id: sensor.node_1_temperature
above: 26
condition: []
action:
- service: notify.email
data:
message: 1号节点温度过高,温度{{states('sensor.node_1_temperature')}}°C
title: 1号节点温度过高-{{as_timestamp(now()) | timestamp_local}}
mode: single

手动触发一次,效果如下:

微信推送

需要使用企业微信建立应用,2022年6月起需要设置可信IP方可完成设置流程,也就是说需要有固定IP

接收方使用普通微信扫描应用二维码即可,不需要下载企业微信

参考:https://zhuanlan.zhihu.com/p/514307968

微信推送设置完成后,先在 custom_components 中上传微信推送插件 wework_notify ,在 web 面板重启一次后再修改 configuration.yaml 配置:

在 notify: 一节添加,如下:

# Notify
# 下面给出了多个推送通道的设置示例,注意缩进
notify:
- name: email
platform: smtp
server: smtp.qq.com
port: 587
timeout: 15
sender: user@foxmail.com
sender_name: HbfuIOT Platform
encryption: starttls
username: user@foxmail.com
password: passwd
recipient:
- receiver@foxmail.com

- platform: wework_notify
name: wework # 实体名称
corpid: 123456 # 企业微信 企业 id
agentId: 123 # 应用 id
secret: "passwd" # secret
touser: '@all' # 发送给关注应用的所有人

之后使用类似邮件的设置方法即可完成推送,在微信即可接受推送,成功示例如下:

ESP32-C3

准备本地编译固件环境(Docker)

注:这个环节必须使用科学的上网方式,否则极大概率编译失败

部署 ESPHome 编译环境, Docker 镜像部署命令如下:

## 本例使用的系统是 Rocky Linux 9,不同的系统可能有细微差别
# 安装 Docker 环境
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable docker && systemctl start docker
# 部署 ESPHome 编译环境
mkdir /esphome
docker run -d --name='esphome' --restart=always -p 6052:6052 -e TZ="Asia/Shanghai" -v '/esphome':'/config':'rw' esphome/esphome

部署完成后访问: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

# 此节除 name 外不可修改
esphome:
name: HbfuEsp001 # 设备的名称
platformio_options:
board_build.flash_mode: dio
board_build.mcu: esp32c3

# 此节不可修改
esp32:
board: esp32-c3-devkitm-1
variant: esp32c3
framework:
type: arduino
version: 2.0.2
platform_version: https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.3/platform-espressif32-2.0.2.3.zip

external_components:
- source: github://myhomeiot/esphome-components

# 此节不可修改
logger:

# Enable Home Assistant API
api:
encryption:
key: "合适的复杂密码,使用密码生成器生成,用于 HA 连接该设备"

ota:
password: "合适的复杂密码,使用密码生成器生成,用于 ESPHome 升级"

#configuration:https://esphome.io/components/wifi.html
wifi:
ssid: IOT # WIFI 的 SSID ,ESP32 需要通过 WIFI 联网,故使用环境需要准备一台 2.4GHz 频段的路由器
password: passwd # WIFI 的密码

# Optional manual IP | 静态 IP 设置,若有 DHCP 可忽略,注意路由器应为 AP Mode ,没有 AP 模式的路由器可以把网线插在 LAN 口(而不是 WAN 口,WAN 口置空)实现 AP Mode
manual_ip:
static_ip: 192.168.1.2
gateway: 192.168.1.1
subnet: 255.255.255.0
dns1: 192.168.1.1 # DNS 可以有 dns1 dns2 两个

# Enable fallback hotspot (captive portal) in case wifi connection fails
# 无法连接路由器时回退到设备 AP 模式
ap:
ssid: "IOT Esp32-C3 Fallback"
password: "passwd"

# BLE
esp32_ble_tracker:

# XiaoMi BLE Temperature & Humidity Sensor 2 (Model:LYWSD03MMC)
# reference:https://esphome.io/components/sensor/xiaomi_ble.html#lywsd03mmc
sensor:
- platform: pvvx_mithermometer
mac_address: "11:22:33:44:55:66" # 温湿度计的 MAC 广播地址
temperature: # PVVX 固件提供温湿度计的 5 种信息:温度、湿度、电量、电池电压、信号强度
name: "Node 1# Temperature" # 按照节点名修改 “1#”
humidity:
name: "Node 1# Humidity"
battery_level:
name: "Node 1# Battery-Level"
battery_voltage:
name: "Node 1# Battery-Voltage"
signal_strength:
name: "Node 1# Signal"

- platform: pvvx_mithermometer
mac_address: "22:33:44:55:66:77"
temperature:
name: "Node 2# Temperature"
humidity:
name: "Node 2# Humidity"
battery_level:
name: "Node 2# Battery-Level"
battery_voltage:
name: "Node 2# Battery-Voltage"
signal_strength:
name: "Node 2# Signal"

# flash device:https://web.esphome.io/?dashboard_wizard

yaml 配置文件写好后选择配置->Validate,校验无误后 Install->Manual Download->Modern Format 编译并下载 .bin 格式的固件

刷机

使用 USB Type-C 数据线连接 ESP32-C3 ,等待电脑安装好驱动并确定串口

使用以下网站完成刷机:

https://web.esphome.io/?dashboard_wizard

刷机时间较长,耐心等待,刷机时不能使用 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,并按照下图的设置对设备进行设置:

下图中的设置注意事项总结如下:

  1. 刷机前记录设备的 MI Token 和 MI Bind Key 备用
  2. 记录下最下面的 MAC 广播地址,后面要用
  3. 没有提及的设置不要改动
  4. Smiley 一栏选中“Comfort | Show Batt | Clock”三项,并先后点击“Get Time | Set Time”(设置时间的操作建议在发送配置后再点一次,Tips:这里时间设置不对没有任何影响)
  5. 勾选 “Sensor in LowPower Mode” 减缓耗电速度(如果发现数据不准,则不勾选该设置,实测开启低功耗模式影响不大)
  6. 勾选 “BT5+ 以及 CSA2”
  7. “Advertising Type”(广播类型)选择 PVVX
  8. “Advertising Interval”(广播间隔)输入值 9999 ms(增加广播间隔减少耗电)
  9. Minimum LCD Refresh Rate 设置为 10 ,增加 LCD 屏刷新时间减少耗电
  10. Get Delta Time && Set Delta Time 修正时间
  11. Send Config 发送配置
  12. Get Device Name & 修改为 “Hbfu001” 这样的格式方便识别 && Set Device Name
  13. 在“河北金融学院温湿度传感器参数.xlsx”中做好相关数据记录
  14. 在设备的显著位置贴上如 “001” 的编号方便识别
  15. 全部设置完成后点击“Disconnect”断开设备,并清除下面的日志,进行下一设备的刷机