Найти в Дзене
DigitalComfort

Громкость колонки с Алисой по умолчанию - автоматизация Home Assistant

У Яндекс-станций, помимо достоинств, есть также и масса недостатков, многие из которых раздражают и мешают нормально пользоваться колонками. Но альтернатив Алисе нет, поэтому "мыши плакали, кололись, но продолжали есть кактус". (Всякие Салюты и Маруси я не рассматриваю, они вообще не тянут. Маруся у нас тоже есть, поэтому знаю, о чём говорю). Один из раздражающих недостатков Алисы удалось ликвидировать с помощью Home Assistant. Заключается этот недостаток в том, что никогда заранее не знаешь, какая громкость установлена на колонке, которая сейчас молчит. Большую часть времени каждая из колонок бездействует, а пользуются ими все члены семьи. Поэтому часто бывает так, что кто-то слушал музыку довольно громко, и, например, днём. А вечером в тишине кто-то другой задал Алисе какой-то вопрос, и она на той же громкости, на которой была в прошлый раз, начинает орать в ответ. Равно и наоборот, кто-то общался с колонкой или слушал музыку негромко вечером, а на следующий день в ответ на чей-нибу
Оглавление

У Яндекс-станций, помимо достоинств, есть также и масса недостатков, многие из которых раздражают и мешают нормально пользоваться колонками. Но альтернатив Алисе нет, поэтому "мыши плакали, кололись, но продолжали есть кактус". (Всякие Салюты и Маруси я не рассматриваю, они вообще не тянут. Маруся у нас тоже есть, поэтому знаю, о чём говорю).

Проблема

Один из раздражающих недостатков Алисы удалось ликвидировать с помощью Home Assistant. Заключается этот недостаток в том, что никогда заранее не знаешь, какая громкость установлена на колонке, которая сейчас молчит.

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

Равно и наоборот, кто-то общался с колонкой или слушал музыку негромко вечером, а на следующий день в ответ на чей-нибудь вопрос Алиса что-то там пробормотала себе под нос, еле слышно. Это очень неудобно.

Встроенная функция адаптивной громкости Алисы работает из рук вон плохо и неадекватно, и я сразу же, как она появилась, отключил её на всех колонках, так как с ней было только хуже. Да и на музыку она не распространяется.

Но самое раздражающее - это когда колонка воспроизводит какое-то уведомление, когда этого никто не ждёт. Например - напоминалка. А у нас чаще всего это какие-то уведомления, отправляемые автоматизациями из Home Assistant. И вот тут тоже два варианта. Либо колонка резко и неожиданно начинает орать в тишине, что аж подпрыгиваешь, либо что-то бормочет еле слышно и неразборчиво.

Всё это плохо, но могло бы быть очень легко исправлено. Очевидно, что разработчики Алисы сами своим продуктом не пользуются. А на пожелания, отправляемые в саппорт, реакция обычно одна и та же - спасибо, записали, когда-нибудь может быть сделаем.

Решение

Очевидный и необходимый функционал - громкость по умолчанию, на которую колонка должна перенастраиваться сама через какое-то время этого самого молчания. С помощью Home Assistant удалось реализовать этот функционал, то есть как бы "допилить" прошивку колонки самостоятельно, дополнить её ПО извне.

Это не совсем тот тип задач, которыми должен заниматься умный дом в своём привычном понимании. Но Home Assistant - это нечто большее, чем просто умный дом. Это платформа автоматизации цифровых устройств в самом широком смысле этого понятия. Поэтому мы можем делать совершенно неожиданные и неочевидные вещи!

Подготовка к реализации

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

Для того, чтобы узнать состояние колонки в Home Assistant, а затем отправить колонке команду, необходима интеграция Yandex.Station. О том, как её установить, я рассказывал здесь:

Для управления конкретной колонкой нам понадобится узнать её идентификатор в Home Assistant. Как это сделать, я описывал вот в этой статье, в разделе "5. Настройка интеграции Notify":

Автоматизация

Триггерами автоматизации будут выступать несколько событий:

-2

Первые три события контролируют время, в течение которого колонка молчит. По опыту я выяснил, что она может остаться в одном из трёх этих состояний. Каждое из этих трёх событий настраивается одинаково и просто:

-3

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

Условием автоматизации будет текущее состояние колонки - если она сейчас ничего не воспроизводит. Это нужно для того, чтобы в 9 утра и в 10 вечера, если колонка в этот момент что-то играет, громкость бы не изменилась прямо в процессе воспроизведения, так как выполнение команды изменения громкости будет сопровождаться принудительным приглушением звука уже со стороны самой колонки и звуком щелчка, как при регулировке громкости. Громкость ночного или дневного режима установится автоматизацией позже этого заданного времени, когда колонка пять минут будет на паузе.

