fancontrol - automated software based fan speed regulation


Introduction

fancontrol is a shellscript for use with lm_sensors. It reads its configuration from a file, then calculates fan speeds from temperatures and sets the corresponding pwm outputs to the computed values.
It is included in lm_sensors since 2.8.0, the latest version is always available through CVS or at http://www.hdev.de/fancontrol/
For easy configuration, there's a script named pwmconfig which lets you interactively write your configuration file for fancontrol. Alternatively you can write this file yourself using the information from the configuration section of this document.

Please be careful when using the fan control features of your mainboard, in addition to the risk of burning your CPU, at higher temperatures there will be a higher wearout of your other hardware components, too. So if you plan to use these components in 50 years, _maybe_ you shouldn't use fancontrol/your hardware at all.


Configuration

Since most of you are going to use the pwmconfig script, the config file syntax will be discussed last. First I'm going to describe the various variables available for changing fancontrol's behaviour:

INTERVAL
	This variable defines at which interval in seconds the main loop of fancontrol will be executed

FCTEMPS
	Maps pwm outputs to temperature sensors so fancontrol know which temperature sensors should be used for calculation of new values for the corresponding pwm outputs.

MINTEMP
	The temperature at which the fan gets switched off completely.

MAXTEMP
	The temperature at which the fan gets switched to full speed.

MINSTART
	Sets the minimum speed at which the fan begins spinning. You should use a safe value to be sure it works, even when the fan gets old.

MINSTOP
	The minimum speed at which the fan still spins. Use a save value here, too.

If you set up your configuration by hand, be sure to include ALL variables and use valid values, there's no error handling yet! The file format is a bit strange:

VARIABLE=chip/pwmdev=value chip/pwmdev2=value2 [...]
VARIABLE2=[...]

Each variable has its own line. The variable name is followed by an equal sign and the device=value pairs. These consist of the relative path to the pwm output (from /proc/sys/dev/sensors/) for which the value is valid, equal sign followed by the value and are seperated by a blank.

Example:

MINTEMP=w83627hf-isa-0290/pwm2=40 w83627hf-isa-0290/pwm1=54

You have to play with the temperature values a bit to get happy. For initial setup I recommend using the pwmconfig script. Small changes can be made by editing the config file directly following the rules above.


The algorithm

fancontrol first reads its configuration, writes it to arrays and loops its main function.
This function gets the temperatures and fanspeeds from lm_sensors proc files and calculates new speeds depending on temperature changes, but only if the temp is between MINTEMP and MAXTEMP. After that, the new values are written to the pwm outputs.
Currently the speed increases quadratically with rising temperature. This way you can have quite silent idle computer while having full power available at temperatures at which hardware still lives :)


Planned features

smoother regulation
other curve styles
graphical frontend

If you have other wishes or want to contribute something, please let me know:
marius.reiner@hdev.de
