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.
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 jako0a)
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.
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/:
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 czytaniaregister_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
Brak komentarzy.