728x90
Home Assistant 2025.7의 "Ask Question" 액션은 스마트홈 자동화의 패러다임을 완전히 바꾸는 혁신적인 기능입니다. 이제 Assist가 사용자에게 먼저 질문을 던지고, 응답에 따라 다양한 동작을 수행할 수 있게 되었습니다.
- 능동적 상호작용: 사용자 명령을 기다리지 않고 Assist가 먼저 대화를 시작
- 완전한 로컬 처리: 모든 음성 데이터가 로컬에서 처리되어 프라이버시 완벽 보호
- 자연어 이해: 50여 가지 이상의 다양한 표현 인식 (예: "응", "좋아", "Make it so" 등)
- 복합 자동화 지원: 하나의 질문으로 여러 디바이스와 서비스를 동시에 제어
300x250
🛠️ 기술적 구현 방법
1. 기본 구조
alias: "기본 Ask Question 구조"
trigger:
- platform: [트리거 조건]
action:
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.[위치]
question: "[질문 내용]"
expected_answers:
- "[예상 답변 1]"
- "[예상 답변 2]"
- wait_for_trigger:
- platform: event
event_type: assist_response
event_data:
entity_id: assist_satellite.[위치]
- choose:
- conditions:
- condition: template
value_template: "{{ trigger.event.data.response == '[답변]' }}"
sequence:
- service: [수행할 서비스]
2. 실전 예제: 멀티 디바이스 제어
alias: "퇴근 모드 활성화"
trigger:
- platform: time
at: "18:00:00"
- platform: zone
entity_id: person.user
zone: zone.home
event: enter
action:
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.entrance
question: "퇴근 모드를 활성화할까요? 조명을 켜고 에어컨을 작동시킵니다."
expected_answers:
- "예"
- "네"
- "응"
- "좋아"
- "켜줘"
- "아니오"
- "아니"
- "나중에"
- wait_for_trigger:
- platform: event
event_type: assist_response
event_data:
entity_id: assist_satellite.entrance
timeout: "00:00:30" # 30초 대기
- choose:
# 긍정 응답 처리
- conditions:
- condition: template
value_template: >
{{ trigger.event.data.response in
['예', '네', '응', '좋아', '켜줘', '그래', 'OK'] }}
sequence:
# 조명 켜기
- service: scene.turn_on
target:
entity_id: scene.evening_lights
# 에어컨 작동
- service: climate.set_temperature
target:
entity_id: climate.living_room
data:
temperature: 24
hvac_mode: cool
# TV 켜기
- service: media_player.turn_on
target:
entity_id: media_player.living_room_tv
# 알림 전송
- service: notify.mobile_app_user
data:
title: "퇴근 모드 활성화"
message: "조명, 에어컨, TV가 켜졌습니다."
# 나중에 처리
- conditions:
- condition: template
value_template: >
{{ trigger.event.data.response in ['나중에', '잠시만', '기다려'] }}
sequence:
- delay: "00:15:00"
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.entrance
question: "이제 퇴근 모드를 활성화할까요?"
expected_answers:
- "예"
- "아니오"
3. 고급 예제: 다단계 대화형 자동화
alias: "스마트 수면 도우미"
trigger:
- platform: time
at: "22:00:00"
condition:
- condition: state
entity_id: person.user
state: home
action:
# 첫 번째 질문
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.bedroom
question: "수면 준비를 도와드릴까요?"
expected_answers:
- "예"
- "아니오"
- wait_for_trigger:
- platform: event
event_type: assist_response
event_data:
entity_id: assist_satellite.bedroom
- choose:
- conditions:
- condition: template
value_template: "{{ trigger.event.data.response in ['예', '네', '응'] }}"
sequence:
# 두 번째 질문: 수면 시간
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.bedroom
question: "몇 시간 후에 알람을 설정할까요? 6시간, 7시간, 8시간 중 선택해주세요."
expected_answers:
- "6시간"
- "7시간"
- "8시간"
- wait_for_trigger:
- platform: event
event_type: assist_response
event_data:
entity_id: assist_satellite.bedroom
# 수면 시간에 따른 알람 설정
- choose:
- conditions:
- condition: template
value_template: "{{ trigger.event.data.response == '6시간' }}"
sequence:
- service: input_datetime.set_datetime
data:
entity_id: input_datetime.wake_alarm
time: "{{ (now() + timedelta(hours=6)).strftime('%H:%M:%S') }}"
- conditions:
- condition: template
value_template: "{{ trigger.event.data.response == '7시간' }}"
sequence:
- service: input_datetime.set_datetime
data:
entity_id: input_datetime.wake_alarm
time: "{{ (now() + timedelta(hours=7)).strftime('%H:%M:%S') }}"
- conditions:
- condition: template
value_template: "{{ trigger.event.data.response == '8시간' }}"
sequence:
- service: input_datetime.set_datetime
data:
entity_id: input_datetime.wake_alarm
time: "{{ (now() + timedelta(hours=8)).strftime('%H:%M:%S') }}"
# 수면 환경 설정
- service: script.sleep_mode
data:
fade_time: 300 # 5분간 서서히 변경
🎨 창의적 활용 사례
1. 지능형 보안 시스템
alias: "침입 감지 대화형 보안"
trigger:
- platform: state
entity_id: binary_sensor.door_sensor
to: "on"
condition:
- condition: state
entity_id: alarm_control_panel.home
state: armed_away
action:
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.entrance
question: "보안 코드를 말씀해주세요."
expected_answers:
- "1234" # 실제로는 더 복잡한 코드 사용
- "긴급"
- wait_for_trigger:
- platform: event
event_type: assist_response
event_data:
entity_id: assist_satellite.entrance
timeout: "00:00:15"
- choose:
# 올바른 코드
- conditions:
- condition: template
value_template: "{{ trigger.event.data.response == '1234' }}"
sequence:
- service: alarm_control_panel.alarm_disarm
target:
entity_id: alarm_control_panel.home
- service: tts.speak
data:
entity_id: media_player.entrance_speaker
message: "안녕하세요. 보안 시스템이 해제되었습니다."
# 긴급 상황
- conditions:
- condition: template
value_template: "{{ trigger.event.data.response == '긴급' }}"
sequence:
- service: notify.emergency_contacts
data:
message: "긴급 상황 발생! 집에 침입자가 있을 수 있습니다."
- service: siren.turn_on
target:
entity_id: siren.alarm
# 무응답 또는 잘못된 응답
default:
- service: camera.snapshot
data:
entity_id: camera.entrance
filename: "/config/www/snapshots/intrusion_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg"
- service: notify.mobile_app_user
data:
title: "보안 경고"
message: "누군가 집에 들어왔습니다."
data:
image: "/local/snapshots/intrusion_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg"
2. 건강 관리 도우미
alias: "일일 건강 체크"
trigger:
- platform: time
at: "09:00:00"
condition:
- condition: state
entity_id: person.user
state: home
action:
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.kitchen
question: "좋은 아침입니다! 오늘 컨디션은 어떠신가요? 좋음, 보통, 나쁨 중에 말씀해주세요."
expected_answers:
- "좋음"
- "보통"
- "나쁨"
- wait_for_trigger:
- platform: event
event_type: assist_response
event_data:
entity_id: assist_satellite.kitchen
- service: input_text.set_value
data:
entity_id: input_text.daily_health_status
value: "{{ trigger.event.data.response }}"
- choose:
- conditions:
- condition: template
value_template: "{{ trigger.event.data.response == '나쁨' }}"
sequence:
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.kitchen
question: "어디가 불편하신가요? 두통, 복통, 피로, 기타 중에 말씀해주세요."
expected_answers:
- "두통"
- "복통"
- "피로"
- "기타"
- wait_for_trigger:
- platform: event
event_type: assist_response
event_data:
entity_id: assist_satellite.kitchen
# 증상별 맞춤 조언
- choose:
- conditions:
- condition: template
value_template: "{{ trigger.event.data.response == '두통' }}"
sequence:
- service: light.turn_on
data:
entity_id: light.living_room
brightness_pct: 30
color_temp: 500 # 따뜻한 색온도
- service: tts.speak
data:
entity_id: media_player.kitchen_speaker
message: "조명을 어둡게 조정했습니다. 충분한 수분 섭취와 휴식을 취하세요."
💡 베스트 프랙티스 (Best Practice)
1. 대화 설계 원칙
- 명확한 질문: 사용자가 즉시 이해할 수 있는 간단명료한 질문 사용
- 제한된 선택지: 너무 많은 옵션보다는 2-4개의 명확한 선택지 제공
- 타임아웃 설정: 응답 대기 시간을 적절히 설정 (15-30초 권장)
- 대체 경로: 무응답이나 예외 상황에 대한 처리 로직 필수
2. 성능 최적화
# 효율적인 응답 처리 패턴
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.living_room
question: "실행할까요?"
expected_answers:
- "예"
- "아니오"
- wait_for_trigger:
- platform: event
event_type: assist_response
event_data:
entity_id: assist_satellite.living_room
timeout: "00:00:20"
continue_on_timeout: true # 타임아웃 시에도 계속 진행
- if:
- condition: template
value_template: "{{ wait.trigger is not none }}" # 응답이 있었는지 확인
then:
# 응답 처리 로직
else:
# 타임아웃 처리 로직
3. 오류 처리 및 복원력
# 강건한 오류 처리
- service: assist_satellite.ask_question
data:
entity_id: assist_satellite.bedroom
question: "설정을 변경할까요?"
continue_on_error: true # 오류 발생 시에도 계속 진행
- wait_for_trigger:
- platform: event
event_type: assist_response
variables:
response_received: "{{ wait.trigger is not none }}"
- if:
- condition: template
value_template: "{{ response_received }}"
then:
- service: persistent_notification.create
data:
title: "설정 변경"
message: "사용자 응답: {{ wait.trigger.event.data.response }}"
🔮 미래 전망 및 확장 가능성
1. AI 통합 가능성
- 사용자 패턴 학습을 통한 질문 시점 최적화
- 컨텍스트 기반 동적 질문 생성
- 감정 인식을 통한 맞춤형 응답
2. 생태계 확장
- 서드파티 서비스와의 대화형 통합
- 멀티모달 상호작용 (음성 + 제스처)
- 가족 구성원별 맞춤형 대화 프로필
📚 추가 리소스
"Ask Question" 액션은 단순한 기능 추가가 아닌, 스마트홈과 사용자 간의 관계를 재정의하는 패러다임 시프트입니다. 이 기능을 통해 진정한 의미의 대화형 스마트홈을 구현하고, 각 가정의 고유한 라이프스타일에 완벽히 맞춤화된 자동화를 만들어보세요!
728x90
그리드형(광고전용)
댓글