(ESP32 일러스트) ESP32와 함께 우리 집 현관문을 자동문으로 만들기

 

들어가며

요즘 출시하는 도어락을 보면 비밀번호를 입력하지 않아도 핸드폰을 가져다 대거나, 지문 인식을 하면 열리는 제품들이 있습니다. 보안에는 취약할 수 있지만 그 대가로 편리함을 얻을 수 있는 기능들입니다.

아쉽게도 구형 도어락에는 이런 기능이 없습니다. 다행히도 지금 사용 중인 도어락은 월패드에서 무선으로 열 수 있는 기능이 존재합니다. 이 기능을 활용해서 자동으로 열리는 현관문을 만든 이야기를 소개합니다.

 

(월패드: 보통 벽면에 붙어있는 작은 모니터 기기로 집 내부 장치, 초인종, 공동 현관문을 확인하거나 제어할 수 있습니다.)

 

⚙️ 구형 도어락을 어떻게 제어할까요?

위에서 말한 것처럼 월패드와 도어락이 무선(RF통신 장치)으로 연결되어 있습니다. 초인종으로 손님이 오면 월패드에 바깥 화면을 출력하고, 바로 월패드에서 도어락을 열 수 있는 기능입니다.

 

RF장치 배선도

 

벽에 달려있는 월패드를 뜯어보면 안쪽에 RF신호를 보내주는 장치가 있습니다. 

장치에 전원을 공급해 주는 선과 접점 선으로 이루어져 있는데, 이 접점끼리 닿게 되면 RF신호를 무선으로 도어락에 보내는 구조입니다. 그럼 이 접점을 대신해서 닿게 해 주면 도어락을 제어할 수 있지 않을까요?

 

드라이컨택(Dry contact)이라는 개념이 있습니다. 전원을 인가하지 않고 접점만 닿게 해주는 개념입니다.

 

드라이컨택 스위치 (순서대로 외부, 내부 사진)

 

사진에 있는 장치는 드라이컨택을 지원해 주는 Zigbee 스위치입니다. Zigbee 통신을 사용해 HomeAssistant와 같은 스마트홈(자동화) 플랫폼과 연결할 수 있습니다. 이 장치를 HomeAssistant에 연결해 주고 현관문에 사람이 다가온다면 스위치를 켜주면 됩니다.

 

🚶 현관문에 다가오는 걸 어떻게 인식할까요?

이제 현관문에 사람이 다가왔을 때 감지할 방법이 필요합니다. 여기서 `재실`이라는 개념이 등장합니다. 사용자가 집 안에 있는지 없는지 판단하는 방법입니다.

 

여기서는 ESP32 보드와 ESPresense 그리고 휴대폰을 사용해 재실 감지를 합니다.

 

ESPresense 설정 페이지

 

ESPresense는 ESP32와 함께 쓸 수 있는 재실 소프트웨어입니다.

핸드폰에서는 iBeacon이라는 재실 감지를 위한 블루투스 신호를 보내고 ESP32와 ESPresense가 이 신호를 받아 재실 여부를 판단합니다. iBeacon 신호가 감지되었다면 그 사람은 재실 상태인 거고, 현관문 근처에서 재실이 감지되었다면 현관문 주변에 도착했다는 뜻이 됩니다.

 

sensor:
  - platform: mqtt_room
    device_id: "iBeacon:<iBeacon UUID>"
    name: "HomeAssistant에서 사용할 기기 이름"
    state_topic: "espresense/devices/iBeacon:<iBeacon UUID>"
    timeout: 10
    away_timeout: 30 # iBeacon 신호가 끊기고 외출로 판단하기까지 시간

 

ESPresense에서 설정을 마치고 위 코드를 추가해주면 HomeAssistant에서 ESPresense에서 보내준 재실 상태를 확인할 수 있게 됩니다.

 

HomeAssistant 자동화 설정

 

HomeAssistant 자동화 기능을 사용해 현관문에서 재실이 감지되었다면 드라이컨택 스위치를 작동시켜 주면 됩니다.

 

⛔ 이론은 완벽했지만...

지금까지 과정은 좋았지만, 문제가 많습니다.

먼저, 현관문 근처에 와도 도어락이 안 열립니다. 정확하게는 재실 감지가 안됩니다. 재실을 감지하는 ESP32는 집 안에 있는데 핸드폰에서 보낸 블루투스 신호가 금속으로 된 현관문을 뚫어 안까지 도달하지 못합니다.

 

그럼 ESP32를 현관문 밖으로 빼면 되지 않을까요?

현관문 바깥에 있는 초인종을 열어보면 뒤에 작은 공간이 있습니다. 이 공간에 ESP32를 넣고 전원은 초인종의 전원을 끌어서 쓰면 됩니다.

 

그런데 놓친 부분이 있습니다.

초인종에 상시 전원이 들어오면 좋겠지만, 저희 집에서 쓰고 있는 초인종 모델은 상시 전원이 아닌 초인종을 눌렀을 때만 전원이 들어오는 구조입니다. 즉, ESP32를 동작시키려면 초인종을 눌러야 하는 이상한 상황이 발생합니다.

상시 전원을 만들 수는 있습니다. 집 안에 있는 월패드에서 전원을 끌어와 바깥에 있는 초인종까지 가져오면 되는데 일이 너무 커져버립니다.

결국 초인종 안에 ESP32를 함께 두는 방법은 포기해야 됩니다.

 

