Tio steg, YAML för varje kort och en komplett vy som du kan klistra in i ett svep. Byggd och fotograferad på en riktig Marantz CINEMA 30. Ändra två strängar så är den din.
Två saker matar den här dashboarden, och skillnaden spelar roll i varje steg nedan.
| Kommer från | Ger dig |
|---|---|
| AVR Maestros synkade skript | Varje kontroll. Ingångar, surroundlägen, Audyssey, Dirac, Smart Selects, förval, dimmer, eco, dina scener. |
| Mediaspelarentiteten från Denon AVR-integrationen | Live-status. Ström, vald källa, surroundläge, volym, ljud av. |
Alla fyra finns i HACS standardbutik. I Home Assistant: HACS › Frontend › Explore & Download Repositories, sök på namnet, välj Download och ladda sedan om webbläsaren.
| Sök efter | Används till | Om du hoppar över det |
|---|---|---|
| Mushroom | Varje kontrollbricka och volymreglaget | Använd ett vanligt button-kort. Fungerar, ser kantigare ut. |
| button-card | Sektionsrubriker med en live-etikett | Använd ett markdown-kort eller vanliga rubriker. |
| card-mod | Färgerna och det tända läget på den aktiva brickan | Allt fungerar fortfarande. Ingenting lyser. |
| apexcharts-card | Historikgraferna | Använd det inbyggda history-graph-kortet. |
Varje kodavsnitt på den här sidan använder två platshållare. Hitta dina en gång, så är resten bara kopiera och klistra in.
media_player.your_receiver → Inställningar › Enheter och tjänster › din mottagare › mediespelarentiteten. Något i stil med media_player.marantz_cinema_30.script.avr_maestro_MAC_... → Utvecklarverktyg › Tillstånd, och skriv avr_maestro i entitetsfiltret. Hela din kontrollista visas.Mitten av varje skript-ID är mottagarens MAC-adress, tolv gemena tecken, likadana på alla. Kopiera den en gång. Överallt där den här sidan skriver MAC, sätt in din egen.
unavailable. Äldre versioner döpte skripten efter mottagarens namn i stället för dess MAC-adress. Om du synkade då finns de äldre fortfarande kvar i listan och är döda. De som gäller är de MAC-namngivna.Härifrån och framåt är varje steg detsamma: lägg till en sektion och klistra sedan in kort i den. För att klistra in YAML använder du trepricksmenyn på ett kort och väljer Edit in YAML, eller trepricksmenyn på dashboarden för Raw configuration editor för att klistra in allt på en gång.
# 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
Börja med det enklaste på tavlan, så att du vet att dina entitets-ID:n stämmer innan du bygger något krångligt. Lägg till en sektion, lägg till ett kort, Edit in YAML och klistra in:
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
Vanliga Home Assistant. Ingen HACS behövs.
Tryck på den. Om mottagaren reagerar stämmer dina ID:n och allt nedan kommer att fungera. Om ingenting händer, gå tillbaka till steg 2.
Det här är mönstret värt att lära sig, och varje käll- och surroundbricka på tavlan är en kopia av det. Kortet skickar ett skript och färgar sig själv utifrån mottagarentiteten, så att ingången du faktiskt står på lyser och de andra inte gör det.

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 %}
}
Ändra tre saker per ingång: skriptet, ikonen och strängen den jämförs med.
Två saker måste bli rätt, annars lyser en bricka aldrig:
source_list och sound_mode_list. Det är de exakta strängarna. Jämför med gemener, som ovan.Xbox, medan AVR Maestro-kontrollen fortfarande heter input_game1. Matcha mot det mottagaren rapporterar, inte mot skriptnamnet.Surroundlägen är samma kort med sound_mode i stället för source.
En vanlig rubrik är bortkastad yta. Sätt det aktuella värdet under den så blir ”Källor” till ”Källor / Nu på 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
Rutnätet med två rader är det som placerar etiketten under rubriken i stället för bredvid.
Byt ut attributes.source mot attributes.sound_mode i Surround-rubriken, och så vidare.
Home Assistant rapporterar volymen som ett bråktal. Ingen ställer in en mottagare på ”0.67”. En rad matematik fixar det, och hela sektionen börjar kännas som en mottagare.

volume_level som huvudvolym delat med 100, och på Denon- och Marantz-mottagare är MV 80 referensen för 0 dB. Alltså dB = volume_level × 100 − 80. Ett volume_level på 0.67 motsvarar huvudvolym 67, vilket är −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
Läs namnet från skriptet i stället för att skriva det, så byter brickan namn utan någon dashboardändring när du byter namn på en scen i 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
De två replace()-anropen klipper bort prefixet och mottagarens namn från det visningsnamnet.
En andra rad är värd den extra minuten. En vägg av knappar med fantasifulla namn säger ingenting klockan 11 på kvällen; en rad som beskriver vad var och en återställer visar vilken du ska trycka på.
Mottagarens mediaspelarentitet registreras av Home Assistant som vilken annan som helst, så du får en lyssningshistorik på köpet. Allt nedan kommer från den enda entiteten: inga extra sensorer, inga hjälpare, ingenting att konfigurera först.

Den enkla tillståndstidslinjen kräver inga anpassade kort alls och är den som är mest värd att ha:
type: history-graph
hours_to_show: 168
entities:
- entity: media_player.your_receiver
name: Receiver
På, av och vad den höll på med, över en vecka.
Volym i dB använder samma omräkning som i steg 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 med fill: last förvandlar glesa händelser till en sammanhängande linje. Y-axeln måste läggas i apex_config för att gälla.
Ett dagligt medelvärde och en topp gör en taggig linje till något med form:
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'; }"
Två serier från samma attribut, grupperade per dag.
fill: 'null' betyder att en dag utan avläsningar får ingen stapel i stället för gårdagens värde framskrivet.Och de två som svarar på ”vad tittar jag egentligen på, och i vad”: källa och surroundläge, ritade som en tidslinje över vilket som var valt.
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'; }
Lägg in dina egna källor i transform-arrayen och i båda formaterar-arrayerna. Behåll index 0 som ”Övrigt”.
En diagramaxel behöver siffror, så transform mappar varje källnamn till en position och formateraren mappar tillbaka det för etiketterna och tooltipen. Gör mappningen total: null (mottagaren av) förblir ett glapp, och allt som inte finns i din lista hamnar under ”Övrigt”, så de två kan aldrig förväxlas. Samma kort igen med sound_mode ger dig surroundläge, med strängarna i versaler exakt som din mottagare rapporterar dem.
stepline på de två sista. En källa eller ett surroundläge är en kategori, inte ett tal. Släta ut kurvan och linjen svänger mellan Shield och Xbox genom allt som ligger mellan dem på axeln och ritar en ingång som aldrig var vald. Volym är en verklig storhet och kan slätas ut på ett ärligt sätt; en kategori kan det inte.state_class: measurement-mallsensor, som Home Assistant behåller som långtidsstatistik i flera år.Den kompletta vyn, varje sektion och varje kort, med platshållare i stället för entitets-ID:n.
YOUR_RECEIVER mot namnet på din mediaspelarentitet och YOURMAC mot mottagarens tolv tecken från steg 2.Innan du tror att du byggde fel: en del av dem kan inte lysa, och det är bra att veta vilka.
En bricka kan bara visa sitt läge om Home Assistant kan läsa det, och den läser din mottagare från två ställen. Denon AVR-integrationen publicerar grunderna på mediaspelarentiteten. AVR Maestro publicerar resten: den skapar en Status Bridge-sensor, sensor.avr_maestro_your_receiver, och skriver de avläsningar den redan har dit som attribut.
| På mediaspelarentiteten | På Status Bridge-sensorn |
|---|---|
| Ström | Audyssey MultEQ-kurva |
| Vald källa | Dynamic Volume och referensnivå |
| Surroundläge | Vilken Dirac-plats som är inläst |
| Volym och ljud av | Frontpanelsdimmer, Eco-läge |
| Dynamic EQ, ibland | Högtalarförval, ton och dussintals till |
Båda kolumnerna går att läsa nu. Hämta ett mediaspelarvärde från states['media_player.your_receiver'].attributes och ett Status Bridge-värde med state_attr('sensor.avr_maestro_your_receiver','dirac_slot'), så att en bricka lyser för den inställning som faktiskt är aktiv i stället för att bara köra skriptet som ändrar den.
Uppmätt på mottagaren som den här byggdes på: mediaspelarentiteten bär ungefär tjugo av de sextio kontrollerna, och Status Bridge-sensorn publicerar ungefär fyrtio till. Tillsammans kan en dashboard läsa nästan allt den kan ändra - skillnaden mellan en vägg av knappar och en kontrollyta.
true, false eller inte alls. Att behandla ”inte alls” som ”av” sätter ett självsäkert felaktigt svar på din vägg.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 %}
Tre lägen, inte två.
grid_options: {columns: 9}. För sex på bredden, 6.media_controls med on_off i. Ställ in media_controls: [].multiline_secondary: true.experimental.color_threshold. Den ritar strecket som en vertikal gradient, och ett helt horisontellt segment har noll höjd att lägga gradienten över, så det renderas osynligt. En session på 43 timmar med en och samma volym försvann helt. Använd en enfärgad color.
Kom igång · Hemskärm · Scener · Anpassade ikoner · Ljud · Grafisk EQ · Högtalare · Varför en kontroll är låst · Assistenten · Hemautomation · Zoner · Fjärrkontroll · Radio (FM/AM) · Bildskärmsvisning · Inställningar · Språk · Volymkontroller · Säkerhetskopiering och återställning · Spelas nu och HEOS
Hemautomation är den enda betalda upplåsningen i AVR Maestro. Allt annat, inklusive AI-assistenten på enheten, ingår.