warning system

This commit is contained in:
Siwat Sirichai 2025-06-21 13:29:01 +07:00
parent 5e029ff99c
commit 0c5c7bcb5f
10 changed files with 1074 additions and 54 deletions

View file

@ -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
};
});