IOT

[HomeAssistant] 아파트 공동현관 문열기 자동화 사례(Node-RED 활용)

오리야호 2022. 3. 9. 01:45
반응형

공동현관에서 세대 호출 시 자동으로 문열림이 동작하도록 자동화 구성한 테스트 사례입니다.

 

 

얼마 전 Node-RED 존재를 알게 되면서 언젠가 한 번 써먹어야지 하고 있다가 테스트한 사례 공유해 드립니다.

 

검색해보니 유명한 도구이고, 많은 곳에서 활용되고 있지만 제 입장에선 접한 지 얼마 되지 않아서 조금 실험적인 느낌으로 작업 중입니다.

 

HA에 Node-RED 설치는 검색하면 나오는 내용이라 여기서는 언급하지 않겠습니다.

(애드온 설치가 매우 간단합니다)

 

애드온 스토어에서 아래 애드온을 찾으시면 됩니다.

 

 

HA에서 자동화를 이런 식으로도 할 수 있다. 정도 봐주시면 될 것 같습니다.

 

활용도는 사용하기에 따라 무한대라고 생각됩니다.

 

Node-RED에 대한 간단한 설명은 유튜브 15분짜리 추천해 드립니다. HA 기준에서 짧은 시간에 기초적인 부분만 듣기 좋더라고요.

 

 

Node Red for Beginners - 2021 Edition (Using Home Assistant)

 

EW11 세팅하기

 

연결할 대상은 주방 TV에 달았던 EW11 입니다.

 

HomeAssistant

 

코콤 주방TV RS485 현관 문열기 패킷

대한민국 모임의 시작, 네이버 카페

cafe.naver.com

 

테스트 전 미리 충분한 커넥션 수를 늘려 놓으시기 바랍니다. Max Accept 부분입니다.

 

이게 테스트 하다보니 반영이 안되네요. submit 해도 된 것 처럼 보여도 페이지 새로 들어가보면 적용이 안되어있습니다. 버그인듯..

 

그래서 테스트할 때 다른 커넥션들은 연결하지 않고 진행했습니다.

 

TCP 접속 테스트

 

 

 

tcp in과 debug 노드를 오른쪽으로 드래그하여 추가해줍니다.

 

tcp in 노드에 접속할 주소와 포트를 적어줍니다.

 

 

debug 노드에 msg 오브젝트 전체를 선택하고 노드간 데이터가 흘러갈 수 있도록 연결해줍니다.

 

 

오른쪽 위 배포하기 버튼을 눌러줍니다. 항상 수정 후에 배포가 되어야 적용됩니다.

 

 

수정된 항목은 파란색 으로 노드의 오른쪽 위에 표기가 됩니다.

 

 

이제 데이터가 잘 수신되는지 주방 월패드로가서 현관 모니터링, 통화, 문열기 등 몇 가지 제어를 해봅니다.

 

오른쪽 위 디버그창에서 데이터 수신 내용 확인 합니다.

 

 

SerialPortMon으로도 동시에 연결해서 확인하면 더욱 좋습니다.

 

 

문열기 패킷 테스트

 

통화, 문열기 패킷을 차례로 날려서 현관문이 열리는지 확인해봅니다.

(공동현관까지 내려갈 수 없으니 현관문 데이터로 확인)

 

 

inject 노드를 추가해주고 buffer를 선택해줍니다.

 

 

값은 아래 buffer 배열형태로 가공된 값을 붙여넣어줍니다.

 

 

통화, 문열기, 통화종료 패킷은 이전에 분석해둔 것이 있으니 이것을 Node-RED에서 buffer 배열형태로 변환해줍니다.

 

현관 관련 데이터

(단지, 세대마다 다를 수 있으니 각자 확인하신 걸로 하셔야 합니다.)

# 현관벨
AA557B9C020200FFFFFFFF31FFFFFF010171C80D0D
["0xAA","0x55","0x7B","0x9C","0x02","0x02","0x00","0xFF","0xFF","0xFF","0xFF","0x31","0xFF","0xFF","0xFF","0x01","0x01","0x71","0xC8","0x0D","0x0D"]

