YOGYUI

현대통신 월패드 '디밍조명' RS-485 응답 패킷 유형 추가 (깃허브) 본문

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

현대통신 월패드 '디밍조명' RS-485 응답 패킷 유형 추가 (깃허브)

요겨 2024. 9. 3. 07:24
반응형

Hyundai HT Wallpad: Add Parsing New Type Response Packet of 'Dimming Light'

1. 서론

지난 8월 27일, 현대통신 월패드 RS-485 연동 홈어시스턴트(HomeAssistant, HA) 애드온 유저 한분으로부터 에러 리포트를 받았다

 

지난 7월 말 추가한 '디밍조명'과 관련된 이슈

문제상황: 현재 상태값을 파싱할 때 On/Off 상태 토글이 지속되며 명령에 대한 반응이 늦거나 씹히는 경우가 발생

 

디밍조명은 내가 거주중인 힐스테이트 광교산에 디바이스 타입이 없는데도 불구하고, 다른 개발자분께서 깃허브(GitHub) 소스코드에 풀 리퀘스트(Pull Request)를 올려주신 덕분에 기능을 추가할 수 있었다

현대통신 월패드 '디밍조명' 제어 기능 추가 (깃허브, HA 애드온)

 

현대통신 월패드 '디밍조명' 제어 기능 추가 (깃허브, HA 애드온)

Add Hyundai HT Wallpad 'dimming light' device type1. 개요3주 전인 2024년 7월 11일, 현대통신 월패드 RS-485 연동 깃허브 소스코드에 처음으로 Pull-Request가 등록됐다https://github.com/YOGYUI/HomeNetwork/pull/12 Add support fo

yogyui.tistory.com

실제로 테스트할 수 있는 장치가 없기 때문에 정말 모든게 다 잘되는지에 대한 약간의 찝찝함이 남아 있었는데, 실제로 얼마 지나지 않아 문제가 발생했다 ㅋㅋ (생각보다 현대통신 월패드의 디밍조명을 활용한 집이 많아보이는 것은 기분탓이려나?)


어쨌든 패킷의 어떤 부분이 잘못 되었는지 명확히 파악하기가 힘들었기에 유저분께 RS-485 패킷 분석이 가능한지 여부를 의뢰드렸고, 오늘(9/3) 새벽 2시 40분 무렵 답변을 받을 수 있었다 (대단한 열정의 소유자!)

 

7개의 첨부파일 들 중 디밍조명과 관련된 패킷이 정리된 문서를 살펴보니 무엇이 문제인지 바로 파악되었다!

 

처음으로 디밍조명 패킷 파서를 구현할 때, 5번째 바이트가 0x04응답 패킷의 6번째 바이트가 0x40인 경우 On/Off의 상태, 0x42인 경우 조명의 밝기 레벨 정보가 담겨있는 것으로 파악한 바 있다

이 때, 7번째 바이트의 하위 4비트가 1-based 디바이스 인덱스인 것으로 파악되었는데 이번에 메일주신 분의 경우를 보니 디바이스 인덱스가 0인 경우가 있는 것으로 보인다

우리 집도 일반 조명의 경우 응답 패킷의 디바이스 인덱스가 0인 경우 특정 공간에 있는 모든 조명에 대한 On/Off 상태값들을 모두 담고 있었는데, 디밍조명도 마찬가지가 아닐까 조심스레 추측할 수 있다 ㅎㅎ

2. 패킷 상세 추가

지난 글에서 응답 패킷에 대한 패킷 상세에 디바이스 인덱스가 0인 경우에 대한 내용을 추가해주자

2.1. 전원 On/Off 응답 패킷

Index 0 1 2 3 4 5 6 7 8~7+n 8+n 9+n
Value F7 0B 01 1A 04 40 XX -- YY ZZ EE
  • 패킷 길이 (10 + n)
    ※ 장치 인덱스가 0이 아닌 경우 n=1로 고정
  • 4번째 바이트: 디바이스 타입 = 0x1A
  • 5번째 바이트: 패킷 타입 = '상태 응답' = 0x04 (통신방향: 월패드←디바이스)
  • 6번째 바이트: 명령/상태 타입 = On/Off = 0x40
  • 7번째 바이트: 상위 4비트 = 공간 인덱스, 하위 4비트 = 장치 인덱스
    ※ 장치 인덱스 값이 0인 경우 해당 공간의 디바이스 개수 n = 패킷 길이 - 10
  • 9~(8+n)번째 바이트: 현재 조명 On/Off 상태, 0x02=OFF, 0x01=ON (일반 조명과 동일)
  • (9+n)번째 바이트: XOR Checksum

2.2. 밝기 레벨 응답 패킷

