Quantcast
Channel: 少数派
Viewing all articles
Browse latest Browse all 13772

从零开始,教你用树莓派 + IFTTT 实现 HomeKit 智能家居自动化

$
0
0

本章讲一讲「高级版自动化」。你可以现在设想一下:天气预报说要下雨了,网关灯变红!如果爸爸回家,手机接入 Wi-Fi,赶紧推送告诉我不要看小视频了!只要米家 + IFTTT + HomeAssistant就可以做到!

前情回顾

上一章题目是《入门智能家居,从米家到 HomeKit(一)

主要讲的是在「树莓派」上通过 HomeBridge 把米家智能家居接入到 iOS 的 HomeKit 中。

实在非常抱歉,因为本人本职工作最近负责开发一个项目,一月赶工无休,所以实在没法抽出时间更新这个系列,现在项目有一些模块已经上线,时间相对宽裕一些,遂把这个坑填了。

这一章我们除了使用到上一章的 HomeBridge,还会使用 HomeAssistant。

那么,问题来了:

null

0. HomeKit、HomeBridge、HomeAssistant 分别是什么?关系是什么?

0.1. 概念

  • HomeKit:苹果于 2015 年 5 月发布的智能家居平台。
  • HomeBridge:一个开源程序,用于让 HomeKit 支持一些原生不支持 HomeKit 的设备(如米家家居)。
  • HomeAssistant:一个第三方的智能家居平台。

0.2. 关系

  • 上一章的关系图:

null

可以看到,上一章米家设备通过插件 HomeBridge-Mi-Aqara 来与 HomeBridge 沟通,让我们的 iPhone 通过 Siri(HomeKit)来接入 HomeBridge 达到最终控制米家设备的目的。

  • 本章的关系图:

null

可以看到,这一章将要介绍的情况,米家、IFTTT 这些智能家居并没有直接接入到 HomeBridge,而是先接入到第三方智能家居平 HomeAssistant,然后 HomeAssistant 与 HomeBridge 通过插件 HomeBridge-HomeAssistant 进行交互沟通,最后把结果反馈到你的手机上。

0.3. 我为什么要搞多一个 HomeAssistant?

因为接入了 HomeAssistant,能够给你的家居智能化上升到一个新的高度,HomeAssistant 支持一系列的组件。

HomeBridge 因为自身的一些条件限制,以及条件束缚,只能够一次控制一类家居,比如 HomeBridge-Mi-Aqara 就只能控制米家类家居。

而 HomeAssistant 能够做到,「如果天气预报说要下雨了,网关灯变红,多云变黄,晴天就变绿啊」,或者是「爸爸回家了手机自动联入 Wi-Fi,会发推送告诉我不要看小视频了」等等,可以说,让更多的事情加入到智能化这一行列。

让事情变得更好玩,更有趣,更智能,是我引入 HomeAssistant 的目的所在。

null

0.4. 我想告诉你的

如果你是希望「用 iPhone 或者 Siri 控制一些米家家居,或者回到家打开门台灯自动亮起来欢迎你」,那么其实 上一章内容已经完全满足你的需求,已经 OK 了。

这一章虽然带来了很多新的有趣的「骚操作」,但是因为引入了 HomeAssistant,所以也会相应的增加了操作量,所以你要自我衡量考虑一下要不要继续折腾噢~

涉及到的新操作 IFTTT动态域名解析Liunx 部分新命令

1. 开始前的准备

准备:

  1. 你需要有一个树莓派,它是一个已知 IP 地址开启了 SSH干净正常耐操的树莓派。
  2. 希望你最好有 linux 的基础。

通关路线:

  • 如果对于上面两条你已经做到了,那么直接从往下看。
  • 如果你是完全按照上一章内容操作,并且完成了所有功能实现,那么请看这里,为你跳过重复部分。
  • 如果你对于这个准备毫无头绪,不妨先回顾一下 上一章内容,在上一章的第 0~1 章有相应的手把手教学
  • 如果你已经配置好了 HomeAssistant & HomeBridge,可以直接拉到下面查看关于「联动 IFTTT 的骚操作教程」。

