일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- RS-485
- raspberry pi
- Apple
- 배당
- 국내주식
- 파이썬
- 코스피
- 티스토리챌린지
- 애플
- 월패드
- MQTT
- 오블완
- cluster
- 해외주식
- 공모주
- 현대통신
- Home Assistant
- homebridge
- 미국주식
- SK텔레콤
- matter
- ConnectedHomeIP
- Espressif
- esp32
- 나스닥
- 매터
- 힐스테이트 광교산
- 홈네트워크
- Python
- Bestin
- Today
- Total
YOGYUI
힐스테이트 광교산::난방 제어 RS-485 패킷 분석 본문
지난번 도시가스차단기(밸브)쪽 포트의 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)와 연동할 차례~
'홈네트워크(IoT) > 힐스테이트 광교산' 카테고리의 다른 글
힐스테이트 광교산::환기(전열교환기) 제어 RS-485 패킷 분석 (0) | 2022.06.17 |
---|---|
힐스테이트 광교산::난방 - 애플 홈킷 + 구글 어시스턴트 연동 (2) | 2022.06.17 |
힐스테이트 광교산::도시가스차단기(밸브) - 애플 홈킷 + 구글 어시스턴트 연동 (0) | 2022.06.15 |
힐스테이트 광교산::도시가스차단기(밸브) 제어 RS-485 패킷 분석 (0) | 2022.06.14 |
힐스테이트 광교산::아울렛(콘센트) - 애플 홈킷 + 구글 어시스턴트 연동 (0) | 2022.06.14 |