Re: fan control based on hard-drive temperatures

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Guenter,

On 04-07-10 23:26, Guenter Roeck wrote:
>> This looks like it might be quite useful for others as well. Wonder
>> if it would make sense to integrate it info fancontrol and/or
>> pwmconfig. Couple of minor comments inline.

Thanks for the feedback. I would love to see fancontrol be enhanced with
the feature to use the hddtemp average or maximum.

I attached a new version making hddtemp use all harddisk instead of a
specified list. (can still be specified) I also moved the calculation of
the avarage temperuture outside the main loop when not running in debug
mode. This should make the shell scrip slightly faster.

> That isn't really a documentation, but an installation shell script. 
> Not that I care much, it is just odd to have such a script with an
> ending of .txt. Is that common nowadays or just your personal touch?

The installation document was .txt the script inside was bash both had
different licenses and styles, it is more personal touch. I share a lot
of this stuff, so it is my standard format.

> "average=$(($summation / $count))" would probably be sufficient
> here. For a "final" code version, it would be sufficient to
> calculate the average after the loop. But then you would have to
> check for $count == 0, so I am not sure if it would be worth it.

We need support for a floating number not a integer. The average
temperature can become 39.9 degrees. And with your suggestion this would
be rounded in 39, this is not the fan control I need, the shell command
I choice makes the average of 39.9 possible.

> "echo $(($average * 1000))" seems to work as well and would be a bit
> simpler. What is the "/1" for, anyway ? bc doesn't seem to need it.

The scale of a multiplication is min(a+b,max(scale,a,b)), where a and b
are the scales of the factors. (and 46.5 has a scale of 1, so the above
expression becomes min(0+1,max(0,1,0))=min(1,1)=1. So witouth the /1
part bc returns 46500.0 instead of the needed 46500 for fancontrol.
Adding the /1 over the results makes bc return 46500 and this can be
used by fancontrol (notice the support for the extra precision because
of the earlier use of bc)

> Also, you are loosing precision because average is calculated (and
> rounded down) first. You could avoid that with "echo $(($average *
> 1000 / $count))" if you check for the $count==0 case. But then that
> doesn't really make much of a difference, so I am not sure if it
> would be worth it either.

I don't see any precession loss. There would be precession loss with the
previous suggestions, maybe I am seeing it wrong :D

> Might be better to add a startup script in /etc/init.d and/or
> /etc/rc*.d and make sure it runs before fancontrol is started.

True, but I am not going to maintain a starup script, when there is a
useful excising starup script for fan control.

If somebody want they can pick it up and integrate it with fancontrol,
as long I don’t lose temperature precession or the possibility to use
the maximum or average.

With kind regards,

Jelle de Jong
# Company:  PowerCraft Technology
# Author:   Copyright Jelle de Jong <jelledejong@xxxxxxxxxxxxx>
# Note:     Please send me an email if you enhanced the document
# Date:     2010-07-04 / 2010-07-05
# License:  CC-BY-SA

# This document is free documentation; you can redistribute it and/or
# modify it under the terms of the Creative Commons Attribution Share
# Alike as published by the Creative Commons Foundation; either version
# 3.0 of the License, or (at your option) any later version.
#
# This document is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# Creative Commons BY-SA License for more details.
#
# http://creativecommons.org/licenses/by-sa/

#-----------------------------------------------------------------------

apt-get install bc hddtemp file fancontrol

#-----------------------------------------------------------------------

echo '#!/bin/bash -e

# Company:  PowerCraft Technology
# Author:   Copyright Jelle de Jong <jelledejong@xxxxxxxxxxxxx>
# Note:     Please send me an email if you enhanced the script
# Version:  0.0.4
# Date:     2010-07-04 / 2010-07-05

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin/

LC_ALL=C

# set -x
# exec 2>>/var/log/pct-fancontrol-hddtemp.log
# date=$(date)

DISKS="/dev/sd[a-z]"

# located in /var/lib/ so it will be there for fancontrol during boot
LOCATION=/var/lib/pct-fancontrol-hddtemp
FILE_MAX="$LOCATION"/pct-fancontrol-hddtemp-maximum
FILE_AVG="$LOCATION"/pct-fancontrol-hddtemp-average

DEGUG=0

[[ -e $LOCATION ]] || mkdir "$LOCATION"

while true
    do
    temperature=0
    summation=0
    maximum=0
    average=0
    count=0
    for value in $(hddtemp -n $DISKS 2>/dev/null)
    do
        temperature="${value//[!0-9]}"
        ((summation+=$temperature))
        ((count+=1))
        if [ $temperature -gt $maximum ]; then
            maximum=$temperature
        fi
        if [ $DEGUG = 1 ]; then
            average=$(echo "scale=1; $summation / $count" | bc)
            echo $summation
            echo $maximum
            echo $average
            echo $count
            echo "-----"
        fi
    done
    average=$(echo "scale=1; $summation / $count" | bc)
    # fancontrol output format
    echo "($maximum * 1000)/1" | bc > "$FILE_MAX"
    echo "($average * 1000)/1" | bc > "$FILE_AVG"
    sleep 45
done

exit' | tee /usr/local/bin/pct-fancontrol-hddtemp

chown root:root /usr/local/bin/pct-fancontrol-hddtemp
chmod 755 /usr/local/bin/pct-fancontrol-hddtemp
ls -hal /usr/local/bin/pct-fancontrol-hddtemp
cat /usr/local/bin/pct-fancontrol-hddtemp

#-----------------------------------------------------------------------

bash -x /usr/local/bin/pct-fancontrol-hddtemp
/usr/local/bin/pct-fancontrol-hddtemp &
cat /var/lib/pct-fancontrol-hddtemp/pct-fancontrol-hddtemp-maximum
cat /var/lib/pct-fancontrol-hddtemp/pct-fancontrol-hddtemp-average
cat /var/lib/pct-fancontrol-hddtemp/*

watch cat /var/lib/pct-fancontrol-hddtemp/*

#-----------------------------------------------------------------------

vim /etc/fancontrol
    INTERVAL=10
    DEVPATH=hwmon0=devices/platform/it87.552
    DEVNAME=hwmon0=it8720
    FCTEMPS=hwmon0/device/pwm2=/var/lib/pct-fancontrol-hddtemp/pct-fancontrol-hddtemp-maximum hwmon0/device/pwm1=hwmon0/device/temp2_input
    FCFANS=hwmon0/device/pwm2=hwmon0/device/fan2_input hwmon0/device/pwm1=hwmon0/device/fan1_input
    MINTEMP=hwmon0/device/pwm2=41 hwmon0/device/pwm1=35
    MAXTEMP=hwmon0/device/pwm2=51 hwmon0/device/pwm1=55
    MINSTART=hwmon0/device/pwm2=58 hwmon0/device/pwm1=70
    MINSTOP=hwmon0/device/pwm2=58 hwmon0/device/pwm1=66

/etc/init.d/fancontrol restart

#-----------------------------------------------------------------------

/etc/init.d/fancontrol stop

whereis fancontrol
file /usr/sbin/fancontrol

bash -x /usr/sbin/fancontrol

#-----------------------------------------------------------------------

vim /etc/rc.local
    /usr/local/bin/pct-fancontrol-hddtemp

cat /etc/rc.local

#-----------------------------------------------------------------------

ps aux | grep fancontrol

#-----------------------------------------------------------------------
_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux