自制 HomeKit 智能家居#
Created: June 22, 2021 3:59 PM
Tags: HomeKit, 智能家居,树莓派
此文曾发布在知乎(https://zhuanlan.zhihu.com/p/31423265)和少数派上,此处是做一个归档,实际写作时间是在 2017 年
序#
这篇文章是我半年前瞎折腾树莓派的时候写的,本来不适合放在这个专栏里的,毕竟和我司其他大佬的文章比起来,这篇东西实在没有什么技术含量。不过它也不是那么一无是处,至少任何人都可以轻易地读懂并且实现这篇文章里的东西,并且从中体验到 coding 的乐趣。
HomeKit 是什么?#
Homekit 是 Apple 自 iOS10 开始提供的智能家居组件,允许第三方将认证过的智能硬件接入 iOS 系统中,并且通过 Siri 控制。并且在局域网内使用端到端加密,在安全性上非常不错。而缺点也显而易见,认证硬件贵且少。不过这都不是问题,因为我们有 homebridge。
**HomeBridge是什么?**#
根据苹果 HomeKit 组前员工写的破解论文,使用 NodeJS 写的模拟 HomeKit API 的 server 框架,在 Github 上已有 7000 多个 Star。可以通过写对应要求的插件将未被认证的智能设备接入 HomeKit。
目标#
- 低成本构建高体验的智能家居,可以语音控制。
- 打造一个相对完整的智能家居体验。
- 将不支持智能家居的旧设备也改造成智能设备。
- 可移植性强,方便搬家时带走。
准备#
硬件准备:#
-
树莓派 3 代 B 型 200 元
-
树莓派电源 (5V 2.5A) 安卓的 2A 充电器也行,2.5A 可以支持高功率运行,算是为了日后准备吧。
-
16G SD 卡 (最好是 class 10 速度的) 50 元
-
网线一根
-
Yeelight 灯泡 99 元
-
小米网关二代 149 元
-
小米温湿度感应器 49 元
-
小米人体动作感应器 59 元
-
小米门窗感应器 49 元
-
小米智能插座 Zigbee 版:控制热水器 69 元
-
小米 空调伴侣 支持 homebridge 199 元 感谢评论区的提醒
-
罗技 Harmony Hub (控制接入家中一切的红外设备:空调、电视机、音响、电扇、空气净化器、电动晾衣架。) 299 元
-
小米空气净化器 2 代 699 元
需要自备的其他硬件#
- 支持 IOS10 的手机或平板。
- 安卓手机一台(用来获取网关密码,因此借一台也可以)。
- 路由器。
Future work:#
- Aqara 墙壁开关 (可移植性差,以后考虑)
- 门锁
- 电动窗帘:红外遥控电动窗帘 + harmony 即可,或用小米的电动窗帘
- 摄像头
- SSH 指令 (链接)
- 蓝牙设备 (音箱)(链接)
- Home Assistant 支持设备
不计空调伴侣和净化器,总共 1023 元。
软件准备#
用于自己烧录系统到 SD 卡
- Mac 下 ApplePi
- Windows 下 SDFormatter、Window32 Disk Image
- Linux 用户。。。你们直接用 dd 命令就好
安装#
Yeelight 灯泡#
下载 yeelight App,按照指示连接上灯泡,然后打开极客模式即可。
小米网关及相关感应器#
- 将小米网关插电,下载 “米家” App。将手机连入 2.4Ghz 的 Wi-Fi 网络 (现有的大多数智能家居都不支持 5Ghz Wi-Fi),按照指示添加网关,然后添加其他的感应器。
获取网关的 MAC 地址及通讯密码#
网关信息是之后的 homebridge 配置文件中需要的,但只能从安卓手机的 “米家” App 中可以获得。
- 点击 App 进入网关选项-> 进入屏幕右上角的 “...”-> 进入 “关于”-> 连续按机屏幕下方版本号区域激活开发者模式
- 点击 “局域网通讯协议” 选项,打开局域网通讯协议,并记下密码
- 返回上一级菜单,开发者模式中会出现一个 “网关信息” 的选项-> 记录 MAC 地址('mac' 字段后面那一串 6 对的字母数字)
树莓派#
树莓派是英国剑桥大学教授主持的一个致力于推广孩童计算机教育的硬件项目,主要使用的是 Linux 系统 raspbian 系统,也可以安装 Debian GNU/Linux 、Fedora、Arch Linux 、RISC OS、二代 B 以上还支持 Window10 IoT。
3 代 model B 的配置:
- 搭载 1.2GHz 的 64 位四核处理器(ARM Cortex-A53 1.2GHz 64-bit quad-core ARMv7 CPU)。
- 增加 802.11 b/g/n 无线网卡。
- 增加低功耗蓝牙 4.1 适配器。
主要是作为 homebridge 的服务器,使不支持 homekit 的设备被 homekit 识别。
不熟悉 Linux 命令的朋友,只要跟着复制粘贴命令就好了。
安装系统#
我是选择在购买 SD 卡时让商家给我拷贝了一份系统进去,实际上也可以自己下载烧录到 SD 卡上。
- 下载的 raspbian jessie 版本系统( 现在升级为最新版 stretch)。[树莓派系统下载地址](Index of /raspbian/images)
- Windows 下面可以采用 SDFormatter 对 SD 卡进行格式化,再使用 Window32 Disk Image 来烧入 SD 卡中。Mac 下推荐 ApplePi 这个软件,可以用来烧制系统和备份。
- 树莓派默认关闭了 SSH,开启的方式也很简单,就是在 SD 卡内系统的根目录下创建一个空的 ssh 文件。
- 连上电源线 (mini USB)、网线直接连接到家里的路由器上、插入 SD 卡。系统会自动开机安装。
- 将树莓派用网线连接上电脑,使用 SSH 登录,默认密码是 raspberry
- 配置 wifi,否则需要用网线将树莓派连接在路由上。
不熟悉 vi 的朋友可以使用 nano 文本编辑器编辑源文件,操作接近于普通的文本编辑器。使用 ctrl+O 保存,ctrl+X 来退出。建议编辑前采用 cp 命令备份一份原文件。或者使用下面的命令一步将树莓派官网和第三方源替换成清华源。
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
添加如下内容:
network={ ssid="wifiname" psk="password" }
保存后,断开网线,几秒内就会连上 wifi
- 修改镜像源,原始的系统更新源在国内速度比较慢,导致安装其他程序时超时报错,可以更换成国内的或者开启 SS 服务。
sudo sed -i 's#://archive.raspberrypi.org/debian#s://mirrors.tuna.tsinghua.edu.cn/raspberrypi#g' /etc/apt/sources.list.d/raspi.list sudo sed -i 's#://archive.raspberrypi.org/debian#s://mirrors.tuna.tsinghua.edu.cn/raspberrypi#g' /etc/apt/sources.list.d/raspi.list
- 更新更新库并且重新组织依赖
sudo apt-get update && sudo apt-get upgrade
安装 NodeJS 及依赖和 Homebridge 及相关插件#
安装 NodeJS#
首先检查一下,所用树莓派的芯片版本
uname -a
我的返回芯片版本是 armv7l:
Linux raspberrypi 4.4.50-v7+ 970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux
使用如下命令去下载安装 node6,node7 还不太稳定,node5 对 homebridge 的兼容不是很好
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs
安装 Avahi#
sudo apt-get install libavahi-compat-libdnssd-dev
安装 Homebridge#
sudo npm install -g --unsafe-perm homebridge
如果如上命令无法顺利跑完,那么说明需要一些额外的配置,跑如下的命令:
sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp cd /usr/local/lib/node_modules/homebridge/ sudo npm install --unsafe-perm bignum cd /usr/local/lib/node_modules/hap-nodejs/node_modules/mdns sudo node-gyp BUILDTYPE=Release rebuild
安装 homebridge-aqara, aqara 协议的网关及感应器#
sudo npm install -g homebridge-aqara
安装 homebridge-yeelight, yeelight 灯泡的插件#
sudo npm install -g homebridge-yeelight
安装小米空气净化器插件#
npm install -g homebridge-mi-air-purifier miio
断开其他智能设备,只保留空气净化器。再输入下面的命令获取净化器的 IP 和 Token
miio --discover --sync
可能会返回多个下列格式的设备信息:
Device ID: 49466088 Model info: Unknown Address: 192.168.1.8 Token: 6f7a65786550386c700a6b526666744d via auto-token Support: Unknown
记下 address 和 token,之后要写到配置文件中
安装小米空调伴侣插件#
最新版 0.5.1 有 bug,暂时无法启动,已经提了 issue,等待作者更新。
sudo npm install -g [email protected]
同样使用上面的miio --discover --sync
来发现空调伴侣及关联的温湿度感应器的 device_id (填写在 sensorSid 值 'lumi.' 后)
添加红外设备进 Homekit#
后来发现了罗技 Harmony Hub 的红外遥控器设备,支持 28 万种设备 (支持红外学习新设备),300 元以内,它也有插件接入 homebridge。安装后,家中红外设备,例如空调、电视机、空气净化器、电动晾衣架都可以通过 Siri 控制。根据说明接入红外设备,最多 7 个。
安装过程:
全程需要全局科 学 上 网
- 下载电脑客户端 MyHarmony,有 Mac 和 Win 版。
- USB 连接 Hub 到电脑,识别 Hub。网络连接 2.4Ghz 的 WiFi。
- 识别到 WiFi,输入 WiFi 密码。
- 注册账户用于在不同设备上管理设置,建议用邮箱。
- 提示你要连接 Remote 遥控器才可以继续,点击右下角的 Skip 键。虽然上面写的是只有 Remote 的情况下的 Skip,实际上也适用于只有 Hub 的情况下。
- 识别完成,进入管理界面。会提示你给你的 Hub 起一个名字。然后提示你添加设备。
- 通过设备的品牌名和设备号 (model) 来添加,数据库内搜索不到的,可以手动添加,并通过红外学习遥控器。
- 左边菜单栏有 Activity,可以设置自动化控制活动。例如:看电视 = 打开电视 + 机顶盒 + 音响 + 调整到你最喜欢的频道。最后每个 Activity 会作为一个插座类设备添加到 Homekit 中。
- 下面是设置 Harmony 的插件和配置文件。
通过终端进入树莓派终端,然后安装 Harmony Hub 的插件
sudo npm -g install homebridge-harmonyhub
创建 homebridge 的配置文件 config.json#
mkdir /home/pi/.homebridge/ sudo nano /home/pi/.homebridge/config.json
Homebridge 配置文件的内容及格式#
需要将网关的密码和 MAC 地址,以及 aqara 网关及 yeelight 的配置信息。#注释部分请删除
pin 之后用于加入 iphone 中的家庭 app
{ "bridge":{ "name":"YeeBridge", "username":"任意MAC地址", "port":51827, "pin":"031-45-157" }, "platforms":[ { "platform":"yeelight", "name":"yeelight" }, { "platform":"AqaraPlatform", "sid":[ "填写网关的MAC地址,小写,连写" ], "password":[ "网关密码" ] }, { "platform":"HarmonyHub", "name":"Harmony Hub" }, { "platform":"XiaoMiAcPartner", "ip":"空调伴侣ip", "token":"空调伴侣token", "accessories":[ { "name":"Ac Partner", "type":"climate", "sensorSid": "lumi.{device_id}" } ] } ], "accessories":[ { "accessory":"MiAirPurifier", "name":"Air Purifier", "ip":"净化器IP", "token":"ADDRESS_OF_THE_AIR_PURIFIER", "showTemperature":true, "showHumidity":true, "showAirQuality":true } ] }
配置开机启动 homebridge#
配置到这里,只要在终端输入 homebridge 就可以运行了。但是关闭终端后就会关闭,而且万一出现断电重启的情况,服务就会关闭。因此我们要配置一个开机启动 homekit 的配置。homebrige 的 github 页面上推荐了三种方式,我采用里面最方便的方式 init.d 的方法。
首先从这里下载一个配置文件,并复制所有内容。下载
然后使用如下命令在 init.d 目录下创建一个 homebridge 启动的文件:
sudo nano /etc/init.d/homebridge
将下面的内容直接复制覆盖文件中的部分,注意 cmd 后面填写的位置是你 homebridge 所在的目录,会出现两种情况。查找 homebridge 的位置使用如下命令:
`which homebrige
#!/bin/sh
BEGIN INIT INFO#
Provides: homebridge#
Required-Start: $network $remote_fs $syslog#
Required-Stop: $remote_fs $syslog#
Default-Start: 2 3 4 5#
Default-Stop: 0 1 6#
Short-Description: Start daemon at boot time#
Description: Enable service provided by daemon.#
END INIT INFO#
dir="/home/pi"
cmd="DEBUG=* /usr/local/bin/homebridge"
user="pi"`
修改文件的权限:
sudo chmod 755 /etc/init.d/homebridge sudo update-rc.d homebridge defaults
重启后就会自动启动,或者手动启动:
sudo /etc/init.d/homebridge start
添加设备进入家庭 App#
这里可以参考 Apple 官方的 [操作指南](在 iPhone、iPad 和 iPod touch 上使用 “家庭” 应用)
将 iphone 连入同一个局域网,打开家庭 App,新建家庭就可以添加 homebridge 了。
这个时候你会发现,app 问你要一个验证码,用来验证设备。正规的 homekit 设备是有这个的,但是我们的并没有,这个东西我一开始找了 5 分钟,才发现其实启动 homebridge 服务器的时候,终端就已经生成了,我们找到后手动输入就好了。
就是配置文件里 PIN 的部分。
此时,所有的设备都会出现在 App 里,你可以按住,选择编辑,修改他们所在房间和名字类别。
远程控制及自动化#
远程控制#
为了保证安全,Homekit 的默认支持环境是局域网下,但是如果你有 ipad 可以升级到 iOS10 的系统,或者 Apple TV 四代以上,就可以在设置里将其配置为中控,这样在家外也可以控制这些设备了。
如果没有这些设备,也没关系,米家 app 里也有可以远程控制的(就是非常难用而已)。
自动化#
自动化可以让你设置各种规则,来自动控制你家中的设备。
例如:
IF (当):网关光感器检测到暗,同时有人进入卧室
执行:打开卧室灯
IF (当):温度检测器检测到超过 30 度,且门窗关闭,且家中感应到有人
执行:打开空调,设置为制冷模式 25 度。需要小米空调伴侣或者万能遥控器
坑#
- 看官方文档!看官方文档!看官方文档
- 折腾完以后,一定要用烧录软件备份一下 SD 卡里的系统,然后再继续折腾别的,别问我怎么知道的。。。
- 除非有特殊需求,不要给树莓派设置静态 IP,因为 yeelight 采用 TCP 进行通讯,一旦路由器的 DHCP 给 Yeelight 设备配置了不同网段的 IP,会导致无法控制灯泡。在此鸣谢 Yeelight 的员工,晚上 8 点多还和我积极的沟通,帮我找到问题。
- NodeJs 6 最为合适,5 有兼容问题,7 还不是很稳定。
- 小米的其他设备加入 homebridge 的进度不是很快,在知乎上关注负责这块的工程师,看他快有一个月没有大改动了。但说会支持空调助手 (终于有第三方支持了),我觉得支持万能遥控器比较重要,可以快速提高可玩性。
- 给树莓派准备点散热垫,或者金属立柱散热,风扇散热效果不怎么好。还很闹。
最后效果#
最后附上一个第一次成功时录的小视频