코딩게시판

# Home Assistant 음성제어 명령 구성 정리

작성자 정보

  • 최고관리자 작성
  • 192.♡.0.1 아이피
  • 작성일

컨텐츠 정보


  • 링크

  • 첨부


  • 본문

    # Home Assistant 음성제어 명령 구성 정리

    ## 1. 목적

    Home Assistant Assist에서 한국어 음성 명령을 사용자 정의하여 다음 기능을
    처리한다.

    -   전체/모두/전부/다 등 광범위한 제어 명령은 실제 장치를 동작시키지
        않고 차단
    -   `일괄소등`이라는 전용 명령만 전체 전등 끄기 실행
    -   에어컨 설정 온도 조회
    -   거실 온도 조회
    -   우리집 대표 온도 조회
    -   음성 명령 인식은 `/config/custom_sentences/ko/home_control.yaml`에서
        구성
    -   실제 실행 및 음성 응답은 `configuration.yaml``intent_script:`에서
        구성

    참고 문서: Home Assistant Voice - Template Sentence Syntax

    ------------------------------------------------------------------------

    ## 2. 전체 구성 구조

    ``` text
    사용자 음성
       ↓
    Assist / STT
       ↓
    /config/custom_sentences/ko/home_control.yaml
       ↓
    Intent 선택
       ↓
    configuration.yaml
    intent_script:
       ↓
    장치 제어 또는 상태 조회
       ↓
    Assist 음성 응답
    ```

    ------------------------------------------------------------------------

    ## 3. 전체 명령 차단

    ### 목적

    `전체`, `모든`, `모두`, `전부`, `다`와 같은 표현으로 집 안의 여러 장치가
    한꺼번에 동작하는 것을 방지한다.

    ### 차단 대상 예

    -   전체 켜줘
    -   전체 꺼줘
    -   전체 전등 켜줘
    -   전체 전등 꺼줘
    -   전체 불 켜줘
    -   전체 불 꺼줘
    -   전체 보일러 켜줘
    -   전체 보일러 꺼줘
    -   모든 전등 켜줘
    -   모든 전등 꺼줘
    -   모든 불 켜줘
    -   모든 불 꺼줘
    -   모든 보일러 켜줘
    -   모든 보일러 꺼줘
    -   모두 켜줘
    -   모두 꺼줘
    -   전부 켜줘
    -   전부 꺼줘
    -   다 켜줘
    -   다 꺼줘

    ### Intent 이름

    `StopAllCommand`

    ### 동작

    실제 Home Assistant 서비스는 실행하지 않는다.

    ### 음성 응답

    > 전체 제어 명령은 사용하지 않습니다. 방이나 장치 이름을 말씀해 주세요.

    ------------------------------------------------------------------------

    ## 4. 일괄소등 전용 명령

    일반적인 `전체 꺼줘``일괄소등`을 분리한다.

    ### 허용 명령

    -   일괄소등
    -   일괄 소등
    -   일괄소등 해줘
    -   일괄 소등 해줘

    ### Intent 이름

    `AllLightsOff`

    ### 동작

    ``` yaml
    action:
      - action: light.turn_off
        target:
          entity_id: all
    ```

    ### 음성 응답

    > 일괄소등을 실행했습니다.

    ### 주의

    `entity_id: all`은 Home Assistant의 모든 `light` 엔티티를 대상으로 한다.
    실제 집 전등만 대상으로 하려면 별도의 Light Group을 만들어 해당 그룹
    엔티티를 지정하는 것이 안전하다.

    ------------------------------------------------------------------------

    ## 5. 에어컨 설정 온도 조회

    ### 질문 예

    -   에어컨 설정 온도는 몇도 인가요
    -   에어컨 설정 온도 몇도야
    -   에어컨 설정 온도 알려줘
    -   에어컨 온도 몇도야

    ### Intent 이름

    `GetAirconSetTemperature`

    ### 대상 엔티티

    ``` text
    climate.geosil_aircon_rs485_ip136_geosil_eeokeon_sangtae_acstate
    ```

    ### 조회 속성

    `temperature`

    `temperature`는 에어컨의 설정 온도이다.

    ### 응답 예

    > 에어컨 설정 온도는 27도입니다.

    값을 확인할 수 없는 경우:

    > 에어컨 설정 온도를 확인할 수 없습니다.

    ------------------------------------------------------------------------

    ## 6. 거실 온도 조회

    ### 질문 예

    -   거실 온도는 얼마 인가요
    -   거실 온도 몇도야
    -   거실 온도 알려줘
    -   거실 몇도야

    ### Intent 이름

    `GetLivingRoomTemperature`

    ### 대상 엔티티

    ``` text
    sensor.geosil_aircon_rs485_ip136_geosil_eeokeon_silnaeondo_roomtemp
    ```

    ### 응답 예

    > 거실 온도는 25.6도입니다.

    센서가 `unknown` 또는 `unavailable`인 경우:

    > 거실 온도를 확인할 수 없습니다.

    ------------------------------------------------------------------------

    ## 7. 우리집 온도 조회

    현재 구성에서는 거실 실내온도를 `우리집 대표 온도`로 사용한다.

    ### 질문 예

    -   우리집 온도는 얼마 인가요
    -   우리 집 온도는 몇도 인가요
    -   우리집 온도 알려줘
    -   우리집 몇도야

    ### Intent 이름

    `GetHomeTemperature`

    ### 현재 대상 엔티티

    ``` text
    sensor.geosil_aircon_rs485_ip136_geosil_eeokeon_silnaeondo_roomtemp
    ```

    ### 응답 예

    > 우리집 온도는 25.6도입니다.

    ------------------------------------------------------------------------

    ## 8. `/config/custom_sentences/ko/home_control.yaml`

    ``` yaml
    language: "ko"

    intents:

      # =========================================================
      # 전체 명령 차단
      # =========================================================
      StopAllCommand:
        data:
          - sentences:
              - "전체 켜줘"
              - "전체 꺼줘"
              - "전체 전등 켜줘"
              - "전체 전등 꺼줘"
              - "전체 불 켜줘"
              - "전체 불 꺼줘"
              - "전체 보일러 켜줘"
              - "전체 보일러 꺼줘"
              - "모든 전등 켜줘"
              - "모든 전등 꺼줘"
              - "모든 불 켜줘"
              - "모든 불 꺼줘"
              - "모든 보일러 켜줘"
              - "모든 보일러 꺼줘"
              - "모두 켜줘"
              - "모두 꺼줘"
              - "전부 켜줘"
              - "전부 꺼줘"
              - "다 켜줘"
              - "다 꺼줘"

      # =========================================================
      # 일괄소등 전용
      # =========================================================
      AllLightsOff:
        data:
          - sentences:
              - "일괄소등"
              - "일괄 소등"
              - "일괄소등 해줘"
              - "일괄 소등 해줘"

      # =========================================================
      # 에어컨 설정 온도
      # =========================================================
      GetAirconSetTemperature:
        data:
          - sentences:
              - "에어컨 설정 온도[는] (몇도 | 몇 도 | 얼마) [인가요]"
              - "에어컨 설정 온도 알려줘"
              - "에어컨 설정 온도 알려 주세요"
              - "에어컨 설정 온도 알려주세요"
              - "에어컨 온도 몇도야"
              - "에어컨 온도 몇 도야"

      # =========================================================
      # 거실 온도
      # =========================================================
      GetLivingRoomTemperature:
        data:
          - sentences:
              - "거실 온도[는] (몇도 | 몇 도 | 얼마) [인가요]"
              - "거실 온도 알려줘"
              - "거실 온도 알려 주세요"
              - "거실 온도 알려주세요"
              - "거실 몇도야"
              - "거실 몇 도야"

      # =========================================================
      # 우리집 온도
      # =========================================================
      GetHomeTemperature:
        data:
          - sentences:
              - "우리집 온도[는] (몇도 | 몇 도 | 얼마) [인가요]"
              - "우리 집 온도[는] (몇도 | 몇 도 | 얼마) [인가요]"
              - "우리집 온도 알려줘"
              - "우리 집 온도 알려줘"
              - "우리집 몇도야"
              - "우리 집 몇 도야"
    ```

    ------------------------------------------------------------------------

    ## 9. `configuration.yaml``intent_script:`

    주의: `configuration.yaml`에 이미 `intent_script:`가 있으면
    `intent_script:`를 또 만들지 말고 기존 항목 아래에 Intent들을 추가한다.
    같은 Intent 이름을 두 번 작성하면 `Map keys must be unique` 오류가
    발생한다.

    ``` yaml
    intent_script:

      # =========================================================
      # 전체 명령 차단
      # =========================================================
      StopAllCommand:
        speech:
          text: >
            전체 제어 명령은 사용하지 않습니다.
            방이나 장치 이름을 말씀해 주세요.

      # =========================================================
      # 일괄소등
      # =========================================================
      AllLightsOff:
        action:
          - action: light.turn_off
            target:
              entity_id: all
        speech:
          text: >
            일괄소등을 실행했습니다.

      # =========================================================
      # 에어컨 설정 온도
      # =========================================================
      GetAirconSetTemperature:
        speech:
          text: >
            {% set temp =
              state_attr(
                'climate.geosil_aircon_rs485_ip136_geosil_eeokeon_sangtae_acstate',
                'temperature'
              )
            %}
            {% if temp is not none %}
              에어컨 설정 온도는 {{ temp | round(0) | int }}도입니다.
            {% else %}
              에어컨 설정 온도를 확인할 수 없습니다.
            {% endif %}

      # =========================================================
      # 거실 온도
      # =========================================================
      GetLivingRoomTemperature:
        speech:
          text: >
            {% set temp =
              states(
                'sensor.geosil_aircon_rs485_ip136_geosil_eeokeon_silnaeondo_roomtemp'
              )
            %}
            {% if temp not in ['unknown', 'unavailable', 'none', ''] %}
              거실 온도는 {{ temp }}도입니다.
            {% else %}
              거실 온도를 확인할 수 없습니다.
            {% endif %}

      # =========================================================
      # 우리집 온도
      # =========================================================
      GetHomeTemperature:
        speech:
          text: >
            {% set temp =
              states(
                'sensor.geosil_aircon_rs485_ip136_geosil_eeokeon_silnaeondo_roomtemp'
              )
            %}
            {% if temp not in ['unknown', 'unavailable', 'none', ''] %}
              우리집 온도는 {{ temp }}도입니다.
            {% else %}
              우리집 온도를 확인할 수 없습니다.
            {% endif %}
    ```

    ------------------------------------------------------------------------

    ## 10. 최종 음성 명령 동작표

      --------------------------------------------------------------------------------
      음성 명령         Intent                     실제 동작         Assist 응답
      ----------------- -------------------------- ----------------- -----------------
      전체 켜줘         StopAllCommand             실행 안 함        전체 제어 명령은
                                                                     사용하지 않습니다

      전체 꺼줘         StopAllCommand             실행 안 함        전체 제어 명령은
                                                                     사용하지 않습니다

      전체 전등 꺼줘    StopAllCommand             실행 안 함        전체 제어 명령은
                                                                     사용하지 않습니다

      모든 불 꺼줘      StopAllCommand             실행 안 함        전체 제어 명령은
                                                                     사용하지 않습니다

      전부 꺼줘         StopAllCommand             실행 안 함        전체 제어 명령은
                                                                     사용하지 않습니다

      다 꺼줘           StopAllCommand             실행 안 함        전체 제어 명령은
                                                                     사용하지 않습니다

      일괄소등          AllLightsOff               전체 Light OFF    일괄소등을
                                                                     실행했습니다

      에어컨 설정 온도  GetAirconSetTemperature    설정온도 조회     에어컨 설정
      몇도야                                                         온도는 ○○도입니다

      거실 온도         GetLivingRoomTemperature   거실온도 조회     거실 온도는
      얼마인가요                                                     ○○도입니다

      우리집 온도       GetHomeTemperature         대표온도 조회     우리집 온도는
      얼마인가요                                                     ○○도입니다
      --------------------------------------------------------------------------------

    ------------------------------------------------------------------------

    ## 11. 핵심 주의사항

    1.  `home_control.yaml`의 Intent 이름과 `configuration.yaml`
        `intent_script` 이름은 정확히 같아야 한다.
    2.  같은 YAML 레벨에서 `GetAirconSetTemperature:` 같은 키를 두 번
        작성하면 `Map keys must be unique` 오류가 발생한다.
    3.  일반 전체 명령을 차단하려면 켜기뿐 아니라 `전체 꺼줘`, `모두 꺼줘`,
        `전부 꺼줘`, `다 꺼줘` 등의 끄기 문장도 `StopAllCommand`에서
        처리해야 한다.
    4.  `일괄소등``AllLightsOff`로 별도 분리하여 일반 전체 명령과
        구별한다.
    5.  `GetAirconSetTemperature`는 climate의 `temperature` 속성을 읽는다.
    6.  `GetLivingRoomTemperature`와 현재 `GetHomeTemperature`는 거실
        실내온도 센서를 사용한다.
    7.  설정 변경 후 Home Assistant 구성 검사를 실행하고 문제가 없으면
        필요한 재시작/리로드를 진행한다.


    첨부 파일을 스킨보드에 구성 PDF보기( W:\g5\skin\board\BS4-Basic-Webzine_11q_pdf_php82\view.skin.php + view_pdf.php구성)



    관련자료

    댓글 0
    등록된 댓글이 없습니다.

    최근글


    새댓글