홈으로 돌아가기

Home Assistant의 HDMI Matrix: RS-232 통합

이 기사는 RS-232를 통해 Home Assistant에 사용자 지정 4×4 HDMI 매트릭스 통합을 만드는 방법을 설명합니다. threading이 포함된 상세한 coordinator 코드, media_player 엔티티, 교환 프로토콜. Raspberry Pi를 위한 Samba를 통한 설치 지침.

Home Assistant용 DIY HDMI 스위치: 전체 가이드
Advertisement 728x90

RS-232를 통해 4×4 HDMI 매트릭스를 Home Assistant에 통합하기

4×4 HDMI 매트릭스 기반 시스템을 사용하면 케이블 TV, 미디어 플레이어, 게임 콘솔과 같은 신호 소스를 네 대의 TV 사이에서 전환할 수 있습니다. Home Assistant와의 통합은 명령을 위해 RS-232를, 시리얼 포트와의 스레드 안전 작업을 위해 코디네이터를 사용합니다. Qwen 신경망이 프로토콜 역공학과 코드 개발을 가속화했습니다.

하드웨어 요구사항 및 사전 준비

4K@60 Hz와 RS-232를 지원하는 4×4 매트릭스와 라즈베리 파이용 USB-to-RS232 변환기가 필요합니다. 제어 프로토콜은 Habr의 기사를 기반으로 역공학되었습니다: 명령은 텍스트 형식이며, 전송 속도는 115200입니다.

HDMISwitchCoordinator는 별도의 스레드에서 연결을 관리하여 Home Assistant 이벤트 루프의 차단을 방지합니다. 포트 초기화, threading.Lock을 사용한 명령 전송, 응답의 백그라운드 읽기를 지원합니다.

Google AdInline article slot

통신 프로토콜

전환 명령: cir + 8 × (zone-1) + (input-1)로 계산된 16진수 값.

예시:

  • Zone 1, input 1: cir 00
  • Zone 2, input 3: cir 11 (0x0A를 0a로)

명령은 \r\n으로 끝납니다. 장치는 s{zone}{input}과 같은 상태를 전송합니다. 예를 들어, s13은 zone 1이 input 3에 있음을 의미합니다. 코디네이터는 이를 파싱하고 콜백을 통해 엔티티를 업데이트합니다.

Google AdInline article slot

media_player 엔티티

각 zone은 자체 media_player 엔티티를 가집니다:

  • 현재 소스를 표시
  • 목록에서 입력을 선택 가능
  • media_player.select_source 서비스 지원
  • 사용자 정의 소스 이름

기능:

  • 켜기: 첫 번째 소스를 선택
  • 끄기: 더미 두 번째 소스를 선택
  • 아이콘: /config/www/hdmi_switch/img_{n}.png의 entity_picture

설치 구조

폴더 custom_components/hdmi_switch/:

Google AdInline article slot
config/
├── custom_components/
│   └── hdmi_switch/
│       ├── __init__.py
│       ├── manifest.json
│       ├── const.py
│       ├── media_player.py
│       └── images/  # img_1.png 등
├── www/
│   └── hdmi_switch/
└── configuration.yaml

Samba를 통한 설치:

  • HA에서 Samba 공유 설정
  • 연결: \\homeassistant\config
  • 구조 생성, 파일 업로드
  • HA 재부팅

코드: manifest.json

{
  "domain": "hdmi_switch",
  "name": "HDMI Switch",
  "version": "1.1.0",
  "requirements": ["pyserial>=3.5"],
  "iot_class": "local_push",
  "config_flow": false
}

코드: const.py

DOMAIN = "hdmi_switch"
DEFAULT_NAME = "HDMI Switch"
DEFAULT_PORT = "/dev/ttyACM0"
DEFAULT_COMMAND_BAUDRATE = 115200
DEFAULT_TIMEOUT = 5.0
DEFAULT_SOURCES = ["Input 1", "Input 2", "Input 3", "Input 4"]

코드: __init__.py (코디네이터)

클래스 HDMISwitchCoordinator:

  • _open_serial(): serial.Serial(port, baudrate=115200, timeout=0.5, 8N1)
  • start(): _initialize_and_listen을 위한 스레딩
  • _listen_loop(): 백그라운드 읽기
  • register_listener(zone_id, callback)

전체 코드는 스레드 안전성과 비동기성을 보장합니다.

configuration.yaml의 구성

hdmi_switch:
  port: /dev/ttyACM0  # 선택 사항
  command_baudrate: 115200
  timeout: 5.0

재부팅 후, 엔티티는 인터페이스에서 사용 가능합니다. 아이콘은 자동으로 www/hdmi_switch로 복사됩니다.

핵심 포인트

  • 스레드 안전성: 시리얼을 위한 threading.Lock과 별도의 스레드
  • 엔티티: select_source와 entity_picture가 있는 4개의 media_player 엔티티
  • 프로토콜: 전환을 위한 cir{hex}, 상태를 위한 s{zone}{input}
  • 의존성: pyserial>=3.5
  • 설치: HACS 없이 custom_components

— Editorial Team

Advertisement 728x90

다음 읽기