79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
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")
|