본문 바로가기
Hardware/Home Assistant(라즈베리파이)

ESPHome 디바이스와 다른 Home Assistant entity 연결하기 (Node-RED, homeassistant.service)

by lovey25 2021. 3. 16.
반응형

예전에 주방에 있는 2 갱 일반 스위치를 3 갱짜리 Wifi 스위치로 교체를 한 적이 있었습니다. 실제로 필요한 스위치는 주방과 식탁 조명 2가지였지만 3 갱 스위치를 설치해서 3개의 스위치가 여유가 있는 상황이죠.

 

Zemismart WIFI 스위치 KS-811 펌웨어 수정 및 설치 & Home Assistant 연동(feat. 중성선 매립)

Home Assistant(HA)를 서버로 두고 Wifi스위치에 보조등을 달아서 원격 컨트롤하며 사용하고 있고 그리고 아파트 홈네트워크의 RS485 인터페이스로 거실 및 복도 등을 연동해서 컨트롤하고 있습니다.

kwonkyo.tistory.com

그래서 남는 스위치 1개를 Home Assistant(HA)를 통해서 다른 ESPHome 디바이스를 컨트롤할 수 있도록 연결하는 방법을 다루어 보도록 하겠습니다.

연결 목표는 ESPHome 펌웨어로 On/Off 동작만 하는 거실 보조등입니다. 아래 그림처럼 스위치 조작 신호를 HA 서버를 통해서 무선으로 연결해서 보조등을 컨트롤할 수 있게 하는 거죠.

보조등은 똑딱 스위치로 전원이 들어가면 켜지고 차단되면 꺼지는 단순한 전등인데 여기에 ESP8266 모듈을 이용해서 WiFi신호로 전원을 제어할 수 있도록 만들어 두었습니다. ESPHome 펌웨어가 올라가 있어서 지금까지는 HA를 통해서 직접 켜고 끄는 방식으로 사용해 왔습니다. 아래 링크는 ESP8266 모듈을 ESPHome으로 HA와 연동하는 작업을 다루고 있습니다.

 

Home Assistant - ESPHome 연동

IoT, 스마트 가전 등등 이런 키워드로 깊이 들어가면 결국은 집안의 모든 가전기기를 묶어서 모니터링하고 컨트롤하는 홈오토메이션으로 귀결되기 때문에 저도 최근에 "Home Assistant(HA)"라는 오픈

kwonkyo.tistory.com

이제 2개의 서로 다른 ESPHome 디바이스를 연결하는 방법을 알아볼 텐데요. 제가 시도해본 방법은 Node-RED라는 애드인을 사용하는 방법과 ESPHome 자체의 HA엔티티를 컨트롤하는 방법입니다. 하나씩 그 방법 알아보겠습니다.

방법 1. Node-RED

먼저 Node-RED를 이용하는 방법입니다. Node-RED는 사물인터넷에 사용되는 장치들을 기능적으로 연결해주고 논리적 제어를 추가할 수 있도록 해주는 도구입니다. 한마디로 여러 장치들 간의 논리적인 흐름 그러니까 프로그래밍으로 연결하는 그런 도구인데요. 특징이 프로그래밍 방법이 코딩이 아니라 시각적으로 다이어그램을 이용해서 그 논리의 흐름을 그려서 표현하는 방식을 사용하고 있어서 비교적 쉽게 접근할 수 있다는 겁니다. 

물론 다양한 기능을 적재적소에 사용하기 위해서 사용법을 조금은 공부하는 게 필요하긴 해 보입니다. 저 같은 초보가 관련 기술문서를 찾아보지 않고 원래 목적했던 스위치와 전등을 연결하는 정도는 겨우 할 수 있었지만 타이머를 건다거나 피드백을 받는다거나 하는 기능은 구현하지는 못했어요. 저한테는 어려웠어요.

서론이 길었는데 실제 사용법은 이렇습니다. 아래와 같이 기능적 흐름을 그려주기만 하면 됩니다. 엄청 간단하죠?!

