Advertisement
andrum99

temperaturegraphs.html

Feb 15th, 2015
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <!-- Temperature Monitoring Graphs -->
  3. <!-- by Andrew Pattison -->
  4. <html><head>
  5.     <meta charset="UTF-8">
  6.     <title>Temperature Monitoring</title>
  7.     <link rel="stylesheet" href="../andrew.css" type="text/css">
  8.    
  9.     <!-- start of jqPlot includes -->
  10.     <!--[if lt IE 9]><script language="javascript" type="text/javascript" src="../jqplot/excanvas.js"></script><![endif]-->
  11.     <script language="javascript" type="text/javascript" src="../jqplot/jquery.min.js"></script>
  12.     <script language="javascript" type="text/javascript" src="../jqplot/jquery.jqplot.min.js"></script>
  13.     <link rel="stylesheet" type="text/css" href="../jqplot/jquery.jqplot.css" />
  14.     <!-- end of jqPlot includes -->
  15.     <!-- jqPlot plugins below to enable tooltips, json, dateaxis -->
  16.     <script type="text/javascript" src="../jqplot/plugins/jqplot.highlighter.min.js"></script>
  17.     <script type="text/javascript" src="../jqplot/plugins/jqplot.json2.min.js"></script>
  18.     <script type="text/javascript" src="../jqplot/plugins/jqplot.dateAxisRenderer.min.js"></script>
  19.     <!-- include date.js so we can easily construct a date in the correct format -->
  20.     <script language="javascript" type="text/javascript" src="../date.js"></script>
  21. </head>
  22. <body>
  23.  
  24. <h1>Temperature Monitoring</h1>
  25.  
  26. <div style="font-size:20px; font-weight: bold;">Room Temperature</div>
  27.  
  28.  
  29. <span id="ambientcharttitle" style="font-weight: bold;"></span>
  30. <img src="/images/arrow-bold-left.png" onclick="leftAmbientButton()" style="cursor: pointer">
  31. <img src="/images/arrow-bold-right.png" onclick="rightAmbientButton();" style="cursor: pointer">
  32.  Show:
  33. <select id="ambientrange" onchange="changeAmbientRange()">
  34.     <option value="sixhours">6 Hours</option>
  35.     <option value="oneday" selected="selected">24 Hours</option>
  36.     <option value="sevendays">7 Days</option>
  37. </select>
  38. <span id="ambientgenerated"></span>
  39.  
  40. <!-- div to hold the graph -->
  41. <div id="ambientchart" style="height:300px;width:100%; "></div>
  42.  
  43. <div style="font-size:20px; font-weight: bold;">CPU Temperature</div>
  44.  
  45. <span id="cpucharttitle" style="font-weight: bold;"></span>
  46. <img src="/images/arrow-bold-left.png" onclick="leftcpuButton()" style="cursor: pointer">
  47. <img src="/images/arrow-bold-right.png" onclick="rightcpuButton();" style="cursor: pointer">
  48.  Show:
  49. <select id="cpurange" onchange="changecpuRange()">
  50.     <option value="sixhours">6 Hours</option>
  51.     <option value="oneday" selected="selected">24 Hours</option>
  52.     <option value="sevendays">7 Days</option>
  53. </select>
  54. <span id="cpugenerated"></span>
  55.  
  56.    
  57. <!-- div to hold the graph -->
  58. <div id="cpuchart" style="height:300px;width:100%; "></div>
  59.  
  60. <div style="font-size:20px; font-weight: bold;">Hard Disk Temperature</div>
  61.  
  62. <span id="hddcharttitle" style="font-weight: bold;"></span>
  63. <img src="/images/arrow-bold-left.png" onclick="lefthddButton()" style="cursor: pointer">
  64. <img src="/images/arrow-bold-right.png" onclick="righthddButton();" style="cursor: pointer">
  65.  Show:
  66. <select id="hddrange" onchange="changehddRange()">
  67.     <option value="sixhours">6 Hours</option>
  68.     <option value="oneday" selected="selected">24 Hours</option>
  69.     <option value="sevendays">7 Days</option>
  70. </select>
  71. <span id="hddgenerated"></span>
  72.  
  73. <!-- div to hold the graph -->
  74. <div id="hddchart" style="height:300px;width:100%; "></div>
  75.  
  76. <script language="javascript">
  77.  
  78. // functions for ambient temperature graph
  79.  
  80. function getAmbientRange() {
  81.     var $ambiente = document.getElementById("ambientrange");
  82.     var $value = $ambiente.options[$ambiente.selectedIndex].value;
  83.     var $text = $ambiente.options[$ambiente.selectedIndex].text;
  84.     return($value);
  85. }
  86.  
  87. function addAmbientRange($positive) {
  88.     // jump graph start and end times forwards
  89.     // or backwards by the amount of $range
  90.     // $positive - true for forwards, false for backwards
  91.    
  92.     // find out when now is, so we can clamp end date
  93.     var $n = new Date();
  94.    
  95.     // convert boolean $positive into a multiplier
  96.     if ($positive) $m = 1; else $m = -1;
  97.     switch ($range){
  98.         case "sixhours":
  99.             $ambiente = $ambiente.addHours($m * 6);
  100.             // clamp end datetime to now
  101.             if ($ambiente.valueOf() > $n.valueOf()) $ambiente = new Date();
  102.             $ambients = computeAmbientStart($ambiente);
  103.             return(true);
  104.             break;
  105.         case "oneday":
  106.             $ambiente = $ambiente.addDays($m);
  107.             // clamp end datetime to now
  108.             if ($ambiente.valueOf() > $n.valueOf()) $ambiente = new Date();
  109.             $ambients = computeAmbientStart($ambiente);
  110.             return(true);
  111.             break;
  112.         case "sevendays":
  113.             $ambiente = $ambiente.addDays($m * 7);
  114.             // clamp end datetime to now
  115.             if ($ambiente.valueOf() > $n.valueOf()) $ambiente = new Date();
  116.             $ambients = computeAmbientStart($ambiente);
  117.             return(true);
  118.             break;
  119.         default:
  120.             return(false);
  121.     }
  122. }
  123.  
  124. function clearAmbientChart() {
  125.     document.getElementById("ambientgenerated").textContent = "";
  126.     document.getElementById("ambientcharttitle").textContent = "";
  127.     document.getElementById("ambientchart").textContent = "";
  128. }
  129.  
  130. function leftAmbientButton() {
  131.     // first, get rid of existing graph
  132.     clearAmbientChart();
  133.     addAmbientRange(false);
  134.     doAmbientGraph($ambients, $ambiente);
  135. }
  136.  
  137. function rightAmbientButton() {
  138.     // first, get rid of existing graph
  139.     clearAmbientChart();
  140.     addAmbientRange(true);
  141.     doAmbientGraph($ambients, $ambiente);
  142. }
  143.  
  144. function changeAmbientRange() {
  145.     // update graph in response to user changing
  146.     // which range is selected
  147.     clearAmbientChart();
  148.     $ambients = computeAmbientStart($ambiente);
  149.     doAmbientGraph($ambients, $ambiente);
  150. }
  151.  
  152. function computeAmbientStart($ambientend) {
  153.     // computeStart - find start of graph datetime range
  154.     // based on $range selected, and $ambientend datetime
  155.     // returns - start datetime of range
  156.     $range = getAmbientRange();
  157.     $ambients = new Date($ambiente);
  158.     switch ($range){
  159.         case "sixhours":
  160.             $ambientavg = 1;
  161.             return($ambients.addHours(-6));
  162.             break;
  163.         case "oneday":
  164.             $ambientavg = 2;
  165.             return($ambients.addDays(-1));
  166.             break;
  167.         case "sevendays":
  168.             $ambientavg = 14;
  169.             return($ambients.addDays(-7));
  170.             break;
  171.         default:
  172.             return(false);
  173.     }
  174. }
  175.  
  176. function doAmbientGraph($ambientstart, $ambientend) {
  177.     // $ambientstart - start of datetime range as a Date object
  178.     // $ambientend   - end of datetime range as a Date object
  179.    
  180.     // get current time so we can tell the user
  181.     // when the page was generated
  182.     var $now = new Date()
  183.     var $nowlabel = $now.toString("dd MMM yyyy HH:mm");
  184.     // tell user when page was generated
  185.     document.getElementById("ambientgenerated").textContent = "Graph generated: " + $nowlabel;
  186.    
  187.     // generate datetime strings to pass to script to get data
  188.     // These are in a format that sqlite3 will understand
  189.     var $ambientstartstring = $ambientstart.toString("yyyy-MM-dd HH:mm");
  190.     var $ambientendstring = $ambientend.toString("yyyy-MM-dd HH:mm");
  191.    
  192.     //generate 'friendly' datetime strings for output as graph title
  193.     var $ambientstartlabel = $ambientstart.toString("dd MMM yyyy HH:mm");
  194.     var $ambientendlabel = $ambientend.toString("dd MMM yyyy HH:mm");
  195.    
  196.     // show title outside the graph
  197.     document.getElementById("ambientcharttitle").innerHTML = $ambientstartlabel + " to " + $ambientendlabel;
  198.    
  199.     // check which range is selected
  200.     var $range = getAmbientRange();
  201.    
  202.     // data renderer - calls php script which returns JSON data
  203.     var ajaxDataRenderer = function(url, plot, options) {
  204.         var ret = null;
  205.         $.ajax({
  206.             // have to use synchronous here, else the function
  207.             // will return before the data is fetched
  208.             async: false,
  209.             url: url,
  210.             dataType:"json",
  211.             success: function(data) {
  212.                 ret = data;
  213.             }
  214.         });
  215.         return ret;
  216.     };
  217.  
  218.     // The url for our json data
  219.     var jsonambienturl = "./gettemp.php?start='" + $ambientstartstring + "'&end='" + $ambientendstring + "'&sensor=ambient&range=" + $ambientavg;
  220.    
  221.     // passing in the url string as the jqPlot data argument is a handy
  222.     // shortcut for our renderer.  You could also have used the
  223.     // "dataRendererOptions" option to pass in the url.  
  224.     var plot3 = $.jqplot('ambientchart', jsonambienturl, {
  225.         //title:$ambientstartlabel + '<br> to <br>' + $ambientendlabel,
  226.         axes:{
  227.             xaxis:{
  228.                 renderer:$.jqplot.DateAxisRenderer,
  229.                 tickOptions:{formatString:'%H:%M'},
  230.                 label:'Time',
  231.                 min:$ambientstartstring,
  232.                 max:$ambientendstring
  233.             },
  234.             yaxis:{
  235.                 label:'Temperature (Celsius)'
  236.             }
  237.         },
  238.         highlighter: {
  239.             tooltipLocation: 'n',
  240.             tooltipAxes: 'y',
  241.             tooltipFormatString: '%.2f C',
  242.             useAxesFormatters: false
  243.         },
  244.         dataRenderer: ajaxDataRenderer,
  245.         dataRendererOptions: {
  246.             unusedOptionalUrl: jsonambienturl
  247.         },
  248.         series:[{lineWidth:2, markerOptions:{show:false}}]
  249.     });
  250. }
  251.  
  252. // functions for cpu temperature graph
  253.  
  254. function getcpuRange() {
  255.     var $cpue = document.getElementById("cpurange");
  256.     var $value = $cpue.options[$cpue.selectedIndex].value;
  257.     var $text = $cpue.options[$cpue.selectedIndex].text;
  258.     return($value);
  259. }
  260.  
  261. function addcpuRange($positive) {
  262.     // jump graph start and end times forwards
  263.     // or backwards by the amount of $range
  264.     // $positive - true for forwards, false for backwards
  265.    
  266.     // find out when now is, so we can clamp end date
  267.     var $n = new Date();
  268.    
  269.     // convert boolean $positive into a multiplier
  270.     if ($positive) $m = 1; else $m = -1;
  271.     switch ($range){
  272.         case "sixhours":
  273.             $cpue = $cpue.addHours($m * 6);
  274.             // clamp end datetime to now
  275.             if ($cpue.valueOf() > $n.valueOf()) $cpue = new Date();
  276.             $cpus = computecpuStart($cpue);
  277.             return(true);
  278.             break;
  279.         case "oneday":
  280.             $cpue = $cpue.addDays($m);
  281.             // clamp end datetime to now
  282.             if ($cpue.valueOf() > $n.valueOf()) $cpue = new Date();
  283.             $cpus = computecpuStart($cpue);
  284.             return(true);
  285.             break;
  286.         case "sevendays":
  287.             $cpue = $cpue.addDays($m * 7);
  288.             // clamp end datetime to now
  289.             if ($cpue.valueOf() > $n.valueOf()) $cpue = new Date();
  290.             $cpus = computecpuStart($cpue);
  291.             return(true);
  292.             break;
  293.         default:
  294.             return(false);
  295.     }
  296. }
  297.  
  298. function clearcpuChart() {
  299.     document.getElementById("cpugenerated").textContent = "";
  300.     document.getElementById("cpucharttitle").textContent = "";
  301.     document.getElementById("cpuchart").textContent = "";
  302. }
  303.  
  304. function leftcpuButton() {
  305.     // first, get rid of existing graph
  306.     clearcpuChart();
  307.     addcpuRange(false);
  308.     docpuGraph($cpus, $cpue);
  309. }
  310.  
  311. function rightcpuButton() {
  312.     // first, get rid of existing graph
  313.     clearcpuChart();
  314.     addcpuRange(true);
  315.     docpuGraph($cpus, $cpue);
  316. }
  317.  
  318. function changecpuRange() {
  319.     // update graph in response to user changing
  320.     // which range is selected
  321.     clearcpuChart();
  322.     $cpus = computecpuStart($cpue);
  323.     docpuGraph($cpus, $cpue);
  324. }
  325.  
  326. function computecpuStart($cpuend) {
  327.     // computeStart - find start of graph datetime range
  328.     // based on $range selected, and $cpuend datetime
  329.     // returns - start datetime of range
  330.     $range = getcpuRange();
  331.     $cpus = new Date($cpue);
  332.     switch ($range){
  333.         case "sixhours":
  334.             $cpuavg = 1;
  335.             return($cpus.addHours(-6));
  336.             break;
  337.         case "oneday":
  338.             $cpuavg = 5;
  339.             return($cpus.addDays(-1));
  340.             break;
  341.         case "sevendays":
  342.             $cpuavg = 14;
  343.             return($cpus.addDays(-7));
  344.             break;
  345.         default:
  346.             return(false);
  347.     }
  348. }
  349.  
  350. function docpuGraph($cpustart, $cpuend) {
  351.     // $cpustart - start of datetime range as a Date object
  352.     // $cpuend   - end of datetime range as a Date object
  353.    
  354.     // get current time so we can tell the user
  355.     // when the page was generated
  356.     var $now = new Date()
  357.     var $nowlabel = $now.toString("dd MMM yyyy HH:mm");
  358.     // tell user when page was generated
  359.     document.getElementById("cpugenerated").textContent = "Graph generated: " + $nowlabel;
  360.    
  361.     // generate datetime strings to pass to script to get data
  362.     // These are in a format that sqlite3 will understand
  363.     var $cpustartstring = $cpustart.toString("yyyy-MM-dd HH:mm");
  364.     var $cpuendstring = $cpuend.toString("yyyy-MM-dd HH:mm");
  365.    
  366.     //generate 'friendly' datetime strings for output as graph title
  367.     var $cpustartlabel = $cpustart.toString("dd MMM yyyy HH:mm");
  368.     var $cpuendlabel = $cpuend.toString("dd MMM yyyy HH:mm");
  369.    
  370.     // show title outside the graph
  371.     document.getElementById("cpucharttitle").innerHTML = $cpustartlabel + " to " + $cpuendlabel;
  372.    
  373.     // check which range is selected
  374.     var $range = getcpuRange();
  375.    
  376.     // data renderer - calls php script which returns JSON data
  377.     var ajaxDataRenderer = function(url, plot, options) {
  378.         var ret = null;
  379.         $.ajax({
  380.             // have to use synchronous here, else the function
  381.             // will return before the data is fetched
  382.             async: false,
  383.             url: url,
  384.             dataType:"json",
  385.             success: function(data) {
  386.                 ret = data;
  387.             }
  388.         });
  389.         return ret;
  390.     };
  391.  
  392.     // The url for our json data
  393.     var jsoncpuurl = "./gettemp.php?start='" + $cpustartstring + "'&end='" + $cpuendstring + "'&sensor=cpu&range=" + $cpuavg;
  394.    
  395.     // passing in the url string as the jqPlot data argument is a handy
  396.     // shortcut for our renderer.  You could also have used the
  397.     // "dataRendererOptions" option to pass in the url.  
  398.     var plot3 = $.jqplot('cpuchart', jsoncpuurl, {
  399.         //title:$cpustartlabel + '<br> to <br>' + $cpuendlabel,
  400.         axes:{
  401.             xaxis:{
  402.                 renderer:$.jqplot.DateAxisRenderer,
  403.                 tickOptions:{formatString:'%H:%M'},
  404.                 label:'Time',
  405.                 min:$cpustartstring,
  406.                 max:$cpuendstring
  407.             },
  408.             yaxis:{
  409.                 label:'Temperature (Celsius)'
  410.             }
  411.         },
  412.         highlighter: {
  413.             tooltipLocation: 'n',
  414.             tooltipAxes: 'y',
  415.             tooltipFormatString: '%.2f C',
  416.             useAxesFormatters: false
  417.         },
  418.         dataRenderer: ajaxDataRenderer,
  419.         dataRendererOptions: {
  420.             unusedOptionalUrl: jsoncpuurl
  421.         },
  422.         series:[{lineWidth:2, markerOptions:{show:false}}]
  423.     });
  424. }
  425.  
  426. // functions for hdd temperature graph
  427.  
  428. function gethddRange() {
  429.     var $hdde = document.getElementById("hddrange");
  430.     var $value = $hdde.options[$hdde.selectedIndex].value;
  431.     var $text = $hdde.options[$hdde.selectedIndex].text;
  432.     return($value);
  433. }
  434.  
  435. function addhddRange($positive) {
  436.     // jump graph start and end times forwards
  437.     // or backwards by the amount of $range
  438.     // $positive - true for forwards, false for backwards
  439.    
  440.     // find out when now is, so we can clamp end date
  441.     var $n = new Date();
  442.    
  443.     // convert boolean $positive into a multiplier
  444.     if ($positive) $m = 1; else $m = -1;
  445.     switch ($range){
  446.         case "sixhours":
  447.             $hdde = $hdde.addHours($m * 6);
  448.             // clamp end datetime to now
  449.             if ($hdde.valueOf() > $n.valueOf()) $hdde = new Date();
  450.             $hdds = computehddStart($hdde);
  451.             return(true);
  452.             break;
  453.         case "oneday":
  454.             $hdde = $hdde.addDays($m);
  455.             // clamp end datetime to now
  456.             if ($hdde.valueOf() > $n.valueOf()) $hdde = new Date();
  457.             $hdds = computehddStart($hdde);
  458.             return(true);
  459.             break;
  460.         case "sevendays":
  461.             $hdde = $hdde.addDays($m * 7);
  462.             // clamp end datetime to now
  463.             if ($hdde.valueOf() > $n.valueOf()) $hdde = new Date();
  464.             $hdds = computehddStart($hdde);
  465.             return(true);
  466.             break;
  467.         default:
  468.             return(false);
  469.     }
  470. }
  471.  
  472. function clearhddChart() {
  473.     document.getElementById("hddgenerated").textContent = "";
  474.     document.getElementById("hddcharttitle").textContent = "";
  475.     document.getElementById("hddchart").textContent = "";
  476. }
  477.  
  478. function lefthddButton() {
  479.     // first, get rid of existing graph
  480.     clearhddChart();
  481.     addhddRange(false);
  482.     dohddGraph($hdds, $hdde);
  483. }
  484.  
  485. function righthddButton() {
  486.     // first, get rid of existing graph
  487.     clearhddChart();
  488.     addhddRange(true);
  489.     dohddGraph($hdds, $hdde);
  490. }
  491.  
  492. function changehddRange() {
  493.     // update graph in response to user changing
  494.     // which range is selected
  495.     clearhddChart();
  496.     $hdds = computehddStart($hdde);
  497.     dohddGraph($hdds, $hdde);
  498. }
  499.  
  500. function computehddStart($hddend) {
  501.     // computeStart - find start of graph datetime range
  502.     // based on $range selected, and $hddend datetime
  503.     // returns - start datetime of range
  504.     $range = gethddRange();
  505.     $hdds = new Date($hdde);
  506.     switch ($range){
  507.         case "sixhours":
  508.             $hddavg = 1;
  509.             return($hdds.addHours(-6));
  510.             break;
  511.         case "oneday":
  512.             $hddavg = 2;
  513.             return($hdds.addDays(-1));
  514.             break;
  515.         case "sevendays":
  516.             $hddavg = 14;
  517.             return($hdds.addDays(-7));
  518.             break;
  519.         default:
  520.             return(false);
  521.     }
  522. }
  523.  
  524. function dohddGraph($hddstart, $hddend) {
  525.     // $hddstart - start of datetime range as a Date object
  526.     // $hddend   - end of datetime range as a Date object
  527.    
  528.     // get current time so we can tell the user
  529.     // when the page was generated
  530.     var $now = new Date()
  531.     var $nowlabel = $now.toString("dd MMM yyyy HH:mm");
  532.     // tell user when page was generated
  533.     document.getElementById("hddgenerated").textContent = "Graph generated: " + $nowlabel;
  534.    
  535.     // generate datetime strings to pass to script to get data
  536.     // These are in a format that sqlite3 will understand
  537.     var $hddstartstring = $hddstart.toString("yyyy-MM-dd HH:mm");
  538.     var $hddendstring = $hddend.toString("yyyy-MM-dd HH:mm");
  539.    
  540.     //generate 'friendly' datetime strings for output as graph title
  541.     var $hddstartlabel = $hddstart.toString("dd MMM yyyy HH:mm");
  542.     var $hddendlabel = $hddend.toString("dd MMM yyyy HH:mm");
  543.    
  544.     // show title outside the graph
  545.     document.getElementById("hddcharttitle").innerHTML = $hddstartlabel + " to " + $hddendlabel;
  546.    
  547.     // check which range is selected
  548.     var $range = gethddRange();
  549.    
  550.     // data renderer - calls php script which returns JSON data
  551.     var ajaxDataRenderer = function(url, plot, options) {
  552.         var ret = null;
  553.         $.ajax({
  554.             // have to use synchronous here, else the function
  555.             // will return before the data is fetched
  556.             async: false,
  557.             url: url,
  558.             dataType:"json",
  559.             success: function(data) {
  560.                 ret = data;
  561.             }
  562.         });
  563.         return ret;
  564.     };
  565.  
  566.     // The url for our json data
  567.     var jsonhddurl = "./gettemp.php?start='" + $hddstartstring + "'&end='" + $hddendstring + "'&sensor=hdd&range=" + $hddavg;
  568.     // passing in the url string as the jqPlot data argument is a handy
  569.     // shortcut for our renderer.  You could also have used the
  570.     // "dataRendererOptions" option to pass in the url.  
  571.     var plot3 = $.jqplot('hddchart', jsonhddurl, {
  572.         //title:$hddstartlabel + '<br> to <br>' + $hddendlabel,
  573.         axes:{
  574.             xaxis:{
  575.                 renderer:$.jqplot.DateAxisRenderer,
  576.                 tickOptions:{formatString:'%H:%M'},
  577.                 label:'Time',
  578.                 min:$hddstartstring,
  579.                 max:$hddendstring
  580.             },
  581.             yaxis:{
  582.                 label:'Temperature (Celsius)'
  583.             }
  584.         },
  585.         highlighter: {
  586.             tooltipLocation: 'n',
  587.             tooltipAxes: 'y',
  588.             tooltipFormatString: '%.2f C',
  589.             useAxesFormatters: false
  590.         },
  591.         dataRenderer: ajaxDataRenderer,
  592.         dataRendererOptions: {
  593.             unusedOptionalUrl: jsonhddurl
  594.         },
  595.         series:[{lineWidth:2, markerOptions:{show:false}}]
  596.     });
  597. }
  598.  
  599. // get current date and time - uses data.js to format string
  600. var $ambiente = new Date();
  601. var $ambientavg = 1;
  602. var $cpue = new Date();
  603. var $cpuavg = 1;
  604. var $hdde = new Date();
  605. var $hddavg = 1;
  606.  
  607. // get start datetime, set $ambientavg variable
  608. // to control how many minutes temperatures
  609. // are averaged over
  610. $ambients = computeAmbientStart($ambiente);
  611. $cpus = computecpuStart($cpue);
  612. $hdds = computehddStart($hdde);
  613.  
  614. $.jqplot.config.enablePlugins = true
  615.  
  616. $(document).ready(function(){
  617.     doAmbientGraph($ambients, $ambiente);
  618.     docpuGraph($cpus, $cpue);
  619.     dohddGraph($hdds, $hdde);
  620. });
  621. </script>
  622.  
  623. <footer>
  624. <p>Created by andrum99. See my blog at <a href="http://andrum99.blogspot.co.uk">andrum99.blogspot.co.uk</a>.</p>
  625. </footer>
  626. </body>
  627. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement