『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 6443|回复: 44

[智能音箱] HA控制小度音箱,成功TTS!无集成手动配置详解

  [复制链接]

2

主题

58

帖子

395

积分

论坛技术达人

积分
395
金钱
337
HASS币
10
发表于 2024-8-14 22:29:20 | 显示全部楼层 |阅读模式
本帖最后由 ganguotu 于 2024-8-31 10:21 编辑

上一篇说到,homeassistant可以无集成配置,控制小度智能音箱执行自定义指令,详见:https://bbs.hassbian.com/thread-26451-1-1.html
虽然正常可用,但同时也提到了,该接口实测在小度app上已经抓不到了,不知道什么时候会被废弃
好在经过我的一番操作,抓到了新的api,这次是通过操作小度APP的“场景”实体,来控制小度音响,成功实现了控制指令和TTS
话不多说,直接开干,依然是手把手教学(上一篇跟着设置的同学,记得在本篇配置文件和上一篇不一样的地方,手动修改一下,修改好是不会影响上一篇的设置的,同时可用

开搞:
一、手动创建场景在小度APP中添加一个场景,执行动作让小度随便说句话,名为“一个特殊的场景” 方便记忆。

手动创建场景

手动创建场景


二、进网页版获取4个参数
1. 登录:首先登录小度智能家居平台的网页版:
https://xiaodu.baidu.com/saiya/smarthome/index.html
2. 访问:按照提示扫码登录,登录绑定你小度音响的百度账号,接着浏览器访问
https://xiaodu.baidu.com/saiya/device/list
3. 获取参数:可以获取该账号下所有的的小度智能音箱终端信息,得到要控制的音箱的两个关键信息:client_idcuid

获取client_id 和 cuid

获取client_id 和 cuid

4. 获取cookie:f12打开开发者选项,到网络选项,刷新2页面,可以得到cookie:bduss=xxxxx(很长的字符,都要复制下来)

获取cookie

获取cookie

5. 获取场景ID:进入1页面内的场景页面,找到第一步设定的,名为“一个特殊的场景”的场景,开发者选项下,点击执行,抓到该场景的 sceneId

获取场景ID

获取场景ID

至此,得到需要的4个参数。

三、配置homeassistant
1. secrets.yaml
添加第二步获取的4个参数
xiaodu_client_id: 'your-client-id-here'
xiaodu_cuid: 'your-cuid-here'
xiaodu_Cookie: 'BDUSS=your-BDUSS-here'
xiaodu_sceneId: '一个特殊的场景的ID-sceneId.here'
2. configuration.yaml 添加:
rest_command:
  xiaodu_control:
    url: "https://xiaodu.baidu.com/saiya/smarthome/unified"
    method: post
    content_type: "application/json"
    headers:
      Cookie: !secret xiaodu_Cookie
    payload: '{{ payload }}'

input_text:
  xiaodu_directive_text:
    name: 发给小度命令
    initial: ''
  xiaodu_speech_text:
    name: 发给小度说话
    initial: ''

3. automations.yaml 添加:20240831更新:使用中发现一个问题,按照这里配置automations.yaml后,无法通过UI更改任何一个自动化了,解决方法见结尾更新处
- id: '1234567891002'
  alias: "小度TTS"
  variables:
    xiaodu_cuid: !secret xiaodu_cuid
    xiaodu_client_id: !secret xiaodu_client_id
    xiaodu_sceneId: !secret xiaodu_sceneId
  trigger:
    - platform: state
      entity_id: input_text.xiaodu_speech_text
      not_to: ''
  condition:
    - condition: template
      value_template: '{{ states(''input_text.xiaodu_speech_text'') | trim | length > 0 }}'
  action:
    - service: rest_command.xiaodu_control
      data_template:
        payload: '{
        "method": "updateScene","from": "h5","version": "2.0","params": {
          "sceneId": "{{ xiaodu_sceneId }}",
          "cuid": "{{ xiaodu_cuid }}",
          "sceneBlocks": [{"blockType": "broadcastTTS",
                          "tts": "{{ states("input_text.xiaodu_speech_text")|default("你好") }}",
                          "cuid": "{{ xiaodu_cuid }}",
                          "clientId": "{{ xiaodu_client_id }}"}],
          "clientId": "{{ xiaodu_client_id }}"}}'
    - service: input_text.set_value
      target:
        entity_id: input_text.xiaodu_speech_text
      data:
        value: ''
    - service: rest_command.xiaodu_control
      data_template:
        payload: '{
          "method": "triggerScene",
          "params": {
            "sceneId": "{{ xiaodu_sceneId }}"}}'
  mode: single
- id: '1234567891003'
  alias: "小度Directive"
  variables:
    xiaodu_cuid: !secret xiaodu_cuid
    xiaodu_client_id: !secret xiaodu_client_id
    xiaodu_sceneId: !secret xiaodu_sceneId
  trigger:
    - platform: state
      entity_id: input_text.xiaodu_directive_text
      not_to: ''
  condition:
    - condition: template
      value_template: '{{ states(''input_text.xiaodu_directive_text'') | trim | length > 0 }}'
  action:
    - service: rest_command.xiaodu_control
      data_template:
        payload: '{
        "method": "updateScene","from": "h5","version": "2.0","params": {
          "sceneId": "{{ xiaodu_sceneId }}",
          "cuid": "{{ xiaodu_cuid }}",
          "sceneBlocks": [{"blockType": "customQuery",
                          "content": "{{ states("input_text.xiaodu_directive_text")|default("几点了") }}",
                          "cuid": "{{ xiaodu_cuid }}",
                          "clientId": "{{ xiaodu_client_id }}"}],
          "clientId": "{{ xiaodu_client_id }}"}}'
    - service: input_text.set_value
      target:
        entity_id: input_text.xiaodu_directive_text
      data:
        value: ''
    - service: rest_command.xiaodu_control
      data_template:
        payload: '{
          "method": "triggerScene",
          "params": {
            "sceneId": "{{ xiaodu_sceneId }}"}}'
  mode: single

