声控“万物”,天猫精灵接入HomeAssistant,打造语音智能家居

本文作者:囧小平

写在前面

首先感谢来自瀚思彼岸的诸位热心网友以及Home Assistant的诸位开发者。是他们的辛勤贡献,让我们普通人也有了自己动手打造智能家居的机会。是他们的热心付出,给我们的生活带来了更多的便利。

另外,本文的阅读和操作都有一定的门槛和难度,实际动手前,建议三思而行。本教程不可能面面俱到,每一个步骤都有许多种解决方案,并可以展开为一个很大的话题。但是篇幅所限,我只能选择性地展开阐述。在本教程的引导下进行实际操作的过程中,也不可避免地会遇到种种问题。建议善于使用搜索引擎自行解决,并在适当的时候选择放弃。。。

Home Assistant相信大家都比较了解。论坛里和Home Assistant相关的原创文章也是多如牛毛。Home Assistant是一款基于Python的智能家居开源系统,支持众多品牌的智能家居设备,可以轻松实现设备的语音控制、自动化等。天猫精灵自然也不用过多介绍。天猫精灵方糖发布时,以较低的价格吸引了大批用户,估计很多值友家中都有一台天猫精灵方糖吧。天猫精灵本身也能够支持许多品牌的智能电器,实现语音控制。

但是其主流常用品牌的支持数量肯定不如Home Assistant。比如在国内智能家居领域处于领先地位的小米,自然不会把自己的蛋糕拱手让给阿里,小米自家的小爱同学第一个不答应。然而,经过Hacker们的不断努力,开源的Home Assistant目前已经能够支持控制大部分小米系的智能家电产品了。如果能够将天猫精灵的语音识别能力和Home Assistant的家电控制能力结合,让天猫精灵能够控制小米系甚至更多其他品牌的智能家电,岂不美滋滋。

有需求,就必有人折腾。不甘受制于人的程序员们帮我们解决了大部分问题,让曾经的不可能变成了可能。下面,我就讲述一下具体如何实现这个目的。

准备工作

这部分内容是比较基础的部分,基本凡是曾经利用Home Assistant构建过智能家居的,都会接触过本章节涉及的内容。这部分内容会为后续实现天猫精灵接入Home Assistant打下基础。由于是属于比较基础的部分,网络上对此的相关讨论和教程都比较丰富。所以每个步骤可能不会做太全面和深入的展开。

Home Assistant搭建

Home Assistant搭建是基础中的的基础,搭建的方式也是花样万千,相关的教程更是多不胜数。但是无论是谁写的教程,都肯定不如官方教程。所以有英文基础的都建议去读官方教程:点我直达

我这里大概阐述一下Home Assistant常见的安装载体和安装方式。

1.安装载体

Home Assistant要运行于某种载体之上,所谓载体就是一台具有Python环境的主机。它可以是一台低功耗服务器,也可以是一台闲置笔记本;可以是一台群晖之类的NAS,也可以是一块树莓派等Arm开发板;甚至还可以是你的闲置的,并且最好是已经root的安卓手机。只要这种载体具备了Home Assistant运行所需要的依赖就可以。为了让Home Assistant能够长期稳定低为你服务,这个载体最好是低功耗的,能够连接网络,并有着稳定的网络环境,而对性能方面的要求并不高。

2.安装方式

根据运行载体的不同,Home Assistant也有着多种不同的安装方式。

如果你的载体是一块树莓派开发板,我推荐使用直接烧写Hass.io镜像的方式,这也是官方推荐的安装载体和安装方式。

如果你的载体是一台服务器,则可以在安装完毕Python运行环境后,用几条简单的命令安装。选择用这种方式安装的时候,别忘记修改一下Python pip软件源为国内镜像地址,这样可以加快安装速度。具体的修改方式是:创建或修改配置文件(linux的文件在~/.pip/pip.conf,windows在%HOMEPATH%pippip.ini),修改内容为:

[global] index-url =

如果你的载体是一台NAS服务器,那么简单便捷的docker安装方式肯定是你的首选。但是有时候我觉得docker这种安装方式有点不便于调试,也可能是我不会在docker下进行调试。

如果你的载体是一台Android手机,那么最好是root过的。我本人并没有实践过在Android手机上安装Home Assistant,感兴趣的可以参考这个教程:点我直达。那么,祝你好运。

当选好了合适的载体,安装并成功运行Home Assistant,在浏览器中输入载体的IP加默认端口号8123,就能通过网页来浏览和管理Home Assistant。走到这一步,就为后面的折腾打下了基础中的基础。

内网穿透

为什么需要内网穿透呢?我们目前所搭建的Home Assistant服务,访问的地址是一个内网IP。这就意味着这个服务暂时只能在局域网中访问。而如果想要实现天猫精灵接入Home Assistant的目的,必须让这个服务在外网也可以访问到。为了达到这个目的,可能又要经过一番折腾了。

如果你家中的宽带网络具有公网IP,那么恭喜你,实现内网穿透是一件很容易的事情。问题是,现在公网IP属于稀缺资源,大部分网络运营商并不会轻易给你一个公网IP,所以要实现内网穿透就要另辟蹊径了。

一般常用的方式有ngrok和frp。你可以选择自己购买云服务器或者VPS搭建这些服务为己所用。也可以选择一些商家搭建好的免费或者收费的服务。无论是ngrok还是frp,其服务的搭建和客户端的使用都略微复杂,展开的话都是一个比较大的话题。鉴于折腾的人比较多,其相关资源也很丰富,我就不再赘述了。

以上两种常见的内网穿透方法我都用过,由于种种原因,用起来并不顺手。后来我换用了一种更简单的方式---花生棒。首先声明这不是广告,并以京东订单截图证明我的清白。

另一方面,Oray随便在站内软文比较多,但是其确实有不少产品以简单的方式解决了我们的一些网络需求。比如向日葵远程控制和花生棒内网穿透,都成了我日常生活中不可缺少的软硬件产品。

花生棒实现内网穿透真的十分简单。首先,把花生棒通过网线,连接到需要进行内网穿透的那个设备所处的路由器上。然后,登录注册并绑定好花生棒硬件的Oray账号,进入花生壳的内网穿透管理页面。在映射列表里,增加一条映射。

在映射编辑界面,选择一个免费的花生壳二级域名。外网端口号在免费使用的情况下只能动态生成,无法指定。接着再填入内网主机的IP和端口号即可。

然后根据此设置会生成一个外网访问地址,以后就可以通过这个地址访问内网所搭建的Http服务。

一个花生棒的免费配额如下:端口映射2条,带宽速度,1Mbps/映射,花生壳流量1G/月(花生棒首年2G/月)。

两条映射被我分别用来穿透路由器管理页面和Home Assistant。暂时没有别的穿透需求,基本够用了。网速限制和流量限制对于我的应用场景也不会造成太大影响。花生棒虽然有种种限制和不足,但是好在方便易用,适合不喜欢折腾的,或者采用其他方案折腾失败的用户。

域名解析

到目前为止,你应该有一个外网可以访问的Home Assistant 服务了。如果你是公网IP,那么你的访问地址很可能是IP加端口号;如果是通过其他方式进行内网穿透,那么你得到的访问地址可能是一个内网穿透服务商的二级域名加端口号。无论哪种方式,都不如使用一个自己的域名来的方便和亲切。因此我们最好注册一个自己的域名。

域名服务提供商有很多,其注册方式也大同小异。价格上也基本没有太大区别。我是在万网注册的域名,万网目前已经纳入阿里云旗下,成为其子产品之一。传统的大家比较熟悉的com、net的域名价格偏高。另外一些比如xyz、site、fun、online这些易记住的域名虽然首年价格很低,但是续费价格略高。通过筛选,我建议使用top域名,名字既响亮,价格也很合理,三年只需要67元,续费价格则为78元。域名购买完毕后,就进入域名控制台,添加一条解析。