Здесь сначала добавляем блок "НЕ", а затем условие, что "колонка воспроизводит медиа", в сумме будет условие "колонка не воспроизводит медиа":

-4

В теле автоматизации сначала проверяется условие попадание в интервал времени, дневной или ночной:

-5

И для каждого интервала времени выполняется проверка текущего уровня громкости, и если он не соответствует заданному уровню, то отправляется команда на колонку для установки требуемого уровня громкости:

-6

Здесь важно обратить внимание на то, что при проверке уровня громкости он берётся из атрибута "volume_level" объекта "media_player", где он выражен в диапазоне от 0 до 1, и 1 - это максимальный уровень громкости 10, поэтому 0.4 в примере соответствует уровню громкости 4.

По опыту я также заметил, что, например, на колонке Max с механической "крутилкой" уровень громкости может быть выражен значением с несколькими знаками после запятой, нам такая точность ни к чему, поэтому округляем значение громкости до одного знака после запятой - round(1):
{{ state_attr("media_player.yandex_station_x0rghfd0trabgry", "volume_level")|round(1) != 0.4 }}

Проверку на текущий уровень громкости делать нужно обязательно, нельзя просто принудительно дать колонке команду на нужный уровень громкости. Дело в том, что если текущий уровень громкости равен тому, который мы пытаемся выставить, то колонка скажет вслух "Такой уровень громкости уже установлен", а нам это совершенно не нужно, чтобы колонка что-то говорила, когда её никто не спрашивает.

Чтобы колонка не произнесла вслух текст "Громкость 4", а восприняла его именно как команду и выполнила, в поле "Тип контента" нужно обязательно ввести "command".

В последних версиях Home Assistant визуальный редактор автоматизаций в части медиаплеера изменил своё поведение, и при попытке ввести текст в окне "Тип контента" этот модуль принимает вот такой вид:

-7

Я считаю это ошибкой Home Assistant, так как дальнейшее редактирование из визуального редактора уже не приведёт к нужному результату. Чтобы этого избежать, нужно выполнять действия в такой последовательности.

Нажимаем кнопку "Добавить действие", выбираем в списке "Медиаплеер", а в списке его действий "Воспроизвести медиа":

-8

Получаем модуль без настроек:

-9

Теперь нужно перейти в текстовый режим редактирования этого модуля, нажав три точки в правом верхнем углу модуля. Внимание! Три точки именно в правом верхнем углу этого модуля, а не всей автоматизации! В меню выбираем "Текстовый редактор":

-10

В коде удаляем строку metadata: {}

-11

Должно получиться так:

-12

Снова нажимаем три точки в правом верхнем углу модуля и выбираем "Форма ввода". Далее зелёной кнопкой "Выбрать объект" выбираем колонку и заполняем поля "ID контента" и "Тип контента":

-13

Не забываем нажать кнопку "Сохранить".

На всякий случай уточню, что в общих настройках умного дома Яндекса в приложении в разделе "Виртуальный ассистент" у меня включена вот эта настройка, но не уверен, имеет ли она значение для данной задачи:

-14

Для ночного режима делаем аналогично, но с меньшим уровнем громкости:

-15

На всякий случай приведу скрин кода этой части автоматизации, его можно редактировать в текстовом режиме, выбрав "Текстовый редактор" в меню (три точки справа вверху всей автоматизации):

-16

Целиком автоматизация выглядит так:

-17

Для каждой колонки нужно создать точно такую же автоматизацию, заменив в ней идентификатор колонки и задав другие значения громкости по умолчанию, если это требуется.

У нас дома целый зоопарк колонок - Мини, Миди, Станция 2 и Макс, и у каждой из них одному и тому же значению громкости соответствует совершенно разный реальный уровень громкости звука. Опытным путём подобрал наиболее комфортные значения для всех колонок.

Для некоторых колонок задал не два, а три суточных интервала времени - ночной (самый тихий), утренне-вечерний (чуть погромче), и дневной (на нормальной громкости). В этом случае нагромождение условий и проверок чуть посложнее, но логика сохраняется точно такая же - сначала проверяем в какой интервал попадает текущее время и потом проверяем нужный уровень громкости для этого интервала времени.

Эти автоматизации у меня работают уже года два, очень удобно и надёжно.