Ho creato un sistema di monitoraggio che controlla se un dispositivo è allarmato o meno e, in caso affermativo, invia notifiche agli utenti pertinenti in base a quanto tempo un dispositivo si trova in uno stato particolare. Ecco un esempio dei criteri che sto costruendo intorno:
1.) Se un dispositivo ha precedentemente operato in uno stato non in allarme per più di un'ora in precedenza
-
a.) Se il dispositivo è stato allarmato per più di 15 minuti, comunica agli utenti del livello 1
-
b) Se il dispositivo è stato allarmato per più di 24 ore, notifica agli utenti di livello 2
2.) Se un dispositivo ha raggiunto uno stato di allarme di livello uno
- a.) Se un dispositivo ha funzionato attualmente in uno stato non in allarme per più di un'ora, notifica a tutti gli utenti pertinenti
Per costruire questo sistema ho dovuto creare un sacco di logica condizionale nidificata e tenere traccia delle modifiche di stato in una cache che ho impostato. Il mio server ottiene continuamente nuovi dati su un gruppo di dispositivi e gestisce i loro stati attraverso la logica di allarme. Il problema è che questo sistema è molto fragile e ogni cambiamento che faccio alla logica di uno stato influenza gli altri perché sono intrecciati. Per esempio:.
var deviceState = {...}; // cachedData
if (deviceState.hasOperatedWithoutAlarmForHour === true) {
if (currentStatus === 'ALARMED') {
if (deviceState.previousStatus !== 'ALARMED') {
deviceState.hasSentLevelOneNotice = false;
deviceState.hasSentLevelTwoNotice = false;
deviceState.alarmStateStartTime = new Date();
}
else if (
deviceState.hasSentLevelOneNotice === false
&& (currentTime - deviceState.alarmStateStartTime) > 15_MINUTES_CONSTANT)
) {
sendLevelOneNotice();
deviceState.hasSentLevelOneNotice = true;
}
...
}
}
else {
if (deviceState.previousStatus === 'ALARMED') {
deviceState.hasOperatedWithoutAlarmForHour = false;
deviceState.noAlarmStartTime = new Date();
deviceState.hasSentAllClearNotice = false;
}
else {
if (
deviceState.hasSentAllClearNotice === false
&& (currentTime - deviceState.noAlarmStartTime) > ONE_HOUR_CONSTANT
&& deviceState.hasSentLevelOneNotice === true
) {
sendAllClearNotice();
deviceState.hasSentAllClearNotice = true;
}
...
}
}
Esiste un modo migliore per costruire un sistema di monitoraggio basato sullo stato che tenga traccia della durata in un determinato stato?