본문 바로가기

홈어시스턴트 IoT

매시간마다 날씨를 음성으로 안내 받기 - 홈어시스턴트와 구글 스피커 이용

시골이라서 날씨에 민감한 부모님을 위하여 원하는 기능은 다음과 같습니다.

  • 아침8시부터 저녁9시까지 
  • 거실에 TV가 꺼져 있는 동안 
  • 매 정각마다 오늘 날씨와 내일 날씨를 음성으로 안내

 

작동을 위해 사용한 것들은 다음과 같습니다. 

 

우선 홈어시스턴트에 미리 추가로 설치해 둔 HACS(Home Assistant Community Store)로부터 네이버 날씨를 찾아서 통합(Add Integration)합니다. 

  • HACS에서 설치한 후에, 설정 - 기기 및 서비스 - 통합구성요소에서 네이버 날씨를 찾으면 안보이는데 브라우저 캐시를 지우거나 다른 브라우저에서 접속하면 보입니다. 

 

이제 네이버 날씨가 통합되었으므로, 날씨 갱신 내용을 음성으로 알려주도록 자동화를 하면 되겠습니다. 

 

홈어시스턴트의 configuration.yaml에서 다음 내용을 확인합니다. 

 

# Text to speech

tts:

  - platform: google_translate

 

홈어시스턴트에서 구글 스피커를 찾을 때에는 내부 IP주소를 입력하면 되는데, 공유기에서 찾거나 장비의 설정에서 IP 주소를 확인할 수 있습니다. 레노버 스마트 디스플레이는 설정 화면에서 IP 주소가 보입니다. 추가를 마치면 다음과 같이 나타납니다. 

 

 

현재는 2개의 기기가 있어서 음성 출력 시에 거실에 둔 레노버 스마트 디스플레이(이름은 '거실'로 지었음)를 선택해 두면 되겠습니다. 

 

자동화한 내용은 다음과 같습니다. "When 현재날씨정보 changes for 1:00"은 위에 링크한 네이버 블로그 글을 보고 넣었던 내용인데, 날씨 정보가 변하면 말하도록 하는 것이고 저는 매시 정각에 말하도록 하므로 필요하지 않아서 비활성화하였습니다. 

 

 

Time pattern trigger는 시/분/초로 설정하는데, 분과 초를 각각 0으로 넣으면 매시 정각에 작동시킬 수 있습니다. 

 

조건은 오전 8시부터 21시까지이고, TV가 켜져 있지 않을 때에만 작동하도록 했습니다. 

 

레노버 스마트 디스플레이는 이름이 "거실"로 되어 있어서 "미디어 플레이어: Turn off 거실"로 나와 있습니다. 이렇게 끄는 이유는 다음에 말하기 전에 "띠링"하는 소리가 나오게 하려는 것입니다. 20초의 지연은 없어도 될 것 같긴 한데 가끔 말을 안하길래 추가했습니다. 

 

가장 중요한 것은 TTS인데 다음과 같이 YAML의 내용을 만들었습니다. 

 

 

service: tts.google_translate_say

data:

  entity_id: media_player.geosil

  message: >-

    지금 날씨는 {{ states.sensor.naver_weather_weathercast_1.state }}, 현재 기온은 {{

    states.sensor.naver_weather_nowtemp_1.state }} 이고, 내일 날씨는 {{

    states.sensor.naver_weather_tomorrowmstate_1.state }} 입니다. 내일 최저 기온은 {{

    states.sensor.naver_weather_tomorrowmtemp_1.state }}도 입니다. 오늘은 {{

    states.sensor.naver_weather_rainystart_1.state }}

  language: ko

 

위 내용의 결과로 예를 들면 다음과 같이 말하게 됩니다. 

 

"지금 날씨는 맑음이고 어제보다 14도 낮습니다. 현재 기온은 1도이고 내일 날씨는 맑음입니다. 내일 최저 기온은 마이너스 7도 입니다. 오늘은 비안옴"

 

레노보 스마트 디스플레이의 볼륨을 어느 정도 높여 놓아서 부엌에서도 잘 들립니다. 

 

하루에 여러 번 말할 필요는 없지만, 최신으로 변경되는 날씨 정보를 계속 알려주는 것이고 특히 sensor.naver_weather_rainystart_1, 비가 시작하는 시각을 알려주는 기능은 반려 동물 산책을 빨리 다녀 오려고 할 때 유용합니다. 

 

[2023-07-27 갱신] 

현재는 매 정각마다 아래와 같이 설정하여 이용 중입니다. 

service: tts.google_translate_say
data:
  cache: false
  entity_id: media_player.geosil
  message: >-
    현재시각 {{ as_timestamp(now()) | timestamp_custom('%H:%M') }}, 날씨는 {{
    states.sensor.naver_weather_weathercast_1.state }}, 기온  {{
    states.sensor.naver_weather_nowtemp_1.state }}도,   최고 기온은 {{
    states.sensor.naver_weather_todaymaxtemp_1.state }}도, 내일 날씨는 {{
    states.sensor.naver_weather_tomorrowmstate_1.state}},   내일 최저 기온은 {{
    states.sensor.naver_weather_tomorrowmtemp_1.state }}도, 최고 기온은 {{ 
    states.sensor.naver_weather_tomorrowatemp_1.state }}도 입니다.     {%- if not
    states.sensor.naver_weather_rainystart_1.state == '비안옴' %}     
      {%- if now().strftime('%H시') != states.sensor.naver_weather_rainystart_1.state %}
          오늘 비 예상시간은 {{ states.sensor.naver_weather_rainystart_1.state }} 입니다. 
      {% else %}
          현재 비가 오고 있습니다.
      {% endif -%}   
    {% endif -%} {% set state1 = states('sensor.naver_weather_finedust_1') %}  
    {% set state2 = states('sensor.naver_weather_ultrafinedust_1') %} 

    {% if is_number(state1) and is_number(state2) -%}  
      외부 미세먼지, {{ states('sensor.naver_weather_finedust_1') }}, 초미세먼지 {{
      states('sensor.naver_weather_ultrafinedust_1') }} µg 입니다.
      {% if state1 | int > 15 or state2 | int > 10 -%} 
         외출 시 마스크를 착용하세요. 
      {% endif -%} 
    {% endif -%} 
  language: ko