2024/12/01

구글홈 & 리시버 / 음성명령으로 MA 음악듣기





HA에 매터허브 애드온을 설치해 기기를 구글홈과 공유하고 템플릿 스위치와 스크립트도 공유기기로 등록.  음성명령은 공유한 기기의 구성요소에 적당한 이름을 정해주고 해당 이름으로 음성명령.

아래 연주음악 템플릿 스위치처럼 unique_id를 정해주면 라벨등 추가정보를 입력할 수 있고 라벨로 필터링한 후 해당기기만 매터허브로 넘길 수 있음. 이 템플릿 스위치로 특정 playlist를 재생하고 플레이어를 off할 수 있도록 하고 이어지는 스크립트는 다음곡과 다음목록의 음성키워드로 만듬.

구글홈에 노출되는 음성키워드는 연주음악과 오디오, 다음곡, 다음목록이며 '연주음악 켜/꺼'로  플레이어 on/off 하며 '다음곡 켜' '다음목록 켜'로 곡과 플레이리스트 이동함.

재생 스피커는 구글홈 스피커그룹과 리시버앰프로 둘 중 현재 재생중인 기기에 다음곡과 재생목록이 적용되도록 자동화 설정. '연주음악'은 구글홈 스피커 그룹을 on/off하는 용도고 '오디오'는 리시버앰프를 on/off하는 용도.

** input_boolean으로 스위치 만들고 on/off에 따라 다음곡, 이전곡으로 자동화 연결해도 좋을 것 같음.

** 리시버앰프에는 옵티컬단자에 연결된 크롬캐스트 오디오가 있어 rm4 mini에서 리모컨 신호를 보내 옵티컬 2번단자로 전환하면서 리시버가 on되고 크롬캐스트 오디오에 playlist를 재생하는 것까지 turn_on동작으로 실행.

** media_player.all 구글홈 스피커 그룹, media_player.castaudio는 리시버앰프에 연결된 크롬캐스트 오디오.

** playlist번호를 찾는건 여기서 참고: https://ntxlds.blogspot.com/2024/11/music-assistant-tip.html

switch.yaml
- platform: template
  switches:
    music_assistant: # Instrumental
      friendly_name: '연주음악'
      unique_id: 'inst'
      value_template: "{{ is_state('media_player.all_2', 'playing') or
        is_state('media_player.castaudio_2', 'playing') }}"
      turn_on:
        - action: media_player.play_media
          data:
            media_content_id: library://playlist/8
            media_content_type: playlist
            entity_id: media_player.all_2
      turn_off:
        - service: media_player.turn_off
          data:
            entity_id:
              - media_player.all_2
              - media_player.castaudio_2

    castaudio_music:
      friendly_name: '오디오'
      unique_id: 'castinst'
      value_template: "{{ states('sensor.neo07_watt') | float(0) > 15 }}"
      turn_on:
        - action: remote.send_command
          data:
            entity_id: remote.rm4_mini
            device: audio
            command: source_opt2
        - action: media_player.volume_set
          data:
            volume_level: 0.7
            entity_id: media_player.castaudio
        - action: media_player.play_media
          data:
            media_content_id: library://playlist/8
            media_content_type: playlist
            entity_id: media_player.castaudio_2
      turn_off:
        - action: remote.send_command
          data:
            entity_id: remote.rm4_mini
            device: audio
            command: amp_onoff
        - action: media_player.turn_off
          data:
            entity_id: media_player.castaudio_2


script.yaml
next_track:
  alias: '다음곡'
  sequence:
    - action: media_player.media_next_track
      target:
        entity_id: >
          {{ states.media_player |
             selectattr('entity_id', 'in', ['media_player.all_2','media_player.castaudio_2']) | 
             selectattr('state', 'equalto', 'playing') | map(attribute='entity_id') | first | 
             default('media_player.all_2') }}

next_playlist:
  alias: '다음목록'
  sequence:
    - action: input_select.select_next
      entity_id: input_select.ma_playlist


input_select.yaml
ma_playlist:
  name: MA Playlist
  initial: 'Inst.'
  options:
    - 'Classic'
    - 'Inst.'
    - 'Comp.'
    - 'Fork'
    - 'Pops'
    - 'BGM'
    - 'MAmix'


automations.yaml
- id: 입력-Playlist/MA
  alias: 입력-Playlist/MA
  mode: single
  triggers:
    - trigger: state
      entity_id: input_select.ma_playlist
  actions:
    - action: media_player.play_media
      target:
        entity_id: >
          {{ states.media_player |
             selectattr('entity_id', 'in', ['media_player.all_2','media_player.castaudio_2']) | 
             selectattr('state', 'equalto', 'playing') | map(attribute='entity_id') | first | 
             default('media_player.all_2') }}
      data:
        media_content_type: playlist
        media_content_id: >
          {% set playlists = {
            'Classic': '34',
            'Inst.': '23',
            'Comp.': '15',
            'Fork': '59',
            'Pops': '51',
            'BGM': '20',
            'MAmix': '4'
          } %}
          library://playlist/{{ playlists[trigger.to_state.state] }}