首頁 › 使用指南 › 居家自動化 › 儀表板
Home Assistant · 逐步教學

約一小時打造這個 Home Assistant 儀表板

十個步驟、每張卡片的 YAML,以及可一次貼上的完整檢視。在真實的 Marantz CINEMA 30 上打造並拍攝。只要改兩個字串,就是您專屬的儀表板。

完成的儀表板:播放中主視覺、附 dB 預設值的音量、訊源格狀選單、環繞模式、房間校正、情境與音量圖表
您將打造的內容
趕時間嗎?直接跳到步驟 10,下載完整檢視,改兩個字串後貼上即可。中間的步驟會說明每個部分的作用,方便您自行修改。

開始之前

這個儀表板由兩個來源提供資料,下面每個步驟都會用到兩者的差異。

來源提供
AVR Maestro 同步的腳本所有控制項。輸入、環繞模式、Audyssey、Dirac、Smart Select、預設值、亮度、ECO 模式,以及您的情境。
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. 新增檢視,並選擇區段版面。不要選 Masonry。區段版面才能在手機上正確重新排列。
  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

group_by 搭配 fill: last 會把零散的事件變成連續的線。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 陣列與兩個格式化器陣列。索引 0 請保留為「其他」。

圖表座標軸需要數字,所以 transform 會把每個訊源名稱對應到一個位置,格式化器再把它對應回來,用於標籤與提示框。請讓對應完整:null(接收器關機)會保持為空白,而不在您清單內的項目則歸入「其他」,因此兩者絕不會被混淆。同一張卡片搭配 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 找到的自己的 ID,或刪除情境區段,再依步驟 8 重新建立。
還有兩件事要預期。訊源與環繞圖表帶有打造此範例所用接收器的訊源名稱,請依步驟 9 的說明編輯那些陣列。此外,磚上的標籤是英文,檔案中沒有任何內容經過翻譯。

如果某個磚一直不亮

在懷疑是自己做錯之前:有些磚本來就無法亮起,知道是哪些很有用。

磚只有在 Home Assistant 讀得到狀態時才能顯示,而它從兩個地方讀取您的接收器。Denon AVR 整合會在媒體播放器實體上發布基本資訊。其餘由 AVR Maestro 發布:它會建立一個狀態橋接感測器 sensor.avr_maestro_your_receiver,並把它已掌握的讀數以屬性的形式寫入其中。

在媒體播放器實體上在狀態橋接感測器上
電源Audyssey MultEQ 曲線
已選訊源Dynamic Volume 與參考音量
環繞模式目前載入的 Dirac 槽位
音量與靜音前面板亮度、ECO 模式
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 槽位、亮度、ECO 模式與喇叭預設並不會由 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 位址為腳本命名,這樣重新命名時會更新同一個腳本,而不會產生分支。您的 ID 會是 script.avr_maestro_ 加上您自己的十二個字元,再接上控制項名稱。請在 Home Assistant 中開啟「開發者工具」再進入「狀態」,並以 avr_maestro 篩選,即可看到您自己的清單。
指南的更多內容

其他 AVR Maestro 指南

開始使用 · 主畫面 · 場景 · 自訂圖示 · 音效 · 圖形等化器 · 喇叭 · 控制項為何被鎖定 · 助理 · 居家自動化 · 分區 · 遙控器 · 廣播 (FM/AM) · 螢幕顯示 · 設定 · 語言 · 音量控制項 · 備份 & 還原 · 正在播放 & HEOS

您的整台接收器,盡在一面牆上

居家自動化是 AVR Maestro 中唯一的付費解鎖項目。其他一切,包括裝置端 AI 助理,都已包含在內。

在 Google Play 取得 在 App Store 下載 在 Mac App Store 下載 在 Microsoft Store 取得

返回居家自動化 → · 完整使用指南 →