YOGYUI

힐스테이트 광교산::조명 제어 RS-485 패킷 분석 (1) 본문

홈네트워크(IoT)/힐스테이트 광교산

힐스테이트 광교산::조명 제어 RS-485 패킷 분석 (1)

요겨 2022. 6. 11. 00:55
반응형

이사짐 정리도 대충 끝났겠다, 이제 본격적으로 홈네트워크 작업을 해보자!

 

1. 월패드 제어 통신 포트 살펴보기

며칠전에 거실 월패드를 뜯어본 뒤 대충 구조는 파악했고, 이번엔 케이블에 부착된 라벨을 따라 신호선을 좀 더 면밀히 분석해봤다

통신 케이블에 부착된 라벨

 

벽면 안쪽 깊숙히 박혀있는 릴레이모듈(거실 천장 조명 제어)에서도 통신선이 빠져나와있는 것을 확인!

통신선이 릴레이모듈에 연결되어 있다

 

릴레이 모듈에서 시작된 회색 UTP 케이블이 '조명' 라벨이 붙은 UTP 케이블 중 일부와 엮여서 터미널 블록에 체결되어 있는 것을 확인!

 

시간 단축을 위해 릴레이모듈의 정보를 취합해보기로 했다

 

2. 릴레이 모듈 정보 취합

릴레이 모듈은 '중앙제어주식회사'에서 만든 JC-2883(J-Type) 모델인 것으로 확인되었다

 

구글링으로 JC-2883을 검색하니 첫페이지에 한국에너지공단의 제품인증 관련 정보 페이지가 나왔다

https://eep.energy.or.kr/electricity/elec_view_234.aspx?no=234210063

 

이미지를 확대해보니 

오우~ UTP 케이블 핀맵이 알아보기 쉽게 라벨링되어 있다 (개꿀)

4번(청) 라인이 RS485 B(-) 신호, 5번(청+백) 라인이 RS485 A(+) 신호인 것을 확인!

 

좀 더 확실하게 하기 위해, 중앙제어주식회사 홈페이지로 접속해봤는데, 제품 상세 매뉴얼은 찾아보기 힘들었다... 홈페이지에서 제공하는 제품 카탈로그를 심심해서 열어봤는데~

HNS카탈로그.pdf
15.59MB

 

이럴수가... 각 방이랑 복도에 장착되어 있는 제어 패드들도 죄다 중앙제어주식회사 제품이다! ㅋㅋㅋ

(당연한 말이지만, 제어 프로토콜은 단일 제품군으로 묶는게 제일 개발자를 덜 괴롭히는 방법이다)

 

http://www.joas.co.kr/hn_intro.html

 

처음 들어보는 회사인데, 1987년에 창업된 회사로 역사가 오래된 기업이다

파트너십을 구축하고 있는 건설사가 대부분 한번쯤은 이름을 들어본 메이저 건설사들이라, 홈네트워크 분야에서는 나름 입지를 구축하고 있는게 아닌가 생각이 든다 

- 요즘은 전기차 충전 관련 사업을 확장하고 있는 듯?

비상장회사라 공시자료는 거의 찾아볼 수가 없는데 2021년 감사보고서에 따르면 자산이 287억원으로 꽤 규모가 있는 회사로 보인다 (부채비율은 185% 수준으로 재무건전성은 나쁘지 않지만, 2021년 41억원의 영업손실을 기록한 건 뼈아파보인다.. 2020년 매출익이 174억이었는데, 2021년에 123억으로 고꾸라졌다)

 

결국 현대HT가 만든 월패드 HDHN-2000은 중앙제어에서 만든 홈네트워크 제어 플랫폼의 허브 역할만 해준다고 생각하면 될 것 같다 (물론 다른 벤더도 지원할 것 같고, 도어락이나 비디오폰 등 기타 부가기능도 많긴 하지만 ㅎㅎ)

 

3. RS-485 패킷 후킹 및 분석

잡소리가 길어졌다 (주식투자하다보면 처음보는 회사 조사해보는게 습관이 된다)

바로 RS-485 패킷을 후킹해보자

앞서 살펴본 케이블 핀맵을 기준으로 USB-RS485 컨버터와 와이어로 서로 연결했다

(파란색선 = 485 -, 흰색 + 파란색 = 485+)

 

그리고 라즈베리파이에서 파이썬을 활용해서 패킷을 정상적으로 조회할 수 있는지 확인해봤다

(시리얼 통신 관련 구문은 링크 참고)

- 캡쳐스크립트는 다음과 같이 간단하게 짜봤다

from SerialComm import *

if __name__ == '__main__':
    ser = SerialComm()

    def printMenu():
        if ser.isConnected():
            print('Connected ({}, {})'.format(ser.port, ser.baudrate))
            print('0: Read, 1: Write, 2: Disconnect, 3: Terminate')
        else:
            print('0: Connect, 1: Terminate')
    
    def onRecv(data: bytes):
        packet_str = ' '.join(['%02X' % x for x in data])
        print(packet_str)

    def loop():
        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.sig_recv_data.connect(onRecv)
                loop()
            elif head == 1:
                loop()
            elif head == 2:
                ser.disconnect()
                loop()
            elif head == 3:
                ser.release()
            else:
                loop()
        else:
            if head == 0:
                print('Port: ')
                sysin = sys.stdin.readline()
                try:
                    port = sysin.split('\n')[0]
                except Exception:
                    port = '/dev/ttyUSB0'
                
                print('Baud Rate: ')
                sysin = sys.stdin.readline()
                try:
                    baud = int(sysin.split('\n')[0])
                except Exception:
                    baud = 9600
                
                ser.connect(port, baud)
                loop()
            elif head == 1:
                ser.release()
            else:
                loop()
    
    loop()

 

광교아이파크때와 마찬가지로 보레이트(baudrate)는 9600으로 설정 후 시리얼 포트를 열어봤다

(Databit=8, Stopbit=1, Parity=None, Flow Control=Disable)

 

오오~ 패킷이 물밀듯이 밀려 들어온다 (바이트스트림)


F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92
EE
F7
0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40
60 00 00 C5 EE
F7 0C 01 19
04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00
00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83
EE
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
F7 0B 01 1F
01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00
00 C3 EE
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
F7 0B
01 19 01 40 10 00 00 B5 EE
F7
0D 01 19 04 40 10 00 02 02 02 B4 EE
F7
0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 01 84 EE
F7 0B 01 19 01 40 30 00 00 95
EE
F7 0B 01 19 04 40 30 00 02
92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7
0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01
00 06 00 00 00 00 02 12 01 00 00 00 00 00 00
02 A4 EE
F7 0B 01 1F 01
40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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


유독 많이 반복되는 바이트가 눈에 띈다 (0xF7, 0xEE)

왠지 이게 패킷이 시작과 끝을 가리키는게 아닐까?

0xF7과 0xEE를 기준으로 자른 패킷 몇줄을 다음과 같이 적어보자


F7 0B 01 19 01 40 30 00 00 95 EE  (길이=11)
F7 0B 01 19 04 40 30 00 02 92 EE  (길이=11)
F7 0B 01 19 01 40 40 00 00 E5 EE  (길이=11)
F7 0B 01 19 04 40 40 00 02 E2 EE  (길이=11)
F7 0B 01 19 01 40 60 00 00 C5 EE  (길이=11)
F7 0C 01 19 04 40 60 00 02 02 C7 EE  (길이=12)
F7 0B 01 1F 01 40 10 00 00 B3 EE  (길이=11) 
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE (길이=28)


 

초록색으로 표시한 바이트 0x0B, 0x0C, 0x1C는 각각 십진수로 11, 12, 28인데, 0xF7과 0xEE를 시작/끝으로 즉, 분리한 패킷의 두번때 바이트 값은 패킷의 길이와 정확히 일치하는 것을 알 수 있다!

생각보다 빠르게 패킷 구조 분석이 진행되어 상당히 순조로운 출발이다

(여전히 암호같긴 하지만..)

 

이제 이 정보를 토대로 패킷 파서(parser) 기초 코드를 구현해보자

※ 시리얼패킷은 바이트스트림이 끊겨서 수신되는 경우가 대부분이므로 버퍼링을 해주는게 핵심

class ParserLight:
    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])
                    print(packet_str)
                    self.buffer = self.buffer[packet_length:]

이제 앞서 만든 main 스크립트 구문을 다음과 같이 수정하고 다시 실행해보자

