이번 글에서는 UI를 통해 통합 구성요소를 설정해보겠습니다. UI를 통해 통합 구성요소를 설정하기 위해서는 코어의 ConfigFlow 모듈을 사용합니다.
example_integration 통합 구성요소 폴더로 이동합니다. $ cd /usr/share/hassio/homeassistant/custom_components/example_integration |
manifest.json 파일을 열고 config_flow를 true로 설정합니다.
$ sudo xed manifest.json |
저장하고 Config Entry 모듈을 작성합니다. 모듈 이름은 config_flow 입니다.
$ sudo touch config_flow.py && sudo xed config_flow.py |
"""example_integration config entry"""
import voluptuous as vol
from homeassistant.helpers import config_validation as cv from homeassistant import config_entries
DOMAIN = 'example_integration'
class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """example_integration ConfigFlow"""
async def async_step_user(self, user_input):
if user_input is not None:
name = user_input.get("name")
await self.async_set_unique_id(name) self._abort_if_unique_id_configured()
return self.async_create_entry(title=name, data=user_input)
return self.async_show_form( step_id="user", data_schema=vol.Schema({ vol.Required("name"): cv.string }) )
|
voluptuous 모듈과 코어의 config_validation 모듈과 config_entries 모듈을 import 합니다.
import voluptuous as vol
from homeassistant.helpers import config_validation as cv from homeassistant import config_entries |
DOMAIN 필드를 작성합니다.
DOMAIN = 'example_integration' |
코어의 ConfigFlow 클래스를 상속하는 클래스를 작성합니다. 클래스 이름은 임의로 지정해도 되는듯 합니다. 여기서는 클래스 이름을 ConfigFlow로 하겠습니다.
class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """example_integration ConfigFlow""" |
async_step_user 함수를 오버라이딩합니다. 설정값이 입력되었다면 async_set_unique_id 함수를 통해 구성요소의 고유id를 설정하고 abort_if_unique_id_configured 함수를 통해 고유id의 중복을 확인합니다. id가 중복되면 중복되면 중단화면을 띄우고 설정을 중단합니다. 그렇지 않으면 async_create_entry 함수를 통해 구성요소를 생성합니다. 설정값이 입력되지 않았다면 async_show_form 함수를 통해 설정값을 입력하도록 하는 화면을 띄웁니다. step_id는 설정화면을 구분하고 data_schema에는 유효성 검사를 위한 스키마를 작성합니다.
async def async_step_user(self, user_input):
if user_input is not None:
name = user_input.get("name")
await self.async_set_unique_id(name) self._abort_if_unique_id_configured()
return self.async_create_entry(title=name, data=user_input)
return self.async_show_form( step_id="user", data_schema=vol.Schema({ vol.Required("name"): cv.string }) ) |
저장하고 backend localization을 위해 strings.json 파일을 다음과 같이 작성합니다.
$ sudo touch strings.json && sudo xed strings.json |
해당 파일은 서버측 출력 문자열을 설정합니다. "title" 값은 통합 구성요소의 이름을, "config" 값은 설정값의 문자열을 출력합니다. 설정값 입력화면은 "step", 중단화면은 "abort"를 키값으로 합니다. 자세한 설명은 생략합니다.
frontend localization을 위해 translations 폴더를 생성합니다. 한국어 번역을 위해 translations 폴더에 ko.json 파일을 생성하고 다음과 같이 작성합니다.
$ sudo mkdir translations && sudo touch translations/ko.json && sudo xed translations/ko.json |
해당 파일은 클라이언트측 번역 문자열을 설정합니다. 출력 문자열 값은 유니코드로 작성해야합니다. 첨부한 unicode.zip 파일을 압축해제하여 나오는 unicode.html 파일을 통해 한글을 유니코드로 변환할 수 있습니다.
저장하고 컴포넌트 파일을 다음과 같이 작성합니다.
"""Example Integration Component"""
DOMAIN = "example_integration" PLATFORMS = ["sensor"]
async def async_setup_entry(hass, entry): """example_integration entry setup"""
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True
async def async_unload_entry(hass, entry): """remove example_integration entry"""
return await hass.config_entries.async_unload_platform(entry, PLATFORMS)
|
도메인 필드와 플랫폼 필드를 입력합니다. 플랫폼 필드는 list 형식으로 작성합니다. sensor 플랫폼을 통해 구성요소를 생성하겠습니다.
"""Example Integration Component"""
DOMAIN = "example_integration" PLATFORMS = ["sensor"] |
UI를 통해 구성요소 설정값을 받으면 async_setup_entry 함수가 실행됩니다. 코어의 setup_platforms 함수를 통해 구성요소를 생성합니다.
async def async_setup_entry(hass, entry): """example_integration entry setup"""
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True |
UI를 통해 구성요소를 삭제하면 async_unload_entry 함수가 실행됩니다. 코어의 async_unload_platforms 함수를 통해 구성요소를 삭제합니다.
async def async_unload_entry(hass, entry): """remove example_integration entry"""
return await hass.config_entries.async_unload_platform(entry, PLATFORMS) |
sensor 플랫폼을 다음과 같이 작성합니다.
"""Example Integration sensor platform"""
from homeassistant.components.sensor import SensorEntity
async def async_setup_entry(hass, entry, async_add_entities): """example_integration sensor platform entry setup""" async_add_entities([ExampleSensor(entry)])
class ExampleSensor(SensorEntity): """sensor platform class"""
def __init__(self, entry): """sensor init""" self._state = entry.data.get("name") self._attr_unique_id = f"example_integration.{self._state}"
@property def name(self): """return sensor name""" return '예제 센서'
@property def state(self): """return sensor state""" return self._state |
컴포넌트에서 sync_setup_platforms 함수를 통해 구성요소를 생성하면 플랫폼의 aync_setup_entry 함수가 실행됩니다. async_add_entities 함수를 통해 구성요소를 생성합니다.
센서 클래스의 생성자에 _attr_unique_id 필드를 설정해주세요. 해당 필드가 있어야 UI 화면상 구성요소가 표시됩니다. 구성요소의 상태는 "name"키값으로 설정됩니다.
저장하고 홈어시스턴트 메인화면에서 구성하기 > 서버 제어 > 다시 시작하기 를 누릅니다.
홈어시스턴트 메인화면에서 구성하기 > 통합 구성요소 > 통합 구성요소 추가하기 를 클릭합니다.
통합 구성요소의 이름을 검색합니다. 통합 구성요소의 이름은 ko.json 파일에서 config:title 키값의 문자열입니다.
클릭하면 설정값 입력창이 뜹니다. "이름을 입력하세요."는 ko.json 파일의 config:step:user:title 키값의 문자열이고 "이름"은 ko.json 파일의 config:step:user:data:name 키값의 문자열입니다. 설정값을 입력합니다. name 키값을 Spot으로 설정하겠습니다.
확인을 누르면 "Spot" 타이틀을 가지는 통합 구성요소(Integration)가 생성됩니다. 해당 통합 구성요소는 1개의 구성요소(entity)를 가집니다. 클릭하면 구성요소 목록을 확인할 수 있습니다.
홈어시스턴트 메인화면에서 개발자 도구 > 상태로 이동하면 sensor.yeje_senseo 구성요소의 상태가 설정값에서 name키값에 입력한 Spot으로 설정된 것을 확인할 수 있습니다.
|