Dell SC200
fan control & monitoring.

Control enclosure fans from Linux using temperature curves. Manage multiple enclosures with one daemon, discover serial devices, and monitor cooling in Grafana.

Install sc200

curl -fsSL https://sc200.merkulov.me/install.sh | sudo bash

Linux amd64 or arm64 with systemd. Requires curl, GNU tar, sha256sum, and standard account-management tools.

Read the installer · Download releases

Prometheus metrics. Grafana dashboard.

Track sensor temperatures, measured fan RPM, requested fan speeds, telemetry freshness, and fallback status per enclosure. Scrape /metrics on port 9700 and import the included dashboard.

Grafana dashboard showing healthy enclosure status, fresh telemetry, sensor temperatures, measured fan speeds, fan control percentages, and fallback status.
Get the Grafana dashboard · Monitoring setup

Discover your enclosures

Interactive setup finds supported enclosures and writes their serial paths and sensor indices. To preview configuration for a known port, stop the daemon and run:

sudo sc200 discover --port /dev/ttyS0 --profile safe

Add --write to save new devices. Existing enclosure settings are preserved. Prefer stable /dev/serial/by-id/… paths when available.

Choose a starting profile

Safe and Quiet fan curves Temperature in degrees Celsius versus requested fan speed. Safe: 25 degrees at 20 percent, 30 at 30, 35 at 50, 40 at 75, 45 at 100. Quiet: 25 and 30 degrees at 10 percent, 35 at 12, 40 at 15, 41 through below 45 at 20. At 45 degrees and above, both profiles request 100 percent, shown through 50 degrees in the shaded critical range. Fallback speeds are separate from these curves. Fan speed (%)≥45°C: both at 100% 100806040200 25°C30°C35°C40°C45°C50°C
SafeQuietShaded range: both profiles at 100%
Safe
The default: a 20% minimum, a curve from 20% at 25°C to 100% at 45°C, and 100% fallback speed.
Quiet
A 10% minimum, a curve from 10% at 25°C to 20% at 45°C, and 15% fallback speed. Select with --profile quiet.

Both profiles request 100% at the 45°C critical threshold. Profiles generate editable YAML for new devices; tune the values and verify temperatures under sustained load.

Configuration

Edit /etc/sc200/config.yaml and restart the service to apply changes. Defaults below match the Safe profile; Quiet changes min_speed, safe_speed, and curve. In YAML, temperatures and percentages are numbers without unit suffixes; durations use strings such as 10s.

Global settings
FieldDefaultPurpose
dry_runfalseRead telemetry and log control decisions without writing fan speeds.
http.listen127.0.0.1:9700Bind address for Prometheus metrics and health endpoints. Keep loopback unless network access is restricted; endpoints have no authentication.
shutdown_timeout5sCleanup deadline supplied to the HTTP server and service manager; serial cleanup can take longer.
enclosuresRequiredList of independently controlled enclosures. At least one must be enabled.
Per-enclosure settings · under enclosures[]
FieldDefaultPurpose
idRequiredUnique enclosure identifier used in logs, health responses, and metric labels.
enabledtrueEnable control for this enclosure. Disabled entries are still validated.
portRequiredAbsolute serial-device path. Prefer a stable /dev/serial/by-id/… path.
baud38400Serial baud rate; must match the enclosure console.
poll_interval10sNormal delay between telemetry and control iterations.
command_timeout2sTime budget for a serial operation. Must be shorter than poll_interval.
stale_after30sTelemetry age that triggers fallback and reconnection. Must exceed poll_interval + command_timeout.
refresh_interval30sResend the current fan target after this interval, even if unchanged.
reconnect_min1sInitial retry delay after a connection or control failure.
reconnect_max30sMaximum retry delay; retries double from reconnect_min up to this limit.
recovery_samples3Consecutive valid samples required to recover healthy control. Uses safe_speed during recovery.
min_speed20%Minimum normal fan target. Curve points and safe_speed must be at least this value.
safe_speed100%Fallback requested on startup, recovery, telemetry faults, or control errors when communication permits.
critical_temperature45°CAny installed, available sensor at this threshold requests 100% fan speed, including sensors outside required_sensors.
hysteresis2°CTemperature margin applied when evaluating speed reductions. Increases use the current temperature.
cooldown30sHow long an eligible lower target must stay stable before reducing speed. Increases and emergencies do not wait.
required_sensorsAutoSensor indices used for normal control, taking the hottest reading. If omitted, remembers all initially installed sensors. Discovery writes explicit indices.
curveSafe profileOrdered temperature/speed points, interpolated linearly and rounded up. At least two points; temperatures increase and speeds cannot decrease.
curve[].temperature25, 30, 35, 40, 45°CTemperature at each curve point. Fractional values are allowed.
curve[].speed20, 30, 50, 75, 100%Requested fan percentage at each curve point, from min_speed to 100.

Full configuration reference and validation rules