Skip to content

Repository files navigation

Power Center

Power Center 是一款面向 Windows 10/11 与主流 Linux 的笔记本电源、充电和散热管理程序。首批硬件提供者覆盖 Lenovo Legion/LOQ、IdeaPad/Yoga 和 ThinkPad;界面与公共数据模型不依赖厂商品牌,后续可以添加其他厂商提供者。

项目采用 Tauri 2、React、TypeScript 与 Rust。界面以运行时返回的能力描述动态生成控件;没有被操作系统、固件或已安装官方驱动明确报告的功能不会显示,也不会通过机型名称猜测。

当前仓库是可运行的早期实现。通用监控、Linux 公开 sysfs 控制、权限代理、历史数据和动态界面已接通。Windows 高级 Lenovo 控制仍只进行官方驱动/WMI 能力检测,在完成具体接口的真机写入与回读验证前保持只读。83LT / Legion R7000P ADR10 是首个认证候选,而不是仅凭 DMI 型号自动认证。

功能

  • 每秒读取电池、交流电源、温度、风扇、功率估算和性能档位;SQLite 保留最近七天数据。
  • 显示电池健康度、循环次数、预计剩余时间、24 小时趋势以及进程相对功耗估算。
  • 按实际能力提供充电模式、充电起止阈值、平台性能档位、键盘背光、Fn Lock、Always-on USB 与摄像头供电。
  • Linux Lenovo Other Mode 驱动报告有效范围时,可提供 CPU/GPU 温限及 CPU 持续、慢速、快速和交叉负载功率限制。
  • 支持中文和英文、键盘操作、高对比度、减少动画及关闭透明效果。
  • 修改操作进行类型/范围校验、交流电条件校验、写后回读;失败时尝试恢复旧值。
  • 诊断导出会移除序列号、主机名、用户名、主目录及其他不必要的设备标识。

兼容等级

等级 含义
已认证 指定机型与固件版本已经在真机上逐项完成读取、写入、回读和恢复测试
完整兼容 当前系统探测到控制接口,且每项修改能够成功回读,但尚未进入固定认证矩阵
基础兼容 可以读取通用电池和系统状态;部分控制、传感器或厂商驱动不可用
不支持 未找到可安全使用的系统接口;程序只报告原因,不尝试原始硬件访问

“支持大部分联想机器”指主流 Lenovo 笔记本能够安装并读取通用状态;不代表每台机器都具有相同控制项。Legion/LOQ、IdeaPad/Yoga 和 ThinkPad 的固件接口会随系列、代际、BIOS 与驱动变化,最终以应用内能力检测结果为准。

当前范围不包括台式机、Legion Go、固件刷写、原始 EC/MSR 操作、超频/降压和 RGB 灯效。

Linux Lenovo 高级范围

内核 lenovo-wmi-other 通过 firmware_attributes 暴露属性时,应用只识别下列六个固定能力:

  • vendor.lenovo.performance.cpu_temperature_limit
  • vendor.lenovo.performance.gpu_temperature_limit
  • vendor.lenovo.performance.cpu_cross_loading_power_limit
  • vendor.lenovo.performance.cpu_sustained_power_limit
  • vendor.lenovo.performance.cpu_slow_package_power_limit
  • vendor.lenovo.performance.cpu_fast_package_power_limit

每项能力都必须同时具有有效的 current_valuemin_valuemax_valuescalar_incrementtype=integer;缺项、损坏、越界或步长不一致时整项不显示。温限以 °C、功率限制以 W 呈现,实际可选范围始终来自当前固件页。

这些能力初始为“基础兼容”,不会仅因型号或接口存在而自动认证。写入必须连接交流电并先把 platform_profile 切换为 custom;普通用户进程和权限代理都会校验条件,权限代理还会重新读取范围与步长,再执行写入、回读及失败回滚。NVIDIA 偏移、电压、原始 WMI 命令及未列出的属性不在协议中,不能通过 UI 请求。

架构

React UI
  └─ 类型化 Tauri commands / telemetry://snapshot
      └─ ProviderRegistry
          ├─ 通用 Windows / Linux provider
          ├─ Lenovo Windows / Linux provider
          └─ 后续厂商 provider
              └─ 需要提权时:power-center-hwd
                  ├─ Linux system D-Bus + PolicyKit
                  └─ Windows SCM + 本地命名管道