2. 整个应用框架的安装

2.1. 安装 NodeJS

在终端中输入

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs

null

安装完要使用nodejs -v看看版本是不是 v6.xx,如果不是的话,再次执行这两条命令。

2.2. 安装 avahi 包

在终端中输入

sudo apt-get install libavahi-compat-libdnssd-dev

null

2.3. 安装 HomeBridge

在终端中输入

sudo npm install -g --unsafe-perm homebridge

null

2.4. 安装 HomeBridge-HomeAssistant

在终端中输入

sudo npm install -g homebridge-homeassistant

null

2.5. 安装 HomeAssistant

在终端中输入

sudo pip3 install homeassistant

null

2.6. 配置 HomeAssistant

2.6.1. 初始化 HomeAssistant 配置文件

在终端中输入

mkdir ~/.homeassistantvi ~/.homeassistant/configuration.yaml

在打开的编辑器中,单击键盘的i键,进入输入状态

复制以下初始化内容到文件中。

homeassistant:  # Name of the location where Home Assistant is running  name: Home  # Location required to calculate the time the sun rises and sets  # 设置你的经纬度,判断日落时间  latitude: 42.7683  longitude: 129.3364  # Impacts weather/sunrise data (altitude above sea level in meters)  elevation: 0  # 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# Show links to resources in log and frontendintroduction:# Enables the frontendfrontend:# Enables configuration UIconfig:http:  # Uncomment this to add a password (recommended!)  # 这里推荐设置一个登陆密码  api_password: HaHb7890  # Uncomment this if you are using SSL/TLS, running in Docker container, 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 automaticallydiscovery:# Allows you to issue voice commands from the frontend in enabled browsersconversation:# Enables support for tracking state changes over timehistory:# View all events in a logbooklogbook:# Track the sunsun:# Weather predictionsensor:  - platform: yr# Text to speechtts:  - platform: googlegroup: !include groups.yamlautomation: !include automations.yaml

然后点击键盘 esc,输入 :wq进行保存并推出编辑器。

2.6.2. 安装 HomeAssistant 初始化所需要的插件

HomeAssistant 安装完后,其实只是安装了一个主体程序,实际上还需要安装很多小控件的安装,往往需要 Root权限,所以在终端中输入

sudo hass --open-ui

等待程序自动运行,他会安装一些 HomeAssistant 所需要的一些组件。

我们可以在浏览器中输入http://树莓派IP地址:8123进行访问,去了解 HomeAssistant 是否初始化成功。

null

null

当你的浏览器看到这个页面,表示已经成功初始化插件安装了。这个时候你需要多按几次 Ctrl+C(Mac 电脑是 Control+C)来退出这个程序,一直按到你出到能输出命令的终端页面。如下图所示:

ha-hb-8
ha-hb-8

注意,以 Root 权限运行的 HomeAssistant 在实际操作中发现,并不能按照我们的配置文件进行配置,所以我们还需要以当前用户 pi权限来运行 HomeAssistant。

然后在终端中输入

hass --open-ui

等待片刻,我们用浏览器访问 http://树莓派IP地址:8123,如果你在前面配置文件中有设置密码 HaHb7890,就会显示一个登陆页面,说明你能够正式使用 HomeAssistant 系统了。

null

2.6.3. 记录米家智能家居硬件的相关信息

打开 米家 App(小米智能家居官方硬件),选择智能网关设备,点选右上角的 ···功能符号,进入后点选 关于

null

然后你看到的是下图左边的样子,这时候你需要疯狂输出,要不断的点击空白处,片刻后界面就会变成右边的样子,多了局域网通信协议还有网关信息选项。

null

这时候,分别点选他们,记录你的网关的局域网通信协议密码以及网关的 MAC 地址,请记好噢。

null

2.6.4. 把 HomeAssistant 配置米家智能家居

需要注意的是,HomeAssistant 在 50.0 版本后,已经从官方上集成对小米智能家居,所以我们直接在 HomeAssistant 配置文件上配置即可。

在终端中输入

vi ~/.homeassistant/configuration.yaml

