Home Assistant · крок за кроком

Створіть цей дашборд для Home Assistant приблизно за годину

Десять кроків, YAML кожної картки та готове подання, яке можна вставити одним махом. Створено і сфотографовано на справжньому Marantz CINEMA 30. Змініть два рядки - і воно ваше.

Готовий дашборд: головна картка з поточним відтворенням, гучність із пресетами в dB, сітка джерел, режими об'ємного звуку, корекція приміщення, сцени та графік гучності
Що ви будуєте
Поспішаєте? Перейдіть до кроку 10, завантажте готове подання, змініть два рядки й вставте його. Кроки між ними пояснюють, що робить кожен елемент, щоб ви могли його змінити.

Перш ніж почати

Цей дашборд живлять дві речі, і різниця між ними важлива на кожному кроці нижче.

Походить ізДає вам
Синхронізовані скрипти AVR MaestroКожен елемент керування. Входи, режими об'ємного звуку, Audyssey, Dirac, Smart Selects, пресети, димер, eco, ваші сцени.
Сутність медіаплеєра інтеграції Denon AVRПоточний стан. Живлення, вибране джерело, режим об'ємного звуку, гучність, вимкнений звук.
Крок 1

Установіть чотири картки з HACS

Усі чотири є в стандартному магазині HACS. У Home Assistant: HACS › Frontend › Explore & Download Repositories, знайдіть назву, натисніть Download, потім перезавантажте браузер.

ШукайтеДля чого потрібнаЯкщо пропустити
MushroomКожна плитка керування та повзунок гучностіВикористайте звичайну картку button. Працює, але виглядає квадратніше.
button-cardЗаголовки розділів із живою позначкоюВикористайте картку markdown або прості заголовки.
card-modКольори та підсвічений стан активної плиткиУсе працює й так. Просто нічого не підсвічується.
apexcharts-cardГрафіки історіїВикористайте вбудовану картку history-graph.
Жодна з них не обов'язкова для роботи. Кожен елемент керування нижче працює зі стандартної кнопки Home Assistant, націленої на той самий скрипт. Користувацькі картки - це макіяж, а не сантехніка.
Крок 2

Знайдіть свої два ID сутностей

Кожен фрагмент на цій сторінці використовує два заповнювачі. Знайдіть свої один раз - і решта зводиться до копіювання та вставлення.

Середня частина кожного ID скрипта - це MAC-адреса вашого ресивера: дванадцять символів нижнього регістру, однакові в усіх. Скопіюйте її один раз. Скрізь, де ця сторінка пише MAC, підставте свою.

Ігноруйте ті, де є unavailable. Старіші збірки називали скрипти за назвою ресивера, а не за його MAC-адресою. Якщо ви синхронізували тоді, ці старі скрипти досі в списку, але вони мертві. Живі - ті, що названі за MAC-адресою.
Крок 3

Створіть подання

  1. 1. Settings › Dashboards › Add Dashboard › New dashboard from scratch. Назвіть його як завгодно.
  2. 2. Відкрийте його, потім натисніть значок олівця вгорі праворуч, щоб редагувати.
  3. 3. Додайте подання й виберіть макет Sections. Не Masonry. Саме Sections забезпечує правильне перекомпонування на телефоні.
  4. 4. У налаштуваннях подання встановіть Max columns на 3 і ввімкніть Dense section placement.

Відтепер кожен крок такий: додайте розділ, потім вставте в нього картки. Щоб вставити 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
Крок 4

Додайте елемент керування

Почніть із найпростішого на дошці, щоб переконатися, що ваші 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.

Крок 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

Дайте кожному розділу живий заголовок

Простий заголовок - це марний простір. Додайте під ним живе значення, і «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

Саме дволінійна сітка розміщує підпис під заголовком, а не поруч із ним.

Замініть attributes.source на attributes.sound_mode у заголовку Surround і так далі.

Крок 7

