Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save DivanX10/66834ad5075da7180131cf3b56f0357a to your computer and use it in GitHub Desktop.
Save DivanX10/66834ad5075da7180131cf3b56f0357a to your computer and use it in GitHub Desktop.
Home Assistant. Яндекс колонка. Адаптивная громкость
Перед созданием данной автоматизации адаптивная громкость яндекс станции, внимательно прочтите комментарии.
Также можете прочитать про scene.create https://www.home-assistant.io/integrations/scene#creating-scenes-on-the-fly . это позволяет сохранять историю сущностей
Я использую удобную конифгурацию и используется код, который исправно работает с packages https://sprut.ai/client/blog/3180
Большую часть нужно делать через GUI (я пометил это # Вставлять через GUI), только сенсор (# Создать файлик yaml) нужно делать через yaml. В GUI перед созданием скрипт или автоматизацию,
нажать на 3 точки. Эти 3 точки находятся справа, вверху, далее выбираем текстовый редактор и можно вставить код целиком.
############################ Добавляем яндекс станции в группу ############################
Открываем файлик groups.yaml находящийся в папке config и добавляем
#Колонки Список яндекс станции
yandex stations:
name: "Яндекс станции"
all: false
entities:
- media_player.yandex_station_00000001 # указываем id своей колонки 01
- media_player.yandex_station_00000002 # указываем id своей колонки 02
- media_player.yandex_station_00000003 # указываем id своей колонки 03
############################ Вспомогательный элемент ############################
# Вставлять через GUI
# Алиса будет говорить на выбранной громкости
input_number.yandex_station_volume_level:
name: "Яндекс станция: Громкость"
min: 0
max: 1
step: 0,1
mode: slider
icon: mdi:account-tie-voice
############################ Сенсоры ############################
# Создать файлик yandex_station_volume_level.yaml
# Сенсор отображает статус говорящей колонки по ID, а также показывает в атрибутах громкость каждой колонки
# Если нужен сенсор, который отображает по имени, то смотрите на вариант ниже, но для правильной работы нужен entity_id колонки
# Данный сенсор нужно закинуть в packages или в configuration.yaml. В атрибутах указываем любое помещение и вставляем наши колонки.
# Тот текст который на русском, можно изменить. Помещении указываем свое и вставляем ID своей колонки
# Помещение: "{{ state_attr('вставляем свою колонку','volume_level') }}"
sensor:
- platform: template
sensors:
yandex_station_volume_level:
friendly_name: "Яндекс станция. Громкость. Говорит"
value_template: >-
{% if expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'SPEAKING') | map(attribute='entity_id') | list | join(",") %}
{{ expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'SPEAKING') | map(attribute='entity_id') | list | join(",") }}
{% else %}
off
{% endif %}
icon_template: >-
{% if is_state('sensor.yandex_station_volume_level', 'off') %}
mdi:account-tie-voice-off
{% else %}
mdi:account-tie-voice
{% endif %}
attribute_templates:
Гостиная: "{{ state_attr('вставляем свою колонку','volume_level') }}"
Кухня: "{{ state_attr('вставляем свою колонку','volume_level') }}"
Спальня_01: "{{ state_attr('вставляем свою колонку','volume_level') }}"
# Спальня_02: "{{ state_attr('media_player.yandex_station_2222222222','volume_level') }}"
# Детская: "{{ state_attr('media_player.yandex_station_2222222222','volume_level') }}"
################################################
# При желании можете вывести второй сенсор, который отображает статус говорящей колонки по имени (имя будет таким, как указали в УДЯ)
- platform: template
sensors:
yandex_station_last_activity_name:
friendly_name: "Последняя активная яндекс станция. Имя"
value_template: >-
{% if expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'LISTENING') | map(attribute='name') | list | join(",") %}
{{ expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'LISTENING') | map(attribute='name') | list | join(",") }}
{% else %}
off
{% endif %}
icon_template: >-
{% if is_state('sensor.yandex_station_last_activity_name', 'off') %}
mdi:account-tie-voice-off
{% else %}
mdi:account-tie-voice
{% endif %}
############################ Скрипты ############################
Вставлять через GUI. Создаем скрипт, в котором сначала идет сохранение в историю уровня громкости, а после выставляется та громкость,
которую выбрали через регулировку громкости.
В скрипте меняем только alias \ scene_id \ media_player.yandex_station_0000000000000
1) alias - это название скрипта
2) Там где "scene_id: living_room_yandex_station_volume_level" указываем нужную комнату для сохранения уровня громкости
примеры для помещении:
- scene_id: living_room_yandex_station_volume_level
- scene_id: bedroom_yandex_station_volume_level
- scene_id: kitchen_yandex_station_volume_level
3) Вместо media_player.yandex_station_0000000000000 указываем ID своей яндекс колонки
# Имя скрипта для примера: script.yandex_station_adaptive_volume_alice_speaks_louder_livingroom
alias: 'Яндекс станция: Адаптивная громкость. Алиса говорит громче. История (Гостиная)'
sequence:
- condition: template
value_template: >-
{% set ya_vol = states("input_number.yandex_station_volume_level")|float %}
{% set ya_room_vol = state_attr("media_player.yandex_station_0000000000000","volume_level") %}
{% if ya_room_vol < ya_vol and ya_room_vol < 0.7 %} true
{% else %} false
{% endif %}
- service: scene.create
data:
scene_id: living_room_yandex_station_volume_level
entities:
media_player.yandex_station_0000000000000:
state: media_player.yandex_station_0000000000000
volume_level: >
{{ state_attr("media_player.yandex_station_0000000000000","volume_level") }}
- service: media_player.volume_set
data:
volume_level: '{{ states("input_number.yandex_station_volume_level") }}'
target:
entity_id: media_player.yandex_station_0000000000000
icon: mdi:account-tie-voice
mode: single
############################ Автоматизация ############################
# Вставлять через GUI
# Указываем свое имя яндекс станции.Вместо имени "Яндекс Мини на кухне" или "Яндекс Мини в гостиной" и т.д подставляем свою колонку.
# Чтобы узнать имя своей колонки, посмотрите в панеле разработчика состояние yandex_station_volume_level_list. Спросите у Алисы что-нибудь и увидите имя ответившей колонки
# Ниже представлены две одинаковые автоматизации, только в первом случае, это мой пример без комментариев и как есть,
# а во втором случае я использую комментарии
# Мой пример автоматизации
alias: 'Яндекс станция: Адаптивная громкость'
description: ''
trigger:
- platform: template
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Яндекс Мини
на кухне" %} true {% else %} false {% endif %}
id: Яндекс Мини на кухне говорит
- platform: template
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Яндекс Мини в
гостиной" %} true {% else %} false {% endif %}
id: Яндекс Мини в гостиной говорит
- platform: template
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Яндекс Мини в
гостиной" %} false {% else %} true {% endif %}
id: Яндекс Мини в гостиной перестала говорить
- platform: template
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Яндекс Мини
на кухне" %} false {% else %} true {% endif %}
id: Яндекс Мини на кухне перестала говорить
condition: []
action:
- choose:
- conditions:
- condition: trigger
id: Яндекс Мини в гостиной говорит
- condition: state
entity_id: media_player.yandex_station_00000
state: playing
sequence:
- service: script.yandex_station_adaptive_volume_alice_speaks_louder_livingroom
- conditions:
- condition: trigger
id: Яндекс Мини на кухне говорит
- condition: state
entity_id: media_player.yandex_station_00000
state: playing
sequence:
- service: script.yandex_station_adaptive_volume_alice_speaks_louder_kitchen
- conditions:
- condition: trigger
id: Яндекс Мини в гостиной перестала говорить
- condition: state
entity_id: media_player.yandex_station_00000
state: playing
sequence:
- scene: scene.living_room_yandex_station_volume_level
- conditions:
- condition: trigger
id: Яндекс Мини на кухне перестала говорить
- condition: state
entity_id: media_player.yandex_station_00000
state: playing
sequence:
- scene: scene.kitchen_yandex_station_volume_level
default: []
mode: single
# Шаблон. Это тоже самое, что и выше, только с комментариями.
# Чтобы узнать имя своей колонки, посмотрите в панеле разработчика состояние yandex_station_volume_level_list. Спросите у Алисы что-нибудь и увидите имя ответившей колонки
alias: 'Яндекс станция: Адаптивная громкость'
description: ''
trigger:
- platform: template # {% if ya_where == "Указываем имя своей колонки" %} вместо "Указываем имя своей колонки" подставляем имя колонки, которое вы
# присвоили в настройках яндекс умный дом. Также имя колонки можно узнать, вставив код в шаблон. Панель разработчика => Шаблон. В столбце слева отобразится имя колонки
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Указываем имя
своей колонки" %} true {% else %} false {% endif %}
id: ( Указываем имя колонки ) говорит # скобку убираем и вписываем любое имя колонки. Это имя тригера, которое используется для запуска действия при выборе
- platform: template
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Указываем имя
своей колонки" %} true {% else %} false {% endif %}
id: ( Указываем имя колонки ) говорит # скобку убираем и вписываем любое имя колонки. Это имя тригера, которое используется для запуска действия при выборе
- platform: template
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Указываем имя
своей колонки" %} false {% else %} true {% endif %}
id: ( Указываем имя колонки ) перестала говорить # скобку убираем и вписываем любое имя колонки. Это имя тригера, которое используется для запуска действия при выборе
- platform: template
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Указываем имя
своей колонки" %} false {% else %} true {% endif %}
id: ( Указываем имя колонки ) перестала говорить # скобку убираем и вписываем любое имя колонки. Это имя тригера, которое используется для запуска действия при выборе
condition: []
action:
- choose:
- conditions:
- condition: trigger
id: ( Указываем имя колонки ) говорит # имя тригера
- condition: state
entity_id: media_player.yandex_station_00000
state: playing
sequence:
- service: script.yandex_station_adaptive_volume_alice_speaks_louder_livingroom
- conditions:
- condition: trigger
id: ( Указываем имя колонки ) говорит # имя тригера
- condition: state
entity_id: media_player.yandex_station_00000
state: playing
sequence:
- service: script.yandex_station_adaptive_volume_alice_speaks_louder_kitchen
- conditions:
- condition: trigger
id: ( Указываем имя колонки ) перестала говорить # имя тригера
- condition: state
entity_id: media_player.yandex_station_00000
state: playing
sequence:
- scene: scene.living_room_yandex_station_volume_level
- conditions:
- condition: trigger
id: ( Указываем имя колонки ) перестала говорить # имя тригера
- condition: state
entity_id: media_player.yandex_station_00000
state: playing
sequence:
- scene: scene.kitchen_yandex_station_volume_level
default: []
mode: single
@vvv279
Copy link

vvv279 commented Aug 22, 2021

Строка 140 Чтобы узнать имя своей колонки, посмотрите в панеле разработчика состояние yandex_station_volume_level _list. Я думаю _list лишнее.

@vvv279
Copy link

vvv279 commented Aug 22, 2021

Что интересно яндекс мини в автоматизации работает тригер:
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Яндекс Мини
на кухне" %} true {% else %} false {% endif %}
а на Яндекс станции нужно заменить (attribute='name') на (attribute='entity_id')

@DivanX10
Copy link
Author

Строка 140 Чтобы узнать имя своей колонки, посмотрите в панели разработчика состояние yandex_station_volume_level _list. Я думаю _list лишнее.

Вы правы, list тут лишнее, так как нам не нужно выводить список, а нужно ловить имя одной колонки

Что интересно яндекс мини в автоматизации работает тригер:
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Яндекс Мини
на кухне" %} true {% else %} false {% endif %}
а на Яндекс станции нужно заменить (attribute='name') на (attribute='entity_id')

Я правильно понял, что для большой яндекс станции нужно использовать (attribute='entity_id')? Получается, что большая яндекс станция не выводит имя, как у мини?

@vvv279
Copy link

vvv279 commented Aug 23, 2021

Строка 140 Чтобы узнать имя своей колонки, посмотрите в панели разработчика состояние yandex_station_volume_level _list. Я думаю _list лишнее.

