使用Docker安装Home Bridge与Home Assistant,用Siri控制智能家居

最近一直在用煮蛋器给宝宝的奶瓶消毒,一次消毒5分钟。每次都要人工计时,这样明显是不科学的。

于是翻出来了一个前些年买的BroadLink的Wi-Fi定时插座SP mini,这样就可以用手机控制开关。BroadLink的自家应用还支持定时器功能,但每次都要设置一下,也不是很方便。虽然用手机控制了开关,看起来很智能,但是每次需要人工参与的步骤反而增多了:拿起手机,指纹解锁,找到并打开APP,点击那个开关进入控制界面,点击开关按钮,点击定时器按钮,选择时间(5分钟),关闭应用,关闭手机屏幕,放下手机。消毒个奶瓶,需要10次操作,这是伪科学!

Google了一下,发现很多小伙伴都在使用Home Bridge与Home Assistant来玩IoT。于是花了几个小时,在自家服务器上部署了一套。从此,只要大喊一声“嗨Siri,打开煮蛋器”即可,双手不离键盘,双眼不离屏幕,非常科学。

Home Assistant

Home Assistant是一个开源的IoT平台,社区非常活跃,正所谓众人拾材火焰高,它提供了对市面上能见到的多数设备的支持。

运行下边的Docker命令部署Home Assistant:

1
2
3
4
5
6
7
docker run -d \
--name="home-assistant" \
-v /some/path/config:/config \
-v /etc/localtime:/etc/localtime:ro \
--net=host \
--restart=always \
registry.docker-cn.com/homeassistant/home-assistant

当Home Assistant第一次启动时,会向/some/path/config中写入初始配置文件,请用实际路径替换掉上边的路径。当Home Assistant的Docker容器启动成功之后,可以用浏览器访问其8123端口。

Home Assistant支持W3C的Web App Manifest。这就是说,可以把其网页直接添加到移动设备的桌面上,用起来更像原生应用。具体操作可以参考Home Assistant Docs: Getting Started on Mobile

另外,Docker官方默认的源在国内访问很慢,所以使用了Docker官方的中国源,如果不在国内,可以去掉registry.docker-cn.com\

虽然Home Assistant对很多设备有自动发现的功能,但是很遗憾BroadLink不在此列,因此需要在配置文件中手动添加设备,下边是我的configuration.yaml配置:

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
homeassistant:
# Name of the location where Home Assistant is running
name: Home
# Location required to calculate the time the sun rises and sets
latitude: 你的纬度
longitude: 你的经度
# Impacts weather/sunrise data (altitude above sea level in meters)
elevation: 你的海拔高度(米)
# metric for Metric, imperial for Imperial
unit_system: metric
# Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
time_zone: Asia/Shanghai
customize:
switch.egg_boiler:
friendly_name: '煮蛋器'

# Show links to resources in log and frontend
# introduction:

# Enables the frontend
frontend:

# Enables configuration UI
config:

http:
# Uncomment this to add a password (recommended!)
# api_password: PASSWORD
# Uncomment this if you are using SSL or running in Docker etc
# base_url: example.duckdns.org:8123

# Checks for available updates
# Note: This component will send some information about your system to
# the developers to assist with development of Home Assistant.
# For more information, please see:
# https://home-assistant.io/blog/2016/10/25/explaining-the-updater/
updater:
# Optional, allows Home Assistant developers to focus on popular components.
# include_used_components: true

# Discover some devices automatically
discovery:

# Allows you to issue voice commands from the frontend in enabled browsers
conversation:

# Enables support for tracking state changes over time.
history:

# View all events in a logbook
logbook:

# Track the sun
sun:

# Weather Prediction
sensor:
platform: yr

# Text to speech
tts:
platform: google

switch:
- platform: broadlink
host: 设备IP地址
mac: '设备MAC地址'
friendly_name: 'Egg Boiler'
type: 'spmini2'
switches:
reciever:
command_on: 'switch_packet on'
command_off: 'switch_packet off'

group: !include groups.yaml
automation: !include automations.yaml

上边的配置文件中的中文部分请自行替换成相应的内容。这里的经纬度与海拔是用来算日出与日落时间的,这样就可以支持如日落开灯,日出关灯这样的功能。初始化的时候,Home Assistant会尝试自动配置经纬度,但是不一定准确,如果不需要使用日出日落功能,可以不用更改。

接下来配置动作文件automations.yaml,这里是我的配置:

1
2
3
4
5
6
7
8
9
10
11
12
- alias: "Turn Egg Boiler Off After 6 Minutes"
trigger:
entity_id: switch.egg_boiler
platform: state
from: 'off'
to: 'on'
for:
minutes: 6
action:
service: switch.turn_off
data:
entity_id: switch.egg_boiler

煮蛋器的状态从off变为on的时候,会延迟6分钟(1分钟预热,5分钟消毒)关闭煮蛋器

配置好之后,可以在Home Assistant的页面里重启服务,或者直接重启Docker容器。

Homebridge

iOS 10中的家庭应用可以控制任何兼容Apple HomeKit的设备,并可以使用Siri来进行控制。然而因为HomeKit出来的比较晚,在此之前的大量智能设备并不被支持。Homebridge是一个开源的HomeKit实现,在这些不支持HomeKit的设备与iOS之间建了一座桥,让他们能够相互通信。

Homebridge本身也有大量的插件支持,可以独立完成很多工作,只是在智能家居的控制上没有Home Assistant做的专业。

Homebridge没有官方的Docker镜像,推荐使用oznu的镜像,使用下边的命令部署:

1
2
3
4
5
6
7
docker run -d \
--net=host \
--name=homebridge \
-e TZ=Asia/Shanghai \
-v /some/path/config:/homebridge \
--restart=always \
registry.docker-cn.com/oznu/homebridge

同理需要替换/some/path/config,同时非国内用户可以去掉registry.docker-cn.com/

容器启动之后,首先需要安装homebridge-homeassistant插件:

1
docker exec homebridge yarn add homebridge-homeassistant

修改Homebridge的配置文件config.json,下边是我的配置:

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

"description": "Home",

"accessories": [],

"platforms": [{
"platform": "HomeAssistant",
"name": "HomeAssistant",
"host": "http://<Home Assistant服务器的IP地址>:8123",
"password": "",
"supported_types": ["binary_sensor", "climate", "cover", "fan", "group", "input_boolean", "light", "lock", "media_player", "remote", "scene", "sensor", "switch"],
"logging": false,
"verify_ssl": false
}]
}

最后重启Homebridge容器。

iOS配置与使用

首先设备需要和Homebridge服务器在同一个局域网中。打开设备上的家庭应用(如果没有可以去App Store里下载),点击右上角的加号,选择添加配件,稍等片刻,应用应该可以自动找到Homebridge服务,之后按照提示操作,PIN值输入配置里的031-45-154即可(PIN值可以自行修改,只要两边对应就可以了,类似蓝牙的配对功能)。添加成功后,所有Home Assistant上的设备在家庭里都看得到,可以手动控制,也可以使用Siri控制。

当Homebridge配对成功后,就不会再被其他设备找到了。如果家庭有多个成员使用,可以点击左上角按钮,发送邀请,所有用户的数据是同步的。

在我写这篇文章时,iOS的最新版本为10.3.3,macOS的版本为Sierra 10.12.5。使用iPhone与iPad都可以通过Siri进行控制。Apple Watch应该也可以,但是我没有,所以没有测试。Macbook Pro(macOS)上的Siri不支持此功能(Siri自己说的)。

参考