Skip to content
/ clova Public

클로바와 홈어시스턴트를 연동시키는 컴포넌트입니다.

Notifications You must be signed in to change notification settings

huimang2/clova

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

59 Commits
 
 
 
 
 
 
 
 

Repository files navigation

클로바홈EX for HA

HAKC) HACS Version v1.4

CLOVA Home extension 컴포넌트 입니다. CEK를 통해 CLOVA와 홈어시스턴트 사이의 커뮤니케이션을 지원합니다.

Version history

버전 일자 내용
v1.2.1 2022.06.10 fan 액션 코드 수정
v1.2.0 2022.06.09 코어 업데이트로 인한 deprecated된 코드 수정
v1.1.5 2022.04.09 코어 업데이트로 인한 오류 수정
v1.1.3 2022.02.04 코어 업데이트로 인한 오류 수정
v1.1.2 2021.11.08 버그 수정
v1.1.1 2021.11.08 버그 수정
v1.1.0 2021.11.08 - 메뉴얼 추가
- 스키마 파일(schema.py) 추가
- 디바이스 설정 추가
- 액션 설정 추가
v1.0.2 2021.11.01 - 오류 수정
- FAN 도메인에 대한 모든 액션 추가
v1.0.1 2021.10.31 String.json 파일과 translations 폴더 삭제
v1.0.0 2021.10.31 First version

Update log

초기 버전보다 많은 기능이 업데이트 되었습니다.

  1. 메뉴얼을 작성했습니다.
    설정가능한 변수가 많이 추가되어 따로 메뉴얼을 작성했습니다.

  2. 스키마 파일을 따로 작성하여 유효성 검사를 강화했습니다.
    configuration.yaml을 작성하고 서버를 재시작하기전에 유효성 검사를 통해 설정파일이 잘 작성되었는지 확인하여 재로딩 시간을 줄일 수 있습니다. response도 유효성 검사를 적용하려했지만 템플릿 언어를 적용했다는 사실을 잊은채 스키마를 작성하여 유효성 검사를 통과하지 못하여 이번 버전에서는 적용하지 않았습니다..

  3. 디바이스 설정을 자유롭게 할 수 있습니다.
    디바이스 이름이나 제조사, 태그 등을 자유롭게 변경할 수 있습니다. 클로바 서버에서 인식하는 디바이스 타입도 설정할 수 있습니다.

  4. 커스텀 액션을 수행할 수 있습니다.
    디바이스의 actionDetails를 설정하여 다른 서비스를 실행하고 사용자가 지정한 응답 메시지를 반환하도록 할 수 있습니다. 클로바의 디바이스 타입이 세세하게 나눠져 있어서 홈어시스턴트의 도메인에 매칭되는 타입이 제한됩니다. 이때 actionDetails를 설정하여 액션마다 실행하는 서비스를 지정할 수 있고 사용자가 작성한 응답 메시지를 반환할 수 있습니다.(응답 메시지는 타입별로 형태가 정해져있습니다.)

후원

카카오 페이
후원


1. 컴포넌트 설치

Manual

  • HA 설치 경로 아래 custom_components에 clova폴더 안의 전체 파일을 복사해줍니다.
    <config directory>/custom_components/clova/
  • Home-Assistant 를 재시작합니다

HACS

  • HACS > Integretions > 우측상단 메뉴 > Custom repositories 선택
  • 'https://github.com/huimang2/clova' 주소 입력, Category에 'integration' 선택 후, 저장
  • HACS > Integretions 메뉴 선택 후, '[KR] 클로바홈EX' 검색하여 설치

2. CLOVA Home extension 등록

참고

1) CLOVA Developers Consor β에 접속하여 CLOVA Home extension 만들기를 클릭하세요.

2) 서버 설정은 다음과 같이 입력합니다.

  • Extension 서버 URL: https://HA주소/api/clova
  • 로그인 URL: https://HA주소/auth/authorize
  • 클라이언트ID: https://prod-ni-cic.clova.ai/
  • Access token URI: https://HA주소/auth/token?grant_type=authorization_code
  • Access token 재발급 URI (선택): https://HA주소/auth/token?>grant_type=refresh_token
  • 클라이언트 secret: 아무 글자나 입력

