Zurück zur Startseite

HDMI-Matrix in Home Assistant: RS-232-Integration

Der Artikel beschreibt das Erstellen einer benutzerdefinierten 4×4 HDMI-Matrix-Integration in Home Assistant über RS-232. Detaillierter Coordinator-Code mit Threading, media_player-Entity und Austauschprotokoll. Installationsanweisungen über Samba für Raspberry Pi.

DIY HDMI-Schalter für Home Assistant: vollständiger Leitfaden
Advertisement 728x90

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.

Google AdInline article slot

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 als 0a)

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.

Google AdInline article slot

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/:

Google AdInline article slot
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(): Hintergrundlesen
  • register_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

Advertisement 728x90

Weiterlesen