본문 바로가기
DIY자작

ESP8266 코콤 월패드 모션센서, 도어센서, 원격문열기 연동하기

by 도정진 ㅋㅋ잠자 2020. 7. 8.

안녕하세요? 


이전에 트루월드님의 아래 게시글을 보고 있었습니다.


https://www.kimnjang.com/98


언젠가는 해봐야겠다. 그런데 어차피 내년에 이사를 할 것이라서 필요한가? 고민을 많이 했습니다.



그런데 한번 겪어봐야할 것 같아서 직접 작업을 했습니다.





1. 컨트롤러 MCU 선택


ESPHOME 이 HomeAssistant 와 잘 연동이 된다고 해서 일단 ESPHOME 이 지원되는 칩으로 선택을 하게 되었습니다.


그 와중에도 저가 제품인, ESP8266 시리즈를 알아보게 되었는데요.


ESP01 제품 하기의 제품인데, 매우 저렴합니다. 그런데 일단은 초기에는 한 보드 위에 플래슁이 가능한 USB 포트가 있으면 조금 더 편하게 접근할 수 있을 것 같아서 2번째 사진의 제품을 구매하게 되었습니다.



nodemcuv2 제품입니다.



일단은 아두이노 기반으로 되어 있고 무엇보다 USB 가 있어서 플래슁이 편할 것 같았습니다.


이것과 더불어, 납땜에 필요한 몇가지 부수기재를 주문했고 당장 필요한 부품도 추가로 구매하여 대략 4만원의 예산이 들어갔습니다.

(그냥 완제품 샀으면 더 쌀법 했지만, 제가 많은 부수기재들을 정리를 해서 돈이 조금 더 들어갔습니다.)



머릿속으로 시뮬레이션 하면서 부품을 구매해서 혹시나 빠졌는게 있을까 고민이 되었지만, 다행히 아구는 잘 맞았습니다.





2. 월패드 배선 공부


일단은 월패드의 경우 


월패드 단자함이 대부분 월패드 기기 뒤쪽에 있기 때문에 해당 부분을 참고하면 아래와 같습니다.


(사진은 트루월드님 사진을 도용했습니다.)



자 그럼 일단 왼쪽 위 부터 자석센서 그 오른쪽 동체센서 그 아래에 문열림이 있습니다.


각각 +- 가 있습니다.


자석센서와 동체센서의 경우, +- 둘 중 하나에 동작이 감지되면 12V 에서 Open 상태로 변화합니다.


자석센서의 경우, 닫혀 있을때 12V 를 유지하고

동체센서의 경우, 감지가 되지 않을 때 Open 상태로 바뀝니다.


이 부분은 논리적으로 생각하기 머리가 아프기 때문에, 차후에 소프트웨어적으로 바꿔주시면 되는 문제라 일단 생각만 하고 계시면 됩니다.


다음으로, 원격 문 열기의 경우, DOOR+ 와 DOOR- 를 쇼트시켜주면 문이 열립니다.


계속 쇼트가 되어 있으면 되지 않기 때문에 500msec 정도로 끊어 주셔야 합니다.





3. 회로 구성


그럼 일단은 GPIO 기준으로 나온 그림을 다시 보면, 아래와 같습니다.



GPIO 넘버를 기준으로 GPIO0 1 3 9 10 16 번은 특이한 상황에서 사용을 하기가 애매할 수 있습니다.


제가 필요한 GPIO 갯수는 3개만 있으면 됨으로,


GPIO4 : 도어센서

GPIO5 : 동체센서

GPIO12 : 릴레이 스위치


이렇게 3개를 사용하기로 했습니다.


추가적으로 ESP 시리즈는 3.3V 를 사용하기 때문에 GPIO도 3.3V 근방으로 설정을 해야합니다. 이때, 전압분배 회로를 사용하여 300K / 100K 를 통해 3V 정도가 GPIO 로 들어가게 구성을 해야합니다.


그리고 월패드의 전원 자체가 12V 이기 때문에 12V --> 5V 컨버터도 필요합니다.


