用 Homebridge 把家电都接入 HomeKit

从此可以在 iOS 上控制我的家电。

一次偶然的机会,在 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 作为守护程序,具体用法参考文档即可。