A FanControl plugin for GIGABYTE AORUS WATERFORCE X AIO liquid coolers (X240 / X280 / X360).
Communicates directly with the cooler via USB HID — no GCC, HWInfo, or any third-party software required.
| Device | VID | PID | HID Name |
|---|---|---|---|
| AORUS WATERFORCE X240 | 0x1044 | 0x7A4D | Castor3 |
| AORUS WATERFORCE X280 | 0x1044 | 0x7A4D | Castor3 |
| AORUS WATERFORCE X360 | 0x1044 | 0x7A4D | Castor3 |
| Sensor | Type | Description |
|---|---|---|
| Liquid Temp | Temperature | Coolant temperature (°C) |
| Fan Speed | Fan | Radiator fan RPM |
| Pump Speed | Fan | Pump RPM |
| Fan Control | Control | Fan speed (0–100 % maps to 750–2800 RPM) |
| Pump Control | Control | Pump mode: ≥50 % → Turbo (~2810 RPM), <50 % → Balanced (~2130–2430 RPM, temp-curve) |
Note: The pump has two hardware modes only — Turbo (forced maximum) and Balanced (temperature-driven curve). The 50 % threshold in FanControl maps these two modes to a single slider.
- Download
FanControl.GigabyteWaterforce.dllandHidSharp.dllfrom the latest release. - Copy both files into your FanControl
Pluginsfolder (e.g.C:\Program Files\FanControl\Plugins\). - Restart FanControl.
Run FanControl as Administrator if the device is not detected.
Requirements: .NET 9 SDK
git clone https://github.com/bperucchi/FanControl.GigabyteWaterforce
cd FanControl.GigabyteWaterforce
dotnet build -c ReleaseOutput DLL: bin/Release/net9.0/FanControl.GigabyteWaterforce.dll
Also copy HidSharp.dll from the same output folder into the FanControl Plugins directory.
Protocol reverse-engineered from the Linux kernel driver (drivers/hwmon/gigabyte_waterforce.c) and USB captures of GIGABYTE Control Center (GCC).
Send {0x99, 0xDA, 0x00, ...} via interrupt OUT. The device echoes {0x99, 0xDA, ...} on interrupt IN with sensor data at these offsets:
| Offset | Type | Description |
|---|---|---|
| 0x02 | u16 LE | Fan RPM |
| 0x05 | u16 LE | Pump RPM |
| 0x08 | u8 | Fan duty (0–100 %) |
| 0x09 | u8 | Pump duty (0–100 %) |
| 0x0D | u8 | Liquid temperature — integer part (°C) |
| 0x0E | u8 | Liquid temperature — decimal part (÷10) |
Send a flat RPM curve across 4 temperature points (channel 0x01, 0x01 for fan):
{0x99, 0xE6, 0x01, 0x01, 0x00, RPM_hi, RPM_lo, 0x1E,
RPM_hi, RPM_lo, 0x32, RPM_hi, RPM_lo, 0x41, RPM_hi, RPM_lo, ...}
RPM values are big-endian uint16. Valid range: 750–2799 RPM (sending ≥2800 triggers auto mode).
Three-packet sequence, re-sent every update cycle to hold the mode:
{0x99, 0xE5, 0x01, [mode], 0x00, ...} // mode select
{0x99, 0xE5, 0x02, [param], 0x00, ...} // mode parameter
{0x99, 0xB6, 0x00, ...} // commit
| Mode | Bytes | Result |
|---|---|---|
| Turbo | E5:01:06 + E5:02:04 + B6 |
~2810 RPM (forced maximum) |
| Balanced | E5:01:05 + E5:02:00 + B6 |
~2130–2430 RPM (temperature curve) |
MIT