ASUS ROG Flow Z13 RGB 键盘控制,不需要 Armoury Crate

发布日期
2026年7月11日
作者
Jacob Lloyd —— 项目完成后,在 AI 协助下撰写
阅读时长
约 8 分钟阅读

简单来说: 我自己写的免费软件,用来控制 ASUS 笔记本上会发光的键盘,填补了 Linux 下官方应用完全缺席的空白。你可以从命令行、桌面应用或者一个网页来改颜色——而且颜色真的能扛过睡眠、重启,以及把键盘拔下来再插回去。它补上了厂商留下的一个空缺。

我的 ASUS ROG Flow Z13 有两个 RGB 分区——键盘,还有平板边缘的一条灯条——而 Linux 对这两者的原生支持,基本就是"祝你好运"。这个世界里根本没有 Armoury Crate。所以我自己写了一套:一个 CLI、一个 GTK4 应用,还有一个直接跟硬件对话的浏览器面板,外加没人愿意费心做的那部分——让颜色能扛过休眠、重启,以及把键盘从平板上拔下来。

tl;dr

  • 这是什么:为 Z13 的键盘+灯条写的 Aura HID 驱动,带 CLI、GTK4 GUI、浏览器面板、一个空闲守护进程,还有一个每次按键都换新颜色的派对模式。
  • 费用:免费。整个 zip 大约 40 KB——Python 标准库加上零依赖的 Node
  • 需要什么:一台跑 Linux 的 ROG Flow Z13(2025 款 GZ302),以及安装用的五分钟。
  • 最终得到什么:合上盖子、重启,或者把键盘从平板上撕下来再插回去之后,颜色依然还在那儿。

最终得到什么

下面是浏览器面板干活的样子:

浏览器里的 rgb-web 控制面板:键盘和灯条两张分区卡片,都显示 ON、亮度 3/3,一排预设颜色,以及 All On / All Off 按钮
两个分区都已连接,顶部一排预设色,开会前一个按钮就能把灯全关掉。
同一个 rgb-web 面板在手机宽度下的样子,卡片叠成单列
同一个页面,宽度 390px。没为移动端做任何特殊处理——就是一个不跟窄屏幕较劲的页面而已。

