본문 바로가기
서버/리눅스 서버

HomeAssistant Core / 코콤 월패드 샤오미 공기청정기 연동하기 / Elfin EW11 / RS485

by 도정진 ㅋㅋ잠자 2020. 4. 18.

안녕하세요? 도정진입니다.


새로 이사한 집이 나름 최신식이라 월패드가 있었습니다. 이 월패드의 다수 기능을 휴대폰으로 가져와보도록 하겠습니다.


한편, 아래의 글은 IOT 어린이.. 아린이가 작성한 글로써, 몇가지는 효율적이지 못한 부분이 있을 것이며, 틀린 부분도 있을 것입니다.


감안하시고 봐주시길 바랍니다.



시작합니다.





1. 이전 집 환경과 지금 집 분석


이전 집의 경우, 월패드라는 것이 없었으며, 모든 것들이 아날로그였습니다.


본격적으로 IOT 를 시작하게된 계기는 에어컨과 전기온수기 (샤워용) 으로 인한 전기요금 부분 때문이였습니다.


그럼, 작년 7월 부터 이번 3월까지 산 집에서 첫달 전기요금을 보시겠습니다.



대략 일주일 사용량이 136KW 로 ㄷㄷ한 수치입니다. 실제로 이 사용량이 어떻게 나왔는지는 모르겠으나 대책을 세워야겠다고 생각했습니다.


그렇게 구매한 것이 다원 WIFI 플러그를 주문했고 온수기가 새벽 6시에 작동하여 6시 30분이면 씻을 수 있도록 하루에 한번 동작하도록 설정했습니다.


https://pmshop.co.kr/product/detail.html?product_no=59&cate_no=33&display_group=1



해당 플러그는 서버 장애로 문제가 조금 있었지만, 사용성은 최강을 자랑합니다. 실시간 전력 사용량 및 누적 사용량 그리고 타이머에 대기전력 차단 기능까지 완벽합니다.


실제로 6시에 켜짐 타이머만 맞추어 두고 온수기가 물을 다 끓이면 대기전력 이하로 떨어지는 부분으로 자동으로 꺼지도록 설정해 두고 많은 전기 사용량을 아낄 수 있었습니다.


추가적으로 아래의 스마트띵스 북미판을 에디님께 대여받고 샤오미 제품군과 직비 플러그 그리고 다원 스위치까지 연동을 해보기도 했습니다.




이후는 아래와 같이 연동했기 때문에 ST 앱에서 한번에 컨트롤이 가능하였습니다.




그러나, 이사한 후 오피스텔은 월패드라는 장비가 있었습니다. 어쩌면 편하지만 어쩌면 불편한 장비입니다.



몇일 동안 이 장비를 어떻게 하면 좋을까 하고 고민을 많이 했습니다.


이전에 쓰던 다원 스위치 북미 Zwave 스위치도 어떻게 넣어보기가 애매한게 .. 스위치가 아래와 같이 특이한 구조로 되어 있기 때문입니다.


(이전 집에서는 일반 전등 스위치와 사이즈가 동일함으로 설치 가능)


아래 사진 부터는 지금 오피스텔인데 일괄소등 스위치.. 처음에 방문했을 때 불을 10분여동안 못켰다는 사실이 .. ㅠㅠ 이 버튼을 눌러줘야 켜지는지 처음 알았습니다. ㅎㅎ





이러한 상황에서 내 월패드도 혹시 RS485 통신이 될까? 의심을 품게 되었고.. 알리 익스프레스에서 RS485 <---> TCPIP 모듈을 하나 구매하게 됩니다.


https://ko.aliexpress.com/item/32926395786.html?spm=a2g0s.9042311.0.0.40dd4c4dWAkaaK






2. RS485 라인 찾기


일단, 아파트의 경우에는 각 방 온도 컨트롤러가 있어서 부엌의 밑에 서랍장을 열어보면 허니웰 컨트롤러에서 라인을 딸 수 있습니다.


그리고 단자함에서도 찾을 수가 있는데요. 아니면, 가스 밸브 잠금때문에 있는 환풍기 위쪽에서도 찾으실 수 있습니다.



그러나, 제가 사는 오피스텔의 경우, 가스는 보일러로만 쓰이고 조리는 전기렌지로 하기 때문에 환풍기는 해당사항 X


기능이 작기 때문에 단자함에도 X



단자함에 그냥 공유기와 제 메인서버 GTMINIA 를 넣어두고 끝났습니다. 왼쪽의 국선 쪽에 홈넷 IN / OUT 이 보였지만, RS485 라고 되어 있지 않아서 모험을 할 수는 없었습니다. 제 집이 아니라서.. ^^;;


그래서 확실하게 찾아야 해서 다음 타겟으로 넘어갔습니다.



보일러는 방이 1개라서 필요 X


이렇다 보니 결국에 보일러실을 보게 되었는데요. 왼쪽으로 허니웰이라고 컨트롤러가 달려 있었습니다.



다른 사용자의 후기에 따르면 상기 허니웰 컨트롤 박스에는 RS485 라인이 있기 때문에 확실히 성공하지만, 실제로 저 제품을 분리하기 위한 공간적 제약이 있어서 일단 포기하고 넘어갔습니다.


그래서 혹시나해서 월패드 뒤쪽을 보기 위해서 분해를 했고.. 결과는 아래와 같았습니다.


실제로 오피스텔 입주 설명서에 월패드 이름이 WLT-46XX 로 설명되어 있었지만 실제로 까보니 제품명은 KHN-Q100LT 이고 코콤 제품입니다.


코콤 제품은 스마트띵스 카페에서 많이 분석이 된 것으로 유명하고 일단 잘 될것이라는 자신감은 생기는 순간이였습니다.



아래 사진에서 데이터 라인이 보이고 12V 전기 라인이 보입니다. EW11 모듈이 5V ~ 18V 까지 받기 때문에 딱 월패드 뒤 공간에 숨겨두면 될 것으로 점첬습니다.





한편, 게이트맨 월패드에서 문이 열리는 것은 상기 12V / GND / DOOR / DOOR 에서 2번째 3번째를 쇼트 시키면 열리는 것을 확인했고, 문열림 패킷 자체가 RS485로 되는 것이 아닌 월패드의 전용 시그널이라

차후에 ESPHOME 을 활용하던지 하여 연동을 하면 될것 같았습니다.


여기서.. 아무래도 문열림까지 연동하면 복구에 시간이 많이 걸려서 간단하게 RS485 로 컨트롤 되는 것만 연동하려고 합니다.





3. RS485 Elfin-EW11 테스트


핀 설명 및 개봉기는 아래와 같습니다.





4개의 핀만 사용하게 되는데요. 리셋할 때에는 4번핀이 추가로 필요합니다. (랜선을 짤라야 될것 같네요.)


5 : A+

6 : B-

7 : VCC

8 : GND


그래서 ABCD 입니다.



일단 테스트를 위해서 전원을 넣어 보았습니다. 데이터 라인 AB를 제외하고 C에 + / D에 - 를 연결하면 일단 불이 들어오면서 켜집니다.




그럼 초기셋팅을 진행해야 합니다. 아래와 같이 와이파이를 연결해 줍니다.



http://10.10.100.254/ 로 들어가서 admin / admin 으로 로그인 합니다.



와이파이 설정을 하기 위해서 SYSTEM SETTINGS 로 이동합니다.



와이파이 세팅에서 모드를 STA 로 선택하고 SCAN을 누릅니다.


그리고 자기 SSID를 선택하고 비밀번호를 넣은 다음 저장합니다.



한편, DHCP 관련 부분은 꼭 켜두시길 바랍니다. 차후 연결이 안될 경우 골치아픕니다.

리셋을 해야해서 귀찮아질 수 있습니다.



정상적으로 공유기 설정창에서 올라왔음을 체크합니다.

이때 DHCP 고정 할당도 해주시면 좋습니다.



할당된 IP 로 연결해보면 잘 연결됨을 알 수 있습니다.



그럼 일단 테스트를 해보겠습니다.


하기 프로그램을 받아서 연결을 하시면 됩니다.


http://blog.daum.net/pg365/276



하기 사진은 문자열을 보내본 부분입니다.


실제로 패킷을 캡쳐할 때는 HEX 로 받아보셔야합니다.



흠, 일단 시리얼 포트가 연결이 안되어 있어서 데이터가 보내지기만 하고 받아지지는 않는 상황입니다. 


그래서 WebUI 에서 데이터 바이트가 올라갔는지 한번 체크해봅니다.


정상입니다 !!






4. RS485 Elfin-EW11 짱박기


자 그럼 2번에서 데이터 라인 및 12V 전기가 들어옴을 파악했고, 아래와 같이 결선합니다.


데이터는 기판의 + / EW11 + 처럼 짝이 맞게 연결해 주시면 됩니다.


자, 먼저 데이터 라인 나사 풀어서 선 넣어줍니다.



다음으로 전기 라인 넣어줍니다.



결선 완료!!!



안쪽에 살짝 위치시켜 줍니다 ㅎㅎ



