Repository navigation
Development Log
This page contains the raw, chronological development log of the BHAM (BACS Help Auto Mapper) project. It tracks the engineering decisions, feature implementations, architecture refactoring, and testing outcomes from the initial bootstrap to the current release.
Registro cronologico delle sessioni di sviluppo.
Gestione permessi admin – Linux & Windows
-
core/priv_check.py[NUOVO] – modulo centralizzato di privilege-check:- Linux: legge
CapPrmda/proc/self/status(bit 13 =CAP_NET_RAW) + fallback raw socket test; controlla gruppodialoutviagrp+os.getgroups(); tutto cached dopo il primo check. - Windows:
ctypes.windll.shell32.IsUserAnAdmin(). - Espone
check_privileges(),has_cap_net_raw(),has_dialout(),is_admin(). Mai solleva eccezioni; loga WARNING con comandi correttivi precisi.
- Linux: legge
-
main.py– chiamacheck_privileges()al boot, prima di registrare i listener. -
scanners/ip_sniffer.py– pre-flight checkhas_cap_net_raw()prima dello sniff; se mancante chiude la sessione conScanStatus.ERROR+error_messagevisibile dal frontend;_run_sniff()ritornastr|Noneper catturarePermissionErrorruntime. -
scanners/serial_sniffer.py– pre-flight checkhas_dialout()prima di aprire la porta; l'apertura seriale ora distinguePermissionError(con hint dialout/admin) da genericaException. -
data/models.py– aggiunto campoerror_message: Optional[str] = NoneaScanSessionper trasportare messaggi di errore leggibili verso il WebSocket/frontend. -
start.sh– blocco pre-avvio che leggeCapPrme controllagroups; mostra i comandi esatti se i permessi mancano, senza bloccare l'avvio. -
bham.exe.manifest[NUOVO] – UAC manifest Windows conasInvoker(nessuna elevazione forzata al lancio); DPI-aware per schermi ad alta risoluzione; le funzioni che richiedono admin (ARP sniffer) mostrano un errore friendly. -
bham.spec– aggiuntomanifest=_manifestall'EXE()ecore.priv_checkaglihiddenimports. -
Test: 22/22 OK con
-W error.
Step 1 – Bootstrap progetto
- Albero directory completo,
main.py,core/,data/,api/,scanners/,reports/,frontend/ -
.venv/Python 3.12, tutte le dipendenze installate (pip 26) -
requirements.txtversioni pinnate - Stack: FastAPI 0.115 | Pydantic 2.9 | pymodbus 3.7 | bacpypes3 0.0.102 | scapy 2.6
Step 2 – Motore Modbus RTU production
-
scanners/modbus.pyriscritto da zero:-
_calc_crc(),_crc_valid(),_looks_like_modbus_rtu()– CRC-16 puro Python -
_phase_zero()– listen asincrono multi-baud, detection CRC-validated -
_early_exit()– spy IDs {1,2,10}, LOCK al primo hit -
_full_sweep_rtu()– client persistente, FAST_TIMEOUT=0.12s, progress granulare -
scan_tcp()– Semaphore(20) concorrente, asyncio.as_completed
-
- Test CRC: frame noto OK, frame corrotto rifiutato ✓
Step 3 – BACnet production + FC43 + Report + UI progresso
-
scanners/bacnet.pyriscritto production:- Who-Is broadcast via bacpypes3 nativo async
- I-Am handler con upsert real-time su AppState
- Read Property batched (Semaphore 10): vendor-id, vendor-name, model-name, fw-rev, sw-ver
-
scanners/modbus.py– aggiuntoread_device_identification()/_fc43_blocking()(FC43/ME 0x0E) -
api/routes.py:-
/report/excele/report/pdf→FileResponsereale (download diretto browser) -
/diag/modbus/fc43→ lettura Device Identification da slave specifico
-
-
reports/excel.pyriscritto con stile:- Header colorati (cyan/purple/green), righe alternate, auto-width, freeze pane, filtri
- Foglio "Report Info" con metadati generazione
-
frontend/index.html– aggiornato:- Barra di progresso animata con glow CSS
- Header con pulsanti ⬇Excel / ⬇PDF / 📖API
- Pannello FC43 diagnostics
- Pulsante Clear state
-
frontend/css/main.css– classi riusabili input-field, btn-primary, progress-active -
frontend/js/app.js– upsert idempotente tabelle, progress bar live, FC43 panel
Step 4.A – Configurazione Periferiche + Persistenza Sessioni
-
core/hw_discovery.py– NEW:-
list_serial_ports()– pyserial, VID/PID RS485 noti (FTDI, CH340, CP210x, Prolific…), flagrs485_likely -
list_network_interfaces()– psutil, solo NIC UP con IPv4 valido, esclude loopback/link-local -
suggest_single_iface()– True se esiste una sola NIC cablata (stessa NIC per scan + client)
-
-
core/session_store.py– NEW:-
save_session()– JSON nominato + copia log insessions/ -
list_sessions()– indice metadata (no caricamento risultati completi) -
load_session(),delete_session()– con protezione path traversal
-
-
core/logger.py– aggiuntostart_session_log(),stop_session_log(),current_session_log_path() -
data/models.py– aggiunti:SerialPortInfo,NetworkInterface,SessionConfig,SavedSessionMeta -
data/state.py– aggiuntosession_config: Optional[SessionConfig],set_session_config(),snapshot()aggiornato -
api/routes.py– 8 nuovi endpoint (tags: setup, saved-sessions):- GET
/setup/serial-ports,/setup/network-interfaces,/setup/config - POST
/setup/configure→ applica config + avvia session log - POST
/saved-sessions/save, GET/saved-sessions/list - GET
/saved-sessions/{filename}, DELETE/saved-sessions/{filename}
- GET
-
frontend/index.html– pannello Setup overlay, modal Salva Sessione, modal Sessioni Salvate, badge config in header -
frontend/js/app.js–scanSerialPorts(),scanNetworkIfaces(),confirmSetup(),saveSession(),loadSavedSessions(),deleteSavedSession() -
sessions/directory creata -
requirements.txt– aggiuntopsutil>=5.9 - Test: tutti passati (CRUD session_store, modelli Pydantic, import routes)
Step 4.B + UI Reskin Stitch v2.0 Industrial Telemetry
-
frontend/css/main.css:- Riscritto completamente applicando il Design System Stitch v2.0
- CSS Custom Properties per Dual Mode: Light (Field High-Contrast) e Dark (Obsidian Telemetry)
- Color-coding rigido per protocollo: Modbus
#00f2fe/#0284c7, BACnet#c084fc/#7c3aed, ARP#10b981/#059669, FC43#f59e0b/#d97706, Abort#ef4444/#dc2626 - Font
JetBrains Monoper valori HW (IP, MAC, seriale, registri, ID slave, timestamp),Interper controlli e label - Layout a 3 colonne con scrolling indipendente per form, tabelle e live console
-
frontend/index.html:- Default
data-theme="dark" - Pulsante Toggle tema 🌙/☀️ con persistenza in
localStorage - Pulsante ⛔ Abort sticky in testata (previene blocchi porta e flood bus)
- Struttura semantica con classi
bham-*
- Default
-
frontend/js/app.js:-
applyTheme()etoggleTheme()con sync stato - Rimosso monkey-patching di
handleEvent(gestione nativaconfig_updated) - Rendering righe tabelle con classi
monoe color-coding protocollo
-
-
data/maps_manager.py– Riscrittura production completa:-
MapEntrydataclass (slave_id,register,register_type,label,unit,scale,description) -
MapsManagersingleton con in-memory store -
import_from_json()flessibile con supporto formati multipli BACS Help e upsert per slave ID -
export_to_json()consolidato per download -
get_map(),set_map(),clear(),load_map(),save_map()
-
-
api/routes.py:- POST
/maps/import– importazione definizioni mappa da JSON - GET
/maps/export– esportazione mappa completa BACS Help - GET
/maps/{slave_id}– consultazione mappa singolo slave
- POST
-
reports/pdf.py– Riscrittura report PDF vettoriale production:- Layout ReportLab a due passate con
NumberedCanvas(conteggio dinamico "Pagina X di Y") - Copertina impianto con metadati sessione (sito, porta seriale, NIC) e box riassuntivo dispositivi
- Tabelle color-coded per Modbus (ciano), BACnet (viola) e ARP (smeraldo)
- Wrapping sicuro celle con
Paragraphper evitare overflow
- Layout ReportLab a due passate con
- Python 3.12 compatibility:
- Sostituito
datetime.utcnow()deprecato condatetime.now(timezone.utc)e helperutc_nowindata/models.py,data/state.py,data/maps_manager.py - Filtro mirato per deprecation
ast.NameConstantdi ReportLab
- Sostituito
- Packaging & Standalone:
-
pyproject.toml(PEP 621) con metadati completi, script CLIbham = "main:app"e dipendenze -
bham.specper compilazione binario unico standalone via PyInstaller (asset frontend inclusi) -
README.mdesaustivo con architettura, installazione, guida operativa e documentazione API
-
- Test: tutti i 16 moduli importati e test funzionali passati con successo con
.venv/bin/python3 -W error✓
Step 5 – Fix Setup Wizard Startup + UI Clean Vector Overhaul + Motore KNXnet/IP Discovery
-
Fix Setup Wizard al Reload/Avvio:
-
frontend/js/app.js: inloadInitialState(), se!cfgRes?.configured, invoca automaticamenteopenSetupModal()e notifica a video. - Il wizard si apre in automatico se il sistema non è ancora configurato, ma resta sempre richiamabile dai pulsanti Setup nell'header o Modifica Parametri.
-
-
Overhaul Grafico & Rimozione Totale Emoji (Stile Industriale Autentico):
- Eliminazione al 100% di tutte le emoji da HTML, CSS e JavaScript per eliminare il look "prototipo AI".
- Incapsulamento di icone vettoriali SVG pulite, industriali e reattive (14-16px, 1.5-2px stroke) per tutti i controlli: porte seriali, interfacce NIC, download report, impostazioni, beacon live, log console, status pill e azioni modali.
- Logging tecnico a console standardizzato con tag tecnici tra parentesi quadre:
[NET],[MODBUS],[BACNET],[KNX],[ARP],[OK],[WARN],[ERROR],[ABORT].
-
Implementazione Nativa Sottosistema KNXnet/IP Discovery:
-
scanners/knx.py[NEW]:- Scanner asincrono UDP conforme standard KNXnet/IP Core (Service Type
0x0201SEARCH_REQUEST /0x0202SEARCH_RESPONSE). - Multicast verso
224.0.23.12:3671con fallback broadcast LAN255.255.255.255:3671(massima compatibilità gateway/router KNX commerciali). - Parsing DIB Device Info: Indirizzo Individuale a 16 bit formattato
Area.Linea.Device, Friendly Name dispositivo (30 byte Latin-1), Numero di Serie, MAC Address, Medium di comunicazione (TP1, IP, RF, PL110). - Upsert real-time e broadcast WebSocket su
state.knx_devices.
- Scanner asincrono UDP conforme standard KNXnet/IP Core (Service Type
-
data/models.py:- Aggiunto
Protocol.KNX_IP = "knx_ip". - Modello Pydantic
KNXDevicecon attributi dedicati e validazione ISO timestamputc_now().
- Aggiunto
-
data/state.py:- Storage
self.knx_devices: dict[str, KNXDevice], metodo atomicoupsert_knx(), aggiornatisnapshot()eclear().
- Storage
-
api/routes.py:- Endpoint di scansione
POST /scan/knx/ipcon schemaKNXIPScanRequest. - Endpoint dati
GET /devices/knx.
- Endpoint di scansione
-
reports/excel.py:- Aggiunto foglio dedicato "KNX Devices" con header arancione industriale
_HDR_ORANGE(#C2410C), auto-width, filtri e conteggio nel foglio di riepilogo "Report Info".
- Aggiunto foglio dedicato "KNX Devices" con header arancione industriale
-
reports/pdf.py:- Integrazione metadati e box riassuntivo KNXnet/IP nella prima pagina del report PDF.
- Tabella vettoriale color-coded per periferiche KNX con indirizzo individuale, seriale, MAC e nome gateway.
-
frontend/css/main.css:- Token colore dedicati per KNX (
--bham-knx: #fb923cin dark,#c2410cin light), badge count, pulsanti.bham-btn-knx, colorazione riga tabella.color-knx.
- Token colore dedicati per KNX (
-
frontend/index.html:- Scheda sidebar per avvio scansione KNXnet/IP.
- Tab filtro toolbar
KNXcon contatore badge dedicato. - Tabella dispositivi
KNXNET/IP DEVICEScon colonne: Indirizzo Individuale KNX, Nome Dispositivo, Medium, IP Gateway, MAC Address, Seriale.
-
frontend/js/app.js:- Gestione store
knx, rendering idempotente tabellarenderKNXTable(), avvio scansionestartKNX(), inclusione nella sequenza "Scansione Rapida Globale", esportazione CSV per KNX.
- Gestione store
-
-
Verifica e Test:
- Tutti i 17 moduli Python importati ed eseguiti senza warning con
.venv/bin/python3 -W error. - Test funzionali completi di routing API, serializzazione, generazione foglio Excel KNX e report PDF ReportLab passati con successo ✓
- Tutti i 17 moduli Python importati ed eseguiti senza warning con
Step 6 – Internazionalizzazione (IT, EN, ES) + Centro Impostazioni Unificato (De-duplicazione Pulsanti) + Manuale Completo & Help + Test Suite
-
Supporto Multilingua (i18n):
-
frontend/js/i18n.js[NEW]:- Sistema di internazionalizzazione completo per Italiano, Inglese e Spagnolo (
it,en,es). - Traduzione istantanea nel DOM di etichette (
data-i18n), placeholder (data-i18n-placeholder) e titoli/tooltip (data-i18n-title). - Selettore rapido in testata (
IT | EN | ES) con persistenza inlocalStorage.getItem("bham-lang"). - Messaggi dinamici tradotti tramite helper
window.t(key, params).
- Sistema di internazionalizzazione completo per Italiano, Inglese e Spagnolo (
-
-
Centro Impostazioni Unificato & Eliminazione Pulsanti Doppi:
- Risolti i 4 pulsanti duplicati che aprivano la configurazione (header Setup, telemetry strip "Modifica Parametri", Modbus card, sidebar footer "Ricarica Setup").
- Rimossi i controlli ridondanti: eliminato
Ricarica Setupdal footer sidebar (sostituito con link rapidoMappe BACS); la telemetry strip attiva ora mostra parametri informativi compatti. - Sostituito il vecchio modal Setup con il nuovo Centro Impostazioni BHAM a 5 schede:
- Hardware & Porte (Porta seriale RS485 con auto-scan, baud, parity, stop; Interfacce NIC con auto-scan e visualizzazione IP).
- Parametri Scansione (Timeout Modbus lento/veloce, Spy IDs sentinella, KNX multicast/timeout, ARP duration).
- Aspetto & Lingua (Selezione lingua, tema chiaro/scuro, buffer console).
- Sessioni Salvate (Archivio sessioni di collaudo con ripristino istantaneo nello stato attivo, download JSON ed eliminazione).
- Mappe BACS Help (Visualizzazione mappe attive, importazione diretta da testo/JSON, esportazione e azzeramento).
- Aggiunto il pulsante per il download del Report PDF vettoriale nella toolbar dei report accanto a CSV ed Excel.
- Toggle tema compatto ad icona unica (☀️ / 🌙) nell'header.
-
Manuale & Help Completo:
-
frontend/js/manual-content.js[NEW]:- Guida di campo interattiva integrata nella Web UI con navigazione a capitoli, accessibile dal tasto
Guida & Manualenell'header e con scorciatoia tastieraF1. - 8 capitoli tecnici completi disponibili in IT, EN ed ES: Quick Start, Modbus RTU/TCP, BACnet/IP, KNXnet/IP, ARP L2, Mappe BACS Help, Troubleshooting da campo e REST API.
- Guida di campo interattiva integrata nella Web UI con navigazione a capitoli, accessibile dal tasto
-
MANUALE_UTENTE.md[NEW]:- Manuale utente completo in formato Markdown per consultazione offline e stampa, servito direttamente anche dall'applicazione web (
/MANUALE_UTENTE.md).
- Manuale utente completo in formato Markdown per consultazione offline e stampa, servito direttamente anche dall'applicazione web (
-
-
Verifica e Miglioramenti Software:
-
data/state.py: aggiunto metodo atomicorestore_snapshot()per ricaricare sessioni archiviate nello stato attivo e trasmetterle via WebSocket a tutti i client connessi. -
api/routes.py: aggiunto endpointPOST /saved-sessions/{filename}/restore. -
core/session_store.py: corretto conteggio periferiche inlist_sessions()con inclusione diknx. -
scanners/base.py: aggiuntoreset_abort()esplicito per prevenire race-condition sul flag abort tra scansioni concorrenti. -
frontend/js/app.js: implementato modal di dettaglio slave per Modbus (sostituitoalert()primitivo con interfaccia tabellare registri e metadati). - Version bump a
v0.3.0incore/config.pyepyproject.toml. -
bham.spec: aggiuntoscanners.knxahiddenimports.
-
-
Test Suite Automatizzata:
-
tests/test_bham.py[NEW]: suite completa di 15 test unitari e di integrazione (modelli, state, session_store, maps_manager, reportistica Excel/PDF, endpoint REST API). - Tutti i 15 test passati con successo con
.venv/bin/python3 -W error -m unittest discover tests(zero errori, zero warnings) ✓
-
- Gestione scansioni speciali su protocolli come BACnet dove le porte UDP variano secondo la serie
BAC0,BAC1, etc. - Possibilità di inserire sia porte basiche/standard che porte custom su ogni singolo pannello di protocollo (Modbus TCP, BACnet/IP, KNXnet/IP).
- Riverifica completa del software: stabilità, operatività di tutte le funzionalità e assenza di warning/errori.
-
scanners/bacnet.py:-
parse_bacnet_ports(spec): supporto per interi (47808), simboliBAC0..BACF(0xBAC0..0xBACF= 47808..47823), range (BAC0..BAC3,47808-47812), elenchi separati da virgola (BAC0, BAC1, 50000), prefissi hex0xBAC0e notazione con etichettaBAC0 (47808). -
port_label(port): formattazione con indicatore simbolico. - Risolto bug critico stack
bacpypes3: passaggio daApplicationaNormalApplicationcon gestione automatica del prefisso di sottorete CIDR (/24o/8su loopback), attesa dei task di inizializzazione endpoint (_transport_tasks) prima dell'invio Who-Is. - Implementato abort immediato per
app.who_is(): gestione non bloccante con cancellazione istantanea del future e chiusura pulita dei socket infinally. - Risolta perdita di descrittore socket nel rilevamento dell'IP host con context manager
with socket.socket(...).
-
-
scanners/modbus.py:-
parse_modbus_tcp_ports(spec): parser robusto per porte Modbus TCP singole, multiple (es.502, 503, 5020) o range (502-504). -
scan_tcp(): genera combinazioni(host, port)con scansione concorrente via semaforo; sostituitoas_completedconasyncio.wait(pending)per eliminare il warning di coroutine non attese all'abort.
-
-
scanners/knx.py:-
scan(): invio multicast e broadcast all'effettiva porta configuratatarget_port(standard 3671 o custom 3672, etc.). - Chiusura esplicita in
finallysia del transport che del socket sottostante per prevenireResourceWarning.
-
-
api/routes.py:- Aggiornati i modelli Pydantic
ModbusTCPScanRequest(tcp_port: int | str = 502,tcp_ports: list[int] = []) eKNXIPScanRequest(port: int | str = 3671).
- Aggiornati i modelli Pydantic
-
frontend/index.html:- Modbus TCP: aggiunto input porta TCP con hint dinamico e pulsanti chip rapidi:
502 (Std),503,5020,Multi. - BACnet/IP: input porta con supporto simboli
BAC0..BACFe chip rapidi:BAC0 (47808),BAC1 (47809),BAC0..BAC3,BAC0..BACF. - KNXnet/IP: input porta con chip rapidi:
3671 (Std),3672,Multi. - Centro Impostazioni (Parametri Scansione): aggiunti campi di default per porte Modbus TCP, BACnet/IP e KNXnet/IP.
- Modbus TCP: aggiunto input porta TCP con hint dinamico e pulsanti chip rapidi:
-
frontend/css/main.css:- Aggiunti stili per
.bham-preset-pillse.bham-btn-chipcompatibili con tema scuro e chiaro.
- Aggiunti stili per
-
frontend/js/app.js:- Implementati helper reattivi
setTcpPortPreset,updateTcpPortHint,setBacnetPortPreset,updateBacnetPortHint,setKnxPortPreset,updateKnxPortHint. - Aggiornati
startTCP(),startBACnet(),startKNX()per trasmettere i valori inseriti dall'utente alle API. - Sincronizzazione automatica e persistenza delle porte in
localStorage(bham-scan-params) con caricamento all'avvio.
- Implementati helper reattivi
-
frontend/js/i18n.js:- Aggiunte chiavi di traduzione per etichette porte e campi impostazioni in Italiano, Inglese e Spagnolo.
-
frontend/js/manual-content.js&MANUALE_UTENTE.md:- Documentata l'architettura delle porte speciali BAC0..BACF, i range e le porte gateway Modbus/KNX in tutte le lingue.
- Eseguita suite automatica di 19 test unitari e di integrazione (
tests/test_bham.py):- Verifica modelli e serializzazione timezone-aware
- Test AppState e ripristino snapshot
- Test MapsManager (import/export 3 punti su 2 slave)
- Test esportazione report Excel e PDF
- Test endpoint REST API (Health, State, Setup, Saved Sessions con restore e delete, Abort)
- Test parsing porte BACnet (
BAC0,BAC1,BACF, rangeBAC0..BAC3,0xBAC0, custom) - Test etichette porte BACnet (
port_label) - Test parsing porte Modbus TCP (
502,503,502, 503, 5020, range, liste) - Test avvio scansioni asincrone con porte custom e gestione abort pulito
- Risultato test: 19/19 superati con codice di uscita 0 e ZERO warning/errori eseguito con flag
-W error. - Verifica runtime FastAPI: 36 route HTTP/WS correttamente registrate e montate.
- Verifica sintassi JS:
node -csuperato con esito positivo per tutti i file frontend.
- Implementazione completa del modulo di sniffing seriale passivo RS485 (Zero-TX / Stealth Mode) per operare su bus fisici in marcia con PLC Master attivi (Carel, Siemens, Johnson Controls, Honeywell, Schneider, ecc.) evitando qualsiasi collisione hardware o disturbo al ciclo di regolazione.
- Dissettore e decodifica approfondita per frame Modbus RTU:
- Differenziazione automatica tra Query del Master (M ➔ S) e Risposte dello Slave (S ➔ M).
- Validazione checksum CRC-16.
- Decodifica codici funzione FC01, FC02, FC03, FC04, FC05, FC06, FC15, FC16, FC43 (MEI).
- Estrazione automatica registri, conteggi e valori con catalogazione nello stato dei dispositivi con etichetta
[SNIFFED].
- Dissettore per frame BACnet MS-TP:
- Riconoscimento preambolo
0x55 0xFF. - Validazione Header CRC-8 conforme ASHRAE 135 (residuo
0x55). - Mappatura continua della catena del token ring (MAC 0..127) e frame Poll For Master.
- Validazione Data CRC-16 (polinomio ISO-HDLC/X.25, residuo
0xF0B8) e catalogazione automatica nello stato dispositivi.
- Riconoscimento preambolo
- Calcolo in tempo reale della telemetria Bus Health:
- Frame Rate (FPS).
- Packet Error Rate % (PER) con soglie visive di qualità del doppino.
- Stima percentuale di Bus Load in relazione al baudrate attivo.
- Mappatura nodi e dispositivi attivi rilevati.
- Integrazione completa nella Web UI:
- Card dedicata "Sniffer Passivo (RS485)" nella barra laterale con filtri di protocollo, baudrate, parità e durata.
- Selettore a tab nella colonna di destra: "Live Log" vs "RS485 Inspector" con badge numerico dinamico dei frame catturati.
- Banner telemetrico Bus Health a scomparsa con chip grafici dei nodi attivi.
- Tabella Inspector dei frame seriali in tempo reale con streaming via WebSocket (
serial_frame,serial_bus_health).
- Supporto multi-lingua completo (Italiano, Inglese, Spagnolo) e documentazione manuale interna ed offline.
- Suite di test di unità e integrazione con verifica a zero warning sotto flag
-W error.
- Definito enum
FrameDirection(MASTER_TO_SLAVE,SLAVE_TO_MASTER,TOKEN,POLL_FOR_MASTER,BROADCAST,UNKNOWN). - Creato modello Pydantic
SerialFrame: timestamp, proto, raw_hex, direction, sender_id, target_id, func_or_type, data_summary, crc_ok, byte_count. - Creato modello Pydantic
BusHealth: timestamp, fps, error_rate_pct, bus_load_pct, total_frames, error_frames, active_nodes, status. - Esteso
AppState:- Aggiunti storage e metodi
update_bus_health(),record_serial_frame()(mantiene gli ultimi 500 frame catturati). - Aggiornati metodi
snapshot()eclear()per includere e azzerarebus_healtheserial_frames.
- Aggiunti storage e metodi
- Modulo asincrono nativo basato su
pyserial_asyncioeasyncio:- Apertura seriale in sola lettura hardware senza mai invocare scritture su TX né commutare linee RTS/DTR.
-
_auto_detect_baud_parity(): scansione passiva silenziosa per agganciare baudrate (9600, 19200, 38400, 57600, 115200) e parità (None, Even, Odd) al primo frame valido. -
_dissect_modbus_rtu(): parser a macchina a stati con buffer circolare, validazione CRC-16, tracking delle query del master per correlare indirizzi di registro richiesti con i byte restituiti dallo slave, auto-upsert instate.upsert_modbus(device)con flagsniffed=True. -
_dissect_bacnet_mstp(): parser preambolo0x55 0xFF, calcolo CRC-8 Header (ASHRAE 135) e CRC-16 Data (ISO-HDLC), catalogazione token ring e upsert instate.upsert_bacnet(device). -
_health_calculator(): task periodico (1s) che calcola telemetria del bus e invia aggiornamenti via WebSocket ai client connessi.
- Definito modello di richiesta
SerialSniffRequest(port,baudrate,parity,stopbits,protocol_filter,duration). - Implementato endpoint
POST /api/v1/scan/serial/sniff: avvio in background dello sniffer passivo con monitoraggio dell'abort flag. - Implementato endpoint
GET /api/v1/diag/serial/health: restituzione istantanea della telemetria Bus Health attiva. - Integrazione con
POST /api/v1/scan/abortper l'arresto immediato del task di sniffing seriale e rilascio sicuro della porta.
4. Frontend & Design System Industriale (frontend/index.html, frontend/css/main.css, frontend/js/app.js)
-
Card Sniffer Passivo:
- Filtro Protocollo (Auto, Modbus RTU, BACnet MS-TP), Baudrate (Auto, 9600..115200), Parità, Durata (15s, 30s, 60s, Continuo).
- Pulsanti tattici
Avvia Sniffing PassivoeFerma Sniffer.
-
RS485 Live Inspector & Bus Health Banner:
- Switcher a schede
Live Log/RS485 Inspectorcon contatore telegrammi. - Strip telemetrica ad alta visibilità: stato bus (OTTIMO, ACCETTABILE, CRITICO), FPS, Bus Load %, PER %, chip nodi attivi.
- Tabella ad alto contrasto dei frame: timestamp, protocollo, direzione (
M➔S,S➔M,TOKEN,POLL), mittente, destinatario, funzione/tipo, registri/dati, badge CRC (OK/ERR).
- Switcher a schede
-
Streaming WebSocket:
- Gestione in tempo reale degli eventi
serial_frameeserial_bus_healthcon buffering e rendering reattivo senza latenza.
- Gestione in tempo reale degli eventi
5. Internazionalizzazione & Manualistica (frontend/js/i18n.js, frontend/js/manual-content.js, MANUALE_UTENTE.md)
- Traduzione di tutti i termini, badge e controlli UI in Italiano, Inglese e Spagnolo (
i18n.js). - Creazione del capitolo 5: "Sniffer Seriale Passivo (RS485 Zero-TX / Stealth Mode)" nel manuale integrato per IT, EN ed ES con indicazioni sul Packet Error Rate (PER), regole fisiche del bus e mitigazione disturbi.
- Aggiornamento della documentazione offline in
MANUALE_UTENTE.mdefrontend/MANUALE_UTENTE.mdcon tabella REST API e panoramica operativa.
- Aggiunti 3 test completi in
TestSerialSniffer:-
test_dissect_modbus_rtu_query_and_response(): verifica correlazione query M➔S ed estrazione registri slave S➔M, validazione CRC-16, upsert su AppState con etichetta[SNIFFED]. -
test_dissect_bacnet_mstp(): verifica trame Token e Data MS-TP, validazione Header CRC-8 (ASHRAE 135) e Data CRC-16 (ISO-HDLC), catalogazione nodi. -
test_serial_sniff_endpoint_and_health(): test d'integrazione API per avvio sniffing, intercettazione abort e lettura endpoint/diag/serial/health.
-
- Risultato totale: 22/22 test superati in 0.7s con ZERO errori e ZERO warning con
-W error. - Verifica sintassi JS:
node -csuperato con esito positivo per tutti i file frontend.
-
Verifica Globale Backend & Dipendenze:
- 24/24 moduli Python caricati e testati senza errori.
- Censite tutte le 38 route registrate in FastAPI (REST, WS, Docs).
- Suite di test automatizzata: 22/22 test passati in 0.7s con ZERO errori e ZERO warning con
-W error.
-
Audit e Perfezionamento Frontend / i18n:
- Risolto disallineamento su due chiavi HTML (
duration_labeleselected_port), aggiunte e allineate infrontend/js/i18n.js. - Raggiunta parità assoluta (100%) con 157 chiavi tradotte in Italiano, Inglese e Spagnolo.
- Integrità DOM: 93/93 elementi interrogati da
app.jsverificati su 116 ID presenti inindex.html. - Manuale utente (
manual-content.jseMANUALE_UTENTE.md): 9 capitoli speculari sincronizzati per IT, EN ed ES.
- Risolto disallineamento su due chiavi HTML (
-
Validazione Reportistica:
- Generazione collaudata con dataset multi-protocollo completo per Excel (.xlsx) e PDF vettoriale (%PDF-1.4).
-
Stato Runtime:
- Demone Uvicorn attivo su
http://0.0.0.0:8765con bind globale per accesso da rete locale (LAN). - Endpoint di controllo verificati:
/api/v1/health(HTTP 200),/api/v1/state(HTTP 200),/MANUALE_UTENTE.md(HTTP 200).
- Demone Uvicorn attivo su
Chiusura Sprint v0.3.0, Consolidamento Task, Allineamento Packaging & Checklist Operativa Field Test (Round 1)
-
Chiusura formale di tutti i task di sviluppo per la release v0.3.0:
- Il sistema ha raggiunto piena maturità con supporto attivo a Modbus RTU/TCP, BACnet/IP, KNXnet/IP, ARP L2 e Sniffer Seriale Passivo RS485.
- Tutti i task aperti sono stati formalmente completati, verificati e sigillati.
-
Valutazione Feature "Recupero Registri Online":
- La feature viene catalogata per la roadmap successiva: dopo il primo giro di collaudo sul campo reale, si valuterà se integrare un database/catalogo profili JSON offline precaricato oppure un servizio cloud di lookup.
- L'importazione mappe è già pienamente operativa tramite il motore BACS Help JSON.
-
bham.spec: Aggiunto'scanners.serial_sniffer'neihiddenimports. -
README.md: Aggiornato con tutte le caratteristiche introdotte nelle ultime sessioni (KNXnet/IP, Sniffer Seriale Passivo, Bus Health, multi-port, i18n, Manuale Integrato F1). -
Test Suite: 22/22 test unitari e di integrazione passati al 100% con flag
-W error.
-
Release:
v0.3.0congelata con successo, zero debiti tecnici.
Automazione CI/CD Rilasci GitHub, Packaging Debian/Ubuntu (.deb), One-Line Linux Installer e WinGet Auto-Publish
-
Automazione Avanzamento Versioni (
scripts/bump_version.py):- Creato script Python per aggiornamento sincronizzato di
pyproject.toml,core/config.pye manifesti WinGetwinget/*.yamlsecondo lo standard SemVer.
- Creato script Python per aggiornamento sincronizzato di
-
Release 1-Click da Browser (
.github/workflows/release.yml):- Aggiunto trigger
workflow_dispatchcon menu a tendina per rilascio in 1 click dal portale web GitHub. - Creazione automatica del commit, del Git Tag, compilazione parallela cloud per Windows x64 e Linux x64, calcolo hash SHA256 e pubblicazione della GitHub Release.
- Aggiunto trigger
-
Packaging Linux Nativo & One-Line Installer:
-
scripts/package_deb.sh: compilazione pacchetto standard Debian/Ubuntu.deb. -
scripts/install.sh: universal one-line installer per tecnici di cantiere.
-
-
Automazione WinGet (
vedantmgoyal2009/winget-releaser):- Integrato nel workflow cloud per invio automatico della Pull Request al repository ufficiale Microsoft
microsoft/winget-pkgs.
- Integrato nel workflow cloud per invio automatico della Pull Request al repository ufficiale Microsoft
-
Guida Operativa & Brand Domain:
- Documentate tutte le procedure in
GUIDA_GITHUB_WINGET.md, con valorizzazione del dominiowww.bacshelp.comper redirect permanenti.
- Documentate tutte le procedure in