Retour à l'accueil

Matrice HDMI dans Home Assistant : Intégration RS-232

L'article décrit la création d'une intégration personnalisée de matrice HDMI 4×4 dans Home Assistant via RS-232. Code coordinator détaillé avec threading, entité media_player, et protocole d'échange. Instructions d'installation via Samba pour Raspberry Pi.

Commutateur HDMI DIY pour Home Assistant : guide complet
Advertisement 728x90

Intégration d'une matrice HDMI 4×4 dans Home Assistant via RS-232

Un système basé sur une matrice HDMI 4×4 permet de commuter des sources de signal—télévision par câble, lecteurs multimédias, consoles de jeu—entre quatre téléviseurs. L'intégration avec Home Assistant utilise RS-232 pour les commandes et un Coordinateur pour une opération thread-safe avec le port série. Le réseau neuronal Qwen a accéléré le reverse engineering du protocole et le développement du code.

Matériel requis et prérequis

Vous avez besoin d'une matrice 4×4 supportant 4K@60 Hz et RS-232, plus un convertisseur USB-vers-RS232 pour le Raspberry Pi. Le protocole de contrôle a été reverse-engineeré sur la base d'un article sur Habr : les commandes sont en format texte, débit binaire 115200.

Le HDMISwitchCoordinator gère la connexion dans des threads séparés, évitant de bloquer la boucle d'événements de Home Assistant. Il supporte l'initialisation du port, l'envoi de commandes avec threading.Lock, et la lecture en arrière-plan des réponses.

Google AdInline article slot

Protocole de communication

Commandes de commutation : cir + valeur hexadécimale calculée comme 8 × (zone-1) + (entrée-1).

Exemples :

  • Zone 1, entrée 1 : cir 00
  • Zone 2, entrée 3 : cir 11 (0x0A comme 0a)

La commande se termine par \r\n. L'appareil envoie des statuts comme s{zone}{entrée}, par exemple, s13 signifie que la zone 1 est sur l'entrée 3. Le coordinateur analyse ceux-ci et met à jour les entités via des callbacks.

Google AdInline article slot

Entités media_player

Chaque zone obtient sa propre entité media_player :

  • Affiche la source actuelle
  • Permet de sélectionner une entrée depuis une liste
  • Supporte les services media_player.select_source
  • Noms de source personnalisés

Fonctionnalités :

  • Allumer : sélectionne la première source
  • Éteindre : sélectionne une source factice seconde
  • Icônes : entity_picture depuis /config/www/hdmi_switch/img_{n}.png

Structure d'installation

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

Installation via Samba :

  • Configurez le partage Samba dans HA
  • Connectez-vous : \\homeassistant\config
  • Créez la structure, téléversez les fichiers
  • Redémarrez HA

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 = ["Entrée 1", "Entrée 2", "Entrée 3", "Entrée 4"]

Code : __init__.py (Coordinateur)

Classe HDMISwitchCoordinator :

  • _open_serial() : serial.Serial(port, baudrate=115200, timeout=0.5, 8N1)
  • start() : threading pour _initialize_and_listen
  • _listen_loop() : lecture en arrière-plan
  • register_listener(zone_id, callback)

Le code complet assure la sécurité des threads et l'asynchronicité.

Configuration dans configuration.yaml

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

Après redémarrage, les entités sont disponibles dans l'interface. Les icônes sont automatiquement copiées vers www/hdmi_switch.

Points clés

  • Sécurité des threads : threading.Lock et threads séparés pour le série
  • Entités : 4 entités media_player avec select_source et entity_picture
  • Protocole : cir{hex} pour la commutation, s{zone}{entrée} pour le statut
  • Dépendances : pyserial>=3.5
  • Installation : custom_components sans HACS

— Editorial Team

Advertisement 728x90

Lire ensuite