# Sensor Data Processing System - Python Version

Conversione dei moduli MATLAB per l'elaborazione dati dei sensori di monitoraggio geotecnico.

## Descrizione

Questo sistema elabora dati provenienti da varie tipologie di sensori utilizzati per il monitoraggio strutturale e geotecnico:

- **RSN** (Rockfall Safety Network): Reti di protezione caduta massi con sensori di accelerazione
- **Tilt**: Inclinometri e tiltmetri biassiali per monitoraggio deformazioni
- **ATD** (Automatic Data Acquisition): Estensimetri, fessurimetri, e altri sensori di spostamento

## Struttura del Progetto

```
src/
├── common/                 # Moduli condivisi
│   ├── database.py        # Gestione connessioni e query MySQL
│   ├── config.py          # Caricamento parametri e configurazioni
│   ├── logging_utils.py   # Sistema di logging
│   └── validators.py      # Validazione e filtraggio dati
│
├── rsn/                   # Elaborazione RSN sensors
│   ├── main.py           # Entry point principale
│   ├── data_processing.py # Caricamento dati da DB
│   ├── conversion.py     # Conversione dati grezzi -> unità fisiche
│   ├── averaging.py      # Media temporale dati
│   ├── elaboration.py    # Elaborazione e calcolo spostamenti
│   ├── db_write.py       # Scrittura dati elaborati su DB
│   └── sensors/          # Moduli specifici per sensori
│
├── tilt/                  # Elaborazione inclinometri
│   ├── main.py           # Entry point principale
│   ├── geometry.py       # Calcoli geometrici (rotazioni, quaternioni)
│   ├── data_processing.py
│   └── sensors/
│
├── atd/                   # Elaborazione ATD sensors
│   ├── main.py           # Entry point principale
│   ├── star_calculation.py # Calcolo posizioni con metodo stella
│   ├── data_processing.py
│   ├── sensors/
│   └── reports/          # Generazione report
│
└── monitoring/            # Sistema monitoraggio e allerte
    ├── alerts.py         # Gestione soglie e allarmi
    ├── thresholds.py     # Configurazione soglie
    └── notifications.py  # Notifiche (SMS, email, sirene)
```

## Installazione

### Requisiti

- Python 3.8+
- MySQL 5.7+ o MariaDB 10.3+

### Dipendenze Python

```bash
pip install numpy pandas mysql-connector-python scipy openpyxl
```

### Configurazione Database

1. Creare il file `DB.txt` nella directory di lavoro con le credenziali del database:

```
nome_database
username
password
com.mysql.cj.jdbc.Driver
jdbc:mysql://host:porta/database?useLegacyDatetimeCode=false&serverTimezone=Europe/Rome
```

## Utilizzo

### Elaborazione RSN

```bash
python -m src.rsn.main <ID_centralina> <catena>
```

Esempio:
```bash
python -m src.rsn.main CU001 A
```

### Elaborazione Tilt

```bash
python -m src.tilt.main <ID_centralina> <catena>
```

### Elaborazione ATD

```bash
python -m src.atd.main <ID_centralina> <catena>
```

## Flusso di Elaborazione

### 1. Caricamento Dati
- Connessione al database MySQL
- Lettura parametri installazione
- Caricamento dati di calibrazione
- Query dati grezzi dai sensori

### 2. Conversione
- Applicazione coefficienti di calibrazione
- Conversione da ADC/conteggi a unità fisiche (gradi, mm, kN, ecc.)
- Calcolo grandezze derivate (magnitudine accelerazione, ecc.)

### 3. Validazione
- Controllo range temperature (-30°C / +80°C)
- Verifica magnitudine vettori accelerazione
- Despiking (rimozione valori anomali)
- Forward fill per valori mancanti

### 4. Media Temporale
- Media mobile su finestre configurabili (tipicamente 60 campioni)
- Riduzione rumore
- Downsampling per storage efficiente

### 5. Elaborazione
- Calcolo spostamenti differenziali
- Trasformazioni geometriche
- Compensazione temperatura
- Calcolo posizioni con metodo stella (per ATD)

### 6. Controllo Soglie
- Verifica soglie di allarme (WARNING/CRITICAL)
- Generazione eventi
- Attivazione dispositivi di allarme

### 7. Scrittura Database
- Salvataggio dati elaborati
- Aggiornamento flag di errore
- Logging operazioni

## Tipi di Sensori Supportati

### RSN (Rockfall Safety Network)
- **RSN Link**: Sensori MEMS biassiali/triassiali per misura inclinazione
- **RSN Link HR**: Versione alta risoluzione
- **Load Link**: Celle di carico per misura tensione cavi
- **Trigger Link**: Sensori on/off per eventi caduta massi
- **Shock Sensor**: Accelerometri per rilevamento urti
- **Debris Link**: Sensori per rilevamento debris flow

