Vai al contenuto

MDM-080 · Import delle configurazioni 3.2.x nella nuova versione

Campo Valore
Gruppo 6 · Migrazione del parco
Assegnato a (proposta) Lorenzo
Priorità P1
Stima indicativa M
Stato 🔄 in corso
Attività del piano T9.2
Dipende da MDM-030

Contesto

La nuova versione (oggi linea stage, da unire in main) salva la configurazione in SQLite e, se il database non ha ancora schema_versions, scrive i valori di default: un box 3.2.x aggiornato ripartirebbe con mac vuoto, non configurato e disinserito. L'import dei file JSON c'era ed è stato tolto il 27/02/2026. Analisi e corrispondenza dei campi: migrazione-box-alla-nuova-versione.md.

Cosa fare (sviluppo su stage, rilascio con l'unione in main)

  • [x] Al primo avvio, prima dei default: se esistono config.json/setting.json, importarli con la corrispondenza dei campi (envirment → environment con production → prod, enable_webRtc → enable_webrtc, enable_screen_shot → enable_screenshot, gpio_usb → io_settings). Fatto il 30/10/2026 su stage, non committato: app/core/db/migrations/legacy_import.py, chiamato da InitialMigration_001.
  • [x] Stato inserito/disinserito: da arm_state.disarmed (3.2.9) oppure, se la tabella manca (3.1.9–3.2.2), dal detector (wrapper 3.x /api/v1/detection/status, wrapper 2.x /frigate/disarm/status, GANZ /api/rule/es/disarm/); se non si legge, LegacyImportError e nessuna scrittura. configured = true, environment da envirment. Il detector va letto prima di fermare lo stack vecchio: è compito del ponte (MDM-081).
  • [ ] Wrapper: confrontare la configurazione del wrapper Flask (2.0.1, 3.0.6) con quella FastAPI e convertirla se serve.
  • [x] Conservare i file originali in una copia di backup (legacy_3x_backup/); non cancellarli.
  • [x] Comando mdm db import-legacy (solo anteprima, password nascoste; --no-read-detector per non interrogare il detector).
  • [x] Chiarire pin.json. Il "PIN" è una scheda GPIO su USB collegata in seriale al box Frigate (gpio_usb in config.json è la porta, per esempio /dev/ttyUSB0; comandi testuali gpio readall/gpio set N/gpio clear N a 19200 baud). Introdotta il 12/11/2024 (40bc6e7c, app/services/pin/ in main), attiva solo se gpio_usb è valorizzato. Funzioni: ingresso 0 = inserimento/disinserimento da un contatto esterno (per esempio una centrale antifurto); ingresso 3 = allarme verso il server dei log (send_alarm_in); ingressi 6 e 7 riportati come alarm_in nello stato; uscite 6 e 7 = relè impulsivi (5 s) comandati da MQTT (trigger_pin). pin.json contiene la polarità (system_arm, alarm_trigger, relay_trigger per uscita) e l'ultimo stato letto. Nella linea stage il PIN è stato tolto il 27/02/2026 (137bf876, "Removed no longer used pin handler"): restano solo il campo io_settings.gpio_usb, mostrato dal pannello, e due gestori MQTT, trigger_pin segnato come deprecato e frigate_update_pin_config, che chiama ancora pin_handler e quindi fallisce sempre. Sul parco non risulta in uso: nel censimento del 28/10/2026 tutti i 29 box che rispondono (3.1.9 Frigate e GANZ, 3.2.1, 3.2.2, 3.2.9) hanno has_pin = false, cioè gpio_usb vuoto. L'import segnala gpio_usb valorizzato come non supportato e non importa pin.json. Da verificare sui box non raggiungibili. Decisione del 30/10/2026: il PIN non si supporta più. Tolti, non committati: in mdm_installation (stage) le tre azioni MQTT del PIN e il campo gpio_usb di IOModel (le configurazioni salvate con quel campo si caricano ancora); in mdm_web_panel (dev) il campo gpioUsb di IOConfigEntity. has_pin resta nello stato letto da midserver e pannello finché ci sono box 3.x. sound_url → io_settings.horns: importato come tromba DataLab all'IP dell'URL solo se enable_sound è vero; la 3.x chiamava https://<ip>, la nuova versione http://<ip>:80, quindi porta e protocollo da verificare su una tromba vera.
  • [ ] Test con file reali di alcuni box (anonimizzati): 3.1.9 GANZ, 3.1.9/3.2.2 Frigate, 3.2.9 Frigate. Fatto: test automatici con file anonimizzati (3.2.9 Frigate, 3.1.9 GANZ) e prova della catena reale di migrazioni (001→007) su una copia dei file e del database 3.2.9 del box di prova MDMTESTFRIGATE1: codice, impostazioni e stato inserito importati. Mancano file reali di un box GANZ.

Criteri di accettazione

Verifica del 02/11/2026: il codice dell'import è committato in origin/stage (db444987), quindi i riferimenti a «non committato» sopra descrivono il 30/10. Superati 17 test di import/gestore migrazioni e Ruff. Import 001→007 provato su copia del backup reale GANZ con stato letto dal detector e fornito al processo isolato: configurazione, impostazioni, I/O, stato e JSON conservati; seconda esecuzione senza cambiamenti, SQLite integro. La tabella arm_state del backup è vuota: la lettura del detector serve anche in questo caso. Restano un campo segnalato come non importato da esaminare, la verifica con log esistenti (backup GANZ: 0 log), wrapper e prova di avvio reale; ticket non completato. Dettaglio e limiti della prova.

  • Su un database vuoto con i file di un box 3.2.x, la nuova versione parte con lo stesso mac, detector, stream, privacy, impostazioni e stato inserito/disinserito.
  • Un box installato da zero continua a ricevere i default.

Rischi e attenzioni

I file reali contengono credenziali di GANZ e telecamere: usarli solo in locale, mai nei test versionati senza anonimizzarli.

Riferimenti