시리야 불 꺼줘! 조명 제어 시스템 구축한 후기입니다

들어가며

잠시 2015년으로 돌아가 보겠습니다. 학교 끝나고 집에 와서 새벽까지 폰을 만지다가 눈이 감겨와 잠깐 졸았습니다. 이대로 잠들면 참 좋겠지만 눈을 찌르는 따가운 천장 조명 불빛이 너무 원망스러웠습니다. 불을 끄러 일어나야 하는데 그러면 잠이 깨버리니 이러지도 저러지도 못하는 상황.

눈부셔..

눈부셔요

당시에 어디서 주워들은 건 있어서(한창 IoT가 어쩌구.. 할 때였습니다) 라즈베리파이를 사용해 뭐라도 해보겠다고 마음을 먹었습니다. 결국 원하는 것을 만들어내긴 했지만 상당히 조잡하고 기능상의 제약이 많았습니다.

내가 짠 코드

간신히 지탱되고 있었죠

완벽한 것이 갖고 싶었습니다. 완벽하다 함은 이런 것이죠:

  • 모듈화되어 있을 것. 조명을 바꿔도, 이사를 가도 간단하게 탈부착할 수 있을 것.

  • 제어가 간편하고 세부적인 설정이 가능할 것. 무엇보다 HomeKit을 통해 Siri로 제어가 가능할 것.

  • LAN에 연결되어 통신하며, 휴대전화나 데스크탑과 호환되는 프로토콜을 사용할 것.

  • 내가 처음부터 끝까지 직접 만들었을 것.

올해 들어서야 저 조건들을 만족하는 시스템을 구축할 수 있었습니다. 오픈소스의 힘이 아주 컸습니다. 한번 살펴보겠습니다.

어떻게 생겼나요

제어 시스템은 하나의 메인 컨트롤러와 여러 노드들로 구성됩니다. 메인 컨트롤러는 라즈베리 파이 위에서 돌아가며, 노드와 사용자를 이어주는 서버 역할을 합니다. 각 노드는 Wi-Fi를 통해 메인 컨트롤러 서버와 연결됩니다.

light-controller-topology.png

Home Assistant는 라즈베리파이 위에서, 각 노드의 ESPHome은 ESP 보드 위에서 돌아갑니다.

메인 컨트롤러는 Home Assistant 서버를 구동합니다. 이게 진짜 좋습니다. 예전에는 제어 소프트웨어를 바닥부터 짜야지! 하는 헛된 망상을 품고 있었는데, 포기하니 길이 보입니다. 진짜 좋은 오픈소스 스마트홈 자동화 소프트웨어입니다.

Home Assistant

  • Home Assistant(줄여서 HA)를 사용하려면 PC나 적절한 하드웨어에 전용 운영체제를 설치하는 방법이 있고, Docker 위에서 실행하는 방법이 있습니다. 저는 Docker를 사용했습니다.

  • HA가 진짜 (정말로) 많은 확장을 지원합니다. 애플의 HomeKit ,아마존의 Alexa, 구글 Home은 물론이고 ESPHome(아래에 나와요!)같은 다른 플랫폼의 노드도 지원합니다.

제어 노드

실제로 일을 하는건 HA(아래에서 자세하게 다룰게요!)가 아니고, 조명과 연결된 릴레이를 구동하는 제어 노드입니다. 저는 아두이노와 호환되는 ESP8266 계열 보드를 사용했습니다.

ESP8266

  • 중국의 Espressif 사에서 만든 MCU입니다.

  • 플래시 메모리와 SRAM은 넘치게 충분하고 Wi-Fi 연결까지 지원하는데 가격이 몇 천원 안 합니다!

  • 이 MCU로 만든 보드가 여러 종류가 있는데, 저는 ESP-01, NodeMCU 등을 사용했습니다.

보드가 있으면 이제 HA 서버와 통신하고 조명을 제어하는 펌웨어를 짜서 올려야 합니다. 간단하게 생각해도 실시간에 가까운 HTTP 통신, GPIO를 통한 PWM 제어 등이 떠오르네요.

어찌어찌 잘 작성해서 업로드해도, 개선점이 생기거나 버그가 발견되어 펌웨어를 업데이트할 일이 생기면 천장에 올라가거나 배전반을 뜯고서 보드를 꺼낸 다음 다시 플래싱을 거쳐야 합니다.

