Skip to content

#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

PlageCanauxDFS
UNII-136, 40, 44, 48Non
UNII-252, 56, 60, 64Oui
UNII-2e100-144Oui
UNII-3149, 153, 157, 161, 165Non

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

env
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_password

Dashboard JSON (config/grafana/dashboards/spectrum.json)

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)

yaml
# config/grafana/provisioning/dashboards/dashboards.yaml
apiVersion: 1
providers:
  - name: rgz-dashboards
    folder: RGZ
    type: file
    options:
      path: /etc/grafana/dashboards

Commandes Utiles

bash
# 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-spectrum

Sécurité

RègleImplémentation
Auth Grafanaadmin password via GF_SECURITY_ADMIN_PASSWORD
DB read-onlyUtilisateur grafana_ro sans droit écriture
Accès HTTPSVia 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

PROJET MOSAÏQUE — 81 outils, 22 conteneurs, 500+ revendeurs WiFi Zone