如果你是公网IP地址,那么需要添加一条A解析。如下图所示。

记录类型选择:A,主机记录填写的是你想要访问的地址,记录值就是你的公网IP。添加完毕后,就可以通过你的域名地址加原来的端口号访问Home Assistant。

如果你已经有一个可以访问Home Assistant 的二级域名,那么需要添加一条CNAME解析。如下图所示。

记录类型选择CNAME,主机记录和上面一样,你也可以有不同的选择,不同值所对应的含义可以通过点击右边的那个问号查看。记录值填写那个可以访问Home Assistant 的二级域名。设置并添加完毕后,效果同上,不再赘述。

至此,你应该有一个属于你自己的个性化的访问Home Assistant的域名了。

猫精接入史

在继续进行下去之前,我觉得有必要讲述一下天猫精灵接入Hone Assistant的过去和现状。这样我们就能了解为了让天猫精灵接入Home Assistant,Hassbian的诸位热心网友做了多少付出和贡献。

最早的时候,天猫精灵接入Home Assistant是通过在天猫精灵开放平台自定义技能实现的。这种方法的灵活性和扩展性都很好。但是这种方式需要使用者自己搭建PHP代理网关,并实现OAuth2认证。如果你有网站架设经验,那么可能这对你来说不是什么有难度的事情。但是对于虽身为程序员,但从未涉足Web开发的我来说,依然经历了从信心满满dao到黯然放弃的过程。

接着第二种接入方法出现了。由于天猫精灵官方支持了飞利浦Hue灯,因此可以通过HaBridge将设备模拟成Hue,从而实现对设备的控制。这种方法可以免去搭建PHP 代理网关和实现OAuth2认证的步骤,大大降低了实现的难度。然而这种方法本质上是把设备模拟成灯,因此无法实现对设备更为丰富的控制命令。

然后,一种更为便捷的接入方式出现了。Hassbian热心网友将第一种接入实现方式的代码贡献给论坛,并由论坛官方架设了一台服务器,以供广大网友使用。使用者只需要填入自己的外网访问地址和访问密码,就能将天猫精灵方便地接入Home Assistant。这就相当于论坛把颇有难度的几个步骤代替大家完成了,并贡献服务器出来为大家所用。我曾长期使用这种方式,将天猫精灵接入Home Assistant。如果不想继续折腾,那么这也是我推荐的方式。在我撰写本文的过程中,站内已经有值友对这种方法整理成文,感兴趣的可以参考。

家庭妇男的智能家居折腾之路—与君子动口不动手只差四步,天猫精灵控制HA设备

小编注:想获得更多专属福利吗?金币加成、尊享众测、专属勋章、达人福利任务你想要吗?如果想要,赶紧来申请认证站内生活家!猛击此链接很多值友在前几篇家庭妇男的智能家居折腾之路系列文章下留言,表达了折腾智能家居完全没有必要的观点。的确,现阶段的智能家居确实不够智能,甚至有些智障。举个例子,只要你吩咐一声,

NetYJ

|

赞2

评论17

收藏57

查看详情

然而通过利用Hassbian的服务器实现天猫精灵接入Home Assistant依然存在些许不足。首先,论坛所搭设的服务器采用的Home Assistant安全验证方式是legacy_api_password。目前,最新版的Home Assistant将逐步移除这种不安全的验证方式,转而采用Long-Lived Access Tokens的方式。虽然代码原作者已经增加了两种验证方式的支持,但是我一段时间前验证的时候,Hassbian论坛所提供的服务并没有合入这部分更新,现在不知道是否支持了。其次,利用这种方式,相当于将天猫精灵的指令请求先转发到Hassbian的服务器,再发送给天猫精灵的服务器。据我所知,Hassbian的服务器是架设在海外的。如果家里的网络跟Hassbian的服务器连接状况不好的话,就会影响天猫精灵对指令响应的实时性和稳定性。

