from alarms.alarm_definitions import ( BATTERY_SOC_LOW, BATTERY_VOLTAGE_LOW, FRIDGE_ZONE_1_HIGH, FRIDGE_ZONE_2_HIGH, SENSOR_FAILURE, COMMUNICATION_LOST, ) ALARM_LABELS = { BATTERY_SOC_LOW: "Battery SOC Low", BATTERY_VOLTAGE_LOW: "Battery Voltage Low", FRIDGE_ZONE_1_HIGH: "Fridge Zone 1 High Temp", FRIDGE_ZONE_2_HIGH: "Fridge Zone 2 High Temp", COMMUNICATION_LOST: "ESP32 Communication Lost", } CRITICAL_ALARMS = { BATTERY_SOC_LOW, BATTERY_VOLTAGE_LOW, FRIDGE_ZONE_1_HIGH, FRIDGE_ZONE_2_HIGH, COMMUNICATION_LOST, } class AlarmViewModel: def __init__(self, alarms): self.alarms = alarms or [] def count(self): return len(self.alarms) def has_alarms(self): return self.count() > 0 def has_critical(self): return any(self._base_alarm(alarm) in CRITICAL_ALARMS for alarm in self.alarms) def should_buzz(self): return self.has_critical() def primary_alarm(self): if not self.alarms: return None return self.format_alarm(self.alarms[0]) def as_list(self): return [self.format_alarm(alarm) for alarm in self.alarms] def format_alarm(self, alarm): base = self._base_alarm(alarm) if base == SENSOR_FAILURE: sensor = alarm.split(":", 1)[1] if ":" in alarm else "unknown" return { "code": alarm, "severity": "warning", "title": "Sensor Failure", "detail": sensor.replace("_", " ").title(), } return { "code": alarm, "severity": "critical" if base in CRITICAL_ALARMS else "info", "title": ALARM_LABELS.get(base, alarm), "detail": None, } def _base_alarm(self, alarm): return alarm.split(":", 1)[0]