I am testing our XU4 image and I must say thank you for the great work you did.
I have a 128 GB MicroSD Card and on the second partition the home and data directorys with btrfs file system in subvolumes mounted and shared via omv.
The only challenge was the fan control. I now have a modifyd python script from this debian package GitHub - L33thium/xu4fanctl: fan control daemon for odroid xu4
Python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
##########
## Fan control for odroid xu4
## when hit hiTmp manage fan speed until hit loTmp then stop.
## steps make fan wants to speed down more than speed up, for silence.
## recommanded governor : conservative
############################
import os, sys, signal, re, time, collections
# settings
#hiTmp = 90
#loTmp = 50
hiTmp = 60
loTmp = 35
stepUp = 20
stepDown = 5
minSpd = 22 # in percent
# files location
#if os.path.isdir("/sys/devices/odroid_fan.14"):
# fanctl = "/sys/devices/odroid_fan.14"
#elif os.path.isdir("/sys/devices/odroid_fan.13"):
# fanctl = "/sys/devices/odroid_fan.13"
#fanctl = "/sys/devices/platform/pwm-fan:/hwmon/hwmon0"
fanctl = "/sys/class/hwmon/hwmon0"
#fTmp = "/sys/devices/10060000.tmu/temp"
fTmp = "/sys/class/thermal/thermal_zone1/temp"
#fMode = fanctl+"/fan_mode"
fSpd = fanctl+"/pwm1"
class fan():
def __init__(self):
self.tmpLst = collections.deque(maxlen=100)
#def setManual(self):
#with open(fMode, "w") as f:
#f.write("0")
#def setAuto(self):
#with open(fMode, "w") as f:
#f.write("1")
def getTmp(self):
with open(fTmp, "r") as f:
t = f.read()
tmps = re.findall("[0-9]{5}", t)
tmps = map(int, tmps)
#temp = max(tmps) / 1000
temp = sum(tmps) / len(tmps) / 1000
self.tmpLst.append(temp)
tmpAvg = float(sum(self.tmpLst) / len(self.tmpLst))
return [temp, tmpAvg]
def cool(self):
delta = hiTmp - loTmp + 20
tmps = self.getTmp()
temp = tmps[0]
tmpAvg = tmps[1]
time.sleep(1)
while tmpAvg > loTmp:
tmps = self.getTmp()
temp = tmps[0]
tmpAvg = tmps[1]
diff = tmpAvg - loTmp
percent = int(float(diff) / float(delta) * 100)
if temp >= hiTmp:
self.setSpd(100)
else:
self.setSpd(percent)
time.sleep(1)
def setSpd(self, percent=0):
if percent > 100:
percent = 100
pwm = int(float(percent) * 109 / 100)
if pwm < 28 and pwm > 1:
pwm = 28
#if pwm < 1: pwm = 1 # switch fan off
if pwm < 1: pwm = 28
with open(fSpd, "r") as f:
curPwm = int(f.read())
#print curPwm
if not pwm == curPwm:
with open(fSpd, "w") as f:
f.write(str(pwm))
class GracefulKiller:
kill_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
def exit_gracefully(self,signum, frame):
self.kill_now = True
def main():
killer = GracefulKiller()
done = False
#fan.setManual()
#fan.setSpd(0)
fan.cool()
while not done:
if killer.kill_now:
#fan.setAuto()
break
if fan.getTmp()[0] > hiTmp:
fan.cool()
time.sleep(1)
if __name__ == "__main__":
fan = fan()
try:
main()
except Exception as error:
print('caught this error: ' + repr(error))
#fan.setAuto()
Alles anzeigen
mfG Matthias