mirror of
https://github.com/unraid/webgui.git
synced 2026-02-22 01:39:12 -06:00
Add automatics NVME temperature thresholds
This commit is contained in:
@@ -1175,12 +1175,12 @@ _(xfs_repair status)_:
|
||||
<input type="hidden" name="smEvents" value="">
|
||||
<input type="hidden" name="smGlue" value="<?=_var($var,'smGlue')?>">
|
||||
_(Warning disk temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
: <input type="number" min="0" max="300" name="hotTemp" class="narrow" value="<?=displayTemp(_var($disk,'hotTemp'))?>" placeholder="<?=displayTemp(_var($display,'hot'))?>">
|
||||
: <input type="number" min="0" max="300" name="hotTemp" class="narrow" value="<?=displayTemp(_var($disk,'hotTemp'))?>" placeholder="<?=displayTemp(_var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['wctemp'] : _var($display,'hot'))?>">
|
||||
|
||||
:info_warning_temp_help:
|
||||
|
||||
_(Critical disk temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
: <input type="number" min="0" max="300" name="maxTemp" class="narrow" value="<?=displayTemp(_var($disk,'maxTemp'))?>" placeholder="<?=displayTemp(_var($display,'max'))?>">
|
||||
: <input type="number" min="0" max="300" name="maxTemp" class="narrow" value="<?=displayTemp(_var($disk,'maxTemp'))?>" placeholder="<?=displayTemp(_var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['cctemp'] : _var($display,'max'))?>">
|
||||
|
||||
:info_critical_temp_help:
|
||||
|
||||
|
||||
@@ -264,33 +264,4 @@ function my_preg_split($split, $text, $count=2) {
|
||||
function delete_file(...$file) {
|
||||
array_map('unlink',array_filter($file,'file_exists'));
|
||||
}
|
||||
function get_nvme_powerstate($device) {
|
||||
global $display;
|
||||
$nvme = [];
|
||||
$number = _var($display,'number','.,');
|
||||
exec("nvme id-ctrl /dev/$device | grep -E '^ps |^wctemp|^cctemp'",$rows);
|
||||
foreach ($rows as $row) {
|
||||
if (!$row) continue;
|
||||
$value = my_explode(':',$row,3);
|
||||
$entry = str_replace(' ','',trim($value[0]));
|
||||
switch ($entry){
|
||||
case 'wctemp':
|
||||
case 'cctemp':
|
||||
$nvme[$entry] = $value[1] - 273;
|
||||
break;
|
||||
case 'ps0':
|
||||
case 'ps1':
|
||||
case 'ps2':
|
||||
case 'ps3':
|
||||
case 'ps4':
|
||||
case 'ps5':
|
||||
$nvme[$entry] = number_format(strtok($value[2],'W'),2,$number[0]).' W';
|
||||
break;
|
||||
}
|
||||
}
|
||||
# get-feature:0x02 (Power Management), Current value:0x00000003)
|
||||
$nvme['powerstate'] = hexdec(my_explode(':',exec("nvme get-feature /dev/$device -f 2"),3)[2]);
|
||||
$nvme['powerstatevalue'] = _var($nvme,'ps'.$nvme['powerstate']);
|
||||
return $nvme;
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -58,10 +58,12 @@ case "attributes":
|
||||
$level = get_value($disk,'smLevel',1);
|
||||
$events = explode('|',get_value($disk,'smEvents',$numbers));
|
||||
extract(parse_plugin_cfg('dynamix',true));
|
||||
$max = ($disk['maxTemp'] ?? $display['max'] ?? 0) ?: 0;
|
||||
$hot = ($disk['hotTemp'] ?? $display['hot'] ?? 0) ?: 0;
|
||||
$top = $_POST['top'] ?? 120;
|
||||
$empty = true;
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['cctemp'] : 0;
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme > 0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['wctemp'] : 0;
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme > 0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$top = $_POST['top'] ?? 120;
|
||||
$empty = true;
|
||||
exec("smartctl -n standby -A $type ".escapeshellarg("/dev/$port"),$output);
|
||||
// remove empty rows
|
||||
$output = array_filter($output);
|
||||
|
||||
@@ -113,6 +113,34 @@ function isSubpool($name) {
|
||||
$subpool = my_explode($_tilde_,$name)[1];
|
||||
return in_array($subpool,$subpools) ? $subpool : false;
|
||||
}
|
||||
function get_nvme_powerstate($device) {
|
||||
global $display;
|
||||
$nvme = [];
|
||||
$number = _var($display,'number','.,');
|
||||
exec("nvme id-ctrl /dev/$device | grep -E '^(ps|[wc]ctemp) '",$rows);
|
||||
foreach ($rows as $row) {
|
||||
if (!$row) continue;
|
||||
$value = my_explode(':',$row,3);
|
||||
$entry = str_replace(' ','',trim($value[0]));
|
||||
switch ($entry){
|
||||
case 'wctemp':
|
||||
case 'cctemp':
|
||||
$nvme[$entry] = $value[1] - 273; // kelvin -> celsius
|
||||
break;
|
||||
case 'ps0':
|
||||
case 'ps1':
|
||||
case 'ps2':
|
||||
case 'ps3':
|
||||
case 'ps4':
|
||||
case 'ps5':
|
||||
$nvme[$entry] = number_format(strtok($value[2],'W'),2,$number[0]).' W';
|
||||
break;
|
||||
}
|
||||
}
|
||||
$nvme['powerstate'] = hexdec(my_explode(':',exec("nvme get-feature /dev/$device -f 2"),3)[2]);
|
||||
$nvme['powerstatevalue'] = _var($nvme,'ps'.$nvme['powerstate']);
|
||||
return $nvme;
|
||||
}
|
||||
// convert strftime to date format
|
||||
function my_date($fmt, $time) {
|
||||
$legacy = ['%c' => 'D j M Y h:i A','%A' => 'l','%Y' => 'Y','%B' => 'F','%e' => 'j','%d' => 'd','%m' => 'm','%I' => 'h','%H' => 'H','%M' => 'i','%S' => 's','%p' => 'a','%R' => 'H:i', '%F' => 'Y-m-d', '%T' => 'H:i:s'];
|
||||
|
||||
@@ -159,8 +159,10 @@ function device_temp(&$disk, &$red, &$orange) {
|
||||
global $display;
|
||||
$spin = strpos(_var($disk,'color'),'blink')===false;
|
||||
$temp = _var($disk,'temp','*');
|
||||
$max = _var($disk,'maxTemp')>=0 ? $disk['maxTemp'] : (_var($display,'max')>=0 ? $display['max'] : 0);
|
||||
$hot = _var($disk,'hotTemp')>=0 ? $disk['hotTemp'] : (_var($display,'hot')>=0 ? $display['hot'] : 0);
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['cctemp'] : 0;
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme > 0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['wctemp'] : 0;
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme > 0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$top = $display['top'] ?? 120;
|
||||
$heat = false; $color = 'green';
|
||||
if (exceed($temp,$max,$top)) {
|
||||
|
||||
@@ -47,8 +47,10 @@ function check_temp(&$disk,$text,$info) {
|
||||
$name = _var($disk,'name');
|
||||
$named = no_tilde($name);
|
||||
$temp = _var($disk,'temp','*');
|
||||
$max = _var($disk,'maxTemp')>=0 ? $disk['maxTemp'] : (_var($display,'max')>=0 ? $display['max'] : 0);
|
||||
$hot = _var($disk,'hotTemp')>=0 ? $disk['hotTemp'] : (_var($display,'hot')>=0 ? $display['hot'] : 0);
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['cctemp'] : 0;
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme > 0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['wctemp'] : 0;
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme > 0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$warn = exceed($temp,$max,$top) ? 'alert' : (exceed($temp,$hot,$top) ? 'warning' : false);
|
||||
$item = 'temp';
|
||||
$last = $saved[$item][$named] ?? 0;
|
||||
|
||||
@@ -94,8 +94,10 @@ function my_clock($time) {
|
||||
function my_array(&$disk) {
|
||||
global $data,$display,$error0,$error1,$error2,$error3;
|
||||
$name = _var($disk,'name');
|
||||
$max = _var($disk,'maxTemp')>=0 ? $disk['maxTemp'] : (_var($display,'max')>=0 ? $display['max'] : 0);
|
||||
$hot = _var($disk,'hotTemp')>=0 ? $disk['hotTemp'] : (_var($display,'hot')>=0 ? $display['hot'] : 0);
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['cctemp'] : 0;
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme > 0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['wctemp'] : 0;
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme > 0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
if (strpos(_var($disk,'status'),'_NP')!==false) return false;
|
||||
$temp = _var($disk,'temp');
|
||||
if ($max>0 && $temp>=$max) {
|
||||
|
||||
Reference in New Issue
Block a user