처음에는 VIN 단자를 통해 12V 를 공급해도 크게 문제가 없는 스펙인 것으로 알고 있었지만, 아무래도 보드 위에 있는 레귤레이터에서 열이 많이 날것 같아서 따로 모듈을 사용했습니다.


릴레이도 5V 였기 때문에 꼭 필요했습니다. 그리고, 릴레이 5V는 대부분 3.3V에서도 동작하지만, 신뢰성을 보장할 수 없기 때문에 컨버터 모듈은 거의 필수라고 생각이 되었습니다.


결과적으로, 회로 구성은 아래와 같이 하게 되었습니다.



이해를 돕기위해 대충 그린 것으로 회로는 맞지만 정확하지 않을 수 있습니다.


핀이 총 6개이며, 레귤레이터는 모듈을 사용했지만, 회로도에는 레귤레이터를 넣어 두었습니다. (마땅히 부품이 없네요)


다음으로 레귤레이터도 실제로 풀업이 있는 레귤레이터로 0V 일때 트리거가 걸리고 HIGH-Z 일때 OFF 입니다. 그걸 반영하여 그렸습니다.

(제가 구매한 릴레이가 좀 특이해서 고생을 조금 했습니다.)


모션과 자석 입력을 D1 D2 로 받습니다. 이 부분은 꺼꿀로 되어도 나중에 코드를 변경하면 되기 때문에 일단은 상기처럼 그려 두었습니다.





4. 실제 조립


게시글 초기에 주문한 부품들로 조립을 하기 시작했습니다. 대략 30분 정도가 걸린것 같습니다.


사진으로 보면 크게 보이던 PCB가 직접 받고 보니 너무 작네요.. 결국에 뒷면에 레귤레이터 모듈과 릴레이를 두었습니다.




저항 공간 확보 때문에 어쩔 수 없이 ESP8266을 치우치게 놓게 되었습니다.


나머지도 쓱싹 쓱싹 조립합니다.













5. 코드 작성 및 컴파일 하기


리눅스 환경 구축이 귀찮아서 빌드를 Beelink GTMINI 에서 했습니다.


esphome 을 설치하면 되는데요. esphome 빌드는 아두이노처럼 하는게 아니라 yaml 을 작성하면 그걸 기반으로 빌드를 해줍니다.


root@aml:~# pip3 install esphome

Requirement already satisfied: esphome in /usr/local/lib/python3.7/dist-packages (1.14.5)

Requirement already satisfied: tornado==5.1.1 in /usr/local/lib/python3.7/dist-packages (from esphome) (5.1.1)

Requirement already satisfied: colorlog==4.1.0 in /usr/local/lib/python3.7/dist-packages (from esphome) (4.1.0)

Requirement already satisfied: paho-mqtt==1.5.0 in /usr/local/lib/python3.7/dist-packages (from esphome) (1.5.0)

Requirement already satisfied: platformio==4.3.4 in /usr/local/lib/python3.7/dist-packages (from esphome) (4.3.4)

Requirement already satisfied: pyserial==3.4 in /usr/local/lib/python3.7/dist-packages (from esphome) (3.4)

Requirement already satisfied: PyYAML==5.3.1 in /usr/local/lib/python3.7/dist-packages (from esphome) (5.3.1)

Requirement already satisfied: ifaddr==0.1.6 in /usr/local/lib/python3.7/dist-packages (from esphome) (0.1.6)

Requirement already satisfied: protobuf==3.11.3 in /usr/local/lib/python3.7/dist-packages (from esphome) (3.11.3)

Requirement already satisfied: esptool==2.8 in /usr/local/lib/python3.7/dist-packages (from esphome) (2.8)

Requirement already satisfied: voluptuous==0.11.7 in /usr/local/lib/python3.7/dist-packages (from esphome) (0.11.7)

Requirement already satisfied: pytz==2020.1 in /usr/local/lib/python3.7/dist-packages (from esphome) (2020.1)

Requirement already satisfied: tzlocal==2.0.0 in /usr/local/lib/python3.7/dist-packages (from esphome) (2.0.0)

Requirement already satisfied: bottle<0.13 in /usr/local/lib/python3.7/dist-packages (from platformio==4.3.4->esphome) (0.12.18)

