用小爱音箱轻松播放NAS电影搭配HomeAssistant

output

前言: 前期的项目,感觉成了系统集成, HomeAssistant采用python3.13目前有很多新玩法, 在web上就能实现复杂的脚本控制. 定制起来很灵活方便,有了智能家居该有的样子.  不限品牌不限场合,一个开发板,也能搞定所有,以下就从 声控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, 完成后需要重启.

2. 安装小米三方控件

在HACS里,搜索xiaomi,找到

Xiaomi Miot Auto现在改名叫Hass Xiaomi Miot. 里面的安装介绍很详尽.

按照说明添加

这里介绍我趟过的坑,就是国外版本,安装依赖github.部分地区访问受限, xiaomi miot auto,有时会提供国内安装的低版本的指令,安装后界面不是这样的.剩下的就是配置问题了.

3. 安装 universal remote  card

4. 电视或者盒子

开启调试模式adb,安装vlc 或者其他播放软件,测试使用adb指令 播放网络地址,

三、详细设置

  1. 在,Nas,的docker配置中,加入本地电影的文件夹映射, 容器内的地址 /media/你自定义名字. 这样就能从首页->媒体->mymedia看到这个路径了.

  2. 打开电视机的DLNA,在设备里会发现提示找到新设备,点添加,如果没有可以按照AirReceiver,或其他的类似软件. (VLC播放器可能也需要,看情况,三个音轨的,有时dlna无法切换,最好多试几个dlna)

  3. 打开设置,这里选择添加自动化我提供一个单个影片的演示

    新建,选择触发条件-实体,[小爱Pro 播放控制 conversation]-状态[content],-变为-[如电视开心超人]

    动作,选择 播放器, [你的dlna设备] ,内容-[+]打开媒体找到开心超人.

搜索播放的实现

为了实现搜索功能,没有去找现成的文章,分步骤如下解决:

1. 提取搜电视的语音指令,触发执行

触发设定和开心超人那个一致, 变为[开心超人] 这里留空,用了得到所有变动.

下面的如果,条件条件,位模板内容:

{% set content = state_attr('sensor.xiaomi_lx06_b0e7_conversation', 'content') %}

{{ "搜电视" in content }}

右上角可以测试,这个地方耗费了我两小时.关键词jinjia2模板.因为content保留最后一条,所以随便测试,重启时会激活几次指令,目前没有解决

2.查找接口,取得搜索关键词返回的影片地址列表,

给出一个全文演示,可用根据语音 [搜电视黑猫] 处理查找并生成结果事件

完整代码 自动化yaml

id: '1742354353776'
alias: VK-xiaoshelll
description: ''
triggers:
  - trigger: state
    entity_id:
      - sensor.xiaomi_lx06_b0e7_conversation
    attribute: content
    for:
      hours: 0
      minutes: 0
      seconds: 2
conditions:
  - condition: template
    value_template: >-
      {% set content = state_attr('sensor.xiaomi_lx06_b0e7_conversation',
      'content') %} {{ "搜电视" in content  }} 
  - condition: template
    value_template: >-
      {{ state_attr('sensor.xiaomi_lx06_b0e7_conversation', 'content') | length
      >4 }}
