返回首页

Home Assistant 中的 HDMI 矩阵:RS-232 集成

本文描述了通过 RS-232 在 Home Assistant 中创建自定义 4×4 HDMI 矩阵集成。详细的协调器代码,包括 threading、media_player 实体和交换协议。通过 Samba 为 Raspberry Pi 提供的安装说明。

Home Assistant 的 DIY HDMI 开关:完整指南
Advertisement 728x90

通过RS-232将4×4 HDMI矩阵集成到Home Assistant

基于4×4 HDMI矩阵的系统允许您在四台电视之间切换信号源——如有线电视、媒体播放器、游戏机。与Home Assistant的集成使用RS-232发送命令,并通过Coordinator实现串口线程安全操作。Qwen神经网络加速了协议逆向工程和代码开发。

硬件要求与前提条件

您需要一个支持4K@60 Hz和RS-232的4×4矩阵,以及用于树莓派的USB转RS232转换器。控制协议基于一篇Habr文章进行逆向工程:命令为文本格式,波特率115200。

HDMISwitchCoordinator在独立线程中管理连接,避免阻塞Home Assistant事件循环。它支持端口初始化、使用threading.Lock发送命令以及后台读取响应。

Google AdInline article slot

通信协议

切换命令:cir + 十六进制值,计算公式为 8 × (区域-1) + (输入-1)

示例:

  • 区域1,输入1:cir 00
  • 区域2,输入3:cir 11(0x0A表示为0a

命令以\r\n结尾。设备发送状态如s{区域}{输入},例如s13表示区域1在输入3上。Coordinator解析这些状态并通过回调更新实体。

Google AdInline article slot

media_player实体

每个区域都有自己的media_player实体:

  • 显示当前源
  • 允许从列表中选择输入
  • 支持media_player.select_source服务
  • 自定义源名称

功能:

  • 开启:选择第一个源
  • 关闭:选择虚拟的第二个源
  • 图标:entity_picture来自/config/www/hdmi_switch/img_{n}.png

安装结构

文件夹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等
├── www/
│   └── hdmi_switch/
└── configuration.yaml

通过Samba安装:

  • 在HA中设置Samba共享
  • 连接:\\homeassistant\config
  • 创建结构,上传文件
  • 重启HA

代码:manifest.json

{
  "domain": "hdmi_switch",
  "name": "HDMI Switch",
  "version": "1.1.0",
  "requirements": ["pyserial>=3.5"],
  "iot_class": "local_push",
  "config_flow": false
}

代码: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"]

代码:__init__.py(Coordinator)

类HDMISwitchCoordinator:

  • _open_serial():serial.Serial(port, baudrate=115200, timeout=0.5, 8N1)
  • start():线程化用于_initialize_and_listen
  • _listen_loop():后台读取
  • register_listener(zone_id, callback)

完整代码确保线程安全和异步性。

在configuration.yaml中配置

hdmi_switch:
  port: /dev/ttyACM0  # 可选
  command_baudrate: 115200
  timeout: 5.0

重启后,实体在界面中可用。图标自动复制到www/hdmi_switch。

关键要点

  • 线程安全:threading.Lock和独立串口线程
  • 实体:4个media_player实体,支持select_source和entity_picture
  • 协议:cir{hex}用于切换,s{区域}{输入}用于状态
  • 依赖项:pyserial>=3.5
  • 安装:无需HACS的自定义组件

— Editorial Team

Advertisement 728x90

继续阅读