UI 只接收 DeviceProfileSystemSnapshotCapabilityDescriptor,不按机型写分支。提供者负责发现能力和映射公开系统接口;权限代理只接受公共、命名空间化的控制动作,不能接收任意路径、Shell 命令、WMI 查询、注册表键、EC 地址、MSR 或原始固件数值。

权限代理协议

Linux 使用系统总线:

  • bus/interface:org.powercenter.Hardware1
  • object:/org/powercenter/Hardware1
  • ApiVersion() -> u16
  • Health() -> JSON string
  • SupportedCapabilities() -> string[]
  • Apply(action: string, value: string, expectedCurrentValue: string) -> TransactionOutcome JSON
  • Restore(transactionToken: string) -> TransactionOutcome JSON

当前协议版本为 v2。Apply 只接受固定的 org.powercenter.* 动作、枚举/范围内的新值和同类型的必填期望当前值。权限代理在同一事务锁内重新读取端点、比较期望值、写入并回读;比较失败时不写入。成功结果包含语义化的 previousValueappliedValue 和随机 UUID v4 transactionToken

Restore 只接受该令牌,不接受 capability ID。令牌单次使用,内存日志最多保存 64 项并在 15 分钟后过期;恢复前服务还会确认当前值仍等于原事务的 appliedValue,避免覆盖之后的修改。拒绝、接口缺失、过期令牌和回读失败使用明确的 org.powercenter.Hardware1.Error.* D-Bus 错误。每次写入和恢复前,服务都使用 PolicyKit 动作 org.powercenter.hardware.modify 验证调用者。Linux 端只打开编译期白名单中的 kernel ABI 节点。

Windows 服务名为 PowerCenterHardwareService,本地消息管道为 \\.\pipe\PowerCenterHardwareV2。管道拒绝远程客户端,使用显式 ACL、8 KiB 消息上限和版本化 BrokerRequest JSON;apply 请求必须携带类型化的 expectedCurrentValuerestore 请求只能携带事务令牌。解析后仍须通过相同的能力、范围、原子比较和回读检查。未实现或未验证的官方驱动适配返回 not_supported

安装

Windows

正式构建产出每机安装的 NSIS 安装包。安装器将 power-center-hwd.exe 注册为 Windows 服务;卸载或升级前会先停止并注销服务。系统需要 WebView2(Windows 10/11 通常已安装)。高级 Lenovo 功能还需要设备原有的官方 Lenovo System Interface Foundation、Energy Driver 或对应 WMI/BIOS 接口;本项目不会静默下载或捆绑驱动。

服务安装失败时,程序仍可在只读监控模式运行。管理员可使用以下修复脚本:

.\packaging\windows\install-service.ps1 -BrokerPath .\power-center-hwd.exe
.\packaging\windows\uninstall-service.ps1 -BrokerPath .\power-center-hwd.exe

Linux

发行包应安装 packaging/linux/ 中的 systemd、D-Bus 与 PolicyKit 资产。开发构建可手动安装:

npm ci
npm run prepare:sidecar
sudo packaging/linux/install.sh src-tauri/target/release/power-center-hwd
systemctl status power-center-hwd.service

卸载权限代理:

sudo packaging/linux/uninstall.sh

不安装代理时,普通用户仍可继续监控,但生产版 UI 进程不会直接写入 sysfs,即使某个节点意外对当前用户可写也不例外。AppImage 本身不会安装系统服务,因此默认只读;若系统已通过发行包或管理员脚本安装同版本权限代理,AppImage 可复用该服务。

开发

需要 Node.js 22、Rust 1.88 或更高版本,以及 Tauri 2 平台依赖。Fedora 可安装 WebKitGTK 4.1、GTK3、libappindicator、librsvg 等开发包;Windows 构建使用系统 WebView2。

npm ci
npm run dev                 # 浏览器界面
npm run tauri:dev           # Tauri 桌面程序
npm run build
npm test
npm run lint
npm run prepare:sidecar -- --debug  # 干净检出后执行原生 Cargo 检查前准备 sidecar
cargo test --manifest-path src-tauri/Cargo.toml --all-targets --all-features
cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets --all-features -- -D warnings

自动测试使用 fixture 或临时目录,绝不修改真实硬件。真机写入测试必须逐项确认、记录固件/驱动版本,并在每项测试后恢复旧值。

构建安装包:

npm run tauri:build:strict -- --bundles deb,rpm,appimage   # Linux
npm run tauri:build:strict -- --bundles nsis               # Windows

GitHub Actions 在 Ubuntu 与 Windows 上执行 Rust/React 检查和测试,并分别构建 DEB、RPM、AppImage 与 NSIS 工件。

Windows 检查和安装包只以原生 x86_64-pc-windows-msvc 为发布验收工具链;windows-2022 任务会先检查 rustc -Vv 的 host,不匹配即立即失败。Linux 上的 MinGW/GNU 交叉检查不能替代 Windows MSVC 编译、服务生命周期或真机驱动验证。本轮 Windows MSVC 原生验证将在切换到 Windows 环境后继续完成。

添加其他设备厂商

  1. 实现公共 HardwareProvider,在 provider registry 注册,并为厂商提供独立命名空间。
  2. 优先复用通用提供者;只有厂商特有能力才使用 vendor.<厂商>.* 标识。通用动作保持 org.powercenter.*,无需修改 UI 或 Tauri command。
  3. 只从有文档的操作系统、固件或官方驱动接口发现能力;把范围、选项、是否需要交流电/重启/提权和兼容等级放入能力元数据。
  4. 如需提权,在 broker 内新增固定枚举与编译期端点映射。绝不把文件路径、方法名或原始数值开放给 UI。
  5. 添加“正常、接口缺失、驱动缺失、值损坏、权限拒绝、回读不一致和回滚失败”fixture 测试。
  6. 经过独立真机验证后再加入认证矩阵;品牌或型号字符串本身不能提升兼容等级。

安全与隐私

  • 桌面 UI 始终以普通用户运行,只有短生命周期的硬件操作进入权限代理。
  • Linux 使用 systemd、D-Bus 与 PolicyKit;Windows 使用 SCM、系统命名管道和 ACL,不自定义提权机制。
  • 控制请求采用拒绝未知字段的类型化协议,并限制消息大小;日志只记录能力 ID 和错误类别。
  • 写入前保存原值,逐项写入并回读;事务中任一步失败都会逆序恢复已修改项。
  • 不包含第三方 GPL 项目源码,也不复用其私有固件协议实现。

日志与诊断

桌面端与权限代理共用同一套结构化 NDJSON 日志实现。日志按自然日轮转,保留约七天;实现允许“当天活动文件 + 七个已完成日文件”最多八个物理文件,避免轮转清理提前少保留一天。桌面端使用非阻塞文件写入,Linux 权限代理还把同一份已脱敏事件写入标准错误,便于 journald 收集(journald 自身的保留周期由系统管理员配置)。

默认位置:

  • Linux 桌面端:$XDG_DATA_HOME/org.powercenter.desktop/logs,未设置时通常为 ~/.local/share/org.powercenter.desktop/logs
  • Linux 系统权限代理:/var/log/power-center,由 systemd 的 LogsDirectory 创建;普通用户直接运行代理进行开发检查时回退到桌面应用数据下的 broker-logs
  • Windows 桌面端:%LOCALAPPDATA%\org.powercenter.desktop\logs
  • Windows 权限服务:%PROGRAMDATA%\Power Center\Logs;控制台开发启动在系统目录不可用时回退到本地应用数据。

日志不记录控制值、恢复令牌、序列号、用户名、主目录、原始 sysfs 路径或完整底层错误;允许的操作字段限于能力 ID、安全错误类别、结果和耗时。最终写入器会再次递归脱敏结构化键和文本,panic hook 也只输出通用、已脱敏事件。

诊断导出会再次脱敏日志,只收集当前日志前缀对应的最新记录,最多 512 条且编码后总量不超过 256 KiB。诊断包包含格式、保留天数、文件/条目计数和是否截断等元数据,但不包含真实日志目录。并发导出使用同目录唯一临时文件,成功后原子重命名,失败时清理临时文件。

若硬件数据缺失,Power Center 会显示接口缺失或驱动缺失原因,不用伪造值填充界面。进程级功耗在 Windows 与 Linux 上均标注为相对估算,不宣称为精确瓦数。

许可证

Power Center 以 MIT License 发布。第三方依赖仍分别遵循其各自的许可证。

About

Cross-platform, capability-driven laptop power and thermal control center built with Tauri, React, TypeScript, and Rust.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages