【插件】MQTT中转实现智能音箱接入Home Assistant

上次打算整个通用的智能音箱接入平台,结果自定义技能不给做智能家居控制,翻车了。后来改用智能家居技能实现,虽然基础功能是没问题,但想要统一语音控制命令,不论是实现的成本还是使用的学习成本都太大,只得先搁浅了。目前瀚思彼岸论坛中已经有天猫精灵、小度音箱两个实现度比较高的插件了,将上个项目的成果改造下,提供一个免公网IP与智能音箱平台对接的新方法吧。


0.插件说明

技术架构

  • 智能音箱技能平台(自建skill)<=http=>插件中转服务<=mqtt=>本地插件<=http=>HA智能音箱服务/HA Oauth服务

效果

  • 外网访问https://ai-home.ljr.im/h2m2h/{app_key}/ABC,将通过mqtt将请求发给本地插件,由本地插件代理访问https://localhost:8123/ABC

    INFO:只支持小量文本格式内容页面,比如json。

处理流程

  1. 音箱skill平台将指令发送给插件中转服务(http服务)
  2. 中转服务通过url区分用户,将指令加密后分发给相应的本地插件(用户)
  3. 本地插件生成本地http请求与HA智能音箱服务/HA Oauth服务进行通信
  4. 得到的处理结果原路返回给音箱skill平台

多用户安全性保障

  • mqtt启用TLS
  • acl来隔离不同用户的主题
  • 对mqtt消息进行加密

注意事项

  • 需要相应的智能音箱插件(使用HA自带oauth认证的)使用,本插件只提供代理通道
  • 授权页面仍需要在本地环境进行访问
  • 天猫精灵测试偶尔无法授权,感觉天猫精灵服务器间歇抽风
  • 多用户使用环境下稳定性待测试

1.环境

2.使用说明

2.1本地智能音箱服务

参考相应插件介绍进行搭建

2.2http2mqtt2hass插件

  • 获取账号
    前往账号获取页面,获取app_key,app_secret
  • 插件配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #{HA配置目录}/configuration.yaml
    http2mqtt2hass:
    broker: mqtt.ljr.im # MQTT Broker
    port: 28883 # MQTT Port
    app_key: xxx # 获取的app_key
    app_secret: xxx # 获取的app_secret
    certificate: xxx # 插件目录内ca.crt的全路径
    tls_insecure: true # 不变
    allowed_uri: # 允许本地访问的路径
    - /auth/token # HA的Oauth服务地址
    - /dueros_gate # 小度音箱插件服务
    - /ali_genie_gate # 天猫精灵插件服务

    INFO:音箱插件的服务地址见插件代码中继承了HomeAssistantView类的类所定义的url变量。

  • 平台配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #前往音箱技能平台进行设置
    #授权地址
    https://{本地HA访问地址}/auth/authorize
    #Client_Id,回调地址域名那一串即可
    小度:https://xiaodu.baidu.com
    天猫:https://open.bot.tmall.com
    #Token地址
    https://ai-home.ljr.im/h2m2h/{app_key}/auth/token
    #WebService地址(服务网关)
    小度:https://ai-home.ljr.im/h2m2h/{app_key}/dueros_gate
    天猫:https://ai-home.ljr.im/h2m2h/{app_key}/ali_genie_gate

    INFO:{本地HA访问地址}、{app_key}替换成相应的字符串。

3.小结

  • 尝试将授权页面也通过mqtt代理访问,但mqtt消息传200k长的消息就获取不全导致错误,分次传输处理又太麻烦,不折腾了。
  • 智能音箱插件将汉字处理成’\uxxxx’字符串,返回给小度音箱平台无法识别。