diff --git a/src/node_info/files/PveMod_pvemanagerlib.js b/src/node_info/files/PveMod_pvemanagerlib.js index 2f03726..e53f3d5 100644 --- a/src/node_info/files/PveMod_pvemanagerlib.js +++ b/src/node_info/files/PveMod_pvemanagerlib.js @@ -572,6 +572,84 @@ Ext.define('PVE.node.StatusView', { : ''; }, }, + { + itemId: 'thermalHdd', + colspan: 2, + printBar: false, + title: gettext('HDD/SSD Temperatures'), + iconCls: 'fa fa-fw fa-thermometer-half', + textField: 'PveMod_JsonSensorInfo', + renderer: function(value) { + // sensors configuration + const addressPrefix = "drivetemp-scsi-"; + const sensorName = "temp1"; + const tempHelper = Ext.create('PVE.mod.TempHelper', {srcUnit: PVE.mod.TempHelper.CELSIUS, dstUnit: PVE.mod.TempHelper.CELSIUS}); + // --- + let objValue; + try { + const parsed = value || {}; + if (parsed.disabled === true) { + this.hide(); + return ''; + } else if (parsed.hdd !== true) { + this.hide(); + return ''; + } + objValue = (parsed.data && parsed.data[Object.keys(parsed.data)[0]]) || {}; + } catch(e) { + objValue = {}; + } + const drvKeys = Object.keys(objValue).filter(item => String(item).startsWith(addressPrefix)).sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' })); + let drvData = []; + drvKeys.forEach((drvKey) => { + try { + const drv = objValue[drvKey]; + let tempVal = NaN, tempMax = NaN, tempCrit = NaN; + Object.keys(drv[sensorName]).forEach((secondLevelKey) => { + if (secondLevelKey.endsWith('_input')) { + tempVal = tempHelper.getTemp(parseFloat(drv[sensorName][secondLevelKey])); + } else if (secondLevelKey.endsWith('_max')) { + tempMax = tempHelper.getTemp(parseFloat(drv[sensorName][secondLevelKey])); + } else if (secondLevelKey.endsWith('_crit')) { + tempCrit = tempHelper.getTemp(parseFloat(drv[sensorName][secondLevelKey])); + } + }); + if (!isNaN(tempVal)) { + let tempStyle = ''; + if (!isNaN(tempMax) && tempVal >= tempMax) { + tempStyle = 'color: #FFC300; font-weight: bold;'; + } + if (!isNaN(tempCrit) && tempVal >= tempCrit) { + tempStyle = 'color: red; font-weight: bold;'; + } + drvData.push({ + model: drv['model'] || 'Unknown', + serial: drv['serial'] || '', + temp: tempVal, + tempStyle: tempStyle, + unit: tempHelper.getUnit() + }); + } + } catch(e) { /*_*/ } + }); + + if (drvData.length === 0) { + return 'N/A'; + } + + let html = ''; + drvData.forEach((data) => { + let deviceName = data.model; + deviceName += ` (${data.serial})`; + html += ''; + html += ``; + html += ``; + html += ''; + }); + html += '
${deviceName}${Ext.util.Format.number(data.temp, '0.0')}${data.unit}
'; + return '
' + html + '
'; + } + }, { itemId: 'thermalNvme', colspan: 2,