Temperature Widget



  • The new temperature widget is a nice addition, but it would be great if we could select the temperature source. hw.acpi.thermal.tz0.temperature is always 26.8C on one of the pfSense systems I'm running, but hw.acpi.thermal.tz1.temperature is the correct CPU temperature (currently 34.0C) as reported in the BIOS.



  • Hi - this sounds like a not so complex task which i should be able to take care of. (learning js/jquery atm)

    But on my vmware a sysctl hw.acpi.thermal shows no results, so i need  asecond machine to test on.
    Maybe thats why i have no such widget in the dashboard ? :)

    Hmm… but even in /usr/local/www/widgets/widgets is no file called temperature widget... is it really called like that ?
    (running head from last friday)



  • Sorry, it's a new part of the System Information widget, not it's own widget.



  • ah - then i have some point to start :)
    Will hav look in the next days!



  • okay gotit - the widget fetches the information from functions.inc.php

    • i see that you want to query another temperatureZone (1)
      when querying the cpu0 themperature gets us an empty string, (so meaning that the query failed)…
      pfSense queries tz(0) which should be accessible on all systems that support temperature measuring.

    see:

    
      if ($temp_out == "") {
               exec("/sbin/sysctl hw.acpi.thermal.tz0.temperature | /usr/bin/awk '{ print $2 }' | /usr/bin/cut -d 'C' -f 1", $dfout);
       	   $temp_out = trim($dfout[0]);
             }
    
    
    • Looking at the code - i have a question to pfSense Devs
      There is a reference to get_hw_type, which seems to be planned to sense systemspecific things in the future to use corresponding values…  But its currently empty. It might be reasonable to add the oid as a tunable and use dev.cpu0.temperature as a fallback.
      Would this be an acceptable solution?

    anyway heres an example functions.inc

    
    	if (isset($a_config["hw.temperature.oid"])) {
            	$oid_temp = $a_config["hw.temperature.oid"];
            }
    
            if ($oid_temp == "default" || $oid_temp == "") {
                    $oid_temp = "dev.cpu.0.temperature"; //<- fixme: use this as a fallback and  hw.acpi.thermal.tz0.temperature  as default ?
    	}
    
             $temp_out = "";
             if ($oid_temp != "") {
               $oid_temp = escapeshellcmd($oid_temp);
               exec("/sbin/sysctl '{ print $oid_temp} ' | /usr/bin/awk '{ print $2 }' | /usr/bin/cut -d 'C' -f 1", $dfout);
             }
    
    

    –--------
    example config.inc

    
     <tunable>hw.temperature.oid</tunable>
                            <value>default</value> 
    
    

    –--------

    oh and please dont bash me too much if i got this wrong ;))



  • I am not familiar with BSD at all, all I know is on my board, tz0 is always 26.8 (that's what's reported in the webgui) and tz1 is the actual CPU temp…



  • Where is the temperature supposed to show up? Can't find it in the system status widget. Or does it show only on certain systems and not on others?



  • It shows up between MBUF Usage and CPU Usage for me. But it always reads 26.8C (which is what tz0 reads, tz1 has the actual CPU temp) for me.



  • Not every system supports temperature mesuaring.

    You can try to execute sysctl hw.acpi.thermal as shown by
    http://doc.pfsense.org/index.php/What_Hardware_Monitoring_Is_Supported

    If you get an error message, then FreeBSD is not able to fetch the values via acpi and the widget is not shown.



  • Thanks for that link! I'm a total BSD newbie and didn't know I could get all the values like that. Here's the output on my system if it helps any. Again, the 26.8 is meaningless, and the 33 is the real CPU temp:

    [2.1-DEVELOPMENT][admin@glacierfire.glaciercamp]/root(1): sysctl hw.acpi.thermal
    hw.acpi.thermal.min_runtime: 0
    hw.acpi.thermal.polling_rate: 10
    hw.acpi.thermal.user_override: 0
    hw.acpi.thermal.tz0.temperature: 26.8C
    hw.acpi.thermal.tz0.active: 0
    hw.acpi.thermal.tz0.passive_cooling: 1
    hw.acpi.thermal.tz0.thermal_flags: 0
    hw.acpi.thermal.tz0._PSV: 95.0C
    hw.acpi.thermal.tz0._HOT: -1
    hw.acpi.thermal.tz0._CRT: 100.0C
    hw.acpi.thermal.tz0._ACx: 0.0C -1 -1 -1 -1 -1 -1 -1 -1 -1
    hw.acpi.thermal.tz0._TC1: 1
    hw.acpi.thermal.tz0._TC2: 5
    hw.acpi.thermal.tz0._TSP: 10
    hw.acpi.thermal.tz1.temperature: 33.0C
    hw.acpi.thermal.tz1.active: -1
    hw.acpi.thermal.tz1.passive_cooling: 0
    hw.acpi.thermal.tz1.thermal_flags: 0
    hw.acpi.thermal.tz1._PSV: -1
    hw.acpi.thermal.tz1._HOT: -1
    hw.acpi.thermal.tz1._CRT: 120.0C
    hw.acpi.thermal.tz1._ACx: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
    hw.acpi.thermal.tz1._TC1: -1
    hw.acpi.thermal.tz1._TC2: -1
    hw.acpi.thermal.tz1._TSP: -1
    [2.1-DEVELOPMENT][admin@glacierfire.glaciercamp]/root(2):



  • Hi,  i was curious about the reason why cpu0 temperature mesuaring method wont run on some systems.

    I came across
    http://os4.org/wiki/freebsd_-_power-management.html
    where this matter is discussed in more Detail.

    Im pretty sure that we really should first try to query acpi.thermal before querying cpu0 and will adapt the code accordingly.
    Further on, i think about doing a 'sysctl hw.acpi.thermal | grep 'tz.*temperature' before and just display any value there.
    this would also remove the need for the tunable.

    
    [2.1-DEVELOPMENT][admin@pfsense.localdomain]/root(4): grep 'tz.*temperature' acpi_thermal
    hw.acpi.thermal.tz0.temperature: 26.8C
    hw.acpi.thermal.tz1.temperature: 33.0C
    
    


  • That sounds like it'd be a perfect solution, if I understand correctly, it would just show any temperatures that exist - bogus or not, correct?


  • Netgate Administrator

    dev.cpu0.temperature is created by coretemp(4).
    My box has a Core CPU but the ACPI is broken so I have no thermal zones.

    Steve



  • According to intel docs, the Atom D510 has an on-die thermal sensor that can be read.
    Looks like BSD or some BIOS issue prevents that from happening, because the

    sysctl hw.acpi.thermal

    returns zilch. :(
    Hence, of course, no reported temperature. No wonder I can't see it ;)



  • @rcfa:

    According to intel docs, the Atom D510 has an on-die thermal sensor that can be read.
    Looks like BSD or some BIOS issue prevents that from happening, because the

    sysctl hw.acpi.thermal

    returns zilch. :(
    Hence, of course, no reported temperature. No wonder I can't see it ;)

    i'm using a atom d510 also, search the forum; there was a write up on how to install coretemp.ko on the system.



  • Hi,
    afaik acpi was invented after those processor specific extensions were developed.
    by now its available on most platforms and supports more sensors.
    pfSense currently relies on dev.cpu.temperature and uses  ACPI.tz0 as a fallback.
    but only one sensorvalue of them is shown and this might be wrong.

    For this reason i expanded  the code in my tree to ask acpi for all the temp sensors.
    This will give us more options in the GUI, including  to select coretemp when we want.
    Ill post a patch when its ready, so everyone can test it.



  • Netgate Administrator

    For 2.0.1 (FreeBSD 8.1 base).
    Copy coretemp.ko (32bit or 64bit) into /boot/modules
    Add```
    coretemp_load="YES"

    
    I thought these were already in 2.1?  :-\ Hence referencing them in the widget.
    
    Steve

  • Netgate Administrator

    If motherboard manufacturers bothered to code their ACPI tables correctly there wouldn't be a problem!  >:(

    Steve

    Edit: response to a post that vanished.  ::)



  • …repost...
    Hehe, im running on virtualized hardware, so i need to ask my bank to buy a new system which supports the processor specific module ;))
    Anyway, both will be supported bythe widget



  • Steve, are you referring to the FireBox X500?

    Recently my FB X500 fan/blower died and I had to open my X500, put a cpu fan in place of the blower and leave the cover off while I wait for new replacements I ordered off of eBay (from HK of course…) and was wondering if there was a way of enabling such widget for a Celeron 1200Mhz


  • Netgate Administrator

    Nope I was talking about the XTM5.
    You can use the output of mbmon to drive the dashboard widget. We had a long thread up on this for 2.0.X, I'm sure a lot of it would be relevent here.
    http://forum.pfsense.org/index.php/topic,39595.0.html

    And here was my specific post:
    http://forum.pfsense.org/index.php/topic,39595.msg204643.html#msg204643

    Steve



  • ah, informative - ill read that in a minute.

    decided to just post what i got till now:
    The code defaults to dev.cpu0 [as is] but is able to handle multiple acpi temperatures too if that module is used instead.

    
    function get_temp() {
    //  queries thermal sensors via sysctl. 
    // returns array of sensors and their corresponding values
    
            $arr_parsed ="";
            $arr_temp = array();
    
            $filter_acpi = "tz[0-1].temperature";
    
         // escaping for possible inclusion in config.xml
    
            $oid_cpu = escapeshellcmd("dev.cpu0.temperature");
            $oid_acpi = escapeshellcmd("hw.acpi.thermal");
    
         // First, query for a processor specific sensor on the die
             exec("/sbin/sysctl '". $oid_cpu ."' | grep -E 'cpu.*temperature'" , $arr_cpu);
            // exec ("cat /root/temp_cpu | grep -E 'cpu.0.temperature'" , $arr_cpu);
    
             if (arr_cpu != "") {
                  $arr_temp = array_merge($arr_temp,$arr_cpu);
              }
    
         // Alternative: query all acpi thermal zones.
    
               exec ("sysctl ". $oid_temp ." | grep -E '". $filter_acpi ."'" , $arr_acpi);
              // exec ("cat /root/temp_acpi | grep -E '".$filter_acpi."'" , $arr_acpi);
    
              if (arr_acpi != "") {
                  $arr_temp = array_merge($arr_temp,$arr_acpi);
                 }
    
               foreach (($arr_temp) as $value) {
                 preg_match("/tz[0-9]|cpu/i", $value, $sens_id); // get sensor id 
                 preg_match("/[0-9]{1,2}.[0-9]/", $value, $sens_val);   // get temperature value
                 $arr_parsed[] =  array ($sens_id, $sens_val);
               }
    
               return($arr_parsed);
            }
    
    

    is nearly finished now but well see. Anyway, its main purpose is to train me some pfSense gui customisation skills, so no problem for me.
    Heres what its look like by now:




  • So where do we get the coretemp.ko that's compatible with pfSense 2.1 short of building a BSD 8.3 kernel?
    Is this going to end up in the regular distribution at some point or will this remain in the everyone interested hacks it in on their own territory?



  • Oh, its written Source independent (see discussion above) to let the users choose what they want to use.
    Edit:
    Im currently banned from the highspeed World and have to use gprs till eoM.  (:grm:)
    ill sync wt current git and do the commit as soon as my highpriced provider is able to…

    till then here are the other changed functions:

    
    function updateTemp(obj_json) {
    /*  modify the red / grey bar gifs according to the temperature
        ratio is one pixel per degree.
    */
    
            jQuery.map(obj_json,function(value,index){
            tempmeter = "#tempmeter" + value
            tempwidtha = "#tempwidtha" + value
            tempwidthb = "#tempwidthb" + value
            console.log(tempmeter);
    
            jQuery(tempwidthb).css('width',(100 - value[1]) + 'px');
    
            if(jQuery(tempmeter))
                    jQuery(tempmeter).html(value[1] + '\u00B0' + 'C');
            if(jQuery(tempwidtha))
                    jQuery(tempwidtha).css('width',value[1] + 'px');
            if(jQuery(tempwidthb))
            jQuery(tempwidthb).css('width',(100 - value[1]) + 'px');
    
    });
    
    

    and in system_information.widget.php

    
                            Temperature 
    
                                    ![left bar](./themes/<?= $g['theme']; ?>/images/misc/bar_left.gif)![red bar](./themes/<?= $g['theme']; ?>/images/misc/bar_blue.gif)![gray bar](./themes/<?= $g['theme']; ?>/images/misc/bar_gray.gif)![right bar](./themes/<?= $g['theme']; ?>/images/misc/bar_right.gif)
    
    

  • Netgate Administrator

    I don't have 2.1 running on anything right now so I can't check but is it not included in the image? If not it just needs copying from a FreeBSD 8.3 install.

    Steve



  • Any chance of an option for Deg F ? Large numbers of people just never grokked the metric system sadly.  :-\



  • Hi, when the code gets accepted in main, then it will be in the image.
    sorry, for the first run it will stay with degree ;(

    But this patch is just the first of two. A further one, which i plan to be more dynamic and more configurable in the gui will follow.
    By now we have migration phase, where the view is generated by a mix of php and js output)
    In that second patch i plan to seperate them and use php only for the backend and js for the complete system_information.widget
    Edit - no lets keep it easy, just for the temps :)

    But for now - Ill note down a todo for an Option to switch output between Fahrenheit / Degrees ;)

    If you need it faster, you can add code to check for the timezone after the patch has been accepted.

    hanD !



  • Is there any chance to convert this into a package that also installs the coretemp.ko and loads it, because without this won't work on my system, and it being a fanless design, I'd love to know if things go badly in terms of temperature for some reason…



  • @stephenw10:

    Nope I was talking about the XTM5.
    You can use the output of mbmon to drive the dashboard widget. We had a long thread up on this for 2.0.X, I'm sure a lot of it would be relevent here.
    http://forum.pfsense.org/index.php/topic,39595.0.html

    And here was my specific post:
    http://forum.pfsense.org/index.php/topic,39595.msg204643.html#msg204643

    Steve

    Thanks!   :)   I "pkg_add -r mbmon" and at least I can run it in command line.  So I have 3 different "temps" when I run mbmon…

    Temp.= 47.0, 127.0, 79,0; Rot.=   0,   0,   0
    Vcore = 1.49, 3.38; Volt. = 3.31, 4.95, 11.67,  -3.06, -6.12

    If -T3 is the CPU and that's in celcius I think I'm frying my CPU ATM!!  But it's been running forever like this...?

    EDIT 1:
    Ok, T1 is my CPU temp, it went down to 46.0 when I put another fan to help the one I have temporarily.  BTW I modified my functions.inc.php and I now have Temp in my GUI  :D    Thanks again Steve!

    EDIT 2:
    I changed the -I to -i to show integer (no .0 at the end)



  • mbmon doesn't seem to work here
    So I guess I'd need coretemp. Where can we get the required files for that (amd64/BSD 8.3)?



  • @m4f1050:

    If -T3 is the CPU and that's in celcius I think I'm frying my CPU ATM!!  But it's been running forever like this…?

    Even if it was 79, that's fine for most modern CPU's. My MacBook Pro runs about 50-60 in normal use and keeps the fan running about 2000 RPM, but doesn't start ramping up the fan speed until just under 80. Under load, it throttles the fan speed up and down to keep the CPU in the 80-90 range.



  • Depends on if its fahrenheit or celsius too, hehe.

    I see that mbmon is getting much attention and currently we support coretemp and acpi.
    The code generates a source indepent temperature array, so its possible to add mbmon to.
    I will add it as a source. Its not much effort and then everyone is able to to query with his favorite toy in the BE ;)

    –-

    Maybe ill decide do a package too in the future, when i build up enough knowledge to do so, but lets keep the balls down for the moment :)
    After all atm its just a neat patch which adds some sensors.

    Steven posted a link to the coretemp modules here: http://files.pfsense.org/jimp/ko-8.1/amd64/coretemp.ko



  • @ThorstenK:

    Depends on if its fahrenheit or celsius too, hehe.

    AFAIK, every single CPU on the market reads temperature in Celsius.



  • Yes, so im pretty sure that it wont be a good idea to modify the temp widgets code to print them in Fahrenheit or use that as a default. (see discussion above)
    daplumpler: other People may get confused in the beginnings. I dont think we want this happening in such a critical area.


  • Netgate Administrator

    Here is the coretemp module from my FreeBSD install.
    It's an i386 (32bit) module from FreeBSD 8.3 rel. As before:

    @stephenw10:

    Copy coretemp.ko into /boot/modules
    Add```
    coretemp_load="YES"

    I don't have a 64bit install at the moment unfortunately.

    Remove the .png extension.

    Steve

    coretemp.ko.png



  • @ThorstenK:

    Depends on if its fahrenheit or celsius too, hehe.

    I see that mbmon is getting much attention and currently we support coretemp and acpi.
    The code generates a source indepent temperature array, so its possible to add mbmon to.
    I will add it as a source. Its not much effort and then everyone is able to to query with his favorite toy in the BE ;)

    –-

    Maybe ill decide do a package too in the future, when i build up enough knowledge to do so, but lets keep the balls down for the moment :)
    After all atm its just a neat patch which adds some sensors.

    Steven posted a link to the coretemp modules here: http://files.pfsense.org/jimp/ko-8.1/amd64/coretemp.ko

    From what I understand, my T1 is my CPU temp and my T3 is my chipset temp.  I am guessing if it's 127.0 (always at that) that temp is not available.  You can program it to check if it's 127.0 to NOT display it in the GUI…  If they are interested in knowing all the temps and not just the CPU temp..

    BTW I confirmed with my buddy's FB X500 with good fan that he is running T1=45C , T2=127C and T3=77C  (~2C less, so I am good)



  • mmh. I dont think that we really want that. Maybe 127 is 1111111 and so some kind of magic value.
    and "normally" such a high temperature isnt realistic to be ever shown.

    Automatically deactivating a sensor just for convinience isnt a good idea in general.
    It is better to implement a configuration screen (see notes about planned pach 2) which lets the user the decision to select the sensors on a per system base.

    Ill push the implementation to patch 2.



  • @ThorstenK:

    Steven posted a link to the coretemp modules here: http://files.pfsense.org/jimp/ko-8.1/amd64/coretemp.ko

    Yep, but that's for BSD 8.1, but we're running 8.3, AFAIK that's not compatible.



  • Thats right - Please check the last post of Steven. He posted the mod as attachment.



  • @ThorstenK:

    Thats right - Please check the last post of Steven. He posted the mod as attachment.

    Maybe I'm dense, or you're talking about a different Steven than I think you're talking about, but all I can find is a 32-bit version for 8.3, which won't work because I'm running a 64-bit install, and a 64-bit version for 8.1, which won't work because I'm on 8.3


Locked