使用 Home Assistant 控制 Logitech Unifying 频道

前言

自入手 MX Master 2S 起就对罗技的 Unifying 优联系列颇为钟爱,后来也把键盘换成了魔改 K375s 的 DIY 键盘。优联的 Flow 在双机双屏的情况下频道切换十分自如,但相较而言在双机共用一屏的时候因为手动切换频道的按键在鼠标底部就显得十分不便了。

此时购买带 KVM 的 HDMI 切换器使两台电脑共用一个接收器算是比较简单粗暴的办法,但因为听到不少关于此类切换器可能会在使用中遇到各种Bug迟迟没有下手。

于是我便想,有没有一种方法可以用命令来切换键鼠的频道,从而进一步设定调用规则来实现双机一屏的自动切换呢?想着想着我便找到了这个项目 marcelhoffs/input-switcher。经过 2 天的测试算是得到了一个相对满意的结果,特此记录一下。

准备工作

此脚本的原理大概是利用 hidapitester 直接向特定硬件 ID 的 USB 设备发送一串 16 进制的报文来实现频道切换。具体报文可以通过分析 Linux 下的罗技驱动程序 Solaar 进行推测,原 Repo 只提供了 MX Anywhere 和 MX Keys 的报文,在实际使用中发现并不能兼容我的 MX Master 2S 与 K375s,因此需要自行使用 Solaar 提取。

随便起一个 Ubuntu 虚拟机,桌面环境可以直接从自带的应用中心搜索安装 Solaar。

upload successful

随后打开 Solaar,插上接收器,设备列表中已配对的设备会亮起,此时打开终端,先查询下MX Master 2S

1
solaar -dd config "MX Master 2S" change-host 1 #任意其他频道,此处使用频道1

顺利的话会返回以下信息

1
logitech_receiver.base: (17) <= w[11 01 091A 01000000000000000000000000000000]

根据 marcelhoffs/input-switcher 的说明,可以确认 MX Master 2S 切换至频道 1 时所发送的报文对应到 hidapitester 的格式为 11,01,09,1A,01,00,00。其中 09 对应具体的设备型号,1A 是一个随机数,这里只需要记住这两个数值即可。

同样的办法查询 K375s

1
solaar -dd config "K375s" change-host 1

返回以下信息

1
logitech_receiver.base: (19) <= w[11 03 081D 01000000000000000000000000000000]

记录 081D

配置脚本

下载 marcelhoffs/input-switcher ,分别将对应系统的可执行文件(hdiapitester)与示例脚本放在适当的路径下。

** 1. Windows **

我在 Windows 下使用优联的频道1,希望通过脚本切换到频道2。

编辑 switch_to_2.bat,找到 --send-output 0x10,0x01,0x09,0x1e,0x01,0x00,0x00 字段,其中,开头的 0x10 为固定数值不用变,紧接的 0x01 对应优联配对程序中的设备顺序(通常 0x01 对应键盘, 0x02 对应鼠标,但我这边其实是反过来的,具体可在优联配对程序的高级设置中确认顺序),第三位第四位 0x09,0x1e 对应前面在 Ubuntu 下获取的设备码和随机码, 第五位需要把想要切换的频道号减去 1 (因为频道 1 对应的编号为 0x00 ),因此这里的 0x01 对应频道 2,最后两位固定不变。

在理解报文规律之后,便可以放心将示例中 MX Keys 的命令 替换成适配 K375s 的了:

1
.\hidapitester.exe --vidpid 046D:C52B --usage 0x0001 --usagePage 0xFF00 --open --length 7 --send-output 0x10,0x02,0x08,0x1d,0x01,0x00,0x00

MX Master 2S 也是如此:

1
.\hidapitester.exe --vidpid 046D:C52B --usage 0x0001 --usagePage 0xFF00 --open --length 7 --send-output 0x10,0x01,0x09,0x1a,0x01,0x00,0x00

修改保存后直接执行脚本就可以判断频道切换有没有生效了。

** 2. macOS **

macOS 下的配置基本上大同小异,按照 switch.sh 中的注视直接给变量赋值即可,除了第五位的频道编号要换成相对的数值外其余均可参照 Windows 所使用的命令。

同样,修改保存后执行脚本测试是否生效。

Home Assistant 自动化

在上面的工作全部完成之后,只需要利用 Logi Options 将脚本绑定到按键上就可以一键切换频道了。

当然也可以让 Home Assistant 通过 mqtt 或者 ssh 的方式从后台调用脚本,我原本就十分依赖 HA 来控制 LG C2 的信号源,而现在只需要在切换 HDMI 信号的时候顺带执行前面做好的脚本就可以实现键鼠与显示器的输入源联动了。

Windows 下只要用 HASS.Agent 内建的 Commands 功能就能将脚本打包成实体推送到 HA 服务器了,但 macOS 上似乎就只有 SSH 这条路比较好走了。

除了在设置里启用 SSH, macOS 下还要注意 Ventura 开始默认不再支持 rsa 密钥,于是改用 ed25519。

1
ssh-keygen -t ed25519

另外,部署在 Docker 上的 Home Assistant 除了要映射公私钥之外,还需要确保 kown_host 文件持久化,否则每次重启容器后的第一次连接都会因为安全提示阻止脚本执行。可增加参数 -o UserKnownHostsFile=CUSTOM_PATH/known_hosts 重新指定文件位置。

最后再打包一个 Shell Command 的实例,重启 HA 就可以根据需求调用了。

1
2
3
shell_command:
switch_input:
ssh -i /config/.ssh/id_ed25519 -o UserKnownHostsFile=/config/.ssh/known_hosts USER@HOST_IP "bash ~/switch.sh"

Comments