이후 패킷 캡쳐를 해보니 아래와 같이 출력이 되네요.


월패드 버튼을 누르면서 몇가지 체크를 해보니 AA55 ~ 0D0D 로 끝나는 것을 알게 되었습니다.



AA 55 30 DC/BC/BD 이렇게 코드가 있습니다.


이 코드에 대해서는 다음 장에서...





5. RS485 MQTT 연동


일단 차후 분석할 일이 생기긴 했습니다만, 이 부분에서는 간단하게 아래의 글로 정리합니다.


https://cafe.naver.com/stsmarthome/8731


그리고 코콤의 경우 많은 모듈이 있었습니다. 아래의 모듈 들이 있었습니다.


https://cafe.naver.com/koreassistant/601

https://cafe.naver.com/stsmarthome/9435

https://cafe.naver.com/stsmarthome/9374

https://cafe.naver.com/stsmarthome/9458


여기서 저는 트루월드님 nodejs 를 이용해서 구성했습니다.


서버는 AndroidOverLinux 에 설치를 하였으며, 특이한 운영체제라 아래의 글에 설명을 남깁니다.

http://androidoverlinux.djjproject.com/

https://blog.djjproject.com/612


1. MQTT 설치하기


아이디 비번 일단 설정하지 않습니다. 차후 외부에서도 MQTT 를 쓰게되면 그때 설정하도록 하겠습니다.


root@AOL-Debian:~# apt install mosquitto

Reading package lists... Done

Building dependency tree       

Reading state information... Done

mosquitto is already the newest version (1.4.10-3+deb9u4).

0 upgraded, 0 newly installed, 0 to remove and 88 not upgraded.


root@AOL-Debian:~# service mosquitto start

[ ok ] Starting network daemon:: mosquitto.

root@AOL-Debian:~# 


2. nodejs 설치하기


root@AOL-Debian:~# curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -


root@AOL-Debian:~# apt update
Hit:1 https://download.docker.com/linux/debian stretch InRelease
Hit:2 https://deb.nodesource.com/node_10.x stretch InRelease
Ign:3 http://ftp.lanet.kr/debian stretch InRelease        
Get:4 http://ftp.lanet.kr/debian stretch-backports InRelease [91.8 kB]
Get:5 http://ftp.lanet.kr/debian stretch-updates InRelease [91.0 kB]
Hit:6 http://ftp.lanet.kr/debian stretch Release               
Fetched 183 kB in 2s (76.9 kB/s)
Reading package lists... Done
Building dependency tree       
Reading state information... Done
88 packages can be upgraded. Run 'apt list --upgradable' to see them.
root@AOL-Debian:~# apt isntall nodejs


3. HA 설치하기


https://blog.djjproject.com/607


4. 트루월드님 코콤 nodejs 수정버전 실행


트루월드님 소스에서 콘센트 추가 하였습니다.


HA 설정 파일 백업 레파지토리 : https://github.com/djjproject/hass

kocom_rs485.js : https://github.com/djjproject/hass/tree/master/kocom

변경사항 커밋 : https://github.com/djjproject/hass/commit/168492e43787090c98e5128203aed7636e4d777b#diff-dc72e1a4852e3a8ef73f49f7e585eee3


(와 진짜 콘센트 컨트롤 하나 추가하느라 머리 깨지는 줄 알았네요 ㅎㅎ)


root@AOL-Debian:/home/hassio/kocom# npm install util net serial mqtt


root@AOL-Debian:/home/hassio/kocom# ls

kocom_rs485.js node_modules  package-lock.json

root@AOL-Debian:/home/hassio/kocom# node kocom_rs485.js 

[4/18/2020, 7:27:11 PM] Success connect server

[4/18/2020, 7:27:11 PM] [Serial] Send to Dev: Gas 1 ->  Read (190ms)  aa5530bc002c0001003a0000000000000000530d0d

[4/18/2020, 7:27:11 PM] [Serial] Send to Dev: Light 2 ->  Read (99ms)  aa5530bc000e0001003a0000000000000000350d0d

[4/18/2020, 7:27:11 PM] [Serial] Send to Dev: Outlet 2 ->  Read (81ms)  aa5530bc003b0001003a0000000000000000620d0d

[4/18/2020, 7:27:11 PM] [Serial] Send to Dev: Thermo 1-1 ->  Read (81ms)  aa5530bc00360001003a00000000000000005d0d0d

[4/18/2020, 7:27:11 PM] [Serial] Send to Dev: Thermo 2-1 ->  Read (82ms)  aa5530bc00360101003a00000000000000005e0d0d

