You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
3.8 KiB
165 lines
3.8 KiB
#!/bin/bash
|
|
minFanSpeed=59; #минимальные обороты (от 0 до 255)
|
|
|
|
# график изменения оборотов для HDD
|
|
# температура=>скорость(% от max)
|
|
hddSet[38]=125;
|
|
hddSet[44]=169;
|
|
hddSet[47]=210;
|
|
hddSet[51]=255;
|
|
|
|
# график изменения оборотов для CPU
|
|
# температура=>скорость(% от max)
|
|
cpuSet[38]=59;
|
|
cpuSet[48]=66;
|
|
cpuSet[55]=100;
|
|
cpuSet[60]=160;
|
|
cpuSet[68]=255;
|
|
|
|
|
|
#выставляем скорость
|
|
function setFanSpeed {
|
|
echo ${1} > /sys/class/hwmon/hwmon7/pwm3
|
|
}
|
|
|
|
|
|
function getMaxHddTemp {
|
|
echo $(($(cat /sys/class/hwmon/hwmon[3,4,5,6]/temp1_input|sort -n|tail -1)/1000));
|
|
}
|
|
|
|
function getCpuTemp {
|
|
echo $(($(cat /sys/class/hwmon/hwmon2/temp1_input)/1000))
|
|
}
|
|
|
|
|
|
|
|
|
|
function calcTempHdd {
|
|
prev=0;
|
|
for i in "${!hddSet[@]}"
|
|
do
|
|
key=$i;
|
|
val=${hddSet[$i]};
|
|
|
|
#меньше первого значения
|
|
if [[ $1 -lt $key && $prev -eq 0 ]]
|
|
then
|
|
ar=$2
|
|
echo 0; return;
|
|
fi;
|
|
|
|
dots=${prev}":"${hddSet[$prev]}":"${key}":"${val};
|
|
|
|
#меньше не первого значения
|
|
if [[ $1 -lt $key && $prev -gt 0 ]]
|
|
then
|
|
echo $dots; return;
|
|
fi;
|
|
|
|
prev=$key;
|
|
done
|
|
echo $dots;
|
|
}
|
|
|
|
function calcTempCpu {
|
|
prev=0;
|
|
|
|
for i in "${!cpuSet[@]}"
|
|
do
|
|
key=$i;
|
|
val=${cpuSet[$i]};
|
|
|
|
#меньше первого значения
|
|
if [[ $1 -lt $key && $prev -eq 0 ]]
|
|
then
|
|
ar=$2
|
|
echo 0; return;
|
|
fi;
|
|
|
|
dots=${prev}":"${cpuSet[$prev]}":"${key}":"${val};
|
|
|
|
#меньше не первого значения
|
|
if [[ $1 -lt $key && $prev -gt 0 ]]
|
|
then
|
|
echo $dots; return;
|
|
fi;
|
|
|
|
prev=$key;
|
|
done
|
|
echo $dots;
|
|
}
|
|
|
|
|
|
# аргументы [x1:y1:x2:y2, x], вернет Y=(kx+b)
|
|
function linear {
|
|
dots=$1
|
|
[[ "$dots" == "0" ]] && echo "0" && return;
|
|
|
|
x1=$(echo $dots | cut -d ":" -f1);
|
|
y1=$(echo $dots | cut -d ":" -f2);
|
|
x2=$(echo $dots | cut -d ":" -f3);
|
|
y2=$(echo $dots | cut -d ":" -f4);
|
|
x=$2;
|
|
|
|
|
|
# y=kx+b
|
|
k=$(awk "BEGIN {printf \"%.2f\",(${y2}-${y1})/(${x2}-${x1})}");
|
|
b=$(awk "BEGIN {printf \"%.2f\",(${y1}-(${k}*${x1}))}");
|
|
y=$(awk "BEGIN {printf \"%.0f\",(${k}*${x})+(${b})}");
|
|
|
|
#не больше 255
|
|
[[ $y -ge 255 ]] && y=255;
|
|
echo $y;
|
|
}
|
|
|
|
|
|
|
|
#составим таблицу скоростей для HDD
|
|
for ((i=0; i<101; i++))
|
|
do
|
|
pwmSpeed=$(linear $(calcTempHdd $i) $i);
|
|
if [[ $pwmSpeed -gt 0 ]]
|
|
then
|
|
echo "TempHDD:"$i" = "${pwmSpeed}"/255";
|
|
fi;
|
|
hddTable[$i]=$pwmSpeed;
|
|
done
|
|
|
|
|
|
#составим таблицу скоростей для процессора
|
|
for ((i=0; i<101; i++))
|
|
do
|
|
pwmSpeed=$(linear $(calcTempCpu $i) $i);
|
|
if [[ $pwmSpeed -gt 0 ]]
|
|
then
|
|
echo "TempCPU:"$i" = "${pwmSpeed}"/255";
|
|
fi;
|
|
cpuTable[$i]=$pwmSpeed;
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#включаем ручное управление
|
|
echo 1 > /sys/class/hwmon/hwmon7/pwm3_enable
|
|
#ставим на максималку
|
|
echo 255 > /sys/class/hwmon/hwmon7/pwm3
|
|
|
|
while true
|
|
do
|
|
hddTemp=$(getMaxHddTemp);
|
|
cpuTemp=$(getCpuTemp);
|
|
echo "TEMP hdd="${hddTemp}";cpu="${cpuTemp};
|
|
echo "SPEED for hdd="${hddTable[$hddTemp]}/255";SPEED for cpu="${cpuTable[$cpuTemp]}"/255";
|
|
|
|
[[ ${hddTable[$hddTemp]} -gt ${cpuTable[$cpuTemp]} ]] && needPWM=${hddTable[$hddTemp]} || needPWM=${cpuTable[$cpuTemp]};
|
|
|
|
echo "set ${needPWM}/255";
|
|
setFanSpeed $needPWM;
|
|
|
|
echo "-------------------------------------------------";
|
|
|
|
sleep 35
|
|
done |