दस चरण, हर कार्ड का YAML, और एक पूरा व्यू जिसे आप एक बार में पेस्ट कर सकते हैं। असली Marantz CINEMA 30 पर बनाया और फ़ोटो खींचा गया। बस दो स्ट्रिंग बदलिए और यह आपका हो गया।
इस डैशबोर्ड को दो चीज़ों से जानकारी मिलती है, और नीचे हर चरण में यह फ़र्क मायने रखता है।
| स्रोत | आपको मिलता है |
|---|---|
| AVR Maestro की सिंक की गई स्क्रिप्ट | हर कंट्रोल। इनपुट, सराउंड मोड, Audyssey, Dirac, Smart Select, प्रीसेट, डिमर, ईको और आपके सीन। |
| Denon AVR इंटीग्रेशन की media player entity | लाइव स्थिति। पावर, चुना गया सोर्स, सराउंड मोड, वॉल्यूम, म्यूट। |
चारों डिफ़ॉल्ट HACS स्टोर में उपलब्ध हैं। Home Assistant में: HACS › Frontend › Explore & Download Repositories, नाम खोजें, Download करें, फिर अपना ब्राउज़र रीलोड करें।
| खोजें | किस काम के लिए | इसे छोड़ने पर |
|---|---|---|
| Mushroom | हर कंट्रोल टाइल और वॉल्यूम स्लाइडर | सादा button कार्ड इस्तेमाल करें। काम करेगा, पर थोड़ा चौकोर दिखेगा। |
| button-card | लाइव लेबल वाले सेक्शन हेडर | markdown कार्ड इस्तेमाल करें, या सादे शीर्षक रखें। |
| card-mod | रंग, और सक्रिय टाइल की जलती हुई स्थिति | सब कुछ फिर भी काम करता है। बस कुछ भी जलता नहीं। |
| apexcharts-card | हिस्ट्री ग्राफ़ | बिल्ट-इन history-graph कार्ड इस्तेमाल करें। |
इस पेज के हर स्निपेट में दो प्लेसहोल्डर इस्तेमाल हुए हैं। अपनी ID एक बार ढूँढ लें, बाकी सब कॉपी और पेस्ट है।
media_player.your_receiver → सेटिंग्स › डिवाइस & सेवाएं › आपका रिसीवर › मीडिया प्लेयर एंटिटी। कुछ इस तरह: media_player.marantz_cinema_30।script.avr_maestro_MAC_... → डेवलपर टूल्स › स्टेट्स, और एंटिटी फ़िल्टर में avr_maestro लिखें। आपकी पूरी कंट्रोल सूची दिख जाएगी।हर स्क्रिप्ट ID का बीच का हिस्सा आपके रिसीवर का MAC पता है: बारह छोटे अक्षर, जो सब पर एक जैसे होते हैं। इसे एक बार कॉपी कर लें। इस पेज पर जहाँ भी MAC लिखा है, वहाँ अपना डालें।
unavailable लिखा हो, उन्हें अनदेखा करें। पुराने बिल्ड स्क्रिप्ट का नाम MAC की जगह रिसीवर के नाम पर रखते थे। अगर आपने तब सिंक किया था, तो वे पुरानी स्क्रिप्ट अब भी सूची में दिखती हैं और बेकार हैं। चालू स्क्रिप्ट वही हैं जिनके नाम MAC पर हैं।यहाँ से हर चरण यही है: एक सेक्शन जोड़ें, फिर उसमें कार्ड पेस्ट करें। YAML पेस्ट करने के लिए कार्ड के तीन-बिंदु मेन्यू में Edit in YAML चुनें, या पूरा एक साथ पेस्ट करने के लिए डैशबोर्ड के तीन-बिंदु मेन्यू से Raw configuration editor खोलें।
# 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
बोर्ड की सबसे सरल चीज़ से शुरू करें, ताकि कुछ भी जटिल बनाने से पहले पक्का हो जाए कि आपकी entity ID सही हैं। एक सेक्शन जोड़ें, एक कार्ड जोड़ें, Edit in 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 पर लौटें।
यह वह पैटर्न है जिसे सीखना सार्थक है, और बोर्ड की हर सोर्स और सराउंड टाइल इसी की कॉपी है। कार्ड एक स्क्रिप्ट भेजता है और रिसीवर entity से अपना रंग तय करता है, इसलिए जिस इनपुट पर आप सचमुच हैं वह जलता है और बाकी नहीं।

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 आता है।
सादा शीर्षक बेकार जगह घेरता है। उसके नीचे लाइव वैल्यू रखें और "Sources" बन जाता है "Sources / Now on 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
दो-पंक्ति वाला ग्रिड ही लेबल को शीर्षक के बगल की जगह उसके नीचे रखता है।
Surround हेडर पर attributes.source की जगह attributes.sound_mode लगाएँ, और इसी तरह आगे।
Home Assistant वॉल्यूम को भिन्न के रूप में बताता है। रिसीवर को "0.67" पर कोई सेट नहीं करता। गणित की एक पंक्ति इसे ठीक कर देती है और पूरा सेक्शन रिसीवर जैसा पढ़ा जाने लगता है।

volume_level को मास्टर वॉल्यूम में 100 का भाग देकर प्रकाशित करता है, और Denon व Marantz रिसीवरों पर MV 80 ही 0 dB का संदर्भ बिंदु है। इसलिए dB = volume_level × 100 − 80। 0.67 का volume_level मास्टर वॉल्यूम 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() कॉल फ़्रेंडली नेम से प्रीफ़िक्स और रिसीवर का नाम हटा देते हैं।
दूसरी पंक्ति के लिए एक मिनट और लगाना फ़ायदे का सौदा है। रात 11 बजे फ़िल्मी-से नामों वाले बटनों की दीवार कुछ नहीं बताती; हर बटन क्या बहाल करता है यह बताने वाली एक पंक्ति बता देती है कि कौन सा दबाना है।
रिसीवर की media player entity को Home Assistant किसी भी दूसरी entity की तरह रिकॉर्ड करता है, इसलिए आपको सुनने का इतिहास मुफ़्त में मिल जाता है। नीचे सब कुछ उसी एक entity से आता है: कोई अतिरिक्त सेंसर नहीं, कोई helper नहीं, पहले से कुछ कॉन्फ़िगर नहीं करना।

सादे स्टेट टाइमलाइन के लिए किसी कस्टम कार्ड की ज़रूरत नहीं है, और यही सबसे ज़्यादा काम का है:
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 सालों तक दीर्घकालिक आँकड़ों के रूप में रखता है।पूरा व्यू, हर सेक्शन और हर कार्ड, entity ID की जगह प्लेसहोल्डर के साथ।
YOUR_RECEIVER की जगह अपनी media player entity का नाम, और YOURMAC की जगह चरण 2 से अपने रिसीवर के बारह अक्षर।यह मान लेने से पहले कि आपने गलत बनाया है: उनमें से कुछ जल ही नहीं सकतीं, और यह जानना काम का है कि कौन सी।
कोई टाइल अपनी स्थिति तभी दिखा सकती है जब Home Assistant उसे पढ़ सके, और वह आपके रिसीवर को दो जगहों से पढ़ता है। Denon AVR इंटीग्रेशन बुनियादी जानकारी media player entity पर प्रकाशित करता है। बाकी AVR Maestro प्रकाशित करता है: वह एक Status Bridge सेंसर, sensor.avr_maestro_your_receiver, बनाता है और जो रीडिंग उसके पास पहले से हैं उन्हें एट्रिब्यूट के रूप में उस पर लिख देता है।
| media player entity पर | Status Bridge सेंसर पर |
|---|---|
| पावर | Audyssey MultEQ कर्व |
| चुना गया सोर्स | Dynamic Volume और रेफ़रेंस लेवल |
| सराउंड मोड | कौन सा Dirac स्लॉट लोड है |
| वॉल्यूम और म्यूट | फ्रंट पैनल डिमर, ईको मोड |
| Dynamic EQ, कभी-कभी | स्पीकर प्रीसेट, टोन, और दर्जनों अन्य |
अब दोनों कॉलम पढ़े जा सकते हैं। media player की वैल्यू states['media_player.your_receiver'].attributes से लें, और Status Bridge की वैल्यू state_attr('sensor.avr_maestro_your_receiver','dirac_slot') से, ताकि टाइल उसी सेटिंग के लिए जले जो सचमुच सक्रिय है, केवल उसे बदलने वाली स्क्रिप्ट चलाकर न रह जाए।
जिस रिसीवर पर यह बना, उस पर मापा गया: media player entity साठ में से लगभग बीस कंट्रोल देती है, और Status Bridge सेंसर करीब चालीस और प्रकाशित करता है। दोनों को मिलाकर डैशबोर्ड वह लगभग सब कुछ पढ़ सकता है जो वह बदल सकता है - बटनों की दीवार और कंट्रोल सतह के बीच यही फ़र्क है।
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।media_controls में on_off हो। media_controls: [] सेट करें।multiline_secondary: true जोड़ें।experimental.color_threshold है। यह रेखा को ऊर्ध्वाधर ग्रेडिएंट के रूप में खींचता है, और बिल्कुल क्षैतिज खंड की ऊँचाई शून्य होती है, इसलिए ग्रेडिएंट के लिए कोई जगह नहीं बचती और वह अदृश्य हो जाता है। एक ही वॉल्यूम पर 43 घंटे का सेशन पूरी तरह ग़ायब हो गया। ठोस color इस्तेमाल करें।
शुरुआत करें · होम स्क्रीन · सीन · कस्टम आइकन · ध्वनि · Graphic EQ · स्पीकर · कंट्रोल लॉक क्यों है · असिस्टेंट · होम ऑटोमेशन · ज़ोन · रिमोट · रेडियो (FM/AM) · ऑन-स्क्रीन डिस्प्ले · सेटिंग्स · भाषाएं · वॉल्यूम नियंत्रण · बैकअप & रिस्टोर · अभी बज रहा है & HEOS
होम ऑटोमेशन AVR Maestro में इकलौता सशुल्क अनलॉक है। बाकी सब कुछ, ऑन-डिवाइस AI असिस्टेंट समेत, शामिल है।