Here is my python script that manages my AMD Fans on my mining rigs. Use at your own risk! I’m not responsible if you break your system with this script:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2012, Dan Sheffner http://digisoftinc.org/
# All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish, dis-
# tribute, sublicense, and/or sell copies of the Software, and to permit
# persons to whom the Software is furnished to do so, subject to the fol-
# lowing conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
import commands
import time
import os
class Fan :
def __init__ ( self ):
self . threshold = 70
self . tempList = []
self . fanSpeed = 100
self . min = 60
self . numOfCards = 3
self . sleepTime = 60
def getTemp ( self ):
command = 'aticonfig --odgt --adapter=all | grep Sensor'
self . output = commands . getoutput ( command )
outputArray = self . output . split ( " \n " )
for each in outputArray :
temp = each . split ()
self . tempList . append ( temp [ 4 ])
def getCurrentSpeed ( self ):
self . fanSpeed = open ( 'fanSpeed.txt' , 'r' ) . read ()
def adjustFanSpeed ( self ):
for each2 in self . tempList :
print each2
fanChange = False
if float ( each2 ) > self . threshold and fanChange == False :
#checks to see if the fan is at 100. Nothing to do if it is already set to max.
if int ( self . fanSpeed ) <> 100 :
newSpeed = int ( self . fanSpeed ) + 5
print "increase setting fan speed to " + str ( newSpeed )
os . system ( "echo '" + str ( newSpeed ) + "' > ~/fanSpeed.txt" )
fanChange = True
for each3 in range ( self . numOfCards ):
command = 'export DISPLAY=:0.' + str ( each3 ) + '; aticonfig --pplib-cmd "set fanspeed 0 ' + str ( newSpeed ) + '"'
#print command
os . system ( command )
else :
print "Fan Speed at 100 Max"
fanChange = True
if fanChange == False :
#checks to see if the fan is at the minimum you want to set it.
if int ( self . fanSpeed ) == self . min :
print "Minimum fan speed already reached. You must be running your system well."
else :
newSpeed = int ( self . fanSpeed ) - 5
print "decrease setting fan speed to " + str ( newSpeed )
os . system ( "echo '" + str ( newSpeed ) + "' > ~/fanSpeed.txt" )
for each3 in range ( self . numOfCards ):
command = 'export DISPLAY=:0.' + str ( each3 ) + '; aticonfig --pplib-cmd "set fanspeed 0 ' + str ( newSpeed ) + '"'
#print command
os . system ( command )
def preFlightCheck ( self ):
print "Setting the fan initial speed to min."
os . system ( "echo '" + str ( self . min ) + "' > ~/fanSpeed.txt" )
for each3 in range ( self . numOfCards ):
command = 'export DISPLAY=:0.' + str ( each3 ) + '; aticonfig --pplib-cmd "set fanspeed 0 ' + str ( self . min ) + '"'
#print command
os . system ( command )
def cleanUp ( self ):
self . tempList = []
def run ( self ):
print "Created by Dan Sheffner."
# I want to make sure the system fan setting and the fanSpeed.txt
# match all the time.
self . preFlightCheck ()
while 1 == 1 :
self . getTemp ()
self . getCurrentSpeed ()
self . adjustFanSpeed ()
self . cleanUp ()
print "sleeping for 1 min..."
time . sleep ( self . sleepTime )
if __name__ == "__main__" :
f = Fan ()
f . run ()