Skip to main content

Fan control daemon for TrueNAS SCALE with Netdata metrics

Project description

truefan

Fan control daemon for TrueNAS SCALE systems on Supermicro X11 boards. Takes over fan control from the BMC so you can tune noise vs. cooling to your environment. Reads temperatures from IPMI, SMART, NVMe, and lm-sensors, then sets fan duty cycles via IPMI raw commands. Metrics go to Netdata via statsd.

Features

  • Auto-detection of sensors and fans — classifies by type (cpu, drive, nvme, ambient, other) and applies per-class interpolation curves.
  • Self-calibrating — learns each fan's setpoint table by ramping duty down and recording RPMs. Can be recalibrated as fans age or collect dust.
  • Failsafe — fans go to 100% on crash, total sensor class failure, or stalled fan. The watchdog parent restarts the daemon automatically.
  • Config validation — startup, reload, and the check command validate config syntax, values, and hardware match before touching any fans.
  • Syslog logging — the daemon logs to syslog; truefan logs wraps journalctl for easy access.
  • Netdata metrics — per-sensor temperature and thermal load, per-zone duty, per-fan target RPM, daemon uptime, and restart count via statsd. Optional alert configs included.

Requirements

  • Python 3.11+
  • ipmitool
  • smartctl (smartmontools) — for SATA/SAS drive temps
  • nvme-cli — for NVMe temps
  • lm-sensors — for kernel-exposed sensors
  • Supermicro X11 motherboard with IPMI

Install

TrueNAS SCALE doesn't ship ensurepip, so create the venv without it and bootstrap pip manually:

python3 -m venv --without-pip /mnt/pool1/venvs/truefan
source /mnt/pool1/venvs/truefan/bin/activate
curl -sS https://bootstrap.pypa.io/get-pip.py | python3
pip install truefan

Put the venv on a pool — the boot drive is wiped on OS updates.

Quick start

# Detect sensors, calibrate fans, write config
# (ramps fans up and down for a few minutes)
sudo truefan init

# Start the daemon (daemonizes and returns immediately)
sudo truefan start

# Check if it's running
truefan status

# Show detected sensors and current readings
truefan sensors

# Follow daemon logs
truefan logs -f

# Reload config without restarting
sudo truefan reload

# Re-calibrate after cleaning or replacing fans
sudo truefan recalibrate

# Stop the daemon
sudo truefan stop

To get Netdata dashboards and alerts, install the bundled configs:

sudo ./netdata/setup.sh install

Use sudo ./netdata/setup.sh uninstall to remove them. See ./netdata/setup.sh --help for details.

Configuration

truefan init generates a truefan.toml with sensible defaults. Example:

poll_interval_seconds = 15
spindown_window_seconds = 180

[thermal.class.drive]
no_cooling_temp = 30
max_cooling_temp = 45
fan_zones = ["peripheral"]

# Per-sensor overrides for components that run hotter than their class
[thermal.sensor.lmsensors_mlx5_pci_0200_sensor0]
no_cooling_temp = 60
max_cooling_temp = 95

# Learned via calibration — duty % = expected RPM
[fans.FAN1]
zone = "cpu"

[fans.FAN1.setpoints]
25 = 320
30 = 450
40 = 620
50 = 780
100 = 1500

Use --config PATH with any command to specify an alternate config location.

Running on boot

TrueNAS SCALE's Init/Shutdown Scripts (under System > Advanced) run commands at boot and shutdown.

Add a script (Type: Command, When: Post Init):

/mnt/pool1/venvs/truefan/bin/truefan start

No tmux or nohup needed — start forks into the background on its own. Use truefan logs -f to follow output and truefan status to check if it's running.

How it works

Each sensor class has a temperature-to-duty curve. Between no_cooling_temp and max_cooling_temp, duty is linearly interpolated from 0% to 100%; hardware-reported thermal limits override max_cooling_temp when available. The hottest sensor in each fan zone sets the duty, which is then snapped to the nearest calibrated fan setpoint. A spindown window prevents rapid cycling.

If a fan stalls, the zone goes to 100% and the lowest setpoint is removed so the minimum duty rises going forward.

Send SIGUSR1 to dump current sensor readings, thermal loads, and zone duties to syslog (kill -USR1 $(cat /var/run/truefan.pid); view with truefan logs).

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

truefan-1.2.2.tar.gz (74.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

truefan-1.2.2-py3-none-any.whl (38.3 kB view details)

Uploaded Python 3

File details

Details for the file truefan-1.2.2.tar.gz.

File metadata

  • Download URL: truefan-1.2.2.tar.gz
  • Upload date:
  • Size: 74.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for truefan-1.2.2.tar.gz
Algorithm Hash digest
SHA256 97cc6e230f56ce8454e6cc4d13772baa5708e9ee635a71c05b44ef7f180ec746
MD5 e6d17b26633c2532f39c81c7bf238369
BLAKE2b-256 d31f44c6b238712545b8ac8a3b571548b651609752eefa15223bf5d0d8c84fe3

See more details on using hashes here.

Provenance

The following attestation bundles were made for truefan-1.2.2.tar.gz:

Publisher: ci.yml on zvea/truefan

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file truefan-1.2.2-py3-none-any.whl.

File metadata

  • Download URL: truefan-1.2.2-py3-none-any.whl
  • Upload date:
  • Size: 38.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for truefan-1.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ccd6c7ef8cabcfde12819a3fe9fa15ed794049e3c7c07a50d1ab5c6f9ea63f14
MD5 d9a99d310b8fcd4509c9ef630a40996d
BLAKE2b-256 530eddff511206162da65f2a167f53002cd2de6119ae52b0b73b0c9dbee6393e

See more details on using hashes here.

Provenance

The following attestation bundles were made for truefan-1.2.2-py3-none-any.whl:

Publisher: ci.yml on zvea/truefan

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page