Skip to content

Instantly share code, notes, and snippets.

@Lillecarl
Created September 7, 2023 14:28
Show Gist options
  • Save Lillecarl/15b683c3cd3bafe74ca3c4dafd427d2e to your computer and use it in GitHub Desktop.
Save Lillecarl/15b683c3cd3bafe74ca3c4dafd427d2e to your computer and use it in GitHub Desktop.
#! /usr/bin/env python3
import json
import re
from time import sleep
from plumbum import local
from pathlib import Path
sensors = local["sensors"]
fanpath = local.path("/proc/acpi/ibm/fan")
# Set timeout to 120 (fallback to auto fan)
fanpath.write("watchdog 120")
fanspeeds = {
0: 0,
1: 1960,
2: 2100,
3: 2250,
4: 2480,
5: 2770,
6: 3100,
7: 3400,
8: 4700,
}
def getlevel():
faninfo: str = fanpath.read()
faninfolines = faninfo.splitlines()
fanlevel = None
for line in faninfolines:
regex = r"^level:\s*(.*)$"
matches = re.match(regex, line)
if matches:
match = matches.group(1)
if match == "disengaged":
return 8
elif match == "auto":
return 0
else:
return int(match)
return 0
def setlevel(level: int):
curlevel = getlevel()
if level > 8:
level = 8
if level == curlevel:
print(f"Current level is {level}, asked to set the same")
return
print(f"setting fanlevel to {level}")
if level == 8:
fanpath.write("level full-speed")
else:
fanpath.write(f"level {level}")
def gettemp():
sensordata: dict[str, dict] = json.loads(sensors["-j"]())
return float(sensordata["thinkpad-isa-0000"]["CPU"]["temp1_input"])
def getspeed():
sensordata: dict[str, dict] = json.loads(sensors["-j"]())
return float(sensordata["thinkpad-isa-0000"]["fan1"]["fan1_input"])
while True:
sleep(5)
level = getlevel()
if level is None:
setlevel(1)
level = int(getlevel())
speed = getspeed()
temp = gettemp()
closestlevel = 0
closestspeed = 0
for i in range(0,9):
if abs(fanspeeds[i] - speed) < abs(closestspeed - speed):
closestlevel = i
closestspeed = fanspeeds[i]
if closestlevel != level and False:
print("Haven't reached new fan target speed yet, skipping")
print(f"closestlevel: {closestlevel}, closestspeed: {closestspeed}")
continue
if temp < 55:
setlevel(0)
elif temp > 55 and temp < 60:
setlevel(1)
elif temp > 90:
setlevel(8)
elif temp > 80:
setlevel(level + 3)
elif temp > 70:
setlevel(level + 2)
elif temp > 60:
setlevel(level + 1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment