V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
sneezry
V2EX  ›  分享创造

使用 BroadLink 和 Amazon Echo 控制电灯

  •  
  •   sneezry ·
    Sneezry · 2016-11-02 02:22:46 +08:00 · 11450 次点击
    这是一个创建于 2950 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用语音控制电器是一件非常让人兴奋的事情,这给人一个和房子互动的新方式。但如果你的房子在装修前没有考虑配置智能家居,又觉得更换全部智能灯泡的成本不太容易接受,而恰好你喜欢自己动手折腾一些东西,那么这篇文章会非常适合你。

    我选择的方案是 BroadLink 控制开关和 Amazon Echo 语音控制设备,按照我自己家的情况是更换了 5 个墙壁开关、购买了一个射频控制主机以及两个 Amazon Echo ,总成本差不多 1500 元,和一个飞利浦 Hue Go 智能灯差不多。

    在开始之前你需要做一些准备:

    1. 一个美区的 AWS 账号
    2. 一部 Android 手机
    如果你满足上面两个条件,就可以开始了。

    首先根据你家里的情况选购 BroadLink 的 TC2 射频开关,之所以选择 BroadLink 是因为它的价格比较便宜,同时由于协议简单,比较容易进行二次开发。当然如果你找到了更适合自己的设备也是可以的,这里只是需要一个将电灯开关转化为 Wifi 信号的设备。

    需要注意的是, BroadLink TC2 射频开关是单控单火线开关,如果你对单控单火线不了解,建议先补习一下相关的知识,或者直接询问专业的人士。如果不满足单控,可以将家里的双控电路改为单控电路,这个改起来并不麻烦,我就是自己改的,但如果你对电路不了解请务必请专业人士帮忙。如果不满足单火线,可以购买火线零线共存的射频开关,但需要注意购买 BroadLink 控制主机支持的型号,具体可以询问商家。另外有部分无线控制多位开关只有两根控制线,这样的开关是需要对控制线进行特殊铺设的,如果你家里已经布好了电源线,那么就需要搞清楚是否可以使用这种开关。

    购买 BroadLink TC2 的同时还需要购买 BroadLink Pro 控制主机, TC2 是把射频信号转换为电信号的设备,而 Pro 主机是把 Wifi 信号转换为射频信号的设备。

    射频开关安装完毕后,就可以下载 BroadLink 官方的手机 App 对开关进行设置。如果一切顺利,你就可以使用手机控制电灯了。

    下一步需要对 BroadLink 进行二次开发。在 Android 手机中安装一款网络数据包查看工具,使用 BroadLink App 对开关发送指令后,查看数据包数据。正常情况下会看到如下格式的数据:

    
    5aa5 aa55 5aa5 aa55 0000 0000 0000 0000
    0000 0000 0000 0000 0000 0000 0000 0000
    0000 0000 2a27 6a00 7d20 2f6c 8d0d 43b4
    0100 0000 0ec5 0000 2b20 a8bf f18e e1d5
    ...
    

    已经有人这个数据的格式进行过详细的分析,在此我就不分析了。但由于 BroadLink 协议的特殊性,这条指令重放是有效的,所以完全可以单纯将这条数据和相应的操作记录下来,随时发生到 BroadLink 的控制主机。所以不出意外,你已经拿到了 Wifi 控制电灯的接口。

    下面开始设置 Amazon Echo 。

    Amazon Echo 已经有了很多 Smart Home 的应用(官方叫 Skill ),但遗憾的是并没有我们可以使用的,所以需要自行开发适合我们的 Smart Home Skill 。

    Amazon Echo Smart Home Skill 只支持 Lambda Function ,这也是需要 AWS 账号的原因。

    开发 Smart Home Skill 可以参考Five Steps Before Developing a Smart Home Skill,文章里面讲解得非常详细,并且配有截图。

    在创建完 Lambda 后, AWS 会自动生成一个 Smart Home 的 demo 代码,需要注意这个代码跑不通,首先由于没有声明 namespace ,event.header.namespace需要使用完整的名称,所以要把代码里的DiscoveryControl什么的改为Alexa.ConnectedHome.Discovery。其次, demo 里的event.header.name SwitchOnOffRequest,这个根据关闭和开启的指令不同,应该改为 TurnOffRequest TurnOffRequest

    OK ,不出意外,你现在已经可以用语音控制你家的电灯了,但我猜会有比较高的延迟,这是因为 Amazon 在用北美或欧洲的服务器呼叫你自己家里的机器,将信息传给 BroadLink 控制主机。我也遇到了这个问题,整个流程大部分时候超时,最后没办法把 Lambda 的超时时间改为了 30 秒。这种体验显然是不可接受的,所以需要最后再做一步操作进行优化。

    我在 Azure 香港区架设了一个跳板,同时开启了 https 和 wss ,我家里的机器通过 wss 与跳板机保存长连接, Amazon 服务器将指令通过 https 的方式发给跳板机,跳板机再通过 wss 发给我家里的机器,这样大部分情况下延迟就可以做到 3 秒以内了。

    最后我来梳理一下整个流程信息的传递过程,帮大家进一步理解。

    1. Amazon Echo 将声音发送到 Amazon 云端解析
    2. Amazon 云端将解析结果发给美国东部的 AWS Lambda 的 Smart Home Skill
    3. AWS Lambda 将结果通过 https 的方式发给香港的 Azure 跳板机
    4. Azure 跳板机将结果通过 wss 发送到我家里的机器
    5. 我家里的机器通过 Wifi 将结果发给 BroadLink 控制主机
    6. BroadLink 控制主机通过射频将结果发给 TC2 开关
    7. TC2 开关对电灯进行开关操作

    最后的最后再扩展一下思路,可以组合多个指令进行场景设置,比如我让 Echo 打开投影仪的时候,客厅的电灯会自动熄灭,而关闭投影仪的时候,通过对时间的判断打开客厅的电灯。

    第 1 条附言  ·  2016-11-02 02:55:17 +08:00
    29 条回复    2017-06-02 14:09:00 +08:00
    kslr
        1
    kslr  
       2016-11-02 03:03:47 +08:00 via Android
    可以考虑下用国内的语音识别做到速度更快。
    sneezry
        2
    sneezry  
    OP
       2016-11-02 03:06:41 +08:00
    @kslr 这个考虑过,但是设备是问题。 Amazon Echo 的 Mic 是特制的,使用普通的 USB 话筒距离超过 20 厘米基本就识别不准了。而且 Amazon 的 Smart Home Skill 无需开发者自己设定关键字,非常好用。
    kslr
        3
    kslr  
       2016-11-02 03:17:44 +08:00 via Android
    @sneezry 记得科大讯飞有这个 mic 方案,只要 100 多好像。
    20150517
        4
    20150517  
       2016-11-02 06:33:23 +08:00
    我最近也想改造这个,但我想问下,你墙壁开关用的是什么?
    BroadLink 必须每间房间都有吗,否则他怎么发信号给墙壁开关呢?

    我现在需求就是有时候上楼了,不想下楼关灯,我需要安卓手机查下,然后控制楼下灯开关,请指教!
    kn007
        5
    kn007  
       2016-11-02 07:40:12 +08:00
    很有意思
    loniper
        6
    loniper  
       2016-11-02 08:48:52 +08:00
    真复杂...家里用 iPhone+小米路由已经实现 Siri 控制小米的灯泡、插座什么的了
    不要鄙视小米的东西,问为什么不用苹果官网那些正宗配件
    因为我 QIONG
    sneezry
        7
    sneezry  
    OP
       2016-11-02 09:39:12 +08:00 via Android
    @loniper 如果觉得仅用手机就足够了,那么 BroadLink 就满足你了。如果你不爱折腾这篇文章肯定不适合你,这我在最开始就说明了。
    sneezry
        8
    sneezry  
    OP
       2016-11-02 09:42:18 +08:00 via Android
    @20150517 墙壁开关我用的 BroadLink TC2 。 BroadLink 主机控制距离官方说是 6 到 8 米,射频信号可以穿墙,这就和布置无线路由类似,不必每个房间都放,但应该放几个还是要看实际情况。
    wickila
        9
    wickila  
       2016-11-03 16:11:04 +08:00 via Android
    cool !请问一下,识别的准确率如何?需要扯着嗓子大声喊吗?还是正常说话就行?
    sneezry
        10
    sneezry  
    OP
       2016-11-03 17:20:28 +08:00
    @wickila 正常说话就可以,但是最好每个房间放一个,门关上就听不到了。识别率还是很高的,对口语要求不高
    20150517
        11
    20150517  
       2016-11-04 01:27:17 +08:00
    @sneezry 今天研究了 TC2,发现正是我想要的
    想问一句,TC2 必须要有主机控制吗,手机不能直接控制对吗?
    我有个房间的灯亮度是能调节旋转的,这 TC2 就不能支持了吧?
    sneezry
        12
    sneezry  
    OP
       2016-11-05 16:33:39 +08:00 via iPad
    @20150517 必须要有主机, TC2 是射频遥控,不是 Wifi
    sneezry
        13
    sneezry  
    OP
       2016-11-05 16:34:52 +08:00 via iPad
    @20150517 亮度调节应该不支持,那我建议你找支持的,因为 Echo 支持调节亮度的指令
    sewyu
        14
    sewyu  
       2016-11-09 13:29:17 +08:00
    楼主高人,急需自建智能家居的材料。
    nicevar
        15
    nicevar  
       2016-11-09 17:29:05 +08:00
    我家里几个灯可以用遥控的,但是遥控是滚码的不能复制,所以那种 app 控制的红外设备不行,后来我把遥控固定在墙上做了个小机械来摁遥控器,用原来大学买的一块小板直接通过 wifi 用 app 控制这玩意,很是实用
    Arnie97
        16
    Arnie97  
       2016-11-12 23:29:21 +08:00 via Android
    美国东部 AWS … 香港 Azure …

    我想到了生活大爆炸某一集当中,通过 Internet 点亮了地球对面的一个灯。
    gump2008
        17
    gump2008  
       2016-11-22 17:06:03 +08:00
    aws 注册是免费一年吗?
    gump2008
        18
    gump2008  
       2016-11-29 16:48:09 +08:00
    “ 4.Azure 跳板机将结果通过 wss 发送到我家里的机器“,”我家里的机器“是指 ECHO DOT 吗?
    sneezry
        19
    sneezry  
    OP
       2016-11-29 17:06:42 +08:00 via iPhone
    @gump2008 家里的树莓派
    gump2008
        20
    gump2008  
       2016-11-29 22:07:43 +08:00 via iPad
    @sneezry 再通过树莓派控制 Rm pro 发送射频信号操作 Tc2 ?
    sneezry
        21
    sneezry  
    OP
       2016-11-29 22:24:36 +08:00
    @sneezry 对的
    hyg
        22
    hyg  
       2017-03-16 15:02:52 +08:00
    你好,我自己开发了一个 smart home skill 但是我最后用这个技能来关联 wink 账户的时候出现问题,大神能不能说一下账户关联的详细步骤?谢谢了
    sneezry
        23
    sneezry  
    OP
       2017-03-16 15:11:29 +08:00 via iPhone
    @hyg 我没有连 wink ,直接在局域网里发的指令
    hyg
        24
    hyg  
       2017-03-17 13:53:53 +08:00
    @sneezry 嗯嗯,那你这个 aws 的返回的指令怎样接收?你说的“ Amazon 在用北美或欧洲的服务器呼叫你自己家里的机器,将信息传给 BroadLink 控制主机”自己家里的主机是指什么?怎样呼叫自己家里的主机?
    sneezry
        25
    sneezry  
    OP
       2017-03-17 17:52:02 +08:00 via iPhone
    @hyg 树莓派
    hyg
        26
    hyg  
       2017-03-18 09:13:29 +08:00
    aws lambda 返回的这种的结果:
    {
    "header": {
    "messageId": "8b4c4d52-bf1f-498e-ba2b-065c193f5080",
    "namespace": "Alexa.ConnectedHome.Control",
    "name": "TurnOffConfirmation",
    "payloadVersion": "2"
    },
    "payload": {}
    }
    你说用 HTTPS 的方式来呼叫树莓派这怎样实现?
    zpvip
        27
    zpvip  
       2017-03-23 22:27:36 +08:00
    @sneezry 请问 Smart Home 的 demo 代码要改成什么样子呢?能不能麻烦贴一个示例,要把那个 5aa5 aa55 5aa5 aa55 的数据包放在代码里吗?

    谢谢!
    Mark2017
        28
    Mark2017  
       2017-06-02 13:31:43 +08:00
    @sneezry 你好,看了你的 blog,也粗看了一下 alexa smart home skill。有几个问题,还是不太明白。

    主要的问题是不清楚 alexa echo 如何和“家里的机器进行关联的”;
    即:用户说“ Alexa, turn on the TC2 ”,

    1,alexa 服务器如何知道需要调用 smart home skill,
    2,找到 smart home skill 后,如何知道将这个操作转发到,厂家的设备云端,并且指定了这个“家里的机器”?
    3,发到终端的 json 数据,是否意味着,家里的机器和 alexa 有一个长连接,移植去等待终端的连接,这个连接是 avs 的还是 aws 的?


    我看了 http://alexa.amazon.com/spa/index.html#appliances 或者是 alexa app,说是可以查询到设备,并且用 amazon.com 的用户账号关联,但这个关联,的结果是怎么样的?

    如果有可能,麻烦邮件沟通: [email protected]
    sneezry
        29
    sneezry  
    OP
       2017-06-02 14:09:00 +08:00 via iPhone
    @Mark2017 这个中间的过程确实比较麻烦,其实在 broadlink 的 gateway 前面我还放了个树莓派,在树莓派和 aws 之间我还放了个 vps。周末我会在 medium 上写一篇更加详细和完善的文章来讲这件事。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2785 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:48 · PVG 20:48 · LAX 04:48 · JFK 07:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.