Volver al inicio

Matriz HDMI en Home Assistant: Integración RS-232

El artículo describe la creación de una integración personalizada de matriz HDMI 4×4 en Home Assistant vía RS-232. Código detallado del coordinator con threading, entidad media_player y protocolo de intercambio. Instrucciones de instalación vía Samba para Raspberry Pi.

Interruptor HDMI DIY para Home Assistant: guía completa
Advertisement 728x90

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.

Google AdInline article slot

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

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.

Google AdInline article slot

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

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

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 plano
  • register_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

Advertisement 728x90

Leer después