Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Simple fan speed control for the Firebox X750e

    Hardware
    12
    87
    33.8k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      Steve Evans
      last edited by

      Most of the time my newly commissioned X750e is doing very little, and so can get by without much cooling, but of course now and again I do actually use it and want to up the cooling. I therefore wrote the following very simple pair of scripts to provide automatic fan speed control.

      The first script is a demon which should be located at /usr/local/sbin/fanctrld.sh with execute permissions. This relies on WGXepc having been installed in /usr/local/bin.

      If the CPU temperature is above the defined set temperature of 60 degC the green LED on the front of the box will flash. Once it's at or below that temperature the LED will show solid green.

      #!/bin/sh
      # Regulate the CPU temperature to the set temperature. The green
      # front panel LED will flash green if the fan speed is being raised
      # to control the temperature and will be set green once the desired
      # temperature is achieved.
      
      # Target temperature
      target=60
      
      # Initial fan setting
      fan=20
      
      # Loop, adjusting the fan speed
      while true
      do
              mb_temp=`mbmon -I -T1 -c1 | cut -d '.' -f 1`
              cpu_temp=`mbmon -I -T2 -c1 | cut -d '.' -f 1`
      
              difference=$(($cpu_temp-$target))
      
              # Indicate if the temperature is too high or low
              if [ $difference -gt 0 ]
              then /usr/local/bin/WGXepc -l green_flash > /dev/null
              else
              /usr/local/bin/WGXepc -l green > /dev/null
              fi
              fan=$(($fan+$difference))
      
              # Limit max fan control to 255
              if [ $fan -gt 255 ]
              then fan=255
              fi
      
              # Limit min fan control to 0
              if [ $fan -lt 5 ]
              then fan=5
              fi
      
              # Adjust the fan speed
              /usr/local/bin/WGXepc -f `printf "%x\n" $fan` > /dev/null
      
              # Display the temperatures and fan setting
              # echo CPU:$cpu_temp MB:$mb_temp fan:$fan
      
              # Sleep allowing for heat-soak
              sleep 5
      done
      

      And then there's the startup script in /usr/local/etc/rc.d/fanctrl.sh.

      #!/bin/sh
      
      rc_start() {
              if [ `pgrep -f fanctrld.sh` ];then
                      pkill -f fanctrld.sh
                      sleep 1
              fi
              /usr/local/sbin/fanctrld.sh &
      }
      
      rc_stop() {
              if [ `pgrep -f fanctrld.sh` ];then
                      pkill -f fanctrld.sh
                      sleep 1
              fi
      }
      
      case $1 in
              start)
                      rc_start
                      ;;
              stop)
                      rc_stop
                      /usr/local/bin/WGXepc -f ff > /dev/null
                      ;;
              restart)
                      rc_stop
                      rc_start
                      ;;
      esac
      

      I hope somebody finds this of use.

      Steve

      1 Reply Last reply Reply Quote 0
      • S
        Steve Evans
        last edited by

        After some experimentation I found that the Pentium 5 M, which is good for 100 degC, is easy to cool to 64 degC at under max fan speed and at Gbps load. I've therefore modified the daemon script to attempt to maintain that. I've also put in a check for bogus temperatures as if mbmon fails I don't want to cook my CPU!

        #!/bin/sh
        # Regulate the CPU temperature to the set temperature. The green
        # front panel LED will flash green if the fan speed is being raised
        # to control the temperature and will be set green once the desired
        # temperature is achieved.
        
        # Target temperature
        target=64
        min_temp=40
        gain=5
        delay=2
        
        # Initial fan setting
        fan=20
        
        # Loop, adjusting the fan speed
        while true
        do
        	#mb_temp=`mbmon -I -T1 -c1 | cut -d '.' -f 1`
        	cpu_temp=`mbmon -I -T2 -c1 | cut -d '.' -f 1`
        
        	# Drop out if the temperature looks bogus to prevent overheating
        	if [ $cpu_temp -lt $min_temp ]
        	then
        		/usr/local/bin/WGXepc -f ff > /dev/null
        		/usr/local/bin/WGXepc -l red_flash > /dev/null
        		break
        	fi
        
        	difference=$(($cpu_temp-$target))
        
        	# Indicate if the temperature is too high or low
        	if [ $difference -gt 0 ]
        	then /usr/local/bin/WGXepc -l green_flash > /dev/null
        	else
        	/usr/local/bin/WGXepc -l green > /dev/null
        	fi
        	fan=$(($fan+($gain*$difference)))
        
        	# Limit max fan control to 255
        	if [ $fan -gt 255 ]
        	then fan=255
        	fi
        
        	# Limit min fan control to 0
        	if [ $fan -lt 5 ]
        	then fan=5
        	fi
        
        	# Adjust the fan speed
        	/usr/local/bin/WGXepc -f `printf "%x\n" $fan` > /dev/null
        
        	# Display the temperatures and fan setting
        	#echo CPU:$cpu_temp MB:$mb_temp fan:$fan
        
        	# Sleep allowing for heat-soak
        	sleep $delay
        done
        

        Steve

        1 Reply Last reply Reply Quote 0
        • stephenw10S
          stephenw10 Netgate Administrator
          last edited by

          @Steve:

          I've also put in a check for bogus temperatures as if mbmon fails I don't want to cook my CPU!

          Good job. Did you read the other similar thread?
          http://forum.pfsense.org/index.php/topic,63240.0.html

          It seems as though mbmon will eventually fail or the SuperIO chip eventually locks into some odd mode. I added an option to WGXepc to read the temperature directly (mbmon reads every sensor value every time) but it didn't help.

          Fortunately it fails to 127°C so the fans just go to max.

          I'll be interested in your results from this. It could be just a bad SuperIO chip or thermistor in Bigramon's box.

          Steve

          1 Reply Last reply Reply Quote 0
          • S
            Steve Evans
            last edited by

            Hi Steve,

            Your new WGXepc is reading temperature just fine using

            WGXepc -t | sed '1,2d'
            

            I'll let you know if it goes wrong!

            Steve

            1 Reply Last reply Reply Quote 0
            • S
              Steve Evans
              last edited by

              This has been working reliably for some time, so having just updated to 2.1 and re-applied this fix I though I might as well post a complete set of files.

              Rename the attachment to lose the .png suffix and decompress. You'll find the following files. Copy them to the directory shown. Ensure that the sh files and WGXepc are executable.

              | Filename | Target Directory |
              | fanctrl.sh | /usr/local/etc/rc.d |
              | fanctrld.sh | /usr/local/sbin |
              | functions.inc.php | /usr/local/www/includes |
              | system_information.widget.php | /usr/local/www/widgets/widgets |
              | WGXepc | /usr/local/bin |

              Start the fan control thus, or simply reboot:

              # /usr/local/etc/rc.d/fanctrl.sh
              

              You should hear the fans slow considerably. The daemon will try to maintain the set temperature of 64 degC. After some experimentation I found this to work well.

              Credit is due here to stephenw10 for the WGXepc utility. Note that he's produced a couple of versions, and you need this one as it reports temperature.

              The php scripts will read the CPU temperature and display it on the dashboard as the attached image.

              Steve

              ![Screen Shot 2013-09-22 at 16.36.26.png](/public/imported_attachments/1/Screen Shot 2013-09-22 at 16.36.26.png)
              ![Screen Shot 2013-09-22 at 16.36.26.png_thumb](/public/imported_attachments/1/Screen Shot 2013-09-22 at 16.36.26.png_thumb)
              WatchGuardX750e.zip.png

              1 Reply Last reply Reply Quote 0
              • chpalmerC
                chpalmer
                last edited by

                Thanks Steve!  Working great here.  :)

                Triggering snowflakes one by one..
                Intel(R) Core(TM) i5-4590T CPU @ 2.00GHz on an M400 WG box.

                1 Reply Last reply Reply Quote 0
                • F
                  frosty
                  last edited by

                  Should running WGXepc -f display the current fan speed that is set by the script? I had been running the fans around 60 and figured this would be a better way to control the cooling. When I started the fan control the fans shot up in speed and seemed to stay there. Temps were running around 50ish with the fans on 60. They weren't much lower after starting the script and never seemed to adjust down.

                  Its quite possible I did something wrong.

                  1 Reply Last reply Reply Quote 0
                  • chpalmerC
                    chpalmer
                    last edited by

                    Everything except instructions on how to make the files executable are on this page in case it got confusing…

                    It wont hurt to try it again.  Id install the filemanager package and use that to verify files...

                    https://forum.pfsense.org/index.php/topic,66129.msg366219.html#msg366219

                    https://doc.pfsense.org/index.php/PfSense_on_Watchguard_Firebox#Controlling_hardware_with_WGXepc

                    You should barely be able to hear the fans.

                    Triggering snowflakes one by one..
                    Intel(R) Core(TM) i5-4590T CPU @ 2.00GHz on an M400 WG box.

                    1 Reply Last reply Reply Quote 0
                    • S
                      Steve Evans
                      last edited by

                      @chpalmer:

                      Everything except instructions on how to make the files executable are on this page in case it got confusing…

                      It wont hurt to try it again.  Id install the filemanager package and use that to verify files...

                      https://forum.pfsense.org/index.php/topic,66129.msg366219.html#msg366219

                      https://doc.pfsense.org/index.php/PfSense_on_Watchguard_Firebox#Controlling_hardware_with_WGXepc

                      You should barely be able to hear the fans.

                      With the temperature at 50 the fans will be reduced to the minimum speed if everything was installed correctly. Did you make the scripts executable?

                      Steve

                      1 Reply Last reply Reply Quote 0
                      • F
                        frosty
                        last edited by

                        @Steve:

                        @chpalmer:

                        Everything except instructions on how to make the files executable are on this page in case it got confusing…

                        It wont hurt to try it again.  Id install the filemanager package and use that to verify files...

                        https://forum.pfsense.org/index.php/topic,66129.msg366219.html#msg366219

                        https://doc.pfsense.org/index.php/PfSense_on_Watchguard_Firebox#Controlling_hardware_with_WGXepc

                        You should barely be able to hear the fans.

                        With the temperature at 50 the fans will be reduced to the minimum speed if everything was installed correctly. Did you make the scripts executable?

                        Steve

                        Chmod +x on both .sh files and WGXepc. I tried chmod 0755 as well.

                        I guess I should first start by saying I'm trying this on a Firebox X550e. I assume the hardware is similar enough for this to work. The box has only been up and running for a couple of days now and I had WGXepc working and controlling the fans manually until I saw this thread today and figured I'd try it.

                        I installed the files again and this time when I ran /usr/local/etc/rc.d/fanctrl.sh it didnt change the manual fan speed of 55 I had previously set. The first time I tried this the fans shot up to ff and stayed there. They are now running at 55 without any change, at least according to WGXepc -f. I assumed, which might be the problem, that running that command after fanctrl.sh would show you the current fan speed. I have not noticed a drop in fan speed sound since running fanctrl.sh.

                        I have not tried a reboot as of yet.

                        1 Reply Last reply Reply Quote 0
                        • chpalmerC
                          chpalmer
                          last edited by

                          If you pull up the widget does it show the temperature or something else?

                          edit=  Ill say that I tried to make it work with the copy of WGXepc that I had which I thought was the same and found it was wrong.

                          Use the copy that comes in Steves zip file.

                          Triggering snowflakes one by one..
                          Intel(R) Core(TM) i5-4590T CPU @ 2.00GHz on an M400 WG box.

                          1 Reply Last reply Reply Quote 0
                          • F
                            frosty
                            last edited by

                            @chpalmer:

                            If you pull up the widget does it show the temperature or something else?

                            edit=  Ill say that I tried to make it work with the copy of WGXepc that I had which I thought was the same and found it was wrong.

                            Use the copy that comes in Steves zip file.

                            It shows the temperature.

                            I tried the version I had installed as well and it said that WGXepc could accept multiple values or something along those lines. I figured that might be the problem so I used the one in the zip file before my first post just to make sure.

                            1 Reply Last reply Reply Quote 0
                            • chpalmerC
                              chpalmer
                              last edited by

                              Are you still using commands in shellcmd or other to set fan speeds manually?

                              Triggering snowflakes one by one..
                              Intel(R) Core(TM) i5-4590T CPU @ 2.00GHz on an M400 WG box.

                              1 Reply Last reply Reply Quote 0
                              • F
                                frosty
                                last edited by

                                @chpalmer:

                                Are you still using commands in shellcmd or other to set fan speeds manually?

                                Nothing in shellcmd currently. I set it manually at the command line after first trying the fanctrl.sh command and the fan shot up to ff. But its only been set at the command line.

                                I did try setting it back to ff manually and running fanctrl.sh with no noticeable drop in speed. I didnt look to see if there was a "reset to factory" for the fan speed.

                                1 Reply Last reply Reply Quote 0
                                • stephenw10S
                                  stephenw10 Netgate Administrator
                                  last edited by

                                  Try running WGXepc -t to read the temperature.
                                  If you look at the thread I linked earlier you'll see that the SuperIO chip (which has the sensor) has a habit of erroneously reporting 125C after some time. If you haven't rebooted that box for while it could just be reporting wrong.

                                  Steve

                                  1 Reply Last reply Reply Quote 0
                                  • F
                                    frosty
                                    last edited by

                                    @stephenw10:

                                    Try running WGXepc -t to read the temperature.
                                    If you look at the thread I linked earlier you'll see that the SuperIO chip (which has the sensor) has a habit of erroneously reporting 125C after some time. If you haven't rebooted that box for while it could just be reporting wrong.

                                    Steve

                                    I checked that earlier and it was the same as the gui/widget and mbmon. Firewall has only been up 3 days but I'll give it a reboot and see what happens.

                                    1 Reply Last reply Reply Quote 0
                                    • F
                                      frosty
                                      last edited by

                                      Reboot did the trick, thanks for the help. Probably should have tried that first.

                                      1 Reply Last reply Reply Quote 0
                                      • S
                                        Steve Evans
                                        last edited by

                                        Just spotted the error. In my post I had the following instruction to start the fan control:

                                        # /usr/local/etc/rc.d/fanctrl.sh
                                        

                                        This is wrong. It should be:

                                        # /usr/local/etc/rc.d/fanctrl.sh start
                                        

                                        You can stop the daemon, and return the fans to full speed with the following:

                                        # /usr/local/etc/rc.d/fanctrl.sh stop
                                        

                                        Sorry about that.

                                        Steve

                                        1 Reply Last reply Reply Quote 0
                                        • F
                                          frosty
                                          last edited by

                                          I actually tried this

                                          # /usr/local/etc/rc.d/fanctrl.sh stop
                                          

                                          but didnt notice a change which makes sense because it sets the fans back to full speed where they already where.

                                          Thanks for putting this together, I like it better than manually setting the fan speed.

                                          1 Reply Last reply Reply Quote 0
                                          • stephenw10S
                                            stephenw10 Netgate Administrator
                                            last edited by

                                            Any idea what speed the fans average out at when the script is running?
                                            I guess it would be very dependent on ambient temperature and cpu load but it would be interesting to hear any anecdotal evidence.

                                            Steve

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.