일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 파이썬
- matter
- 힐스테이트 광교산
- 현대통신
- Python
- 티스토리챌린지
- homebridge
- Espressif
- cluster
- 애플
- SK텔레콤
- 매터
- raspberry pi
- 미국주식
- 해외주식
- esp32
- Home Assistant
- Bestin
- MQTT
- Apple
- RS-485
- 배당
- 월패드
- 국내주식
- 코스피
- 공모주
- 나스닥
- ConnectedHomeIP
- 홈네트워크
- 오블완
- Today
- Total
YOGYUI
힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (3) 본문
5. 도어폰 RS-485 패킷 분석
DOOR RJ-45 연결부의 4,5번 라벨은 각각 'EXTDEV-1B', 'EXTDEV-1A'로, 신호를 찍어보면 시리얼 통신이 이뤄지고 있는 것을 알 수 있다
힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (1)
USB-to-RS485 컨버터를 연결해서 패킷을 살펴보자
(라즈베리파이에 연결 후, 파이썬 테스트 스크립트로 바이트스트림 수신)
import time
import datetime
from SerialComm import *
def log(message: str):
now = datetime.datetime.now()
h = now.hour
m = now.minute
s = now.second
us = now.microsecond
timestamp = '[%02d:%02d:%02d.%06d]' % (h, m, s, us)
print(timestamp + ' ' + message)
class Parser:
buffer: bytearray
max_buffer_size: int = 200
def __init__(self, ser: SerialComm):
self.buffer = bytearray()
self.serial = ser
self.serial.sig_recv_data.connect(self.onRecvData)
def onRecvData(self, data: bytes):
if len(self.buffer) > self.max_buffer_size:
self.buffer.clear()
self.buffer.extend(data)
self.parseBuffer()
def parseBuffer(self):
idx = self.buffer.find(0xF7)
if idx > 0:
self.buffer = self.buffer[idx:]
if len(self.buffer) >= 3:
packet_length = self.buffer[1]
if len(self.buffer) >= packet_length:
if self.buffer[packet_length - 1] == 0xEE:
packet = self.buffer[:packet_length]
packet_str = ' '.join(['%02X' % x for x in packet])
log(packet_str)
self.buffer = self.buffer[packet_length:]
if __name__ == '__main__':
ser = SerialComm()
parser = Parser(ser)
def printMenu():
if ser.isConnected():
print('Connected ({}, {})'.format(ser.port, ser.baudrate))
print('0: Disconnect, 1: Terminate')
else:
print('0: Connect, 1: Terminate')
def loop(clear: bool = True):
if clear:
os.system('clear')
printMenu()
sysin = sys.stdin.readline()
try:
head = int(sysin.split('\n')[0])
except Exception:
loop()
return
if ser.isConnected():
if head == 0:
ser.disconnect()
loop()
elif head == 1:
ser.release()
else:
loop()
else:
if head == 0:
ser.connect('/dev/ttyUSB0', 9600)
loop()
elif head == 1:
ser.release()
else:
loop()
loop()
터미널로 패킷을 찍어보니...
[16:12:39.416701] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:39.479806] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:39.688245] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:39.736912] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:39.864281] F7 0B 01 19 01 40 30 00 00 95 EE
[16:12:39.928382] F7 0B 01 19 04 40 30 00 02 92 EE
[16:12:39.960338] F7 0B 01 19 01 40 40 00 00 E5 EE
[16:12:40.008238] F7 0B 01 19 04 40 40 00 02 E2 EE
[16:12:40.055956] F7 0B 01 19 01 40 60 00 00 C5 EE
[16:12:40.103746] F7 0C 01 19 04 40 60 00 02 02 C7 EE
[16:12:40.232234] F7 0B 01 1F 01 40 10 00 00 B3 EE
[16:12:40.312336] F7 1C 01 1F 04 40 10 00 11 01 00 08 00 00 00 00 02 12 01 00 00 00 00 00 00 02 AA EE
[16:12:40.407973] F7 0B 01 1F 01 40 20 00 00 83 EE
[16:12:40.488345] F7 1C 01 1F 04 40 20 00 21 01 00 00 00 00 00 00 02 22 01 00 00 00 00 00 00 02 92 EE
[16:12:40.599996] F7 0B 01 1F 01 40 30 00 00 93 EE
[16:12:40.664482] F7 1C 01 1F 04 40 30 00 31 01 00 00 00 00 00 00 02 32 01 00 00 00 00 00 00 02 82 EE
[16:12:40.775206] F7 0B 01 1F 01 40 40 00 00 E3 EE
[16:12:40.855962] F7 1C 01 1F 04 40 40 00 41 01 00 00 00 00 00 00 02 42 01 00 00 00 00 00 00 02 F2 EE
[16:12:40.952391] F7 0B 01 1F 01 40 60 00 00 C3 EE
[16:12:41.031843] F7 1C 01 1F 04 40 60 00 61 01 00 00 00 00 00 00 02 62 01 00 00 00 00 00 00 02 D2 EE
[16:12:42.327763] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:42.391701] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:42.424432] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:42.488451] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:42.519975] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:42.584643] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:42.616441] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:42.663472] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:42.696520] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:42.759948] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:42.775900] F7 0B 01 19 01 40 30 00 00 95 EE
[16:12:42.839554] F7 0B 01 19 04 40 30 00 02 92 EE
[16:12:42.871613] F7 0B 01 19 01 40 40 00 00 E5 EE
[16:12:42.920112] F7 0B 01 19 04 40 40 00 02 E2 EE
[16:12:42.968013] F7 0B 01 19 01 40 60 00 00 C5 EE
[16:12:43.015668] F7 0C 01 19 04 40 60 00 02 02 C7 EE
[16:12:43.047735] F7 0B 01 19 01 40 60 00 00 C5 EE
[16:12:43.111842] F7 0C 01 19 04 40 60 00 02 02 C7 EE
[16:12:43.142880] F7 0B 01 1F 01 40 10 00 00 B3 EE
[16:12:43.228635] F7 1C 01 1F 04 40 10 00 11 01 00 08 00 00 00 00 02 12 01 00 00 00 00 00 00 02 AA EE
[16:12:43.255212] F7 0B 01 1F 01 40 10 00 00 B3 EE
[16:12:43.335367] F7 1C 01 1F 04 40 10 00 11 01 00 08 00 00 00 00 02 12 01 00 00 00 00 00 00 02 AA EE
[16:12:43.367316] F7 0B 01 1F 01 40 20 00 00 83 EE
[16:12:43.447941] F7 1C 01 1F 04 40 20 00 21 01 00 00 00 00 00 00 02 22 01 00 00 00 00 00 00 02 92 EE
[16:12:43.479548] F7 0B 01 1F 01 40 20 00 00 83 EE
[16:12:43.543627] F7 1C 01 1F 04 40 20 00 21 01 00 00 00 00 00 00 02 22 01 00 00 00 00 00 00 02 92 EE
[16:12:43.575525] F7 0B 01 1F 01 40 30 00 00 93 EE
[16:12:43.655227] F7 1C 01 1F 04 40 30 00 31 01 00 00 00 00 00 00 02 32 01 00 00 00 00 00 00 02 82 EE
[16:12:43.687785] F7 0B 01 1F 01 40 30 00 00 93 EE
[16:12:43.751696] F7 1C 01 1F 04 40 30 00 31 01 00 00 00 00 00 00 02 32 01 00 00 00 00 00 00 02 82 EE
[16:12:43.783800] F7 0B 01 1F 01 40 40 00 00 E3 EE
[16:12:43.863646] F7 1C 01 1F 04 40 40 00 41 01 00 00 00 00 00 00 02 42 01 00 00 00 00 00 00 02 F2 EE
[16:12:43.896017] F7 0B 01 1F 01 40 40 00 00 E3 EE
[16:12:43.960268] F7 1C 01 1F 04 40 40 00 41 01 00 00 00 00 00 00 02 42 01 00 00 00 00 00 00 02 F2 EE
[16:12:43.992093] F7 0B 01 1F 01 40 60 00 00 C3 EE
[16:12:44.071081] F7 1C 01 1F 04 40 60 00 61 01 00 00 00 00 00 00 02 62 01 00 00 00 00 00 00 02 D2 EE
[16:12:44.103157] F7 0B 01 1F 01 40 60 00 00 C3 EE
[16:12:44.167113] F7 1C 01 1F 04 40 60 00 61 01 00 00 00 00 00 00 02 62 01 00 00 00 00 00 00 02 D2 EE
[16:12:45.239334] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:45.303840] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:45.511093] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:45.559673] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:45.688978] F7 0B 01 19 01 40 30 00 00 95 EE
[16:12:45.735254] F7 0B 01 19 04 40 30 00 02 92 EE
[16:12:45.782665] F7 0B 01 19 01 40 40 00 00 E5 EE
[16:12:45.831473] F7 0B 01 19 04 40 40 00 02 E2 EE
[16:12:45.879235] F7 0B 01 19 01 40 60 00 00 C5 EE
[16:12:45.927119] F7 0C 01 19 04 40 60 00 02 02 C7 EE
[16:12:46.054615] F7 0B 01 1F 01 40 10 00 00 B3 EE
[16:12:46.135430] F7 1C 01 1F 04 40 10 00 11 01 00 08 00 00 00 00 02 12 01 00 00 00 00 00 00 02 AA EE
[16:12:46.230590] F7 0B 01 1F 01 40 20 00 00 83 EE
[16:12:46.310744] F7 1C 01 1F 04 40 20 00 21 01 00 00 00 00 00 00 02 22 01 00 00 00 00 00 00 02 92 EE
[16:12:46.423233] F7 0B 01 1F 01 40 30 00 00 93 EE
[16:12:46.487610] F7 1C 01 1F 04 40 30 00 31 01 00 00 00 00 00 00 02 32 01 00 00 00 00 00 00 02 82 EE
[16:12:46.598155] F7 0B 01 1F 01 40 40 00 00 E3 EE
[16:12:46.679089] F7 1C 01 1F 04 40 40 00 41 01 00 00 00 00 00 00 02 42 01 00 00 00 00 00 00 02 F2 EE
[16:12:46.775512] F7 0B 01 1F 01 40 60 00 00 C3 EE
[16:12:46.855081] F7 1C 01 1F 04 40 60 00 61 01 00 00 00 00 00 00 02 62 01 00 00 00 00 00 00 02 D2 EE
[16:12:48.150744] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:48.214715] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:48.422691] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:48.472259] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:48.598788] F7 0B 01 19 01 40 30 00 00 95 EE
[16:12:48.646339] F7 0B 01 19 04 40 30 00 02 92 EE
[16:12:48.694320] F7 0B 01 19 01 40 40 00 00 E5 EE
[16:12:48.742429] F7 0B 01 19 04 40 40 00 02 E2 EE
[16:12:48.773962] F7 0B 01 19 01 40 60 00 00 C5 EE
하...
네번째 바이트가 0x19 혹은 0x1F로, 조명/아울렛 RS-485 포트에서 후킹한 신호와 완전히 동일한 패킷인 것을 알 수 있었다
힐스테이트 광교산::조명 제어 RS-485 패킷 분석 (1)
월패드에서 '현관문 열기'를 눌렀을 때
F7 0E 01 1E 02 43 11 04 00 04 FF FF B6 EE
F7 0E 01 1E 02 43 11 04 00 04 FF FF B6 EE
네 번째 바이트가 0x1E인 패킷이 300ms 간격으로 두 번 연속 보이는 것도 동일했다
(어차피 이 패킷으로 도어락이 열리진 않고, I/O 제어를 통해 무선송신 모듈을 건드려줘야 정상적으로 열린다)
아무래도 도어폰이 현관 도어락과 연동된 모델에 한해서 해당 패킷이 문을 열어주는 기능을 하는게 아닌가 하는 뇌피셜을 가동해본다.. (실제로 이 패킷으로 제어되는 하드웨어를 본 적이 없으니 알 수가 있나 ㅠ)
어쨌든 결론...
도어폰의 RS-485 포트의 신호는 기존에 분석해서 사용하고 있던 조명/아울렛 포트의 신호와 완전히 동일하기 때문에, 다른 용도로 사용할 수는 없을 것 같다
(도어폰 상품 설명에 카메라 각도 조절이 된다길래 시리얼 통신으로 되나 싶었지... ㅠ_ㅠ)
괜히 시간낭비한 것 같긴 하지만, 확인하지 않고 넘어가는 것보다는 확실히 짚고 넘어가는게 속이 편하다 ^^;
이제 음성신호만 연동하면 도어폰 카메라 작업도 마무리할 수 있다~
'홈네트워크(IoT) > 힐스테이트 광교산' 카테고리의 다른 글
LG전자 시스템 에어컨 Wi-Fi 모뎀 교체 (ThinQ) (0) | 2022.08.09 |
---|---|
현관문 도어락 - 게이트맨 스마트 리빙 블루투스 팩 + 브릿지 장착 (8) | 2022.08.04 |
힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (2) (0) | 2022.07.27 |
힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (1) (2) | 2022.07.25 |
힐스테이트 광교산::홈IoT SmartThings(스마트싱스) 연동 (0) | 2022.07.17 |