Home Assistant

Home Assistant: phát file âm thanh ngẫu nhiên đến loa

Sonos Speaker

Tự động tạo danh sách và phát ngẫu nhiên các file MP3 đến loa

Photo: yonomi.co
14 phút để đọc hết nội dung

Nếu bạn đã kết nối các thiết bị âm thanh như loa Google Home (qua Google cast), MPD player vào Hass, bạn có thể điều khiển các loa này phát một file nhạc/âm thanh được lưu trên máy chủ Hass hoặc từ internet. Thông thường, ta có thể sử dụng các file này để:

  • Phát âm thanh với mục đích thông báo trong một tình huống hoặc sự kiện nào đó (cửa mở, phát hiện chuyển động, nút chuông cửa được bấm)
  • Phát các bản nhạc, bài hát với chủ đề ưu thích, ví dụ nhạc nhẹ nhàng vào giờ đi ngủ hay nhạc chào buổi sáng
! Về các media player/Yêu cầu tối thiểu
  • Các thiết bị media đa phần được liên kết vào Home Assistant dưới domain media_player, có ngoại lệ nhưng không nhiều. Trong bài trước, khi ta liên kết Spotify vào Home Assistant, dịch vụ này được đại diện bởi entity – thực thể có entity_id là media_player.spotify_abc.
  • Không phải mọi thiết bị hay dịch vụ đều hỗ trợ play – phát một bài hát qua giao thức HTTP/HTTPS (như Roku hay Yamaha Receiver). Bạn cần xem tài liệu về thiết bị/dịch vụ này.
  • Các loa Google Home (mini) hoặc thiết bị Chromecast/AndroidTV tích hợp vào Hass qua Google Cast đều có khả năng phát file âm thanh qua giao thức HTTPS ở các định dạng mp3, wav, aac, opus, vorbis và flac.
    Tương tự trong trường hợp dịch vụ TTS, nếu bạn chứa các file này trên máy chủ Hass (như ở dưới), bạn phải cấu hình để truy cập Hass từ bên ngoài qua một địa chỉ domain với giao thức HTTPS hợp lệ.
    Nếu bạn sử dụng giao thức HTTP thì có thể phát các file này sử dụng địa chỉ IP nội bộ.
  • Router mạng của bạn phải hỗ trợ Hairpinning (NAT loopback) nếu bạn muốn phát các file này qua domain của Hass thay vì địa chỉ IP. Nếu bạn có thể truy cập giao diện Web của Hass từ một máy cùng mạng, qua domain thì gần như chắc chắn router của bạn có hỗ trợ.

Lưu trữ và phát các file âm thanh trên máy chủ Home Assistant

Lưu trữ file trên máy chủ Hass

Home Assistant (Hass) đi kèm một máy chủ web được cấu hình và kích hoạt bên trong http integration. Đây chính là web server phục vụ giao diện web (frontend & lovelace) của Hass. Ta cũng sẽ dùng chính web server này để phục vụ các file âm thanh dùng phát đến các media_player.

Để được phục vụ bởi web server của Hass, các file này cần được lưu trữ bên trong thư mục /config/www.

Lock iCon BẢO MẬT

Không như giao diện Home Assistant, tất cả các file và folder bên trong thư mục /config/www đều có thể bị truy cập mà không cần xác thực. Do vậy, bạn không nên chứa các file mang nội dung cá nhân hay nội dung nhạy cảm và không để lộ tên miền – domain (trong trường hợp truy cập Hass từ bên ngoài).
Bạn cũng không được chứa các file script như asp, js, php, sh bên trong thư mục này để tránh bị lạm dụng tấn công.

Ví dụ, nếu bạn lưu một file có tên example.mp3 bên trong thư mục music bên trong thư mục /config/www thì file này có thể được truy cập qua địa chỉ:

  • [http hoặc https]://ip:port/local/music/example.mp3 (http://192.168.1.9:8123/local/music/example.mp3)
  • [http hoặc https]://domain:port/local/music/example.mp3 (https://konnected.vn:38888/local/music/example.mp3)

