fix(node_info): normalize UPS data — derive ups.realpower fallback and clean invalid battery.mfr.date

This commit is contained in:
Meliox 2026-08-20 20:01:40 +02:00
parent f754331c3a
commit 86cda4fada
2 changed files with 29 additions and 7 deletions

View File

@ -112,6 +112,8 @@ sub _parse_upsc_output {
} }
} }
} }
_normalize_ups_data($ups_data);
}; };
if ($@) { if ($@) {
debug(__LINE__, "Error parsing upsc output: $@"); debug(__LINE__, "Error parsing upsc output: $@");
@ -122,4 +124,28 @@ sub _parse_upsc_output {
return $ups_data; return $ups_data;
} }
# ============================================================================
# UPS — data normalization
# ============================================================================
sub _normalize_ups_data {
my ($ups_data) = @_;
# Some devices report a placeholder (e.g. "OPEN") instead of a real date
if (defined $ups_data->{'battery.mfr.date'} && $ups_data->{'battery.mfr.date'} !~ m{^\d{4}[/-]\d{1,2}[/-]\d{1,2}$}) {
delete $ups_data->{'battery.mfr.date'};
}
# Derive real power draw for devices that don't report ups.realpower directly
if (!defined $ups_data->{'ups.realpower'}) {
if (defined $ups_data->{'ups.load'} && defined $ups_data->{'ups.realpower.nominal'}) {
$ups_data->{'ups.realpower'} = int((($ups_data->{'ups.load'} / 100) * $ups_data->{'ups.realpower.nominal'}) + 0.5);
} elsif (defined $ups_data->{'output.current'} && defined $ups_data->{'output.voltage'}) {
$ups_data->{'ups.realpower'} = int(($ups_data->{'output.current'} * $ups_data->{'output.voltage'}) + 0.5);
}
}
return;
}
1; 1;

View File

@ -969,7 +969,7 @@ Ext.define('PVE.node.StatusView', {
const testResult = upsData['ups.test.result']; const testResult = upsData['ups.test.result'];
const batteryChargeLow = upsData['battery.charge.low']; const batteryChargeLow = upsData['battery.charge.low'];
const batteryRuntimeLow = upsData['battery.runtime.low']; const batteryRuntimeLow = upsData['battery.runtime.low'];
const upsRealPowerNominal = upsData['ups.realpower.nominal']; const upsRealPower = upsData['ups.realpower'];
const batteryMfrDate = upsData['battery.mfr.date']; const batteryMfrDate = upsData['battery.mfr.date'];
// Main status line with all metrics // Main status line with all metrics
@ -1046,12 +1046,8 @@ Ext.define('PVE.node.StatusView', {
// Calculate actual watt usage // Calculate actual watt usage
if (statusLine) statusLine += ' | '; if (statusLine) statusLine += ' | ';
let actualWattage = null; let actualWattage = null;
if (upsLoad && upsRealPowerNominal) { if (upsRealPower && !isNaN(parseFloat(upsRealPower))) {
const load = parseFloat(upsLoad); actualWattage = Math.round(parseFloat(upsRealPower));
const nominal = parseFloat(upsRealPowerNominal);
if (!isNaN(load) && !isNaN(nominal)) {
actualWattage = Math.round((load / 100) * nominal);
}
} }
// Real power (calculated watt usage) // Real power (calculated watt usage)