벽 스위치의 3번 버튼의 상태를 트리거로 지정을 하고 On, Off 각 상태를 전등 릴레이를 켜는 동작과 끄는 동작에 각각 연결해 줍니다. 각 노드의 속성은 다음과 같이 설정했습니다.

스위치를 누를 때마다 state는 on과 off를 교대로 오가게 되는데 각 상태로 전환될 때마다 연결된 switch:turn_on, switch:turn_off가 호출되면서 전등의 전원을 컨트롤해 주게 됩니다. 

방법 2. ESPHome에서 HA 서비스 직접 호출하기

다음으로 ESPHome에서 HA 엔티티에 직접 접근하는 기능을 이용해서 두 가지의 ESPHome 디바이스를 연결해 보겠습니다. 맨 처음에 언급한 Zemismart 스위치를 커스터마이징 하는 포스팅에서 사용한 ESPHome 코드를 약간 수정만 해주면 되는데요. 스위치의 버튼이 눌려짐을 인식하는 부문을 ESPHome의 Binary_sensor로 구현을 하였습니다. 여기서 제가 사용하고자 하는 맨 마지막 스위치 부분을 아래의 코드로 변경하고 OTA 업로드 진행합니다.

binary_sensor:      
  - platform: gpio
    pin:
      number: GPIO4
      mode: INPUT
      inverted: True
    name: "Bottom"
    on_click:
    - min_length: 50ms
      max_length: 350ms
      then:
        - switch.toggle: load3
        - homeassistant.service:
            service: switch.toggle
            data: 
              entity_id: switch.sidelight
    - min_length: 800ms
      max_length: 3000ms
      then:
        - homeassistant.service:
            service: switch.toggle
            data: 
              entity_id: switch.lance

이 스크립트의 내용은 간단히 알아보면 다음과 같습니다. GPIO4번 핀을 입력단자로 사용하며 이 스위치가 눌려졌을 때 얼마나 오래 누르고 있는지 그 시간을 판단하여 눌려진 시간에 따라 2가지 동작을 수행하도록 하였습니다.

먼저 50~350ms동안 짧게 한번 눌려지면 load3이라고 명명된 Zemismart 스위치 내부의 3번 릴레이 상태를 토글 합니다. load3의 릴레이를 토글 시켜주는 이유는 스위치 옆에 상태 표시 LED가 릴레이에 연결되어 있기 때문에 스위치 상태의 변화를 LED로도 같이 표시하기 위해서입니다. 그리고 바로 다음으로 13행에서 HA서비스 호출이 들어가는데 switch.sidelight라고 정의된 전등의 상태를 같이 토글 해줍니다. 이렇게 하면 3번 버튼이 눌려질 때마다 전등이 켜졌다 꺼졌다를 반복하게 할 수 있습니다.

그리고 17행부터는 그냥 이렇게 끝내기는 아쉬워서 길게 눌렀을 때 기능을 하나 더 추가하였습니다. 800~3000ms 사이의 시간 동안 조금 길게 버튼을 눌러주면 마지막 줄에 정의된 또 다른 디바이스의 상태를 토글 할 수 있는데요. 저는 컴퓨터의 Wake On Lan 스위치로 연결해 두었습니다.

이제 짧게 눌렀을 때는 거실의 보조등을 켜고 끄며, 길게 눌러서 컴퓨터의 전원을 켤 수 있게 되었습니다. 굳이 컴퓨터를 다른 방에 있는 스위치로 켤 필요가 있냐라고 활용성에 의문을 가진다면 뭐 딱히 이유는 없지만 그냥 할 수 있으니까 해본 거고요. 이런 방법으로 HA에 등록된 어떤 디바이스와도 연결을 할 수 있기 때문에 나중에 더 좋은 활용처가 떠오르면 다시 변경하면 되겠죠?!

이상 ESPHome 디바이스를 다른 Entity와 연결하여 제어하는 방법이었습니다.

 

끝!

반응형

댓글