본문 바로가기
스마트폰 (Mobile)

Home Assistant 2025.7 ‘Ask Question’ 액션 새로운 대화형 자동화 기능

by 날으는물고기 2025. 7. 6.

Home Assistant 2025.7 ‘Ask Question’ 액션 새로운 대화형 자동화 기능

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
그리드형(광고전용)

댓글