一次偶然的机会,在 GitHub 上遇到了兼容 HomeKit 协议的中间件 Homebridge,经过一番折腾,终于让家里面的智能硬件都接入了 Apple 的 HomeKit。
我目前在用的是下面这两款小米出品的智能硬件,鉴于小米的「米家」App 在 iOS 下很不方便,我决定都统一使用 HomeKit 操控这些硬件。
由于我一直使用 Mac mini 运行 Mac Server App 作为 NAS 和 Time Machine,所以决定 Homebridge 也部署在 Mac mini 上。
运行 Homebridge 首先需要 Node 环境,而且使用 NPM 管理 node module。使用 sudo npm install -g --unsafe-perm homebridge
安装 Homebridge。
连接 Yeelight 的智能灯,需要用到 homebridge-yeelight 这款插件,使用 npm install -g homebridge-yeelight
安装即可。
小米空气净化器用的是 homebridge-mi-air-purifier 这个插件,但是原代码貌似暂时不支持多个净化器接入,为了将家里两台净化器接入,我暂时魔改了一下源代码1,将自动从 miio 扫描设备改为手动输入 IP 地址和 token。更多关于小米系列的通信协议,可以参考 miio 项目。
为了节省空间我现在的主机被我塞在了墙角,每次开机我都需要钻到桌子下去按电源,十分不方便。前段时间,我换了一块支持 WOL 的主板,配合 HomeKit,我就可以在手机唤醒主机了。用到的是 homebridge-cmdswitch2 这个插件,配合 wakeonlan 可以唤醒主机,而通过 ping 则可以知道主机是否在线,来显示开关状态。下面是我的配置文件。
{
"platforms": [
{
"platform": "cmdSwitch2",
"name": "CMD Switch",
"switches": [
{
"name": "iMac",
"on_cmd": "wakeonlan 40:8d:5c:87:67:b8",
"state_cmd": "ping -c 1 -W 1 10.0.0.100 | grep -i '1 packets received'"
}
]
}
]
}
此外,我希望在 Home App 的界面能看到 Mac mini 和 LEDE 路由器的当前温度,所以我使用 homebridge-http-temperature-humidity 配合 Python 编写的 Web Server,通过轮询的方式读取设备的温度。Python 代码大概是下面这个样子。
import subprocess
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class HTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
# get temperature here
self.wfile.write('{"temperature": %f}' % temp) # response as json
if __name__ == '__main__':
server = HTTPServer(('0.0.0.0', 54321), HTTPRequestHandler)
server.serve_forever()
最后,为了方便管理这一大堆小脚本,我用 PM2 作为守护程序,具体用法参考文档即可。
魔改後代碼:小米空氣淨化器 Homebridge 插件↩