Requirement already satisfied: tabulate<1,>=0.8.3 in /usr/local/lib/python3.7/dist-packages (from platformio==4.3.4->esphome) (0.8.7)

Requirement already satisfied: marshmallow>=2 in /usr/local/lib/python3.7/dist-packages (from platformio==4.3.4->esphome) (3.6.1)

Requirement already satisfied: semantic-version<3,>=2.8.1 in /usr/local/lib/python3.7/dist-packages (from platformio==4.3.4->esphome) (2.8.5)

Requirement already satisfied: click<8,>=5 in /usr/local/lib/python3.7/dist-packages (from platformio==4.3.4->esphome) (7.1.2)

Requirement already satisfied: colorama in /usr/local/lib/python3.7/dist-packages (from platformio==4.3.4->esphome) (0.4.3)

Requirement already satisfied: requests<3,>=2.4.0 in /usr/lib/python3/dist-packages (from platformio==4.3.4->esphome) (2.21.0)

Requirement already satisfied: pyelftools<1,>=0.25 in /usr/local/lib/python3.7/dist-packages (from platformio==4.3.4->esphome) (0.26)

Requirement already satisfied: six>=1.9 in /usr/lib/python3/dist-packages (from protobuf==3.11.3->esphome) (1.12.0)

Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from protobuf==3.11.3->esphome) (40.8.0)

Requirement already satisfied: ecdsa in /usr/local/lib/python3.7/dist-packages (from esptool==2.8->esphome) (0.15)

Requirement already satisfied: pyaes in /usr/local/lib/python3.7/dist-packages (from esptool==2.8->esphome) (1.6.1)


다음으로 아래의 코드를 작성했습니다. 코멘트가 들어있으니, 원본과 코멘트본을 첨부 드립니다.


하기 코드는 하기 사이트를 참고하면 쉽게 작성이 가능합니다.


https://esphome.io/


root@aml:~# cd /opt/esphome/

root@aml:/opt/esphome# ls

kocom  kocom.yaml


root@aml:/opt/esphome# cat kocom.yaml

esphome:
  name: kocom
  platform: ESP8266
  board: nodemcuv2

wifi:
  ssid: "DJJ_AP"
  password: "12345678"

  ap:
    ssid: "kocom_ESPHOME"
    password: "12345678"

api:

ota:

binary_sensor:
  - platform: gpio
    name: "Door Sensor"
    pin:
      number: GPIO4
      inverted: True
    device_class: door
  - platform: gpio
    name: "Motion Sensor"
    pin:
      number: GPIO5
      inverted: True
    device_class: motion

switch:
  - platform: gpio
    pin:
      number: GPIO12
      inverted: True
      mode: OUTPUT_OPEN_DRAIN
    restore_mode: ALWAYS_OFF
    id: relay
  - platform: template
    name: "Door Open"
    icon: 'mdi:door'
    turn_on_action:
    - switch.turn_on: relay
    - delay: 500ms
    - switch.turn_off: relay
    turn_off_action:
    - switch.turn_off: relay


esphome: # 장비를 설정합니다.
  name: kocom # 이름을 설정합니다.
  platform: ESP8266 # MCU 를 설정합니다.
  board: nodemcuv2 # 보드를 설정합니다.

wifi: # 와이파이를 설정합니다.
  ssid: "DJJ_AP"
  password: "12345678"

  ap: # 상기 와이파이가 연결이 안될경우, 핫스팟 모드를 설정합니다.
    ssid: "kocom_ESPHOME"
    password: "12345678"

api: # HomeAssistant 에서 연결하기 위해서는 선언이 필요합니다.

ota: # OTA 로 펌웨어를 업로드 하기 위해서 필요합니다. (설정하지 않으면 매번 USB 연결해야함)

binary_sensor: # 센서를 설정합니다.
  - platform: gpio # GPIO로 설정하고
    name: "Door Sensor" # 이름을 지정합니다.
    pin: # 핀설정을 합니다.
      number: GPIO4
      inverted: True # 코콤 센서가 동작하면 LOW 로 내려감으로 인버트 속성을 줍니다.
    device_class: door # Home Assistant 에서 도어 센서로 인식하도록 클래스를 넣어줍니다.
  - platform: gpio # 상기와 비슷한 양상입니다.
    name: "Motion Sensor"
    pin:
      number: GPIO5
      inverted: True
    device_class: motion

switch: # 문 열기 용 스위치 입니다.
  - platform: gpio 
    pin:
      number: GPIO12
      inverted: True # 릴레이 자체가 Invert로 되어 있어서 인버트 속성을 줍니다.
      mode: OUTPUT_OPEN_DRAIN # 릴레이가 풀업이고 전류량이 많이 나가서 OFF 상태일 때 HIGH-Z 상태가 되게 하고 OFF 일때 GND 로 설정합니다. (이것 때문에 고생 많이 했습니다. ㅠㅠ 설마 오픈 드레인 설정이 안되면 어떻게 하지? 조마조마 했네요.)
    restore_mode: ALWAYS_OFF # 부팅중에 켜지는것을 방지합니다. (문이 갑자기 열리는 것 방지)
    id: relay # 하기 template 에 쓸 이름을 지정합니다.
  - platform: template
    name: "Door Open"
    icon: 'mdi:door'
    turn_on_action: # 500msec 릴레이를 켜고 끕니다.
    - switch.turn_on: relay
    - delay: 500ms
    - switch.turn_off: relay
    turn_off_action: # 끄는 것은 그냥 끄기로 둡니다.
    - switch.turn_off: relay


그럼 이제 상기 yaml 파일로 컴파일을 해보겠습니다.


저는 이미 작업이 되어 있어서 컴파일 후 플래슁을 OTA 로 할 수 있습니다. 처음에는 USB 로 올려주셔야 합니다.


컴파일 할 때 각종 라이브러리를 받아오는 과정이 하기에는 빠져 있습니다. 처음에 할 때에는 시간이 조금 걸립니다.


root@aml:/opt/esphome# esphome kocom.yaml run

INFO Reading configuration kocom.yaml...

INFO Generating C++ source...

INFO Compiling app...

INFO Running:  platformio run -d kocom

Processing kocom (board: nodemcuv2; framework: arduino; platform: espressif8266@2.2.3)

-------------------------------------------------------------------------------------------------------

HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash

PACKAGES:

 - framework-arduinoespressif8266 2.20502.0 (2.5.2)

 - tool-esptool 1.413.0 (4.13)

 - tool-esptoolpy 1.20600.0 (2.6.0)

 - toolchain-xtensa 2.40802.200502 (4.8.2)

Dependency Graph

|-- <ESPAsyncTCP-esphome> 1.2.2

|   |-- <ESP8266WiFi> 1.0

|-- <ESP8266WiFi> 1.0

|-- <ESP8266mDNS> 1.2

|   |-- <ESP8266WiFi> 1.0

Compiling .pioenvs/kocom/src/main.cpp.o

Linking .pioenvs/kocom/firmware.elf

Building .pioenvs/kocom/firmware.bin

Retrieving maximum program size .pioenvs/kocom/firmware.elf

Checking size .pioenvs/kocom/firmware.elf

Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"

RAM:   [=====     ]  45.2% (used 37012 bytes from 81920 bytes)

Flash: [===       ]  35.0% (used 365328 bytes from 1044464 bytes)

Creating BIN file ".pioenvs/kocom/firmware.bin" using ".pioenvs/kocom/firmware.elf"

==================================== [SUCCESS] Took 19.36 seconds ====================================

INFO Successfully compiled program.

Found multiple options, please choose one:

  [1] /dev/ttyACM0 (TI CC2531 USB CDC)

  [2] Over The Air (kocom.local)

(number):


일단은 저는 윈도우에서 플래슁을 했습니다.


하기 프로그램을 통하면 플래슁이 가능합니다.


https://github.com/esphome/esphome-flasher/releases


상기에서 컴파일한 바이너리는 아래에 위치하고 있습니다.


root@aml:/opt/esphome# cd kocom/.pioenvs/kocom/

root@aml:/opt/esphome/kocom/.pioenvs/kocom# ls

