Control de ventiladores por temperatura, con el aspecto de Gigabyte Control Center. Windows y Linux comparten
todo el código salvo la capa de hardware (fancontrol/hw_windows.py / fancontrol/hw_linux.py).
Probado en una Gigabyte X570 I AORUS PRO WIFI (chip ITE IT8688E).
- Instala el driver PawnIO (https://pawnio.eu), necesario para mover los ventiladores de la placa. (La temperatura de la CPU se lee sin él, por la BIOS de Gigabyte.)
- Descarga
FanControl-windows.zipde la sección Releases y descomprímelo. - Doble clic en
installer\instalar-windows.baty acepta el aviso de administrador (una sola vez).
Eso copia la app a C:\Program Files\FanControl (una carpeta que solo pueden modificar administradores, a propósito:
la tarea la lanza con permisos elevados) y crea la tarea programada FanControl, que la arranca sola al iniciar
sesión, minimizada en la bandeja, con permisos de administrador y sin aviso UAC en cada arranque.
Cerrar la ventana la deja en la bandeja; Salir (clic derecho en el icono) devuelve los ventiladores a la BIOS.
Para quitarlo todo: installer\desinstalar-windows.bat (conserva tu configuración).
El .exe no está firmado digitalmente: Windows SmartScreen o tu antivirus pueden avisar la primera vez («Más
información» → «Ejecutar de todas formas»). Es normal en ejecutables hechos con PyInstaller; el código fuente
completo está en este repositorio si prefieres compilarlo tú (ver «Desarrollo»).
Si prefieres no instalar nada, también puedes ejecutar FanControl.exe directamente desde la carpeta descomprimida.
- Dos sensores: CPU y GPU (arriba a la derecha).
- Tres grupos de ventiladores: CPU, GPU y CAJA. Cada grupo tiene su modo, su sensor («Punto de control») y su curva.
- Modos como en GCC: Silencio · Normal · Velocidad total · Manual. La curva se arrastra libremente (los puntos pueden cruzarse entre sí, rango 0–100 °C / 0–100 %); al editar un modo predefinido pasa a Manual partiendo de esa misma curva.
- Controlado por la app: OFF = manda la BIOS (valor por defecto); ON = la app ajusta esos ventiladores.
- Ventiladores de este grupo: marca qué ventiladores obedecen a cada grupo (doble clic para renombrar).
- Perfiles: «Profile 1» por defecto; ✎ renombrar, ⧉ guardar copia como nuevo perfil, ✕ eliminar. También desde la bandeja.
- Temp. crítica (90 °C): CPU o GPU por encima → ventiladores gestionados al 100 %.
- Todo arranca en OFF: la app no toca nada hasta que activas un grupo.
- Si falla el sensor de un grupo, sus ventiladores vuelven a la BIOS. Igual al cerrar (también con Ctrl+C).
- Solo una instancia a la vez. Si el proceso se mata a la fuerza (Administrador de tareas) un ventilador puede quedar fijo en su última velocidad hasta reabrir la app (al arrancar devuelve todos a la BIOS) o reiniciar.
- Un ventilador que pide ≥40 % y sigue a 0 RPM durante 10 s se marca «no responde».
- No uses a la vez la pestaña Fan de Gigabyte Control Center: se pisarían.
| LibreHardwareMonitor | Gigabyte CC | Asignación inicial |
|---|---|---|
| Fan #1 | CPU_FAN |
grupo CPU: los dos de la CPU (push-pull) y también los de la caja (comprobado por el usuario) (40 % ≈ 940 RPM, 100 % ≈ 1820 RPM) |
| Fan #2 | SYS_FAN |
grupo SYS FAN, marcado «sin efecto»: comprobado que al subirlo al 100 % no se mueve ningún ventilador (el hub de la caja cuelga de CPU_FAN); se puede volver a activar desde la app |
| Fan #3 | PCH (chipset) | sin grupo: no conviene frenar el ventilador del chipset X570 |
| Fan #4, #5 | — | sin grupo (la placa no tiene esas cabeceras) |
| GPU Fan | — | grupo GPU (en OFF por defecto): se controla por Overdrive8 de AMD, como MSI Afterburner (ver abajo) |
La correspondencia Fan #1/#2/#3 = CPU/System 1/PCH sale del orden de los perfiles de Gigabyte Control Center y de las RPM medidas; si algún ventilador no es el que crees, cámbialo de grupo en la lista.
LibreHardwareMonitor solo habla la interfaz antigua de AMD, que en una RX 6000 acepta la orden pero no hace nada. Esta app
usa la que usa MSI Afterburner: Overdrive8 de la librería de AMD (atiadlxx.dll, ADL) — fancontrol/gpu_amd_od8.py.
Allí el ventilador no es «fijar velocidad» sino una curva de 5 puntos del driver más un interruptor Zero-RPM:
- Para fijar un %, se pone la curva plana a ese valor y se desactiva Zero-RPM. Mínimo del driver: 15 %.
- La curva se envía siempre entera (los 5 pares temperatura/velocidad): si solo se mandan las velocidades, el driver las acepta y las devuelve al leerlas, pero el firmware las ignora (medido en una RX 6700 XT).
- Al soltar (o al cerrar la app), se devuelve exactamente lo que había antes (curva y Zero-RPM). Si la app muere sin
soltarlo, se deja un marcador (
gpu_fan_touched) y al siguiente arranque se restauran los valores de fábrica. - Medido en una RX 6700 XT: 100 % → ~3200 RPM, 40 % → ~1850 RPM, y al soltar vuelve a 0 RPM (Zero-RPM).
- Las estructuras y los números salen de los encabezados oficiales del ADL SDK de AMD (repositorio público GPUOpen-LibrariesAndSDKs/display-library). La DLL es la del driver de AMD instalado; no se redistribuye aquí.
- Driver (LibreHardwareMonitor + PawnIO):
Core (Tctl/Tdie). - Si no hay lectura: BIOS de Gigabyte por WMI, entrada 2 (
GSA1_ACPIMethod.ZFCGetCurrentTemp), la misma que usa GCC. Medido: 64,75 °C (driver) frente a 64 °C (BIOS).
Aviso: esta parte se ha escrito y probado desde Windows, contra una imitación de /sys/class/hwmon en disco
(tests/test_hw_linux.py), no contra el chip real. Antes de instalar, comprueba qué ve tu kernel:
cat /sys/class/hwmon/hwmon*/name
sensors # de lm-sensors, si lo tienes: pacman -S lm_sensors
Deberías ver k10temp (CPU) y algo que empiece por it8 (el chip de la placa, it87 en el kernel). Si it8* no
aparece, revisa dmesg | grep it87: en placas Gigabyte es habitual necesitar ignore_resource_conflict=1
(el instalador ya lo activa) porque la ACPI de la BIOS reclama el mismo chip que usa Windows para leer temperatura.
cd installer
chmod +x install-linux.sh uninstall-linux.sh # por si el zip no conservó el permiso de ejecución
./install-linux.shPide la contraseña una sola vez (sudo), solo para lo que necesita privilegios: cargar el módulo it87, crear el
grupo fancontrol y la regla udev que da permiso de escritura sobre los ventiladores. La app en sí corre siempre
como tu usuario normal, nunca como root. Tras instalar, cierra sesión y vuelve a entrar (para que el nuevo
grupo se aplique) antes de esperar que controle nada.
Se instala en ~/.local/share/fancontrol (con su propio entorno virtual de Python, sin tocar paquetes del
sistema) y arranca sola al iniciar sesión (~/.config/autostart/fancontrol.desktop). Si tu escritorio no
respeta el autostart XDG, hay un servicio de usuario systemd alternativo en installer/fancontrol.service.
Desinstalar: installer/uninstall-linux.sh (conserva tu configuración en ~/.config/fancontrol).
- Sin PawnIO ni pythonnet: todo es lectura/escritura directa en
/sys/class/hwmon(fancontrol/hw_linux.py).requirements-linux.txtsolo pide PySide6. - «Volver a la BIOS» es distinto: en Linux, una vez que el kernel controla el chip, «soltar» un ventilador
significa pedirle al propio chip que vuelva a su modo automático (
pwmN_enable=2), no devolvérselo a un proceso de la placa en marcha (que en Linux no existe). Es el equivalente más parecido que hay, no es idéntico. SYS_FANsin RPM: igual que en Windows, si el hub de la caja no devuelve tacómetro no se puede leer por número; solo con el botón «Identificar».- GPU: en Windows se controla por Overdrive8 de AMD (ver arriba). En Linux no está comprobado: algunas AMD
responden a
pwm1deamdgpu. Pruébalo con Identificar antes de activarla, y si quieres controlarla descomenta la línea deamdgpueninstaller/60-fancontrol.rules. - Reconocimiento de la placa Gigabyte: en Windows se confirma por WMI-ACPI; en Linux, por DMI
(
/sys/class/dmi/id/board_vendor, sin privilegios) — verfancontrol/dmi_linux.py.
Windows necesita además lib\LibreHardwareMonitorLib.dll y sus dependencias (no están en el repo: son binarios de
terceros, licencia MPL-2.0). Se descargan de https://github.com/LibreHardwareMonitor/LibreHardwareMonitor/releases
(la versión probada es 0.9.6 — coge LibreHardwareMonitor.zip) y se copian los .dll a una carpeta lib\ aquí.
python main.py # Windows: necesita PySide6 y pythonnet (pip install -r requirements.txt)
# Linux: necesita solo PySide6 (pip install -r requirements-linux.txt)
python -m unittest discover -s tests # 105 tests — los de hw_linux.py y dmi_linux.py corren igual en Windows
python -m PyInstaller --noconfirm --clean --windowed --uac-admin --name FanControl --icon fancontrol.ico ^
--distpath release --add-data "lib;lib" --collect-all pythonnet --collect-all clr_loader main.py
La última línea es solo para Windows (PyInstaller no compila cruzado); en Linux, si quieres un solo ejecutable en
vez de correr desde el código, hazlo en la propia máquina Linux con pyinstaller --onedir main.py una vez
instaladas las dependencias de requirements-linux.txt.
Registro de errores: %APPDATA%\FanControlPy\fancontrol.log (Windows) / ~/.local/state/fancontrol/fancontrol.log
(Linux). Configuración: %APPDATA%\FanControlPy\config.json (Windows) / ~/.config/fancontrol/config.json (Linux).