fix(snmp): correct power status interpretation using OID set mappings
Move power status value interpretation from hardcoded logic to OID set configuration. Each UPS model now defines its own value mappings (e.g., CyberPower: 2=online, 3=onBattery). Fixes incorrect status display where UPS showed "On Battery" when actually online. Changes: - Add POWER_STATUS_VALUES to IOidSet interface - Define value mappings for all UPS models (cyberpower, apc, eaton, tripplite, liebert) - Refactor determinePowerStatus() to use OID set mappings instead of hardcoded values - CyberPower now correctly interprets value 2 as online (was incorrectly onBattery)
This commit is contained in:
@@ -525,6 +525,7 @@ export class NupstSnmp {
|
||||
|
||||
/**
|
||||
* Determine power status based on UPS model and raw value
|
||||
* Uses the value mappings defined in the OID sets
|
||||
* @param upsModel UPS model
|
||||
* @param powerStatusValue Raw power status value
|
||||
* @returns Standardized power status
|
||||
@@ -533,39 +534,28 @@ export class NupstSnmp {
|
||||
upsModel: TUpsModel | undefined,
|
||||
powerStatusValue: number,
|
||||
): 'online' | 'onBattery' | 'unknown' {
|
||||
if (upsModel === 'cyberpower') {
|
||||
// CyberPower RMCARD205: upsBaseOutputStatus values
|
||||
// 2=onLine, 3=onBattery, 4=onBoost, 5=onSleep, 6=off, etc.
|
||||
if (powerStatusValue === 2) {
|
||||
return 'online';
|
||||
} else if (powerStatusValue === 3) {
|
||||
return 'onBattery';
|
||||
}
|
||||
} else if (upsModel === 'eaton') {
|
||||
// Eaton UPS: xupsOutputSource values
|
||||
// 3=normal/mains, 5=battery, etc.
|
||||
if (powerStatusValue === 3) {
|
||||
return 'online';
|
||||
} else if (powerStatusValue === 5) {
|
||||
return 'onBattery';
|
||||
}
|
||||
} else if (upsModel === 'apc') {
|
||||
// APC UPS: upsBasicOutputStatus values
|
||||
// 2=online, 3=onBattery, etc.
|
||||
if (powerStatusValue === 2) {
|
||||
return 'online';
|
||||
} else if (powerStatusValue === 3) {
|
||||
return 'onBattery';
|
||||
}
|
||||
} else {
|
||||
// Default interpretation for other UPS models
|
||||
if (powerStatusValue === 1) {
|
||||
return 'online';
|
||||
} else if (powerStatusValue === 2) {
|
||||
return 'onBattery';
|
||||
// Get the OID set for this UPS model
|
||||
if (upsModel && upsModel !== 'custom') {
|
||||
const oidSet = UpsOidSets.getOidSet(upsModel);
|
||||
|
||||
// Use the value mappings if available
|
||||
if (oidSet.POWER_STATUS_VALUES) {
|
||||
if (powerStatusValue === oidSet.POWER_STATUS_VALUES.online) {
|
||||
return 'online';
|
||||
} else if (powerStatusValue === oidSet.POWER_STATUS_VALUES.onBattery) {
|
||||
return 'onBattery';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback for custom or undefined models (RFC 1628 standard)
|
||||
// upsOutputSource: 3=normal (mains), 5=battery
|
||||
if (powerStatusValue === 3) {
|
||||
return 'online';
|
||||
} else if (powerStatusValue === 5) {
|
||||
return 'onBattery';
|
||||
}
|
||||
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user