老实说一句:上面两个分区显示的都是白色(#ffffff)。这不是 bug。我是从一个状态文件为空的沙盒实例里截的图,而 Aura 协议根本没法被问"你现在是什么颜色"。工具最后一次写入的颜色,就是唯一存在的真相——而这恰恰就是这整个项目要解决的设计难题。详见下文。

换颜色的四个入口

后端是同一个,前门有四扇:

接口命令 / 访问方式最适合
CLIrgb set all '#00ddcc'脚本、肌肉记忆、SSH 远程
GTK4 GUIrgb-gui带滑块的正经取色器,不用碰终端
网页面板http://127.0.0.1:3003同一张桌子上的手机,不用装任何应用
派对模式rgb-reactive.py每次按键换个随机新颜色,纯粹好玩
# the CLI in one breath
rgb list                       # what zones exist, current known state
rgb set all '#00ddcc'          # set every zone to teal
rgb brightness keyboard 2      # 0-3
rgb on / rgb off               # per-zone or all
rgb restore                    # reapply the last saved color (what the restore service runs)

GUI 把同样的操作包进了每个分区各自的取色对话框、亮度滑块、九个预设色块,以及一个能把一次改动同步应用到所有分区的开关。网页面板是同样的思路搬到一个标签页里:取色器、hex 输入框、亮度滑块、关闭开关、预设色一排,还有 All On / All Off。

Aura HID 协议

键盘(USB 0b05:1a30)和灯条(USB 0b05:18c6)这两个分区,说的都是 g-helper 和 z13ctl 项目最先逆向出来的 Aura HID 协议。官方没有任何文档,都是有心人盯着 USB 抓包一点点摸出来的,这个工具是站在他们的成果上接着做,而不是从头再来一遍。

底层机制简单得几乎有点不讲道理:

  • 64 字节的输出报文,report ID 是 0x5D,零填充。
  • SetMode 包:5d b3 <zone> <mode> <r> <g> <b> <speed>——模式 0x00 是静态颜色,这个工具只用这一种。
  • 接着用一个 Save 包(5d b5)和一个 Apply 包(5d b4)来提交。
  • 分区字节:0x00 是键盘,0x01 是灯条。两个 hidraw 节点都藏在一个 USB 多路复用的"N-KEY Device"背后,各自会安静地忽略发给另一个分区的包——所以同样的三包写入序列,发到哪个节点上都管用。

支配这里每一个设计决定的事实是:这个协议只能写,不能读。你可以设置一个颜色,但永远没法把它读回来。所以工具自己留了一份记忆——每一次应用过的颜色和亮度,都落在 ~/.local/state/rgb-control/state.json 里,而记录"这个键盘本该是什么颜色"的,是这份文件,不是硬件本身。恢复服务、空闲守护进程、重新插拔的处理逻辑,存在的目的都是把这份文件重新推给一台老是失忆的硬件。

设备探测会遍历 /sys/class/hidraw,匹配 vendor/product ID,然后确认该节点的 report descriptor 里确实存在 report ID 0x5D,才会信任它。还有一个后备后端:内核的 asus-wmi 驱动在 /sys/class/leds/asus-*:rgb:* 暴露了一个多彩 LED 类,带 multi_intensitybrightness 文件。写入这活儿,能用 hidraw 就用 hidraw;初始状态则由 sysfs 提供,因为跟 HID 不一样,它是能被读出来的。

一次点击是怎么变成一个颜色的

从点击到 LED 的完整路径:

扛过休眠与重新插拔

我在 Linux 上找到的每一个 RGB 工具都能设置一个颜色。但没有一个能在下一次休眠、重启,或者——因为 Z13 的键盘是可拆卸的——下一次重新插拔之后还记得它。这几种情况每次都会把硬件重置成一片漆黑,而只写不读的协议意味着它根本不知道自己刚才显示的是什么。要解决这个问题,答案只能放在硬件之外:

这大约 6 秒的重试预算是有讲究的:刚插上的键盘需要一点时间才会出现在总线上,udev 在枚举过程中会连续触发一串事件。恢复单元会先睡 1 秒,等这波事件消停下来,然后重试发现,而不是第一次没找到就放弃。

还有一个空闲守护进程 rgb-idled,只在 GNOME/Wayland 下生效,因为它监听的是两个特定的 D-Bus 信号:org.gnome.ScreenSaver ActiveChanged(锁屏 → 调暗到亮度 1)和 org.gnome.Mutter.IdleMonitor WatchFired(GNOME 用来熄灭屏幕的同一个空闲时钟 → 熄灯)。解锁之后它会从 state.json 恢复。我个人特别喜欢的一个细节:调暗和熄灭走的都是 persist=False 路径,所以这些临时状态永远不会覆盖你保存好的颜色。醒来之后看到的是你自己选的那个颜色,而不是守护进程最后做的那件事。

安装设置

不装东西,先快速测一下:

cd rgb-control
./rgb-cli list
./rgb-cli set all '#00ddcc'

完整安装会配好 udev 规则、rgb-restore.service、sleep 钩子、一条 tmpfiles 规则、一个 ~/.local/bin/rgb 符号链接、一个桌面入口,以及 rgb-idled 用户服务:

cd rgb-control
sudo ./install.sh

安装脚本里的路径都是模板化的(__RGB_DIR____RGB_STATE__),会在安装时填好,所以不管你把 zip 解压到哪里都能用。网页面板是单独的、可选的一步:

cd rgb-web
node server.js
# → http://127.0.0.1:3003
# PORT= and RGB_CLI= env vars override the defaults

它还支持 systemd 的套接字激活——第一个请求打过来之前不占任何资源,空闲 10 分钟后自动退出。而派对模式——每次按键都换一个随机新颜色——只差一条命令:./rgb-toggle.sh start(会向你要 sudo 权限)。

踩过的坑

  • 严格一点的发行版上的权限问题。在 Fedora/Bazzite 上,/dev/hidraw* 开箱即可被任何人写入,所以直接就能用。其他发行版通常需要一条 udev 的 uaccess 规则(设置指南里有示例)。这是"毫无反应"这类问题的头号原因。
  • sysfs 的 LED 节点是 root 拥有的。附带的 udev 规则会把它们 chgrpwheel 组。不在这个组里?把自己加进去,或者改一下规则。
  • LED 节点名带有一个跟机器相关的后缀。类似 asus-0003:0B05:18C6.0008 这样,末尾那个数字在不同机器上可能不一样。如果后备后端什么都没找到,检查一下 ls /sys/class/leds,再相应调整配置。
  • rpm-ostree 机器(Bazzite、Silverblue)的 /usr 是只读的。安装脚本特意把 sleep 钩子放在 /etc 下。别"好心"把它改回去。
  • rgb-idled 只在 GNOME 上会真正起作用。在 KDE 或裸 X11 上,它能正常启动,但永远不会做任何事。这是预期行为,不是坏了。
  • 网页面板没有登录,这是故意的。它只绑定 127.0.0.1,因为它会在没有任何鉴权的情况下直接 shell 调用硬件控制。服务器代码里写得很明白:没加认证之前,别绑定 0.0.0.0。静态文件有路径穿越防护,但防护不等于登录。
  • 重新插拔会跟自己抢一下跑。一次物理上的重新插拔,可能会触发好几个 udev 事件;恢复流程会短暂睡一下把它们合并处理,所以灯光可能会晚半拍才亮回来。那是合并窗口在起作用,不是卡顿。

下载

仅限个人使用免费。如果它替你省下了一下午的时间,欢迎点旁边的咖啡按钮支持一下。


← 更多工具与下载