既然问题出现了,那么就必然会出现解决问题的人。首先膜拜一下这位大神:点我前去膜拜。这位大神是Home Assistant官方OAuth2认证系统缔造者。曾经挡在许多人面前的OAuth2认证的搭建,终于能够被新版本的Home Assistant原生支持了。既然我们已经有Home Assistant帮我们做好了OAuth2认证,所以只需要自己再实现一个网关就好了。

这一段内容可能对于很多没有相关基础的人来说有些难以理解。没关系,我们继续往下走。

SSL证书申请

在上上一个章节里面,我们已经有了一个可以外网访问Home Assistant的域名,这个域名一般情况下都是HTTP协议的。但是如果想让天猫精灵能够顺利接入Home Assistant,我们需要的是一个加密的HTTPS的地址。为了实现这个目的,我们需要申请和部署SSL证书。

SSL证书的申请,很多人可能都会选择Lets Encrypt。Lets Encrypt是一个证书授权机构,我们可以利用它的获取证书的客户端Certbot,免费快速地获取Lets Encrypt证书。具体方法本文不打算展开,网上也有很多教程,可以搜索并参考。

我并没有使用Lets Encrypt的证书。由于我的域名是在阿里云万网上申请注册的,因此我就直接阿里云上申请证书了。具体的步骤如下。

1.进入阿里云的管理控制台,并在"产品与服务"中"安全(云盾)"中找到"SSL证书(应用安全)"。不得不说,阿里云产品太多了,找都不好找。

2.点击右上角的购买证书进入证书购买页面。

3.一般的商用的SSL证书价格都很昂贵。当然,我们只要免费的。证书品牌选择"Symantec",证书类型先点一下"增强型OV SSL",然后选择"免费型DV SSL",然后价格就变成0.00元了。点击立即购买。

4.购买完毕后回到控制台,你购买的证书就出现在证书列表里,想使用的话还需要进一步补全信息。

5.证书绑定域名就是访问Home Assistant的域名。因为我是在阿里云万网申请的域名,所以域名验证方式直接选择"自动DNS验证"。只要域名使用阿里云DNS,都可以通过这种方式验证。当前操作后,系统自动调用云解析API添加一条记录,完成域名授权验证,十分便捷。CSR生成方式选择"系统生成"即可。然后点击下一步,进入验证界面。

6.在这个界面点击验证,不出什么意外都会成功。这时,在你的域名解析设置页面会多一条TXT记录,就是上面所说的用来完成域名授权验证的。

7.证书申请提交后,等待审核完成。审核完毕,就可以在"已签发"中找到通过审核的证书。点击下载,选择其他类型将证书下载到本地,准备做进一步部署。

注意,证书是存在有效期的,用上面的方法申请到的证书有效期是1年。到期需要重新申请证书并在服务器上更换证书。

SSL证书配置

将上一步下载的证书解压,会得到一个key文件和一个per文件。使用文本编辑器打开这两个文件,并按照下面的格式合并为一个文件,并保存为your.cert

-----BEGIN RSA PRIVATE KEY-----

XXXX

-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE-----

XXXX

-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----

XXXX

-----END CERTIFICATE-----

把key文件和cert文件和传到你部署Home Assistant的服务器上。在Home Assistant的配置文件configuration.yaml中添加如下内容,根据你的实际情况做修改:

http:

ssl_certificate: /path/to/your/cert_file

ssl_certificate: /path/to/your/key_file

完成上述设置后,重启你的Home Assistant,你就可以通过HTTPS访问之前的域名了。

接入实战

从这一部分开始,进入了本文最重要的部分。原贴请参考这里:点我直达。希望你前面的准备工作已经做好了,并利用Home Assistant接入了一些智能家居,且配置正确、使用正常。

网关配置

完成HTTPS域名访问后,就给我们进行接下来的配置扫清了一切障碍了。首先,我们要先实现网关,从此地址下载代码到Home Assistant配置目录的custom_components子目录下。感谢原作者。

然后在configuration.yaml里面加入下面的内容:

aligenie:

expire_hours: 8760

expire_hours意思是多少个小时后需要重新进行授权。expire_hours的默认值是8760小时,即365天,和SSL证书过期时间一致。注意,即使有默认值,此项配置也不能省略,这样才能让插件正常工作。同时,为了方便后续的调试工作,请将log级别调整为info,在configuration.yaml加入:

logger:

default: info

这个自定义的插件就是我们要实现的网关。现在把它以插件的形式集成到Home Assistant中,省去了额外搭建网关服务的步骤。

额外配置

此时你可能已经配置好了你的Home Assistant,并添加了一些智能家居设备。但是,为了让天猫精灵识别这些设备,还需要进行一些额外的设置。原文请参考这里:点我直达。

我以我的松下吸顶灯为例,讲解一下如何进行额外的配置。我这个吸顶灯可以通过红外遥控器控制开关,我利用博联黑豆对它进行控制。其实天猫精灵是原生支持博联黑豆的,但是博联黑豆的支持设备列表里面没有我这台松下吸顶灯。所以只能依靠Home Assistant曲线救国了。在Home Assistant中,我的这台吸顶灯的配置如下,也就是很基础的博联设备的配置方法。

switch:

- platform: broadlink

host: 192.168.50.233

mac: 44:44:44:44:44:44

timeout: 15

switches:

panasonic_light:

command_on: xxxxxxxxxxx

command_off: xxxxxxxxxxx

为了让天猫精灵能够识别这个设备,还需要填写以下三个重要字段,且每个字段都有固定的名称列表,不能随意修改:

1. hagenie_zone:此字段指代你设备所处的区域,如客厅、餐厅等,可选值参考这里:点我直达。

2. hagenie_deviceName:此字段指代你的设备名称,可选值参考这里:点我直达。

3. hagenie_deviceType:此字段指代你的设备类型,可选值参考这里:点我直达。

当跟天猫精灵进行语音交互式,hagenie_zone和hagenie_deviceName是比较重要的字段,再次强调,务必从可选值列表中选取。比如我的客厅的松下吸顶灯的额外配置为:

switch.panasonic_light:

friendly_name: 客厅灯

hagenie_deviceName: 灯

hagenie_deviceType: light

将此段配置放置到customize.yaml中。我如果想通过天猫精灵控制这个吸顶灯,就可以说:天猫精灵,打开客厅吸顶灯。如果吸顶灯只有一个,也可以省去说出"客厅"两个字。

我再以我的小米空气净化器2示范一下如何配置。首先,小米空气净化器在Home Assistant中的配置如下。

fan:

- platform: xiaomi_miio

name: Xiaomi Air Purifier 2

host: 192.168.50.233

token: 00

model: zhimi.airpurifier.m1

然后为了适配天猫精灵网关的额外配置如下。

fan.xiaomi_air_purifier_2:

friendly_name: 客厅空气净化器

hagenie_deviceName: 空气净化器

hagenie_deviceType: airpurifier

最好将配置放到customize.yaml下,这样比较规范。完成了这一步后,我们离成功越来越近了。

AliGenie开发者平台配置

Home Assistant这边配置完毕后,我们还需要在AliGenie开发者平台进行进一步配置。AliGenie开发者平台就是阿里天猫精灵的开发者平台,其地址在此:点我直达。使用你登录手机端天猫精灵App的账号登录AliGenie开发者平台,并进入控制台。

点击"添加新技能"进入技能创建页面。技能信息里面的东西可以自行根据情况填写,没有什么特殊要求。填写完毕后点击下一步。

服务设置里面则是重点,首先要进行OAuth2的设置。最新版本的Home Assistant已经自带OAuth2,并且我们实现了网址的HTTPS访问,因此在OAuth2设置中填入如下内容,根据你的实际情况做修改,其中Client Secret可以随意填写:

账户授权连接

Client ID

Client Secret:itdoesnotmatter

Access Token URL

接着,在设备管理设置中填入如下内容,根据你的实际情况做修改:

开发者网关地址

正是因为开发者平台要求填写OAuth2和网关地址的时候,必须是HTTPS的网址,所以才有了申请并部署SSL,让Home Assistant支持HTTPS访问这一步骤。此页面余下的内容可以不用理会。

模拟真机测试

完成上述设置后点击下一步进入"测试验证"页面,开启真机测试。

这时你可以点击“在新窗口打开”,网页会跳出如下弹出窗口。

点击“账户配置”,如果你之前的网关搭建并运行都没有错误的话,会进入授权页面,此时需要输入你Home Assistant的用户名和密码。

完成账户授权验证后,如果一切正常,贵显示等待三秒返回设备列表。

等待三秒钟,不出意外的话,在设备列表中,除了你原来在天猫精灵中添加的智能家居设备,你应该也可以看到你在Home Assistant中配置的智能家居设备了。比如我在Home Assistant中添加的设备如下。

那么返回的设备列表应该是这样的,前提是你为这些设备进行了额外配置,请参照上面的相关章节。

同时,打开你手机端的天猫精灵App,在智能家居列表里刷新,正常情况下,Home Assistant中的设备也会出现在这里了。这时,去尝试一下语音控制你的设备吧。

至此,恭喜你,基本大功告成。当然你的过程可能并没有那么顺利。如果遇到问题,请仔细分析相关日志,认真检查每一步的配置。另外需要注意的是,完成测试验证后,不需要提交审核,保持现状即可。

祝君好运。

简化归纳

上面写了一大段又一大段文字,初次接触的朋友可能一下子难以接受,我在本小节将上面的各个步骤进行简单的归纳,以方便你的理解。

天猫精灵接入Home Assistant的基本步骤如下:

1.在你顺手的平台上搭建Home Assistant服务。2.使用你觉得简单可行的方式实现内网穿透。3.实现Home Assistant使用自己申请的域名访问。3.申请SSL证书。4.配置SSL证书,使Home Assistant支持HTTPS访问。5.完成天猫精灵网关的搭建和配置。6.对已经加入到Home Assistant中的智能家居设备进行额外配置以支持天猫精灵。7.在AliGenie开发者平台完成OAuth2和网关地址配置。8.开启模拟真机测试验证配置是否正确并返回设备列表。9.天猫精灵App端检查设备列表是否正常,并实践一下语音控制是否正常。

通过上面的归纳总结,希望你能对整体的过程有一个大概的认识,具体步骤还要去每个小章节中仔细查阅。

写在最后

本文介绍的是天猫精灵的Home Assistant接入方式。如果你有小度智能音箱,也有类似的接入方法,具体可以在hassbian论坛里面搜索相关教程。对于完美没有相关基础的人来说,实践这些步骤是有些困难的。而那些之前折腾过Home Assistant的朋友,估计弄起来会比较容易一些。但是,也依然免不了遇到这样或者那样的问题。如果遇到问题,我建议首先仔细参阅各种教程,检查自己的配置。然后利用系统日志帮你判断分析问题。

虽然折腾的过程有些枯燥,也会经常遇到各种困难。但是通过自己的努力,排除万难,最终实现天猫精灵控制各种家用电器那一刻,感觉还是很值得的。当然也不排除由于某些原因导致反复尝试,不断纠错仍然无法成功。当你遇到这种情况,没关系,享受折腾的过程并坦然放弃就行。每次的失败都会帮助你积累经验,等再有机会的时候,从头再来就好了。人生不就是各种折腾嘛。

最后,再次感谢那些为达成天猫精灵接入Home Assistant这个目的而勤劳付出的各位程序员。