시골이라서 날씨에 민감한 부모님을 위하여 원하는 기능은 다음과 같습니다.
- 아침8시부터 저녁9시까지
- 거실에 TV가 꺼져 있는 동안
- 매 정각마다 오늘 날씨와 내일 날씨를 음성으로 안내
작동을 위해 사용한 것들은 다음과 같습니다.
- Odroid XU4 보드에 설치한 홈어시스턴트 코어 2022년9월
- 거실에 있는 레노버 스마트 디스플레이(구글 어시스턴트 지원)
- 참고한 글 - Home assistant 날씨 알림 자동화 ( 네이버 날씨 & 구글홈 TTS & App Message)과 유튜브 동영상
우선 홈어시스턴트에 미리 추가로 설치해 둔 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도 입니다. 오늘 비 예상은 비안옴입니다."
- 위 캡쳐에는 오늘은 비안옴으로 되어 있으나... -> 비가 예상되는 경우 예를 들면 "8시"라고 나옵니다. 그러므로, 오늘 비 예상은 ---- 입니다. 가 낫겠네요.
레노보 스마트 디스플레이의 볼륨을 어느 정도 높여 놓아서 부엌에서도 잘 들립니다.
하루에 여러 번 말할 필요는 없지만, 최신으로 변경되는 날씨 정보를 계속 알려주는 것이고 특히 sensor.naver_weather_rainystart_1, 비가 시작하는 시각을 알려주는 기능은 반려 동물 산책을 빨리 다녀 오려고 할 때 유용합니다.
2022-12-03 추가
- 구글 캘린더 일정도 알리면 좋을 것 같아서 테스트를 해 보았습니다.(구글 캐스트 이름 변경 및 지메일아이디_com은 홈어시스턴트에 연동한 각자의 캘린더 계정에 따라 수정 필요하고, 구글 개발자아이디를 만들어서 OAuth 연동 합니다. 그리고, api 서비스 중 Google Calendar api를 Enable시켜주어야만 연동이 됩니다.)
service: tts.google_translate_say
data:
entity_id: media_player.geosil
message: >-
오늘 일정이 있습니다.
{% for cal_events in expand(states.calendar.지메일아이디_com) %}
{% if as_timestamp(cal_events.attributes.start_time) | timestamp_custom('%H:%M') == "00:00" %}
{{ cal_events.attributes.message }}
{% else %}
{{ as_timestamp(cal_events.attributes.start_time) | timestamp_custom('%m월, %d일, %H:%M') }},
{{ cal_events.attributes.message }}
{% endif %}
{%- endfor -%}"
language: ko
일정이 오늘이 아니면 넘어가도록 템플릿 조건을 달 수 있습니다.
{{as_timestamp(state_attr('calendar.지메일아이디_com','start_time'))|timestamp_custom('%-d')
== as_timestamp(now())|timestamp_custom('%-d')}}
아직은 일정이 1개만 나오는 듯합니다.
- for 문이 필요 없는 셈입니다.
- 굳이 날짜를 비교할 필요가 없어서 위에 취소선을 그었습니다.
- 만약 내일 일정이 2개 있다면, 오늘 저녁 시간에는 그 중에 1개만 나오므로, 날짜도 말하게 했습니다. 시간이 있는 일정이라면 약속 시각도 말하게 했습니다.
정식 컴포넌트가 아니라서 아주 가끔 네이버날씨가 개편을 하는 경우 제작자님이 업데이트 해줘야 하는 경우가 있더라고요. 그거 빼고는 잘 쓰고 있습니다.