Integración de una matriz HDMI 4×4 en Home Assistant mediante RS-232
Un sistema basado en una matriz HDMI 4×4 permite conmutar fuentes de señal—televisión por cable, reproductores multimedia, consolas de videojuegos—entre cuatro televisores. La integración con Home Assistant utiliza RS-232 para comandos y un Coordinador para operaciones seguras en hilos con el puerto serie. La red neuronal Qwen aceleró la ingeniería inversa del protocolo y el desarrollo del código.
Requisitos de hardware y prerrequisitos
Necesitas una matriz 4×4 compatible con 4K@60 Hz y RS-232, además de un convertidor USB a RS232 para la Raspberry Pi. El protocolo de control se obtuvo mediante ingeniería inversa basada en un artículo de Habr: los comandos están en formato de texto, con velocidad de transmisión de 115200.
El HDMISwitchCoordinator gestiona la conexión en hilos separados, evitando bloquear el bucle de eventos de Home Assistant. Soporta inicialización del puerto, envío de comandos con threading.Lock y lectura en segundo plano de respuestas.
Protocolo de comunicación
Comandos de conmutación: cir + valor hexadecimal calculado como 8 × (zona-1) + (entrada-1).
Ejemplos:
- Zona 1, entrada 1:
cir 00 - Zona 2, entrada 3:
cir 11(0x0A como0a)
El comando termina con \r\n. El dispositivo envía estados como s{zona}{entrada}, por ejemplo, s13 significa que la zona 1 está en la entrada 3. El coordinador analiza estos datos y actualiza las entidades mediante devoluciones de llamada.
Entidades media_player
Cada zona obtiene su propia entidad media_player:
- Muestra la fuente actual
- Permite seleccionar una entrada de una lista
- Soporta servicios media_player.select_source
- Nombres personalizados de fuentes
Características:
- Encender: selecciona la primera fuente
- Apagar: selecciona una segunda fuente ficticia
- Iconos: entity_picture desde /config/www/hdmi_switch/img_{n}.png
Estructura de instalación
Carpeta 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
Instalación mediante Samba:
- Configura el recurso compartido Samba en HA
- Conecta:
\\homeassistant\config - Crea la estructura, sube los archivos
- Reinicia HA
Código: manifest.json
{
"domain": "hdmi_switch",
"name": "HDMI Switch",
"version": "1.1.0",
"requirements": ["pyserial>=3.5"],
"iot_class": "local_push",
"config_flow": false
}
Código: const.py
DOMAIN = "hdmi_switch"
DEFAULT_NAME = "HDMI Switch"
DEFAULT_PORT = "/dev/ttyACM0"
DEFAULT_COMMAND_BAUDRATE = 115200
DEFAULT_TIMEOUT = 5.0
DEFAULT_SOURCES = ["Input 1", "Input 2", "Input 3", "Input 4"]
Código: __init__.py (Coordinador)
Clase HDMISwitchCoordinator:
_open_serial(): serial.Serial(port, baudrate=115200, timeout=0.5, 8N1)start(): threading para _initialize_and_listen_listen_loop(): lectura en segundo planoregister_listener(zone_id, callback)
El código completo garantiza seguridad en hilos y asincronía.
Configuración en configuration.yaml
hdmi_switch:
port: /dev/ttyACM0 # opcional
command_baudrate: 115200
timeout: 5.0
Después de reiniciar, las entidades están disponibles en la interfaz. Los iconos se copian automáticamente a www/hdmi_switch.
Puntos clave
- Seguridad en hilos: threading.Lock e hilos separados para serie
- Entidades: 4 entidades media_player con select_source y entity_picture
- Protocolo: cir{hex} para conmutación, s{zona}{entrada} para estado
- Dependencias: pyserial>=3.5
- Instalación: custom_components sin HACS
— Editorial Team
Aún no hay comentarios.