[4/18/2020, 7:27:11 PM] [Raw] Received: fe1d8e1f01003b003a0000000000000000550d0d

[4/18/2020, 7:27:11 PM] [Error] error checksum  148

[4/18/2020, 7:27:11 PM] [Raw] Received: aa5530bc0001003b0000ffff000000000000260d0d

[4/18/2020, 7:27:11 PM] [MQTT] Send to HA: kocom/Outlet1/power1/state -> ON

[4/18/2020, 7:27:11 PM] [MQTT] Send to HA: kocom/Outlet1/power2/state -> ON

[4/18/2020, 7:27:11 PM] [Serial] Send to Dev: Thermo 3-1 ->  Read (85ms)  aa5530bc00360201003a00000000000000005f0d0d

[4/18/2020, 7:27:11 PM] [Raw] Received: aa5530dc00010036003a00000000000000007d0d0d

[4/18/2020, 7:27:11 PM] [Serial] Success Receive boiller Read command ACK

[4/18/2020, 7:27:12 PM] [Serial] Send to Dev: Thermo 4-1 ->  Read (96ms)  aa5530bc00360301003a0000000000000000600d0d

[4/18/2020, 7:27:12 PM] [Raw] Received: aa5530bd0001003b0000ffff000000000000270d0d

[4/18/2020, 7:27:12 PM] [true-world][Sync] Same: Outlet1power1

[4/18/2020, 7:27:12 PM] [true-world][Sync] Same: Outlet1power2

[4/18/2020, 7:27:12 PM] [Raw] Received: b515ea003b00010000ffff000000000000470d0d

[4/18/2020, 7:27:12 PM] [Error] error checksum  54

[4/18/2020, 7:27:12 PM] [Raw] Received: aa5530be0001003b0000ffff000000000000280d0d

[4/18/2020, 7:27:12 PM] [true-world][Sync] Same: Outlet1power1

[4/18/2020, 7:27:12 PM] [true-world][Sync] Same: Outlet1power2

[4/18/2020, 7:27:12 PM] [Raw] Received: aa5530de003b00010000ffff000000000000480d0d

[4/18/2020, 7:27:12 PM] [true-world] Data is Command or ACK(Gate2Device)

[4/18/2020, 7:27:16 PM] MQTT Ready...


이 부분을 service 로 만들기


root@AOL-Debian:/home/hassio/kocom# wget https://github.com/djjproject/hass/raw/master/kocom/kocom -O /etc/init.d/kocom

root@AOL-Debian:/home/hassio/kocom# chmod a+x /etc/init.d/kocom


root@AOL-Debian:/home/hassio/kocom# service kocom start

Starting kocom rs485: kocom.

root@AOL-Debian:/home/hassio/kocom# ps -ef | grep kocom

root      3890     1 73 19:28 ?        00:00:02 /usr/bin/node /home/hassio/kocom/kocom_rs485.js

root      3899  2434  0 19:29 pts/0    00:00:00 grep kocom





6. HA 연동


일단 MQTT 와 연동은 아래와 같이 하시면 됩니다.


특정 코콤 애드온을 사용할 경우, 자동으로 디바이스가 올라오는 것도 있습니다만, 트루월드님 소스는 올라오지 않습니다.


그런데, 트루월드님 소스를 기반으로 수정을 가한 것은, 매우 안정적이며, 현 상황이 실시간으로 반영되고 일괄 소등이 되기 때문입니다.

--> 물론 다른 것들도 잘 되지만, 코드가 상당히 직관적이라 수정이 편할 것 같아서 입니다.



그리고 hass 설치 폴더의 config 폴더의 configuration.yaml 파일을 엽니다.


일단 이 yaml 파일은 들여쓰기가 무조껀 스페이스바 2번이여야 하며, 수정한 후 service hass start stop 으로 실행하지 마시고 로그를 실시간으로 볼 수 있게 아래의 명령으로 hass 를 시작하시면 좋습니다.


제 기준으로 실행 명령은 아래와 같습니다.


/home/hassio/bin/python3 /home/hassio/bin/hass -v --config /home/hassio/config


무언가 에러가 나면 바로 콘솔에 찍히기 때문에 수정하기가 편리합니다.


기본적으로 HA 구조는 아래와 같습니다.


switch:


sensor:


light:


climate:


.... 


이런식으로 구성이 되며 각 섹션에 맞게 추가를 하시면 됩니다.


각 예로써 아래와 같습니다.


climate:

  - platform: mqtt

    name: "보일러"

    mode_state_topic: "kocom/Thermo1/power/state"

    mode_command_topic: "kocom/Thermo1/power/command"

    temperature_state_topic: "kocom/Thermo1/setTemp/state"

    temperature_command_topic: "kocom/Thermo1/setTemp/command"

    current_temperature_topic: "kocom/Thermo1/curTemp/state"

    away_mode_command_topic: "kocom/Thermo1/away/command"

    away_mode_state_topic: "kocom/Thermo1/away/state"

    modes:

      - "off"

      - "heat"

    min_temp: 5

    max_temp: 35


light:
  - platform: mqtt
    name: "거실등"
    state_topic: "kocom/Light1/power1/state"
    command_topic: "kocom/Light1/power1/command"

fan:
  # Xiaomi Air Purifier 2S
  - platform: xiaomi_miio
    host: 192.168.0.5
    token: 4cdf
    name: "공기청정기"    

switch:
  - platform: mqtt
    name: "일괄소등"
    icon: mdi:light-switch
    state_topic: "kocom/Light/power/state"
    command_topic: "kocom/Light/power/command"

  - platform: mqtt
    name: "엘리베이터"
    icon: mdi:elevator
    state_topic: "kocom/Elevator/power/state"
    command_topic: "kocom/Elevator/power/command"

  - platform: mqtt
    name: "콘센트1"
    icon: mdi:power
    state_topic: "kocom/Outlet1/power1/state"
    command_topic: "kocom/Outlet1/power1/command"

  - platform: mqtt
    name: "콘센트2"
    icon: mdi:power
    state_topic: "kocom/Outlet1/power2/state"
    command_topic: "kocom/Outlet1/power2/command"


상기 파일 전체는 아래의 링크에서 확인하실 수 있습니다.


https://github.com/djjproject/hass/blob/master/config/configuration.yaml


그럼 저기에 어떤 값들을 추가할 수 있냐? 는 아래의 문서를 참고하시면 됩니다.


https://www.home-assistant.io/integrations/





7. 패널에 추가 (패널을 러브레이스라고 합니다.)


그럼 일단 상기를 추가하면 어떻게 메인 화면에 추가해야할지 감이 오지 않습니다.


러브레이스.. 이게 뭔가 했더니 패널 이름이 러브레이스네요. 여기서 UI 편집을 통해 하기 + 버튼으로 추가가 가능합니다.


샘플로 만들어 보면 아래와 같습니다.






그렇게 열심히 뚝딱 뚝딱 만들면 아래와 같습니다.






8. hass 외부 접속 apache2 reverse proxy


아래의 설정을 사용하시면 됩니다.


root@AOL-Debian:~# cat /etc/apache2/sites-available/ha.conf 

<Virtualhost *:80>

ServerName iot.domain.com

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

</VirtualHost>


<VirtualHost *:443>

ServerName iot.domain.com

ServerAlias ""

SSLEngine On

SSLCertificateFile /etc/letsencrypt/live/domain.com/cert.pem

SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem

SSLCertificateChainFile /etc/letsencrypt/live/domain.com/chain.pem

SSLProtocol +TLSv1.2

   

ProxyPreserveHost On

SSLProxyEngine On

ProxyRequests Off

RequestHeader set Front-End-Https "On"


ProxyPass /api/websocket ws://localhost:8123/api/websocket

ProxyPassReverse /api/websocket ws://localhost:8123/api/websocket

ProxyPass / http://localhost:8123/

ProxyPassReverse / http://localhost:8123/


RewriteEngine on

RewriteCond %{HTTP:Upgrade} =websocket [NC]

RewriteRule /(.*)  ws://localhost:8123/$1 [P,L]

RewriteCond %{HTTP:Upgrade} !=websocket [NC]

RewriteRule /(.*)  http://localhost:8123/$1 [P,L]


</Virtualhost>


root@AOL-Debian:~# a2enmod proxy_wstunnel

Considering dependency proxy for proxy_wstunnel:

Module proxy already enabled

Module proxy_wstunnel already enabled


root@AOL-Debian:~# a2ensite ha.conf 

Site ha already enabled


root@AOL-Debian:~# service apache2 restart

[ ok ] Restarting Apache httpd web server: apache2.


그 후 앱 연동도 아래와 같이 가능합니다.









9. 마치며..


일단 초기에 쓰려던 것 보다 많이 간추려서 작성했습니다.


이틀 동안 꼴밤 새니 머리에 구조가 들어오네요 ㅎㅎㅎ


다음에는 Google Home 과 연동하는 글로 뵙겠습니다.


감사합니다.





댓글0