苹果自从发布了 HomeKit,可以方便的把家里的智能设备连接在一起,结合 Siri 可以说说话就让家里的设备运转起来。但是只有苹果认证的设备才能用,没有认证的还是没有办法使用的。好在有nfarina逆向了苹果的协议,做出了homebridge才使得众多智能设备接入 HomeKit 成为现实。

材料准备

  1. 树莓派(我手上的是树莓派 3B)
  2. Yeelight 灯一个(我用的是 Yeelight 台灯)
  3. iPhone 或者 iPad 一个,要求 iOS10 以上(这里我使用 iPad)

Yeelight 设置局域网控制(极客模式)

先说一下 Yeelight 的极客模式,这里极客模式和局域网控制是一个东西,我刚买的时候还是极客模式,几个月之后极客模式变成了局域网控制。我特地去问了客服,这两个是一个东西,客服截图上显示的还是极客模式,而我这里显示的却是局域网控制。如果你手上也是显示的是局域网控制,不要奇怪,当成一样的就好了,不影响使用。

我们先从灯的设置开始。先用手机下载一个 Yeelight 的 APP(应用商店里搜一下就有了),输入账号密码登录。登录之后需点击右上角的加号添加一台设备,选择你手上所使用的设备,我这里是台灯。下图是添加好的样子,添加过程中需要输入 WiFi 密码。

连接好之后,点击刚刚添加的台灯,进入控制页,选择右下角的三角形。

在弹出的页面中选择局域网控制(极客模式)

把局域网控制的开关给打开 Yeelight 台灯的设置就这些,没有了。

树莓派的配置

这里默认已经在树莓派上装好了系统,并且接上电源,连接了网络并且要和 Yeelight 灯在同一个局域网。没有的话参考树莓派入门。不用树莓派用其它的也是可以的,需要根据自己的系统进行相应的调整。

安装 Node.js

首先打开终端,通过 ssh 连接上树莓派,我们的操作都是在命令行下进行。Windows 可以使用 Xshell、PuTTY 等工具。

1
ssh pi@192.168.1.x #这里换成你自己的 IP,回车后输入密码

接下来安装 Node.js

1
2
3
curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v # 查看一下是否安装成功,成功会输出类似 v9.x.x

为 npm(node 的包管理工具,安装好 Node.js 就有) 配置淘宝源,在终端中输入 vi .npmrc 按下 i 后输入下面内容

1
registry = https://registry.npm.taobao.org

输好后按下 ESC(一般在 F1 旁边) ,输入 : ,接着按下 wq 回车。

不做这一步也是可以的,但是国内速度可能会稍慢。

安装 homebridge

装好了 Node.js 就可以安装 homebridge,homebridge 是一个把设备接入 HomeKit 的工具(类似桥梁的作用),没有它就不能使用没有经过苹果认证的设备。

1
2
sudo apt-get install libavahi-compat-libdnssd-dev
sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp

安装 Yeelight 插件

装好了 homebridge 还需要装上插件才能使用对应的智能设备,这里我使用的 Yeelight 台灯,所以还要安装 homebridge-yeelight 这个插件。

1
sudo npm install -g homebridge-yeelight

插件配置

插件装好了之后,我们需要配置一下让 homebridge 识别我们。

1
2
cd ~/.homebridge  # 没有的话手动创建,使用 mkdir ~/.homebridge
vi config.json

打开文件之后按下 i 键,复制下面的内容到里面。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "bridge": {
	"name": "Homebridge",
	"username": "CC:22:3D:E3:CE:30",
	"port": 51826,
	"pin": "031-45-154"
  },

  "platforms": [
	{
	  "platform" : "yeelight",
	  "name" : "yeelight"
	}
  ]
}

写好之后按下 ESC ,输入 : 后再输入 wq 回车,该操作会保存文件并退出 vi 回到终端。解释一下上面 bridge 中的配置

  • name 一个名称,在家庭 APP 上添加配件时显示,可以随意填写
  • username 一个唯一标识符,类似 MAC 地址,可以随意填写,格式不能变
  • port homebridge 的端口号,可以任意,但是需要没有被系统占用的
  • pin 密码,验证的时候用,可以任意,但是必须是 8 位数字,格式如上
  • platforms 里的东西是插件里规定的,就这么写吧,不用改。

