Advertisement
Guest User

Untitled

a guest
Jul 9th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.42 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. from fanshim import FanShim
  3. import psutil
  4. import argparse
  5. import time
  6. import signal
  7. import sys
  8.  
  9.  
  10. def clean_exit(signum, frame):
  11.     set_fan(False)
  12.     fanshim.set_light(0, 0, 0)
  13.     sys.exit(0)
  14.  
  15.  
  16. def update_led(state):
  17.     if state:
  18.         fanshim.set_light(0, 255, 0)
  19.     else:
  20.         fanshim.set_light(255, 0, 0)
  21.  
  22.  
  23. def get_cpu_temp():
  24.     return psutil.sensors_temperatures()['cpu-thermal'][0].current
  25.  
  26.  
  27. def get_cpu_freq():
  28.     freq = psutil.cpu_freq()
  29.     return freq
  30.  
  31.  
  32. def set_fan(status):
  33.     global enabled
  34.     changed = False
  35.     if status != enabled:
  36.         changed = True
  37.         update_led(status)
  38.         fanshim.set_fan(status)
  39.     enabled = status
  40.     return changed
  41.  
  42.  
  43. def set_automatic(status):
  44.     global armed, last_change
  45.     armed = status
  46.     last_change = 0
  47.  
  48.  
  49. parser = argparse.ArgumentParser()
  50. parser.add_argument('--threshold', type=float, default=37.0, help='Temperature threshold in degrees C to enable fan')
  51. parser.add_argument('--hysteresis', type=float, default=2.0, help='Distance from threshold before fan is disabled')
  52. parser.add_argument('--delay', type=float, default=2.0, help='Delay, in seconds, between temperature readings')
  53. parser.add_argument('--preempt', action='store_true', default=False, help='Monitor CPU frequency and activate cooling premptively')
  54. parser.add_argument('--verbose', action='store_true', default=False, help='Output temp and fan status messages')
  55.  
  56. args = parser.parse_args()
  57.  
  58. fanshim = FanShim()
  59. fanshim.set_hold_time(1.0)
  60. fanshim.set_fan(False)
  61. armed = True
  62. enabled = False
  63. last_change = 0
  64.  
  65. t = get_cpu_temp()
  66. if t >= args.threshold:
  67.     last_change = get_cpu_temp()
  68.     set_fan(True)
  69.  
  70.  
  71. @fanshim.on_release()
  72. def release_handler(was_held):
  73.     global armed
  74.     if was_held:
  75.         set_automatic(not armed)
  76.     elif not armed:
  77.         set_fan(not enabled)
  78.  
  79.  
  80. @fanshim.on_hold()
  81. def held_handler():
  82.     for _ in range(3):
  83.         fanshim.set_light(0, 0, 255)
  84.         time.sleep(0.04)
  85.         fanshim.set_light(0, 0, 0)
  86.         time.sleep(0.04)
  87.         update_led(enabled)
  88.  
  89.  
  90. signal.signal(signal.SIGTERM, clean_exit)
  91.  
  92. try:
  93.     update_led(fanshim.get_fan())
  94.     enable = False
  95.     is_fast = False
  96.     while True:
  97.         t = get_cpu_temp()
  98.         f = get_cpu_freq()
  99.         was_fast = is_fast #save the last speed flag
  100.         is_fast = (int(f.current) == int(f.max))
  101.         if args.preempt and is_fast and was_fast:
  102.             #if Preempt, if running at full speed for 2 passes, turn on fan
  103.             enable = True
  104.             if args.verbose:
  105.                 print("Full frequency - on")
  106.         elif armed:
  107.             if t >= args.threshold:
  108.                 #if temp> threshold, turn on
  109.                 enable = True
  110.                 if args.verbose:
  111.                     print("Over Temperature - on")
  112.             elif t < (args.threshold - args.hysteresis):
  113.                 enable = False
  114.                 #threshold - hysterisis is the temperature we should turn off at.  If below that, turn off
  115.                 if args.verbose:
  116.                     print("Under Temperature - off")
  117.         if set_fan(enable):
  118.             last_change = t
  119.         if args.verbose:
  120.             print("Current: {:05.02f} Target: {:05.02f} Freq {: 5.02f} Automatic: {} On: {}".format(t, args.threshold, f.current / 1000.0, armed, enabled))
  121.  
  122.         time.sleep(args.delay)
  123. except KeyboardInterrupt:
  124.     pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement