YOGYUI

힐스테이트 광교산::난방 제어 RS-485 패킷 분석 본문

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

힐스테이트 광교산::난방 제어 RS-485 패킷 분석

요겨 2022. 6. 16. 00:35
반응형

지난번 도시가스차단기(밸브)쪽 포트의 RS-485 패킷 분석 시 (링크), 4번째 바이트가 0x1B인 패킷은 가스밸브와 관련된 패킷인 것을 알아냈다

그 외에도 4번째 바이트가 0x18, 0x1C, 0x2A, 0x2B, 0x34, 0x48인 패킷 종류가 있는 것을 확인했는데, 이제 힐스테이트 Hi-oT 앱으로 제어 가능한 디바이스들을 하나하나 건드려보면서 각각이 어떤 기기와 관련있는지 알아내보자

1. 난방 가동 및 온도 변경 패킷 분석

class ParserGas(SerialParser):    
    def interpretPacket(self, packet: bytearray):
        if packet[2:4] == bytearray([0x01, 0x1B]):  # 가스차단기
            if packet[4] == 0x01:  # 상태 쿼리
                pass
            elif packet[4] == 0x02:  # 상태 변경 명령
                pass
            elif packet[4] == 0x04:  # 상태 응답
                state = 0 if packet[8] == 0x03 else 1
                result = {
                    'device': 'gasvalve',
                    'state': state
                }
                self.sig_parse_result.emit(result)
        else:
            if packet[4] == 0x02:
                print(self.prettifyPacket(packet))

가스밸브때와 마찬가지로 5번째 바이트가 0x02, 즉 명령 패킷만 캡쳐하도록 코드를 수정한 뒤 Hi-oT 앱으로 명령을 내리면서 패킷을 기록해봤다


F7 0B 01 18 02 46 11 01 00 B1 EE : 거실 난방 시작 명령

F7 0B 01 18 02 46 11 04 00 B4 EE : 거실 난방 종료 명령

F7 0B 01 18 02 46 12 01 00 B2 EE : 침실(방1) 난방 시작 명령

F7 0B 01 18 02 46 12 04 00 B7 EE : 침실(방1) 난방 종료 명령

F7 0B 01 18 02 46 13 01 00 B3 EE : 서재(방2) 난방 시작 명령

F7 0B 01 18 02 46 13 04 00 B6 EE : 서재(방2) 난방 종료 명령

F7 0B 01 18 02 46 14 01 00 B4 EE : 컴퓨터방(방3) 난방 시작 명령
F7 0B 01 18 02 46 14 04 00 B1 EE : 컴퓨터방(방3) 난방 종료 명령


난방 가동 시작/중단 명령은 길이 11(=0x0B)에 네번째 바이트가 0x18로 구성되어 있는 것을 알 수 있다

7번째 바이트는 상위 4비트는 1로 고정되어 있고, 하위 4비트는 공간 인덱스 값이고, 8번째 바이트0x01이면 가동 시작, 0x04면 가동 종료 명령인 것으로 드러났다 (조명/아울렛과는 미묘하게 차이가 있다)

 

조명, 아울렛, 가스밸브는 이진상태 (On/Off) 변경 명령이 전부이지만, 난방같은 경우는 설정 온도 변경 명령도 있기에 앱을 통해 희망온도를 변경하면서 패킷을 캡쳐해봤다


F7 0B 01 18 02 45 14 17 00 A1 EE : 컴퓨터방(방3) 난방 온도 23도로 변경

F7 0B 01 18 02 45 14 18 00 AE EE : 컴퓨터방(방3) 난방 온도 24도로 변경 

F7 0B 01 18 02 45 14 1E 00 A8 EE : 컴퓨터방(방3) 난방 온도 30도 (최대)로 변경

F7 0B 01 18 02 45 14 12 00 A4 EE : 컴퓨터방(방3) 난방 온도 18도 (최소)로 변경


가동 시작/종료 명령과는 달리 6번째 바이트가 0x45인 것을 알 수 있다

또한, 아주 편하게도 8번째 바이트가 희망온도값과 일치하는 것을 알 수 있다

(0x17 = 23, 0x18 = 24, 0x1E = 30, 0x12 = 18)

아이파크 bestin은 0.5도 단위로 설정이 되어서 2바이트를 사용했는데, 힐스테이트는 단순하게 1바이트 정수값을 그대로 온도값으로 쓰면 되니 구현이 좀 더 편할 것 같다 (그래봤자 코드 1줄 차이지만 ㅎㅎ)

2. 쿼리 및 응답 패킷 분석

4번째 바이트가 0x18이면 난방 관련 패킷인 것을 알아냈으니, 이제 평소에 월패드가 난방 모듈과 주고받는 패킷을 캡쳐해서 분석해보자


F7 0B 01 18 01 46 10 00 00 B2 EE : 평소 쿼리 패킷

F7 22 01 18 04 46 10 00 04 19 15 04 19 17 04 19 16 04 1A 12 00 00 00 00 00 00 00 00 00 00 00 00 9B EE : 평소 응답 패킷

F7 0B 01 18 02 46 14 01 00 B4 EE : 컴퓨터방(방3) 난방 시작 명령
F7 0D 01 18 04 46 14 01 01 1A 12 BD EE : 컴퓨터방(방3) 난방 시작 명령 직후 응답 패킷

F7 0B 01 18 02 45 14 14 00 A2 EE : 컴퓨터방(방3) 희망 온도 20도로 변경
F7 0D 01 18 04 45 14 14 01 1A 14 AD EE : 컴퓨터방(방3) 희망 온도 20도로 변경 명령 직후 응답 패킷

F7 0B 01 18 02 46 14 04 00 B1 EE : 컴퓨터방(방3) 난방 종료 명령
F7 0D 01 18 04 46 14 04 04 1A 14 BB EE : 컴퓨터방(방3) 난방 종료 명령 직후 응답 패킷


이제 앱의 값들과 비교하면서 패킷 명세를 작성해보자

  • 4번째 바이트가 0x18이면 난방 관련 패킷
  • 5번째 바이트가 0x01이면 쿼리, 0x02이면 명령, 0x04이면 응답 패킷
  • 6번째 바이트가 0x45이면 온도 설정 관련 패킷이며 나머지(0x46)는 쿼리, 응답, 가동 시작/중단 명령 패킷
  • 쿼리/응답 시 7번째 바이트의 하위 4비트가 0이면 집안 전체 난방에 대한 정보가 들어있으며, 0이 아닐경우 해당 공간 인덱스에 해당하는 난방 정보가 들어있다
  • 명령 직후 응답 패킷의 9번째 바이트는 가동 여부 (0x01이면 가동, 0x04이면 중단), 10번째 바이트는 현재 온도, 11번째 바이트는 희망온도 값이다
  • 전체 응답의 경우 9번째 바이트부터 3바이트 단위로 각 방의 난방 상태 정보가 들어있다
    [가동여부, 현재 온도, 희망 온도]
    존재하지 않는 방의 경우 모두 0으로 채워져있는데, 최대 8개의 방까지 정보를 담을 수 있는 것을 알 수 있다 (덜덜덜...)

패킷 구조가 명확하다보니 분석 진도가 쭉쭉 잘 나간다

광교 아이파크때와 달리 손쉽게 외부에서 제어할 수 있는 스마트폰 어플리케이션도 있으니 패킷 캡쳐도 빠르게 진행할 수 있다 (월패드로 하나하나 제어하는거 꽤 오래 걸리고 빡친다)

 

이제 난방 제어를 홈네트워크 플랫폼 (Homebridge, Home Assistant)와 연동할 차례~

반응형