Integrace HDMI matice 4×4 do Home Assistant přes RS-232
Systém založený na HDMI matici 4×4 umožňuje přepínat zdroje signálu — kabelovou TV, mediální přehrávače, herní konzole — mezi čtyřmi televizory. Integrace s Home Assistant využívá RS-232 pro příkazy a Coordinator pro vláknově bezpečnou práci s portem. Neuronová síť Qwen urychlila reverzní inženýrství protokolu a vývoj kódu.
Hardwarové předpoklady
Je potřeba matice 4×4 s podporou 4K@60 Hz a RS-232, USB-to-RS232 konvertor pro Raspberry Pi. Řídicí protokol byl reverzně inženýrskován podle článku na Habr: příkazy v textovém formátu, rychlost 115200 baudů.
Koordinátor HDMISwitchCoordinator spravuje spojení v samostatných vláknech, čímž se vyhýbá blokování event loop Home Assistant. Podporuje inicializaci portu, odesílání příkazů s blokováním threading.Lock a načítání odpovědí na pozadí.
Protokol komunikace
Příkazy pro přepínání: cir + hexadecimální hodnota podle vzorce 8 × (zóna-1) + (vstup-1).
Příklady:
- Zóna 1, vstup 1:
cir 00 - Zóna 2, vstup 3:
cir 11(0x0A jako0a)
Příkaz končí \r\n. Zařízení posílá stavy s{zóna}{vstup}, například s13 — zóna 1 na vstupu 3. Koordinátor parsuje a aktualizuje entity přes callbacks.
Entity media_player
Pro každou zónu — samostatný media_player:
- Zobrazení aktuálního zdroje
- Výběr vstupu ze seznamu
- Služby media_player.select_source
- Vlastní názvy zdrojů
Podpora:
- Zapnutí: první zdroj
- Vypnutí: druhý zdroj (zástupný)
- Ikony: entity_picture z /config/www/hdmi_switch/img_{n}.png
Struktura instalace
Složka custom_components/hdmi_switch/:
config/
├── custom_components/
│ └── hdmi_switch/
│ ├── __init__.py
│ ├── manifest.json
│ ├── const.py
│ ├── media_player.py
│ └── images/ # img_1.png atd.
├── www/
│ └── hdmi_switch/
└── configuration.yaml
Instalace přes Samba:
- Nastavit Samba share v HA
- Připojit se:
\\homeassistant\config - Vytvořit strukturu, nahrát soubory
- Restartovat HA
Kód: manifest.json
{
"domain": "hdmi_switch",
"name": "HDMI Switch",
"version": "1.1.0",
"requirements": ["pyserial>=3.5"],
"iot_class": "local_push",
"config_flow": false
}
Kód: const.py
DOMAIN = "hdmi_switch"
DEFAULT_NAME = "HDMI Switch"
DEFAULT_PORT = "/dev/ttyACM0"
DEFAULT_COMMAND_BAUDRATE = 115200
DEFAULT_TIMEOUT = 5.0
DEFAULT_SOURCES = ["Vstup 1", "Vstup 2", "Vstup 3", "Vstup 4"]
Kód: __init__.py (koordinátor)
Třída HDMISwitchCoordinator:
_open_serial(): serial.Serial(port, baudrate=115200, timeout=0.5, 8N1)start(): threading pro _initialize_and_listen_listen_loop(): načítání na pozadíregister_listener(zone_id, callback)
Celý kód zajišťuje vláknovou bezpečnost a asynchronitu.
Konfigurace v configuration.yaml
hdmi_switch:
port: /dev/ttyACM0 # volitelně
command_baudrate: 115200
timeout: 5.0
Po restartu jsou entity dostupné v rozhraní. Ikony se automaticky kopírují do www/hdmi_switch.
Co je důležité
- Vláknová bezpečnost: threading.Lock a samostatná vlákna pro sériový port
- Entity: 4 media_player s select_source a entity_picture
- Protokol: cir{hex} pro přepínání, s{zóna}{vstup} pro stav
- Závislosti: pyserial>=3.5
- Instalace: custom_components bez HACS
— Editorial Team
Zatím žádné komentáře.