Sonos

sonos 集成允许您从 Home Assistant 控制 Sonos 无线扬声器。它也适用于宜家 Symfonisk 扬声器。

配置

要将 Sonos integration 添加到您的 Home Assistant 实例中,请使用此 My 按钮:

Sonos 可以被 Home Assistant 自动发现。如果发现了实例, 它将显示为 已发现。您可以立即进行设置。

手动配置步骤

如果没有自动发现,请不要担心!您可以设置一个 手动集成条目:

功能控制和传感器

扬声器级别的控制以 numberswitch 实体的形式暴露。此外,还提供了各种 sensorbinary_sensor 实体。

可控功能

  • 所有设备:闹钟、低音、高音、响度、交叉淡化、状态灯、触控控制
  • 家庭影院设备:音频延迟(“唇同步”)、夜间模式、语音增强、环绕启用、环绕音乐全音量(“全音/环境”)、环绕级别(“电视级别”)、音乐环绕级别
  • 与低音炮配对时:低音炮启用、低音炮增益、低音炮分频频率(仅限 Sonos Amp)

传感器

  • 每个 Sonos 系统:Sonos 收藏夹
  • 带电池的设备:电池电量、电源状态
  • 家庭影院设备:音频输入格式
  • 支持语音的设备:麦克风启用

电池支持说明

电池传感器完全支持 S2 固件上的 Sonos RoamSonos Move 设备。仍在 S1 固件上的 Sonos Move 扬声器也受支持,但可能会不频繁更新。

对于每个带电池的扬声器,会创建一个显示当前电池电量的 sensor 和一个显示扬声器电源状态的 binary_sensorbinary_sensor 报告扬声器当前是否由外部电源供电,其 power_source 属性显示提供当前电源的具体来源。此源属性可以是 BATTERY、如果使用无线充电则为 SONOS_CHARGING_RING,如果通过 USB 电缆充电则为 USB_POWER。请注意,即使使用通用的 Qi 充电器,Roam 也会报告 SONOS_CHARGING_RING

Note

电池传感器依赖于工作变更事件,否则更新将被延迟。S1 电池传感器需要工作事件才能报告任何数据。请参阅高级使用中的更多详细信息。

闹钟支持说明

Sonos 集成为 Sonos 应用中设置的每个闹钟添加一个 switch。闹钟开关会自动检测、删除和分配,并带有多个属性,有助于监控 Sonos 闹钟。

麦克风支持说明

麦克风只能通过 Sonos 设备上的物理按钮启用/禁用,不能从 Home Assistant 控制。一个 binary_sensor 报告其当前状态。

Sonos 收藏夹支持说明

收藏夹传感器提供了在原生 Sonos 应用中保存到 My Sonos 的每个收藏夹的名称和 media_content_id 值。此传感器适用于需要在自定义模板中访问收藏夹的用户。对于大多数用户,建议使用媒体浏览器功能和“播放媒体”脚本/自动化操作来访问收藏夹。

调用 media_player.play_media 操作时,media_content_type 必须设置为 “favorite_item_id”,media_content_id 必须设置为收藏夹项目的键部分。

使用项目 ID 的示例操作:

action: media_player.play_media
target:
  entity_id: media_player.sonos_speaker1
data:
  media_content_type: "favorite_item_id"
  media_content_id: "FV:2/31"

使用 Sonos 播放列表名称的示例:

action: media_player.play_media
target:
  entity_id: media_player.sonos_speaker1
data:
  media_content_type: playlist
  media_content_id: stevie_wonder

示例模板:

# 获取所有收藏夹名称作为列表(旧行为)
{{ state_attr("sensor.sonos_favorites", "items").values() | list }}

# 按位置选择特定收藏夹名称
{{ (state_attr("sensor.sonos_favorites", "items").values() | list)[3] }}

# 随机选择一个项目的 `media_content_id`
{{ state_attr("sensor.sonos_favorites", "items") | list | random }}

