用小爱音箱轻松播放NAS电影-搭配HomeAssistant
一、小爱音箱:不仅仅是音箱
NAS是个可玩性挺高的东西,这玩意搭配小爱音箱,可定义空间还是挺大的,在我眼里的著名项目,mi-GPT,xiao-music,分别达到了聊天AI,和音乐本地欣赏的目的,其中xiao-music,添加了自定义音控网页播放器功能,让音源闲置手机笔记本外接3.5音箱或者蓝牙音箱不自由听歌.听歌的尝试
接下来详细介绍,语音控制怎么让电视看任意一部NAS的电影.
二、语音指令,让电视播放更简单
实现起来挺简单,不外乎顶顶有名的HomeAssistant,可以按照目前2025的更新进度,AI deepseek,也无法提供可行的,顺利跑起来的准确信息.
1. 安装HomeAssistant和依赖,环境群晖7以上,docker容器22以上
,要把docker的安装源,指向阿里国内地址,
需要改/var/packages/Docker/etc/dockerd.json 或 /var/packages/ContainerManager/etc/dockerd.json, 在界面改设置以我来看没有生效过.
cat /var/packages/Docker/etc/dockerd.json
{ "data-root" : "/var/packages/Docker/var/docker", "experimental" : false, "features" : { "containerd-snapshotter" : true }, "log-driver" : "db", "registry-mirrors" : [ "https://docker.hpcloud.cloud", "https://docker.m.daocloud.io", "https://docker.unsee.tech", "https://docker.1panel.live", "http://mirrors.ustc.edu.cn", "https://docker.chenby.cn", "http://mirror.azure.cn", "https://dockerpull.org", "https://dockerhub.icu", "https://hub.rat.dev", "https://proxy.1panel.live", "https://docker.1panel.top", "https://docker.m.daocloud.io", "https://docker.1ms.run", "https://docker.ketches.cn" ], "storage-driver" : "btrfs" }
其次下载安装国内的HACN,
docker pull hacn/hacn:stable
docker run -d
--name homeassistant
--privileged
--restart=unless-stopped
-e TZ=Asia/Shanghai
-v /PATH_TO_YOUR_CONFIG:/config
-v /run/dbus:/run/dbus:ro
--network=host
hacn/hacn:stable
安装这个的目的是,在设置集成中打开HACS,软件市场, 注意端口默认, conf文件夹改为自己本地的地址我的是 /volumn2/docker/haca, host就行,这是关键 以上启动成功后, 进入页面 ip:8123,第一次定义用户名密码.,然后的设置里, 打开设备和集成,添加集成,搜HACS, 完成后需要重启.
在HACS里,搜索xiaomi,找到
Xiaomi Miot Auto现在改名叫Hass Xiaomi Miot. 里面的安装介绍很详尽.
按照说明添加



这里介绍我趟过的坑,就是国外版本,安装依赖github.部分地区访问受限, xiaomi miot auto,有时会提供国内安装的低版本的指令,安装后界面不是这样的.剩下的就是配置问题了.
三、详细设置
在,Nas,的docker配置中,加入本地电影的文件夹映射, 容器内的地址 /media/你自定义名字. 这样就能从首页->媒体->mymedia看到这个路径了.
打开电视机的DLNA,在设备里会发现提示找到新设备,点添加,如果没有可以按照AirReceiver,或其他的类似软件. (VLC播放器可能也需要,看情况,三个音轨的,有时dlna无法切换,最好多试几个dlna)
打开设置,这里选择添加自动化我提供一个单个影片的演示
新建,选择触发条件-实体,[小爱Pro 播放控制 conversation]-状态[content],-变为-[如电视开心超人]
动作,选择 播放器, [你的dlna设备] ,内容-[+]打开媒体找到开心超人.

搜索播放的实现
为了实现搜索功能,没有去找现成的文章,分步骤如下解决:
1. 提取搜电视的语音指令,触发执行
触发设定和开心超人那个一致, 变为[开心超人] 这里留空,用了得到所有变动.
下面的如果,条件条件,位模板内容:
{% set content = state_attr('sensor.xiaomi_lx06_b0e7_conversation', 'content') %}
{{ "搜电视" in content }}
右上角可以测试,这个地方耗费了我两小时.关键词jinjia2模板.因为content保留最后一条,所以随便测试,重启时会激活几次指令,目前没有解决