Index 0 1 2 3 4 5 6 7 8 9 10
Value F7 0B 01 1A 04 42 XX -- YY ZZ EE
Index 0 1 2 3 4 5 6 7 8~7+n 8+n 9+n
Value F7 0B 01 1A 04 40 XX -- YY ZZ EE
  • 패킷 길이 (10 + n)
    ※ 장치 인덱스가 0이 아닌 경우 n=1로 고정
  • 4번째 바이트: 디바이스 타입 = 0x1A
  • 5번째 바이트: 패킷 타입 = '상태 응답' = 0x04 (통신방향: 월패드←디바이스)
  • 6번째 바이트: 명령/상태 타입 = Brightness = 0x42
  • 7번째 바이트: 상위 4비트 = 공간 인덱스, 하위 4비트 = 장치 인덱스
    ※ 장치 인덱스 값이 0인 경우 해당 공간의 디바이스 개수 n = 패킷 길이 - 10
  • 9~(8+n)번째 바이트: 현재 조명 밝기값
  • (9+n)번째 바이트: XOR Checksum

3. 소스코드 수정 및 깃허브 커밋

코드는 디바이스 인덱스가 0인 경우에 대한 구문만 추가하면 되기 때문에 변경 사항은 거의 없다

class PacketParser:
    def interpretPacket(self, packet: bytearray):
        if packet[3] == 0x1A:  # 디밍조명
            self.handleDimmingLight(packet)
    
    def handleDimmingLight(self, packet: bytearray):
        room_idx = packet[6] >> 4
        if packet[4] == 0x04:
            state_type = packet[5]
            dev_idx = packet[6] & 0x0F
            if dev_idx == 0:
                light_count = len(packet) - 10
                for idx in range(light_count):
                    if state_type == 0x40:
                        state = 0 if packet[8 + idx] == 0x02 else 1
                        result = {
                            'device': DeviceType.DIMMINGLIGHT, 
                            'index': idx,
                            'room_index': room_idx,
                            'state': state,
                            'brightness': None
                        }
                        self.updateDeviceState(result)
                    elif state_type == 0x42:
                        brightness = packet[8]
                        result = {
                            'device': DeviceType.DIMMINGLIGHT, 
                            'index': idx,
                            'room_index': room_idx,
                            'state': None,
                            'brightness': brightness
                        }
                        self.updateDeviceState(result)
            else:  # 상태 변경 명령 직후 응답
                # 기존과 동일

 

별달리 직접 테스트할 수 있는 환경이 아니기 때문에 일단 메인 브랜치에 커밋을 저질렀다(?)

https://github.com/YOGYUI/HomeNetwork/commit/771ee82d9cdae94f27119ce1608c860976e09a75

 

디밍조명 응답 패킷 'dev_idx=0일 경우' 파싱 구문 추가 · YOGYUI/HomeNetwork@771ee82

YOGYUI committed Sep 2, 2024

github.com

애드온을 재시작하면 소스코드의 버전이 1.1.3.1로 업데이트된 것을 알 수 있다

애드온 재시작 후 로그 확인 결과

4. 알파테스트

내가 만든 HA 애드온은 재시작 시 깃허브 메인 브랜치의 소스코드를 pull해오기 때문에 HA 버전 변경없이 재시작만으로 최신 코드를 적용할 수 있다 (장단점이 있는 기능이랄까..)

 

깃허브에 소스코드를 커밋하자마자 메일을 보내 테스트를 요청드렸다

과연 의도한대로 동작할지, 약간의 설렘을 갖고 답변을 기다려본다 ㅎㅎ

답변 후 내용 추가예정


(24.09.04 내용 추가)

테스트 요청을 드린 바로 다음날 새벽, 테스트 결과에 대한 답변을 받았다

테스트 결과 답변 메일

 

다양한 종류의 기기가 정상적으로 연동 완료!! ㅎㅎ

EW11 RS-485 A/B 포트 반대 결선에 대해서도 의심했었는데 예상대로 제대로 결선하고 나니 제대로 패킷 파싱을 하여 환풍기, 난방도 제어할 수 있게 되었다고 하신다

훈훈한 결말


이렇게 조금씩, 조금씩 점진적으로 소스코드의 완성도가 높아지고 있다 ^^

현대통신 월패드 설정창을 보면 쿡탑이나 전동커튼같은 마이너한(?) 종류의 기기들도 지원이 되는 걸로 보이는데, 이런 기기들에 대한 추가 요청도 많이 접수되길 바란다

 

매우매우 감사하게도 교촌치킨 쿠폰을 보내주셨다

이번주 목요일(9/5)에 월드컵 3차예선 팔레스타인전을 볼 계획이었는데 곁들일 치킨이 생겼다!

반응형