4. 首页添加实体卡片 输入文本命令
type: entities
title: 小度音箱
entities:
  - entity: input_text.xiaodu_speech_text
  - entity: input_text.xiaodu_directive_text

实体卡片

实体卡片

或 直接调用服务:
文本指令:  
service: input_text.set_value
data:
  value: 明天有雨吗
target:
  entity_id: input_text.xiaodu_directive_text
TTS:
service: input_text.set_value
data:
  value: 你好我是小度
target:
  entity_id: input_text.xiaodu_speech_text


至此,小度音箱的文本指令和文本语音,已经可以成功从homeassistant 控制了

结合小爱同学的经验,也就是说,几乎所有可以接入小度平台的智能家居,都可以“半接入”HA了
包括各大电器厂商在内的众多第三方平台:

小度接入的第三方平台

小度接入的第三方平台


这种接入方法使用了HA的模版功能,不能获取状态,但可以完全控制,暂且称之为“半接入”吧
例子可见大佬帖子:
https://bbs.hassbian.com/thread-14006-1-1.html

期待更多小伙伴,对利用小度进行半接入的方法的使用和反馈!

------------
20240831更新:因为homeassistant不支持在UI中使用secrets语法,因此按照原帖中的automations.yaml配置后,所有的自动化将不能通过UI手动编辑更新及添加!添加会报500错误,编辑更新也会报错:“此自动化无法通过用户界面编辑,因为其未存储在 automations.yaml 文件中,或者没有标识符”。
解决方法来源:https://github.com/home-assistant/frontend/issues/3065#issuecomment-591397887
就是把使用了secret语法的自动化单独分离出一个独立文件,下面来操作:
1. configuration.yaml 添加 :
automation secret: !include secret_automations.yaml

2. config 目录新建 secret_automations.yaml 文件 ,把上文 automations.yaml 的两个自动化剪切进去。
3. 检查配置文件,并重新加载就可以了。
后续使用如有问题,欢迎讨论!



评分

参与人数 4金钱 +41 HASS币 +10 收起 理由
b70352 + 8 感谢楼主分享!
q873139535 + 8 感谢楼主分享!
2812568738 + 5
+ 20 + 10 以为是青铜,原来是王者!

查看全部评分

回复

使用道具 举报

2

主题

58

帖子

395

积分

论坛技术达人

积分
395
金钱
337
HASS币
10
 楼主| 发表于 2024-8-15 19:02:52 | 显示全部楼层
其实最后对于“半接入”的总结不十分正确,毕竟这是用cookie实现的,而cookie是可以获得接入设备的状态信息的,轮询就可以了,如果这篇帖子还有后续,那下一篇我会这么开头:“总所周知,有了Cookie就有了一切……”
但是话说回来,做轮询获取设备状态的话,逻辑比较复杂,配置文件会比较混乱,不够优雅,因此我想,最终解决方案一定是一个自定义集成,它像 miot 一样,自动接入小度平台的所有设备……
回复

使用道具 举报

4

主题

78

帖子

481

积分

中级会员

Rank: 3Rank: 3

积分
481
金钱
403
HASS币
0
发表于 2024-8-15 14:02:46 | 显示全部楼层
厉害!! 希望有大佬开发出天猫精灵接入HA
回复

使用道具 举报

2

主题

58

帖子

395

积分

论坛技术达人

积分
395
金钱
337
HASS币
10
 楼主| 发表于 2024-8-15 18:54:55 | 显示全部楼层
sonic056 发表于 2024-8-15 14:02
厉害!! 希望有大佬开发出天猫精灵接入HA

原理是一样的啦,自己抓包试试看!
回复

使用道具 举报

1

主题

182

帖子

1236

积分

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1054
HASS币
0
发表于 2024-8-17 11:48:39 | 显示全部楼层
测试成功,感谢分享
回复

使用道具 举报

5

主题

199

帖子

881

积分

高级会员

Rank: 4

积分
881
金钱
682
HASS币
0
发表于 2024-8-17 14:23:15 | 显示全部楼层
不太明白,这主要可以干嘛?
回复

使用道具 举报

2

主题

58

帖子

395

积分

论坛技术达人

积分
395
金钱
337
HASS币
10
 楼主| 发表于 2024-8-17 16:02:22 | 显示全部楼层
就是可以从HA操作小度音箱啦,可以用于操作小度智能家居设备。如果身边有个智能音箱的话,就会体会到接入HA有多方便了
回复

使用道具 举报

4

主题

337

帖子

2500

积分

金牌会员

Rank: 6Rank: 6

积分
2500
金钱
2163
HASS币
0
发表于 2024-8-18 23:51:10 | 显示全部楼层
确实能用。。。有两个注意的点

一是,cookie的有效期有待观察,如果过期了能抛出错误最好。
二是,我的小度是放电脑旁的,,,突然的说话(自动化触发),一惊一乍的,特别是晚上,吓人。
回复

使用道具 举报

10

主题

1372

帖子

4383

积分

论坛元老

Rank: 8Rank: 8

积分
4383
金钱
3011
HASS币
0
发表于 2024-8-19 08:32:27 | 显示全部楼层
楼主牛逼
回复

使用道具 举报

5

主题

115

帖子

743

积分

论坛技术达人

积分
743
金钱
628
HASS币
10
发表于 2024-8-19 09:00:43 | 显示全部楼层
HAVCS 都可以实现啊,目前就在用,很稳定。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-22 00:59 , Processed in 0.062419 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表