На заре своего знакомства с HA меня посетила мысль о том, что было бы неплохо реализовать в его интерфейсе возможность запуска воспроизведения ряда интернет-радиостанций на имевшихся у меня тогда устройствах Google Chromecast. После некоторого кол-ва проб и ошибок у меня получилось вполне рабочее решение, которое я недавно слегка переписал и хочу поделится им здесь.
Это решение позволяет выбрать на каком устройстве запустить воспроизведение, выбрать радиостанцию из заранее определенного списка, а так же изменять громкость воспроизведения.
В моем случае все это работает с Google Home Mini и Google Chromecast подключенными к ТВ, возможно будет работать и с другими объектами media_player, поддерживающими потоковое воспроизведение через интернет.
! Насколько я знаю, на текущий момент с Яндекс Станциями это не работает.
Интерфейс собран из стандартных элементов, за исключением одной кастомной карточки vertical-stack-in-card позволяющей убрать лишнее пространство между ними:
В YAML’е это выглядит вот так:
- type: vertical-stack cards: - type: markdown content: > ### Радио: - type: custom:vertical-stack-in-card cards: - type: entities entities: - input_select.radio_station - input_select.output_device - type: entities entities: - input_number.volume_radio - type: horizontal-stack cards: - type: button show_name: false icon_height: 32px tap_action: action: call-service service: script.turn_on service_data: entity_id: script.radio_play entity: script.radio_play - type: button show_name: false icon_height: 32px tap_action: action: call-service service: script.turn_on service_data: entity_id: script.radio_stop entity: script.radio_stop
Весь код относящийся к радио я собрал в одном пакете (package), можете посмотреть или скачать его у меня на GitHub.
Здесь же я попробую более подробно описать механизм работы.
Для выбора радиостанции и медиаплеера используются два элемента input_select
:
input_select: radio_station: name: 'Радиостанция:' options: - Радио Jazz - Monte Carlo - Monte Carlo Lounge - Наше Радио - ENERGY - Русское Радио - Maximum - Детское Радио - Детское Радио (Старое радио) output_device: name: 'Где включить:' options: - Гостинная (Home Mini) - Гостинная (TV) - Детская (Home Mini) - Детская (TV) initial: Гостинная (Home Mini) icon: mdi:speaker-wireless
Т.к. для дальнейшего использования человеческие названия радиостанций и устройств нужно сначала транслировать в URL и имена объектов HA, я сделал две автоматизации – первая на основе выбранного имени радиостанции записывает в объект input_text.radio_url_to_play
соответствующий станции URL, а вторая на основе выбранного имени устройства записывает его entity_id в input_text.output_device_to_play
. Объекты input_text в данном случае выступают в роли глобальных переменных, значения которых можно многократно использовать в скриптах или автоматизациях.
automation: - alias: "Radio - Selected Name to URL" trigger: # При загрузке - platform: homeassistant event: start # При выборе радиостанции в input_select'е - platform: state entity_id: input_select.radio_station action: # Обновляем значение в input_text - service: input_text.set_value data: entity_id: input_text.radio_url_to_play # В зависимости от названия станции, записываем в input_text нужный URL value: >- {% if is_state("input_select.radio_station", "Радио Jazz") -%} {% elif is_state("input_select.radio_station", "Monte Carlo") -%} {% elif is_state("input_select.radio_station", "Monte Carlo Lounge") -%} http://stream.zeno.fm/953wvvz4gseuv {% elif is_state("input_select.radio_station", "Наше Радио") -%} {% elif is_state("input_select.radio_station", "ENERGY") -%} http://ic2.101.ru:8000/v1_1 {% elif is_state("input_select.radio_station", "Русское Радио") -%} {% elif is_state("input_select.radio_station", "Maximum") -%} {% elif is_state("input_select.radio_station", "Детское Радио") -%} http://ic7.101.ru:8000/a199 {% elif is_state("input_select.radio_station", "Детское Радио (Старое радио)") -%} http://195.91.237.50:8000/detskoe128 {% endif %} - alias: "Radio - Selected Name to Device" trigger: # При загрузке - platform: homeassistant event: start # При выборе радиостанции в input_select'е - platform: state entity_id: input_select.output_device action: # Обновляем значение в input_text - service: input_text.set_value data: entity_id: input_text.output_device_to_play # В зависимости от названия устройства, записываем в input_text его entity_id value: >- {% if is_state("input_select.output_device", "Гостинная (TV)") -%} media_player.gostinaia {% elif is_state("input_select.output_device", "Гостинная (Home Mini)") -%} media_player.googlehome9967 {% elif is_state("input_select.output_device", "Детская (TV)") -%} media_player.detskaia {% elif is_state("input_select.output_device", "Детская (Home Mini)") -%} media_player.googlehome3792 {% endif %}
Эти автоматизации запускаются однократно при загрузке HA, а также при каждом выборе станции или устройства, обновляя таким образом значения в переменных (input_text’ах).
Для запуска и остановки воспроизведения (кнопки Play\Stop) используются следующие скрипты:
script: # Скрипт для кнопки Play radio_play: alias: Play Internet Radio sequence: # Если в имени устройства присутствует (TV) - предварительно выполнить shell_command.chromecast_tv_on - choose: - conditions: "{{ '(TV)' in states('input_select.output_device') }}" sequence: - service: shell_command.chromecast_tv_on data: # В зависимости от имени устройства выбирается IP Хромкаста ip_addr: >- {% if is_state("input_select.output_device", "Гостинная (TV)") -%} "172.16.16.211" {% elif is_state("input_select.output_device", "Детская (TV)") -%} "172.16.16.212" {% endif %} # Устанавливается громкость, выбранная в интерфейсе - service: media_player.volume_set data: entity_id: "{{ states('input_text.output_device_to_play') }}" volume_level: "{{ states.input_number.volume_radio.state }}" # Запускается проигрывание выбранного URL на выбранном устройстве - service: media_player.play_media data: entity_id: "{{ states('input_text.output_device_to_play') }}" media_content_id: "{{ states('input_text.radio_url_to_play') }}" media_content_type: music # Скрипт для кнопки Stop radio_stop: alias: Stop Internet Radio sequence: # Выключение устройства выбранного в интерфейсе - service: media_player.turn_off data: entity_id: "{{ states('input_text.output_device_to_play') }}"
Здесь стоит обратить внимание, что при выборе в качестве устройства Хромкаста, на него предварительно посылается команда (shell_command.chromecast_tv_on), которая заставляет его включить ТВ с помощью CEC. При этом в атрибуте ip_addr передается IP адрес нужного устройства.
Команда для включения ТВ с помощью Chromecast:
shell_command: chromecast_tv_on: "curl -s -X POST -H \"Content-Type: application/json\" -H \"Host: {{ ip_addr }}:8008\" -d '{\"use_channel\":true,\"allow_restart\":true,\"allow_empty_post_data\":true,\"app_id\":\"00000000-0000-0000-0000-000000000000\",\"url\":\"chrome://home?remote_url=https%3A%2F%2Fclients3.google.com%2Fcast%2Fchromecast%2Fhome%3Fchs%3D1\",\"dial_enabled\":true}' http://{{ ip_addr }}:8008/apps/00000000-0000-0000-0000-000000000000"
В моем случае это прекрасно работает на разных поколениях ТВ от Samsung c Chromecast’ами 1-го и 3-го поколений. После выполнения этого запроса ТВ будет включен, а видеовход переключен на тот, в который подключен Хромкаст.
Ну и наконец, управление громкостью реализовано с помощью input_number
и одной автоматизации:
input_number: volume_radio: name: Громкость icon: mdi:volume-high initial: 0.30 min: 0 max: 1 step: 0.05 automation: - alias: "Radio - Volume Control" trigger: # При изменении значения input_number platform: state entity_id: input_number.volume_radio action: # Установить выбранную громкость (input_number) на выбранном устройстве (input_text) service: media_player.volume_set data: entity_id: "{{ states('input_text.output_device_to_play') }}" volume_level: "{{ states('input_number.volume_radio') }}"