primo commit refactory in python
This commit is contained in:
450
SETUP.md
Normal file
450
SETUP.md
Normal file
@@ -0,0 +1,450 @@
|
||||
# Setup e Installazione
|
||||
|
||||
Guida rapida per configurare e avviare il sistema di elaborazione dati sensori.
|
||||
|
||||
## Prerequisiti
|
||||
|
||||
### Sistema Operativo
|
||||
- Linux (consigliato: Ubuntu 20.04+, CentOS 8+)
|
||||
- macOS 10.15+
|
||||
- Windows 10+ (con WSL2 consigliato)
|
||||
|
||||
### Software Richiesto
|
||||
- **Python 3.8+**: `python --version`
|
||||
- **pip**: Gestore pacchetti Python
|
||||
- **MySQL/MariaDB**: Database server (5.7+ / 10.3+)
|
||||
- **Git**: Version control (opzionale)
|
||||
|
||||
## Installazione
|
||||
|
||||
### 1. Clone/Download Repository
|
||||
|
||||
```bash
|
||||
cd /path/to/workspace
|
||||
# Se usando git:
|
||||
git clone <repository-url>
|
||||
cd matlab_func
|
||||
|
||||
# Oppure scarica e estrai l'archivio
|
||||
```
|
||||
|
||||
### 2. Crea Virtual Environment (Consigliato)
|
||||
|
||||
```bash
|
||||
# Crea virtual environment
|
||||
python3 -m venv venv
|
||||
|
||||
# Attiva virtual environment
|
||||
# Linux/macOS:
|
||||
source venv/bin/activate
|
||||
|
||||
# Windows:
|
||||
venv\Scripts\activate
|
||||
```
|
||||
|
||||
Dovresti vedere `(venv)` nel prompt.
|
||||
|
||||
### 3. Installa Dipendenze Python
|
||||
|
||||
```bash
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
Questo installerà:
|
||||
- numpy
|
||||
- pandas
|
||||
- scipy
|
||||
- mysql-connector-python
|
||||
- openpyxl
|
||||
|
||||
### 4. Configura Database
|
||||
|
||||
#### Opzione A: Copia File Configurazione
|
||||
```bash
|
||||
cp DB.txt.example DB.txt
|
||||
nano DB.txt # oppure vim, code, etc.
|
||||
```
|
||||
|
||||
Modifica con le tue credenziali:
|
||||
```
|
||||
nome_database
|
||||
username
|
||||
password
|
||||
com.mysql.cj.jdbc.Driver
|
||||
jdbc:mysql://host:porta/database?useLegacyDatetimeCode=false&serverTimezone=Europe/Rome
|
||||
```
|
||||
|
||||
#### Opzione B: Crea Nuovo File
|
||||
```bash
|
||||
cat > DB.txt << EOF
|
||||
ase_monitoring
|
||||
myuser
|
||||
mypassword
|
||||
com.mysql.cj.jdbc.Driver
|
||||
jdbc:mysql://192.168.1.100:3306/ase_monitoring?useLegacyDatetimeCode=false&serverTimezone=Europe/Rome
|
||||
EOF
|
||||
```
|
||||
|
||||
### 5. Verifica Connessione Database
|
||||
|
||||
```bash
|
||||
python -c "
|
||||
from src.common.database import DatabaseConfig, DatabaseConnection
|
||||
config = DatabaseConfig('DB.txt')
|
||||
with DatabaseConnection(config) as conn:
|
||||
print('✓ Database connection successful')
|
||||
"
|
||||
```
|
||||
|
||||
Se vedi errori:
|
||||
- Verifica credenziali in DB.txt
|
||||
- Controlla che MySQL server sia raggiungibile
|
||||
- Verifica firewall rules
|
||||
- Testa connessione con: `mysql -h host -u user -p`
|
||||
|
||||
## Configurazione
|
||||
|
||||
### 1. Verifica Struttura Database
|
||||
|
||||
Il database deve avere le seguenti tabelle (schema semplificato):
|
||||
|
||||
```sql
|
||||
-- Tabelle dati grezzi
|
||||
CREATE TABLE raw_rsn_data (...);
|
||||
CREATE TABLE raw_tilt_data (...);
|
||||
CREATE TABLE raw_atd_data (...);
|
||||
|
||||
-- Tabelle dati elaborati
|
||||
CREATE TABLE elaborated_rsn_data (...);
|
||||
CREATE TABLE elaborated_tilt_data (...);
|
||||
CREATE TABLE elaborated_atd_data (...);
|
||||
|
||||
-- Tabelle configurazione
|
||||
CREATE TABLE control_units (...);
|
||||
CREATE TABLE chain_nodes (...);
|
||||
CREATE TABLE sensor_calibration (...);
|
||||
CREATE TABLE installation_parameters (...);
|
||||
|
||||
-- Tabelle monitoring
|
||||
CREATE TABLE sensor_alerts (...);
|
||||
CREATE TABLE alarm_devices (...);
|
||||
```
|
||||
|
||||
**Nota**: Per schema completo, vedere documentazione database del progetto originale.
|
||||
|
||||
### 2. Verifica File Configurazione Sensori
|
||||
|
||||
Per ATD con calcolo stella, verificare presenza file Excel:
|
||||
```
|
||||
<IDcentralina>-<catena>.xlsx
|
||||
```
|
||||
|
||||
Esempio: `CU001-A.xlsx`
|
||||
|
||||
### 3. Configura Logging
|
||||
|
||||
I log vengono salvati nella directory corrente. Per cambiarla:
|
||||
|
||||
```python
|
||||
# In codice chiamante
|
||||
from src.common.logging_utils import setup_logger
|
||||
|
||||
logger = setup_logger(
|
||||
control_unit_id="CU001",
|
||||
chain="A",
|
||||
module_name="RSN",
|
||||
log_dir="/var/log/sensor_processing" # Directory personalizzata
|
||||
)
|
||||
```
|
||||
|
||||
## Test Installazione
|
||||
|
||||
### Test 1: Import Moduli
|
||||
|
||||
```bash
|
||||
python << EOF
|
||||
from src.common.database import DatabaseConnection
|
||||
from src.rsn.main import process_rsn_chain
|
||||
from src.tilt.main import process_tilt_chain
|
||||
from src.atd.main import process_atd_chain
|
||||
print("✓ All imports successful")
|
||||
EOF
|
||||
```
|
||||
|
||||
### Test 2: Esegui Esempi
|
||||
|
||||
```bash
|
||||
python example_usage.py
|
||||
```
|
||||
|
||||
Output atteso:
|
||||
```
|
||||
╔==========================================================╗
|
||||
║ Sensor Data Processing System - Python Examples ║
|
||||
╚==========================================================╝
|
||||
|
||||
[... vari test ...]
|
||||
|
||||
Summary
|
||||
============================================================
|
||||
✓ PASS: Data Validation
|
||||
✓ PASS: Logging Setup
|
||||
✓ PASS: Database Connection
|
||||
|
||||
Total: 3/3 examples passed
|
||||
```
|
||||
|
||||
### Test 3: Elaborazione Dati Reali
|
||||
|
||||
```bash
|
||||
# RSN
|
||||
python -m src.rsn.main CU001 A
|
||||
|
||||
# Tilt
|
||||
python -m src.tilt.main CU001 B
|
||||
|
||||
# ATD
|
||||
python -m src.atd.main CU001 C
|
||||
```
|
||||
|
||||
Verifica:
|
||||
1. File log creati: `LogFile_<MODULE>-<UNIT>-<CHAIN>-*.txt`
|
||||
2. Dati scritti nel database
|
||||
3. Nessun errore critico nei log
|
||||
|
||||
## Configurazione Produzione
|
||||
|
||||
### 1. Variabili d'Ambiente
|
||||
|
||||
Invece di DB.txt, usa variabili d'ambiente:
|
||||
|
||||
```bash
|
||||
export DB_HOST="192.168.1.100"
|
||||
export DB_PORT="3306"
|
||||
export DB_NAME="ase_monitoring"
|
||||
export DB_USER="sensor_user"
|
||||
export DB_PASSWORD="securepassword"
|
||||
```
|
||||
|
||||
Modifica `common/database.py` per leggere env vars:
|
||||
```python
|
||||
import os
|
||||
|
||||
class DatabaseConfig:
|
||||
def __init__(self):
|
||||
self.config = {
|
||||
'database': os.getenv('DB_NAME'),
|
||||
'user': os.getenv('DB_USER'),
|
||||
'password': os.getenv('DB_PASSWORD'),
|
||||
# ...
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Systemd Service (Linux)
|
||||
|
||||
Crea `/etc/systemd/system/sensor-rsn@.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Sensor RSN Processing for %i
|
||||
After=network.target mysql.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
User=sensor
|
||||
WorkingDirectory=/opt/sensor_processing
|
||||
Environment="PYTHONUNBUFFERED=1"
|
||||
ExecStart=/opt/sensor_processing/venv/bin/python -m src.rsn.main %i A
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Attiva:
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable sensor-rsn@CU001.service
|
||||
sudo systemctl start sensor-rsn@CU001.service
|
||||
sudo systemctl status sensor-rsn@CU001.service
|
||||
```
|
||||
|
||||
### 3. Cron per Elaborazione Periodica
|
||||
|
||||
```bash
|
||||
crontab -e
|
||||
```
|
||||
|
||||
Aggiungi:
|
||||
```cron
|
||||
# Elabora RSN ogni ora
|
||||
0 * * * * cd /opt/sensor_processing && /opt/sensor_processing/venv/bin/python -m src.rsn.main CU001 A >> /var/log/sensor/rsn.log 2>&1
|
||||
|
||||
# Elabora Tilt ogni 6 ore
|
||||
0 */6 * * * cd /opt/sensor_processing && /opt/sensor_processing/venv/bin/python -m src.tilt.main CU001 B >> /var/log/sensor/tilt.log 2>&1
|
||||
|
||||
# Elabora ATD una volta al giorno alle 02:00
|
||||
0 2 * * * cd /opt/sensor_processing && /opt/sensor_processing/venv/bin/python -m src.atd.main CU001 C >> /var/log/sensor/atd.log 2>&1
|
||||
```
|
||||
|
||||
### 4. Monitoring con Supervisor
|
||||
|
||||
Installa supervisor:
|
||||
```bash
|
||||
sudo apt-get install supervisor # Ubuntu/Debian
|
||||
```
|
||||
|
||||
Crea `/etc/supervisor/conf.d/sensor-processing.conf`:
|
||||
|
||||
```ini
|
||||
[program:sensor-rsn-cu001]
|
||||
command=/opt/sensor_processing/venv/bin/python -m src.rsn.main CU001 A
|
||||
directory=/opt/sensor_processing
|
||||
user=sensor
|
||||
autostart=true
|
||||
autorestart=true
|
||||
stderr_logfile=/var/log/sensor/rsn-cu001.err.log
|
||||
stdout_logfile=/var/log/sensor/rsn-cu001.out.log
|
||||
```
|
||||
|
||||
Ricarica:
|
||||
```bash
|
||||
sudo supervisorctl reread
|
||||
sudo supervisorctl update
|
||||
sudo supervisorctl status
|
||||
```
|
||||
|
||||
### 5. Docker (Opzionale)
|
||||
|
||||
Crea `Dockerfile`:
|
||||
|
||||
```dockerfile
|
||||
FROM python:3.9-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Installa dipendenze
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Copia codice
|
||||
COPY src/ ./src/
|
||||
COPY DB.txt .
|
||||
|
||||
# Entry point
|
||||
ENTRYPOINT ["python", "-m"]
|
||||
CMD ["src.rsn.main", "CU001", "A"]
|
||||
```
|
||||
|
||||
Build e run:
|
||||
```bash
|
||||
docker build -t sensor-processing .
|
||||
docker run -d --name rsn-cu001 sensor-processing
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Problema: ModuleNotFoundError
|
||||
|
||||
```
|
||||
ModuleNotFoundError: No module named 'src'
|
||||
```
|
||||
|
||||
**Soluzione**:
|
||||
```bash
|
||||
# Assicurati di essere nella directory corretta
|
||||
cd /path/to/matlab_func
|
||||
|
||||
# Aggiungi al PYTHONPATH
|
||||
export PYTHONPATH="${PYTHONPATH}:$(pwd)"
|
||||
|
||||
# Oppure installa come package
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
### Problema: MySQL Connection Refused
|
||||
|
||||
```
|
||||
Error 2003: Can't connect to MySQL server
|
||||
```
|
||||
|
||||
**Soluzioni**:
|
||||
1. Verifica MySQL in esecuzione: `sudo systemctl status mysql`
|
||||
2. Controlla bind-address in `/etc/mysql/mysql.conf.d/mysqld.cnf`
|
||||
3. Verifica firewall: `sudo ufw allow 3306`
|
||||
4. Testa connessione: `telnet host 3306`
|
||||
|
||||
### Problema: Permission Denied per log files
|
||||
|
||||
```
|
||||
PermissionError: [Errno 13] Permission denied: 'LogFile_...'
|
||||
```
|
||||
|
||||
**Soluzioni**:
|
||||
1. Crea directory log: `mkdir -p /var/log/sensor && chmod 755 /var/log/sensor`
|
||||
2. Cambia ownership: `sudo chown sensor:sensor /var/log/sensor`
|
||||
3. Oppure usa directory home: `log_dir="~/sensor_logs"`
|
||||
|
||||
### Problema: Dati non trovati
|
||||
|
||||
```
|
||||
No data found for unit CU001, chain A
|
||||
```
|
||||
|
||||
**Verifiche**:
|
||||
1. Controlla database: `SELECT COUNT(*) FROM raw_rsn_data WHERE IDcentralina='CU001'`
|
||||
2. Verifica date iniziali nella configurazione
|
||||
3. Controlla log per errori di query
|
||||
|
||||
## Performance Tuning
|
||||
|
||||
### 1. Batch Size
|
||||
|
||||
Per grandi volumi di dati:
|
||||
```python
|
||||
# In db_write.py, aumenta batch size
|
||||
BATCH_SIZE = 10000 # invece di 1000
|
||||
```
|
||||
|
||||
### 2. NumPy Threads
|
||||
|
||||
```bash
|
||||
export OMP_NUM_THREADS=4
|
||||
export MKL_NUM_THREADS=4
|
||||
```
|
||||
|
||||
### 3. MySQL Tuning
|
||||
|
||||
In `/etc/mysql/mysql.conf.d/mysqld.cnf`:
|
||||
```ini
|
||||
[mysqld]
|
||||
innodb_buffer_pool_size = 2G
|
||||
max_allowed_packet = 64M
|
||||
bulk_insert_buffer_size = 256M
|
||||
```
|
||||
|
||||
## Supporto
|
||||
|
||||
### Log Files
|
||||
- Controllare sempre i log file generati
|
||||
- Livello di log regolabile in `logging_utils.py`
|
||||
|
||||
### Debug Mode
|
||||
```bash
|
||||
# Attiva logging verbose
|
||||
export LOG_LEVEL=DEBUG
|
||||
python -m src.rsn.main CU001 A
|
||||
```
|
||||
|
||||
### Contatti
|
||||
- Documentazione: [src/README.md](src/README.md)
|
||||
- Migration Guide: [MIGRATION_GUIDE.md](MIGRATION_GUIDE.md)
|
||||
- Issue tracker: [repository issues]
|
||||
|
||||
---
|
||||
|
||||
**Data setup**: 2025-10-12
|
||||
**Versione**: 1.0
|
||||
**Python richiesto**: 3.8+
|
||||
Reference in New Issue
Block a user