[daemon] # Default: /run/afancontrol.pid pidfile = /run/afancontrol.pid # Default: (empty value) logfile = /var/log/afancontrol.log # The ticks interval in seconds. Tick is a single operation of retrieving # temperature values from the sensors and setting the computed fan speeds. # Default: 5 interval = 5 # Hddtemp location. Used by the `type = hdd` temperature sensors. # Default: hddtemp ;hddtemp = /usr/local/bin/hddtemp # `ipmi-sensors` location from the `freeipmi-tools` package. # Used by the `type = freeipmi` fans. # Default: ipmi-sensors ;ipmi_sensors = /usr/local/bin/ipmi-sensors # Prometheus exporter listening hostname and TCP port. # Default: (empty value) ;exporter_listen_host = 127.0.0.1:8083 [actions] # Temperature sensors have 2 limits: `threshold` and `panic` temperature. # When any of the sensors reach their `threshold` value, the `threshold` mode # is activated. Same for the `panic` mode. # # When any of the 2 modes is activated, all of the available fans would start # working at full speed. # # In the default configuration there's no difference between the two modes. # But it is possible to call different shell commands for each mode, which # would allow to make different things. For example, in `threshold` mode # you could stop some services which produce significant load, and in `panic` # mode you could stop even more (if that didn't help to lower the temperatures). # Shell command which will be used to report important events. # %REASON% will be replaced with report reason, %MESSAGE% with report message # Examples: # printf "Reason: %s\nMessage: %s" "%REASON%" "%MESSAGE%" | wall # kdialog --title "afancontrol report" --error "Reason: %REASON%\nMessage: %MESSAGE%" # Default: printf "Subject: %s\nTo: %s\n\n%b" "afancontrol daemon report: %REASON%" root "%MESSAGE%" | sendmail -t ;report_cmd = # Global panic enter shell command # Default: (empty value) ;panic_enter_cmd = # Global panic leave shell command # Default: (empty value) ;panic_leave_cmd = # Global threshold enter shell command # Default: (empty value) ;threshold_enter_cmd = # Global threshold leave shell command # Default: (empty value) ;threshold_leave_cmd = # `[filter:name]` - define a temperature filter. The `name` must be unique. [filter: moving_median_p3] # Temperature filters can be used to smoothen the observations to avoid # rapid fan speed changes. # # Filter type. # Possible values: # `moving_median`: A moving median filter. Useful to ignore inadequately # large individual measurements from unstable sensors. # Recommended `window_size` is 3 or 5, because with a too # large window size a sudden increase in temperature might # not get a timely fan speed reaction. # `moving_quantile`: A moving quantile filter. Useful to amplify high # temperatures to make smoother reaction while being # extra cautious (i.e. tending to assume that # the actual temperature is higher than the one which # is being reported). Recommended `window_size` is 10, # `quantile` is 0.8 or 0.9. It is also possible to invert # the reaction speed: to make it react slower just use a lower # quantile value (such as 0.3). type = moving_median # Number of observations kept in the moving window. # Default: 3. window_size = 3 # Quantile value for the `moving_quantile` filter, mandatory. ;quantile=0.8 # [temp:name] - is a temperature sensor section. The `name` must be unique. [temp:mobo] # Type of the sensor. # Possible values: # `file`: Read files like /sys/class/hwmon/hwmon0/device/temp1_input. # These files contain temperature in Celsius multiplied by 1000. # `hdd`: Query temperatures from HDD using `hddtemp`. If multiple drives # are specified (with a glob pattern), the sensor would report # the maximum temperature among all matched devices. # `exec`: Shell command which will return temperature in Celsius # (which might be float). Output might also contain # the `min` and `max` temperatures separated by a newline. # This field is mandatory. type = file # Shell command which will return a temperature. # Mandatory for the `type = exec`. ;command = nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits -i 0 ;command = nvme smart-log /dev/nvme0 | grep "^temperature" | grep -oP '[0-9]+' ;command = iStats cpu temp --value-only # When `type = file`: this is the path to the file. The path might be a glob pattern, # but it must expand to a single file. # When `type = hdd`: this is the path to the target device (might be a glob pattern) # Mandatory when `type` equals to `file` or `hdd`. path = /sys/class/hwmon/hwmon0/device/temp1_input ;path = /sys/devices/pci0000:00/0000:00:01.3/0000:03:00.2/0000:20:08.0/0000:2a:00.0/hwmon/hwmon*/temp1_input ;path = /dev/sd? # Name of the temperature filter. # Optional, unfiltered observations will be used if not specified. filter = moving_median_p3 # Temperature at which a fan should be running at minimum speed # Must be set for `hdd`. Can be detected automatically for `file` # and `exec` (but not always). min = 30 # Temperature at which a fan should be running at full speed # Must be set for `hdd`. Can be detected automatically for `file` # and `exec` (but not always). max = 40 # Temperature at which this sensor will enter the panic mode # Default: (empty value) ;panic = # Temperature at which this sensor will enter the threshold mode # Default: (empty value) ;threshold = # Sensor panic enter shell command # Default: None ;panic_enter_cmd = # Sensor panic leave shell command # Default: None ;panic_leave_cmd = # Sensor threshold enter shell command # Default: None ;threshold_enter_cmd = # Sensor threshold leave shell command # Default: None ;threshold_leave_cmd = [readonly_fan: cpu] # A readonly fan: i.e. just read RPM and never attempt to control it. # Useful for exposing a CPU fan speed in metrics. # # The properties are the same as in `[fan: ...]`. Both sections share # the same namespace, which means that a single fan name can be used # only in one of the sections. type = linux fan_input = /sys/class/hwmon/hwmon0/device/fan1_input # [fan:name] - is a PWM fan section. The `name` must be unique. [fan: hdd] # Type of the fan. # Possible values: # `linux`: The default fan type. This is a fan connected to # the motherboard using a 4-pin connector and exposed by lm-sensors # as a file like `/sys/class/hwmon/hwmon0/device/pwm2`. # `arduino`: A PWM fan connected via an Arduino board. # `freeipmi`: A PWM fan exposed via IPMI. Requires `freeipmi-tools` package. # Currently supported only in the `[readonly_fan: ...]` sections. # Default: linux type = linux # Path to the PWM file of the fan. # Mandatory when `type = linux`, optional in `[readonly_fan: ...]` sections. pwm = /sys/class/hwmon/hwmon0/device/pwm2 # Path to the RPM file of the fan. # Mandatory when `type = linux`. fan_input = /sys/class/hwmon/hwmon0/device/fan2_input # Arduino board name as described by an `[arduino: name]` section. # Mandatory when `type = arduino`. ;arduino_name = mymicro # The pin of the Arduino board where the PWM wire is connected to # (usually the blue one). # Mandatory when `type = arduino`, optional in `[readonly_fan: ...]` sections. ;pwm_pin = 9 # The pin of the Arduino board where the Tachometer wire is connected to # (usually the yellow one). # Mandatory when `type = arduino`. ;tacho_pin = 3 # The name of the fan as reported by the `ipmi-sensors --sensor-types Fan` command. # Mandatory when `type = freeipmi`. ;name = FAN1 # Some fans have almost linear correlation between PWM and RPM, some haven't. # `pwm_line_start` is the PWM value where the linear correlation starts, # `pwm_line_end` is where it ends. # You can use the `afancontrol fantest` command to run a test which would # allow you to find out these values your your specific fans. # # Default: 100. Must not be set in the `[readonly_fan: ...]` sections. pwm_line_start = 100 # Default 240. Must not be set in the `[readonly_fan: ...]` sections. pwm_line_end = 240 # Should the fan be stopped on speed 0% or not. If not, it would be running # with the `pwm_line_start` PWM value. # Default: yes. Must not be set in the `[readonly_fan: ...]` sections. never_stop = no # [arduino:name] - a section describing an Arduino board with PWM fans connected to it. ;[arduino: mymicro] # The Serial interface url. # Mandatory. ;serial_url = /dev/ttyACM0 # The Serial interface Baudrate. # Default: 115200 ;baudrate = 115200 # The Status command timeout in seconds. The board periodically sends # a Status command -- the current RPM and PWM values. When the status # haven't been received for that amount of time, the corresponding fans # would be considered failing. # Default: 5 ;status_ttl = 5 # Relationships between fans and temps [mapping:1] # Comma-separated list of fans for this mapping. Fan names might be # multiplied by float, e.g. `name * 0.55`. This means that the speed # for that fan will be just 55% when the specified temperatures would be # at their `max` value. # # You may want to apply a multiplier if the fan is far from # the corresponding temperature sensors. # # Multiple mappings can be specified, each temp and fan might be used # in different mappings multiple times. # # Readonly fans cannot be used in mappings. # # The resulting fan speed would be the maximum value calculated along # all mappings. # Comma-separated list of fans with modifiers. # Example: `fans = myfan, myfan2 * 0.6, myfan3`. # Mandatory. fans = hdd*0.6 # Comma-separated list of temp sensors. # Mandatory. temps = mobo