link acabou sendo um começo útil.
Em /sys/devices/platform/applesmc.768/
, existem algumas opções úteis que podem ser usadas para controlar a velocidade do ventilador.
Há "fan1_min" e "fan1_max", que são as velocidades mínima e máxima do ventilador, "fan1_output", que controla diretamente o ventilador, e "fan1_manual", que faz o sistema ignorar as configurações mínima e máxima e diretamente responder às alterações para "fan1_output".
Como controlá-los automaticamente é o próximo ponto na agenda.
EDIT: Além disso, tenha cuidado com essas configurações, pois é muito possível simplesmente desligar o ventilador, expondo seu sistema aos perigos de superaquecimento.
Segunda edição:
Também parece que as informações nessa página estão um pouco desatualizadas, já que achei que as leituras do sensor de temperatura estavam no mesmo diretório que as configurações do ventilador, e não naquele outro diretório sugerido pela página.
Terceira edição: com base nos algoritmos dessa página, escrevi um script python rápido que, quando executado como root, parece funcionar muito bem:
#!/usr/bin/python
import time
import glob
import math
last_temp = 0
while True:
time.sleep(1)
files = glob.glob("/sys/devices/platform/applesmc.768/temp*_input")
temp = 0
for file in files:
with open(file) as openfile:
sensor_temp = openfile.read()
temp = max(int(sensor_temp)/1000, temp)
with open("/sys/devices/platform/applesmc.768/fan1_input") as fan1_input:
current_speed = int(fan1_input.read())
increasing = temp > last_temp
last_temp = temp
if increasing:
if temp <= 65:
speed = max(current_speed, 2000)
elif 65 < temp < 80:
step = (6200 - 2000) / ((80 - 65) * (80 - 64) / 2)
speed = max(current_speed, math.ceil(2000 + (temp - 65) * (temp - 64) / 2 * step))
elif temp >= 80:
speed = 6200
else:
if temp >= 80:
speed = 6200
elif 55 < temp < 80:
step = (6200 - 2000) / ( (80 - 55) * (80 - 54) / 2 )
speed = min(current_speed, math.floor(6200 - (80 - temp) * (81 - temp) / 2 * step))
elif temp <= 55:
speed = 2000
print "Temperature: " + str(temp) + " Increasing?: " + str(increasing) + " Current speed: " + str(current_speed) + " Target: " + str(speed)
with open("/sys/devices/platform/applesmc.768/fan1_min", "w") as fan1_input:
#with open("/home/werner/testtemp", 'w+') as fan1_input:
fan1_input.write(str(int(speed)))