Files
web-app-python/app/models/allarme.py
2025-10-20 19:10:08 +02:00

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")