이 대시보드에는 두 가지 소스가 쓰이며, 아래 모든 단계에서 그 차이가 중요합니다.
| 출처 | 제공하는 것 |
|---|---|
| AVR Maestro가 동기화한 스크립트 | 모든 제어 항목. 입력, 서라운드 모드, Audyssey, Dirac, Smart Select, 프리셋, 디머, 절전, 내 장면까지. |
| Denon AVR 통합의 미디어 플레이어 엔티티 | 실시간 상태. 전원, 선택된 소스, 서라운드 모드, 볼륨, 음소거. |
네 개 모두 기본 HACS 스토어에 있습니다. Home Assistant에서 HACS › 프런트엔드 › 탐색 & 저장소 다운로드로 이동해 이름을 검색하고 다운로드한 다음 브라우저를 새로 고치세요.
| 검색어 | 용도 | 설치하지 않으면 |
|---|---|---|
| Mushroom | 모든 제어 타일과 볼륨 슬라이더 | 일반 button 카드를 사용하세요. 동작은 하지만 모양이 더 각져 보입니다. |
| button-card | 실시간 라벨이 있는 섹션 헤더 | markdown 카드나 일반 제목을 사용하세요. |
| card-mod | 색상과 활성 타일의 점등 상태 | 모든 기능은 그대로 작동합니다. 다만 불이 들어오지 않습니다. |
| apexcharts-card | 기록 그래프 | 내장 history-graph 카드를 사용하세요. |
이 페이지의 모든 코드 조각에는 자리 표시자 두 개가 쓰입니다. 내 값을 한 번만 찾아 두면 나머지는 복사해서 붙여 넣기만 하면 됩니다.
media_player.your_receiver → 설정 › 기기 & 서비스 › 내 리시버 › 미디어 플레이어 엔티티. 예를 들면 media_player.marantz_cinema_30 같은 형태입니다.script.avr_maestro_MAC_... → 개발자 도구 › 상태에서 엔티티 필터에 avr_maestro를 입력하세요. 전체 컨트롤 목록이 나타납니다.모든 스크립트 ID의 가운데 부분은 리시버의 MAC 주소로, 영문 소문자 12자이며 모든 스크립트에서 같습니다. 한 번만 복사해 두세요. 이 페이지에서 MAC이라고 쓰인 모든 곳에 내 값을 넣으면 됩니다.
unavailable가 들어간 항목은 무시하세요. 예전 빌드는 MAC 주소 대신 리시버 이름을 따라 스크립트 이름을 지었습니다. 그 시절에 동기화했다면 예전 항목이 아직 목록에 남아 있지만 작동하지 않습니다. 실제로 쓰이는 것은 MAC 주소로 이름 지어진 항목입니다.여기서부터 모든 단계는 같습니다. 섹션을 추가하고 그 안에 카드를 붙여 넣으면 됩니다. 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
복잡한 것을 만들기 전에 엔티티 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단계로 돌아가세요.
꼭 익혀 둘 만한 패턴이며, 보드 위의 모든 소스 타일과 서라운드 타일은 이 패턴의 복사본입니다. 카드는 스크립트를 보내고 리시버 엔티티의 값에 따라 스스로 색을 바꾸므로, 지금 선택된 입력에만 불이 들어오고 나머지는 꺼져 있습니다.

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_list와 sound_mode_list 속성을 확인합니다. 그것이 정확한 문자열입니다. 위 예시처럼 소문자로 비교하세요.Xbox로 보고되지만, AVR Maestro의 제어 항목은 여전히 input_game1라고 불립니다. 스크립트 이름이 아니라 리시버가 보고하는 값을 기준으로 맞추세요.서라운드 모드는 source 대신 sound_mode을 쓰는 것만 다른, 같은 카드입니다.
평범한 제목은 낭비되는 공간입니다. 그 아래에 실시간 값을 넣으면 "소스"가 "소스 / 현재 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
2줄 그리드 덕분에 라벨이 제목 옆이 아니라 아래에 놓입니다.
서라운드 헤더에서는 attributes.source을 attributes.sound_mode로 바꾸는 식으로 적용하세요.
Home Assistant는 볼륨을 분수로 보고합니다. 리시버를 "0.67"로 맞추는 사람은 없습니다. 계산식 한 줄이면 해결되고, 섹션 전체가 리시버처럼 읽히기 시작합니다.

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
이름을 직접 입력하지 말고 스크립트에서 읽어 오세요. 그러면 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() 호출 두 개는 표시 이름에서 접두사와 리시버 이름을 잘라 냅니다.
두 번째 줄은 1분을 더 들일 가치가 있습니다. 거창한 이름의 버튼이 줄지어 있어도 밤 11시에는 아무 정보도 주지 못하지만, 각 버튼이 무엇을 복원하는지 적힌 한 줄이 있으면 무엇을 눌러야 할지 알 수 있습니다.
리시버의 미디어 플레이어 엔티티는 다른 엔티티와 마찬가지로 Home Assistant에 기록되므로 청취 기록을 공짜로 얻을 수 있습니다. 아래 내용은 모두 이 엔티티 하나에서 나옵니다. 추가 센서도, 헬퍼도, 미리 설정할 것도 없습니다.

