DNS-323 Case Fan: Hardware Version A1

Fan Photos - In Context:

Variable-Speed Fan Details:

Specifications

Model ADDA AD0405HB-G73
Dimensions 40mm x 40mm x 10mm
Voltage 5 volts dc
Current 0.25 amperes
Bearing Type Ball
Blades 7
Wires 3 wires (black - GND),(red - +V [+5 volts?] ),(white - RPM Signal)

Motor Protective circuit & third lead wire by IC w/ speed sensor (FG)
Source: ADDA Model Numbering Scheme.

Extrapolated Specifications*

Speed 6000 rpm (revolutions per minute)
Airflow 6.7 cfm
Pressure 0.100 in (inches)
Sound 25dB/A
Weight 24 grams
Power 1.25 Watts

Extrapolated from:
Source: ADDA Model Numbering Scheme.
Source: ADDA Fan Specification Chart.

* Model Number decoder indicates that the AD0405HB-G72 and AD0405HB-G73 are identical excluding the inclusion of the speed sensor and exclusion of the alarm.

Fan/Cooling Hacks/Mods

  • A simple fan control script that turns off the fan at idle/low temperatures, which otherwise will run constantly by default.
  • Cut out the protective piece of plastic from the back plate, enlarged the opening, added some padding. After that the unit is MUCH quieter
    ondro727's Fan Hack

Fan/Cooling Forum Posts

Related Software/Commands

fanspeed

Fan speed control for a1 and b1 hardware board:

Query and set the FAN Speed control
Usage: fanspeed [function]

Functions:
h show this help
w rpm, set fan speed(rpm range:1935~30000)
g get fan speed

Fanspeed control for c1 hardware board (firmware 1.08):

fanspeed - query and set the FAN Speed control

Usage: fanspeed [function]

Functions:
 h 	high speed(7000rpm)
 l 	low speed(2700rpm) 
 s 	stop fan 
 g 	get fan status
 	 the below option only support in a1 and b1 hardware board  
 w rpm,	set fan speed(rpm range:0 for stop, 2700~7000) 

Examples:

fanspeed g

Returns the fan's current speed in rpm (revolutions per minute).

fanspeed w 2500

Sets the fan's speed to 2,500 rpm.

fanspeed w 0

Sets the fan's speed to 0 rpm (Stops the fan). The fancontrol process appears to restart the fan within a minute if it's running.

fanspeed w 30000

Warnings:

  • It has been reported that the fan doesn't spin faster than 6,301 rpm, regardless of the set fan speed.
  • fanspeed w rpm does not work with C1 hardware board (see label, bottom of hardware). Please test your hardware since the script below will not work. A script that could work is here.

Questions:

  • What are the best ways to detect if the hard drive is in sleep mode (for use in a script)?
  • Does anyone have the source?

File Location:

\sys\crfs\sbin\fanspeed

temperature

Query and set the temperature sensor
Usage: temperature [function]

Functions:
h - show this help
w [1,2] degree - set temperature degree in register 1:Thyst 2:Tos
g [0~2] - get temperature in register 0:temperature 1:Thyst 2:Tos
Examples:
temperature g 0

Returns the current temperature. Anybody know where the temperature probe is located?

temperature g 1

Returns the hysteresis Thyst register value/limit. Default setting = 75 degrees C / 167 degrees F.

temperature g 2

Returns the Overtemp shutdown Tos register value/threshold. Default setting = 80 degrees C / 176 degrees F.

Questions:

  • Does anyone have the source? (reverse engineered code: http://www.inreto.de/dns323/utils/)
  • Is documentation essentially right?: Thyst & Tos Information - found by @galf
  • Does anyone know whether 'temperature g 0' ever reports in Celsius? The wiki's first script seems to think so, but reports so far seem to point to the usage of Fahrenheit as standard. –Yes, it reports in Celsius (in Sweden) (It seems to follow the C/F setting in the web-config's Email-alerts)

File Location:

\sys\crfs\sbin\temperature

fancontrol

Appears to be a daemon, running all the time by default.