# 循环遍历并获取名称和 media_content_id
{% for media_id, name in state_attr("sensor.sonos_favorites", "items").items() %}
  {{ name, media_id }}
{% endfor %}

Tip

Sonos 收藏夹传感器 (sensor.sonos_favorites) 默认禁用。可以在您的 Devices & services 页面上找到并启用与 Sonos 集成相关的实体。

播放媒体

Sonos 在 media_player.play_media 操作中接受多种 media_content_id 格式,但最常见的是 URI。例如,Spotify 和 Tidal 分享链接可以按原样提供。可以播放托管在 Plex 服务器上的音乐。如果 Sonos 设备可以直接访问 URI,则也可以使用指向本地或远程媒体文件的直接 HTTP/HTTPS 链接,但特定的媒体编码支持可能会有所不同。

需要帐户的音乐服务(例如 Spotify)必须首先使用 Sonos 应用进行配置。

通过设置 announce 参数,可以将 TTS(文本到语音)或音频文件作为警报(例如门铃或警报)播放。使用 announce 将以叠加方式播放提供的媒体 URL,轻轻降低当前音乐音量并在完成后自动恢复到原始级别。还可以在 extra 字典中提供可选的 volume 参数,以特定音量级别播放警报。请注意,较旧的 Sonos 硬件或旧版固件(“S1”)可能无法完全支持这些功能。此外,请参阅网络要求以在受限网络环境中使用。

可以向操作添加可选的 enqueue 参数。如果 replace 或未提供,则队列将被替换并且项目将被替换。如果 add,则项目将被追加到队列中。如果 next,则项目将被添加到队列中以便下一个播放。如果 play,则项目将被添加到队列中并立即播放。

示例:

以下是一个示例操作,使用 announce 功能及其相关的(可选)volume 参数,从本地网络上的 Web 服务器(如 Home Assistant 内置 Web 服务器)播放音频文件:

action: media_player.play_media
target:
  entity_id: media_player.sonos
data:
  announce: true
  media_content_type: "music"
  media_content_id: "http://192.168.1.50:8123/local/sound_files/doorbell-front.mp3"
  extra:
    volume: 20

标准的 tts.<source>_say 操作不直接接受 volume 参数。要为 TTS 公告设置 volume,可以使用 TTS 媒体源 URL 和标准的 media_player.play_media 操作:

action: media_player.play_media
target:
  entity_id: media_player.sonos
data:
  announce: true
  media_content_id: >
    media-source://tts/cloud?message="I am very loud"
  media_content_type: "music"
  extra:
    volume: 80

Sonos 还可以播放来自 Spotify 的音乐或播放列表。可以直接使用 Spotify URI 和 URL。使用播放列表 URI 的示例操作:

action: media_player.play_media
target:
  entity_id: media_player.sonos
data:
  media_content_type: "playlist"
  media_content_id: "spotify:playlist:abcdefghij0123456789XY"
  enqueue: true

使用 Spotify URL 的示例操作:

action: media_player.play_media
target:
  entity_id: media_player.sonos
data:
  media_content_type: "music"
  media_content_id: "https://open.spotify.com/album/abcdefghij0123456789YZ"

在家中运行 Plex Media Server?Sonos 集成也可以与之配合使用。此示例直接从您的 Plex 服务器播放音乐:

action: media_player.play_media
target:
  entity_id: media_player.sonos
data:
  media_content_type: "music"
  media_content_id: >
    plex://{ "library_name": "Music", "artist_name": "M83", "album_name": "Hurry Up, We're Dreaming" }

Sonos 音乐库

如果您已配置 Sonos 音乐库;您可以从中播放音乐。

播放 Beatles 的所有专辑。

action: media_player.play_media
target:
  entity_id: media_player.sonos
data:
  media_content_type: album
  media_content_id: A:ALBUMARTIST/Beatles

播放特定专辑:

action: media_player.play_media
target:
  entity_id: media_player.sonos