캡쳐1

3) 로고는 250 * 250 사이즈의 이미지, 배너는 750 * 500 사이즈의 이미지를 사용합니다.
캡쳐2
로고
배너

3. 클로바에 컴포넌트 연결

1) 클로바 어플리케이션 다운로드 후 실행

2) 하단에 위치한 스마트홈 아이콘 클릭
캡쳐3

3) + 기기 추가하기 클릭
캡쳐4

4) 추가한 extension 클릭
캡쳐5

5) 로그인을 클릭하여 홈어시스턴트 아이디로 로그인
캡쳐6

6) 연동된 기기 확인
캡쳐7

4. configuration.yaml 설정

클로바홈EX를 실행시키기 위해서는 configuration.yaml 파일을 설정해야 합니다.

clova:

기본 설정 변수

configuration.yaml 작성 예시

clova:
  expose_by_default: False
  exposed_domains:
    - switch
    - climate
  customCommands: []
  entity_config: ...
변수 자료형 필수/선택 설명
expose_by_default Boolean 선택 기본값은 True 이며지원되는 모든 디바이스를 노출합니다.
False 로 설정하면 수동으로 expose를 설정해야합니다.
exposed_domains list [] 선택 노출을 허용하는 도메인을 설정합니다. 기본값은 다음과 같습니다.
- climate
- cover
- fan
- group
- humidifier
- light
- lock
- media_player
- switch
- vacuum
customCommands dict array
[dict]
선택 커스텀 커맨드를 설정합니다.(미구현)
entity_config dict 선택 구성요소를 설정합니다.

customCommands 설정

참고 : 클로바 서버에 값을 전달해도 해당 명령어가 내 명령어에 표시되지 않습니다.
아직 미구현 상태입니다.

configuration.yaml 작성 예시

clova:
  customCommands:
    - name: "외출모드"
      actions:
        - entity_id: switch.geosil_jeondeung
          action: TurnOff
        - entity_id: switch.jubang_jeondeung
          action: TurnOff
        - entity_id: switch.keunbang_jeondeung
          action: TurnOff

entity_config 구성

참고 : entity_config를 설정하여 각각의 디바이스마다 커스텀화가 가능합니다.

configuration.yaml 작성 예시

clova:
  expose_by_default: false
  entity_config:
    switch.geosil_jeondeung:
      expose: true
      name: 거실 전등
      manufacturer: 삼성
      model: 2021년형
      version: v1.1
      description: 2021년형 삼성 LED 등입니다.
      type: SWITCH
      ir: false
      location: LIVING_ROOM
      tags: [거실]
      actionDetails: ...
변수 자료형 필수/선택 설명
expose boolean 선택 구성요소별로 노출여부를 설정합니다. 기본값은 True 입니다.
name str 선택 클로바에 명시되는 디바이스명 입니다.
manufacturer str 선택 클로바에 명시되는 제조사명 입니다.
model str 선택 클로바에 명시되는 모델명 입니다.
version str 선택 클로바에 명시되는 버전 입니다.
description str 선택 클로바에 명시되는 디바이스 설명 입니다.
type str 선택 클로바에서 인식하는 지정된 디바이스 타입으로 변경합니다.
ir boolean 선택 디바이스가 적외선 기능을 사용하는지를 나타냅니다. 기본값은 False 입니다.
location str 선택 클로바에서 인식하는 지정된 장소명 입니다.
tags list [] 선택 클로바에서 설정하는 그룹명 입니다. 여러 그룹을 설정 가능합니다.
actionDetails dict array
[dict]
선택 구성요소의 액션에 대한 세부사항을 설정합니다.

type 변수

type 값은 지정된 디바이스 타입을 입력해야 합니다. 디바이스 타입마다 사용할 수 있는 액션이 정해져 있습니다. 소문자로 입력해도 대문자로 변환되어 전달됩니다.

