# Only Fan Controller Configuration idrac: host: "local" # "local" for direct access, or IP address for remote username: "root" # Only needed for remote access password: "calvin" # Only needed for remote access monitoring: interval: 10 # Seconds between temperature checks history_retention: 3600 # Seconds of history to keep (1 hour) gpu: enabled: true nvidia_smi_path: "/usr/bin/nvidia-smi" # Fan control with simple threshold-based logic # - Stay at idle_speed when temps are below thresholds # - Increase fan speed when CPU or GPU exceeds threshold # - Wait cooldown_delay before ramping back down (prevents oscillation) fan_control: min_speed: 5 # Never go below this (%) max_speed: 100 # Never exceed this (%) idle_speed: 20 # Base fan speed when cool (%) cpu_threshold: 65 # Bump fans when CPU exceeds this (°C) gpu_threshold: 60 # Bump fans when GPU exceeds this (°C) step_size: 10 # Fan speed increment per 5°C over threshold (%) cooldown_delay: 60 # Seconds below threshold before ramping down # Critical temperatures force an emergency ramp straight to max_speed, # bypassing step ramping and any manual override. Required, and must be # greater than the (effective) threshold above it — the service refuses to # start otherwise rather than silently falling back to defaults. If you # raise cpu_threshold/gpu_threshold, raise these too. critical_cpu_temp: 85 # Emergency ramp at/above this CPU temp (°C) critical_gpu_temp: 90 # Emergency ramp at/above this GPU temp (°C) # Fail-safe thresholds: after this many consecutive failures, cooling is # handed back to the BMC's automatic fan control until reads/writes succeed # again. See the README's Safety section for the full fail-safe design. sensor_failure_limit: 3 # Consecutive sensor read failures before restoring auto mode write_failure_limit: 3 # Consecutive fan-write failures before restoring auto mode api: # host 0.0.0.0 binds every interface — REQUIRED for container/bridge # networking, but it means the API/dashboard is reachable from every host on # your LAN. The control surface is protected by the token below, NOT by the # bind address. There is no built-in TLS; if you expose this beyond a trusted # LAN, put it behind a reverse proxy (nginx/Caddy/Traefik) that terminates TLS. host: "0.0.0.0" port: 8086 # Bearer token required on mutating endpoints (POST/DELETE /api/override and # /api/hint). Read-only endpoints (/api/status, /api/history, /api/config) and # the dashboard stay open. Env override: API_TOKEN. # # If left empty, mutating endpoints are accepted ONLY from the local host # (loopback) and a warning is logged at startup — convenient for a single-host # setup, but it means no other LAN host can change fan speed. Set a token to # control fans from another machine (and pass it to scripts/hint-client.sh via # the API_TOKEN env var). token: "" dashboard: enabled: true port: 8086 # Same as API (served at /dashboard) storage: path: "/var/lib/only-fan-controller/history.db" # How long history readings are kept before being pruned. Cleanup runs once # at startup and then once a day. Must be > 0. retention_days: 30 # Optional Home Assistant integration over MQTT. Off by default: when disabled # there is zero MQTT activity and no behavior change. When enabled, `broker` is # REQUIRED (the service refuses to start otherwise). There is NO TLS support — # anyone who can publish to the broker can command the fans, so protect it with # broker credentials/ACLs. Publish cadence reuses monitoring.interval above. mqtt: enabled: false # off by default broker: "tcp://192.168.1.10:1883" # required when enabled (tcp://host:port) username: "" # optional broker username password: "" # optional broker password; never exposed via /api/config client_id: "only-fan-controller" # MQTT client id and HA device identifier base_topic: "only-fan-controller" # root for state/command/availability topics discovery_prefix: "homeassistant" # HA MQTT Discovery root # Logs go to stderr; there is no file-logging config. Docker/systemd/your # process supervisor is responsible for capturing and rotating them (e.g. # `docker logs`, or the json-file/local log driver's rotation options).