# 현관 통화
AA5579BC02020031FFFFFF61FFFFFF030008D30D0D
["0xAA","0x55","0x79","0xBC","0x02","0x02","0x00","0x31","0xFF","0xFF","0xFF","0x61","0xFF","0xFF","0xFF","0x03","0x00","0x08","0xD3","0x0D","0x0D"]

# 현관 문열기
AA5579BC02020031FFFFFF61FFFFFF240097A20D0D
["0xAA","0x55","0x79","0xBC","0x02","0x02","0x00","0x31","0xFF","0xFF","0xFF","0x61","0xFF","0xFF","0xFF","0x24","0x00","0x97","0xA2","0x0D","0x0D"]

# 현관 통화 끊기
AA5579BC02020031FFFFFF61FFFFFF040091440D0D
["0xAA","0x55","0x79","0xBC","0x02","0x02","0x00","0x31","0xFF","0xFF","0xFF","0x61","0xFF","0xFF","0xFF","0x04","0x00","0x91","0x44","0x0D","0x0D"]

 

공동현관 관련 데이터

(단지, 세대마다 다를 수 있으니 각자 확인하신 걸로 하셔야 합니다.)

 

# 공동현관 벨
AA557B9C020800FFFFFFFFFFFFFFFF010152190D0D
["0xAA","0x55","0x7B","0x9C","0x02","0x08","0x00","0xFF","0xFF","0xFF","0xFF","0xFF","0xFF","0xFF","0xFF","0x01","0x01","0x52","0x19","0x0D","0x0D"]

# 공동현관 통화
AA5579BC080200FFFFFFFF61FFFFFF030026950D0D
["0xAA","0x55","0x79","0xBC","0x08","0x02","0x00","0xFF","0xFF","0xFF","0xFF","0x61","0xFF","0xFF","0xFF","0x03","0x00","0x26","0x95","0x0D","0x0D"]

# 공동현관 문열기
AA5579BC080200FFFFFFFF61FFFFFF2400B9E40D0D
["0xAA","0x55","0x79","0xBC","0x08","0x02","0x00","0xFF","0xFF","0xFF","0xFF","0x61","0xFF","0xFF","0xFF","0x24","0x00","0xB9","0xE4","0x0D","0x0D"]

tcp request 노드를 추가해서 아래와 같이 설정해줍니다.

데이터를 송신하고 응답을 기다리지 않고 바로 종료하도록 설정합니다.

 

 

 

 

배포하기를 눌러 적용해주고,

 

노드의 왼쪽 네모를 클릭하면 패킷을 날려줍니다.

 

 

통화를 누르고 문 열기를 누르면 현관문이 열리는 것을 볼 수 있습니다.

 

이제 본격적으로 Node-RED를 이용해 본격적으로 자동화를 구현할 준비가 되었습니다.

 

buffer-parser 라이브러리 추가

buffer/array 데이터를 좀 더 쉽게 변환하기 위해 라이브러리를 활용하였습니다.

 

node-red-contrib-buffer-parser

 

node-red-contrib-buffer-parser

Node-red nodes to convert values to and from buffer/array. Supports Big/Little Endian, BCD, byte swapping and much more

flows.nodered.org

 

용어를 팔렛트라고 부르네요. 메뉴로 이동합니다.

 

 

buffer-parser를 검색 후 설치 해줍니다.

 

 

buffer-parser 노드가 생긴 것을 볼 수 있습니다.

 

 

공동현관 문열기 자동화 전체 흐름

 

전체적인 흐름은 아래와 같습니다.

  1. TCP로 데이터를 수신하고 있다가
  2. 공동현관 패킷이 뜨면
  3. 3초 뒤 통화 패킷 송신, 1초 뒤 열기 패킷 송신

 

테스트용, 디버그 노드들을 제외하면 노드가 10개가 채 되지 않습니다.

 

테스트용으로 작업하던 것은 최종적으로 비활성화해줍니다.

 

 

공동현관 문열기 자동화 노드별 설정

 

tcp in 노드 추가

 

ew11 연결을 위한 노드입니다.

 

 

buffer-parser 노드 추가

 

위에서 추가한 node-red-contrib-buffer-parser 라이브러리의 buffer-parser 노드 입니다.

 

수신된 buffer 데이터를 packet이라는 이름으로 문자열을 합쳐줍니다.

 

 

debug 노드 추가

 

수신된 데이터 확인용으로 추가 해줍니다.

 

 

switch 노드 추가

 

공동현관 패킷이 올라오면 문열기를 하기 위해 switch 노드를 추가 해주립니다.

 

프로퍼티엔 keyvalues.packet 입력 (앞서 수신데이터 파서에 이 이름으로 설정해주었습니다.)

 

각각 아래 값을 추가 합니다.

 

공동현관 : aa557b9c020800ffffffffffffffff010152190d0d

현관 : aa557b9c020200ffffffff31ffffff010171c80d0d

 

rule은 contains로 해줍니다. ==으로 할 경우 가끔 벨 호출 패킷 끝에 더미데이터가 붙어오는데 그럴 땐 자동화가 동작하지 않습니다.

 

 

공동현관문 자동 열림 헬퍼 추가

 

이 스위치가 켜져 있어야만 작동하도록 했습니다. 구글 홈 미니에게 공동현관문 자동 열림 켜줘/꺼줘 등으로 제어가 가능해집니다.

 

 

공동현관문 스위치가 켜져 있을 때만 동작하도록 노드 추가

 

 

dalay 노드 추가

 

3초 딜레이 발생 시켜 줍니다. 방문자 이미지가 저장되는 방식이 영상에서 이미지를 생성하는 것이 아니라 월패드 화면을 스크린샷 찍는 것 같습니다.

 

딜레이가 너무 짧을 경우 문을 열 때 영상이 호출되기 전 대기화면이 방문자 사진으로 저장되어 있었습니다.

 

 

call service 노드 추가

 

구글 홈 미니로 TTS를 위해 서비스 호출 노드를 추가하였습니다.

 

 

change 노드 추가

 

공동현관 통화 패킷을 메세지 본문에 할당해줍니다. 값 유형은 buffer 입니다.

 

# 공동현관 통화
AA5579BC080200FFFFFFFF61FFFFFF030026950D0D
["0xAA","0x55","0x79","0xBC","0x08","0x02","0x00","0xFF","0xFF","0xFF","0xFF","0x61","0xFF","0xFF","0xFF","0x03","0x00","0x26","0x95","0x0D","0x0D"]

 

 

tcp request 노드 추가

 

통화 패킷을 날리고 바로 접속이 종료되도록 하였습니다.

 

 

debug 노드 추가

 

 

delay 노드 및 공동현관 열기 데이터 세팅

 

# 공동현관 문열기
AA5579BC080200FFFFFFFF61FFFFFF2400B9E40D0D
["0xAA","0x55","0x79","0xBC","0x08","0x02","0x00","0xFF","0xFF","0xFF","0xFF","0x61","0xFF","0xFF","0xFF","0x24","0x00","0xB9","0xE4","0x0D","0x0D"]

 

 

공동현관은 왠지 지하 1, 2, 3, 지상층에 따라 패킷이 다를 것 같은데 일단 하나로 테스트 중입니다.

 

특이한 점은 공동현관 호출로 문이 열리면 자동으로 공동현관 층으로 엘리베이터가 호출되는데, 그때 엘리베이터 패킷이 올라옵니다.

 

갑자기 구글 홈 미니에서 TTS가 나오는 걸 보고 알게 되었네요.

 

얼마나 안정적으로 동작할지는 좀 더 사용해봐야 알 것 같습니다.

 

TCP 연결 유지가 가장 기대되는 부분인데 “알아서" 관리가 될지 커넥션이 끊어지면 바보가 될지는 좀 더 있어 봐야 알 것 같습니다.

반응형