Các chú ý:

  1. Không đặt tên file quá dài, không nên sử dụng dấu cách – space trong tên file
  2. Địa chỉ truy cập có phân biệt kí tự Hoa và Thường
  3. Có thể gom các file cùng loại, cùng mục đích vào các folder để dễ quản lý, tuy nhiên nên duy trì đường dẫn ngắn nhất có thể
  4. Phần /local trong đường dẫn là bắt buộc và tương ứng với thư mục www
  5. Nếu bạn đang lưu trữ máy chủ Hass trên thẻ nhớ, chú ý đến dung lượng trống của thẻ. Lưu các file này và đọc chúng không ảnh hưởng đáng kể đến tuổi thọ thẻ khi dung lượng trống của thẻ còn nhiều.

Phát các file này đến media player

Để phát file /config/www/music/example.mp3 trong ví dụ trên đến một media_player, ta sử dụng dịch vụ – service media_player.play_media như bên dưới:

service: media_player.play_media
entity_id: media_player.google_player
data:
  media_content_id: 'https://konnected.vn:38888/local/music/example.mp3'
  media_content_type: music

Trong đó:

  • entity_id: là thiết bị media player nhận lệnh phát
  • media_content_id: địa chỉ truy cập file như ví dụ trong bước trên, lưu ý rằng nên có các dấu cách – space trong tên file/địa chỉ thì bạn nên đặt toàn bộ trong dấu ‘ hoặc “
  • media_content_type: music, video, image, tvshow, channel hay playlist tuỳ theo loại nội dung bạn muốn phát (music chỉ các file dạng mp3, aac, flac, wav như đã nói ở trên, không phải chỉ đến “âm nhạc”) và thiết bị có hỗ trợ

Dưới đây là một automation mẫu, sử dụng một công tắc Zigbee chạy pin làm nút chuông cửa và sẽ phát các tiếng chuông khác nhau đến loa media_player.google_living_room tuỳ vào thời điểm trong ngày. (bạn có thể tải 2 file này ở liên kết dưới)

ZIPDoorbell mp3 File

- id: '158971631379369'
  alias: Door bell
  description: Nút chuông cửa
  trigger:
  - entity_id: switch.door_bell
    from: 'off'
    platform: state
    to: 'on'
  condition: []
  action:
  - data_template:
      media_content_id: >-
        {% if now().hour > 5 and now().hour < 23 %}
        
        {% else %}
        
        {% endif %}
      media_content_type: music
    entity_id: media_player.google_living_room
    service: media_player.play_media

Phát ngẫu nhiên các file âm thanh lưu trữ trên Hass

Lưu các file này trên máy chủ Home Assistant

Trước tiên ta cần lưu các file này trên máy chủ Home Assistant trong cùng một thư mục bên trong thư mục /config/www.

Ví dụ ở đây ta sẽ lưu 5 file:

ocean_waves_30mins.mp3, bird_sound_30mins.mp3, wind_chime_28mins.mp3, relaxing yoga.mp3, mysterious_jungle_30mins.mp3

bên trong thư mục /config/www/chimes của Hass. Đây là các file chứa âm thanh nhạc cụ, đa phần có tiếng chuông gió (nên mới đặt trong thư mục chimes), có thể xếp vào thể loại relaxing sound hay meditation sound. Bạn có thể chép các file này vào thư mục trên bằng cách sử dụng addon Samba Share (yêu cầu Supervisor) hoặc qua WinScp hay bất cứ cách nào thuận tiện.

Kokoro Cafe Wind Chimes
Chuông gió – Wind Chimes
! Lấy các file này ở đâu/Tải về từ Youtube

Các file này thường được chia sẻ trên các diễn đàn âm nhạc hoặc yoga và thiền. Bạn cũng có thể tìm và tải về từ youtube với các từ khoá như wind sound, morning sound, relaxing music, yoga music v.v.. Lưu ý vấn đề bản quyền và bạn chịu trách nhiệm với mọi file bạn tải về.

Có thể tìm thấy các file âm thanh thông báo của hệ điều hành Windows tại thư mục C:\Windows\Media. Bạn cũng có thể tải các file âm thanh đủ loại được chia sẻ miễn phí trên Internet, ví dụ như tại http://soundbible.com.

Để tải các file mp3 từ youtube, sau khi chọn được video có âm thanh, bạn lấy địa chỉ video này trên youtube và paste vào trang web y2mate, rồi chọn mp3 để tải về.

