Strumento web di pianificazione WiFi per il posizionamento di access point su planimetrie. Simula la propagazione del segnale WiFi utilizzando modelli di perdita di percorso indoor con specifiche reali degli access point Extreme Networks AP3000.
- Importazione planimetrie — Carica PDF, DXF/DWG o immagini
- Rotazione planimetria — Ruota la vista di 90° (↺↻) per adattare planimetrie in orientamento non standard
- Calibrazione scala obbligatoria — All'apertura di ogni nuovo piano
- Disegno muri — Catena continua, materiali diversi (cemento, cartongesso, vetro, vetro Low-E, mattone, metallo, porte, finestre)
- Scaffalature supermercato — Tool dedicato (🛒) per disegnare scaffali come segmenti orientabili; 3 tipi con attenuazione RF realistica: Vuoto (5/8 dB), Pieno (12/20 dB), Freschi/refrigerato (16/28 dB a 2.4/5 GHz)
- Posizionamento AP — Icone blu draggabili con nome, doppio click per eliminare
- Heatmap WiFi — Due modalità: Copertura segnale + Overlap AP (interferenza); include l'attenuazione delle scaffalature nel calcolo
- Tooltip dBm — Valore segnale in tempo reale al passaggio del mouse
- Righello — Misura distanze sulla planimetria
- Esportazione PDF — Planimetria completa con AP, muri e heatmap
- Riconoscimento muri AI — DeepFloorPlan
- Docker >= 20.10 e Docker Compose >= 2.0
- RAM: minimo 4 GB (consigliati 8 GB per il modulo AI)
- Disco: minimo 5 GB liberi
- Porte: 80 (HTTP), 443 (HTTPS opzionale)
- OS: Linux (produzione), Windows/macOS (sviluppo)
git clone https://github.com/mmereu/wifi-planner.git
cd wifi-plannercp .env.example .envModifica .env con un editor di testo:
POSTGRES_DB=hamina
POSTGRES_USER=hamina_user
POSTGRES_PASSWORD=UnaPasswordSicura123! # CAMBIA QUESTA
DATABASE_URL=postgresql+asyncpg://hamina_user:UnaPasswordSicura123!@postgres:5432/hamina
MINIO_ROOT_USER=hamina_minio
MINIO_ROOT_PASSWORD=UnaPasswordMinIO456! # CAMBIA QUESTA
MINIO_ENDPOINT=minio:9000
SECRET_KEY=una-chiave-segreta-molto-lunga-e-casuale # CAMBIA QUESTA
UPLOAD_DIR=/app/uploads
MAX_UPLOAD_SIZE=104857600docker compose up -d --buildIl primo avvio richiede 5-10 minuti (download immagini + compilazione backend).
docker compose psDovresti vedere 6 container in stato "Up":
hamina-planner-backend-1hamina-planner-frontend-1hamina-planner-nginx-1hamina-planner-postgres-1hamina-planner-minio-1hamina-planner-deepfloorplan-1
Apri il browser su http://localhost
git pull origin master
docker compose up -d --build
docker compose restart nginx- Apri http://localhost
- Clicca "+ Nuovo Progetto"
- Inserisci il nome del progetto (es. "Ufficio Via Roma")
- Clicca "Crea" — si apre la pagina del progetto
- Nella sidebar sinistra, clicca "+ Carica Piano"
- Seleziona un file PDF o immagine (PNG, JPG) dal tuo PC
- Dai un nome al piano (es. "Piano Terra")
- La planimetria viene caricata e visualizzata
All'apertura di un nuovo piano appare un overlay blu:
- Clicca "Misura la scala"
- Clicca su un primo punto della planimetria di cui conosci la distanza reale
- Muovi il mouse — vedrai una linea rossa di anteprima
- Clicca sul secondo punto
- Inserisci la distanza reale in centimetri (es. "500" per 5 metri)
- La scala viene salvata e mostrata in alto (es. "Scala: 56.7 px/m")
- In alto a destra della mappa trovi i bottoni ↺ e ↻
- Ogni click ruota la vista di 90° in senso antiorario o orario
- La rotazione è solo visiva e non altera i dati salvati
- Clicca il tool "Muro" nella toolbar
- Seleziona il materiale dal menu a tendina (Cemento di default)
- Click sinistro = inizio muro
- Muovi il mouse = anteprima muro tratteggiato
- Click sinistro = fine segmento, la catena continua
- Shift + click = muro perfettamente orizzontale o verticale
- Click destro = interrompi la catena
- Spacebar = tieni premuto per spostare la vista (pan) mentre disegni
- Per cancellare: passa a "Seleziona", poi doppio click sul muro > "OK"
- Clicca il tool "Scaffali" (🛒) nella toolbar
- Seleziona il tipo dal menu a tendina:
- Scaffale vuoto — attenuazione 5/8 dB (2.4/5 GHz)
- Scaffale pieno — attenuazione 12/20 dB
- Scaffale freschi — attenuazione 16/28 dB (prodotti refrigerati con umidità)
- Disegna esattamente come i muri (catena continua, click destro per interrompere)
- Ogni segmento mostra un'etichetta con il tipo di scaffale
- La heatmap calcola automaticamente l'attenuazione dei segmenti attraversati
- Clicca il tool "AP" nella toolbar
- Clicca sulla planimetria dove vuoi posizionare l'AP
- Inserisci un nome (es. "AP-01")
- L'AP appare come cerchio blu con il nome
Spostare un AP: in modalità "Seleziona", trascina il cerchio blu Eliminare un AP: doppio click sull'AP > conferma
- Clicca "Mostra Segnale" nella toolbar
- Seleziona la frequenza: 2.4 GHz o 5 GHz
- Seleziona la modalità:
- Copertura — colori dal verde (forte, >= -65 dBm) al marrone (debole, -75 dBm), trasparente sotto -80 dBm
- Overlap AP — blu (1 AP), verde (2 AP, buono per roaming), rosso (3+ AP, interferenza)
- Muovi il mouse sulla mappa per vedere il valore dBm nella legenda in basso
- Clicca il tool "Righello" nella toolbar
- Clicca il punto di partenza
- Muovi il mouse — la distanza appare in tempo reale
- Clicca il punto di arrivo — misura confermata
- Terzo click = nuova misura
- Clicca il bottone "PDF" in alto a destra della mappa
- Scegli dove salvare il file
- Il PDF contiene: planimetria + muri + AP + heatmap (se attiva) + intestazione con info progetto
Il calcolo del segnale WiFi utilizza un modello log-distance indoor calibrato sulle specifiche reali dell'Extreme Networks AP3000:
Path Loss (dB) = PL_ref + 10 * n * log10(d_3D) + clutter * d + Σ(wall_attenuation)
| Parametro | Valore |
|---|---|
| Esponente path loss (n) | 3.5 (commerciale denso) |
| Clutter ambientale | 0.3 dB/m |
| Altezza soffitto | 3.5 m |
| Distanza 3D | sqrt(d_orizzontale² + h_soffitto²) |
| Attenuazione cemento (2.4 GHz) | 12 dB |
| Attenuazione cemento (5 GHz) | 25 dB |
| Attenuazione cartongesso (2.4 GHz) | 3 dB |
| Attenuazione cartongesso (5 GHz) | 5 dB |
| Scaffale vuoto (2.4 GHz) | 5 dB |
| Scaffale vuoto (5 GHz) | 8 dB |
| Scaffale pieno (2.4 GHz) | 12 dB |
| Scaffale pieno (5 GHz) | 20 dB |
| Scaffale freschi (2.4 GHz) | 16 dB |
| Scaffale freschi (5 GHz) | 28 dB |
| Parametro | 2.4 GHz | 5 GHz |
|---|---|---|
| TX Power max | 18 dBm | 18 dBm |
| Guadagno Antenna | 4.2 dBi | 5.07 dBi |
| EIRP calcolato | 22.2 dBm | 23.07 dBm |
| Sensibilità (MCS basso) | -94 dBm | -94 dBm |
| Sensibilità (HE80 MCS11) | -57 dBm | -57 dBm |
| MIMO | 2x2:2 | 2x2:2 |
| Componente | Tecnologia |
|---|---|
| Backend | FastAPI + SQLAlchemy Async + PostgreSQL |
| Frontend | React 18 + Vite + Konva.js + Zustand |
| PDF Export | jsPDF |
| Infrastruttura | Docker Compose (6 container) |
| Proxy | Nginx Alpine |
| AI | TF2DeepFloorPlan |
| Storage | MinIO (S3-compatibile) |
Marco Mereu — Network Engineer
Web-based WiFi planning tool for positioning access points on floor plans. Simulates WiFi signal propagation using indoor path loss models with real Extreme Networks AP3000 access point specifications.
- Floor plan import — Upload PDF, DXF/DWG or images
- Floor plan rotation — Rotate the view by 90° (↺↻) to handle non-standard orientations
- Mandatory scale calibration — Required when opening each new floor
- Wall drawing — Continuous chain mode, multiple materials (concrete, drywall, glass, Low-E glass, brick, metal, doors, windows)
- Supermarket shelving — Dedicated 🛒 tool to draw shelves as orientable line segments; 3 types with realistic RF attenuation: Empty (5/8 dB), Full (12/20 dB), Refrigerated/wet (16/28 dB at 2.4/5 GHz)
- AP placement — Draggable blue icons with name label, double-click to delete
- WiFi heatmap — Two modes: Signal Coverage + AP Overlap (interference); shelving attenuation included in signal calculation
- dBm tooltip — Real-time signal value on mouse hover
- Ruler tool — Measure distances on the floor plan
- PDF export — Complete floor plan with APs, walls and heatmap
- AI wall detection — DeepFloorPlan
- Docker >= 20.10 and Docker Compose >= 2.0
- RAM: minimum 4 GB (8 GB recommended for AI module)
- Disk: minimum 5 GB free space
- Ports: 80 (HTTP), 443 (HTTPS optional)
- OS: Linux (production), Windows/macOS (development)
git clone https://github.com/mmereu/wifi-planner.git
cd wifi-plannercp .env.example .envEdit .env with a text editor:
POSTGRES_DB=hamina
POSTGRES_USER=hamina_user
POSTGRES_PASSWORD=ASecurePassword123! # CHANGE THIS
DATABASE_URL=postgresql+asyncpg://hamina_user:ASecurePassword123!@postgres:5432/hamina
MINIO_ROOT_USER=hamina_minio
MINIO_ROOT_PASSWORD=ASecureMinIOPassword456! # CHANGE THIS
MINIO_ENDPOINT=minio:9000
SECRET_KEY=a-very-long-and-random-secret-key # CHANGE THIS
UPLOAD_DIR=/app/uploads
MAX_UPLOAD_SIZE=104857600docker compose up -d --buildFirst launch takes 5-10 minutes (image download + backend compilation).
docker compose psYou should see 6 containers with "Up" status:
hamina-planner-backend-1hamina-planner-frontend-1hamina-planner-nginx-1hamina-planner-postgres-1hamina-planner-minio-1hamina-planner-deepfloorplan-1
Open your browser at http://localhost
git pull origin master
docker compose up -d --build
docker compose restart nginx- Open http://localhost
- Click "+ Nuovo Progetto" (New Project)
- Enter the project name (e.g., "Office Via Roma")
- Click "Crea" (Create) — the project page opens
- In the left sidebar, click "+ Carica Piano" (Load Floor)
- Select a PDF or image file (PNG, JPG) from your PC
- Name the floor (e.g., "Ground Floor")
- The floor plan loads and displays
When opening a new floor, a blue overlay appears:
- Click "Misura la scala" (Measure the scale)
- Click a first point on the floor plan where you know the real distance
- Move the mouse — you'll see a red preview line
- Click the second point
- Enter the real distance in centimeters (e.g., "500" for 5 meters)
- The scale is saved and shown at the top (e.g., "Scale: 56.7 px/m")
- In the top-right corner of the map, use the ↺ and ↻ buttons
- Each click rotates the view 90° counter-clockwise or clockwise
- Rotation is visual only and does not affect saved data
- Click the "Muro" (Wall) tool in the toolbar
- Select the material from the dropdown (Concrete by default)
- Left click = start wall
- Move mouse = dashed wall preview
- Left click = end segment, chain continues
- Shift + click = perfectly horizontal or vertical wall
- Right click = stop the chain
- Spacebar = hold to pan the view while drawing
- To delete: switch to "Seleziona" (Select), then double-click on wall > confirm
- Click the "Scaffali" (🛒) tool in the toolbar
- Select the type from the dropdown:
- Scaffale vuoto (Empty shelf) — 5/8 dB attenuation (2.4/5 GHz)
- Scaffale pieno (Full shelf) — 12/20 dB attenuation
- Scaffale freschi (Refrigerated shelf) — 16/28 dB attenuation (moisture content)
- Draw exactly like walls (continuous chain, right-click to stop)
- Each segment displays a label with the shelf type
- The heatmap automatically accounts for shelf attenuation on crossed segments
- Click the "AP" tool in the toolbar
- Click on the floor plan where you want to position the AP
- Enter a name (e.g., "AP-01")
- The AP appears as a blue circle with the name
Move an AP: in "Seleziona" (Select) mode, drag the blue circle Delete an AP: double-click on the AP > confirm
- Click "Mostra Segnale" (Show Signal) in the toolbar
- Select the frequency: 2.4 GHz or 5 GHz
- Select the mode:
- Copertura (Coverage) — colors from green (strong, >= -65 dBm) to brown (weak, -75 dBm), transparent below -80 dBm
- Overlap AP — blue (1 AP), green (2 APs, good for roaming), red (3+ APs, interference)
- Move the mouse on the map to see the dBm value in the bottom legend
- Click the "Righello" (Ruler) tool in the toolbar
- Click the start point
- Move the mouse — distance shown in real-time
- Click the end point — measurement confirmed
- Third click = new measurement
- Click the "PDF" button in the top-right of the map
- Choose where to save the file
- The PDF contains: floor plan + walls + APs + heatmap (if active) + header with project info
The WiFi signal calculation uses a log-distance indoor model calibrated on real Extreme Networks AP3000 specifications:
Path Loss (dB) = PL_ref + 10 * n * log10(d_3D) + clutter * d + sum(wall_attenuation)
| Parameter | Value |
|---|---|
| Path loss exponent (n) | 3.5 (dense commercial) |
| Environmental clutter | 0.3 dB/m |
| Ceiling height | 3.5 m |
| 3D distance | sqrt(horizontal_d² + ceiling_h²) |
| Concrete attenuation (2.4 GHz) | 12 dB |
| Concrete attenuation (5 GHz) | 25 dB |
| Drywall attenuation (2.4 GHz) | 3 dB |
| Drywall attenuation (5 GHz) | 5 dB |
| Empty shelf (2.4 GHz) | 5 dB |
| Empty shelf (5 GHz) | 8 dB |
| Full shelf (2.4 GHz) | 12 dB |
| Full shelf (5 GHz) | 20 dB |
| Refrigerated shelf (2.4 GHz) | 16 dB |
| Refrigerated shelf (5 GHz) | 28 dB |
| Parameter | 2.4 GHz | 5 GHz |
|---|---|---|
| Max TX Power | 18 dBm | 18 dBm |
| Antenna Gain | 4.2 dBi | 5.07 dBi |
| Calculated EIRP | 22.2 dBm | 23.07 dBm |
| Sensitivity (low MCS) | -94 dBm | -94 dBm |
| Sensitivity (HE80 MCS11) | -57 dBm | -57 dBm |
| MIMO | 2x2:2 | 2x2:2 |
| Component | Technology |
|---|---|
| Backend | FastAPI + SQLAlchemy Async + PostgreSQL |
| Frontend | React 18 + Vite + Konva.js + Zustand |
| PDF Export | jsPDF |
| Infrastructure | Docker Compose (6 containers) |
| Proxy | Nginx Alpine |
| AI | TF2DeepFloorPlan |
| Storage | MinIO (S3-compatible) |
Marco Mereu — Network Engineer
MIT License

