首页 › 用户指南 › 家庭自动化 › 仪表板
Home Assistant · 分步教程

约一小时打造这个 Home Assistant 仪表盘

十个步骤,每张卡片的 YAML,外加一份可一次性粘贴的完整视图。在真实的 Marantz CINEMA 30 上搭建并拍摄。改两个字符串,它就是你的了。

完成后的仪表盘:正在播放主视觉、带 dB 预设的音量、输入源网格、环绕声模式、房间校正、场景和音量曲线图
你将搭建的内容
赶时间?直接跳到第 10 步,下载完整视图,改两个字符串后粘贴即可。中间的步骤会解释每个部分的作用,方便你按需修改。

开始之前

这个仪表盘有两个数据来源,下面每一步都要区分清楚。

来源提供
AVR Maestro 同步的脚本所有控制项:输入源、环绕声模式、Audyssey、Dirac、Smart Select、预设、调光、节能、你的场景。
Denon AVR 集成的媒体播放器实体实时状态:电源、当前输入源、环绕声模式、音量、静音。
第 1 步

从 HACS 安装四张卡片

这四个都在 HACS 默认商店中。在 Home Assistant 中:HACS › 前端 › 探索 & 下载存储库,搜索名称,点击下载,然后刷新浏览器。

搜索用途如果跳过
Mushroom所有控制磁贴和音量滑块改用普通的 button 卡片。能用,只是外观更方正。
button-card带实时标签的分区标题改用 markdown 卡片,或普通标题。
card-mod配色,以及当前激活磁贴的点亮状态一切照常工作,只是没有任何点亮效果。
apexcharts-card历史曲线图改用内置的 history-graph 卡片。
它们都不是必需的。下面的每个控制项都可以用原生的 Home Assistant 按钮卡片指向同一个脚本来运行。自定义卡片只是化妆,不是管道。
第 2 步

找到你的两个实体 ID

本页的每段代码都用到两个占位符。先把你的找出来,剩下的就是复制粘贴。

每个脚本 ID 的中间部分都是接收机的 MAC 地址,十二个小写字符,所有脚本都相同。复制一次即可。本页中凡是写着 MAC 的地方,都换成你自己的。

忽略所有带有 unavailable 的项。旧版本是按接收机名称而不是 MAC 来命名脚本的。如果你当时同步过,这些旧脚本仍会列出,但已经失效。有效的是以 MAC 命名的那些。
第 3 步

创建视图

  1. 1. 设置 › 仪表盘 › 添加仪表盘 › 从头开始新建仪表盘。名称随你喜欢。
  2. 2. 打开它,然后点击右上角的铅笔图标进入编辑。
  3. 3. 添加一个视图,并选择分区布局,不要选瀑布流。分区布局才能让它在手机上正确重新排列。
  4. 4. 在视图设置中,将最大列数设为 3,并开启紧凑分区排布。

从现在起,每一步都是:添加一个分区,然后把卡片粘贴进去。粘贴 YAML 时,可使用卡片上的三点菜单并选择在 YAML 中编辑,也可使用仪表盘上的三点菜单,通过原始配置编辑器一次性粘贴全部内容。

# The view's own settings, if you prefer to type them
type: sections
title: AVR Maestro
icon: mdi:audio-video
max_columns: 3
dense_section_placement: true
第 4 步

添加一个控制项

先从面板上最简单的东西开始,这样在搭建任何复杂内容之前,你就能确认实体 ID 是否正确。添加一个分区,添加一张卡片,选择在 YAML 中编辑,然后粘贴:

type: button
name: Pure Direct
icon: mdi:speaker
tap_action:
  action: perform-action
  perform_action: script.turn_on
  target:
    entity_id: script.avr_maestro_MAC_mode_pure_direct

原生 Home Assistant,无需 HACS。

点一下它。如果接收机有反应,说明你的 ID 正确,下面的一切都能正常工作。如果没有反应,请回到第 2 步。

第 5 步

让当前生效的项自动点亮

这是最值得学会的模式,面板上每个输入源和环绕声磁贴都是它的副本。卡片负责发送脚本,并根据接收机实体给自己上色,这样你当前所在的输入源会亮起,其他的则保持暗色。

输入源网格:Nvidia Shield 以橙色点亮,其余十二个输入源为暗色
一个亮着的磁贴,十二个暗着的
type: custom:mushroom-template-card
entity: script.avr_maestro_MAC_input_cd
icon: mdi:disc
primary: CD
icon_color: >-
  {{ 'orange' if (state_attr('media_player.your_receiver','source') or '')|lower
     == 'cd' else 'grey' }}
layout: vertical
fill_container: true
tap_action:
  action: perform-action
  perform_action: script.turn_on
  target:
    entity_id: script.avr_maestro_MAC_input_cd
card_mod:
  style: |
    ha-card {
      border-radius: 14px;
    {% if (state_attr('media_player.your_receiver','source') or '')|lower == 'cd' %}
      background: linear-gradient(160deg, rgba(226,86,10,0.34), rgba(15,15,17,0.88));
      border: 1px solid rgba(255,122,24,0.80);
    {% else %}
      background: rgba(15,15,17,0.72);
      border: 1px solid rgba(255,122,24,0.14);
    {% endif %}
    }

每个输入源只需改三处:脚本、图标,以及用来比对的字符串。

有两点必须做对,否则磁贴永远不会亮:

环绕声模式是同样的卡片,只是把 source 换成 sound_mode。

第 6 步

为每个分区加上实时标题

单纯的标题是浪费空间。把实时数值放在标题下面,“输入源”就变成了“输入源 / 当前为 Nvidia Shield”。

type: custom:button-card
name: Sources
icon: mdi:video-input-hdmi
color_type: label-card
entity: media_player.your_receiver
show_label: true
label: >-
  [[[ var v = states["media_player.your_receiver"].attributes.source;
      return v ? ("Now on " + v) : "Receiver in standby"; ]]]
tap_action:
  action: none
styles:
  grid:
    - grid-template-areas: '"i n" "i l"'
    - grid-template-columns: min-content auto
  name:
    - font-size: 13px
    - letter-spacing: 3px
    - text-transform: uppercase
    - justify-self: start
  label:
    - font-size: 11px
    - justify-self: start

正是这个两行网格,让标签位于标题下方而不是旁边。

在环绕声标题上,把 attributes.source 换成 attributes.sound_mode,其余依此类推。

第 7 步

以 dB 显示音量

Home Assistant 把音量报告为一个小数。没有人会把接收机设为“0.67”。一行数学运算就能解决,整个音量分区读起来就像一台真正的接收机。

音量分区:一个滑块、调高、调低、静音和四个 dB 预设
夜间、对白、电影和高音量,每个都标有它所设定的 dB 值
换算方法。Home Assistant 把 volume_level 发布为主音量除以 100,而在 Denon 和 Marantz 接收机上,MV 80 是 0 dB 参考电平。因此 dB = volume_level × 100 − 80。volume_level 为 0.67 即主音量 67,也就是 −13.0 dB。
# The readout
type: custom:mushroom-template-card
entity: media_player.your_receiver
icon: mdi:volume-high
primary: >-
  {% set v = state_attr('media_player.your_receiver','volume_level') %}
  {% if v is not none %}{{ (v * 100 - 80) | round(1) }} dB{% else %}Standby{% endif %}
secondary: Master volume
layout: vertical
# The slider. media_controls must be empty or the bar becomes a power button
type: custom:mushroom-media-player-card
entity: media_player.your_receiver
volume_controls:
  - volume_set
media_controls: []
show_volume_level: true
# A preset. 0.50 is master volume 50, which is -30 dB
type: custom:mushroom-template-card
entity: media_player.your_receiver
icon: mdi:weather-night
primary: Night
secondary: "-30 dB"
tap_action:
  action: perform-action
  perform_action: media_player.volume_set
  target:
    entity_id: media_player.your_receiver
  data:
    volume_level: 0.50
请慎重选择你的最大音量预设。上面这一组止步于 −10 dB。仪表盘比遥控器更容易误触,而大型接收机上的参考电平确实非常响。
第 8 步

添加你的场景