Показуйте гучність у dB

Home Assistant повідомляє гучність як дріб. Ніхто не виставляє ресивер на «0.67». Один рядок математики це виправляє, і весь розділ починає виглядати як справжній ресивер.

Розділ гучності: повзунок, збільшення, зменшення, вимкнення звуку та чотири пресети в dB
Night, Dialog, Movie і Loud, кожен із підписом 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 як «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 відкрийте свій дашборд, значок олівця, меню з трьома крапками, Raw configuration editor, і вставте його як подання.
Ваші ID сцен не збігатимуться. Скрипти сцен названі за часом створення сцени, тож чотирьох зі стандартного файлу у вашій системі не існує: ці картки відобразяться, але нічого не робитимуть. Замініть їхні ID сутностей власними з кроку 2 або видаліть розділ Scenes і відновіть його за кроком 8.
Ще дві речі, яких слід очікувати. Графіки джерел і об'ємного звуку містять назви джерел з ресивера, на якому це створювалося, тож змініть ці масиви, як описано в кроці 9. А підписи плиток англійською; у файлі нічого не перекладено.

Якщо плитка ніколи не світиться

Перш ніж вирішити, що ви зробили щось не так: деякі плитки не можуть засвітитися, і варто знати, які саме.

Плитка може показати свій стан, лише якщо Home Assistant може його прочитати, а ваш ресивер він читає з двох місць. Інтеграція Denon AVR публікує основні дані на сутності медіаплеєра. AVR Maestro публікує решту: він створює сенсор Status Bridge, sensor.avr_maestro_your_receiver, і записує на нього як атрибути показання, які вже має.

На сутності медіаплеєраНа сенсорі Status Bridge
ЖивленняКрива Audyssey MultEQ
Вибране джерелоDynamic Volume і опорний рівень
Режим об'ємного звукуЯкий слот Dirac завантажено
Гучність і вимкнення звукуДимер передньої панелі, режим Eco
Dynamic EQ, інодіПресет акустики, тон і десятки інших

Тепер обидва стовпці доступні для читання. Беріть значення медіаплеєра з states['media_player.your_receiver'].attributes, а значення Status Bridge - з state_attr('sensor.avr_maestro_your_receiver','dirac_slot'), тож плитка підсвічується для налаштування, яке справді активне, а не лише запускає скрипт, що його змінює.

Виміряно на ресивері, на якому це створювалося: сутність медіаплеєра містить приблизно двадцять із шістдесяти елементів керування, а сенсор Status Bridge публікує ще близько сорока. Разом дашборд може прочитати майже все, що вміє змінювати, - різниця між стіною кнопок і справжньою панеллю керування.

Якщо значення може означати дві речі, скажіть про це. 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 не може знати, який із них активний, і кнопки лишаються неосвітленими, доки ви не натиснете одну з них.
Чи можна показувати справжню гучність у дБ замість відсотків?
Так. 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_, далі ваші дванадцять символів, далі назва елемента керування. Відкрийте Developer Tools, потім States у Home Assistant і відфільтруйте за avr_maestro, щоб побачити власний список.
Більше з посібника

Інші посібники AVR Maestro

Початок роботи · Головний екран · Сцени · Власні піктограми · Звук · Графічний EQ · Акустика · Чому елемент керування заблоковано · Асистент · Домашня автоматизація · Зони · Пульт · Радіо (FM/AM) · Екранне меню · Налаштування · Мови · Керування гучністю · Резервне копіювання & відновлення · Зараз відтворюється & HEOS

Весь ваш ресивер - на одній стіні

Домашня автоматизація - єдине платне розблокування в AVR Maestro. Усе інше, зокрема вбудований ШІ-асистент, входить у вартість.

Доступно в Google Play Завантажити в App Store Завантажити в Mac App Store Доступно в Microsoft Store

Назад до домашньої автоматизації → · Повний посібник користувача →