사물인터넷

서브 주제인 사물인터넷에 관한 다양한 이야기를 올려주세요.

제목홈어시스턴트 : 통합 구성요소(Integrations) 만들기2022-01-01 03:44
작성자user icon Level 2

88x31.png


통합 구성요소(Integrations)는 홈어시스턴트의 확장 모듈입니다. 홈어시스턴트 코어(Core)는 통합 구성요소에 의하여 그 기능이 확장될 수 있습니다. 초기에는 컴포넌트(components)만 존재하여 확장 모듈을 컴포넌트라고 했지만 플랫폼(platform) 모듈이 추가되면서 통합 구성요소로 이름이 변경되었습니다.


홈어시스턴트 코어에 포함된 컴포넌트는 /homeassistant/components/ 하위폴더에 도메인 이름으로 존재하고 커스텀 컴포넌트는 <config_directory>/custom_components/ 하위폴더에 도메인 이름으로 존재합니다.


구성파일은 다음과 같습니다.


* manifest.json : 통합 구성요소의 설정 파일입니다.

* __init__.py : 컴포넌트(component)를 정의하는 파일입니다.

* <platform>.py : 플랫폼(platform)을 정의하는 파일입니다.

* config_flow.py : config flow를 정의하는 파일입니다. UI를 통해 통합 구성요소를 생성하기 위해서는 필수적인 파일입니다.

* service.yaml : 서비스(service)를 설명하는 파일입니다.

* string.json : 백엔드 로컬라이징(backend localization) 파일입니다.

* translations/<country_code>.json : 프론트엔드 로컬라이징 (frontend localization) 파일입니다.



먼저 간단하게 'Hello spot'을 출력하는 컴포넌트를 만들어보도록 하겠습니다.

https://www.robotstory.co.kr/iot/?vid=114 글을 따라서 도커에 홈어시스턴트를 설치했다면 홈어시스턴트 설정 경로는 /usr/share/hassio/homeassistant 입니다. 설정 경로에 custom_components 폴더를 만들고 이동합니다.


 $ cd /usr/share/hassio/homeassistant && sudo mkdir custom_components && cd custom_components


커스텀 컴포넌트의 폴더 이름은 도메인의 이름과 같습니다. 도메인 이름은 example_integration 으로 하겠습니다.

 $ sudo mkdir example_integration && cd example_integration


통합 구성요소 설정파일을 생성합니다.

 $ sudo touch manifest.json


파일을 수정합니다.

 $ sudo xed manifest.json

mb-file.php?path=2022%2F01%2F01%2FF4451_1.png

* domain : 문자열과 밑줄(_)로 구성된 짧은 이름입니다. 통합 구성요소를 구분하는 고유명이며 변경할 수 없습니다.

* name : 통합 구성요소의 이름입니다.

* version : 커스텀 컴포넌트에는 필수적으로 입력되어야합니다. 코어 컴포넌트에서는 생략됩니다.

* documentation : 통합 구성요소의 사용법이 포함된 웹페이지 입니다.

* dependencies : 통합 구성요소가 로드되기 전에 먼저 설정되는 의존성 통합 구성요소를 지정합니다. 웹훅이나 MQTT 연결 같은 다른 통합 구성요소 모듈을 사용하려면 필요합니다.

* after_dependencies : 사용할 수 있지만 필수는 아닌 의존성 통합 구성요소를 지정합니다.

* codeowners : 통합 구성요소를 담당하는 GitHub 유저네임 또는 팀이름입니다.

* config_flow : config flow를 정의하는 경우 true를 입력합니다. 기본값은 false 입니다.

* requirements : pip를 통해 설치되는 의존성 모듈입니다. 코어에 포함되지 않은 모듈을 입력하면 됩니다. 코드에 포함된 모듈은 requirement.txt 파일에서 확인가능합니다.

* iot_class : 통합 구성요소가 기기(device)나 서비스(service)에 연결되는 방식을 설명합니다. https://www.home-assistant.io/blog/2016/02/12/classifying-the-internet-of-things/#classifiers를 참고하세요.


통합 구성요소 컴포넌트 정의 파일을 생성하고 수정합니다.

 $ sudo touch __init__.py && sudo xed __init__.py

 """Example Integration Component"""


 DOMAIN = "example_integration"


 def setup(hass, config):

     """example_integration integration setup"""

     hass.states.set('Hello spot')


     return True

mb-file.php?path=2022%2F01%2F01%2FF4452_2.png
홈어시스턴트가 시작되면 설정파일(configuration.yaml)에 정의된 컴포넌트의 setup 함수를 로드합니다.

setup 함수는 매개변수로 홈어시스턴트 코어 객체와 설정(config) 객체를 가집니다. 코어에서 states 객체의 set 함수를 통해 구성요소(entity)의 상태를 설정할 수 있습니다. 리턴값은 컴포넌트가 성공적으로 로드되었는지를 나타냅니다. 문제가 없으면 True를 리턴합니다.


홈어시스턴트 설정파일을 다음과 같이 수정합니다.

 $ sudo xed ../../configuration.yaml

mb-file.php?path=2022%2F01%2F01%2FF4450_5.png

yaml 파일 작성법은 이 글에서 따로 설명하지 않겠습니다. 마지막줄에 example_integration: 을 추가해주세요.


이제 홈어시스턴트 메인화면에서 구성하기 > 서버 제어 > 다시 시작하기 를 누릅니다.

mb-file.php?path=2022%2F01%2F01%2FF4448_3.png
mb-file.php?path=2022%2F01%2F01%2FF4449_4.png
 

오류가 뜨며 재시작이 안됩니다... 다시 시작하기를 누르면 restart 서비스를 실행하게 되는데 이때 컴포넌트가 메모리에 존재하는지 유효성검사를 합니다. 방금 만든 example_integration 통합 구성요소는 메모리에 존재하지 않아 발생한 오류입니다. 그러므로 터미널에서 컨테이너를 재시작 해주세요.

 $ docker container restart homeassistant


홈어시스턴트 메인화면에서 개발자 도구 > 상태로 이동하면 example_integration.print 구성요소의 상태가 Hello spot 으로 설정된 것을 확인할 수 있습니다.

mb-file.php?path=2022%2F01%2F01%2FF4453_6.png


이번에는 컴포넌트가 아닌 플랫폼을 통해서 상태를 출력해보겠습니다.


플랫폼은 구성요소 통합 구성요소(Entity Integration)에 포함되어 구성요소(entity) 객체를 생성하는 모듈입니다.

코어에 많은 Entity Integration이 존재하는데 여기서는 sensor 플랫폼을 만들겠습니다.

통합 구성요소 컴포넌트 정의 파일을 생성하고 수정합니다.

 $ sudo touch sensor.py && sudo xed sensor.py

 """Example Integration sensor platform"""


 from homeassistant.helpers.entity import Entity


 def setup_platform(hass, config, add_entities, discovery_info=None):

     """example_integration sensor platform setup"""

     add_entities([ExampleSensor()])


 class ExampleSensor(Entity):

     """sensor platform class"""


     def __init__(self):

         """sensor init"""

         self._state = None


     @property

     def name(self):

         """return sensor name"""

         return '예제 센서'


     @property

     def state(self):

         """return sensor state"""

         return self._state


     def update(self):

         """sensor update""

         self._state = 'Hello spot'

mb-file.php?path=2022%2F01%2F01%2FF4455_7.png
 

Entity Integration은 설정파일(configuration.yaml)에 작성된 플랫폼 파일에서 setup_platform 함수를 로드합니다. 여기서 매개변수로 전달된 구성요소 추가 함수로 구성요소 객체를 생성할 수 있습니다. sensor 도메인 객체의 프로퍼티는 https://developers.home-assistant.io/docs/core/entity/sensor를 참고하세요.

간단히 설명하자면 센서 객체의 update 함수를 통해 상태가 변경됩니다. update 함수는 일정한 주기로 실행되어 상태가 갱신됩니다.


__init__.py 파일을 수정하세요.

 $ sudo xed __init__.py

mb-file.php?path=2022%2F01%2F01%2FF4456_9.png
 

configuration.yaml 파일을 수정하세요.

 $ sudo xed ../../configuration.yaml

mb-file.php?path=2022%2F01%2F01%2FF4457_8.png
 

홈어시스턴트 메인화면에서 구성하기 > 서버 제어 > 다시 시작하기 를 누릅니다.

mb-file.php?path=2022%2F01%2F01%2FF4448_3.png
mb-file.php?path=2022%2F01%2F01%2FF4449_4.png


홈어시스턴트 메인화면에서 개발자 도구 > 상태로 이동하면 sensor.yeje_senseo 구성요소의 상태가 Hello spot 으로 설정된 것을 확인할 수 있습니다. entity_id를 따로 설정해주지 않으면 자동으로 <domain>.<name>으로 생성됩니다.

mb-file.php?path=2022%2F01%2F01%2FF4458_10.png


#홈어시스턴트# HomeAssistant# 컴포넌트# component# 플랫폼# platform
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)