从脚本中读取名称,而不是手动输入。这样在 AVR Maestro 中重命名场景时,磁贴也会随之更名,无需编辑仪表盘。

四个场景磁贴,每个都列出该场景所恢复的设置
每个磁贴都说明它的场景实际会恢复什么
type: custom:mushroom-template-card
entity: script.avr_maestro_MAC_scene_1234567890123
icon: mdi:theater
primary: >-
  {{ state_attr('script.avr_maestro_MAC_scene_1234567890123','friendly_name')
     | replace('AVR Maestro - ', '') | replace(' (Your Receiver)', '') }}
secondary: >-
  {% set t = states.script['avr_maestro_MAC_scene_1234567890123'].attributes.last_triggered %}
  {{ 'recalled ' ~ relative_time(t) ~ ' ago' if t else 'not run yet' }}
multiline_secondary: true
tap_action:
  action: perform-action
  perform_action: script.turn_on
  target:
    entity_id: script.avr_maestro_MAC_scene_1234567890123

两处 replace() 调用会从友好名称中去掉前缀和接收机名称。

多花一分钟加上第二行是值得的。一堵名字很有文艺范儿的按钮墙,在晚上11点什么也告诉不了你;而一行说明各按钮会恢复什么,就能让你知道该按哪一个。

第 9 步

添加历史记录

Home Assistant 会像记录其他实体一样记录接收机的媒体播放器实体,因此你可以免费获得收听历史。下面的一切都来自这一个实体:无需额外传感器,无需辅助实体,也无需先做任何配置。

五张历史图表:电源与活动、以 dB 计的主音量、按日统计的音量、使用的输入源和环绕声模式
五张图表,一个实体,七天

普通的状态时间线完全不需要自定义卡片,也是最值得拥有的一张:

type: history-graph
hours_to_show: 168
entities:
  - entity: media_player.your_receiver
    name: Receiver

开机、关机,以及这一周里它在做什么。

以 dB 计的音量使用与第 7 步相同的换算:

type: custom:apexcharts-card
graph_span: 7d
header:
  show: true
  title: Master volume, last 7 days
series:
  - entity: media_player.your_receiver
    attribute: volume_level
    name: Master volume
    type: line
    curve: smooth
    unit: dB
    float_precision: 1
    transform: "return x == null ? null : Number(x) * 100 - 80;"
    extend_to: now
    group_by:
      duration: 1h
      func: last
      fill: last
apex_config:
  chart:
    height: 240
  yaxis:
    min: -60
    max: 0

带 fill: last 的 group_by 会把零散的事件变成一条连续的线。y 轴必须写在 apex_config 中才会生效。

按日计算的平均值和峰值,会把起伏不定的线变得有形有状:

type: custom:apexcharts-card
graph_span: 7d
span:
  end: day
header:
  show: true
  title: Master volume by day in dB, average and peak
series:
  - entity: media_player.your_receiver
    attribute: volume_level
    name: Day average
    type: column
    float_precision: 1
    transform: "return x == null ? null : Number(x) * 100;"
    group_by: {duration: 1d, func: avg, fill: 'null'}
  - entity: media_player.your_receiver
    attribute: volume_level
    name: Day peak
    type: line
    curve: smooth
    float_precision: 1
    transform: "return x == null ? null : Number(x) * 100;"
    group_by: {duration: 1d, func: max, fill: 'null'}
apex_config:
  yaxis:
    min: 0
    max: 80
    labels:
      formatter: "EVAL:function (v) { return (v - 80).toFixed(0); }"
  tooltip:
    y:
      formatter: "EVAL:function (v) { return v == null ? '' : (v - 80).toFixed(1) + ' dB'; }"

同一个属性生成两个数据系列,按天分组。

为什么这张图按 0 到 80 绘制并格式化为 dB,而不是直接绘制 dB。柱状图从坐标轴底部向上生长。如果直接绘制 dB,每根柱子都会从 0 向下悬垂,柱子越长反而越安静,读起来是反的。绘制原始的主音量数值,并在坐标轴和提示框的格式化器中减去 80,柱子就会向上生长,而读者看到的仍然全是 dB。fill: 'null' 表示没有读数的一天不会出现柱子,而不是沿用前一天的数值。

