Integration einer 4×4 HDMI-Matrix in Home Assistant über RS-232
Ein System mit einer 4×4 HDMI-Matrix ermöglicht es, Signalquellen wie Kabelfernsehen, Mediaplayer und Spielekonsolen zwischen vier Fernsehern umzuschalten. Die Integration in Home Assistant nutzt RS-232 für Befehle und einen Coordinator für thread-sichere Operationen mit dem seriellen Port. Das Qwen-Neuronale Netzwerk beschleunigte die Reverse-Engineering des Protokolls und die Codeentwicklung.
Hardwareanforderungen und Voraussetzungen
Sie benötigen eine 4×4 Matrix, die 4K@60 Hz und RS-232 unterstützt, sowie einen USB-zu-RS232-Konverter für den Raspberry Pi. Das Steuerprotokoll wurde basierend auf einem Artikel auf Habr reverse-engineered: Befehle sind im Textformat, Baudrate 115200.
Der HDMISwitchCoordinator verwaltet die Verbindung in separaten Threads, um die Blockierung des Home Assistant Event-Loops zu vermeiden. Er unterstützt Port-Initialisierung, Senden von Befehlen mit threading.Lock und Hintergrundlesen von Antworten.
Kommunikationsprotokoll
Umschaltbefehle: cir + Hex-Wert berechnet als 8 × (Zone-1) + (Eingang-1).
Beispiele:
- Zone 1, Eingang 1:
cir 00 - Zone 2, Eingang 3:
cir 11(0x0A als0a)
Der Befehl endet mit \r\n. Das Gerät sendet Status wie s{Zone}{Eingang}, z.B. s13 bedeutet Zone 1 ist auf Eingang 3. Der Coordinator analysiert diese und aktualisiert Entitäten über Callbacks.
media_player-Entitäten
Jede Zone erhält ihre eigene media_player-Entität:
- Zeigt die aktuelle Quelle an
- Ermöglicht die Auswahl eines Eingangs aus einer Liste
- Unterstützt media_player.select_source-Dienste
- Benutzerdefinierte Quellennamen
Funktionen:
- Einschalten: wählt die erste Quelle
- Ausschalten: wählt eine Dummy-Zweite Quelle
- Symbole: entity_picture von /config/www/hdmi_switch/img_{n}.png
Installationsstruktur
Ordner custom_components/hdmi_switch/:
config/
├── custom_components/
│ └── hdmi_switch/
│ ├── __init__.py
│ ├── manifest.json
│ ├── const.py
│ ├── media_player.py
│ └── images/ # img_1.png usw.
├── www/
│ └── hdmi_switch/
└── configuration.yaml
Installation über Samba:
- Samba-Freigabe in HA einrichten
- Verbinden:
\\homeassistant\config - Struktur erstellen, Dateien hochladen
- HA neu starten
Code: manifest.json
{
"domain": "hdmi_switch",
"name": "HDMI Switch",
"version": "1.1.0",
"requirements": ["pyserial>=3.5"],
"iot_class": "local_push",
"config_flow": false
}
Code: const.py
DOMAIN = "hdmi_switch"
DEFAULT_NAME = "HDMI Switch"
DEFAULT_PORT = "/dev/ttyACM0"
DEFAULT_COMMAND_BAUDRATE = 115200
DEFAULT_TIMEOUT = 5.0
DEFAULT_SOURCES = ["Eingang 1", "Eingang 2", "Eingang 3", "Eingang 4"]
Code: __init__.py (Coordinator)
Klasse HDMISwitchCoordinator:
_open_serial(): serial.Serial(Port, baudrate=115200, timeout=0.5, 8N1)start(): Threading für _initialize_and_listen_listen_loop(): Hintergrundlesenregister_listener(zone_id, callback)
Der vollständige Code gewährleistet Thread-Sicherheit und Asynchronität.
Konfiguration in configuration.yaml
hdmi_switch:
port: /dev/ttyACM0 # optional
command_baudrate: 115200
timeout: 5.0
Nach dem Neustart sind die Entitäten in der Oberfläche verfügbar. Symbole werden automatisch nach www/hdmi_switch kopiert.
Wichtige Punkte
- Thread-Sicherheit: threading.Lock und separate Threads für serielle Kommunikation
- Entitäten: 4 media_player-Entitäten mit select_source und entity_picture
- Protokoll: cir{hex} zum Umschalten, s{Zone}{Eingang} für Status
- Abhängigkeiten: pyserial>=3.5
- Installation: custom_components ohne HACS
— Editorial Team
Noch keine Kommentare.