本帖最后由 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_id 和 cuid
获取client_id 和 cuid
4. 获取cookie:f12打开开发者选项,到网络选项,刷新2页面,可以得到cookie:bduss=xxxxx(很长的字符,都要复制下来)
获取cookie
5. 获取场景ID:进入1页面内的场景页面,找到第一步设定的,名为“一个特殊的场景”的场景,开发者选项下,点击执行,抓到该场景的 sceneId
获取场景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. 检查配置文件,并重新加载就可以了。
后续使用如有问题,欢迎讨论!
|