기본 상태 타임라인은 커스텀 카드가 전혀 필요 없고, 가장 갖춰 둘 만한 그래프입니다.
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'; }"
같은 속성에서 뽑은 두 시리즈를 일 단위로 묶습니다.
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이 각 소스 이름을 위치로 바꾸고, formatter가 라벨과 툴팁용으로 다시 이름으로 되돌립니다. 매핑은 빠짐없이 만드세요. null(리시버 꺼짐)은 공백으로 남고, 목록에 없는 것은 모두 "Other"로 분류되므로 둘이 헷갈릴 일이 없습니다. 같은 카드에서 sound_mode를 쓰면 서라운드 모드가 되며, 이때 문자열은 리시버가 보고하는 그대로 대문자로 적습니다.
stepline을 유지하세요. 소스나 서라운드 모드는 숫자가 아니라 범주입니다. 곡선을 부드럽게 만들면 선이 Shield와 Xbox 사이를 오가며 축에서 둘 사이에 놓인 모든 항목을 지나가게 되어, 한 번도 선택된 적 없는 입력이 그려집니다. 볼륨은 실제 수량이라 부드럽게 해도 정직하지만, 범주는 그렇지 않습니다.state_class: measurement 템플릿 센서가 필요하며, Home Assistant는 이를 장기 통계로 수년간 보관합니다.모든 섹션과 모든 카드를 담은 완성된 뷰입니다. 엔티티 ID 자리에는 자리 표시자가 들어 있습니다.
YOUR_RECEIVER은 내 미디어 플레이어 엔티티 이름으로, YOURMAC은 2단계에서 확인한 내 리시버의 12자로 바꿉니다.잘못 만들었다고 생각하기 전에 확인하세요. 일부는 원래 불이 들어올 수 없으며, 어떤 것이 그런지 알아 둘 가치가 있습니다.
타일은 Home Assistant가 상태를 읽을 수 있어야만 그 상태를 표시할 수 있으며, Home Assistant는 두 곳에서 리시버를 읽습니다. Denon AVR 통합은 미디어 플레이어 엔티티에 기본 항목을 공개합니다. 나머지는 AVR Maestro가 공개합니다. Status Bridge 센서 sensor.avr_maestro_your_receiver를 만들고, 앱이 이미 가지고 있는 값을 속성으로 기록합니다.
| 미디어 플레이어 엔티티 | Status Bridge 센서 |
|---|---|
| 전원 | Audyssey MultEQ 곡선 |
| 선택된 소스 | Dynamic Volume과 레퍼런스 레벨 |
| 서라운드 모드 | 로드된 Dirac 슬롯 |
| 볼륨과 음소거 | 전면 패널 디머, 절전 모드 |
| Dynamic EQ (경우에 따라) | 스피커 프리셋, 톤, 그 밖의 수십 가지 |
이제 두 열 모두 읽을 수 있습니다. 미디어 플레이어 값은 states['media_player.your_receiver'].attributes에서, Status Bridge 값은 state_attr('sensor.avr_maestro_your_receiver','dirac_slot')로 가져오세요. 그러면 타일이 스크립트를 실행하기만 하는 것이 아니라 실제로 활성화된 설정에 맞춰 불이 들어옵니다.
이 대시보드를 만든 리시버에서 측정한 결과, 미디어 플레이어 엔티티는 제어 항목 60개 중 약 20개를 담고 있고 Status Bridge 센서가 약 40개를 더 공개합니다. 둘을 합치면 대시보드가 바꿀 수 있는 거의 모든 것을 읽을 수 있습니다. 버튼의 벽과 컨트롤 서피스의 차이가 바로 여기에 있습니다.
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 %}
두 가지가 아니라 세 가지 상태입니다.
grid_options: {columns: 9}으로 설정하세요. 여섯 개라면 6입니다.on_off이 들어 있는 media_controls 때문입니다. media_controls: []로 설정하세요.multiline_secondary: true를 추가하세요.experimental.color_threshold 때문입니다. 선을 세로 그라데이션으로 그리는데, 완전히 수평인 구간은 그라데이션을 적용할 높이가 0이어서 보이지 않게 렌더링됩니다. 같은 볼륨으로 43시간 동안 이어진 세션이 통째로 사라진 적도 있습니다. 단색 color을 사용하세요.
시작하기 · 홈 화면 · 장면 · 사용자 지정 아이콘 · 사운드 · 그래픽 EQ · 스피커 · 컨트롤이 잠겨 있는 이유 · 어시스턴트 · 홈 오토메이션 · 존 · 리모컨 · 라디오 (FM/AM) · 온스크린 디스플레이 · 설정 · 언어 · 볼륨 제어 · 백업 & 복원 · 지금 재생 중 & HEOS
홈 오토메이션은 AVR Maestro에서 유일한 유료 잠금 해제 항목입니다. 기기 내 AI 어시스턴트를 포함한 나머지는 모두 기본으로 제공됩니다.