### Tilt (Inclinometri)
- **TL/TLH/TLHR/TLHRH**: Tilt Link (varie risoluzioni)
- **BL**: Biaxial Link
- **PL**: Pendulum Link
- **RL**: Radial Link
- **IPL/IPLHR**: In-Place Inclinometer
- **KL/KLHR**: Kessler Link
- **PT100**: Sensori temperatura

### ATD (Automatic Data Acquisition)
- **3DEL**: Estensimetro 3D
- **MPBEL**: Estensimetro multi-punto in foro
- **CrL/2DCrL/3DCrL**: Fessurimetri 1D/2D/3D
- **WEL**: Estensimetro a filo
- **PCL/PCLHR**: Perimeter Cable Link
- **TuL**: Tube Link
- **SM**: Settlement Marker
- **LL**: Linear Link

## Calibrazione

I dati di calibrazione sono memorizzati nel database nella tabella `sensor_calibration`.

Formato tipico calibrazione lineare:
```
valore_fisico = gain * valore_grezzo + offset
```

Per sensori MEMS biassiali:
```
[gain_x, offset_x, gain_y, offset_y, gain_temp, offset_temp]
```

## Sistema di Allerta

Il sistema monitora continuamente:

1. **Eventi singoli** (SEL - Single Event Level): soglia per evento singolo significativo
2. **Eventi multipli** (MEL - Multiple Event Level): soglia per somma eventi in finestra temporale
3. **Soglie statiche**: valori massimi/minimi per ciascun sensore
4. **Trend**: analisi tendenze temporali (opzionale)

Quando una soglia viene superata:
- Viene registrato un alert nel database
- Vengono inviate notifiche (email, SMS)
- Si attivano dispositivi fisici (sirene, semafori)

## Logging

Ogni elaborazione genera un file di log:
```
LogFile_<MODULO>-<ID_CENTRALINA>-<CATENA>-<DATA>-<ORA>.txt
```

Il log contiene:
- Timestamp operazioni
- Parametri caricati
- Numero record elaborati
- Errori e warning
- Correzioni applicate ai dati
- Tempo totale elaborazione

## Gestione Errori

Il sistema applica diversi flag di errore ai dati:
- `0`: Dato valido
- `0.5`: Dato corretto automaticamente
- `1`: Dato invalido/mancante

Gli errori vengono propagati attraverso la pipeline di elaborazione e salvati nel database.

## Performance

Ottimizzazioni implementate:
- Uso di NumPy per operazioni vettoriali
- Query batch per scrittura database
- Caricamento incrementale (solo dati nuovi)
- Caching file di riferimento per calcoli differenziali

Tempi tipici di elaborazione:
- RSN chain (100 nodi, 1 giorno dati): ~30-60 secondi
- Tilt chain (50 nodi, 1 giorno dati): ~20-40 secondi
- ATD chain (30 nodi, 1 giorno dati): ~15-30 secondi

## Migrazione da MATLAB

Principali differenze rispetto alla versione MATLAB:

1. **Indicizzazione**: Python usa 0-based indexing invece di 1-based
2. **Array**: NumPy arrays invece di matrici MATLAB
3. **Database**: mysql-connector-python invece di MATLAB Database Toolbox
4. **Logging**: Sistema logging Python invece di scrittura file diretta
5. **Configurazione**: Caricamento via codice invece di workspace MATLAB

## Sviluppo Futuro

Funzionalità in programma:
- [ ] Interfaccia web per visualizzazione dati in tempo reale
- [ ] API REST per integrazione con sistemi esterni
- [ ] Machine learning per previsione anomalie
- [ ] Sistema di report automatici PDF
- [ ] Dashboard Grafana per monitoring
- [ ] Supporto multi-database (PostgreSQL, InfluxDB)

## Troubleshooting

### Errore connessione database
```
Error connecting to database: Access denied for user
```
Soluzione: Verificare credenziali in `DB.txt`

### Dati di calibrazione mancanti
```
No calibration data for node X, using defaults
```
Soluzione: Verificare tabella `sensor_calibration` nel database

### Temperature fuori range
```
X temperature values out of valid range [-30.0, 80.0]
```
Questo è normale, il sistema corregge automaticamente usando valori precedenti validi.

## Supporto

Per problemi o domande:
- Controllare i file di log generati
- Verificare configurazione database
- Consultare documentazione codice (docstrings)

## Licenza

Proprietario: [Nome Organizzazione]
Uso riservato per scopi di monitoraggio geotecnico.

## Autori

Conversione MATLAB → Python: [Data]
Basato su codice MATLAB originale (2021-2024)
