[经验分享]小爱音箱dlna+网易云音乐插件实现自动替换vip歌曲和语音播放
查看: 21563|回复: 30
[经验分享]
小爱音箱dlna+网易云音乐插件实现自动替换vip歌曲和语音播放
火
[复制链接]
qqdwtypm
qqdwtypm
当前离线
积分149
金钱139
威望0
贡献0
HASS币10
2
主题8
回帖149
积分
论坛分享达人
积分149
金钱139
HASS币10
发消息
电梯直达
楼主
发表于 2023-8-19 22:07:34
|
只看该作者
|倒序浏览
|阅读模式
本帖最后由 qqdwtypm 于 2023-8-21 10:49 编辑
实现步骤:
一、安装调试网易云音乐插件
二、自动替换小爱音箱中的vip歌曲
三、通过小爱音箱语音控制来播放网易云音乐
具体步骤:
一、安装调试网易云音乐插件
安装论坛里大佬的插件:
https://github.com/shaonianzhentan/ha_cloud_music
安装教程可以参考帖子:
https://bbs.hassbian.com/thread-20812-1-1.html
之后
1.修复低版本homeassistant安装后报错问题,修改__init__.py
# await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
复制代码
2.在dlna上不会自动下一曲,修改media_player.py
(1)
# 定时器时间
TIME_BETWEEN_UPDATES = datetime.timedelta(seconds=10)
复制代码
(2)
# 判断是否下一曲
if self.before_state is not None:
# 判断音乐总时长
if self.before_state['media_duration'] > 0 and self.before_state['media_duration'] - self.before_state['media_duration'] <= 5:
# 判断源音乐播放器状态
# if self.before_state['state'] == STATE_PLAYING and self.current_state == STATE_IDLE:
# if self.before_state['media_duration'] - self.before_state['media_position'] <= 10 and self.before_state['media_duration'] > 1 and self.before_state['media_duration'] - self.before_state['media_position'] >= 0:
if self._attr_media_duration - self._attr_media_position <= 19 and self._attr_media_duration > 1 and self._attr_media_duration - self._attr_media_position >= 0 :
self._attr_state = STATE_PAUSED
self.before_state = None
timeleft = self._attr_media_duration - self._attr_media_position
if timeleft > 13 :
time.sleep(timeleft-13)
self.hass.async_create_task(self.async_media_next_track())
self.before_state = None
return
# 源播放器空闲 & 当前正在播放
# if self.before_state['media_duration'] == 0 and self.before_state['media_position'] == 0 and self.current_state == STATE_IDLE \
# and self._attr_media_duration == 0 and self._attr_media_position == 0 and self._attr_state == STATE_PLAYING:
# self.hass.async_create_task(self.async_media_next_track())
# self.before_state = None
# return
if self.before_state['media_duration'] == 0 and self.before_state['media_position'] == 0 and self.current_state == STATE_PLAYING \
and self._attr_media_duration == 0 and self._attr_media_position == 0 and self._attr_state == STATE_PLAYING:
time.sleep(10)
if self.before_state['media_duration'] == 0 and self.before_state['media_position'] == 0 and self.current_state == STATE_PLAYING \
and self._attr_media_duration == 0 and self._attr_media_position == 0 and self._attr_state == STATE_PLAYING:
self.hass.async_create_task(self.async_media_next_track())
self.before_state = None
return
# 判断是否已暂停
if media_player.state == STATE_IDLE and self._attr_state != STATE_ON:
time.sleep(19)
if media_player.state == STATE_IDLE and self._attr_state != STATE_ON :
self.hass.async_create_task(self.async_media_pause())
self.before_state = None
return
复制代码
3.返回的链接为https,小爱音箱无法跳转,修改为http,修改http.py
(1)
not_found_tips = quote(f'当前没有找到编号是{id},歌名为{song},作者是{singer}的播放链接')
play_url = f'http://fanyi.baidu.com/gettts?lan=zh&text={not_found_tips}&spd=5&source=web'
复制代码
(2)
# 修改https为http
play_url2 = play_url.replace('https','http')
play_url = play_url2
print(play_url)
self.play_key = play_key
self.play_url = play_url
# 重定向到可播放链接
return web.HTTPFound(play_url)
复制代码
二、自动替换小爱音箱中的vip歌曲
实现思路:监测到小爱回复中有“试听版”三个字触发,自动由网易云插件搜索播放
前提:已安装好miot那个插件,可以识别音箱对话;ha中的dlna已配置好音箱
homeassistant自动化:
alias: 本地播放-替换试听版
description: ''
trigger:
- platform: state
entity_id:
- sensor.xiaomi_s12_4c94_conversation
- platform: state
entity_id:
- sensor.xiaomi_lx06_fd69_conversation
enabled: true
- platform: state
entity_id:
- sensor.xiaomi_lx06_ebe4_conversation
enabled: true
condition:
- condition: template
value_template: |
{{ (trigger.to_state|default(0)) and as_timestamp(now()) -
as_timestamp(trigger.to_state.attributes.timestamp) < 30 }}
{# 限制30秒内的对话 #}
enabled: true
- condition: not
conditions:
- condition: template
value_template: '{{ ''本地播放'' in trigger.to_state.state }}'
action:
- if:
- condition: template
value_template: |
{{ "%E8%AF%95%E5%90%AC%E7%89%88" in
trigger.to_state.attributes.answers[0]|urlencode() }}
then:
- if:
- condition: template
value_template: |
{{ 'media_player.xiaomi_s12_4c94_play_control' in
trigger.to_state.attributes.parent_entity_id }}
then:
- service: media_player.select_sound_mode
data:
sound_mode: media_player.xiao_ai_yin_xiang_0095
target:
device_id: f8b39494266357981171acd9068de644
- if:
- condition: template
value_template: |
{{ 'media_player.xiaomi_lx06_fd69_play_control' in
trigger.to_state.attributes.parent_entity_id }}
then:
- service: media_player.select_sound_mode
data:
sound_mode: media_player.xiao_ai_yin_xiang_8269
target:
device_id: f8b39494266357981171acd9068de644
- if:
- condition: template
value_template: |
{{ 'media_player.xiaomi_lx06_ebe4_play_control' in
trigger.to_state.attributes.parent_entity_id }}
then:
- service: media_player.select_sound_mode
data:
sound_mode: media_player.xiao_ai_yin_xiang_8269
target:
device_id: f8b39494266357981171acd9068de644
- service: media_player.play_media
data:
media_content_id: cloudmusic://play/song?kv={{trigger.to_state.attributes.content}}
media_content_type: music
target:
device_id: f8b39494266357981171acd9068de644
- service: system_log.write
data:
level: info
logger: custom_components.xiaomi_miot.xiaoai
message: |
{{ trigger.entity_id }}: {{ trigger.to_state.state }}
enabled: false
mode: single
复制代码
三、通过小爱音箱语音控制来播放网易云音乐
实现思路:监测小爱音箱对话中关键字,如果出现“本地播放”则触发,同时如果本地播放后面还跟有其他关键词则触发二级功能:
本地播放+热歌榜
+歌手 +(想传递去的搜索内容,比如歌手名)
+歌单 +(想传递去的搜索内容,比如歌单名)
+第三方 +(想传递去的搜索内容,比如歌手+歌名) 第三方音乐搜素,一首歌
+下一首
+随机播放
+顺序播放
+(不含以上搜索词,剩余部分想传递去的搜索内容,比如歌手+歌名)默认音乐搜索,一首歌
复制代码
如直接对小爱说“本地播放歌手五月天”则会触发搜索该歌手的歌曲,“本地播放五月天”则会触发搜索五月天一首歌
ha的自动化代码:
description: ''
trigger:
- platform: state
entity_id:
- sensor.xiaomi_s12_4c94_conversation
- platform: state
entity_id:
- sensor.xiaomi_lx06_fd69_conversation
enabled: true
- platform: state
entity_id:
- sensor.xiaomi_lx06_ebe4_conversation
enabled: true
condition:
- condition: template
value_template: |
{{ (trigger.to_state|default(0)) and as_timestamp(now()) -
as_timestamp(trigger.to_state.attributes.timestamp) < 30 }}
{# 限制30秒内的对话 #}
enabled: true
action:
- if:
- condition: template
value_template: |
{{ '本地播放' in trigger.to_state.state }}
then:
- if:
- condition: template
value_template: |
{{ 'media_player.xiaomi_s12_4c94_play_control' in
trigger.to_state.attributes.parent_entity_id }}
then:
- service: media_player.select_sound_mode
data:
sound_mode: media_player.xiao_ai_yin_xiang_0095
target:
device_id: f8b39494266357981171acd9068de644
- if:
- condition: template
value_template: |
{{ 'media_player.xiaomi_lx06_fd69_play_control' in
trigger.to_state.attributes.parent_entity_id }}
then:
- service: media_player.select_sound_mode
data:
sound_mode: media_player.xiao_ai_yin_xiang_8269
target:
device_id: f8b39494266357981171acd9068de644
- if:
- condition: template
value_template: |
{{ 'media_player.xiaomi_lx06_ebe4_play_control' in
trigger.to_state.attributes.parent_entity_id }}
then:
- service: media_player.select_sound_mode
data:
sound_mode: media_player.xiao_ai_yin_xiang_8269
target:
device_id: f8b39494266357981171acd9068de644
- choose:
- conditions:
- condition: template
value_template: '{{ ''热歌榜'' in trigger.to_state.state }}'
sequence:
- service: media_player.play_media
target:
entity_id: media_player.yun_yin_le
data:
media_content_id: >-
cloudmusic://163/playlist?title=%E7%83%AD%E6%AD%8C%E6%A6%9C&id=3778678
media_content_type: playlist
metadata:
title: 热歌榜
thumbnail: null
media_class: playlist
children_media_class: music
navigateIds:
- {}
- media_content_type: album
media_content_id: cloudmusic://163/toplist?title=%E6%A6%9C%E5%8D%95
- media_content_type: playlist
media_content_id: >-
cloudmusic://163/playlist?title=%E7%83%AD%E6%AD%8C%E6%A6%9C&id=3778678
- conditions:
- condition: template
value_template: '{{ ''歌手'' in trigger.to_state.state }}'
sequence:
- service: media_player.play_media
data:
media_content_id: >-
cloudmusic://play/singer?kv={{(trigger.to_state.state|replace("本地播放",""))|replace("歌手","")}}
media_content_type: music
target:
device_id: f8b39494266357981171acd9068de644
- conditions:
- condition: template
value_template: '{{ ''歌单'' in trigger.to_state.state }}'
sequence:
- service: media_player.play_media
data:
media_content_type: music
media_content_id: >-
cloudmusic://play/list?kv={{(trigger.to_state.state|replace("本地播放",""))|replace("歌单","")}}
target:
device_id: f8b39494266357981171acd9068de644
- conditions:
- condition: template
value_template: '{{ ''第三方'' in trigger.to_state.state }}'
sequence:
- service: media_player.play_media
data:
media_content_type: music
media_content_id: >-
cloudmusic://search/play?kv={{(trigger.to_state.state|replace("本地播放",""))|replace("第三方","")}}
target:
device_id: f8b39494266357981171acd9068de644
- conditions:
- condition: template
value_template: '{{ ''下一首'' in trigger.to_state.state }}'
sequence:
- service: media_player.media_next_track
data: {}
target:
device_id: f8b39494266357981171acd9068de644
- conditions:
- condition: template
value_template: '{{ ''随机播放'' in trigger.to_state.state }}'
sequence:
- service: media_player.shuffle_set
data:
shuffle: true
target:
device_id: f8b39494266357981171acd9068de644
- conditions:
- condition: template
value_template: '{{ ''顺序播放'' in trigger.to_state.state }}'
sequence:
- service: media_player.shuffle_set
data:
shuffle: false
target:
device_id: f8b39494266357981171acd9068de644
default:
- service: media_player.play_media
data:
media_content_type: music
media_content_id: >-
cloudmusic://play/song?kv={{trigger.to_state.state|replace("本地播放","")}}
target:
device_id: f8b39494266357981171acd9068de644
- service: system_log.write
data:
level: info
logger: custom_components.xiaomi_miot.xiaoai
message: |
{{ trigger.entity_id }}: {{ trigger.to_state.state }}
enabled: false
mode: single
复制代码
已知问题:如果只有一首歌,小爱音箱会循环播放,小度音箱会自动停止,应该是小爱的固件原因。
评分
参与人数 7金钱 +51
HASS币 +10
收起
理由
ha_czyj
+ 2
感谢楼主分享!
wangyiyuan
+ 10
感谢楼主分享!
cat_li
+ 2
论坛有你更精彩!
札幌蹦极花果
+ 2
论坛有你更精彩!
Smart_wp
+ 5
高手,这是高手!
囧
+ 20
+ 10
感谢楼主分享!
隔壁的王叔叔
+ 10
墙都不扶,就服楼主!
查看全部评分
收藏72
回复
使用道具
举报
月亮火
月亮火
当前离线
积分981
金钱913
威望0
贡献0
HASS币0
3
主题65
回帖981
积分
高级会员
高级会员, 积分 981, 距离下一级还需 19 积分
高级会员, 积分 981, 距离下一级还需 19 积分
积分981
金钱913
HASS币0
发消息
沙发
发表于 2023-8-20 01:08:27
|
只看该作者
感觉非常有用,先收藏
回复
使用道具
举报
65698888
65698888
当前离线
积分1729
金钱1560
威望0
贡献0
HASS币10
9
主题160
回帖1729
积分
金牌会员
金牌会员, 积分 1729, 距离下一级还需 1271 积分
金牌会员, 积分 1729, 距离下一级还需 1271 积分
积分1729
金钱1560
HASS币10
发消息
板凳
发表于 2023-8-20 10:57:01
|
只看该作者
没有周杰伦
回复
使用道具
举报
cw4774
cw4774
当前离线
积分1553
金钱1317
威望0
贡献0
HASS币0
15
主题221
回帖1553
积分
金牌会员
金牌会员, 积分 1553, 距离下一级还需 1447 积分
金牌会员, 积分 1553, 距离下一级还需 1447 积分
积分1553
金钱1317
HASS币0
发消息
地板
发表于 2023-8-20 13:06:41
|
只看该作者
我家小爱万能版遥控带时钟的 没有dlan 可以不
回复
使用道具
举报
隔壁的王叔叔
隔壁的王叔叔
当前离线
积分5542
金钱3862
威望0
贡献0
HASS币0
14
主题1666
回帖5542
积分
论坛元老
积分5542
金钱3862
HASS币0
发消息
5#
发表于 2023-8-21 09:48:29
|
只看该作者
ha的自动化写的溜啊
回复
使用道具
举报
qqdwtypm
qqdwtypm
当前离线
积分149
金钱139
威望0
贡献0
HASS币10
2
主题8
回帖149
积分
论坛分享达人
积分149
金钱139
HASS币10
发消息
6#
楼主|
发表于 2023-8-21 10:51:33
|
只看该作者
65698888 发表于 2023-8-20 10:57
没有周杰伦
有的,插件作者直接在里面进行了专门处理
回复
使用道具
举报
qqdwtypm
qqdwtypm
当前离线
积分149
金钱139
威望0
贡献0
HASS币10
2
主题8
回帖149
积分
论坛分享达人
积分149
金钱139
HASS币10
发消息
7#
楼主|
发表于 2023-8-21 10:55:28
|
只看该作者
cw4774 发表于 2023-8-20 13:06
我家小爱万能版遥控带时钟的 没有dlan 可以不
识别tts部分主要是看miot是否支持,放歌的部分dlna只是一个手段,也可以考虑在ha上通过蓝牙连接目标音箱,或者直接在ha上声卡输出
回复
使用道具
举报
252376009
252376009
当前离线
积分509
金钱465
威望0
贡献0
HASS币0
1
主题43
回帖509
积分
高级会员
高级会员, 积分 509, 距离下一级还需 491 积分
高级会员, 积分 509, 距离下一级还需 491 积分
积分509
金钱465
HASS币0
发消息
8#
发表于 2023-8-27 12:00:07
|
只看该作者
请教楼主 device_id是指云音乐的么
回复
使用道具
举报
qqdwtypm
qqdwtypm
当前离线
积分149
金钱139
威望0
贡献0
HASS币10
2
主题8
回帖149
积分
论坛分享达人
积分149
金钱139
HASS币10
发消息
9#
楼主|
发表于 2023-8-29 20:27:43
|
只看该作者
252376009 发表于 2023-8-27 12:00
请教楼主 device_id是指云音乐的么
是的。可以通过自动化ui界面来编写,然后切换为yaml就可以获得。
回复
使用道具
举报
hxck
hxck
当前离线
积分868
金钱750
威望0
贡献0
HASS币0
4
主题114
回帖868
积分
高级会员
高级会员, 积分 868, 距离下一级还需 132 积分
高级会员, 积分 868, 距离下一级还需 132 积分
积分868
金钱750
HASS币0
发消息
10#
发表于 2023-8-30 21:28:43
|
只看该作者
大佬,能出个视频不,看的云里雾里的。哈哈
回复
使用道具
举报