YOGYUI

현대통신 월패드 HA 애드온 RS-485 명령 반복 전송 파라미터 추가 본문

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

현대통신 월패드 HA 애드온 RS-485 명령 반복 전송 파라미터 추가

요겨 2024. 8. 22. 23:25
반응형

Home Assistant Hyundai HT Wallpad Addon: add RS-485 repeat command parameters

지난 8월 21일, Home Assistant(HA)용 현대통신 월패드 RS-485 연동 애드온의 또다른 이슈가 댓글로 접수되었다

Home Assistant add-on 베타버전 릴리즈

 

Home Assistant add-on 베타버전 릴리즈

Developing Home Assistant add-on: Release beta version 홈어시스턴트(Home Assistant, HA) 애드온을 겨우겨우 쓸만하게 만들었다 ^^;; https://github.com/YOGYUI/homeassistant-addons GitHub - YOGYUI/homeassistant-addons: My Home Assistant Ad

yogyui.tistory.com

이슈: 엘리베이터 호출 시 호출 기기에서 비프음이 반복 재생됨

 

자세한 문제상황을 알기 위해 메일로 문제 발생 시 영상을 부탁드렸다

 

확실히 비프음이 반복 재생되는 것을 확인할 수 있다

아마도 엘리베이터 호출 명령 RS-485 패킷을 월패드로부터 수신할 때마다 엘리베이터 호출용 미니패드에서 비프음이 발생하는게 아닌가 조심스레 추측해볼 수 있다

내 소스코드는 명령이 확실하게 수행될 때까지 일정 주기로 일정 횟수만큼 명령 패킷을 반복 전송하는 기능을 구현해뒀는데, 이게 댓글 작성자분과 같은 디바이스에서는 문제가 될 수도 있다.. 역시 베타 테스트를 하다보니 이런 저런 신기한(?) 케이스를 많이 접해보게 된다 ㅎㅎ

1. 소스코드 수정

1.1. 기존코드 구현 방식

안타깝게도 기존의 내 소스코드는 명령 패킷 반복 전송 관련 변수가 하드코딩되어 있었다 (아무래도 내가 거주중인 집만을 대상으로 우선적으로 구현하다보니 굳이 변경할 필요성을 느끼지 못했다)

# ThreadCommandQueue.py
class ThreadCommandQueue(threading.Thread):
    @staticmethod
    def getSendParams(parser: PacketParser) -> tuple:
        interval = 0.2
        retry_cnt = 10
        if parser.getRS485HwType() == RS485HwType.Socket:
            # ew11은 무선 송수신 레이턴시때문에 RS485 IDLE 시간을 명확하게 알 수 없으므로
            # 짧은 간격으로 패킷을 많이 쏴보도록 한다
            interval = 0.1
            retry_cnt = 50

USB-to-RS485 컨버터와 같은 유선 연결의 경우 패킷 전송간 인터벌은 200ms, 최대 반복 횟수는 10회로 구현했고, EW-11과 같은 무선 네트워크 기반 컨버터의 경우 인터벌 100ms, 최대 반복 횟수는 50회로 하드코딩해뒀었다

댓글 작성자분이 '엘리베이터 호출될 때까지 1~2초가량 소요되는데, 그동안 10번 이상 비프음이 들린'다고 했으니 100ms 간격으로 명령 패킷이 전송되었던 것으로 추정된다

 

이 두개의 파라미터를 외부에서 수정 가능하게 변경해줘야 한다

※ 최대 반복 횟수의 경우, 월패드나 디바이스의 문제 등으로 인해 상태가 정상적으로 변경되지 않을 경우 명령 패킷 전송 쓰레드가 무한정 패킷을 전송하게 되는 문제를 방지하기 위해 반드시 필요한 파라미터라고 생각한다

1.2. 코드 수정 및 커밋

엘리베이터만 문제가 되는 경우이므로 각 디바이스 타입별로 반복 전송 파라미터를 구별하여 설정할 수 있게 해주는 게 올바른 구현 방법인데, 이러면 코드 변경점이 너무 많아져 코드가 좀 지저분해질 가능성이 있기에 이번에는 디바이스 무관 공통으로 설정할 수 있게 구현했다

