目录

在 Home Assistant 中集成 69 元 3 个的米家蓝牙温湿度计 2

本文记录如何把米家蓝牙温湿度计 2(型号LYWSD03MMC)集成到 Home Assistant 中。

前言

米家蓝牙温湿度计 2(型号LYWSD03MMC)是小米出品的价格十分美丽的蓝牙温湿度计,69 元 3 个,长这样

![LYWSD03MMC](在 Home Assistant 中集成 69 元 3 个的米家蓝牙温湿度计 2.assets/LYWSD03MMC.jpg)

它的蓝牙数据广播频率为:

  • 大约每隔 10 分钟通过蓝牙广播温湿度数据;
  • 大约每隔 1 小时通过蓝牙广播电量。

Home Assistant(以下简称 HA) 的 官方集成 ,目前不支持米家蓝牙温湿度计 2,原因可能是 2 代的蓝牙广播数据进行了加密。我在 GitHub 上找到了一个 HA 的自定义组件 ble_monitor,几乎支持米家所有的蓝牙温湿度计硬件,非常不错。

本次集成所使用的版本为:

  • Python 3.8.6
  • Home Assistant 0.118.4
  • 米家蓝牙温湿度计 2 固件版本号 0109

集成步骤

准备 Python 环境

ble_monitor 需要使用 Python 标准库的 socket.AF_BLUETOOTH,需要先检查运行 HA 的 Python 环境是否有支持常量。若不支持则需要重新编译 Python 环境。

以 Debian 系统为例,首先安装 libbluetooth-dev 包,确保 /usr/include/usr/include/bluetooth 路径中有 bluetooth.h 文件。

1
sudo apt install libbluetooth-dev

然后使用 pyenv 编译 Python,此时编译出的 Python 就会支持 socket.AF_BLUETOOTH

1
pyenv install 3.8.6

安装 HA 自定义组件 ble_monitor

ble_monitor 是一个被动式收集数据的自定义组件。它不主动向温湿度计发起轮询请求数据,而是被动地等待温湿度计的蓝牙广播,能够有效节约蓝牙温湿度计的电池电量。

首先要授权运行 HA 的 Python 对 HCI interface 的 rootless 访问权限(使用 Python 虚拟环境运行 HA 的要在虚拟环境中执行):

1
sudo setcap 'cap_net_raw,cap_net_admin+eip' `readlink -f \`which python3\``

检查权限设置:

1
sudo getcap `readlink -f \`which python3\``

获取代码

1
git clone https://github.com/custom-components/ble_monitor.git

添加自定义组件到 HA 配置中

1
cp -r ble_monitor/custom_components/ble_monitor <HA_CONFIG>/custom_components/

<HA_CONFIG> 请替换为 HA 的配置目录,一般是 $HOME/.homeassistant

获取温湿度计数据加密密钥

如上文所述,米家蓝牙温湿度计 2 的蓝牙广播数据默认是加密的,我们要配置密钥才能正确解析数据。获取密钥有多种方法,可以参考 ble_monitor/faq.md at master · custom-components/ble_monitor,这里使用最简单的一种。

首先,在米家 App 添加将米家蓝牙温湿度计 2,读取到数据。

然后,在 Android 手机、支持蓝牙功能的 Windows、Mac 上用 Chrome 打开 Telink Flasher 这个网站,点击 Connect,Chrome 会请求蓝牙权限,并扫描附近的蓝牙设备,选择名为 LYWSD03MMC 进行配对。由于米家蓝牙温湿度计 2 的蓝牙广播周期较长,需要耐心等待其出现在设备列表中。

配对成功后网页上会展示实时的温度和湿度,此时点击 “Do Activation” 按钮,等待完成后,“Mi Bind Key” 中的值就是我们需要的密钥。

添加 HA 配置

在 HA 的 configuration.yaml 中,添加配置,保存后重启 HA 服务。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
ble_monitor:
  rounding: True
  decimals: 1
  period: 60
  log_spikes: False
  use_median: False
  active_scan: False
  hci_interface: 0
  batt_entities: False
  discovery: True
  restore_state: False
  report_unknown: False
  devices:
    - mac: 'A4:C1:38:2F:86:6C'	# 米家蓝牙温湿度计 2 的蓝牙 MAC 地址
      name: 'Livingroom'
      encryption_key: '217C568CF5D22808DA20181502D84C1B'	# 上一步中获取到的密钥
      temperature_unit: C

具体配置项含义请参考 ble_monitor 的 README。

使用感受

  • 米家蓝牙温湿度计 2 的数据更新时间比较久,大概每隔 11 分钟更新一次;
  • 每次更新时的数据不是实时数据,猜测是 11 分钟内温度数据的均值;

因此这种集成,不太适合作为传感器触发自动化温度调节。

想要提高米家蓝牙温湿度计 2 广播频率,可以选择给米家蓝牙温湿度计 2 刷自定义的固件,参考 atc1441/ATC_MiThermometer: Custom firmware for the Xiaomi Thermometer LYWSD03MMC and Telink Flasher via USB to Serial converter

参考链接