타입 허용되는 액션
AIRCONDITIONER
(에어컨 타입)
ChangeFanSpeed, ChangeMode, ChangePower, DecrementFanSpeed, DecrementTargetTemperature, GetCurrentTemperature, GetDeviceState, GetTargetTemperature, HealthCheck, IncrementFanSpeed, IncrementTargetTemperature, SetFanSpeed, SetMode, SetTargetTemperature, StartOscillation, StopOscillation, TurnOff, TurnOn
AIRPURIFIER
(공기청정기 타입)
ChangeFanSpeed, ChangeMode, ChangePower, DecrementFanSpeed, GetAirQuality, GetCurrentTemperature, GetDeviceState, GetFineDust, GetHumidity, GetUltraFineDust, HealthCheck, IncrementFanSpeed, ReleaseMode, SetFanSpeed, SetMode, TurnOff, TurnOn
AIRSENSOR
(공기질 측정기 타입)
GetAirQuality, GetCurrentTemperature, GetDeviceState, GetFineDust, GetHumidity, GetUltraFineDust, HealthCheck
BIDET
(비데 타입)
Close, GetDeviceState, GetExpendableState, HealthCheck, Open, TurnOff, TurnOn
BODYWEIGHTSCALE
(체중계 타입)
GetBMI, GetBatteryInfo, GetDeviceState, GetBodyFat, GetHealthScore, GetMuscle, GetWeight, HealthCheck
BUILDING_ELECTRIC_METER
(아파트 전기 타입)
GetConsumption
BUILDING_ELEVATOR_CALLER
(아파트 엘리베이터 타입)
CallElevator
BUILDING_GAS_METER
(아파트 가스 타입)
GetConsumption
BUILDING_HEATING_METER
(아파트 난방 타입)
GetConsumption
BUILDING_HOTWATER_METER
(아파트 온수 타입)
GetConsumption
BUILDING_NOTICE_MONITOR
(아파트 공지사항 타입)
GetNotice
BUILDING_PACKAGE
(아파트 택배 타입)
GetPackage
BUILDING_PARKING_MONITOR
(아파트 주차 타입)
GetVehicleLocation
BUILDING_UTILITY_BILL_MONITOR
(아파트 관리비 타입)
GetCurrentBill
BUILDING_WATER_METER
(아파트 수도 타입)
GetConsumption
CLOTHESCAREMACHINE
(의류 관리기 타입)
GetDeviceState, GetPhase, GetRemainingTime, HealthCheck, TurnOff, TurnOn
CLOTHESDRYER
(의류 건조기 타입)
GetDeviceState, GetPhase, GetRemainingTime, HealthCheck, TurnOff, TurnOn
CLOTHESWASHER
(의류 세탁기 타입)
GetDeviceState, GetPhase, GetRemainingTime, HealthCheck, TurnOff, TurnOn
DEHUMIDIFIER
(제습기 타입)
GetCurrentTemperature, GetDeviceState, GetHumidity, HealthCheck, SetFanSpeed, TurnOff, TurnOn
DISHWASHER
(식기 세척기 타입)
GetDeviceState, GetPhase, GetRemainingTime, HealthCheck, TurnOff, TurnOn
ELECTRICKETTLE
(전기 주전자 타입)
GetCurrentTemperature, GetDeviceState, HealthCheck, TurnOff, TurnOn
ELECTRICTOOTHBRUSH
(전동 칫솔 타입)
GetDeviceState, HealthCheck
FAN
(선풍기 타입)
DecrementFanSpeed, GetDeviceState, HealthCheck, IncrementFanSpeed, SetFanSpeed, SetMode, StartOscillation, StopOscillation, TurnOff, TurnOn
HEATER
(히터 타입)
DecrementTargetTemperature, GetCurrentTemperature, GetDeviceState, GetTargetTemperature, HealthCheck, IncrementTargetTemperature, SetTargetTemperature, TurnOff, TurnOn
HOMECAM
(홈캠 타입)
GetDetectionCount, HealthCheck, ReleaseMode, SetMode, StartRecording, StopRecording, TurnOff, TurnOn
HUMIDIFIER
(가습기 타입)
GetCurrentTemperature, GetDeviceState, GetHumidity, HealthCheck, ReleaseMode, SetFanSpeed, SetMode, TurnOff, TurnOn
KIMCHIREFRIGERATOR
(김치 냉장고 타입)
GetDeviceState, HealthCheck
LIGHT
(스마트 조명 기기 타입)
DecrementBrightness, DecrementVolume HealthCheck, GetDeviceState, IncrementBrightness, IncrementVolume, ReleaseMode, SetBrightness, SetColor, SetColorTemperature, SetMode, TurnOff, TurnOn
MASSAGECHAIR
(안마 의자 타입)
DecrementIntensityLevel, GetDeviceState, HealthCheck, IncrementIntensityLevel, TurnOff, TurnOn
MICROWAVE
(전자 레인지 타입)
GetDeviceState, GetRemainingTime, HealthCheck, TurnOff, TurnOn
MOTIONSENSOR
(동작 감지 센서 타입)
GetDetectedTime, GetDeviceState, GetPowerState, HealthCheck, ReleaseMode, SetMode, TurnOff, TurnOn
OPENCLOSESENSOR
(열림 감지 센서 타입)
GetCloseTime, GetDeviceState, GetOpenState, GetOpenTime, HealthCheck
OVEN
(오븐 타입)
GetDeviceState, GetRemainingTime, HealthCheck, Preheat
POWERSTRIP
(멀티 탭 타입)
GetConsumption, GetDeviceState, GetEstimateBill, GetProgressiveTaxBracket, HealthCheck, TurnOff, TurnOn
PURIFIER
(정수기 타입)
GetConsumption, GetDeviceState, GetExpendableState, HealthCheck, ReleaseMode, SetMode, SetTargetTemperature
RANGE
(레인지 타입)
GetDeviceState, HealthCheck
RANGEHOOD
(레인지 후드 타입)
GetDeviceState, HealthCheck, TurnOff, TurnOn
REFRIGERATOR
(냉장고 타입)
GetDeviceState, HealthCheck, ReleaseMode, SetMode, SetTargetTemperature
RICECOOKER
(전기 밥솥 타입)
GetCleaningCycle, GetDeviceState, GetExpendableState, GetKeepWarmTime, GetPhase, GetRemainingTime, HealthCheck, ReleaseMode, SetMode, Stop, TurnOff, TurnOn
ROBOTVACUUM
(로봇 청소기 타입)
Charge, GetBatteryInfo, GetDeviceState, HealthCheck, TurnOff, TurnOn
SETTOPBOX
(TV 셋톱 박스 타입)
ChangeInputSource, ChangePower, DecrementChannel, DecrementVolume, GetDeviceState, HealthCheck, IncrementChannel, IncrementVolume, Mute, SetChannel, SetChannelByName, TurnOff, TurnOn, Unmute
SLEEPINGMONITOR
(수면 센서 타입)
GetAsleepDuration, GetAwakeDuration, GetDeviceState, GetSleepScore, GetSleepStartTime, HealthCheck, TurnOff, TurnOn
SMARTBED
(스마트 침대 타입)
GetDeviceState, HealthCheck, Lower, Raise, Stop
SMARTCHAIR
(스마트 의자 타입)
GetCurrentSittingState, GetDeviceState, GetRightPostureRatio, GetUsageTime, HealthCheck
SMARTCURTAIN
(스마트 커튼 타입)
Close, GetDeviceState, HealthCheck, Open, Stop
SMARTHUB
(스마트 허브 타입)
GetCurrentTemperature, GetDeviceState, GetHumidity, GetTargetTemperature, HealthCheck, SetMode
SMARTLOCK
(스마트락(도어락) 타입)
GetDeviceState, GetLockState, HealthCheck, SetLockState
SMARTMETER
(전기 계량기 타입)
GetConsumption, GetCurrentBill, GetDeviceState, GetEstimateBill, GetProgressiveTaxBracket, HealthCheck
SMARTPLUG
(스마트 플러그 타입)
GetConsumption, GetDeviceState, GetEstimateBill, HealthCheck, TurnOff, TurnOn
SMARTTV
(스마트 TV 타입)
ChangeInputSource, ChangePower, DecrementChannel, DecrementVolume, GetDeviceState, HealthCheck, IncrementChannel, IncrementVolume, Mute, SetChannel, SetChannelByName, TurnOff, TurnOn, Unmute
SMARTVALVE
(스마트 밸브 타입)
GetDeviceState, GetLockState, SetLockState
SMOKESENSOR
(연기 센서 타입)
GetDeviceState, HealthCheck
SWITCH
(가정 내 콘센트 전원을 제어하는 스위치 타입)
GetDeviceState, HealthCheck, TurnOff, TurnOn
THERMOSTAT
(온도 조절 기기 타입)
DecrementTargetTemperature, GetConsumption, GetCurrentTemperature, GetDeviceState, GetEstimateConsumption, GetTargetTemperature, HealthCheck, IncrementTargetTemperature, SetMode, SetTargetTemperature TurnOff, TurnOn
VENTILATOR
(환풍기 타입)
GetAirQuality, GetCurrentTemperature, GetDeviceState, GetHumidity, GetTargetTemperature, HealthCheck, ReleaseMode, SetFanSpeed, SetMode, TurnOff, TurnOn
WATERBOILER
(온수기 타입)
GetDeviceState, HealthCheck, SetMode, TurnOff, TurnOn
WINECELLAR
(와인 셀러 타입)
GetDeviceState, HealthCheck, ReleaseMode, SetMode, SetTargetTemperature, TurnOff, TurnOn

