#66 — spectrum-analyzer
PLANIFIÉ
Priorité: 🟠 HAUTE · Type: TYPE E · Conteneur: rgz-grafana · Code: config/grafana/dashboards/spectrum.json
Dépendances: #39 snmp-poller
Description
Dashboard Grafana dédié à l'analyse du spectre radio 5 GHz sur tous les sites RGZ. Détecte les sources d'interférences, identifie les canaux DFS occupés et recommande le canal optimal pour chaque AP LiteBeam.
L'outil agrège les données de scan spectre collectées via SNMPv3 (#39) depuis les CPE LiteBeam, qui disposent d'une fonctionnalité de scan spectre intégrée (UBNT Spectrum Analyzer MIB). Les données sont stockées dans TimescaleDB et visualisées dans Grafana.
Essentiel pour maintenir la qualité de service dans les 8 villes du Bénin où la densité de points d'accès WiFi et les interférences ISM peuvent dégrader significativement les performances des liaisons 5 GHz.
Architecture Interne
CPE LiteBeam → Spectrum Scan (UBNT MIB)
↓
SNMP Poller #39 → TimescaleDB (snmp_metrics)
↓
Grafana PostgreSQL datasource
↓
Dashboard spectrum.json
├── Heatmap fréquence vs temps (2402-2482 MHz / 5170-5835 MHz)
├── Signal puissance par canal (dBm)
├── Canaux DFS actifs (5260-5700 MHz)
└── Recommandation canal optimal (moins d'interférences)Canaux 5 GHz analysés
| Plage | Canaux | DFS |
|---|---|---|
| UNII-1 | 36, 40, 44, 48 | Non |
| UNII-2 | 52, 56, 60, 64 | Oui |
| UNII-2e | 100-144 | Oui |
| UNII-3 | 149, 153, 157, 161, 165 | Non |
OIDs UBNT Spectrum
# UBNT Air Spectrum MIB
iso.3.6.1.4.1.41112.1.4.7.1.2 → spectral channel
iso.3.6.1.4.1.41112.1.4.7.1.3 → spectral power (dBm)
iso.3.6.1.4.1.41112.1.4.7.1.4 → spectral utilization (%)Configuration
Variables d'environnement
GF_SECURITY_ADMIN_PASSWORD=changeme_prod
GF_DATABASE_URL=postgresql://grafana:pass@rgz-db:5432/grafana
GRAFANA_POSTGRES_HOST=rgz-db
GRAFANA_POSTGRES_USER=grafana_ro
GRAFANA_POSTGRES_PASSWORD=ro_passwordDashboard JSON (config/grafana/dashboards/spectrum.json)
{
"title": "RGZ Spectrum Analyzer",
"uid": "rgz-spectrum",
"tags": ["rf", "spectrum", "5ghz"],
"refresh": "5m",
"panels": [
{
"type": "heatmap",
"title": "Spectre 5GHz — Puissance par canal",
"datasource": "PostgreSQL"
},
{
"type": "gauge",
"title": "Canal optimal recommandé",
"datasource": "PostgreSQL"
},
{
"type": "table",
"title": "Interférences détectées",
"datasource": "PostgreSQL"
}
]
}Provisioning Grafana (auto-chargement)
# config/grafana/provisioning/dashboards/dashboards.yaml
apiVersion: 1
providers:
- name: rgz-dashboards
folder: RGZ
type: file
options:
path: /etc/grafana/dashboardsCommandes Utiles
# Vérifier que le dashboard est chargé
curl -u admin:$GF_SECURITY_ADMIN_PASSWORD \
http://localhost:3000/api/dashboards/uid/rgz-spectrum
# Voir les métriques spectre en DB
docker exec rgz-db psql -U postgres -c \
"SELECT metric_name, value, timestamp FROM snmp_metrics
WHERE metric_name LIKE 'spectrum%'
ORDER BY timestamp DESC LIMIT 20;"
# Reload dashboards Grafana sans restart
curl -X POST -u admin:$GF_SECURITY_ADMIN_PASSWORD \
http://localhost:3000/api/admin/provisioning/dashboards/reload
# Accès dashboard
open https://grafana-rgz.duckdns.org/d/rgz-spectrumSécurité
| Règle | Implémentation |
|---|---|
| Auth Grafana | admin password via GF_SECURITY_ADMIN_PASSWORD |
| DB read-only | Utilisateur grafana_ro sans droit écriture |
| Accès HTTPS | Via Traefik Let's Encrypt (grafana-rgz.duckdns.org) |
Implémentation TODO
- [ ] Collecter OIDs UBNT Spectrum dans
app/tasks/monitoring.py(#39) - [ ] Créer dashboard JSON
config/grafana/dashboards/spectrum.json - [ ] Ajouter datasource PostgreSQL dans Grafana (config/grafana/provisioning/)
- [ ] Panel heatmap fréquence vs temps
- [ ] Panel recommandation canal (MIN interférences)
- [ ] Filtre par ville / revendeur / AP
- [ ] Alerte si interférence >-70dBm sur canal actif
Dernière mise à jour: 2026-02-21