전구 교체

훅 가는 수도 있습니다.

매번 하드웨어에 접근하고 싶지 않다면 OTA 업데이트까지 고려해야 하죠. 우리가 하고 싶은 건 그냥 GPIO 제어일 뿐인데 따져야 할 것이 너무 많지 않습니까?

다행히 이런 생각을 가진 사람들이 ESPHome이라는 물건을 만들어 놓았습니다. 무려 yaml 파일에 설정만 써 놓으면 펌웨어 생성부터 플래싱과 업데이트까지 도와줍니다(!).

짜지 마세요. 라이브러리 갖다쓰세요.

ESPHome

  • 이름대로 ESP8266 또는 비슷한 플랫폼을 지원합니다.

  • 설정할 수 있는 범위가 어마어마합니다. 문서도 잘 되어 있습니다.

  • IoT 노드로 사용한다고 할 때, 보드가 할 수 있는 일을 ESPHome의 한계로 못 하는 일은 없는 것 같습니다.

이제 펌웨어가 탑재된 ESP8266이 생겼습니다. 남은 일은 이 보드에 전원을 공급하고, 220V 교류 또는 12V 직류를 제어하는 일입니다.

아무리 ESP8266이 좋다 한들, 3.3V로 움직이는 마이크로 컨트롤러만으로는 이 큰 에너지를 직접 제어할 수 없습니다. BJT든 MOSFET이든 릴레이든, 어떠한 전류 제어 회로가 필요합니다. 또 그 회로를 고정하고 주변 환경을 견딜 수 있도록 모듈화해야 합니다.

이러한 제어 모듈을 얻을 수 있는 방법은 두 가지가 있는데, 첫째는 직접 기판을 만드는 것이고, 두번째는 이미 시중에 풀린 물건 중에 하나를 사오는 것입니다. 후자가 훠어얼씬 쉽습니다. 특별한 이유가 아니라면 잘 찾아서 하나 구매하시는걸 추천합니다!

직접 만드는 선택

  • ‘회로가 간단하니 어떻게든 만들면 되겠지’라는 생각으로 만들고 이 글을 썼는데, 글 올린지 세 시간 만에 중대한 결함을 발견했습니다(ㅋㅋㅋㅋ). 분명히 껐는데 LED가 깜빡거려요!

  • PCB 레이아웃을 그릴 때에, 아니 회로도를 그릴 때 부터 노이즈나 순간적인 전압 강하와 같은 것들을 전혀 고려하지 못 했기 때문에 결과적으로는 아주 끔찍한 물건이 되었습니다…

기성품을 구매하는 선택

  • 알리익스프레스 등에서 light wifi switch 등의 키워드로 검색하면 아주 많은 제품들이 쏟아져 나옵니다. 1만원을 넘는 제품은 거의 없고 국내까지 2주면 배송됩니다.

  • 그 중에서 ESP8266 계열의 컨트롤러를 사용하는 보드를 찾아 구매하시면 됩니다.

기성 모듈을 구매한 경우, 최초 1회 제품을 뜯어서 펌웨어를 직접 올려주는 작업이 필요합니다. 제가 구매한 Sonoff BASICR2는 다행히 UART 단자를 모두 노출하고 있어 어렵지 않게 플래싱할 수 있었습니다.

sonoff-basicr2-uart-terminals.jpg

ESP8266은 아니지만 이와 유사한 ESP8285가 사용되었습니다. 하단에 GND, TX, RX, 3V3 단자가 노출되어 있습니다.

플래싱에 성공하지 못한 경우도 있었는데요, 어느 모듈은 뚜껑을 열어 보니 ESP8266이 아닌 완전히 다른 MCU를 사용하고 있었습니다. 결국 그 컨트롤러의 납땜을 녹여 제거한 뒤 가지고 있던 ESP-01 보드를 이식했습니다.

12v-led-domming-switch-from-ali-chip-replaced.jpg

기존 보드를 떼어내고 그 자리에 ESP-01을 붙였습니다. 다행히 크기가 거의 같았습니다.

방에 설치된 제어 노드 중 두 개는 220V 교류 전류를 직접 다룹니다. 물론 전원을 차단하고 작업했지만, 어째서인지 중성선 연결할 때에 자그마하게 스파크가 튀는 것을 보고 식겁했습니다. 전기 작업할 때에는 안전이 우선입니다 여러분 😉

