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

 找回密码
 立即注册
查看: 5915|回复: 22

[新奇玩法] CM311-1a盒子实现声卡即时切换的研究【解决即时显示蓝牙】

[复制链接]

20

主题

485

帖子

3206

积分

论坛元老

Rank: 8Rank: 8

积分
3206
金钱
2721
HASS币
8
发表于 2022-10-25 12:46:04 | 显示全部楼层 |阅读模式
本帖最后由 cjnt007 于 2022-11-25 20:44 编辑

完美解决了即时显示蓝牙声卡连接断开的状态,具体方法见10楼

参照Xcary等大佬的帖子,在实现cm311-1a盒子HA中声音播放可从HDMI和蓝牙输出的基础上,为方便声音输出切换,折腾了许久后终于成功,特把过程记录下来,供有此需求的朋友参考,据此原理,在其他设备上的HA也可同理实现。另外,我玩HA的时间很短,对Linux系统、计算机编程之类也很菜,可能实现这个功能有更好的方法,此文就权当抛砖引玉咯,欢迎大家批评指正。

一、实现效果
如下图所示,用VLC-TELNET本地播放声音时,通过点击HDMI和BLUETOOTH两个按钮,可以不中断声音播放直接切换声音输出路径。设想下此功能的应用场景,如果有多路声卡,配合人体跟踪,通过自动化是不是可以实现在一定空间内音乐播放跟着人走的效果?
1.gif
首先说明,此功能是对HA在本地声音输切换的研究,使用非本地声音输出如DLNA、外部MPD等不在此次研究范围,也不在这个帖子里讨论。

二、前提条件
在实现此功能之前,要确保HA中HDMI和BLUETOOTH两路声音输出都正常,也即HA能显示出两个声卡,检查方法可以在加载项Add-Ones中的VLC或Terminal & SSH的配置页面音频输出列表里查看。
2.gif
此时,使用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"可以实现输出声卡的切换,即:
  • 使用HDMI声卡输出
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,那就看你自己的需要了。

评分

参与人数 1金钱 +8 收起 理由
sorrypqa + 8 高手,这是高手!

查看全部评分

回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12115
金钱
9096
HASS币
460

教程狂人突出贡献

发表于 2022-10-25 15:12:12 | 显示全部楼层
厉害!
https://www.home-assistant.io/integrations/pulseaudio_loopback/ 这个组件是否研究过?我只是看过,自己没需求也就没太琢磨,似乎也可以解决多房间/多通道声音输出切换的需求:
The goal behind this switch is to allow a very flexible whole home audio system based upon PulseAudio.

For example, for a system with a 7.1 surround sound card, and 3 instances of MPD running, it is possible to quickly route the output of any MPD instance to any of the 8 possible (4 stereo) channels on the sound card
回复

使用道具 举报

20

主题

485

帖子

3206

积分

论坛元老

Rank: 8Rank: 8

积分
3206
金钱
2721
HASS币
8
 楼主| 发表于 2022-10-25 16:15:00 | 显示全部楼层
XCray 发表于 2022-10-25 15:12
厉害!
https://www.home-assistant.io/integrations/pulseaudio_loopback/ 这个组件是否研究过?我只是看 ...

这个插件还没有了解过,看链接里的介绍,貌似也能实现音频路由的功能。
PulseAudio服务在最近折腾过程中碰到比较多,是与Alsa配合实现Linux系统下的一个音频服务框架,但它们之间的配合比较复杂,我脑子笨基础差,虽然也找了不少资料看,目前还没有能研究明白
回复

使用道具 举报

10

主题

1381

帖子

4407

积分

论坛元老

Rank: 8Rank: 8

积分
4407
金钱
3026
HASS币
0
发表于 2022-11-15 00:07:13 | 显示全部楼层
大佬,蓝牙音箱连上后,很久才会出现在输出哪里,请问,有办法让他快速检测到吗?
回复

使用道具 举报

20

主题

485

帖子

3206

积分

论坛元老

Rank: 8Rank: 8

积分
3206
金钱
2721
HASS币
8
 楼主| 发表于 2022-11-16 17:08:20 | 显示全部楼层
本帖最后由 cjnt007 于 2022-11-16 19:37 编辑
隔壁的王叔叔 发表于 2022-11-15 00:07
大佬,蓝牙音箱连上后,很久才会出现在输出哪里,请问,有办法让他快速检测到吗? ...

我摸索出来的经验是用VLC播放器通过蓝牙播放音乐,一小会儿就能显示出来,但不知道对你是否适用哈
另外就是确认蓝牙已经连接的情况下,重启HA也能快速让蓝牙音箱显示出来,不过这方法比较Low

回复

使用道具 举报

10

主题

1381

帖子

4407

积分

论坛元老

Rank: 8Rank: 8

积分
4407
金钱
3026
HASS币
0
发表于 2022-11-16 22:09:20 | 显示全部楼层
cjnt007 发表于 2022-11-16 17:08
我摸索出来的经验是用VLC播放器通过蓝牙播放音乐,一小会儿就能显示出来,但不知道对你是否适用哈
另外就 ...

我用的mpd,就是蓝牙播放器不出来的话,没办法用蓝牙播放器出声,我估计supervisor里哪个pulseaudio服务需要重启。
回复

使用道具 举报

3

主题

23

帖子

344

积分

中级会员

Rank: 3Rank: 3

积分
344
金钱
321
HASS币
0
发表于 2022-11-17 14:22:16 | 显示全部楼层
学习一下
回复

使用道具 举报

20

主题

485

帖子

3206

积分

论坛元老

Rank: 8Rank: 8

积分
3206
金钱
2721
HASS币
8
 楼主| 发表于 2022-11-17 16:19:31 | 显示全部楼层
隔壁的王叔叔 发表于 2022-11-16 22:09
我用的mpd,就是蓝牙播放器不出来的话,没办法用蓝牙播放器出声,我估计supervisor里哪个pulseaudio服务 ...

我看到ha命令集里有ha audio restart命令,功能描述为Restarts the internal Home Assistant Audio
,你试试看用它能不能解决问题
回复

使用道具 举报

10

主题

1381

帖子

4407

积分

论坛元老

Rank: 8Rank: 8

积分
4407
金钱
3026
HASS币
0
发表于 2022-11-17 16:34:05 | 显示全部楼层
恩,可以试试,好像是说主机的音频被 hassio_audio
这个接管了,重启这个命令不知道联动不
回复

使用道具 举报

20

主题

485

帖子

3206

积分

论坛元老

Rank: 8Rank: 8

积分
3206
金钱
2721
HASS币
8
 楼主| 发表于 2022-11-25 20:37:18 | 显示全部楼层
本帖最后由 cjnt007 于 2022-11-25 21:07 编辑

今天完美解决了@隔壁的王叔叔 提出的蓝牙连接后HA无法快速更新声卡状态的问题,解决过程同大家分享下。

在使用过程中我们发现,当蓝牙音箱与盒子连接或断开后,HA要过好长时间才能更新声卡状态,其实系统是即时更新的,只是我们之前所使用的检测方法不对路,只要运行pactl list sinks这个命令,就可以查看到HA当前所有的声卡信息。

但这个命令运行环境有讲究,如果是通过加载项的web ssh运行,没有问题。登录到hassio_audio容器里运行也没有问题。但在command line的环境运行,亦或ssh到armbian里运行都不行。
我解决的思路是在command line下ssh到armbian,再进入到hassio_audio容器里运行,具体方案如下:

为避免命令行里引号多重嵌套的问题,需要先编写一个脚本listsoundcard.sh保存到armbian的/root下
#!/bin/bash
docker exec hassio_audio bash -c "pactl list sinks | grep -Eo 'Description: .+' "
赋予运行权限:
chmod +x /root/listsoundcard.sh
然后测试下运行结果是否正常:
# root @ cm311-1a in ~ [19:59:45]
$ /root/listsoundcard.sh
Description: Built-in Audio Stereo
Description: 小爱音箱-4400
如上,连接了蓝牙音箱后,输出了两个声卡,这就没有问题。如果断开蓝牙连接,小爱音箱-4400这个声卡就不会出现。

接下来就简单了,把configuration.yaml中声卡实体配置修改如下:
sensor:
  - platform: command_line
    name: soundcard
    command: "ssh -o UserKnownHostsFile=/config/ssh/known_hosts -o StrictHostKeyChecking=no -o PubkeyAcceptedKeyTypes=+ssh-rsa -i /config/ssh/id_rsa_cm311 [email protected] './listsoundcard.sh'"
    value_template: '{{ value | replace("Description: ", "")}}'
    scan_interval: 5



注意command中的IP地址及/config/ssh/id_rsa_cm311这段要修改为自己。
保存重启下ha,大功告成!





回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-24 07:18 , Processed in 0.179723 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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