Add temperature control feature, as the board doesn't do it automatically for any fan but the cpu fan

master
root 4 years ago
parent 1da239ae3d
commit 9518085938

@ -14,3 +14,4 @@ This is a script to control 4-pin PWM fans on ASRock Rack motherboards with IPMI
optional arguments:
-h, --help show this help message and exit
-i, --info Read fan information
-a, --auto Service to control fans based on temperature

@ -3,6 +3,10 @@ import run_cmd
import argparse
import time
MAXFAN = 6
MINSPEED = 35
MAXSPEED = 100
MINTEMP = 30
MAXTEMP = 65
parser = argparse.ArgumentParser(description='Read information about and control fans on ASRock boards with IPMI.', prog='asrock-pwm-ipmi')
parser.add_argument('fanplusspeed', nargs='*', metavar='FAN:SPEED',
@ -11,28 +15,56 @@ parser.add_argument('fanplusspeed', nargs='*', metavar='FAN:SPEED',
# help='Speed to set FAN to')
parser.add_argument('-i', '--info', action="store_true", default=False,
help='Read fan information')
parser.add_argument('-a', '--auto', action="store_true", default=False,
help='Service to control fans based on temperature')
args = parser.parse_args()
#print(args.info)
#print(args)
#print(args.fanplusspeed)
fanChanged = False
def iterateFans(info):
for fanopt in info:
if str(fanopt.split(":"))[2:-2] == fanopt or int(fanopt.split(":")[0]) < 1 or int(fanopt.split(":")[0]) > MAXFAN:
print("Improper format!")
continue
fan, speed = fanopt.split(":")
run_cmd.setSpeed(int(fan), int(speed))
fanChanged = True
if int(speed) == 0:
print("Set speed of FAN" + fan + " to Auto.")
else:
print("Set speed of FAN" + fan + " to " + speed + "%.")
while args.auto is True:
temp = run_cmd.getTemp()
speeds = []
if temp < MINTEMP:
for i in range(2, 7):
speeds.append(str(i) + ":1")
#speeds = "2:1 3:1 4:1 5:1 6:1"
elif temp > MAXTEMP:
for i in range(2, 7):
speeds.append(str(i) + ":100")
#speeds = "2:100 3:100 4:100 5:100 6:100"
else:
base = temp - MINTEMP
max = MAXTEMP - MINTEMP
scaled = base / max
speed = int(scaled * (MAXSPEED - MINSPEED) + MINSPEED)
for i in range(2, 7):
speeds.append(str(i) + ":" + str(speed))
iterateFans(speeds)
#print(speeds)
time.sleep(1)
if args.info is False and args.fanplusspeed == []:
print("Nothing to do! See --help for usage.")
quit
if args.fanplusspeed != []:
for fanopt in args.fanplusspeed:
if str(fanopt.split(":"))[2:-2] == fanopt or int(fanopt.split(":")[0]) < 1 or int(fanopt.split(":")[0]) > MAXFAN:
print("Improper format!")
continue
fan, speed = fanopt.split(":")
run_cmd.setSpeed(int(fan), int(speed))
fanChanged = True
if int(speed) == 0:
print("Set speed of FAN" + fan + " to Auto.")
else:
print("Set speed of FAN" + fan + " to " + speed + "%.")
iterateFans(args.fanplusspeed)
if args.info is True:
if fanChanged is True:
print("\nWaiting for fans to adjust...")

@ -1,5 +1,6 @@
#!/usr/bin/python3
import subprocess as sp
import json
def setSpeed(fan, setspeed):
speeds, speedsRaw = getAllSpeeds()
@ -32,7 +33,7 @@ def getFanInfo():
sensorinfo, err = cmdoutput.communicate()
#print(sensorinfo.splitlines())
faninfo = []
speeds, speedsRaw= getAllSpeeds()
speeds, speedsRaw = getAllSpeeds()
for line in sensorinfo.splitlines():
if "FAN" in str(line):
faninfo.append(str(line))
@ -46,3 +47,10 @@ def getFanInfo():
faninfo[index] += "%"
#print(faninfo[index])
return faninfo
def getTemp():
cmdoutput = sp.Popen(["sensors", "-Aj", "zenpower-*"], stdout=sp.PIPE)
sensorjson, err = cmdoutput.communicate()
sensordata = json.loads(sensorjson)
temp = sensordata["zenpower-pci-00c3"]["Tdie"]["temp1_input"]
return temp

Loading…
Cancel
Save