Home Assistant · шаг за шагом

Соберите этот дашборд Home Assistant примерно за час

Десять шагов, YAML каждой карточки и готовое представление, которое можно вставить целиком. Собрано и сфотографировано на настоящем Marantz CINEMA 30. Поменяйте две строки - и он ваш.

Готовый дашборд: блок «Сейчас играет», громкость с пресетами в дБ, сетка источников, режимы объёмного звука, коррекция акустики помещения, сцены и график громкости
Что вы построите
Торопитесь? Переходите к шагу 10, скачайте готовое представление, поменяйте две строки и вставьте его. Шаги между ними объясняют, что делает каждая часть, чтобы вы могли её изменить.

Перед началом

Этот дашборд питают два источника, и на каждом шаге ниже разница между ними важна.

ИсточникЧто даёт
Синхронизированные скрипты AVR MaestroВсе элементы управления. Входы, режимы объёмного звука, Audyssey, Dirac, Smart Selects, пресеты, диммер, эко-режим, ваши сцены.
Объект медиаплеера интеграции 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

Показывайте громкость в дБ

Home Assistant сообщает громкость в виде доли. Никто не выставляет на ресивере «0.67». Одна строка математики это исправляет, и весь раздел начинает читаться как ресивер.

Раздел громкости: ползунок, громче, тише, без звука и четыре пресета в дБ
Night, Dialog, Movie и Loud, у каждого подпись с установленным значением в дБ
Преобразование. Home Assistant публикует volume_level как основную громкость, делённую на 100, а на ресиверах Denon и Marantz MV 80 - это опорный уровень 0 дБ. Значит, дБ = volume_level × 100 − 80. Значение volume_level 0.67 - это основная громкость 67, то есть −13.0 дБ.
# 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 дБ. Случайно задеть дашборд гораздо проще, чем пульт, а референсный уровень на большом ресивере действительно очень громкий.
Шаг 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 как любой другой, так что история прослушивания достаётся бесплатно. Всё ниже берётся из этого одного объекта: никаких дополнительных датчиков, помощников и предварительной настройки.

Пять графиков истории: питание и активность, основная громкость в дБ, громкость по дням, используемый источник и режим объёмного звука
Пять графиков, один объект, семь дней

Простая временная шкала состояний вообще не требует пользовательских карточек и полезнее всего:

type: history-graph
hours_to_show: 168
entities:
  - entity: media_player.your_receiver
    name: Receiver

Включён, выключен и чем занимался - за неделю.

Громкость в дБ использует то же преобразование, что и шаг 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 и форматирует их в дБ, а не строит дБ напрямую. Столбцы растут от нижней границы оси. Если строить дБ напрямую, каждый столбец свисает вниз от 0, и длинный столбец означает тихо, что читается наоборот. Стройте исходное число основной громкости и вычитайте 80 в форматировании оси и подсказки: столбцы растут вверх, а всё, что видит читатель, остаётся в дБ. 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 откройте свой дашборд, значок карандаша, меню из трёх точек, Редактор необработанной конфигурации, и вставьте всё как представление.
ID ваших сцен не совпадут. Скрипты сцен названы по времени создания сцены, поэтому четыре из файла в вашей системе не существуют: эти карточки отобразятся, но ничего не сделают. Замените их ID объектов на свои из шага 2 или удалите раздел сцен и соберите его заново по шагу 8.
Ещё две вещи, которых стоит ожидать. Графики источников и объёмного звука содержат названия источников с ресивера, на котором это собиралось, так что отредактируйте эти массивы, как описано в шаге 9. И подписи плиток на английском: в файле ничего не переведено.

Если плитка никогда не загорается

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

Плитка может показать состояние, только если 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'), и плитка загорится для настройки, которая действительно активна, а не только запустит скрипт, который её меняет.

Замерено на ресивере, для которого это собиралось: объект медиаплеера несёт около двадцати из шестидесяти элементов управления, а датчик 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, диммер, эко-режим и пресет колонок интеграцией Denon не публикуются, поэтому Home Assistant не знает, какой из них активен, и кнопки остаются неподсвеченными, пока вы не нажмёте одну из них.
Можно ли показывать реальную громкость в дБ вместо процентов?
Да. Home Assistant публикует volume_level как основную громкость ресивера, делённую на 100, а на ресиверах Denon и Marantz MV 80 - это опорный уровень 0 дБ. Значит, дБ равно volume_level, умноженному на 100, минус 80. Значение volume_level 0.67 - это основная громкость 67, то есть -13.0 дБ.
Совпадут ли мои ID объектов с теми, что в этом руководстве?
Шаблон совпадёт, середина - нет. AVR Maestro называет скрипты по MAC-адресу ресивера, поэтому переименование обновляет тот же скрипт, а не создаёт его копию. У вас будет script.avr_maestro_, затем ваши собственные двенадцать символов, затем название элемента управления. Откройте в Home Assistant «Инструменты разработчика», затем «Состояния» и отфильтруйте по avr_maestro, чтобы увидеть свой список.
Другие разделы руководства

Другие руководства по AVR Maestro

Начало работы · Главный экран · Сцены · Пользовательские значки · Звук · Графический эквалайзер · Колонки · Почему элемент заблокирован · Помощник · Автоматизация дома · Зоны · Пульт · Радио (FM/AM) · Экранное меню · Настройки · Языки · Управление громкостью · Резервное копирование & восстановление · Сейчас играет & HEOS

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

Автоматизация дома - единственная платная разблокировка в AVR Maestro. Всё остальное, включая AI-помощника на устройстве, входит в приложение.

Доступно в Google Play Загрузите в App Store Загрузите в Mac App Store Доступно в Microsoft Store

Назад к автоматизации дома → · Полное руководство пользователя →