y2mate mp3 downloader
Tải file mp3 từ video

Tự động lập danh sách các file đã lưu

Sau khi đã lưu các file trên, ta sẽ tạo một danh sách bao gồm toàn bộ các file đang có trong thư mục /config/www/chimes này. Danh sách này được tạo tự động và cũng tự cập nhật khi bạn thêm, sửa, xoá các file trong thư mục trên.

Danh sách này được tạo sử dụng platform folder với cấu hình như bên dưới, bạn thêm vào file cấu hình chính của Hass tại /config/configuration.yaml bên dưới phần khai báo sensor.

sensor:
  - platform: folder
    folder: /config/www/chimes
    filter: '*.mp3'

Trong đó:

  • folder: đường dẫn đến thư mục bạn muốn tạo danh sách file trong nó (lưu ý là thư mục con bên trong sẽ không được tính)
  • filter: chỉ tạo danh sách các file có tên (bao gồm cả phần mở rộng như .mp3) thoả mãn một “bộ lọc”, ví dụ:
    ‘*.mp3’: tất cả các file kết thúc bởi .mp3
    ‘[morning]*.mp3’: tất cả các file bắt đầu bởi morning và kết thúc bởi .mp3

Sau khi cấu hình, khởi động lại Hass để khởi tạo sensor này. Sensor sẽ được đặt tên tự động theo tên folder, state là tổng dung lượng của folder và các attributes như trong ảnh dưới.

Folder sensor trong Home Assistant
sensor folder trong Hass

Ta sẽ sử dụng attributes.file_list này ở bước sau.

Phát ngẫu nhiên một file trong danh sách đến Media Player

Sonos Speaker
Loa Sonos (ảnh yonomi.co)

Bên dưới là cấu hình mẫu của một automation phát ngẫu nhiên một file trong các file trên đến loa Google Home vào lúc 06 giờ sáng mỗi ngày, trừ Chủ nhật. Bạn cần thay đổi entity_id của loa (media_player.google_home), địa chỉ web để truy cập Home Assistant của bạn (hass_url) và tên cảm biến chứa danh sách file (sensor.chimes) cho phù hợp.

- id: '156823816799'
  alias: morning chimes
  description: New day chimes
  trigger:
  - at: 06:00:00
    platform: time
  condition:
  - condition: time
    weekday:
    - mon
    - tue
    - wed
    - thu
    - fri
    - sat
  action:
  - data:
      volume_level: 0.3
    entity_id: media_player.google_home
    service: media_player.volume_set
  - service: media_player.play_media
    entity_id: media_player.google_home
    data_template:
      entity_id: media_player.google_home
      media_content_id: >-
        {% set hass_url = 'https://konnected.vn:38888' %}
        {%- set files = states.sensor.chimes.attributes.file_list-%}
        {%- set files = files|replace('/config/www/','')|replace('[','')|replace(']','')%}
        {%- set files = files.replace('\'','').replace(', ',',') %}
        {%- set files = files.split(',')-%}
        {{hass_url}}/local/{{files|random}}
      media_content_type: music

Trong đó:

  • {%- set files = states.sensor.chimes.attributes.file_list-%} tạo biến files với giá trị là danh sách các file trong thư mục /config/www/chimes tạo bởi cảm biến sensor.chimes
  • {{hass_url}}/local/{{files|random}} tạo đường dẫn đến file cho đúng với quy cách đã mô tả ở Bước 1.

Sửa lỗi: nếu loa của bạn không phát sau khi kích hoạt automation này (loa Google Home thường chỉ phát ra âm thanh báo kích hoạt loa), hãy kiểm tra xem file đã tạo có truy cập được bình thường hay không bằng cách truy cập đường dẫn file (ví dụ https://domain:port/local/chimes/ocean_waves_30mins.mp3) trên trình duyệt web hoặc phần mềm chơi nhạc/video như VLC Media Player.

Lên Đầu
  • Đăng ký
Bạn quên mất mật khẩu? Vui lòng nhập tên đăng nhập và địa chỉ email đã đăng ký. Bạn sẽ nhận được liên kết tạo mật khẩu mới qua email (bạn nhớ kiểm tra hộp spam trong trường hợp email đi lạc).