# PacketParser.py
class PacketParser:
    def __init__(self, 
                 rs485_instance: RS485Comm, 
                 name: str, 
                 index: int, 
                 send_command_interval_ms: int,
                 send_command_retry_count: int,
                 type_interpret: ParserType = ParserType.REGULAR):
        self.send_command_interval_ms: int = send_command_interval_ms
        self.send_command_retry_count: int = send_command_retry_count

이제 명령 패킷 반복 전송 관련 두 파라미터 (인터벌, 최대 횟수)는 각 PacketParser 객체가 내부에 멤버변수로 가지고 있게 변경했다

# ThreadCommandQueue.py
class ThreadCommandQueue(threading.Thread):
    @staticmethod
    def getSendParams(parser: PacketParser) -> Tuple[float, int]:
        interval_sec = parser.send_command_interval_ms / 1000
        retry_cnt = parser.send_command_retry_count
        return interval_sec, retry_cnt

명령 패킷 전송 쓰레드에서는 관련 파라미터를 PacketParser 객체에서 직접 가져오도록 변경

 

그리고 HA 애드온으로부터 전달받은 애드온 파라미터를 소스코드 설정파일에 적용하는 내용은 코드가 좀 길어서 깃허브 커밋 내역으로만 공유하도록 한다

https://github.com/YOGYUI/HomeNetwork/commit/bc66e6d152c300ea98e9ec4921beccc725721748

 

version 1.1.3: RS-485 명령 패킷 반복 전송 파라미터 추가 · YOGYUI/HomeNetwork@bc66e6d

YOGYUI committed Aug 22, 2024

github.com

2. HA 애드온 버전 릴리즈

HA 애드온의 설정을 통해 사용자가 파라미터를 변경할 수 있어야 하므로 애드온 버전 업데이트가 불가피해 1.1.3 버전을 릴리즈했다

2.1. 파라미터 설정법

'관련 문서' 탭에 DOCS.md 마크다운 문서로 파라미터 설정법을 기재해뒀다

cmd_interval_ms, cmd_retry_count는 optional 파라미터로, 반드시 기재하지 않아도 되며 만약 기재하지 않을 경우 문서와 같이 100ms / 50회가 default값으로 적용된다

만약 특성 RS-485 컨버터의 반복 명령 전송을 500ms 간격으로 최대 25회까지만 하고 싶다면 위와 같이 '구성' 탭에서 변경해주면 된다 (설정 저장 후 애드온 재시작 필요)

애드온 재시작 후 '로그' 탭에서 설정된 파라미터를 로그로 확인할 수 있다

3. 테스트

굳이 우리집에서 테스트할 필요는 없어서 댓글 작성자분께 바로 테스트를 부탁드렸다

 

얼마 지나지 않아 답변을 받을 수 있었다

 

월패드로 제어 가능한 디바이스가 '일반 조명'과 '엘리베이터' 2종류밖에 없는데, 인터벌을 지나치게 길게 하고 반복 횟수를 적게 할 경우 엘리베이터 호출 패드 비프음 현상은 사라지나 전등 제어가 씹히는 경우가 발생해 파라미터를 튜닝하는 작업을 거치셨다고 한다 

※ 내 코드는 RS-485 명령에 대한 응답 패킷도 즉각적으로 해석해 반영하므로 1번만 제대로 전송되면 더이상 반복 전송하지 않는다는 특징이 있다

4. 마무리

감사인사와 함께 스타벅스 쿠폰을 선물받았다 ^^

요즘은 코드에 별 문제가 없는지 문의가 오는 횟수도 부쩍 줄었을 뿐만 아니라 기부를 해주시는 분이 없어서 약간 섭섭하던(?) 차에 기분좋은 선물을 받았다~ ㅎㅎ 개발자로 살아가는 소소한 즐거움이랄까?

선물주시는 분은 약소하다 하시지만 받는 입장에서는 당연히 기분이 굉장히 좋다!

 

이번 주말엔 간만에 또 스타벅스 아메리카노 한잔 때려야겠다 (메가커피 질려...)

야심차게 코딩작업하고 릴리즈까지 했는데, 정작 포스팅하니 내용이 별볼일 없어서 주저리주저리 잡설이 길어졌다.. ㅋㅋ

 

반응형