메인 컨트롤러

얼마 전에 구매한 라즈베리파이 4에 Docker를 설치하고 아래 명령으로 HA 컨테이너를 올렸습니다:

docker run --init -d \
  --name homeassistant \
  --restart=unless-stopped \
  -v /etc/localtime:/etc/localtime:ro \
  --network=host \
  homeassistant/raspberrypi4-homeassistant:stable

나머지는 문서에 나온 대로 주욱 따라가며 진행했습니다. 사실 문서를 볼 필요가 그리 많지 않았습니다. 웹 브라우저로 http://[라즈베리파이ip주소]:8123에 접근하면 친절한 UI가 마중나와 줍니다.

ha-dashboard.png

로그인하면 나오는 대시보드입니다. 지금은 이것저것 꾸며 놓았습니다.

ESPHome으로 노드들을 설정해 놓았다면, HA 콘솔 왼쪽 하단 알림 탭에 노드들이 나타납니다. 또는 구성 > 통합 구성요소에서 직접 구성 요소를 추가할 수 있습니다.

구성 요소는 아까 설정한 노드일 수도, 애플 HomeKit 확장일 수도, HA 앱을 설치한 기기일 수도 있습니다.

my-ha-config.png

사용중인 구성입니다. ESPHome 노드 세 개, Siri 지원을 위한 HomeKit, 그리고 맥과 아이폰에 설치한 HA 앱입니다.

HA가 지원하는 기능 중에 괜찮은 것들이 많습니다. 아래는 그 중 자주 쓰는 기능입니다:

시스템 모니터

ha-system-monitor.png

  • HA를 구동하는 호스트 시스템을 모니터링할 수 있습니다.
  • 일단은 CPU 로드와 온도, 그리고 램 사용량을 모니터링 중입니다.
  • 라즈베리 파이 쉘을 열지 않고도 온도를 볼 수 있어 편합니다 :)

로그

ha-log.png

  • 작동이 이상하거나 구성 요소 간의 연동이 원활하지 않을 때(HomeKit이 좀 자주 그렇습니다..) 로그를 보면 뭔가가 써 있습니다.
  • 내부에서 생긴 오류 뿐만 아니라 외부에서 로그인을 시도해올 때에 계정 정보가 틀려도 보안 경고와 함께 로그를 남겨줍니다.

기록 그래프

ha-record-graph.png

  • 노드의 상태 변화를 모두 기록해 줍니다.
  • 여러 형태로 열람할 수 있습니다. 이벤트 로그 형식으로 볼 수도 있고, 위 스크린샷처럼 그래프 형태로도 볼 수 있습니다.

HomeKit 연동

사실 Home Assistant 구축보다 HomeKit과의 연동이 더 중요합니다! 불 켜려고 귀찮게 매번 웹 브라우저를 켤 수는 없잖습니까?

HA에서 HomeKit 구성 요소를 추가하면 옵션을 몇 개 물어본 후에 설정 방법을 알려 줍니다. 아이폰의 Home 앱을 열고 시키는 대로 따라하면 통합이 완료됩니다.

이후 아이폰의 설정의 제어 센터에서 홈 제어를 켜 주면 아래처럼 제어 센터에서 노드가 보입니다.

homekit-control-center.PNG

물론 Siri와의 연동도 됩니다. 잘 자라고 하면 불을 모두 끄는 Dark scene이 실행되는 식입니다.

자동화

  • Scene을 기반으로 여러 제어를 묶을 수 있습니다.
  • 예를 들어 Dark천장 조명, 책상 조명무드등을 모두 끄는 scene입니다.

집에서 나갈 때마다 Siri에게 부탁하거나 휴대전화를 조작하는 것도 귀찮기 때문에 위치 기반 제어도 등록해 놓았습니다. 집으로 등록된 좌표에서 멀어지면 집을 떠난 것으로 보고 불을 모두 꺼 줍니다.

위치 기반 제어

  • Geo-fence 기반으로 작동합니다. 집에서 대략 반경 10m 정도까지 포함하는 것 같습니다.
  • 모든 위치 기반 서비스들이 그렇듯 배터리 소모가 심합니다 😢

마치며

Home Assistant 좋습니다. ESPHome두요.

댓글