Skip to content

Fan Control

Plugins can expose fan speed control and temperature reporting to SignalRGB’s Cooling system. When enabled, users can set fan curves, monitor RPM, and view temperature readings directly in SignalRGB.

The general pattern for a plugin that supports fan control is:

  1. Export SupportsFanControl() returning true to tell SignalRGB this device has controllable fans.
  2. Detect which fans are connected (via device-specific commands or RPM polling).
  3. Call device.createFanControl() for each detected fan in Initialize().
  4. Each frame in Render(): read the current RPM from the device and report it with device.setRPM(), then read the desired speed from device.getFanLevel() and apply it to the device.

Always check device.fanControlDisabled() before calling any fan level functions. Fan control may be unavailable because the user doesn’t have SignalRGB Pro, or because the user has disabled it manually.


Exported from the plugin to declare that this device supports fan control. SignalRGB calls this during initialization to decide whether to show the Cooling UI for the device.

export function SupportsFanControl() { return true; }

If this export is absent or returns false, the fan control API is still accessible but the Cooling UI will not appear for the device.


Returns true if fan control is currently unavailable — either because the user doesn’t have SignalRGB Pro, or the user has manually disabled the Cooling system.

Always check this before calling device.getFanLevel() or device.getNormalizedFanLevel().

ReturnTypeDescription
Disabledbooleantrue if the Cooling API is unavailable
if (device.fanControlDisabled()) {
return;
}

Creates a fan controller with the given ID. Call this in Initialize() for each fan the device exposes. If a controller with the given ID already exists, the call is ignored.

ParameterTypeDescriptionExample
FanIdstringUnique identifier for this fan controller"Fan1"
device.createFanControl("Fan1");
device.createFanControl("Fan2");

Removes the fan controller with the given ID. Use this if a fan is no longer detected or the device disconnects.

ParameterTypeDescriptionExample
FanIdstringID of the fan controller to remove"Fan1"

Returns the desired fan speed for the given fan controller as a percentage (0–100), derived from the user’s current fan curve settings.

ParameterTypeDescriptionExample
FanIdstringFan controller ID"Fan1"
ReturnTypeDescriptionExample
FanSpeedintDesired speed, 0–10042
let speed = device.getFanLevel("Fan1"); // e.g. 42 (meaning 42%)

Returns the desired fan speed as a normalized float (0.0–1.0). Useful when the device expects a fractional duty cycle rather than a percentage.

ParameterTypeDescriptionExample
FanIdstringFan controller ID"Fan1"
ReturnTypeDescriptionExample
FanSpeedfloatDesired speed, 0.0–1.00.42
let speed = device.getNormalizedFanLevel("Fan1"); // e.g. 0.42

Reports the current measured RPM for a fan controller. This value is displayed in the Cooling UI and system monitoring graphs.

ParameterTypeDescriptionExample
FanIdstringFan controller ID"Fan1"
RPMintCurrent fan speed in RPM1337
let rpm = ReadRPMFromDevice("Fan1");
device.setRPM("Fan1", rpm);

Plugins can also expose temperature readings to SignalRGB’s Cooling system. These values appear in system monitoring and can be used as the input source for fan curves.

Creates a temperature sensor with the given ID. Call this in Initialize() for each temperature source the device exposes.

ParameterTypeDescriptionExample
SensorIdstringUnique identifier for this sensor"Coolant Temp"
device.createTemperatureSensor("Coolant Temp");

Removes the temperature sensor with the given ID.

ParameterTypeDescriptionExample
SensorIdstringID of the sensor to remove"Coolant Temp"

device.SetTemperature(sensorId, temperature)

Section titled “device.SetTemperature(sensorId, temperature)”

Reports the current temperature for the given sensor. Call this each frame after reading the value from the device.

ParameterTypeDescriptionExample
SensorIdstringSensor ID"Coolant Temp"
TemperaturefloatCurrent temperature in degrees Celsius34.5
let temp = ReadTemperatureFromDevice();
device.SetTemperature("Coolant Temp", temp);

export function SupportsFanControl() { return true; }
export function Initialize() {
device.createFanControl("Fan1");
device.createFanControl("Fan2");
device.createTemperatureSensor("Coolant Temp");
}
export function Render() {
// Report current RPM — required every frame or speed will hardlock
device.setRPM("Fan1", ReadRPM(1));
device.setRPM("Fan2", ReadRPM(2));
// Report current temperature
device.SetTemperature("Coolant Temp", ReadTemp());
// Apply desired speed to hardware
if (!device.fanControlDisabled()) {
SetDeviceFanSpeed(1, device.getFanLevel("Fan1"));
SetDeviceFanSpeed(2, device.getFanLevel("Fan2"));
}
}
export function Shutdown() {
device.removeFanControl("Fan1");
device.removeFanControl("Fan2");
device.removeTemperatureSensor("Coolant Temp");
}