Funzioni del box: cosa fanno e chi usa il risultato¶
Ricognizione del 29/10/2026 sul codice di mdm_installation (origin/main 3.2.9 e origin/stage 3.9.0), cercando le funzioni del box poco o per nulla documentate e controllando, per ognuna, se il risultato arriva a qualcuno (midserver, pannello, qAlarm, sistema vecchio). Nessuna prova sul campo, salvo dove indicato.
Riepilogo¶
| Funzione | Linee | Funziona? | Il risultato arriva a qualcuno? | Dettaglio |
|---|---|---|---|---|
| Anti-manomissione (telecamera coperta o spostata) | entrambe | sì, con limiti | no | pagina dedicata |
| Rilevamento incendio e fumo | entrambe | no: analizza e poi scarta | no | sotto |
Ritardo dell'ingresso di allarme GANZ (monitoring_ganz_alarm_in) |
main letto, stage non usato |
— | — | sotto |
Pulizia del disco (clean_disk) |
entrambe | in parte | — | sotto |
| Inserimento e disinserimento automatico a orario | stage |
da provare | eventi verso midserver e Telegram | sotto |
| Rifiuto dell'inserimento con componenti critici non sani | stage |
da provare | evento dedicato | sotto |
| Eventi del box e Telegram diretto dal box | stage |
da provare | MQTT verso midserver e Telegram | sotto |
| Controlli di salute e azioni di ripristino | stage |
controlli sì, ripristino non collegato | eventi di guasto | sotto |
Protezione delle API /api/v1 (allarmi, inserimento, panico) |
stage |
da verificare subito | — | sotto |
Rilevamento incendio e fumo¶
app/services/fire_detection/fire_smoke_detector.py, avviato all'accensione del box in entrambe le linee. Si accende dal pannello (Installation Config, fire_detection.enable, spento di default).
- Cosa fa: a intervalli (
monitoring_interval, 120 s), per ogni telecamera prende uno snapshot, lo passa al modello YOLOfire_smoke.pte disegna un rettangolo sui riquadri trovati. - Cosa non fa: non applica soglie di confidenza, non salva l'immagine, non genera eventi, non avvisa nessuno. Il risultato viene scartato.
- Probabile errore: la chiamata
cv2.putTextha parametri scambiati (per esempiolineTypecon un colore ethickness=0.5). Andrebbe in errore a ogni riquadro trovato, con l'errore scritto solo nei log. - Effetto se acceso: consuma CPU (modello YOLO su ogni telecamera) senza nessun beneficio. Chi lo accende dal pannello crede di avere una protezione antincendio che non esiste.
Impostazioni senza effetto¶
check_camera_damagenellastage: dal 29/10 accende il nuovo rilevamento di manomissione, con eventi verso il midserver (anti-manomissione).monitoring_ganz_alarm_in(attivazione etime_out): nella 3.2.x viene letta come ritardo dell'ingresso di allarme del GANZ; nellastageesiste nel modello ma nessun codice la usa.- Da tenere presente per l'import delle configurazioni (MDM-080) e per il pannello, che la mostra ancora.
Pulizia del disco¶
clean_disk: se attiva e il disco supera l'80%, il monitoraggio manda all'host docker image prune -af (app/utils/system_utils.py).
- Cosa libera: solo le immagini Docker non usate.
- Cosa non libera: le registrazioni di Frigate e le immagini degli allarmi, che di solito sono ciò che riempie il disco.
- Effetto collaterale: cancella anche l'immagine della versione precedente, quindi un ritorno indietro richiede di riscaricarla da ECR.
- Nella
stagec'è in più una pulizia giornaliera dei log del box (log_retention_days, 90 giorni).
Inserimento e disinserimento automatico a orario¶
stage, app/services/alarm_schedule_manager/alarm_schedule_manager.py; si attiva con enable_automated_arming e la tabella alarm_schedule (fasce per giorno della settimana, grace_minutes), configurabili via MQTT dal midserver.
- Ogni minuto: nella finestra di chiusura, se il box è disinserito, inserisce; nella finestra di apertura, se è inserito, disinserisce.
- Negli impianti con cluster lo comunica anche agli slave.
- Gli eventi risultano generati dal sistema (
AUTOMATED). - Da decidere con la centrale: cosa succede se l'inserimento automatico fallisce (vedi sotto) e chi viene avvisato. Va deciso anche il rapporto con gli inserimenti a orario del sistema vecchio, cioè gli automatismi del progetto di Michele (
arm-disarm_automated), per non avere due sistemi che inseriscono lo stesso impianto.
Rifiuto dell'inserimento con componenti critici non sani¶
stage, alarm_system_manager.py: prima di inserire il box controlla i componenti critici, per default detector, trombe e ingressi di allarme (health_config.critical_components).
- Se uno non è sano, rifiuta l'inserimento e manda l'evento "inserimento rifiutato per salute critica".
- Nello stato
ERRORil box rifiuta sia l'inserimento sia il disinserimento. - Conseguenza da valutare: una tromba guasta, o un ingresso di allarme non collegato, può lasciare un impianto disinserito, anche con l'inserimento automatico a orario. Va deciso con la centrale se è il comportamento voluto (meglio disinserito che inserito senza tromba?) e come viene avvisato l'operatore.
Eventi del box e Telegram diretto¶
stage, app/services/event_manager/.
- Eventi: inserimento e disinserimento, allarme, intrusione, panico, guasto, ripristino (avvio, eseguito, non riuscito, riuscito), inserimento rifiutato.
- Due consegne per ogni evento:
- via MQTT al midserver, verso qAlarm;
- a un provider di notifiche, oggi solo Telegram, con tre chat: cliente, centrale operativa, centro guasti (
notification_config.provider). - Coda: gli eventi non consegnati restano in coda (
pending_events) e vengono rimandati ogni 30 s. - Messaggio al cliente: per inserimento e disinserimento parte solo se
notify_clientè attivo. - Effetti:
- il box diventa un altro mittente Telegram, oltre al sistema vecchio, con il token del bot salvato nella configurazione del box;
- quando si spegnerà Telegram (T10.2) andrà cambiato anche qui;
- se il provider non è configurato,
_get_contextsolleva un errore: da verificare che l'evento MQTT parta comunque.
Controlli di salute e ripristino¶
stage, app/services/health_manager/.
- Controlli:
- VPN, cioè una connessione TCP sulla porta 80 verso un indirizzo di destinazione;
- detector;
- ogni telecamera, dalla salute riportata dal wrapper;
- dispositivi (trombe, ingressi);
- carico di CPU, RAM e disco (soglia 90%).
- Guasto: dopo
fault_thresholdcontrolli falliti (3) il box genera un evento di guasto, con promemoria ogni ora finché dura, e un evento di ripristino quando torna normale. - Azioni di ripristino automatiche: l'infrastruttura c'è (
ShellRecoveryAction, che esegue un comando sull'host), ma nessun controllo ha un'azione configurata: oggi il box segnala e non ripara.
Protezione delle API /api/v1¶
stage, app/routes/v1/v1_routes.py e app/services/security/validate_vpn_ip.py. Le API per inserire, disinserire, panico, allarme del detector (/api/v1/alarm/detection) e intrusione richiedono:
- utente e password del box (autenticazione base). L'utente
adminviene creato dalla prima migrazione con la stessa password su tutti i box (initial_migration_001.py); - indirizzo di origine in un elenco scritto nel codice:
127.0.0.0/8,192.168.1.0/24,192.168.3.0/24,172.16.16.0/24(VPN),172.17.0.0/16(Docker).
Il box gira in rete host, quindi vede l'IP reale di chi chiama.
- Il GANZ manda gli allarmi al box su
http://<IP box>:5005/api/v1/alarm/...(Event Action → HTTP, gestione-telecamere). Se la rete locale del cliente non è192.168.1.xo192.168.3.x, la richiesta viene rifiutata (403) e l'allarme non entra nel box. - Il GANZ di laboratorio è su
192.168.200.x. - Lo stesso vale per qualsiasi apparato locale che usa queste API.
- Restano invece aperte, senza autenticazione, le rotte vecchie (
/ganz/alarm,/frigate/alarm/{name}), che salvano l'allarme nei log.
Da verificare subito sul box di prova MDMTESTGANZ1: quale indirizzo è configurato nel GANZ, se gli allarmi arrivano e con quale codice di risposta (MDM-083).
Soluzione ideale¶
Ogni funzione accesa dal pannello fa quello che promette, e il suo risultato arriva all'operatore in qAlarm; le funzioni non finite non si possono accendere.
- Incendio e fumo: si completa con soglia, conferma su più immagini ed evento in qAlarm con l'immagine, oppure si toglie dal pannello e dall'avvio finché non è pronta.
- Impostazioni senza effetto: tolte dal pannello o ricollegate.
- Pulizia del disco: libera anche registrazioni e immagini vecchie secondo una politica di conservazione, e mantiene l'immagine della versione precedente.
- Inserimento a orario e rifiuto per salute critica: comportamento deciso con la centrale e scritto; ogni inserimento automatico fallito arriva all'operatore come evento.
- Notifiche: un solo canale verso gli operatori, cioè gli eventi via midserver verso qAlarm. Telegram dal box resta solo finché serve, e non manda doppioni.
- API v1: reti consentite configurabili per impianto (la rete locale del cliente), credenziali diverse per ogni box, verifica che gli apparati locali (GANZ) usino utente e password.
- Ripristino automatico: azioni configurate solo dove sono sicure (per esempio il riavvio del wrapper), sempre con evento.
Cosa dobbiamo fare¶
| # | Passo | Ticket |
|---|---|---|
| 1 | Sul box di prova: verificare che gli allarmi del GANZ arrivino a /api/v1/alarm/... (IP di origine, credenziali, codice di risposta); rendere configurabili le reti consentite e le credenziali per box |
MDM-083 |
| 2 | Decidere con la centrale: rifiuto dell'inserimento per salute critica, inserimento a orario (e convivenza con gli automatismi del sistema vecchio), notifiche Telegram dal box | A24 |
| 3 | Incendio e fumo, monitoring_ganz_alarm_in, pulizia del disco: completare o togliere dal pannello e dall'avvio |
MDM-084 |
| 4 | Verificare che senza provider di notifiche l'evento MQTT parta comunque | MDM-084 |
| 5 | Anti-manomissione | MDM-082 |