firmware.bin  FrameworkArduino  lib0d3  lib52e                 libFrameworkArduinoVariant.a

firmware.elf  ld                lib4d9  libFrameworkArduino.a  src


진행중에 찍은 사진이 없어서, 일단 시리얼 포트 선택 및 펌웨어 선택하고 Flash ESP 를 누르시면 정상적으로 플래슁이 됩니다.


(잘 안될경우, FLASH 버튼을 1초 누르고 떼고 계속적으로 해보시길 바랍니다. 그런데, FLASH 작업이 시작되고 나서는 손을 떼셔야합니다.)


하기 작업은 esptool 로 올리는 것과 동일하고, 상기 esphome 에서도 동일하게 로그가 나옵니다. (USB를 리눅스에 꽂았을 경우)



부팅이 되고 나면, 하기와 같이 네트워크에 올라옵니다.



처음에 코드를 생성할 때 ota 를 넣지 않아서 너무 귀찮게 작업했습니다. 상기 코드 베이스대로 하면 하기 처럼 OTA 로도 플래슁 가능합니다.


root@aml:/opt/esphome# esphome kocom.yaml run

INFO Reading configuration kocom.yaml...

INFO Generating C++ source...

INFO Compiling app...

INFO Running:  platformio run -d kocom

Processing kocom (board: nodemcuv2; framework: arduino; platform: espressif8266@2.2.3)

-------------------------------------------------------------------------------------------------------

HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash

PACKAGES:

 - framework-arduinoespressif8266 2.20502.0 (2.5.2)

 - tool-esptool 1.413.0 (4.13)

 - tool-esptoolpy 1.20600.0 (2.6.0)

 - toolchain-xtensa 2.40802.200502 (4.8.2)

Dependency Graph

|-- <ESPAsyncTCP-esphome> 1.2.2

|   |-- <ESP8266WiFi> 1.0

|-- <ESP8266WiFi> 1.0

|-- <ESP8266mDNS> 1.2

|   |-- <ESP8266WiFi> 1.0

Compiling .pioenvs/kocom/src/main.cpp.o

Linking .pioenvs/kocom/firmware.elf

Retrieving maximum program size .pioenvs/kocom/firmware.elf

Building .pioenvs/kocom/firmware.bin

Checking size .pioenvs/kocom/firmware.elf

Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"

RAM:   [=====     ]  45.2% (used 37012 bytes from 81920 bytes)

Flash: [===       ]  35.0% (used 365328 bytes from 1044464 bytes)

Creating BIN file ".pioenvs/kocom/firmware.bin" using ".pioenvs/kocom/firmware.elf"

==================================== [SUCCESS] Took 14.69 seconds ====================================

INFO Successfully compiled program.

Found multiple options, please choose one:

  [1] /dev/ttyACM0 (TI CC2531 USB CDC)

  [2] Over The Air (kocom.local)

(number): 2

INFO Resolving IP address of kocom.local

INFO  -> 192.168.0.73

INFO Uploading kocom/.pioenvs/kocom/firmware.bin (369488 bytes)

Uploading: [============================================================] 100% Done...


INFO Waiting for result...

INFO OTA successful

INFO Successfully uploaded program.

ERROR Logger is not configured!





6. 월패드 뒤에 짱박기


아직 치수를 정확히 못재어서 3D 프린팅을 하지 못했습니다.






비닐로 싸두었는데 불안해서 제거하고 전극에 대해서 테이핑을 하였습니다.





7. HomeAssistant Core 와 연동


통합 구성요소에서 ESPHOME 을 선택하고 IP를 입력합니다.


그러면 하기 처럼 구성요소가 올라옵니다.




처음 연동시에는 하기와 같이 연동을 했었습니다.



영상으로 한번 보시겠습니다.





8. 작동 영상


동작영상은 임시로 하기 URL 에서 확인해 주세요.


https://cafe.naver.com/mk802/37896





월패드 뒤쪽에 EW11 / ESP8266 이 있습니다. 어쩌면, EW11 기능을 ESP8266 이 해도 괜찮을 법 했는데...


귀찮아서 다음으로 넘깁니다.


감사합니다.












댓글0