启动 homebridge

在终端中输入下面命令,启动 homebridge

1
homebridge

会看到一个二维码和我们刚刚配置的 pin(图中红色方框中的),二维码暂时用不到,pin 会在接下来用到。到这里树莓派上的操作都完成了。

接入 HomeKit

打开 iPad,进入家庭 APP,选择添加配件。

在弹出的窗口中扫描终端显示的 pin(就是刚刚运行 homebridge 的地方),这一步通常是不能正确识别的,别担心后面可以手动输入。

来到这里估计估计你已经没有识别出 pin,没关系,我们手动输入 pin。

输入正确的 pin 后,可以看到 Homebridge 显示在 iPad 上了,点击 Homebridge 添加。这里的 Homebridge 就是我们在配置文件里设置的 bridge.name

点击后会提示未认证配件,选择仍然添加。不添加怎么玩?

接下来的是一些设置,我们默认不动,选择下一步。

可以看到 Yeelight 灯出现了。在下图红框框中,我把名字改为台灯,这样方便 Siri 识别。改好之后点击右上角完成。

回到家庭 APP 主页,台灯已经显示出来。到这里已经已经成功的把 Yeelight 台灯接入 HomeKit。

开机自启动

照着上面的配置好了,也能够使用了。但是每次使用都要我手动运行 homebridge 太麻烦了,有没有开机自启动?有,接下来就来配置开机自启动。

先验证一下 homebridge 的路径

1
which homebridge

如果输出不是 /usr/bin/homebridge ,那么你需要把下面拷贝第 13 行的 cmd="DEBUG=* /usr/bin/homebridge" 改为 cmd ="DEBUG=* 刚刚输出的东西"

制作启动脚本

1
sudo vi /etc/init.d/homebridge

按下键盘上 i ,把下面的内容拷贝进去

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/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/bin/homebridge"
user="pi"

name=`basename $0`
pid_file="/var/run/$name.pid"
stdout_log="/var/log/$name.log"
stderr_log="/var/log/$name.err"

get_pid() {
	cat "$pid_file"
}

is_running() {
	[ -f "$pid_file" ] && ps -p `get_pid` > /dev/null 2>&1
}

case "$1" in
	start)
		if is_running; then
			echo "Already started"
		else
			echo "Starting $name"
			cd "$dir"
			if [ -z "$user" ]; then
				sudo $cmd >> "$stdout_log" 2>> "$stderr_log" &
			else
				sudo -u "$user" $cmd >> "$stdout_log" 2>> "$stderr_log" &
			fi
			echo $! > "$pid_file"
			if ! is_running; then
				echo "Unable to start, see $stdout_log and $stderr_log"
				exit 1
			fi
		fi
		;;
	stop)
		if is_running; then
			echo -n "Stopping $name.."
			kill `get_pid`
			for i in 1 2 3 4 5 6 7 8 9 10
					 # for i in `seq 10`
			do
				if ! is_running; then
					break
				fi

				echo -n "."
				sleep 1
			done
			echo

			if is_running; then
				echo "Not stopped; may still be shutting down or shutdown may have failed"
				exit 1
			else
				echo "Stopped"
				if [ -f "$pid_file" ]; then
					rm "$pid_file"
				fi
			fi
		else
			echo "Not running"
		fi
		;;
	restart)
		$0 stop
		if is_running; then
			echo "Unable to stop, will not attempt to start"
			exit 1
		fi
		$0 start
		;;
	status)
		if is_running; then
			echo "Running"
		else
			echo "Stopped"
			exit 1
		fi
		;;
	*)
		echo "Usage: $0 {start|stop|restart|status}"
		exit 1
		;;
esac

exit 0

按下 ESC ,输入 : 后按下 wq 回车保存并退出编辑。

设置权限

保存之后我们还要给执行的文件权限,不然开机之后还是没法自动启动的。

1
2
sudo chmod 755 /etc/init.d/homebridge
sudo update-rc.d homebridge defaults

重启之后 homebridge 就会自己运行。

参考