Управление оборотами вентилятора V2

Модераторы: Shawn.S@AST, Bennettest, sashawang, Alex Fokeev

Ответить
setsempron
Сообщения: 715
youtube meble na wymiar Warszawa
Зарегистрирован: Сб дек 16, 2017 8:46 pm
Откуда: Беларусь
Контактная информация:

Управление оборотами вентилятора V2

Сообщение setsempron »

Продолжение к теме Изменение скорости вентилятора viewtopic.php?f=5&t=3289.
Пользователь sksbir с соседнего форума https://forum.asustor.com/viewtopic.php?f=97&t=8948 обновил скрипт управления оборотов вентилятора. Добавил поддержку многовентиляторных NAS и NVME носителей.
Содержание скрипта управлением вентиляторами:

Код: Выделить всё

#!/bin/sh
# designed by sksbir
# https://forum.asustor.com/viewtopic.php?f=97&t=8948
# 20220422 : added nvme device, using smartctl --scan for device recognition , managing multiple fans, more agressive fan reaction in case of temperature elevation.

if [ "$1" = "-v" ]
then
        VERBOSE=1
fi

DEF_DESIREDPOWER=75 # from about 30 to 255
CYCLETEMPCHECK=12 # every how many 10" cycles we check for temp changes. 6 = every mn
#
# temperature to power grid : GRIDxx=yy : we want power of yy if temp is xx
GRID15=30 ; GRID16=30 ; GRID17=30 ; GRID18=31 ; GRID19=33
GRID20=35 ; GRID21=37 ; GRID22=39 ; GRID23=41 ; GRID24=44
GRID25=47 ; GRID26=50 ; GRID27=54 ; GRID28=59 ; GRID29=65
GRID30=68 ; GRID31=70 ; GRID32=72 ; GRID33=74 ; GRID34=75
GRID35=77 ; GRID36=79 ; GRID37=82 ; GRID38=84 ; GRID39=85
GRID40=86 ; GRID41=88 ; GRID42=90 ; GRID43=92 ; GRID44=94
GRID45=96 ; GRID46=105 ; GRID47=110 ; GRID48=135 ; GRID49=160
GRID50=170 ; GRID51=175 ; GRID52=180 ; GRID53=185 ; GRID54=190
GRID55=195 ; GRID56=200 ; GRID57=210 ; GRID58=220 ; GRID59=230
GRID60=250 ; GRID61=250 ; GRID62=250 ; GRID63=250 ; GRID64=250



#
# let's learn devices which have temperature sensors
#
HOTTESTDISKTEMP=15
LSTDEVICES=""
for DSKDEV in `smartctl --scan|awk ' { print $1 } ' `
do
        echo $DSKDEV|grep nvm >/dev/null 2>&1
        if [ $? -eq 0 ]
        then
                TSTTEMP=`smartctl --all $DSKDEV|awk '/^Temperature:.*Celsius/ { print $2 } '`
        else
                TSTTEMP=`smartctl --all $DSKDEV|awk '/^194/ { print $10 } '`
        fi
        if [ "$TSTTEMP" != "" ]
        then
                if [ \( "$TSTTEMP" -gt 15 \) -a \( "$TSTTEMP" -lt 70 \) ]
                then
                        [ $VERBOSE ] && echo $DSKDEV added to list with recognized temp of $TSTTEMP
                        LSTDEVICES="$LSTDEVICES $DSKDEV"
                fi
        fi
done
[ $VERBOSE ] && echo Retained devices for temperature check : $LSTDEVICES

FANLIST=`fanctrl -getfanspeed|awk ' { print $1 } '`
[ $VERBOSE ] && echo valid fanlist : $FANLIST


# DESIREDPOWER=$DEF_DESIREDPOWER # from about 30 to 255
DESIREDPOWER=`fanctrl -getfanspeed|awk ' { print $NF } '|head -1`
COUNTDWN=0
CPT=0
DELAY=1 # initial loop = no delay

while :
do
#
# temperature check
#
        if [ $COUNTDWN -le 0 ]
        then
                COUNTDWN=$CYCLETEMPCHECK
                # we almost cancel pause because this loop consumes time.
                DELAY=1
                NEW_HOTTESTDISKTEMP=15
                for DSKDEV in $LSTDEVICES
                do
                        echo $DSKDEV|grep nvm >/dev/null 2>&1
                        if [ $? -eq 0 ]
                        then
                                TSTTEMP=`smartctl --all $DSKDEV|awk '/^Temperature:.*Celsius/ { print $2 } '`
                        else
                                TSTTEMP=`smartctl --all $DSKDEV|awk '/^194/ { print $10 } '`
                        fi
                        if [ "$TSTTEMP" -gt $NEW_HOTTESTDISKTEMP ]
                        then
                                NEW_HOTTESTDISKTEMP=$TSTTEMP
                        fi
                done
                NEW_DESIREDPOWER=`eval echo \\\$GRID$NEW_HOTTESTDISKTEMP`
                if [ "$NEW_DESIREDPOWER" = "" ]
                then
                        NEW_DESIREDPOWER=$DEF_DESIREDPOWER
                fi
                if [ $HOTTESTDISKTEMP != $NEW_HOTTESTDISKTEMP ]
                then
                        if [ $DESIREDPOWER != $NEW_DESIREDPOWER ]
                        then
                                [ $VERBOSE ] && echo `date +%Y%m%d_%T` hottest disk changed from $HOTTESTDISKTEMP to $NEW_HOTTESTDISKTEMP,raising fanpower from $DESIREDPOWER to $NEW_DESIREDPOWER
                                DESIREDPOWER=$NEW_DESIREDPOWER
                        else
                                [ $VERBOSE ] && echo `date +%Y%m%d_%T` hottest disk changed from $HOTTESTDISKTEMP to $NEW_HOTTESTDISKTEMP,fanpower leaved unchanged at $DESIREDPOWER
                        fi
                        HOTTESTDISKTEMP=$NEW_HOTTESTDISKTEMP
                ## else
                        ## [ $VERBOSE ] && echo `date +%Y%m%d_%T` hottest disk leaved unchanged at $HOTTESTDISKTEMP ,fanpower leaved unchanged at $DESIREDPOWER
                fi
        fi

#
# fan override loop
#
        CURRPOWER=`fanctrl -getfanspeed|awk ' { print $NF } ' `
        if [ $DESIREDPOWER -ne $CURRPOWER ]
        then
                for FANID in $FANLIST
                do
                        fanctrl -setfanpwm $FANID $DESIREDPOWER
                done
                ## echo $CURRPOWER to $DESIREDPOWER CPT : $CPT
                CPT=0
                COUNTDWN=`expr $COUNTDWN - 1`
                sleep $DELAY
                DELAY=9
        else
                sleep 0.1
                CPT=`expr $CPT + 1`
        fi
done
Мои температурные настройки для 3202T:

Код: Выделить всё

GRID15=31 ; GRID16=31 ; GRID17=31 ; GRID18=31 ; GRID19=31
GRID20=31 ; GRID21=31 ; GRID22=31 ; GRID23=32 ; GRID24=32
GRID25=32 ; GRID26=33 ; GRID27=34 ; GRID28=36 ; GRID29=38
GRID30=40 ; GRID31=42 ; GRID32=44 ; GRID33=46 ; GRID34=48
GRID35=50 ; GRID36=52 ; GRID37=54 ; GRID38=56 ; GRID39=58
GRID40=60 ; GRID41=62 ; GRID42=64 ; GRID43=66 ; GRID44=68
GRID45=70 ; GRID46=75 ; GRID47=80 ; GRID48=85 ; GRID49=90
GRID50=100 ; GRID51=110 ; GRID52=120 ; GRID53=130 ; GRID54=140
GRID55=150 ; GRID56=160 ; GRID57=170 ; GRID58=190 ; GRID59=210
GRID60=250 ; GRID61=250 ; GRID62=250 ; GRID63=250 ; GRID64=250
Скрипт для запуска скрипта управления вентиляторами:

Код: Выделить всё

#!/bin/sh
LOGFILE=<YOUR_PATH_HERE>/fanspeed.log

case "$1" in
    start)
fuser $LOGFILE
if [ $? -eq 1 ]
then
        <YOUR PATH_HERE>/smart_fanspeed.sh -v > $LOGFILE 2>&1 &
fi
        ;;

esac
AS3202T
RT-AX68U
setsempron
Сообщения: 715
Зарегистрирован: Сб дек 16, 2017 8:46 pm
Откуда: Беларусь
Контактная информация:

Re: Управление оборотами вентилятора V2

Сообщение setsempron »

Порядок действий установки скрипта:
1.В директории /volume1/.@root(можете выбрать любую другую) создаем файл с названием smart_fanspeed.sh и копируем в него содержимое скрипта управляющего вентиляторами;

2.В той же директории создаем файл с названием script_smart_fanspeed.sh и вставляем туда

Код: Выделить всё

LOGFILE=/volume1/.@root/fanspeed.log

case "$1" in
    start)
fuser $LOGFILE
if [ $? -eq 1 ]
then
        /volume1/.@root/smart_fanspeed.sh -v > $LOGFILE 2>&1 &
fi
        ;;

esac
3.Заходим через SSH от имени root и создаем символьную ссылку

Код: Выделить всё

ln -s /volume1/.@root/script_smart_fanspeed.sh /volume1/.@plugins/etc/init.d/S99smartfanspeed
4. Перезапускаем NAS.
AS3202T
RT-AX68U
Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: Semrush [Bot] и 4 гостя