actions:
  - action: shell_command.fdme
    metadata: {}
    data:
      name: >-
        {{ state_attr('sensor.xiaomi_lx06_b0e7_conversation',   
        'content').replace('搜电视','')  }}
    response_variable: stdout
  - if:
      - condition: template
        value_template: '{{   stdout.stdout | length >0}} '
    then:
      - event: getstdout
        event_data:
          name: |-
            {{ stdout.stdout.split('
            ')[0].replace('/media/电影','') }}
  - event: getstdoutdebug
    event_data:
      name: '{{stdout.stdout}}'
mode: single

我的查找方式,一开始是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,本身在一个领域.可以共享变量. 而且需要在运行时共享. 所以建议,用手工事件,触发输入和输出,在开发者工具中,的事件进行调试

细节先介绍到这里,

以下就是完整的 处理getstdout , 搜索结果的组动画yaml

id: '1742244536430'
alias: VKalist
description: ''
triggers:
  - trigger: event
    event_type: getstdout
conditions: []
actions:
  - action: rest_command.example_request
    response_variable: apimy
    data:
      baseurl: http://192.168.11.1:5244/api/fs/get?path=
      name: '{{ trigger.event.data.name}} '
  - action: persistent_notification.create
    metadata: {}
    data:
      title: Vkalist-getstdout
      message: '{{ trigger.event.data.name }}{{ apimy.content.data.raw_url }}'
  - action: xiaomi_miot.intelligent_speaker
    metadata: {}
    data:
      silent: false
      entity_id: media_player.xiaomi_lx06_b0e7_play_control
      text: “欣赏观看 {{ trigger.event.data.name }}”
      execute: false
  - action: remote.send_command
    metadata: {}
    data:
      num_repeats: 1
      delay_secs: 0.4
      hold_secs: 0
      command: >-
        am start   vlc://{% set endurl = apimy.content.data.raw_url   %}{{
        endurl }}
    target:
      device_id: 43acdc7f5295aefcf8c7f183f96ea69d
    enabled: true
  - event: myapi
    event_data:
      cmd: >-
        am start   vlc://{% set endurl = apimy.content.data.raw_url   %}{{
        endurl }}
mode: single

最后在小爱APP,个人训练里,把搜电视,切换成静音,定制应答,根据需要调节红外遥控,打开电视,或者机顶盒,

总体感觉是,如果没有整体学习homeassistant,只靠AI问答. 有点弯路太多的意思.

接收监听的自动化:更新指令开始词,"看" 这会激活小爱的很多回答,基本都是无用的,关闭她找到的内容.  然后搜素 本地NAS,若没有,提示换个说法.

id: '1742354353776'
alias: VK-xiaoshelll
description: ''
triggers:
  - trigger: state
    entity_id:
      - sensor.xiaomi_lx06_b0e7_conversation
    attribute: content
    for:
      hours: 0
      minutes: 0
      seconds: 2
conditions:
  - condition: template
    value_template: |-
      {{ state_attr('sensor.xiaomi_lx06_b0e7_conversation',   
          'content')[:1] =="看" and state_attr('sensor.xiaomi_lx06_b0e7_conversation',   
          'content') | length >2 }}
actions:
  - action: xiaomi_miot.intelligent_speaker
    metadata: {}
    data:
      execute: true
      entity_id: media_player.xiaomi_lx06_b0e7_play_control
      silent: false
      text: 退下
  - action: shell_command.fdme
    metadata: {}
    data:
      name: >-
        {{ state_attr('sensor.xiaomi_lx06_b0e7_conversation',   
        'content')[1:-2]~state_attr('sensor.xiaomi_lx06_b0e7_conversation',   
        'content')[-2:].replace('一','1').replace('二','2').replace('三','3').replace('四','4').replace('五','5')
        .replace('六','6') .replace('七','7') .replace('八','8') .replace('九','9')
        .replace('零','0') }}
    response_variable: stdout
  - if:
      - condition: template
        value_template: '{{   stdout.stdout | length >0}} '
    then:
      - event: getstdout
        event_data:
          name: |-
            {{ stdout.stdout.split('
            ')[0].replace('/media/电影','') }}
    else:
      - action: xiaomi_miot.intelligent_speaker
        metadata: {}
        data:
          silent: false
          entity_id: media_player.xiaomi_lx06_b0e7_play_control
          text: 没找到呢? 换个说法试试吧,
  - event: getstdoutdebug
    event_data:
      name: '{{stdout.stdout}}'
mode: single

四. 打造个性化的家庭娱乐中心

本案例是私有部署,所以几乎不担心泄露,加强了观影感受.更随意,不用切换遥控,小爱同学与 Home Assistant 的结合代表了智能家居发展的新趋势,为用户提供了更加开放、灵活和智能的家居解决方案。随着技术的不断进步和生态的不断完善,这种结合有望在未来实现更加丰富和人性化的智能生活体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjcroom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值