홈어시스턴트의 도메인은 다음과 같은 타입으로 변환됩니다.

도메인 타입 구현 여부
switch SWITCH O
climate AIRCONDITIONER O
fan FAN O
cover SMARTCURTAIN X
group SWITCH O
light LIGHT X
lock SMARTLOCK X
media_player SETTOPBOX X
vacuum ROBOTVACUUM X
camera TYPE_HOMECAM X
binary_sensor
(opening 클래스)
OPENCLOSESENSOR X
binary_sensor
(window 클래스)
OPENCLOSESENSOR X
media_player
(TV 클래스)
SMARTTV X
humidifier
(humidifier 클래스)
HUMIDIFIER X
humidifier
(dehumidifier 클래스)
DEHUMIDIFIER X

참고 : 완전히 구현된 도메인은 switch, climate, fan, group 입니다.
나머지 도메인은 기본적인 ON/OFF 액션만 구현된 상태입니다.

location 변수

location 값은 지정된 장소 타입을 입력해야 합니다. 해당 장소 타입은 지정된 그룹으로 편성됩니다. tags 변수를 통해서도 그룹 지정이 가능하므로 값이 지정된 location 보다는 tags를 사용하는 것이 더 편합니다.

타입 그룹
ATTIC 다락방
BALCONY 베란다
BALCONY_IN_LIVING_ROOM 거실베란다
BALCONY_IN_MAIN_ROOM 안방베란다
BALCONY_KITCHEN 주방베란다
BATH_ROOM 화장실
BATH_ROOM_IN_LIVING_ROOM 거실 화장실
BATH_ROOM_IN_MAIN_ROOM 안방 화장실
BED_ROOM 침실
BIG_BATH_ROOM 큰 화장실
BIG_CHILD_ROOM 큰아이 방
BIG_ROOM 큰 방
BOILER_ROOM 보일러실
DINING_ROOM 식당
DRESS_ROOM 드레스룸
ENTRANCE 현관
FAMILY_ROOM 가족룸
FATHER_ROOM 아버님방
FIFTH_ROOM 다섯째 방
FIRST_ROOM 첫째 방
FOURTH_ROOM 넷째 방
HALLWAY 복도
KITCHEN 주방
LIBRARY 서재
LIVING_ROOM 거실
MAIN_GATE 대문
MAIN_ROOM 안방
MOTHER_ROOM 어머님방
MY_ROOM 내 방
PARENTS_ROOM 부모님 방
PLAY_ROOM 놀이방
POWDER_ROOM 파우더룸
ROOM
SECOND_ROOM 둘째 방
SMALL_CHILD_ROOM 작은아이 방
SMALL_LIVING_ROOM 작은 거실
SMALL_ROOM 작은 방
SMALL_KITCHEN 작은 주방
SMALL_BATH_ROOM 작은 화장실
STAIRS 계단
THIRD_ROOM 셋째 방
UPSTAIRS_ROOM 윗층 방
UTILITY_ROOM 다용도실
WAREHOUSE 창고
YARD 마당

