智能家居
相信有不少人和我一样,用苹果的手机搭配米家的智能家居,穷但快乐着。
但每次操控设备时还得先想想它是支持米家的还是 HomeKit 的,着实有些不爽。
HomeAssistant 就是一款可以模拟米家设备和 HomeKit 设备的系统,这样就可以将我们的指令通过它中转给具体的设备,Siri 和小爱,想叫谁就叫谁。同时在家居自动化方面,HomeAssistant 提供的场景和触发条件也更为完善,非常容易打造出契合自身需求的自动化流程。
除开这些优点,它的限制是家里得有一个长时间不关机的设备,比如群晖或树莓派。所以如果你手中恰好有这两种设备,就可以顺便装下这个系统,否则成本有点高,感觉与收益不匹配。
那么话不多说开始吧,下文将以HA简称 HomeAssistant。
虽说我手里也有树莓派,但毕竟吃灰许久了,就还是用群晖来安装吧。对于群晖,网上大多数建议都是直接在 docker 上安装,如果想要安装HomeAssistant Supervisor
,得在虚拟机里安装。我考量了一下成本和收益,Supervisor 能做的,无非是可以更新 HA,目前的 HA 已经很完善了,更新得到的基本是安全性更新或者一些小修小补,所以目前打算只安装 HA 和 HACS 插件商店。
安装 HA
首先在群晖的 Docker 套件中搜索并下载homeassistant
镜像,选择列表中第一个 2k 星星的就可以了。
下载完成后,在映像列表中找到刚刚下载的 homeassistant 并启动,此时会弹框让我们对其进行一些配置。
修改容器名称后,点击高级设置,勾选启用自动重新启动。
然后切换到存储空间选项卡,将 HA 的配置文件保存到本机。
切换到网络选项卡,勾选使用与 Docker Host 相同的网络。
接着切换到环境选项卡,设置时区为上海后,点击应用。
HA 配置
在等待一段时候容器启动完成后,通过群晖的 IP 地址+端口号 8123 即可在浏览器打开 HA 的启动页,我这里的访问地址是http://192.168.124.20:8123/。
首先输入用户名和密码,然后需要设置时区,直接自动检测就可以了,然后一直下一步来到主页面。
安装 HACS
打开HACS 发布页,下载最新的压缩包并解压。
打开群晖的文件管理器,在/docker/homeassistant
下新建www
和custom_components
两个目录,并将刚刚解压出来的hacs
目录复制到/docker/homeassistant/custom_components/
目录下面。
等待文件传输完成,在 Docker 套件中重启 HA。
再次登录 HA,点击侧边栏配置,选择设备与服务,新页面的第一个选项卡就是集成。
点击右下角的添加集成按钮,搜索HACS
,就能找到刚刚解压的插件了。
点击之后有四个方框让你勾选,相当于使用须知,全部勾选后提交即可。然后在新的页面有一串代码,先复制一下。
然后再点击那个蓝色链接,将授权码粘贴进去(需要先注册并登录 Github)。
在成功获得 Github 授权后,还需要配置一下 HACS 的所在区域,然后点击完成,就可以在侧边栏看到HACS
了。
添加米家设备
在 HACS 的集成选项卡中,点击右下角浏览并下载存储库,搜索miot
选择第一个下载。
我这里下载时会报一个红色的警报,然后就闪退了,应该是网络问题,我就懒得搞了,就把 HACS 当作一个目录来用吧。
在详情页的左下角有个按钮打开存储库是可以直接打开集成的 github 页面的,里面一般都会有安装说明,按照说明手动安装就可以了。
- 下载插件 zip 压缩包(该链接始终为最新版本)。
- 依次打开压缩包中的
xiaomi_miot_raw-master/custom_components
文件夹。 - 将该文件夹中的
xiaomi_miot_raw
文件夹拷贝至自己 HA 安装目录的custom_components
文件夹。 - 重新启动 Home Assistant。
重启完成后,在系统配置的集成列表中搜索并添加MIOT
,建议通过小米账号登录,能直接将已有设备添加到 HA 中。
控制传统空调
由于自己有支持红外的小爱音箱,因此可以尝试将其加入 HA 控制的一环,后面甚至可以搭配个温度传感器来自动开关空调。
首先在米家 APP 找到小爱音箱,根据空调品牌添加红外遥控。添加成功后在设备的未分配房间中可以看到刚刚添加的空调,选中并将其移动到卧室。
然后重启 HA,在集成中找到 MIOT,选择自己的账号,点击选项按钮,批量添加设备,这时在列表的最后就可以看到通过红外控制的空调设备了。
添加 HomeKit
HomeKit 集成在 HA 中是默认包含的,如果家里已经有 HomeKit 设备了,那么在系统配置的集成页面应该可以看到推荐的 HomeKit 的。
按照引导配置完成后,手机打开家庭APP,扫描通知里的二维码添加桥接器就可以将刚刚添加的米家设备全部用 HomeKit 来管理了。
可以看到,目前自己的智能设备还是比较少的,啥时候有钱能买房了自己得好好规划一下怎么让自己懒到极致。
使用 Siri 开关红外设备
上一节我们通过小爱音箱虚拟了一个红外控制的空调,使得 HA 可以控制传统空调的开关了。
但在家庭 App 中却始终找不到空调设备,但我又挺想用 Siri 控制空调开关的,要怎么做呢?
首先下载安装 iOS 版 Home Assistant 并登录,然后打开快捷指令,新建一个快捷指令名为打开空调。
上图第一步是创建一个字典,描述想要控制的设备 id。设备 id 可以先在开发者工具的 UI 模式下选择好对应的设备,然后进入 YAML 模式即可看到设备对应的 ID。
第二步就是通过 HomeAssistant APP 调用服务,climate.turn_on
表示打开空调,climate.turn_off
表示关闭空调。然后选择服务器后,把刚刚创建的字典填入输入框内,这个快捷指令就制作完成了,关闭空调也是同理。
如果 HomeAssistant APP 是连接的局域网,那么这个快捷指令就只会在局域网中生效,不过一般而言也足够用了。
家庭自动化设计
虽然说现在这些设备都能根据语音或手机远程控制了,但毕竟还是得人来控制,自动化也仅仅是按照使用者的习惯设置的固定的流程,远远达不到无感的智能家居的阶段。
但能设计出适合自己的自动化方案,也是可以让自己懒得更滋润一些的。
自动开关窗帘
在此之前,我给窗帘设置的自动化流程是工作日指定时间打开和关闭窗帘。由于四季日出和日落的时间变化较大,我经常会发现外面天还没黑呢窗帘就自动关掉的情况,非常不人性化。
这里有个悖论,米家支持区分节假日和工作日,HomeKit 支持区分日出日落,但却不能同时满足。
在 HA 侧边栏点击自己头像,在页面最下方的长期访问令牌中创建令牌,输入令牌名HA-fileEditor
后,复制得到的令牌。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMDhiZGYyYTYyM2M0MDEyODhiMjRkYWIyMGQ2ZTVmMyIsImlhdCI6MTY1NDMyODE5MiwiZXhwIjoxOTY5Njg4MTkyfQ.J3FBB7SuVLrLaQ2D50zB3dvEA8mPxAr30kXZVGm5QjQ
打开hass-configurator 发布页面下载最新版本并解压,编辑hass-configurator-0.4.1/hass-configurator/configuration.yaml
,将刚才的令牌粘贴到此处。
上图有些问题,令牌应该用英文双引号括起来。
然后将hass-configurator-0.4.1/hass-configurator/
目录复制到群晖的/docker/homeassistant/custom_components/
目录下面。
在群晖的文件管理器中下载/docker/homeassistant/configuration.yaml
并添加如下内容后重新上传到原目录,url 处之需要更改 IP 地址为群晖的 IP 地址即可,端口号保持不变。
panel_iframe:
configurator:
title: Configurator
icon: mdi:wrench
url: http://192.168.124.20:3218
重启系统后,侧边栏就出现了Configurator
,但此时还不能使用,因为它是一个后台服务,需要用 SSH 连接群晖,将其启动。
进入/volume1/docker/homeassistant/custom_components/hass_configurator
目录后,输入./configurator.py
启动服务,此时就可以在 HA 中进入文件编辑页面了。
如果服务无法启动,尝试chmod +x configurator.py
来为脚本添加运行权限。
但这只是临时运行的服务,会话断开后就停止了,所以我们需要将其加入开机自启动服务中。
输入命令vim /etc/systemd/system/ha-configurator.service
创建一个新的服务,粘贴以下内容:
[Unit]
Description=Home Assistant Configurator
After=network-online.target
[Service]
Type=simple
User=%i
WorkingDirectory=/volume1/docker/homeassistant
ExecStart=/volume1/docker/homeassistant/custom_components/hass_configurator/configurator.py
[Install]
WantedBy=multi-user.target
重新加载守护程序:
sudo systemctl --system daemon-reload
开启开机自启:
sudo systemctl enable ha-configurator
立即启动服务:
sudo systemctl start ha-configurator
以上是准备工作,在 HA 中,日出日落是可以直接判断的,而工作日节假日则需要配置所在国家,具体可以参考官方说明,但官方的这种做法我没太明白是本地判断的还是联网判断的,所以还是从网上抄了一个方法。
打开configuation.yaml
,添加如下配置:
rest:
- scan_interval: 3600
resource_template: https://natescarlet.coding.net/p/github/d/holiday-cn/git/raw/master/{{ now().strftime('%Y') }}.json
sensor:
- name: cn_workdays
value_template: |-
{%- set today = now().strftime('%Y-%m-%d') %}
{%- set lst = (value_json | default({},true)).days | default([]) %}
{%- set ns = namespace(isOffDay=None) %}
{%- for d in lst %}
{%- if today == (d.date | default(None)) %}
{%- set ns.isOffDay = (d.isOffDay | default(None)) %}
{%- endif %}
{%- endfor %}
{%- set isOffDay = ns.isOffDay %}
{%- if not isOffDay in [True,False] %}
{%- if now().isoweekday() in [6,7] %}
{%- set isOffDay = True %}
{%- else %}
{%- set isOffDay = False %}
{%- endif %}
{%- endif %}
{%- if isOffDay == True %}
节假日
{%- elif isOffDay == False %}
工作日
{%- else %}
unknown
{%- endif %}
json_attributes:
- year
- papers
重启 HA 后,就能在侧边栏历史中看到cn_workdays
实体了,目前正是节假日嘿嘿。
接下来就是重头戏创建自动化了。
依次点击配置 - 场景自动化 - 创建自动化 - 从空的自动化开始,名称改为自动开窗帘。
触发条件选择日出,环境条件的状态输入工作日。
这里比较关键的是动作的配置,如果动作类型选择设备,窗帘项目下就只有一个调整位置的选项,显然不符合需求。
因此这里选的是调用打开窗帘的服务,然后在调用设备中再选择窗帘即可。如果设备列表找不到窗帘的话,可以尝试在实体注册表将窗帘显示为窗帘。
至此,这个自动化就配置完毕了,保存后点击执行可以查看效果。关于自动关窗帘,其实也大差不差,就是在环境条件里把节假日去掉,换成了窗帘处于打开状态。