进入编辑器后,按住 shift然后单击键盘 g键,会自动跳转到最后一行(Vim 的 G 键代表跳到最后一行)。然后单击键盘 o键,开始进入编辑模式。

输入以下字段:

xiaomi:  gateways:      - mac: B827EBDA70F9(你的小米网关MAC地址,地址中间如果加`-`会报错)        key: 通讯密码(请全部大写,不然只能看智能家居状态不能控制)

然后,单击键盘esc键,再输入:wq进行保存退出。

null

Ok,配置好,就要软重启一下 HomeAssistant,进入 HomeAssistant 页面,选择左下角的Developer Tools(开发者工具)下的第一个图标,然后在右边的标签页中填写相应的信息:

  • Domain: homeassistant
  • Service: restart

然后点击CALL SERVICE来唤起 HomeAssistant 的重启。

null

原理介绍:HomeAssistant 把很多功能都以组件来看待,然后我们就是调用了核心组件homeassistant里面其中一个方法restart来对 HomeAssistant 进行重启。

这个时候,HomeAssistant 的页面会告诉你已经与服务器断开连接了,事实上你只要静静地等待就好了,等到重新正常连接就 OK 了。但是耐不住寂寞的你肯定想看看进度如何对吧,这个时候,你知道打开刚刚输入了hass --open-ui代码的终端窗口,就可以看到实时情况,如下面的截图就是说,我在安装的过程中,而且安装过程已经超过 10s 了。

null

稍安勿躁,去泡杯茶回来,网页版的 HomeAssistant 已经能够正常连接了,你点击左边栏的States按钮,回到总览页面,你就可以看到,小!米!智!能!家!居!出!现!了!

null

OK,那说明你的小米智能家居已经成功的接入了 HomeAssistant 平台了,恭喜你往高端玩家又进了一步请继续阅读下文哈。

2.7. 配置 HomeBridge-HomeAssistant

在终端中输入

mkdir ~/.homebridgecd ~/.homebridgevi config.json

在打开的文件界面中,单击键盘的i键,进入输入状态

复制以下内容到文件中。

{"bridge": {"name":"Homebridge","username":"B8:27:EB:DA:70:F9","port":51826,"pin":"233-78-123"    },"platforms": [  {"platform": "HomeAssistant","name": "HomeAssistant","host": "http://127.0.0.1:8123","password": "HaHb7890","supported_types": ["binary_sensor", "climate", "cover", "device_tracker", "fan", "group", "input_boolean", "light", "lock", "media_player", "remote", "scene", "sensor", "switch"]  }]}
  • bridge-name : 你在 iPhone 的 HomeKit 上面看到桥接设备网关的名称
  • bridge-username : 树莓派 MAC 地址
  • bridge-port : HomeBridge 使用的端口,默认就好
  • bridge-pin : 在 iPhone 上认证 HomeBridge 网关的密码,这个按照你自己喜好来输入吧
  • platforms-host : 你访问 HomeAssistant 的地址+端口
  • platforms-password : 你在 HomeAssistant 设置的登陆密码

2.8. 配置 HomeBridge

在终端中输入

homebridge -D

运行成功后,会如下图所示:

null

2.9. iOS 的 HomeKit 配置

进入家庭App,添加配件,你就可以看到 HomeBridge 了

null

把里面的配件添加进来,你的 HomeKit 就已经具备了他应该有的功能了。

null

2.10. 设置长久运行的 Homebridge

事实上,你现在如果关闭了 SSH 链接,那么你的 HomeKit 也会处于失效状态,因为你的 Homebridge 随着 SSH 的连接关闭导致被关闭了,如果解决?

使用SCREEN工具,在终端下输入:

sudo apt-get install screen

然后输入

SCREEN -dmS hb homebridge       # 开启一个名字叫做hb的窗口并运行homebridge命令,hb这个名字你随意取SCREEN -dmS ha hass --open-ui   # 开启一个名字叫做ha的窗口并运行'hass --open-ui'命令,hb这个名字你随意取

在 screen 里开启的 Homebridge 不会随着 SSH 关闭而被关闭。那么如何暂时退出这个窗口呢?

先按Ctrl+A然后按完再按一下d就可以跳出来做其他事情了,如何回去?使用screen -x hb即可。

2.11. 设置开机自启动 HomeBridge & HomeAssistant

事实上,树莓派关机后,两个程序会被关闭,可以使用SCREEN工具,并且在rc.local里面添加开机自启动任务。

在终端中输入

sudo vi /etc/rc.local

然后进入了编辑器,单击键盘的i键进入编辑模式。在exit 0这一行前面添加:

su -c "screen -dmS hb homebridge" -s /bin/sh pisu -c "screen -dmS ha hass --open-ui" -s /bin/sh pi

然后单击键盘esc退出编辑模式,然后输入:wq保存文件并推出编辑器。

2.12. 设置远程化运行的 HomeKit

苹果规定,HomeKit 一般情况下,只能在同一个 Wi-Fi 下操作,如果你要远程化和自动化操作。请充(yao)值(mai)信(mai)仰(mai)!

远程控制起步是iPad mini 2或者 Apple TV 3

自动化起步是iPad mini2或者 Apple TV 4

null

[地址戳我]


3. 联动 IFTTT 的骚操作开始

终于来到激动人心的时刻了,要开始真正的骚操作了。

3.1. 给 HomeAssistant 配置 IFTTT 组件

类似小米智能家居的通信密钥,IFTTT 有一个 key,从[Webhook 这个位置]获取得到。

拿到之后,在终端中输入以下命令:

vi ~/.homeassistant/configuration.yaml

进入编辑器后,按住shift然后单击键盘g键,会自动跳转到最后一行(vim 的 G 键代表跳到最后一行)。然后单击键盘o键,开始进入编辑模式,输入以下字段:

ifttt:  key: xxxxx_xxxxxxxxxxxxx

然后,单击键盘esc键,再输入:wq进行保存退出。

然后按照上面的教程,重新 restart 一下 HomeAssistant。

3.2. IFTTT 作为触发条件

做一个简单演示,如果我们用 HomeAssistant 调用了 IFTTT,就给手机版的 IFTTT 发一条推送。

作为 IF 条件,Event Name 就是我们给这个事件声明的名字,我们以HA_TEST来做这个事件的声明名字。

null

然后触发条件,选择Notification,推送的内容,可以设置一些预设的变量函数,包含我们给这个事件声明的名字Event Name,也可以包含我们传过去的 Value 值。

null

创建完 IFTTT 的 Applets,我们回到 HomeAssistant 测试一下。

在 HomeAssistant 的Developer Tools的第一个图标,然后配置如图。Data 一般是以JSON格式来传输的。

null

点击调用后,几秒钟你的手机的 IFTTT 就会给你发来一条推送了。

null

实际上,用 HomeAssistant 还能用内置的automation来调用 IFTTT,相当于内置的 IFTTT,但是支持的控件没 IFTTT 那么丰富。

3.3. IFTTT 作为触发结果

OK,前面是一个小的应用,最主要的还是要介绍 IFTTT 作为触发结果。

3.3.1. HomeAssistant API

HomeAssistant 支持丰富的 API,通俗来说,就是你访问一个网络地址就能控制你家的台灯开与关

OK,地址是http://树莓派地址:8123/api/services?api_password=登陆密码,你可以看到所有 HomeAssistant 能支持的 API,抽取其中一个给大家介绍一下。

其中一个是关于对灯光的 API 介绍。

{    domain: "light",    services: {        turn_on: {            description: "Turn a light on",            fields: {                brightness: {                    description: "Number between 0..255 indicating brightness",                    example: 120                },                color_name: {                    description: "A human readable color name",                    example: "red"                },                entity_id: {                    description: "Name(s) of entities to turn on",                    example: "light.kitchen"                },                rgb_color: {                    description: "Color for the light in RGB-format",                    example: "[255, 100, 100]"                }            }        }    }}

所以你发起一个 POST 请求,我是使用了 Mac 版的 Paw 软件来发起请求,当然你可以使用 Chrome 上面的 PostMan 扩展来做测试。

我请求的地址是/api/services/light/turn_on然后附上 URL 的 PARAMS 是entity_id代表要开的灯的 id,然后附上 API 调用密码api_password.

然后在主体 BODY PARAMS 里面写入灯光的颜色color_name,以及亮度brightness

POST 192.168.1.100:8123/api/services/light/turn_on?entity_id=Gateway_Light_34ce0088d139&api_password=HaHb7890Body Params {"color_name":"red","brightness":"50"}

ha-hb-19
ha-hb-19

调用后,你家里的网关灯就会变红了,而且亮度设定在 50。

3.3.2. 如果明天下雨,我的网关灯要变红

流程图

+ - - - - - - - - - - - - - - - +     + - - - - - - - - - - - - - - - - - -+' IFTTT:                        '     ' HomeAssistant:                     ''                               '     '                                    '' +----------+     +----------+ '     ' +-------------------+     +------+ '' | 外面下雨  | --> | 调用事件  | ' --> ' | HomeAssistant API | --> | 灯亮  | '' +----------+     +----------+ '     ' +-------------------+     +------+ ''                               '     '                                    '+ - - - - - - - - - - - - - - - +     + - - - - - - - - - - - - - - - - - -+

其实关于 HomeAssistant部分,我们在3.4.1已经介绍了。现在需要介绍IFTTT设定以及IFTTT 如何调用HomeAssistant.

3.3.2.1. 域名动态解析

我们现在调用的 API 地址是一个局域网的地址,形如192.168.x.x,这个在广域网(互联网)是无法调用的,简单来说就是,你在公司的网络是调用不了你在家里的这台树莓派的 API 的,更何况 IFTTT。

所以,为了解决这个问题,你可以:

  • 购买固定 IP:向宽带提供商 ISP 购买一个固定 IP,无论你如何重启路由器啊,这个IP就是能指向你家路由器,这个一般费用比较高昂,不推荐。
  • 使用动态解析域名(推荐):现在一般的路由器都内置了动态解析的组件,可以把内网的某一个机器的某一个端口映射到指定的域名端口,或者整个内网机器映射到外网,推荐前者,比较安全。具体自己找方法啦
  • 内网穿透:可以了解一下ngrok
3.3.2.2. IFTTT 设置

IF条件,你可以选择 IFTTT 中的Weather Underground中的Current condition changes to触发器,选择Rain。代表,如果天气预报发现你那里快要下雨了,就触发这个事件。

null

THEN条件,选择IFTTT的webhook:

  • 请求地址URL跟我们的3.4.1中的地址一样,只是树莓派的地址和端口换成动态解析后的域名与端口
  • 请求方法METHOD选择POST,
  • 传输内容类型Content Type选择application/json,
  • 传输内容Body写关于灯光的详细配置,颜色变红亮度50{"color_name":"red","brightness":"50"}
  • 点击Creata action进行保存

null

最后,Review一下,给这个自动化设定一个名字,下面的按钮的意思是每次出发了这个自动化,要不要给你手机的 IFTTT 发一个推送证明它发送了。

null

OK,那么整个流程到这里就算是完成搞掂了~

其实这个流程有 1 点不太安全的是,IFTTT 的 POST 请求明文调用了树莓派的 API 密码,我研究了一下好像 IFTTT 的 Applet 只会针对个人,不对外分享,所以还算是安全。然后动态解析尽量针对端口吧,对外开放太多端口容易受到攻击,同时 API 密码请申请的高强度一下,SSH 使用密钥登陆。

4. 其他

4.1. 已经完全实施了上一章的读者

因为上一章的完全实施,所以你已经安装了 HomeBridge-Mi-aqara,Homebridge 对于插件好像有些蜜汁互斥,所以你需要先卸载他,再按照上面的教程继续走。

在终端中输入

sudo npm uninstall -g homebridge-mi-aqara

5. 致谢


对树莓派感兴趣?欢迎到「明明白白玩派」专栏了解更多树莓派技巧👾


Viewing all articles
Browse latest Browse all 13772

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>