actionDetails 구성

actionDetails을 설정하여 사용자가 지정한 서비스를 불러오는 것이 가능합니다. 또한 allowableValue를 설정하여 클로바 서버로 해당 액션이 허용하는 값을 전달할 수 있습니다.

액션명은 클로바 플랫폼 가이드를 참고하세요.

JSON 형식

"actionDetails": {
  "액션명": {
    "service": "domain.service",
    "data": dict,
    "response": dict,
    "allowableValue": {
      "type": "타입",
      "minValue": int,
      "maxValue": int,
      "enumValues": list
    }
  }
}

configuration.yaml 작성 예시

clova:
  entity_config:
    switch.geosil_jeondeung:
      actionDetails:
        TurnOn:
          service: input_text.set_value
          data:
            entity_id: input_text.test
            value: {{ states("switch.geosil_jeondeung") }} 상태

switch.geosil_jeondeung으로 TurnOn 액션 요청이 오면 input_text 도메인의 set_value 서비스를 실행하여 input_text.test 구성요소에 switch.geosil_jeondeung 구성요소의 의 상태를 기록하게 됩니다.

참고 : 홈어시스턴트의 템플릿 언어를 사용하여 데이터를 전달할 수 있습니다.

변수 자료형 필수/선택 설명
action dict 필수 해당 dictionary의 키값으로 action을 사용합니다.
actionDetails을 설정하면 필수로 입력해야하며 해당 구성요소가 수행할 수 있는 액션만 입력가능합니다.
위의 예시에서는 switch 도메인에서 TurnOn 액션을 설정했으며, switch 도메인은 SWITCH 타입에 해당하여 해당 액션을 사용가능합니다.
service service_id 선택 액션에 요청이 오면 해당 서비스를 수행합니다.
data dict 선택 서비스의 payload 입니다. 서비스와 함께 작동합니다.
response dict 필수 클로바 서버의 요청에 대한 응답을 설정합니다. 기본값은 {}이며, 응답 메시지의 형식은 클로바 개발문서를 참고하세요. Response 메시지의 payload 부분만 작성하면 됩니다.
allowableValue dict 선택 액션의 허용값을 설정합니다.
type[string, number, boundedNumber] 중에 하나를 입력합니다.
minValuemaxValuetype"boundedNumber" 인 경우 필수로 입력해야합니다.
enumValuestype"string" 이면 문자열 배열, type"number" 이면 숫자 배열을 입력합니다.

