From 7a349505ba3f0f445e23c6e9582d9d45eed500ab Mon Sep 17 00:00:00 2001 From: PavelBelyaev Date: Wed, 3 Jul 2024 19:16:47 +0000 Subject: [PATCH] create fancontrol.sh --- fancontrol.sh | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 fancontrol.sh diff --git a/fancontrol.sh b/fancontrol.sh new file mode 100644 index 0000000..0f3f879 --- /dev/null +++ b/fancontrol.sh @@ -0,0 +1,165 @@ +#!/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 \ No newline at end of file