app backend prima

This commit is contained in:
2025-10-20 19:10:08 +02:00
commit 438255d27b
42 changed files with 4622 additions and 0 deletions

78
app/models/allarme.py Normal file
View File

@@ -0,0 +1,78 @@
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")