data:
  media_content_type: album
  media_content_id: A:ALBUM/The Wall
  enqueue: replace

或将特定艺术家的特定专辑添加到队列中。这在您有多个同名专辑的情况下非常有用。

action: media_player.play_media
target:
  entity_id: media_player.sonos      
data:
  media_content_type: album
  media_content_id: A:ALBUMARTIST/Neil Young/Greatest Hits
  enqueue: add

播放作曲家的所有专辑。

action: media_player.play_media
target:
  entity_id: media_player.porch
data:
  media_content_type: composer
  media_content_id: A:COMPOSER/Carlos Santana
  enqueue: play

播放某个流派的所有专辑。

action: media_player.play_media
target:
  entity_id: media_player.porch
data:
  media_content_type: genre
  media_content_id: "A:GENRE/Classic%20Rock/"
  enqueue: play

使用其标题播放导入的播放列表。

action: media_player.play_media
target:
  entity_id: media_player.porch
data:
  media_content_type: playlist
  media_content_id: S:/MyPlaylist
  enqueue: play

操作

Sonos 集成除了标准媒体播放器操作外,还提供了各种自定义操作。

操作 sonos.snapshot

拍摄一个或多个扬声器当前播放内容的快照。此操作和以下操作在您想要播放门铃或通知声音并在之后恢复播放时非常有用。

Note

队列不会被快照,必须保持不变直到恢复。使用 media_player.play_media 是安全的,可以用来播放通知声音,包括 TTS 公告。

数据属性 可选 描述
entity_id 要快照的扬声器。要针对所有 Sonos 设备,请使用 all
with_group 我们是否还应该快照组布局和组中其他扬声器的状态,默认为 true。

操作 sonos.restore

恢复先前拍摄的一个或多个扬声器的快照。

Note

播放队列不会被快照。对已替换其队列的扬声器使用 sonos.restore 将恢复播放位置,但在新队列中!

Note

无法重新启动云队列。这包括从 Spotify 内部启动的队列和由 Amazon Alexa 控制的队列。

数据属性 可选 描述
entity_id 应恢复其快照的 entity_id 字符串或列表。要针对所有 Sonos 设备,请使用 all
with_group 我们是否还应该恢复组布局和组中其他扬声器的状态,默认为 true。

操作 sonos.set_sleep_timer

设置一个计时器,在一定时间后通过将音量逐渐降低到 0 来关闭扬声器。专业提示:如果将 sleep_time 值设置为 0,则扬声器将立即开始逐渐降低音量。

数据属性 可选 描述
entity_id 将设置计时器的 entity_id 字符串或列表。
sleep_time 扬声器应等待的秒数,直到开始逐渐降低音量。不能超过 86399(一天)。

操作 sonos.clear_sleep_timer

清除扬声器上的睡眠计时器(如果有设置)。

数据属性 可选 描述
entity_id 将清除计时器的 entity_id 字符串或列表。必须是协调扬声器。

操作 sonos.update_alarm

更新现有的 Sonos 闹钟。

数据属性 可选 描述
entity_id 将清除计时器的 entity_id 字符串或列表。必须是协调扬声器。
alarm_id Sonos 中用于引用闹钟的整数。
time 设置闹钟的时间。
volume 音量级别的浮点数。
enabled 是否启用此闹钟的布尔值。
include_linked_zones 定义闹钟是否也在分组播放器上播放的布尔值。

操作 sonos.play_queue

开始播放 Sonos 队列。

强制开始播放队列,允许从另一个流(如广播)切换到播放队列。

数据属性 可选 描述
entity_id 将开始播放的 entity_id 字符串或列表。如果针对一个组,则必须是协调器。
queue_position 要开始播放的队列中歌曲的位置,从 0 开始。

操作 sonos.get_queue

返回 media_player 的队列。

数据属性 可选 描述
entity_id media_player 实体 ID。

此示例脚本执行以下操作:获取队列,反向循环遍历,并删除包含“holiday”字样的媒体。

  - action: sonos.get_queue
    target:
      entity_id: media_player.living_room
    response_variable: queue
  - variables:
      queue_len: '{{ queue["media_player.living_room"] | length }}'
  - repeat:
      sequence:
        - variables:
            title: '{{ queue["media_player.living_room"][queue_len - repeat.index]["media_title"].lower() }}'
            album: '{{ queue["media_player.living_room"][queue_len - repeat.index]["media_album_name"].lower() }}'
            position: '{{ queue_len - repeat.index }}'
        - if:
            - '{{ "holiday" in title or "holiday" in album }}'
          then:
            - action: sonos.remove_from_queue
              target:
                entity_id: media_player.living_room
              data:
                queue_position: '{{position}}'
      until:
        - condition: template
          value_template: '{{queue_len == repeat.index}}'

操作 sonos.remove_from_queue

从队列中删除一个项目。

数据属性 可选 描述
entity_id 将从队列中删除项目的 entity_id 字符串或列表。如果针对一个组,则必须是协调器。
queue_position 要删除的队列中的位置。
# 示例自动化,从队列中删除刚播放的歌曲
alias: "从队列中删除最后播放的歌曲"
triggers:
  - trigger: state
    entity_id: media_player.kitchen
  - trigger: state
    entity_id: media_player.bathroom
  - trigger: state
    entity_id: media_player.move
conditions:
  - condition: and
    conditions:
      # 协调器
      - condition: template
        value_template: >
          {{ state_attr( trigger.entity_id , 'group_members')[0] ==  trigger.entity_id }}
      # 从队列到队列
      - condition: template
        value_template: >
          {{ 'queue_position' in trigger.from_state.attributes and 'queue_position' in trigger.to_state.attributes }}
      # 向前移动
      - condition: template
        value_template: >
          {{ trigger.from_state.attributes.queue_position < trigger.to_state.attributes.queue_position }}
actions:
  - action: sonos.remove_from_queue
    target:
      entity_id: >
        {{ trigger.entity_id }}
    data:
      queue_position: >
        {{ trigger.from_state.attributes.queue_position }}

网络要求

为了最佳工作,Sonos 设备必须能够通过 TCP 端口 1400 连接回 Home Assistant 主机。这将允许基于推送的更新正常工作。如果此端口被阻止或无法从 Sonos 设备访问,集成将回退到轮询模式,该模式更新较慢且效率较低。如果检测到此问题,集成将提醒用户。

使用 announce 选项或 TTS 播放音频需要每个 Sonos 设备上的 TCP 端口 1443 可从 Home Assistant 主机访问。

请参阅下文的高级使用以获取在具有更复杂网络拓扑的设置中解决此问题的其他配置选项。

高级使用

对于高级用途,有一些手动配置选项可用。这些通常仅在您有复杂的网络设置且 Home Assistant 和 Sonos 不在同一子网时才需要。

您可以通过指定 Sonos IP 地址来禁用自动发现:

# 使用手动指定的 Sonos IP 地址的示例 configuration.yaml 条目
sonos:
  media_player:
    hosts:
      - 192.0.2.25
      - 192.0.2.26
      - 192.0.2.27

如果您的 Home Assistant 实例有多个 IP 地址,您可以选择应使用哪个特定 IP 地址进行 Sonos 自动发现。这仅在 Sonos 扬声器位于默认接口无法访问的网络段时才有必要。

Sonos 扬声器将尝试连接回 Home Assistant 以传递更改事件。默认情况下,Home Assistant 将监听端口 1400,但如果端口被占用,将尝试 1400 以上的下 100 个端口。如果不使用 Docker 选项 --net=host,您可以更改 Home Assistant 向 Sonos 扬声器广告的 IP 地址,这在 NAT 场景中很有帮助:

# 修改广告主机地址的示例 configuration.yaml 条目
sonos:
  media_player:
    advertise_addr: 192.0.2.1