本帖最后由 cjnt007 于 2022-11-25 20:44 编辑
完美解决了即时显示蓝牙声卡连接断开的状态,具体方法见 10楼 。
参照Xcary等大佬的帖子,在实现cm311-1a盒子HA中声音播放可从HDMI和蓝牙输出的基础上,为方便声音输出切换,折腾了许久后终于成功,特把过程记录下来,供有此需求的朋友参考,据此原理,在其他设备上的HA也可同理实现。另外,我玩HA的时间很短,对Linux系统、计算机编程之类也很菜,可能实现这个功能有更好的方法,此文就权当抛砖引玉咯,欢迎大家批评指正。
一、实现效果 如下图所示,用VLC-TELNET本地播放声音时,通过点击HDMI和BLUETOOTH两个按钮,可以不中断声音播放直接切换声音输出路径。设想下此功能的应用场景,如果有多路声卡,配合人体跟踪,通过自动化是不是可以实现在一定空间内音乐播放跟着人走的效果?
首先说明,此功能是对HA在本地声音输切换的研究,使用非本地声音输出如DLNA、外部MPD等不在此次研究范围,也不在这个帖子里讨论。
二、前提条件 在实现此功能之前,要确保HA中HDMI和BLUETOOTH两路声音输出都正常,也即HA能显示出两个声卡,检查方法可以在加载项Add-Ones中的VLC或Terminal & SSH的配置页面音频输出列表里查看。
此时,使用VLC播放音乐,这里选择不同的音频输出设备,声音输出就能切换了,但每次切换时都要打开到这里显然很不方便,于是就想能不能实现在仪表盘上实现声卡的切换。
查看声卡信息,还可以在ssh中使用如下命令查看。
使用ha audio info可以查看ha的声卡信息:
$ ha audio info
audio:
application:
- addon: core_vlc
index: 3
mute: false
name: VLC media player (LibVLC 3.0.12)
stream_index: 0
stream_type: output
volume: 0.68359375
card:
- driver: module-alsa-card.c
index: 0
name: alsa_card.platform-sound
profiles:
- active: true
description: Stereo Output
name: output:stereo-fallback
- active: false
description: Multichannel Output
name: output:multichannel-output
- active: false
description: "Off"
name: "off"
- driver: module-bluez5-device.c
index: 1
name: bluez_card.8C_53_C3_79_C9_65
profiles:
- active: true
description: High Fidelity Playback (A2DP Sink)
name: a2dp_sink
- active: false
description: "Off"
name: "off"
input: []
output:
- applications:
- addon: core_vlc
index: 3
mute: false
name: VLC media player (LibVLC 3.0.12)
stream_index: 0
stream_type: output
volume: 0.68359375
card: 0
default: true
description: Built-in Audio Stereo
index: 0
mute: false
name: alsa_output.platform-sound.stereo-fallback
volume: 1
- applications: []
card: 1
default: false
description: 小爱音箱-4400
index: 1
mute: false
name: bluez_sink.8C_53_C3_79_C9_65.a2dp_sink
volume: 1
host: 172.30.32.4
update_available: false
version: 2022.07.0
version_latest: 2022.07.0
或者ha hw audio命令
$ ha hw audio
audio:
input: {}
output:
alsa_output.platform-sound.stereo-fallback: Built-in Audio Stereo
bluez_sink.8C_53_C3_79_C9_65.a2dp_sink: 小爱音箱-4400
这里,“alsa_output.platform-sound.stereo-fallback”和“bluez_sink.8C_53_C3_79_C9_65.a2dp_sink”就是cm311-1a盒子的HDMI输出和蓝牙输出。
经研究,在ssh下使用命令ha audio default output --name "声卡name"可以实现输出声卡的切换,即:
ha audio default output --name "alsa_output.platform-sound.stereo-fallback"
复制代码
ha audio default output --name "bluez_sink.8C_53_C3_79_C9_65.a2dp_sink"
复制代码
但如果想将此命令添加到shell command里,调用时没有任何效果,查看系统日志可以看到返回下面的错误信息:
Logger: homeassistant.components.shell_command
Source: /usr/src/homeassistant/homeassistant/components/shell_command/__init__.py:115
Integration: Shell Command (documentation, issues)
First occurred: 21:36:30 (3 occurrences)
Last logged: 21:39:25
Error running command: `ha audio default output --name 'alsa_output.platform-sound.stereo-fallback'`, return code: 127
Error running command: `ha audio default output --name 'bluez_sink.8C_53_C3_79_C9_65.a2dp_sink'`, return code: 127
NoneType: None
复制代码
根据网上资料提示,错误代码127,大概是无此命令的意思。用下面命令进入home assistant容器,查看shell command插件运行环境
docker exec -it 42731 bash
#42731为home assistent容器的id号前缀,要根据用docker ps查询自己的替换,也可以使用容器名称替换
复制代码
在此环境下,运行以上切换声卡的命令就会报错。分析一下,可以简单理解为home assistant容器同盒子armbian是两个不同的环境,要想在shell command中能运行声卡切换命令,就需要切换到armbian的ssh环境里,由此想到以下解决办法。
三、解决办法
第三步:
在仪表盘里,添加以下卡片:
cards:
- cards:
- color: rgb(255, 255, 255)
color_type: card
icon: mdi:hdmi-port
name: HDMI
styles:
card:
- height: 80px
tap_action:
action: call-service
service: shell_command.soundcard_hdmi
service_data: null
type: custom:button-card
- color: rgb(255, 255, 255)
color_type: card
icon: mdi:bluetooth
name: BLUETOOTH
styles:
card:
- height: 80px
tap_action:
action: call-service
service: shell_command.soundcard_bluetooth
service_data: null
type: custom:button-card
type: horizontal-stack
type: vertical-stack
复制代码
button-card卡片需要在hacs里下载安装,当然也可以用其他方法调用shell command,那就看你自己的需要了。