from sqlalchemy import Column, Integer, String, DateTime, Float, ForeignKey, Enum as SQLEnum, JSON, Text from sqlalchemy.orm import relationship from sqlalchemy.sql import func import enum from app.core.database import Base class SeveritaAllarme(str, enum.Enum): """Livelli di severità degli allarmi""" CRITICAL = "critical" # Critico - richiede azione immediata WARNING = "warning" # Avviso - richiede attenzione INFO = "info" # Informativo class StatoAllarme(str, enum.Enum): """Stati di un allarme""" NUOVO = "nuovo" VISUALIZZATO = "visualizzato" IN_GESTIONE = "in_gestione" RISOLTO = "risolto" FALSO_POSITIVO = "falso_positivo" class TipoAllarme(str, enum.Enum): """Tipologie di allarmi""" MOVIMENTO_TERRENO = "movimento_terreno" DEFORMAZIONE = "deformazione" ACCELERAZIONE = "accelerazione" INCLINAZIONE = "inclinazione" FESSURAZIONE = "fessurazione" VIBRAZIONE = "vibrazione" TEMPERATURA_ANOMALA = "temperatura_anomala" UMIDITA_ANOMALA = "umidita_anomala" PERDITA_SEGNALE = "perdita_segnale" BATTERIA_SCARICA = "batteria_scarica" ALTRO = "altro" class Allarme(Base): """Modello per gli allarmi generati dal sistema di monitoraggio""" __tablename__ = "allarmi" id = Column(Integer, primary_key=True, index=True) sito_id = Column(Integer, ForeignKey("siti.id"), nullable=False) # Classificazione allarme tipo = Column(SQLEnum(TipoAllarme), nullable=False) severita = Column(SQLEnum(SeveritaAllarme), nullable=False, index=True) stato = Column(SQLEnum(StatoAllarme), default=StatoAllarme.NUOVO, index=True) # Dettagli allarme titolo = Column(String(255), nullable=False) descrizione = Column(Text) messaggio = Column(Text) # Dati sensori (JSON con i valori rilevati) dati_sensori = Column(JSON) # Valori soglia valore_rilevato = Column(Float) valore_soglia = Column(Float) unita_misura = Column(String(20)) # Metadata temporale timestamp_rilevamento = Column(DateTime(timezone=True), nullable=False, index=True) timestamp_notifica = Column(DateTime(timezone=True)) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) # Note operative note = Column(Text) risolto_da = Column(String(255)) timestamp_risoluzione = Column(DateTime(timezone=True)) # Relazioni sito = relationship("Sito", back_populates="allarmi")