xChar
·8 years ago

自制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。

目标

  1. 低成本构建高体验的智能家居,可以语音控制。
  2. 打造一个相对完整的智能家居体验。
  3. 将不支持智能家居的旧设备也改造成智能设备。
  4. 可移植性强,方便搬家时带走。

准备

硬件准备:

  • 树莓派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卡上。

  1. 下载的raspbian jessie版本系统( 现在升级为最新版stretch)。[树莓派系统下载地址](Index of /raspbian/images)
  2. Windows下面可以采用SDFormatter对SD卡进行格式化,再使用Window32 Disk Image来烧入SD卡中。Mac下推荐ApplePi这个软件,可以用来烧制系统和备份。
  3. 树莓派默认关闭了SSH,开启的方式也很简单,就是在SD卡内系统的根目录下创建一个空的ssh文件。
  4. 连上电源线(mini USB)、网线直接连接到家里的路由器上、插入SD卡。系统会自动开机安装。
  5. 将树莓派用网线连接上电脑,使用SSH登录,默认密码是raspberry

ssh [email protected]

  1. 配置wifi,否则需要用网线将树莓派连接在路由上。

不熟悉vi的朋友可以使用nano文本编辑器编辑源文件,操作接近于普通的文本编辑器。使用ctrl+O保存,ctrl+X来退出。建议编辑前采用cp命令备份一份原文件。或者使用下面的命令一步将树莓派官网和第三方源替换成清华源。

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

添加如下内容:

network={ ssid="wifiname" psk="password" }

保存后,断开网线,几秒内就会连上wifi

  1. 修改镜像源,原始的系统更新源在国内速度比较慢,导致安装其他程序时超时报错,可以更换成国内的或者开启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

  1. 更新更新库并且重新组织依赖

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个。

安装过程:

全程需要全局科 学 上 网

  1. 下载电脑客户端MyHarmony,有Mac和Win版。
  2. USB连接Hub到电脑,识别Hub。网络连接2.4Ghz的WiFi。
  3. 识别到WiFi,输入WiFi密码。
  4. 注册账户用于在不同设备上管理设置,建议用邮箱。
  5. 提示你要连接Remote遥控器才可以继续,点击右下角的Skip键。虽然上面写的是只有Remote的情况下的Skip,实际上也适用于只有Hub的情况下。
  6. 识别完成,进入管理界面。会提示你给你的Hub起一个名字。然后提示你添加设备。
  7. 通过设备的品牌名和设备号(model)来添加,数据库内搜索不到的,可以手动添加,并通过红外学习遥控器。
  8. 左边菜单栏有Activity,可以设置自动化控制活动。例如:看电视=打开电视+机顶盒+音响+调整到你最喜欢的频道。最后每个Activity会作为一个插座类设备添加到Homekit中。
  9. 下面是设置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的进度不是很快,在知乎上关注负责这块的工程师,看他快有一个月没有大改动了。但说会支持空调助手(终于有第三方支持了),我觉得支持万能遥控器比较重要,可以快速提高可玩性。
  • 给树莓派准备点散热垫,或者金属立柱散热,风扇散热效果不怎么好。还很闹。

最后效果

最后附上一个第一次成功时录的小视频

https://pic4.zhimg.com/80/v2-63ece8d4d3ef454657b83b3bafdb08ab_1440w.jpg

https://pic4.zhimg.com/80/v2-7b0b6543c3f352bf692c496849cf1c2b_1440w.jpg

https://pic2.zhimg.com/80/v2-f97c6bc17afa418786f8e632db36c529_1440w.jpg

Loading comments...