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

#!/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