还有两张用来回答“我平时到底用什么看,用什么模式看”:输入源和环绕声模式,以时间线的形式显示当时选中的是哪一个。

type: custom:apexcharts-card
graph_span: 7d
span:
  end: day
header:
  show: true
  title: Source in use, last 7 days
series:
  - entity: media_player.your_receiver
    attribute: source
    name: Source
    type: line
    curve: stepline
    stroke_width: 3
    extend_to: now
    float_precision: 0
    transform: |
      if (x == null) return null;
      var m = ["Phono", "NET", "Xbox", "Nvidia Shield"];
      var i = m.indexOf(x);
      return i < 0 ? 0 : i + 1;
apex_config:
  yaxis:
    min: 0
    max: 4
    tickAmount: 4
    labels:
      formatter: >-
        EVAL:function (v) { return ["Other", "Phono", "HEOS Net", "Xbox",
        "Shield"][Math.round(v)] || ''; }
  tooltip:
    y:
      formatter: >-
        EVAL:function (v) { return v == null ? 'off' : ["Other", "Phono",
        "HEOS Net", "Xbox", "Shield"][Math.round(v)] || 'Other'; }

把你自己的输入源放进 transform 数组和两个 formatter 数组中。索引 0 保持为“Other”。

图表坐标轴需要数字,所以 transform 把每个输入源名称映射到一个位置,格式化器再把它映射回来,用于标签和提示框。请让映射保持完整:null(接收机关机)保持为空白,而不在你列表中的任何项都归入“Other”,这样两者永远不会混淆。同样的卡片配上 sound_mode 就是环绕声模式,字符串须与接收机报告的完全一致,全部大写。

最后这两张请保留 stepline。输入源或环绕声模式是类别,不是数值。如果把曲线平滑,线条会在 Shield 和 Xbox 之间划过坐标轴上夹在它们中间的所有项,画出一个从未被选中的输入。音量是真实的量,平滑是诚实的;类别则不然。
请先检查你的 recorder 保留时长。Home Assistant 默认保留十天,所以七天差不多是你能有效查询的上限。想回溯更久,你需要一个 state_class: measurement 模板传感器,Home Assistant 会把它作为长期统计数据保存多年。
缺少某一天通常是正常的。Home Assistant 记录的是变化,而不是采样。如果接收机连续两天停留在同一个输入源、同一个音量,它就什么也不会写入,那一天自然没有柱子。看起来像数据丢失,其实恰恰相反:什么都没有发生。
第 10 步

或者直接拿走全部

完整视图,包含所有分区和所有卡片,其中的实体 ID 均为占位符。

  1. 1. 下载视图 YAML。
  2. 2. 用任意文本编辑器打开,并在所有出现的位置替换两个字符串:把 YOUR_RECEIVER 换成你的媒体播放器实体名称,把 YOURMAC 换成第 2 步中你接收机的十二个字符。
  3. 3. 在 Home Assistant 中打开你的仪表盘,点击铅笔图标和三点菜单,选择原始配置编辑器,并将其作为视图粘贴进去。
你的场景 ID 不会匹配。场景脚本以场景创建的时间命名,所以文件中的这四个在你的系统上并不存在:这些卡片会显示,但点了没有任何反应。请把它们的实体 ID 换成你在第 2 步中找到的,或者删除场景分区,用第 8 步重新搭建。
另外还有两点需要预期。输入源和环绕声图表带有搭建本示例所用接收机的输入源名称,因此请按第 9 步所述修改这些数组。此外,磁贴标签是英文的,文件中没有任何内容被翻译。

如果某个磁贴一直不亮

先别急着认为是自己搭错了:有些磁贴本来就无法点亮,了解是哪些很有必要。

磁贴只有在 Home Assistant 能读取状态时才能显示状态,而它从两个地方读取你的接收机。Denon AVR 集成在媒体播放器实体上发布基础信息。其余的由 AVR Maestro 发布:它会创建一个状态桥传感器 sensor.avr_maestro_your_receiver,并把它已掌握的读数作为属性写入其中。