Вы правы, list тут лишнее, так как нам не нужно выводить список, а нужно ловить имя одной колонки

Что интересно яндекс мини в автоматизации работает тригер:
value_template: >-
{% set ya_where = expand('group.yandex_stations')
|selectattr('attributes.alice_state', 'eq', 'SPEAKING') |
map(attribute='name') | list | join(",") %} {% if ya_where == "Яндекс Мини
на кухне" %} true {% else %} false {% endif %}
а на Яндекс станции нужно заменить (attribute='name') на (attribute='entity_id')

Я правильно понял, что для большой яндекс станции нужно использовать (attribute='entity_id')? Получается, что большая яндекс станция не выводит имя, как у мини?

Да все верно, у меня так : https://gist.github.com/vvv279/c3686e56146c6480d1d30e6a821818d7

@ghork125
Copy link

А как поведет себя Алиса с данным улучшением если сказать ей "Звук 3" например? Такие команды будут выполняться или нет? Мне кажется судя по коду на колонку просто накатится предыдущая сохраненная сцена.

@DivanX10
Copy link
Author

А как поведет себя Алиса с данным улучшением если сказать ей "Звук 3" например? Такие команды будут выполняться или нет? Мне кажется судя по коду на колонку просто накатится предыдущая сохраненная сцена.

Специально для вас снял видео
https://drive.google.com/file/d/1zLUE-DWj0OVwxvSpd93NFDDv7clD0jvR/view?usp=sharing

@garik007
Copy link

Перестала работать автоматизация, в журнале Error while executing automation automation.iandeks_stantsiia_adaptivnaia_gromkost: expected float for dictionary value @ data['volume_level']

@DivanX10
Copy link
Author

DivanX10 commented Sep 24, 2021 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment