diff --git a/api/src/unraid-api/graph/resolvers/ups/ups.model.ts b/api/src/unraid-api/graph/resolvers/ups/ups.model.ts index 78fee09007..92c1dcd975 100644 --- a/api/src/unraid-api/graph/resolvers/ups/ups.model.ts +++ b/api/src/unraid-api/graph/resolvers/ups/ups.model.ts @@ -40,6 +40,20 @@ export class UPSPower { 'Current load on the UPS as a percentage of its capacity. Unit: percent (%). Example: 25 means UPS is loaded at 25% of its maximum capacity', }) loadPercentage!: number; + + @Field(() => Int, { + nullable: true, + description: + 'Nominal power capacity of the UPS. Unit: watts (W). Example: 1000 means the UPS is rated for 1000 watts. This is the maximum power the UPS can deliver', + }) + nominalPower?: number; + + @Field(() => Float, { + nullable: true, + description: + 'Current power consumption calculated from load percentage and nominal power. Unit: watts (W). Example: 350 means 350 watts currently being used. Calculated as: nominalPower * (loadPercentage / 100)', + }) + currentPower?: number; } @ObjectType() diff --git a/api/src/unraid-api/graph/resolvers/ups/ups.resolver.spec.ts b/api/src/unraid-api/graph/resolvers/ups/ups.resolver.spec.ts index a9b99077dc..9a3dd2df4c 100644 --- a/api/src/unraid-api/graph/resolvers/ups/ups.resolver.spec.ts +++ b/api/src/unraid-api/graph/resolvers/ups/ups.resolver.spec.ts @@ -26,6 +26,7 @@ describe('UPSResolver', () => { LINEV: '120.5', OUTPUTV: '120.5', LOADPCT: '25', + NOMPOWER: '600', }; beforeEach(async () => { diff --git a/api/src/unraid-api/graph/resolvers/ups/ups.resolver.ts b/api/src/unraid-api/graph/resolvers/ups/ups.resolver.ts index c70e48d05a..a00ffe1663 100644 --- a/api/src/unraid-api/graph/resolvers/ups/ups.resolver.ts +++ b/api/src/unraid-api/graph/resolvers/ups/ups.resolver.ts @@ -14,6 +14,13 @@ export class UPSResolver { ) {} private createUPSDevice(upsData: UPSData, id: string): UPSDevice { + const loadPercentage = parseInt(upsData.LOADPCT || '25', 10); + const nominalPower = upsData.NOMPOWER ? parseInt(upsData.NOMPOWER, 10) : undefined; + const currentPower = + nominalPower !== undefined + ? parseFloat(((nominalPower * loadPercentage) / 100).toFixed(2)) + : undefined; + return { id, name: upsData.MODEL || 'My UPS', @@ -28,7 +35,9 @@ export class UPSResolver { power: { inputVoltage: parseFloat(upsData.LINEV || '120.5'), outputVoltage: parseFloat(upsData.OUTPUTV || '120.5'), - loadPercentage: parseInt(upsData.LOADPCT || '25', 10), + loadPercentage, + nominalPower, + currentPower, }, }; } diff --git a/api/src/unraid-api/graph/resolvers/ups/ups.service.ts b/api/src/unraid-api/graph/resolvers/ups/ups.service.ts index 1827064d3e..2538c6ed4a 100644 --- a/api/src/unraid-api/graph/resolvers/ups/ups.service.ts +++ b/api/src/unraid-api/graph/resolvers/ups/ups.service.ts @@ -15,6 +15,7 @@ const UPSSchema = z.object({ LINEV: z.string().optional(), OUTPUTV: z.string().optional(), LOADPCT: z.string().optional(), + NOMPOWER: z.string().optional(), }); export type UPSData = z.infer;