2.查找接口,取得搜索关键词返回的影片地址列表,
我的查找方式,一开始是python_scripte, 但是import os,还有import requests,都是禁止使用的.因为权限受限.虽然AI,反复说可以shell_command, 执行find指令.但是,我没那么做,我用了4个小时安装了fd指令就因为语法看着舒服. 完成了fd,安装, Alpine,的docker,看似,否则apt安装成了, 指令 apk add fd.开始的时候以为精简了包管理,差点找办法docker build, Dockerfile 自定义镜像加fd.
fd是多线程的Rust程序,我就爱它语法简洁.然后
定义configration.yaml里的shell_command
shell_command:
fdme: fd -e mp4 -e mkv -g {{name}} /media/电影 --exclude @eaDir
.在动作中使用,
action: shell_command.fdme
data: {
name: 黑猫
}
sdout: /media/电影/动画/黑猫鲁道夫.mp4
stderr: ""
returncode: 0
新建自定义自动化,选择手动触发事件 shelltest, 这里随便写.动作写, yaml格式
action: shell_command.fdme
metadata: {}
data:
name: "{{trigger.event.data.name}}"
response_variable: stdout
第二个动作,写手动触发事件yaml格式
event: getstdout
event_data:
data: "{{stdout.stdout}}"
然后在开发者工具打开事件, 上面 shelltest 数据
name: 开心
下面写getstdout, 点开始监听, 然后,上面点触发事件.
event_type: getstdout
data:
data: /media/电影/动画新/开心超人之英雄的心.mp4
origin: LOCAL
time_fired: "2025-03-18T19:34:51.527180+00:00"
context:
id: 01JPNC0TBX5PZBC83NASPZCEYC
parent_id: 01JPNC0TBWZ4EENDAA2HC6REJM
user_id: null

如此搜索功能就可以
第二个方案webhook的扩展,结合 rest_command实现查找功能.
这个是高级货需要python代码,各种调试,结合重启和日志查看.不再详述
3. 播放第一个地址dlna,或调用VLC 需搭配 Android Debug Bridger集成,
播放基本就是在自动化里完成的, 其中dlna在单个文件中,已经说过来. 这次的搜索结果n分割的多个文件, 可以做二次提示, 为了省事.我采用第一播放.剩下的忽略了. 这里就是监听查找的getstdout事件的自动化
action: media_player.play_media
target:
entity_id: media_player.101_dlna
data:
media_content_id: |-
media-source://media_source/local/{{ trigger.event.data.fd.split('
')[0].replace('/media/','') }}
media_content_type: video/mp4
为了使用VLC播放,需要安装 HACS->Universal Remote Card 这里面,会加入 Androd Debug Bridge集成, 在集成里添加它.初始化需要输入电视的ip和adb的端口. 电视机打开开发者模式,adb启动.
剩下的就是, 播放动作,从播放器,换成发送命令


vlc的播放地址是从 alist搞到的,者软件有个接口http://192.168.11.1:5244/api/fs/get?path=/影片地址.mkv 总之比dlna麻烦些. 应还有更好的办法.
接口这样调用在configration.yaml定义
rest_command:
example_request:
url: "{{baseurl}}{{name}}"
method: "GET"
在getstdout的事件响应, 连续定义两个动作, 也就是在指令之前定义接口获取
action: rest_command.example_request
response_variable: apimy
data:
baseurl: http://192.168.11.1:5244/api/fs/get?path=
name: {{ trigger.event.data.split('
')[0].replace('/media/','') }}
以上代码细节需调整, 感觉,更接近2025最新规范.因为 旧代码action后都有个service. ,而且像这种有 输出变量,总是强调,同一个action.其实,在目前版本.在一个自动化里定义的多个action,本身在一个领域.可以共享变量. 而且需要在运行时共享. 所以建议,用手工事件,触发输入和输出,在开发者工具中,的事件进行调试
细节先介绍到这里,
最后在小爱APP,个人训练里,把搜电视,切换成静音,定制应答,根据需要调节红外遥控,打开电视,或者机顶盒,
总体感觉是,如果没有整体学习homeassistant,只靠AI问答. 有点弯路太多的意思.
四. 打造个性化的家庭娱乐中心
本案例是私有部署,所以几乎不担心泄露,加强了观影感受.更随意,不用切换遥控,小爱同学与 Home Assistant 的结合代表了智能家居发展的新趋势,为用户提供了更加开放、灵活和智能的家居解决方案。随着技术的不断进步和生态的不断完善,这种结合有望在未来实现更加丰富和人性化的智能生活体验。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
