通过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发送命令以及后台读取响应。
通信协议
切换命令:cir + 十六进制值,计算公式为 8 × (区域-1) + (输入-1)。
示例:
- 区域1,输入1:
cir 00 - 区域2,输入3:
cir 11(0x0A表示为0a)
命令以\r\n结尾。设备发送状态如s{区域}{输入},例如s13表示区域1在输入3上。Coordinator解析这些状态并通过回调更新实体。
media_player实体
每个区域都有自己的media_player实体:
- 显示当前源
- 允许从列表中选择输入
- 支持media_player.select_source服务
- 自定义源名称
功能:
- 开启:选择第一个源
- 关闭:选择虚拟的第二个源
- 图标:entity_picture来自/config/www/hdmi_switch/img_{n}.png
安装结构
文件夹custom_components/hdmi_switch/:
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
暂无评论。