warning system
This commit is contained in:
parent
5e029ff99c
commit
0c5c7bcb5f
10 changed files with 1074 additions and 54 deletions
|
@ -1,14 +1,6 @@
|
|||
import { create } from 'zustand'
|
||||
import { AlarmManager, AlarmEvent } from '@/services/AlarmManager'
|
||||
|
||||
export interface SensorConfig {
|
||||
id: string;
|
||||
x: number;
|
||||
y: number;
|
||||
zone: string;
|
||||
label: string;
|
||||
pin?: number;
|
||||
}
|
||||
import { SensorConfig } from '@/types/sensor'
|
||||
|
||||
export interface SensorData {
|
||||
id: string;
|
||||
|
@ -25,6 +17,7 @@ export interface SensorData {
|
|||
warningThreshold?: number;
|
||||
alarmThreshold?: number;
|
||||
warningDelayMs?: number;
|
||||
warningStartTime?: number; // Track when warning state started
|
||||
}
|
||||
|
||||
export interface Alert {
|
||||
|
@ -160,27 +153,77 @@ export const useBedPressureStore = create<BedPressureStore>((set, get) => ({
|
|||
digitalState?: number;
|
||||
warningThreshold?: number;
|
||||
alarmThreshold?: number;
|
||||
warningDelayMs?: number;
|
||||
status?: string;
|
||||
}) => {
|
||||
const currentSensor = updated[sensor.id];
|
||||
const newValue = sensor.value;
|
||||
const config = sensorConfig.find(s => s.id === sensor.id);
|
||||
|
||||
// Get thresholds from sensor data or config
|
||||
const warningThreshold = sensor.warningThreshold || config?.warningThreshold || 2500;
|
||||
const alarmThreshold = sensor.alarmThreshold || config?.alarmThreshold || 3500;
|
||||
const warningDelayMs = sensor.warningDelayMs || config?.warningDelayMs || 60000;
|
||||
|
||||
// Check for alarms based on thresholds
|
||||
if (sensor.alarmThreshold && newValue >= sensor.alarmThreshold) {
|
||||
alarmManager.addAlarm(sensor.id, sensor.label, 'alarm', newValue, sensor.alarmThreshold);
|
||||
} else if (sensor.warningThreshold && newValue >= sensor.warningThreshold) {
|
||||
alarmManager.addAlarm(sensor.id, sensor.label, 'warning', newValue, sensor.warningThreshold);
|
||||
} else {
|
||||
alarmManager.clearAlarm(sensor.id);
|
||||
}
|
||||
// Determine status and handle alarm logic
|
||||
let status = 'normal';
|
||||
let warningStartTime = currentSensor?.warningStartTime;
|
||||
const now = Date.now();
|
||||
|
||||
// Check for alerts (legacy alert system)
|
||||
if (newValue > 3000 && currentSensor && currentSensor.currentValue <= 3000) {
|
||||
if (newValue >= alarmThreshold) {
|
||||
status = 'alarm';
|
||||
warningStartTime = undefined; // Clear warning timer for immediate alarm
|
||||
|
||||
// Add alarm
|
||||
alarmManager.addAlarm(
|
||||
sensor.id,
|
||||
sensor.label,
|
||||
'alarm',
|
||||
newValue,
|
||||
alarmThreshold
|
||||
);
|
||||
|
||||
newAlerts.push({
|
||||
id: `${sensor.id}-${Date.now()}`,
|
||||
message: `High value detected at ${sensor.label}`,
|
||||
message: `ALARM: High value detected at ${sensor.label} (${newValue})`,
|
||||
time: new Date().toLocaleTimeString(),
|
||||
});
|
||||
|
||||
} else if (newValue >= warningThreshold) {
|
||||
status = 'warning';
|
||||
|
||||
if (!warningStartTime) {
|
||||
warningStartTime = now; // Start warning timer
|
||||
} else if (now - warningStartTime >= warningDelayMs) {
|
||||
status = 'alarm'; // Escalate to alarm after delay
|
||||
|
||||
// Add escalated alarm
|
||||
alarmManager.addAlarm(
|
||||
sensor.id,
|
||||
sensor.label,
|
||||
'alarm',
|
||||
newValue,
|
||||
warningThreshold
|
||||
);
|
||||
|
||||
newAlerts.push({
|
||||
id: `${sensor.id}-${Date.now()}`,
|
||||
message: `ALARM: Warning escalated for ${sensor.label} (${newValue})`,
|
||||
time: new Date().toLocaleTimeString(),
|
||||
});
|
||||
} else {
|
||||
// Add warning alarm
|
||||
alarmManager.addAlarm(
|
||||
sensor.id,
|
||||
sensor.label,
|
||||
'warning',
|
||||
newValue,
|
||||
warningThreshold
|
||||
);
|
||||
}
|
||||
} else {
|
||||
warningStartTime = undefined; // Clear warning timer
|
||||
alarmManager.clearAlarm(sensor.id); // Clear any existing alarms
|
||||
}
|
||||
|
||||
// Update sensor data
|
||||
|
@ -204,12 +247,14 @@ export const useBedPressureStore = create<BedPressureStore>((set, get) => ({
|
|||
timestamp: Date.now(),
|
||||
value: newValue,
|
||||
}],
|
||||
status: sensor.status || (newValue > 3000 ? "critical" : newValue > 2500 ? "warning" : "normal"),
|
||||
status,
|
||||
source: sensor.source,
|
||||
pin: sensor.pin,
|
||||
digitalState: sensor.digitalState,
|
||||
warningThreshold: sensor.warningThreshold,
|
||||
alarmThreshold: sensor.alarmThreshold
|
||||
warningThreshold,
|
||||
alarmThreshold,
|
||||
warningDelayMs,
|
||||
warningStartTime
|
||||
};
|
||||
});
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue