BMS/frontend/lib/thresholds.ts
2026-03-19 11:32:17 +00:00

114 lines
2.6 KiB
TypeScript

/**
* Centralised operational thresholds.
* Import from here instead of hardcoding values in individual pages.
*/
export const THRESHOLDS = {
temp: {
warn: 26, // °C
critical: 28, // °C
},
humidity: {
low: 30, // % RH — static risk below this
warn: 65, // % RH
critical: 80, // % RH
},
dewPoint: {
warn: 15, // °C — condensation risk zone
},
power: {
warn: 0.75, // fraction of rated capacity
critical: 0.85,
},
rackPower: {
warn: 7.5, // kW per rack
critical: 9.5, // kW per rack
rated: 10, // kW per rack (default rated capacity)
},
filter: {
warn: 80, // Pa differential pressure
critical: 120, // Pa
ratePerDay: 1.2, // Pa/day assumed fouling rate
replaceAt: 120, // Pa
},
cop: {
warn: 1.5, // COP below this is inefficient
},
compressor: {
warn: 0.80, // fraction of capacity
critical: 0.95,
},
battery: {
warn: 30, // % state of charge
critical: 20, // %
},
fuel: {
warn: 30, // % fuel level
critical: 15, // %
},
ups: {
loadWarn: 0.75, // fraction of rated load
loadCritical: 0.90,
},
pue: {
target: 1.4,
warn: 1.6,
critical: 2.0,
},
phaseImbalance: {
warn: 5, // %
critical: 15, // %
},
network: {
cpuWarn: 70, // %
cpuCritical: 90, // %
memWarn: 70, // %
memCritical: 85, // %
tempWarn: 55, // °C
tempCritical: 70, // °C
},
ashrae: {
// ASHRAE A1 Class envelope
tempMin: 15, // °C
tempMax: 32, // °C
rhMin: 20, // %
rhMax: 80, // %
},
} as const;
/** Colour helper: returns a Tailwind text/bg colour token based on a value vs warn/critical pair */
export function severityColor(
value: number,
warn: number,
critical: number,
invert = false, // set true when lower is worse (e.g. battery %)
): "green" | "amber" | "red" {
if (invert) {
if (value <= critical) return "red";
if (value <= warn) return "amber";
return "green";
}
if (value >= critical) return "red";
if (value >= warn) return "amber";
return "green";
}
export const COLOR_CLASSES = {
green: {
text: "text-green-400",
bg: "bg-green-500/15",
border: "border-green-500/30",
badge: "bg-green-500/20 text-green-300",
},
amber: {
text: "text-amber-400",
bg: "bg-amber-500/15",
border: "border-amber-500/30",
badge: "bg-amber-500/20 text-amber-300",
},
red: {
text: "text-red-400",
bg: "bg-red-500/15",
border: "border-red-500/30",
badge: "bg-red-500/20 text-red-300",
},
} as const;