在媒体播放器实体上在状态桥传感器上
电源Audyssey MultEQ 曲线
当前输入源Dynamic Volume 与参考电平
环绕声模式当前加载的是哪个 Dirac 插槽
音量与静音前面板调光、节能模式
Dynamic EQ,有时可用扬声器预设、音调,以及另外几十项

现在两栏都能读取了。媒体播放器的值取自 states['media_player.your_receiver'].attributes,状态桥的值取自 state_attr('sensor.avr_maestro_your_receiver','dirac_slot'),这样磁贴就会为当前真正生效的设置点亮,而不只是触发那个更改设置的脚本。

在搭建本示例所用的接收机上实测:媒体播放器实体承载了六十个控制项中的约二十个,状态桥传感器另外发布了大约四十个。两者合起来,仪表盘几乎能读取它能更改的一切,这就是一堵按钮墙与一个真正控制面板之间的区别。

如果一个值可能有两种含义,就要说明白。Dynamic EQ 的值可能是 true、false,也可能根本不出现。把“根本不出现”当作“关闭”,会把一个自信满满的错误答案挂在你的墙上。
icon_color: >-
  {% set d = state_attr('media_player.your_receiver','dynamic_eq') %}
  {{ 'orange' if d is true else 'grey' }}
secondary: >-
  {% set d = state_attr('media_player.your_receiver','dynamic_eq') %}
  {% if d is none %}state not published{% elif d %}on{% else %}off{% endif %}

三种状态,而不是两种。

其他值得了解的事

同一个仪表盘在手机宽度下重新排列为单列
同一个仪表盘在手机宽度下:三列变成一列,而且没有为此做任何配置
常见问题

仪表盘常见问题解答

搭建它需要 HACS 的自定义卡片吗?
要让它运行并不需要。本页上的每个控件都由普通的 Home Assistant 按钮卡片驱动。Mushroom、button-card、card-mod 和 apexcharts-card 只是让它呈现出截图中的外观,下面每个部分都会说明用到了哪一个,以及没有它会损失什么。
为什么有些按钮会亮起,有些不会?
当 Home Assistant 能从你的接收机读取到对应状态时,按钮就会亮起。输入源、环绕声模式、音量和静音都来自接收机自身的媒体播放器实体,所以这些会高亮。Audyssey 曲线、Dirac 插槽、调光、节能模式和扬声器预设并不由 Denon 集成发布,因此 Home Assistant 无从得知哪一个处于激活状态,这些按钮会保持不亮,直到你点按其中一个。
我可以显示真实的 dB 音量,而不是百分比吗?
是的。Home Assistant 发布的 volume_level 等于接收机主音量除以 100,而在 Denon 和 Marantz 接收机上,MV 80 就是 0 dB 参考电平。因此 dB 等于 volume_level 乘以 100 再减去 80。volume_level 为 0.67 即主音量 67,也就是 -13.0 dB。
我的实体 ID 会和本指南中的一致吗?
格式一致,中间部分不同。AVR Maestro 以接收机的 MAC 地址为脚本命名,这样重命名时会更新原有脚本,而不是另建一个。你的脚本会是 script.avr_maestro_ 加上你自己的十二个字符,再加上控制项名称。在 Home Assistant 中打开开发者工具,进入状态页,并用 avr_maestro 筛选,即可看到你自己的列表。
指南的更多内容

其他 AVR Maestro 指南

快速入门 · 主屏幕 · 场景 · 自定义图标 · 声音 · 图形 EQ · 扬声器 · 控制项为何被锁定 · 助手 · 家庭自动化 · 分区 · 遥控 · 收音机 (FM/AM) · 屏幕显示 · 设置 · 语言 · 音量控制 · 备份 & 恢复 · 正在播放 & HEOS

整台接收机,尽在一面墙上

家庭自动化是 AVR Maestro 中唯一的付费解锁项。其余所有功能,包括设备端 AI 助手,均已包含在内。

在 Google Play 获取 在 App Store 下载 在 Mac App Store 下载 在 Microsoft Store 获取

返回家庭自动化 → · 完整用户指南 →