Add temperature control feature, as the board doesn't do it automatically for any fan but the cpu fan
This commit is contained in:
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:
|
optional arguments:
|
||||||
-h, --help show this help message and exit
|
-h, --help show this help message and exit
|
||||||
-i, --info Read fan information
|
-i, --info Read fan information
|
||||||
|
-a, --auto Service to control fans based on temperature
|
||||||
|
Binary file not shown.
56
pwm.py
56
pwm.py
@ -3,6 +3,10 @@ import run_cmd
|
|||||||
import argparse
|
import argparse
|
||||||
import time
|
import time
|
||||||
MAXFAN = 6
|
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 = 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',
|
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')
|
# help='Speed to set FAN to')
|
||||||
parser.add_argument('-i', '--info', action="store_true", default=False,
|
parser.add_argument('-i', '--info', action="store_true", default=False,
|
||||||
help='Read fan information')
|
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()
|
args = parser.parse_args()
|
||||||
#print(args.info)
|
#print(args.info)
|
||||||
#print(args)
|
#print(args)
|
||||||
#print(args.fanplusspeed)
|
#print(args.fanplusspeed)
|
||||||
fanChanged = False
|
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 == []:
|
if args.info is False and args.fanplusspeed == []:
|
||||||
print("Nothing to do! See --help for usage.")
|
print("Nothing to do! See --help for usage.")
|
||||||
quit
|
quit
|
||||||
if args.fanplusspeed != []:
|
if args.fanplusspeed != []:
|
||||||
for fanopt in args.fanplusspeed:
|
iterateFans(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 + "%.")
|
|
||||||
if args.info is True:
|
if args.info is True:
|
||||||
if fanChanged is True:
|
if fanChanged is True:
|
||||||
print("\nWaiting for fans to adjust...")
|
print("\nWaiting for fans to adjust...")
|
||||||
|
10
run_cmd.py
10
run_cmd.py
@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
import subprocess as sp
|
import subprocess as sp
|
||||||
|
import json
|
||||||
|
|
||||||
def setSpeed(fan, setspeed):
|
def setSpeed(fan, setspeed):
|
||||||
speeds, speedsRaw = getAllSpeeds()
|
speeds, speedsRaw = getAllSpeeds()
|
||||||
@ -32,7 +33,7 @@ def getFanInfo():
|
|||||||
sensorinfo, err = cmdoutput.communicate()
|
sensorinfo, err = cmdoutput.communicate()
|
||||||
#print(sensorinfo.splitlines())
|
#print(sensorinfo.splitlines())
|
||||||
faninfo = []
|
faninfo = []
|
||||||
speeds, speedsRaw= getAllSpeeds()
|
speeds, speedsRaw = getAllSpeeds()
|
||||||
for line in sensorinfo.splitlines():
|
for line in sensorinfo.splitlines():
|
||||||
if "FAN" in str(line):
|
if "FAN" in str(line):
|
||||||
faninfo.append(str(line))
|
faninfo.append(str(line))
|
||||||
@ -46,3 +47,10 @@ def getFanInfo():
|
|||||||
faninfo[index] += "%"
|
faninfo[index] += "%"
|
||||||
#print(faninfo[index])
|
#print(faninfo[index])
|
||||||
return faninfo
|
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…
x
Reference in New Issue
Block a user