Powrót do strony głównej

Macierz HDMI w Home Assistant: integracja RS-232

Artykuł opisuje tworzenie niestandardowej integracji matrycy HDMI 4×4 w Home Assistant przez RS-232. Szczegółowy kod koordynatora z threading, encji media_player i protokół wymiany. Instrukcja instalacji przez Samba dla Raspberry Pi.

DIY Przełącznik HDMI dla Home Assistant: pełny przewodnik
Advertisement 728x90

Integracja matrycy HDMI 4×4 w Home Assistant przez RS-232

System oparty na matrycy HDMI 4×4 umożliwia przełączanie źródeł sygnału — telewizji kablowej, odtwarzaczy multimedialnych, konsol — pomiędzy czterema telewizorami. Integracja z Home Assistant wykorzystuje RS-232 do przesyłania komend oraz Coordinator do bezpiecznej pracy z portem w środowisku wielowątkowym. Sieć neuronowa Qwen przyspieszyła reverse engineering protokołu i rozwój kodu.

Sprzęt i założenia wstępne

Wymagana jest matryca 4×4 z obsługą 4K@60 Hz i RS-232, konwerter USB-to-RS232 dla Raspberry Pi. Protokół sterowania został zrekonstruowany na podstawie artykułu na Habr: komendy w formacie tekstowym, prędkość 115200 bodów.

Koordynator HDMISwitchCoordinator zarządza połączeniem w oddzielnych wątkach, unikając blokowania pętli zdarzeń Home Assistant. Obsługuje inicjalizację portu, wysyłanie komend z blokadą threading.Lock oraz tło czytania odpowiedzi.

Google AdInline article slot

Protokół komunikacji

Komendy przełączania: cir + wartość hex według wzoru 8 × (strefa-1) + (wejście-1).

Przykłady:

  • Strefa 1, wejście 1: cir 00
  • Strefa 2, wejście 3: cir 11 (0x0A jako 0a)

Komenda kończy się \r\n. Urządzenie wysyła statusy s{strefa}{wejście}, np. s13 — strefa 1 na wejściu 3. Koordynator parsuje i aktualizuje encje przez callbacks.

Google AdInline article slot

Encje media_player

Dla każdej strefy — osobny media_player:

  • Wyświetlanie aktualnego źródła
  • Wybór wejścia z listy
  • Serwisy media_player.select_source
  • Niestandardowe nazwy źródeł

Obsługa:

  • Włączenie: pierwsze źródło
  • Wyłączenie: drugie źródło (atrapa)
  • Ikony: entity_picture z /config/www/hdmi_switch/img_{n}.png

Struktura instalacji

Folder 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 itd.
├── www/
│   └── hdmi_switch/
└── configuration.yaml

Instalacja przez Sambę:

  • Zainstaluj udostępnianie Samba w HA
  • Połącz się: \\homeassistant\config
  • Utwórz strukturę, załaduj pliki
  • Zrestartuj HA

Kod: manifest.json

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

Kod: const.py

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

Kod: __init__.py (koordynator)

Klasa HDMISwitchCoordinator:

  • _open_serial(): serial.Serial(port, baudrate=115200, timeout=0.5, 8N1)
  • start(): threading dla _initialize_and_listen
  • _listen_loop(): tło czytania
  • register_listener(zone_id, callback)

Pełny kod zapewnia bezpieczeństwo wątków i asynchroniczność.

Konfiguracja w configuration.yaml

hdmi_switch:
  port: /dev/ttyACM0  # opcjonalnie
  command_baudrate: 115200
  timeout: 5.0

Po restarcie encje są dostępne w interfejsie. Ikony kopiowane automatycznie do www/hdmi_switch.

Co jest ważne

  • Bezpieczeństwo wątków: threading.Lock i oddzielne wątki dla serial
  • Encje: 4 media_player z select_source i entity_picture
  • Protokół: cir{hex} dla przełączania, s{strefa}{wejście} dla statusu
  • Zależności: pyserial>=3.5
  • Instalacja: custom_components bez HACS

— Editorial Team

Advertisement 728x90

Czytaj dalej