☰
FanControl插件开发速通:2接口传感器注入
2026/10/19 1:42:38 网站建设 项目流程

FanControl插件开发速通:2接口传感器注入

【免费下载链接】FanControl.ReleasesThis is the release repository for Fan Control, a highly customizable fan controlling software for Windows.项目地址: https://gitcode.com/GitHub_Trending/fa/FanControl.Releases

开完机,CPU 还温吞着,机箱风扇却已经跟着 38°C 的室温满速转——真正决定要不要降速的,是窗外那 5°C 的室外温度。FanControl 的插件系统正是干这个的:做传感器注入,把 Home Assistant 里的室外温度(或你自制的 USB 温度计)变成风扇曲线能读的信号,风扇控制从此跟着你想跟的量走。

插件能做什么:边界先说清

插件只干两类事:

  • 传感器注入:往主程序的传感器池里加主板没有的温度/转速源,智能家居、外置温度计、AIDA64 读数都算
  • 控制逻辑扩展:自定义调速算法,让转速不只盯着单个温度

反过来说清楚不能做什么:插件改不了主程序本身。曲线匹配、滞后(hysteresis)、多配置切换这些核心逻辑都在闭源主程序里,插件只能递数据,不能改写主程序行为;想换一套完全不同的调度模型,插件系统帮不上忙。

环境速备:三步开工

  1. 从 FanControl.zip 解压出主程序,确认FanControl.exe能正常打开
  2. 装好 .NET 8.0 SDK——插件是 net8.0 类库,编译和运行都靠它
  3. 把主程序装到固定目录并记住路径,安装目录下的Plugins文件夹就是插件的家

🧩 创建第一个天气温度传感器插件

插件本质是个普通类库:主程序启动时扫描Plugins文件夹,把实现了约定接口的程序集加载进来。入口接口是ISensorProvider——用大白话说,就是告诉主程序"我这里有哪些传感器可以读":加载时调Initialize(),要数据时调GetSensors(),退出时调Close()。

public interface ISensorProvider { void Initialize(); IEnumerable<ISensor> GetSensors(); void Close(); }

项目用一条命令起步,目标框架锁死 net8.0:

dotnet new classlib -n MyWeatherPlugin -f net8.0

工程里引用发布包中的FanControl.Plugins.dll(不要复制主程序代码),我们拿"室外温度"当例子——它是最小可用的传感器源,实现器只有十几行:

public class WeatherSensorProvider : ISensorProvider { private WeatherApiClient _client; private TemperatureSensor _sensor; public void Initialize() { _client = new WeatherApiClient("your-api-key"); _sensor = new TemperatureSensor("室外温度", "weather-outdoor"); } public IEnumerable<ISensor> GetSensors() => new[] { _sensor }; public void Close() => _client.Dispose(); }

提供器只是个壳,真正的读值逻辑在传感器对象里。每个ISensor有固定的几个成员:Name和Id负责界面显示与唯一标识,Unit给单位,IsRpm告诉主程序这是温度(false)还是转速(true),Value是当前读数——用后台定时器每几秒轮询一次天气 API 刷新它即可。注意别在读数回调里自己开轮询线程,主程序会按自己的节奏来读Value,你只管把最新值放进去。

自定义风扇曲线:双源加权 S 形策略

传感器注入解决"读什么",曲线解决"读出来之后怎么转"。室外温度单用太粗,CPU 单用在冬天又会反应过度——把两者按权重合起来再套一个 S 形(sigmoid)映射,比一段 if-else 平滑得多:

public class WeightedSigmoidCurve { public string Name => "双源加权曲线"; public byte GetSpeed(float cpuTemp, float gpuTemp) { float t = cpuTemp * 0.6f + gpuTemp * 0.4f; float s = 1f / (1f + Math.Exp(-(t - 50f) / 10f)); return (byte)(20 + s * 80); } }

算法直觉就两句:sigmoid 把加权温度压进 0~1 再拉伸到 20%~100%,低温段反应平缓、避免风扇在低占空比下共振,中温段斜率最陡、负责主力拉升,高温段快速饱和兜底;0.6/0.4 的权重表示"CPU 是主热源、室外温度做修正",换季时只调权重和中心点 50,不用重写逻辑。

部署验证:打包、放置、启动、确认

编译、放置、启动、确认,四步走完就能在传感器列表里看到新成员:

dotnet build -c Release copy bin\Release\net8.0\MyWeatherPlugin.dll <安装目录>\Plugins\

我们确认插件"活过来"的信号就两个:启动后传感器列表出现"室外温度"且读数会动;把它拖到某张控制卡上连好曲线,风扇随之变化。读数不动就先怀疑 API 调用,别急着怀疑插件框架。

🔧 排障速查

现象可能原因处理
插件完全没出现DLL 没放进Plugins目录,或程序集名与项目名对不上核对编译输出的 DLL 文件名与放置路径
加载报错或主程序无反应目标框架不是 net8.0把 csproj 的 TFM 改为 net8.0 重新编译
传感器在列但读数不动API 超时、key 配错先用独立控制台程序验证 API,再回主程序
主程序升级后插件不兼容引用了旧版 FanControl.Plugins用 Updater.exe 升级主程序,经 version.json 核对版本后重编译
分不清插件还是主程序的问题缺少日志定位先看%AppData%\FanControl\logs

生态与许可

社区里已有一批可直接参考的插件,最典型的两条路线是FanControl.HomeAssistant(接入 Philips Hue、HomeKit 这类智能家居温度源)和FanControl.NzxtKraken(控制 LHM 尚未覆盖的 NZXT Kraken 一体水冷泵速)。许可方面注意:主程序本身闭源分发,条款见 LICENSE;插件系统与社区插件都是开源项目,如果你要发布自己的插件,MIT 是个稳妥的选择,并在 README 中注明基于 FanControl 插件系统开发。

🚀 下一步

  • 游戏联动:按 GPU 负载与进程列表动态改曲线权重,挂机安静、游戏拉满
  • 远程控制:给插件加一个 WebSocket 端点,手机 APP 就能下发目标温度
  • 数据源扩容:仿照 GPU-Z、AIDA64 类插件,把主板读不到的热点温度注入曲线

【免费下载链接】FanControl.ReleasesThis is the release repository for Fan Control, a highly customizable fan controlling software for Windows.项目地址: https://gitcode.com/GitHub_Trending/fa/FanControl.Releases

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询