ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

树莓派读取小米温湿度计2加密数据接入Home Assistant全指南

树莓派读取小米温湿度计2加密数据接入Home Assistant全指南 今天聊一个我在智能家居刚入坑时就特别想搞定的事用树莓派去读小米温湿度计2代的蓝牙数据把它接进Home Assistant。先说背景。小米温湿度计2代型号LYWSD03MMC价格便宜、屏幕清晰我家里前后买了五六个。但米家App只能看当前数值历史曲线导出麻烦更别提和其他设备联动了。于是我把目光转向Home Assistant——把它接进来就能在同一个仪表盘上看温湿度、电池电量还能写自动化温度超标就开风扇。听起来不复杂但实际操作时发现一个大问题小米在这颗传感器上做了蓝牙广播加密HA就算能扫描到设备也解不出温度湿度必须有一个叫Bind Key的密钥才行。这篇文章就围绕三件事展开密钥怎么拿数据怎么抓HA怎么接。树莓派在这个方案里既可以当HA主机也可以当独立的蓝牙网关配合好了能一劳永逸。如果你家里正好有树莓派、有这款温湿度计、又在用或准备用Home Assistant这篇可以帮你少踩一堆坑。1. 整个方案的思路拆解为什么非得用树莓派干这活1.1 小米温湿度计2为什么“悄悄加密”LYWSD03MMC是一款蓝牙低功耗BLE设备工作在广播模式。它每隔一段时间向周围发送一个广播包里面含有温湿度数据。问题在于小米没有走标准BLE传输而是把广播数据设计成了私有加密格式。你拿着普通BLE扫描工具比如手机上的nRF Connect确实能看到一个叫“LYWSD03MMC”的设备也能看到一串十六进制的广播内容。但这串内容里温度、湿度、电量都被加密了。没有密钥你看着一堆字节完全不知道房间是23度还是28度。这个设计本意是为了防止第三方随意读取数据保护生态。但对玩家来说就成了门槛。好在圈内早就把这套加密机制研究透了只要拿到每台设备出厂时绑定的Bind Key就能在本地解密数据全程不走云端。1.2 树莓派做蓝牙网关的优势与限制为什么推荐用树莓派当这个方案的“主角”原因很朴素树莓派自带蓝牙模块不用额外买硬件功耗低可7×24小时运行适合当常驻网关树莓派本身可以刷Home Assistant OS直接一个盒子解决采集和展示一个树莓派的蓝牙可以同时听多个温湿度计数量没有硬限制。它的限制也很明显板载蓝牙的天线性能一般加上树莓派放在路由器旁边2.4G频段干扰比较强蓝牙设备距离稍微远一点就容易丢包。所以树莓派的摆放位置最好离需要监听的传感器不太远后面我会专门说怎么排查。从整体架构来说树莓派在这套方案里就是一个“蓝牙接收器数据处理器”。它把温湿度计广播出来的加密数据接收下来再用Bind Key解密最后把温度、湿度、电量这些字段映射成HA里的传感器实体。数据全程在本地流转不需要经过小米云这也是很多人坚持自建网关的原因。1.3 两条路线怎么选HA内置蓝牙 vs 独立脚本抓取实际搭建时有两条路线我建议你先想清楚走哪条再动手。路线A树莓派直接跑Home Assistant OS用HA内置的蓝牙集成去监听温湿度计。这是最推荐、也最省心的方案。你只需要在HA里装好蓝牙集成填上MAC和Bind KeyHA就会自动完成监听、解密、实体生成。全程不需要写代码后续维护成本极低。路线B树莓派跑普通系统比如Raspberry Pi OS使用Python脚本抓取蓝牙广播解密后将数据通过MQTT或HTTP转发给Home Assistant。这条路线适合家里已经有MQTT体系、或者你不想让树莓派专职跑HA的情况。优点是很灵活缺点是前期配置工作量更大而且脚本挂了要知道怎么重新拉起。对大多数用户来说我强烈建议选路线A。文章后面会把两种方案都讲清楚但默认以路线A为主展开。2. 必须绕过的第一道坎拿到每台设备唯一的Bind Key2.1 什么是Bind Key为什么没有它解不开数据Bind Key是一串32位的十六进制字符串看起来像这样512d1d0e8f9a6198616b62e2ae5d892e它由设备在出厂时随机生成和设备的MAC地址是一一绑定关系。简单理解它就是这把锁的钥匙没有它你拿到广播数据也只能干瞪眼。每个温湿度计都有独立的Bind Key互不相同。数据解密的过程其实不复杂BLE广播的Payload字段里包含了温湿度的加密密文协议用Bind Key作为密钥进行AES解密。你不需要理解AES的数学细节只要知道——Bind Key对了数据秒解Bind Key错了出来的就是乱码或者干脆报错。所以密钥获取是整个方案里最重要的一步。别嫌麻烦静下心把这一步做扎实后面就顺了。2.2 用Telink Flasher网页工具提取Bind Key获取Bind Key最简单的方法是用一个叫Telink Flasher的网页工具它是国外玩家pvvx做的一个Web蓝牙工具。不需要安装任何软件只需要一台带蓝牙的电脑和Chrome/Edge浏览器。具体步骤先把温湿度计拿在手里确保它在广播状态。如果它之前连接过米家App建议先在米家App里把它解绑或者离小爱音箱远一点避免被其他设备干扰。在电脑上打开Chrome或Edge浏览器访问工具地址https://pvvx.github.io/ATC_MiThermometer/TelinkMiFlasher.html页面加载后点击页面上的“Connect”按钮。此时浏览器会弹出蓝牙设备选择窗口里面会列出附近可发现的蓝牙设备。在设备列表中找到类似“LYWSD03MMC”或“Mi Temperature and Humidity Monitor 2”的设备点击连接。如果列表里没看到稍微靠近一点或按一下温湿度计侧面的复位按钮让设备重新广播。连接成功后界面会显示设备的MAC地址、固件版本等信息。找到“Mi Bind Key”这一栏里面显示的32位十六进制字符串就是密钥。把密钥复制到记事本里保存注意区分大小写、不要带空格。如果你要处理多个温湿度计建议建一个表格把每个设备的MAC地址和Bind Key一一对应记录下来。千万别靠记忆力三个以上就容易搞混。提示这个网页工具连接的原理是浏览器直接通过Web Bluetooth与设备通信。Firefox和Safari不支持Web Bluetooth所以必须用Chrome或者Edge内核的浏览器。2.3 其他获取方式老设备迁移、软硬件替代方案除了Telink Flasher还有几种方法可以获取Bind Key但各有局限。第一种通过米家App配合安卓手机抓包。这个方法几年前很流行原理是在Android系统里抓取米家App与设备通信时下发到本地的密钥。但现在小米App更新频繁Android系统也限制了对蓝牙HCI日志的读取权限操作难度直线上升不建议新手尝试。第二种用ESP32之类的单片机去读设备。本质上是写一个和Telink Flasher类似的程序利用ESP32的BLE能力连上温湿度计读取Bind Key。这个方法适合本来就有ESP32开发板的人但如果一切从零开始不如直接用网页工具省事。第三种如果设备已经刷过第三方固件比如ATC固件那就无所谓Bind Key了因为第三方固件会直接以明文广播温湿度数据不需要解密。但注意一旦刷了第三方固件设备和米家生态的“缘分”基本就断了只能走本地化方案。这个在下一节详细说。2.4 密钥获取避坑总结这一节建议背下来我在帮朋友折腾这套方案时至少有一半的问题出在密钥获取环节。以下是我总结的避坑清单浏览器必须是Chrome/Edge内核Firefox、Safari都不行连接不上的时候先把温湿度计从米家App解绑再按一下复位按钮强制重新广播Telink Flasher页面上可点击的按钮很多不要激动乱点尤其不要手滑点了“Flash”相关的选项否则会把原厂固件刷掉复制密钥时注意字符完整性一共32位多了少了都会导致解密失败如果界面里的Bind Key区域显示空白说明工具还没读取到可以断开重连一次拿到的密钥建议同时存到密码管理器和本地文本文件里双保险。密钥到手之后整个方案的“拦路虎”就已经拆完了。接下来进入硬核环节在树莓派上把蓝牙环境配起来。3. 树莓派端蓝牙环境准备与抓包实测3.1 检查蓝牙硬件与系统依赖不管你是用HAOS还是Raspberry Pi OS第一步都是确认树莓派的蓝牙模块正常工作。如果你用的是Raspberry Pi OS先执行更新和安装必要依赖sudo apt update sudo apt install -y bluetooth bluez pi-bluetooth安装完成后看蓝牙服务状态systemctl status bluetooth正常状态下服务显示activerunning。接着确认蓝牙适配器是否存在hciconfig -a如果输出里有hci0说明蓝牙芯片已被系统识别。再用bluetoothctl看一眼bluetoothctl show这个命令会输出适配器的MAC地址和各类状态字段如果报错大概率是蓝牙服务没起来。可以执行sudo systemctl restart bluetooth如果树莓派用的是Home Assistant OS情况会简单很多系统已经自带蓝牙驱动只需要在HA的“系统-硬件”里看到蓝牙适配器即可。3.2 走近蓝牙广播用命令行看温湿度计在干什么环境没问题后我们先用最简单的命令扫描一下周边蓝牙设备确认温湿度计真的在广播。sudo hcitool lescan执行后终端会不断滚动输出附近BLE设备的MAC地址和名称。这时候把温湿度计拿近几秒后应该能看到类似下面的输出A4:C1:38:AB:CD:EF LYWSD03MMC看到这行说明温湿度计在正常广播。按 CtrlC 结束扫描。觉得hcitool不够直观的话也可以换bluetoothctlbluetoothctl [bluetooth]# scan onbluetoothctl的显示更友好会持续列出发现的设备包括信号强度RSSI。我习惯用bluetoothctl确认设备信号再用hcitool快速过滤名称。这个阶段我们拿到的只是设备的“名片”——MAC地址和名称。想直接看到温湿度数据还是得回到密钥方案。所以这一步的目的主要是确认设备在线、记住MAC地址、判断信号强度。3.3 用Python脚本监听广播数据进阶可选如果你不满足于只看设备名想亲眼看到广播包的原始内容可以写一个简单的Python脚本。这里用bluepy库演示先安装依赖sudo apt install -y python3-pip libglib2.0-dev sudo pip3 install bluepy然后写一个名为scan_ble.py的脚本from bluepy import btle scanner btle.Scanner(0) # 0 表示 hci0 devices scanner.scan(10) # 扫描10秒 for dev in devices: print(MAC:, dev.addr) # 获取广播数据中的完整十六进制内容 for (adtype, desc, value) in dev.getScanData(): if adtype 255: print(广播数据:, value) print(- * 40)运行sudo python3 scan_ble.py脚本会打印出每个BLE设备广播时的原始数据。你会看到温湿度计的“广播数据”是一长串看起来毫无规律的十六进制字符串。看着这些乱码就更理解为什么非要Bind Key了。蓝色广播里的温度数据就像被锁在保险柜里没有钥匙光盯着一串字符看一百年也看不出温度来。如果你想把解密也做了可以自己实现AES解密逻辑但这属于重复造轮子。我实测下来直接让HA里的现成集成去解密才最高效脚本只需要起到“探针”作用就可以了。3.4 关于刷ATC固件这个骚操作在动手接HA之前还有一件事经常会被人提起刷ATC固件。ATC固件是社区为LYWSD03MMC开发的一个第三方固件刷上之后有两大好处广播数据改成明文温度、湿度、电量直接裸露任何蓝牙设备都能读数据刷新频率大幅提升从原厂的几十秒一次变成最快1秒一次。听起来很美好对吧代价也有原厂固件被覆盖米家App无法再识别和管理这台设备刷机有极小概率变砖虽然用Telink Flasher刷坏的几率很低但操作时要保持设备供电稳定如果设备以后想回归官方固件还需要再刷回原厂镜像多一道工序。我的建议是如果你确定这台温湿度计以后只走本地化方案那刷ATC固件是个很香的选项省掉了Bind Key的管理烦恼。但如果你还想保留米家App的使用场景就别刷老老实实用Bind Key方案。两个方案跑起来的数据准确性差别不大刷新频率上的提升对大多数人来说也不算刚需。4. 把数据接进Home Assistant4.1 方案一官方Xiaomi BLE集成如果你用的是Home Assistant OS并且树莓派的蓝牙已经被HA识别最简单的方式是直接用官方集成。在HA界面操作进入“设置 - 设备与服务”点击右下角“添加集成”搜索“Xiaomi BLE”并选中如果系统提示选择蓝牙适配器选择hci0集成会开始扫描周围的米家蓝牙设备等它发现你的温湿度计在设备列表中选择对应的LYWSD03MMC设备输入第2节拿到的Bind Key和MAC地址确认后保存HA会开始自动解密数据。几秒钟后在设备页面里就能看到温度、湿度、电池电量和信号强度这几个实体了。整个过程不需要写任何配置完全在UI里完成。有一点要注意不同版本的HA搜索集成的关键词可能略有不同有的版本需要在搜索框里输入“xiaomi”然后在下拉列表里选“Xiaomi BLE”。只要看到这个选项流程都是一样的。4.2 方案二Passive BLE Monitor集成如果你发现官方集成在某些HA版本下不够稳定或者你想把多个设备统一管理强烈建议试试社区大神做的Passive BLE Monitor集成。这个集成专治各种米家蓝牙设备历史也很悠久几乎成了小米传感器玩家的标配。安装方式有几种最简单的是通过HACS确保HA里安装了HACS如果没有先去安装HACS在HACS商店里搜索“Passive BLE Monitor”并安装重启HA重启后进入“设置 - 设备与服务 - 添加集成”搜索“Passive BLE Monitor”按照向导选择蓝牙适配器hci0并选择监听方式添加完成后它会自动扫描附近的BLE设备在配置页面里能找到温湿度计。Passive BLE Monitor也支持在configuration.yaml里手动指定设备这样更直观ble_monitor: discovery: True devices: - mac: A4:C1:38:AB:CD:EF name: livingroom_temp encryption_key: 512d1d0e8f9a6198616b62e2ae5d892e保存配置后重启HA在仪表盘里添加实体时就能看到livingroom_temp下的温度、湿度等实体。比起官方集成Passive BLE Monitor的界面提供的信息更丰富可以看到历史数据变化趋势还能对每个传感器进行更细粒度的设置。我用它跑了大半年稳定性很好。4.3 仪表盘展示与自动化接入完成后怎么把数据展示得好看就是另一件值得琢磨的事。最简单的方式是在HA的“概览”里添加“仪表盘”卡片把温度、湿度、电池这三个实体拖进去立即就能看到实时数值。如果你希望看到趋势曲线推荐使用“历史”卡片选好实体和显示时间范围就能看到温湿度随时间变化的折线图。这个功能对判断房间通风、空调工作状态非常有用。再进阶一步可以写自动化例如automation: - alias: 客厅温度过高自动开风扇 trigger: - platform: numeric_state entity_id: sensor.livingroom_temperature above: 30 action: - service: switch.turn_on target: entity_id: switch.fan这样一条自动化就能在温度超过30度时自动打开风扇。从“看数据”到“用数据”价值完全不一样。4.4 特殊情况Docker版Home Assistant的蓝牙映射有一部分人树莓派上跑的是Docker版Home Assistant这种部署方式下容器默认访问不到宿主机的蓝牙设备需要手动把蓝牙设备映射进容器。启动容器时可以这样加参数docker run -d \ --name homeassistant \ --privileged \ --networkhost \ -v /path/to/config:/config \ -e TZAsia/Shanghai \ -e DISPLAY:0 \ ghcr.io/home-assistant/home-assistant:stable其中--privileged和--networkhost是关键。--privileged让容器有权限访问宿主机的蓝牙设备--networkhost则是让容器的网络栈与宿主机共享。如果启动后HA还是看不到蓝牙可以进容器确认一下docker exec -it homeassistant hciconfig如果输出为空多半是权限不够重新用--privileged启动容器即可。5. 我踩过的坑与排查指南5.1 蓝牙扫描不到温湿度计这是出现频率最高的问题。排查思路按顺序来距离太远BLE广播的覆盖范围有限特别是树莓派板载蓝牙天线一般先把温湿度计拿到离树莓派1米以内测试设备进入休眠有些温湿度计长时间静止后会降低广播频率按一下复位按钮唤醒被其他设备“占线”如果米家App还在连接特别是小爱音箱正在读取这台设备树莓派可能拿不到广播。先把米家绑定解除蓝牙服务异常重启蓝牙服务sudo systemctl restart bluetooth如果以上都排查过还是找不到建议换一个蓝牙适配器试试USB蓝牙网卡很便宜也能解决树莓派板载蓝牙信号弱的问题。5.2 Bind Key无效、解密失败在Passive BLE Monitor配置里填了encryption_key但HA还是报错或数据为空99%是密钥格式问题。检查点密钥是否为完整的32位十六进制字符是否混入了空格或换行MAC地址是否和密钥对应不同设备千万别填串了有些固件版本导出的密钥里带有“0x”前缀填配置时要去掉。我用过一个笨办法把密钥手打一遍再和Telink Flasher页面上的原文逐字对比。虽然麻烦但确实能发现问题。5.3 数据断更、数值跳动数据断更通常是因为温湿度计处于深度睡眠广播间隔变长HA没有及时收到新数据。解决办法有两个在Passive BLE Monitor的设置里调大“扫描跨度”参数让HA更频繁地捕捉广播把树莓派放得离传感器更近减少丢包。数值跳动则一般是信号不稳定导致的偶发异常。可以观察一段时间如果只是偶尔抖动不需要处理如果频繁乱跳考虑换传感器位置或减少2.4GHz WiFi干扰。5.4 多设备管理千万别搞混家里如果像我一样放了五六个温湿度计管理起来就要特别注意标识清晰。强烈建议在HA里给每个实体改一个有意义的名字比如sensor.livingroom_temperature、sensor.bedroom_humidity。否则所有设备都叫“温度传感器”根本没法定向自动化。我在本地维护了一个表格记录每个设备的MAC、Bind Key、摆放位置、责任区域每次新增设备都同步更新。这个习惯救了我很多次不然设备一多完全分不清谁是谁。最后再分享一个小经验整套方案跑起来之后最大的感受是树莓派这东西只要配置稳定真的可以一年到头不用管。我用的是树莓派4B2GB内存版本板载蓝牙同时监听四个温湿度计CPU占用率长期在10%以下系统负载几乎没有。如果你问我在Bind Key方案和刷ATC固件方案之间最终选了哪个我的答案是保留了原厂固件坚持用Bind Key。原因很简单我还在用米家App查看其他功能不想为了省一次密钥配置把设备踢出米家生态。绑定密钥管理虽然多一道工序但一次配置好后面几乎不会有变化稳定性也完全够用。这套方案其实只开了个头。树莓派蓝牙能接的设备远不止温湿度计米家蓝牙温湿度计之外还有很多同类BLE传感器可以用类似方法接入。等你把第一台设备跑通后面再要扩展基本上就是复制粘贴配置的事。希望这篇文章能帮你少走点弯路顺利把家里的温湿度数据真正掌握在自己手里。
返回列表