SHARE
TWEET

Untitled

a guest Jul 12th, 2015 14 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import time, os, sys, signal, setproctitle, traceback
  5.  
  6. MIN_TEMP = 50 # fan starts to cool
  7. MAX_TEMP = 80 # fan cooling full power
  8.  
  9. def call_acpi(command):
  10.     acpi_call = open('/proc/acpi/call', 'w')
  11.     acpi_call.write(command)
  12.     acpi_call.close()
  13.    
  14.     # Response
  15.     acpi_call = open('/proc/acpi/call')
  16.     response = acpi_call.read()
  17.     acpi_call.close()
  18.    
  19.     return response
  20.  
  21. def set_fan(speed, fan=1):
  22.     if speed < 0:
  23.         speed = 0
  24.     elif speed > 100:
  25.         speed = 100
  26.     raw_speed = round(speed * 2.55)
  27.     call_acpi('\_SB.PCI0.LPCB.EC0.SFNV %d %s' % (fan, raw_speed))
  28.    
  29.     print('Set fan speed to %d %%' % speed)
  30.    
  31. def get_cpu_temp():
  32.     return int(call_acpi('\_SB.PCI0.LPCB.EC0.ECPU')[:4], 16)
  33.  
  34. # you can adjust the fan behavior with any mathematic function
  35. # for example you can use a square function "return temp**2* or cubic "return temp**3"
  36. def scale_temp(temp):
  37.     return temp
  38.  
  39. def handle_fan(current_temp):
  40.     temp_range = MAX_TEMP - MIN_TEMP
  41.     norm_temp = current_temp - MIN_TEMP if (current_temp - MIN_TEMP) > 0 else 0
  42.            
  43.     scaled_temp = scale_temp(norm_temp)
  44.     scaled_border = scale_temp(temp_range)
  45.    
  46.     fan_speed = 100/scaled_border * scaled_temp # in percent
  47.        
  48.     print("Current CPU temperature %d°" % current_temp)
  49.    
  50.     set_fan(fan_speed, 1)
  51.     set_fan(fan_speed, 2)
  52.    
  53. def cleanup(signal=None, frame=None):
  54.     call_acpi('\_SB.PCI0.LPCB.EC0.SFNV 0 0')
  55.     call_acpi('\_SB.ATKD.QMOD 0x02')
  56.    
  57.     print('\nReset fan control to automatic. Exiting...')
  58.     sys.exit(0)
  59.  
  60. def main():
  61.     signal.signal(signal.SIGTERM, cleanup)
  62.     try:
  63.         while True:
  64.             handle_fan(get_cpu_temp())
  65.             time.sleep(2)
  66.     except:
  67.         traceback.print_exc()
  68.     finally:
  69.         cleanup()
  70.  
  71. if __name__=='__main__':
  72.     # TODO: only one instance
  73.     setproctitle.setproctitle('fancontrol')
  74.     main(
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top