将 Yeelight 烛光氛围灯接入 Apple HomeKit

笔者第一次在购物网站上看到 Yeelight 烛光氛围灯时,便被它精巧的外观设计所吸引,果断地入手了一台。使用 Yeelight 配套 App,灯光的亮度可以通过蓝牙进行控制,非常方便。

在 iOS 10 中,苹果正式推出了 HomeKit,用于集中管理家中的智能硬件。可惜的是,Yeelight 烛光氛围灯并不能够直接接入到 HomeKit。笔者搜索了相关的解决方案,找到了可以运行在树莓派上的 Homebridge 及其插件 homebridge-yeelight。Homebridge 是一个 Node.js 服务器,能够模拟成 HomeKit 的网关,与 iOS 和 macOS 上的家庭 App 配对。而 Homebridge 强大的插件系统则能够控制原本不属于 HomeKit 生态圈的硬件,实现对家庭 App 的兼容。

homebridge-yeelight 原版插件在 2019 年就停更了,这一插件支持 Yeelight 彩光灯,但并没有适配烛光氛围灯。幸运的是,一位热心网友提交了 Pull Request 增加这个功能。这里需要深入研究 Yeelight 灯具的蓝牙通讯规则,工作量着实不小。另一个问题是,homebridge-yeelight 插件使用的用于蓝牙通讯的库 noble bluetooth-hci-socket 也停更了,后者是 C++ 写的,依赖于 libbluetooth-dev。由于 v8 引擎的 API 发生变化,这个库只能适配到 Node.js 8,在最新的 Node.js 16 中过不了编译。

又经过一番搜索,笔者发现 noble 这个库被 abandonware 组织救活了,这一组织的宗旨就是集众人之力,fork 并维护一些被抛弃的项目。对于 homebridge-yeelight 插件而言,将依赖包设置为 @abandonware/noble 就又可以用起来了。

安装流程

下面介绍完整的安装流程。注意,Homebridge 并不需要用 root 运行(只需要先用 setcap 给权限就行,后文会讲),而且笔者的经验表明,npm 依赖装在 root 权限下容易产生灾难性的后果。因此后面的操作用 pi 这个用户即可。

安装 Node.js

如果树莓派上还没有安装 Node.js,那么可以先安装 nvm,再用 nvm 管理 Node.js 版本。

1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

这一行命令将在用户的家目录下创建.nvm 目录。如果执行时 curl 卡住,那就挂个代理。

完成后,按照提示重启终端,就可以使用 nvm 安装 Node.js 了。

1
nvm install 16

可以执行 node 或者 npm 试试安装是否正确。

然后执行

1
sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)

这将允许 Node.js 和 Homebridge 搜索蓝牙设备。每次更新 Node.js 后都需要再次执行以上命令。

安装 Homebridge

接下来全局安装 Homebridge 及其插件。

1
npm install -g homebridge https://gitpkg.vercel.app/stevenjoezhang/homebridge_yeelight/yeelight

homebridge-yeelight 插件将会安装依赖 @abandonware/bluetooth-hci-socket,并默认使用预编译版本的动态库;如果没有找到则会使用 node-gyp 进行编译。若是在安装时遇到报错,可以检查一下是不是这个原因。从源码编译的话就需要先执行以下命令

1
sudo apt install libbluetooth-dev

运行 Homebridge

执行

1
homebridge

如果没有报错,那么就安装成功了。初次执行时 Homebridge 会在用户的家目录下创建.homebridge 目录。为了配置 Yeelight 插件,需要用文本编辑器创建一个 config.json 文件

1
vim ~/.homebridge/config.json

然后写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"bridge": {
"name": "YeeBridge",
"username": "18:00:27:40:BC:1B",
"port": 51825,
"pin": "031-45-154"
},
"platforms": [
{
"platform" : "yeelight",
"name" : "yeelight"
}
]
}

保存好配置文件后,检查一下树莓派的蓝牙是否处于开启状态,然后重启 Homebridge。这时,树莓派附近的 Yeelight 烛光氛围灯就可以被发现了。

接下来,使用 iOS 的家庭 App,扫描 Homebridge 运行时输出的二维码,即可完成配置。

使用 USB 蓝牙接收器

树莓派自带的 UART 蓝牙模块信号容易受干扰,如果可能的话,使用一个外接的 USB 蓝牙接收器,能够获得更好的效果。

在连接 USB 蓝牙接收器后,执行 hciconfig 命令,如果识别出两个设备,其中一个是 Bus: USB,说明树莓派支持这一接收器。这时可以禁用掉自带的蓝牙模块,方法是编辑 /boot/config.txt

1
sudo vim /boot/config.txt

在最后加一行

1
dtoverlay=disable-bt

最后重启系统即可。

参考文章:借助树莓派与 HomeBridge ,将 YeeLight 彩光灯接入 Apple HomeKit | Matrix 精选