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.
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 comme0a)
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.
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/ :
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-planregister_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
Aucun commentaire pour le moment.