집 안에 ESP32를 두는 방법으로 돌아옵니다. 

어쩔 수 없이 현관문, 현관문에서도 최대한 바깥에 가깝도록 설치합니다. 그렇게 최종적으로는 현관문 틀에 설치한 상태입니다. 결과적으로는 성공했습니다.

물론 완벽하지는 않습니다. 원하는 목표는 주머니에서 휴대폰을 꺼내지 않아도 문이 열리는 건데, 다섯 번 중 한 번꼴로 작동하지 않습니다. 다행히 주머니에서 꺼내면 작동이 되긴 합니다.

 

🔐 보안에는 문제가 없을까요?

편리함을 얻었지만 보안에는 빈 틈이 생겼습니다.

ESP32와 ESPresense에 설정된 iBeacon 신호를 내보내는 핸드폰만 있으면 언제든지 현관문을 열 수 있습니다. 또는 집 안에 있는데 현관문 자동화가 작동하는 경우입니다.

 

제일 완벽한 재실 감지는 집 곳곳에 ESP32를 달아 모든 곳에서 재실 상태를 유지하는 것입니다. 근데 저희 집은 현관문 근처에만 ESP32를 두고 재실 감지를 하고 있습니다. 현관문에서 멀어지면 집에 있음에도 불구하고 재실이 아니라 외출 상태로 변하는 것이지요. 이 상태로 현관문을 지나치면 외출 -> 재실로 상태가 변하고 집 안에 있는데 현관문이 열리는 일이 생깁니다.

본인 의도하고 다르게 현관문이 열리는 상황이 생긴 것입니다.

 

현관문 자동화 와이파이 확인 조건

 

현관문 자동화에 추가 조건을 달아줍니다.

밖에서는 집에서 사용하는 와이파이와 연결돼있지 않습니다. 와이파이를 연결한 상태로 현관문을 나가면 신호가 약해져 와이파이가 끊기게 됩니다. 이제 와이파이를 추가적인 재실 감지 조건으로 사용할 수 있습니다.

외출에서 재실로 상태가 변했다고 하더라도 와이파이가 연결돼 있다면 현관문을 열지 않도록 추가해 주었습니다.

 

현관문 자동화 시간대 확인 조건

 

여기에 더하여 현관문이 열리지 않는 시간대를 구합니다. 현관문에 도어 센서가 달려있어 언제 문이 열리고 닫혔는지 알 수 있습니다. 이를 통계 내어 사람이 오고 가지 않는 시간대를 알아내고 이 시간대에는 현관문 자동화가 작동하지 않도록 해줍니다.

저희 집은 오전 1시(새벽) ~ 오전 7시 사이였습니다. 해당 시간대면 현관문 자동화가 작동하지 않도록 추가 조건을 걸어줍니다.

 

🖥️ 현관문 자동화 모니터링하기

위에서 설명한 조건을 추가해도 불안한 감이 없지 않아 있습니다. 추가로 현관물 열림 여부, 도어락 작동 여부 등을 모니터링할 수 있도록 만들어줍니다.

 

HomeAssistant에는 애드온 등의 써드파티 기능을 사용해 센서 데이터를 장기 데이터베이스에 기록할 수 있는 기능을 제공합니다. 단기 데이터를 저장하기 위해 PostgreSQL을 사용하고 있는데, 장기 데이터의 경우 보통 시계열 데이터베이스를 사용합니다. 관계형 데이터베이스인 PostgreSQL에는 적절하지 않습니다.

 

PostgreSQL은 시계열 데이터를 저장할 수 있는 TimescaleDB이라는 제품을 제공합니다. TimescaleDB를 사용하게 되면 특별한 러닝커브 없이 PostgreSQL의 경험 그대로 이어서 쓸 수 있습니다. `ltss` 애드온을 쓰면 HomeAssistant에서 TimescaleDB를 쓸 수 있게 됩니다.

 

이제 TimescaleDB에 기록된 시계열 데이터를 불러와 Grafana에 표시해 줍니다.

 

Grafana - 현관문 열림/닫힘, 도어락 잠금/해제, 오작동 여부 통계 차트

 

장기 데이터를 불러와 시간대를 1분 단위로 나눠주고 현관문 열림/닫힘, 도어락 잠금/잠금해제 데이터를 가져와 차트로 그려줍니다.

일반적인 상황이라면 도어락 잠금 해제가 되었을 때 곧바로 현관문이 열려야 합니다. 반대의 상황은 도어락만 잠금 해제되는 상황인데 위에서 말한 의도치 않게 현관문 자동화가 작동하는 상황입니다.

 

이 상황을 따로 통계 내어 `현관문(도어락) 자동화 오작동` 차트로 분리했습니다. 집 안에 사람이 있을 때 오작동 수치가 올라가면 상관없지만, 아무도 없을 때 수치가 올라간다면 보안상으로 문제가 있겠죠.

 

마치며

이제 구형 도어락을 신형 도어락처럼, (핸드폰을 들고 있는) 몸만 다가가면 열리도록 만들었습니다.

ESP32 위치 조정을 통해 최대한 현관문이 바로 열릴 수 있도록 했고, TimescaleDB와 Grafana를 사용해 오작동 상태를 모니터링할 수 있도록 만들었습니다.

 

배터리 효율만 포기한다면, 핸드폰 설정을 통해 블루투스 신호를 강하게 쏠 수 있지만 보조배터리까지 들고 다니는 상황에 배터리 효율을 포기하기는 어렵겠네요 😅