if __name__ == '__main__':
    ser = SerialComm()
    parser = ParserLight(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():
        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:
                print('Port: ')
                sysin = sys.stdin.readline()
                try:
                    port = sysin.split('\n')[0]
                except Exception:
                    port = '/dev/ttyUSB0'
                
                print('Baud Rate: ')
                sysin = sys.stdin.readline()
                try:
                    baud = int(sysin.split('\n')[0])
                except Exception:
                    baud = 9600
                
                ser.connect(port, baud)
                loop()
            elif head == 1:
                ser.release()
            else:
                loop()
    
    loop()


F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 06 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A4 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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
F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 01 84 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 06 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A4 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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
F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE


깔끔하게 0xF7, 0xEE를 시작/끝 바이트로 패킷을 잘 분리해낸다

줄단위로 끊긴 패킷을 수신된 순서대로 순차적으로 기입해보니, 확실히 반복되는 규칙성이 보인다

  • 2,3번째 바이트가 [0x01, 0x19]로 이뤄진 패킷과 [0x01, 0x1F]로 이뤄진 패킷이 존재한다
  • [0x01, 0x19] 혹은 [0x01, 0x1F] 패킷은 10개 패킷이 1그룹으로 반복되며, 1그룹 내에서 6번째 바이트0x10, 0x20, 0x30, 0x40, 0x60 과 같이 증가하며 각각이 2개 패킷이 소그룹으로 반복된다

케이블 라벨은 조명이라고 붙어있지만, 각 방에 붙은 제어 패드는 조명 뿐만 아니라 허니웰사의 온도 조절기와 아울렛(전기 콘센트)도 있어서 정보가 같이 넘어오는게 아닌가 추측된다

 

4. 상태 변경 후 패킷 확인

위에서 나열한 패킷은 집안 전체의 조명이 꺼져있는 상태에서 취합한 것들이다

이제 각 방별로 상태를 변경해가면서 패킷이 어떻게 변하는지를 살펴보자

※ 제일 확실한 방법은 각방 제어패드를 뜯어서 통신 케이블을 뽑았을 때 수신되지 않는 패킷이 있는지를 보는건데, 너무 귀찮다... SW적으로 조금만 시간을 들여서 해보자..

4.1. 컴퓨터방(방3) 조명 상태 변경

각방 제어 패드에 '방3'이라고 명시된 방을 PC 작업실로 사용하고 있다

(천장 조명이 하나밖에 없어서, 변동 사항을 확실히 알 수 있을 것 같았다) 

조명을 껐다 켜보면서 내용이 변하는 패킷이 있는지 살펴봤다


[천장 조명을 껐을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 01 84 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 06 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A4 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[천장 조명을 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 01 84 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 01 E1 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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


확실히 변하는게 있다!

4.2. 서재(방2) 조명 상태 변경

이제 '방2'로 명시된 방의 조명 상태(컴퓨터방과 동일하게 천장 조명이 1개 있다)를 변경해보자


[천장 조명을 껐을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 01 84 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[천장 조명을 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 01 84 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 01 91 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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


4.3. 침실 조명 변경

침실에는 조명이 2개가 있다 (하나는 침실 천장, 하나는 실외기실)

제어 패드는 '방1'이라고 명시되어 있다

각각 제어하면서 패킷을 살펴보자


[모두 꺼져있을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 06 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A4 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[전등 1만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 01 02 84 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[전등 2만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 01 84 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[전부 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 01 01 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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


4.4. 주방 조명 변경

주방 근처 제어 패드를 통해 싱크대 및 조리대 쪽 조명과 식탁 조명 2개를 제어할 수 있다

마찬가지로 하나씩 켜보면서 패킷 변화를 살펴보자


[모두 꺼져있을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[전등 1만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 01 02 C4 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[전등 2만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 01 C4 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[전부 켰을 때]

 

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 01 01 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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


4.5. 거실 조명 변경

거실에 있는 메인 월패드로는 거실 천장에 장착된 2개의 조명과 복도등을 제어할 수 있다

하나씩 바꿔가면서 패킷을 확인해보자


[모두 꺼져있을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

 

[조명 1만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 01 02 02 B7 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[조명 2만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 01 02 B7 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[조명 3(복도등)만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 02 01 B7 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[조명 1, 2만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 01 01 02 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[조명 1, 3만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 01 02 01 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 06 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A4 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[조명 2, 3만 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 02 01 01 B4 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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

[모두 켰을 때]

F7 0B 01 19 01 40 10 00 00 B5 EE
F7 0D 01 19 04 40 10 00 01 01 01 B7 EE
F7 0B 01 19 01 40 20 00 00 85 EE
F7 0C 01 19 04 40 20 00 02 02 87 EE
F7 0B 01 19 01 40 30 00 00 95 EE
F7 0B 01 19 04 40 30 00 02 92 EE
F7 0B 01 19 01 40 40 00 00 E5 EE
F7 0B 01 19 04 40 40 00 02 E2 EE
F7 0B 01 19 01 40 60 00 00 C5 EE
F7 0C 01 19 04 40 60 00 02 02 C7 EE
F7 0B 01 1F 01 40 10 00 00 B3 EE
F7 1C 01 1F 04 40 10 00 11 01 00 07 00 00 00 00 02 12 01 00 00 00 00 00 00 02 A5 EE
F7 0B 01 1F 01 40 20 00 00 83 EE
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
F7 0B 01 1F 01 40 30 00 00 93 EE
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
F7 0B 01 1F 01 40 40 00 00 E3 EE
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
F7 0B 01 1F 01 40 60 00 00 C3 EE
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


4.6. 정리

3,4번 바이트가 [0x01, 0x1F]인 패킷은 변동이 있는 경우도 있고, 없는 경우도 있어서 일단 [0x01, 0x19]인 패킷에 대한 변동만 정리해보자

장소 상태 패킷
거실 조명 3개 모두 OFF F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
조명 1만 ON F7 0D 01 19 04 40 10 00 01 02 02 B7 EE
조명 2만 ON F7 0D 01 19 04 40 10 00 02 01 02 B7 EE
조명 3만 ON F7 0D 01 19 04 40 10 00 02 02 01 B7 EE
조명 1,2 ON F7 0D 01 19 04 40 10 00 01 01 02 B4 EE
조명 1,3 ON F7 0D 01 19 04 40 10 00 01 02 01 B4 EE
조명 2,3 ON F7 0D 01 19 04 40 10 00 02 01 01 B4 EE
조명 3개 모두 ON F7 0D 01 19 04 40 10 00 01 01 01 B7 EE
침실(방1)
조명 2개 모두 OFF F7 0C 01 19 04 40 20 00 02 02 87 EE
조명 1만 ON F7 0C 01 19 04 40 20 00 01 02 84 EE
조명 2만 ON F7 0C 01 19 04 40 20 00 02 01 84 EE 
조명 2개 모두 ON F7 0C 01 19 04 40 20 00 01 01 87 EE
서재(방2)
조명 OFF F7 0B 01 19 04 40 30 00 02 92 EE
조명 ON F7 0B 01 19 04 40 30 00 01 91 EE
컴퓨터방(방3)
조명 OFF F7 0B 01 19 04 40 40 00 02 E2 EE
조명 ON F7 0B 01 19 04 40 40 00 01 E1 EE
주방
조명 2개 모두 OFF F7 0C 01 19 04 40 60 00 02 02 C7 EE
조명 1만 ON F7 0C 01 19 04 40 60 00 01 02 C4 EE
조명 2만 ON F7 0C 01 19 04 40 60 00 02 01 C4 EE
조명 모두 ON F7 0C 01 19 04 40 60 00 01 01 C7 EE

표 하나로 정리하니 한눈에 규칙이 파악된다

  • 3,4번 바이트다 [0x01, 0x19]인 패킷의 길이 (설치된 조명개수 + 10)
  • 7번째 바이트는 장소를 구분짓는 ID (0x10, 0x20, 0x30, 0x40, 0x60)
  • 8번째 바이트는 무조건 0x00 (구분자 토큰으로 쓰이는건지, 조명 설치 여부를 가리키는건지는 불분명)
  • 9번째 바이트부터 설치된 조명개수만큼의 바이트는 각각 조명의 On/Off 여부를 가리킴
    - 0x02 = OFF, 0x01 = ON
  • 뒤에서 2번째 바이트는 일종의 체크섬으로 추측됨
    - 동일한 방 내에서 조명의 상태에 따라 값이 달라지는데, 다음과 같이 같은 값이 나타날 때도 있음
      F7 0C 01 19 04 40 60 00 01 02 C4 EE
      F7 0C 01 19 04 40 60 00 02 01 C4 EE
      이는 Sum 방식 혹은 XOR 방식의 체크섬 계산으로 인한 결과가 아닐까 생각됨

이제 상태 변경 명령을 외부에서 날렸을 때 어떤 패킷이 수신되는지 알아볼 차례

지금 추측으로는 명령은 3번째 바이트 0x01이 다른 값으로 바뀐 패킷이 전송되지 않을까 싶긴 한데 (4번째 바이트 0x19는 디바이스 ID), 실제로 패킷을 까봐야 알 수 있을 듯~

 

글이 너무 길어졌으니, 외부 명령에 대한 내용은 다음 글에서 계속하도록 한다

 

[시리즈]

힐스테이트 광교산::조명 제어 RS-485 패킷 분석 (1)

힐스테이트 광교산::조명 제어 RS-485 패킷 분석 (2)

반응형
Comments