Request값 이용하기

Request값은 자체적인 문법을 사용합니다. @경로@ 형식으로 입력합니다.

경로는 payload 아래 경로를 입력합니다.

예를들어

{
  "header": {
    "messageId": "33da6561-0149-4532-a30b-e0de8f75c4cf",
    "name": "SetModeRequest",
    "namespace": "ClovaHome",
    "payloadVersion": "1.0"
  },
  "payload": {
    "accessToken": "92ebcb67fe33",
    "appliance": {
        "applianceId": "device-006"
    },
    "mode": {
        "value": "hotwater"
    }
  }
}

다음과 같은 형식의 요청이 들어오고 modevalue값을 이용하고 싶다면 @mode.value@ 라고 입력하면 됩니다.

예시

clova:
  expose_by_default: false
  entity_config:
    input_text.test:
      expose: true
      type: RICECOOKER
      actionDetails:
        SetMode:
          service: input_text.set_value
          data:
            entity_id: input_text.test
            value: "@mode.value@"
          response:
            mode:
              value: "@mode.value@"

input_text.test 구성요소를 만들고 다음과 같이 작성하면 밥솥에 대한 SetMode 액션을 실행할 수 있습니다.

캡쳐9

캡쳐10

예시

전력 측정기 설정

clova:
  expose_by_default: false
  entity_config:
    sensor.electricity_monitor_energy:
      expose: true
      type: building_electric_meter
      actionDetails:
        GetConsumption:
          response:
            - name: 전기사용량
              value: "{{ states('sensor.electricity_monitor_energy') | int }}"
              unit: KW

캡쳐8

참고