Questions:

  • It appears to query the temperature and set appropriate fan speeds approximately every 60 seconds.
  • Does anyone know what it does, exactly?
  • Does anyone have the source? (reverse engineered code: http://www.inreto.de/dns323/utils/)

File Location:

\sys\crfs\sbin\fancontrol

Fan Control Scripts:

Simple steps to install the fan control script

I hope this can be useful to you as it would to me as a newbie who is technically challenged.

The script (contributed by a collaboration of members here) replaces the factory fan control process, checks for case temperature at set regular intervals and modify fan rotational speed in a positive ratio When drives spin down at idle, the fan will stop as the box temperature lowers to a user defined value. This is a feature that should have been implemented by the D-Link firmware (but isn't), as it makes no sense to have the fan running all the time. It's quite simple to do, and it effectively reduces noise and wear. Please feel free to make corrections.

The Quick and Easy

(In script fun_plug variable PATH haven't been set correctly. Correct line is:

   PATH=${PATH}:${BINDIR} 

Somehow device store system variables, so incorrectly set it can cause improper functioning even if you reset device to factory default, or even reburn firmware. In script fan_control.sh we have to add another line:

   export PATH

right next after PATH declaration line. After these changes HD usage and heat generation of the device dropped dramatically. Another suggestion set temeratures T1 and T2, 97F and 105F accordingly.)

  • Open the .rar archive (use WinRAR), drop the four files in the archive into your root folder (e.g. /Volume_1/) via ftp or just by simple drag and drop. Reboot immediately.
  • After the power light stops blinking, wait one minute. Then telnet into your unit's local IP (default is 192.168.0.32) using a telnet/ssh client (try PuTTY) and type
   temperature g 0

to check your DNS-323's temperature readings.

  • If the temperature shows Fahrenheit unit, you are done (you may also type
     rm /mnt/HD_a2/ctrl_fanspeed.C

in telnet to delete the Celsius version script). If it's below 108F, the fan should have stopped. You can type

   fanspeed g

to check the fan RPM.

  • If the temperature shows in Celsius, in the same telnet screen, type:
   mv /mnt/HD_a2/ctrl_fanspeed.C /mnt/HD_a2/ctrl_fanspeed.sh
   reboot

The last command of course reboots your unit. After which you can recheck the temperature and fan. If it's below 43C, the fan should have stopped, and you are done. Warning: it's imperative that you follow through steps 3, 4, and 5 to verify temperature units, as the fan may never run if you have the wrong numbers feeding the script, possibly resulting in heat damage to hardware. If you encountered problems and must abort, just remove ctrl_fanspeed.sh from your root directory to reset factory fan control settings.

The Nitty Gritty Steps

  1. Get a text editor like Notepad++ to save text files in linux format (LF).
  2. Create a new text file called fun_plug (no extensions), with the following line:
    /mnt/HD_a2/ctrl_fanspeed.sh

save the text file with linux format (LF) to the root directory of your DNS-323 drive (e.g. /Volume_1/ or just drag and drop into your mapped drive).
Alternatively, you can get fonz's fun_plug pack (which adds telnet feature among other things) and add the above line at the end of the included fun_plug file (don't drop it into /mnt/HD_a2/fun_plug.d/start/ directory as it's a loop that stops any script that follows it from loading), or use the folowing lines at the end of the fun_plug file:

# run fanspeed
controller script
 
FAN_SPEED=/mnt/HD_a2/ctrl_fanspeed.sh
if [ -x $FAN_SPEED ]; then
	echo "* Running $FAN_SPEED ..."
	$FAN_SPEED &
	echo "* OK"
fi
 
  - Create another text file, copy and paste the "general use" version of the fan-control script below. Adjust the parameters
to your liking (description in comments), though it works fine without any modification (assuming your unit reports temperature
in Fahrenheit). Save the file as ctrl_fanspeed.sh at the root directory (e.g. /Volume_1/) of your DNS-323 drive, same location
as the fun_plug file.
  - Reboot the DNS-323 using D-Link's control page and you are done!
 
You should notice that immediately after booting (when the power light stops flashing) the fan stops. That is if your drive is
cooler than the lower limit set in the script (default 108F or 42C), which will eventually be the case after HD spins down at idle,
or if you boot the unit cold.
 
Also make sure your DNS-323 unit reports temperature readings that matches the temperature unit in the script, which is
in Fahrenheit (Important! You don't want 108C as lower limit!). You can do this with a simple [[howto:telnet|telnet]]
command ''temperature g 0''. You will need to convert the temperature parameters in the script if your DNS-323 returns
temperature readings in Celsius.
 
Is it safe to assume all US models are reporting in Fahrenheit? Mine does.
 
==== ctrl_fanspeed.sh ====
 
This sample script changes the speed of the fan based on the reported temperature. Note that this script is written with temperature reference in Celsius. By running ''temperature g 0'' via [[http://wiki.dns323.info/howto:telnet|telnet]] you can see what temperature-unit your box uses. The parameter-values are only given as examples.
 
The script can be run in the background where it will remain active and periodically update the speed of the fan. To avoid clashes with the fancontrol process, it is probably best to kill it before this script is run. 
 
<code bash>
#!/bin/sh
#
# ctrl_fanspeed.sh  Script for controlling the speed of the fan on an DNS-323
#
#At temperatures below T1 it sets the fan to RPM1, while at temperatures above T2 it sets it to RPM2. 
#At temperatures between T1 and T2 it linearly interpolates the speed of the fan from RPM1 at T1, to RPM2 at T2. 
#The temperature is checked every INTERVAL seconds.
 
INTERVAL=15
T1=40
T2=60
RPM1=1000
RPM2=6000
 
while [ 1 ]
do
  T=`temperature g 0|sed -n ' s/<temperaturertc>: get temperature =//p'`
  NEW_RPM=`expr  \( $T \> $T2 \) \* $RPM2 \| \( $T \< $T1 \) \* $RPM1  \| $RPM1 + \( $RPM2 - $RPM1 \) \* \( $T - $T1 \) \/ \( $T2 - $T1 \)` 
  fanspeed w $NEW_RPM 
  sleep $INTERVAL
done

A general use ctrl_fanspeed.sh script

This script automatically kills the factory fancontrol process and loads the script into RAM disk, so to avoid periodic disk spin-ups as the script runs continuously. You can also comment-out (adding # in front of) the 3 lines following # Create a logfile on the RAM-disk as well as every line that starts with echo to turn off logging. This script is written with temperature reported in Fahrenheit. You will have to convert the T1/T2 parameter values if your unit reports in Celsius.

It's a more polished example of a script to control fan speeds. Please read through the thread Fan does run all the time before you install this script.

#!/bin/sh
#
# This script was created at http://wiki.dns323.info by FIB,
# it has been slightly modified by leper (with help from
# fonz). It sets the fanspeed of the device depending on 
# the temperature, which is measured in Fahrenheit. If 
# your box measures temperature in Celsius, you need to 
# edit it to work.
# Additional changes by gartylad.
# Uriel : corrected zero fanspeed when T exceeded T2
#         minor code updates
 
# Set the path to use RAM-disk instead of harddrive, to 
# execute from. This is done so that the disks will go
# into sleep mode, while the script is running.
PATH=/usr/bin:/bin:/usr/sbin:/sbin
 
# Create a logfile on the RAM-disk.
LOGDIR=/log
FANLOGFILE=${LOGDIR}/fan_ctrl.log
mkdir -p ${LOGDIR}
 
echo "Installing fan_ctrl.sh" >${FANLOGFILE}
 
# Kill the old fancontrol process if required
OLDPID=`pidof fancontrol`
if [ "$OLDPID" != "" ]
then
  kill -9 $OLDPID
  echo "killed old fancontrol process ($OLPID)" >>${FANLOGFILE}
fi
 
 
 
# With temps between T1 and T2, the script automatically
# lowers/raises the fan speed between RPM1 and RPM2. This
# it does every update_interval seconds.
update_interval=60
T1=108
T2=140
RPM1=2300
RPM2=4500
RPM3=15000
DRPM_DT=`expr \( $RPM2 - $RPM1 \) / \( $T2 - $T1 \)`
 
 
while [ 1 ]
do
  T=`temperature g 0`
  T=${T##*=}
 
  # Check if temperature has fallen below T1 value
  if [ $T -lt $T1 ]; then
    # Temp below T1 fan stops
    NEWRPM=0
  elif [ $T -gt $T2 ]; then
    # Temp greater than T2 requires emergency action
    NEWRPM=$RPM3
  else
    # Compute new RPMs if in T1..T2 range
    NEWRPM=`expr $RPM1 + \( \( $T - $T1 \) \* $DRPM_DT \)`
  fi
 
 
  CONVFTOC=`expr \( \( $T - 32 \) \* 10 + 9 \) \/ 18`
  fanspeed w $NEWRPM  
  echo `date`" ::CURRENT::" $T"F" ${CONVFTOC}"C -- fanspeed:" $NEWRPM "(written to "${FANLOGFILE}")." >>${FANLOGFILE}
  # wait for next cycle
  sleep $update_interval
done

If you are using ffp, you may save the script above as /ffp/bin/fan_ctrl.sh and create an additional script /ffp/start/fan.sh to auto-start your fan control script when the ffp initializes.

#!/ffp/bin/sh
 
# PROVIDE: fan_ctrl.sh
# REQUIRE: LOGIN
 
. /ffp/etc/ffp.subr
 
name="fan_ctrl.sh"
command="/ffp/bin/$name"
sshd_flags=
 
start_cmd="fan_ctrl_start"
 
fan_ctrl_start()
{
        proc_start_bg $command
}
 
run_rc_command "$1"

Other Reference:


Navigation

Personal Tools