Files
smart-city-digital-twin-mar…/data-flow-diagram.md

9.3 KiB
Raw Blame History

Smart City Digital Twin Martinique — Diagramme des Flux de Données

Dernière mise à jour : 06 Mai 2026
Projet : Smart City Digital Twin Martinique
Architecture : IoT-Agent intégré, QuantumLeap + CrateDB pour l'analyse avancée


Architecture Globale (Mise à jour 06/05/2026)

graph TB
    subgraph Simulateur["🖥️  Simulateur (Host Python)"]
        SIM[Smart City Simulator<br/>10 capteurs<br/>Intervalle: configurable]
    end

    subgraph MQTT_Brokers["📡  MQTT Brokers"]
        EMQ[EMQX<br/>port 11883]
        MOS[Mosquitto<br/>port 1883]
        BUN[BunkerM<br/>port 1900<br/>MQTTS/TLS]
    end

    subgraph IoT_Agent["🤖 IoT Agent (NGSI-LD)"]
        IOTA[IoT Agent JSON<br/>port 4041<br/>Transforme MQTT → NGSI-LD]
    end

    subgraph CB["🔗  Context Brokers (NGSI-LD)"]
        ORI[Orion-LD<br/>NGSI-LD<br/>port 1026]
        STE[Stellio<br/>NGSI-LD<br/>port 8080]
        FRO[FROST-Server<br/>SensorThings<br/>port 8080]
    end

    subgraph Analytics["📈 Analytics & Time-Series"]
        QL[QuantumLeap<br/>NGSI-LD → CrateDB<br/>port 8668]
        CRATEDB[CrateDB<br/>PostgreSQL-compatible<br/>port 4200/5432]
    end

    subgraph Storage["💾  Stockage & Métriques"]
        INF[InfluxDB<br/>Bucket: iot_data<br/>port 8086]
        PRO[Prometheus<br/>Scrape: /metrics<br/>port 9090]
        GEO[GeoServer<br/>WMS/WFS/WMTS<br/>port 8080]
    end

    subgraph IoT_Platform["🏢  Plateforme IoT"]
        ORM[OpenRemote Manager<br/>MQTT Agent<br/>port 8080]
        KC[Keycloak<br/>port 8080]
    end

    subgraph VIZ["📊  Visualisation"]
        GRA[Grafana<br/>Dashboards<br/>port 3001]
        MAP[MapStore<br/>WMS/WFS<br/>port 8080]
    end

    %% ── Flux Simulateur ──────────────────────────────────────────
    SIM -->|"1⃣  MQTT publish<br/>city/sensors/{type}/{id}"| EMQ
    SIM -->|"1⃣  MQTT publish"| MOS
    SIM -->|"1⃣  MQTT publish"| BUN
    SIM -->|"5⃣  InfluxDB v2 API<br/>async non-bloquant"| INF

    %% ── Flux MQTT → IoT Agent ──────────────────────────────────
    EMQ -->|"MQTT subscribe<br/>city/sensors/#"| IOTA
    MOS -->|"MQTT subscribe"| IOTA
    BUN -->|"MQTT subscribe"| IOTA

    %% ── Flux IoT Agent → Context Brokers ───────────────────────
    IOTA -->|"2⃣  NGSI-LD POST<br/>/ngsi-ld/v1/entities"| ORI
    IOTA -->|"2⃣  NGSI-LD POST"| STE

    %% ── Flux Context Brokers → QuantumLeap ───────────────────
    ORI -->|"NGSI-LD Subscription<br/>→ QuantumLeap"| QL
    STE -->|"NGSI-LD Subscription<br/>→ QuantumLeap"| QL

    %% ── Flux QuantumLeap → CrateDB ────────────────────────────
    QL -->|"Insert<br/>PostgreSQL wire"| CRATEDB

    %% ── Visualisation ───────────────────────────────────────────
    CRATEDB -->|"PostgreSQL Datasource"| GRA
    INF -->|"Datasource Flux IoT"| GRA
    ORI -->|"NGSI-LD Datasource"| GRA
    STE -->|"NGSI-LD Datasource"| GRA
    GEO -->|"WMS/WMTS"| MAP
    ORM -->|MapSettings<br/>Martinique| MAP
    ORM -->|"Live assets<br/>REST"| GRA

    %% ── OpenRemote MQTT Agent ───────────────────────────────────
    EMQ -->|"6⃣  Subscribe<br/>city/sensors/#"| ORM
    MOS -->|"6⃣  Subscribe"| ORM
    BUN -->|"6⃣  Subscribe"| ORM

    %% ── Métriques Prometheus ────────────────────────────────────
    SIM -->|"7⃣  /metrics<br/>port 8001"| PRO
    EMQ -->|"/api/v5/metrics"| PRO
    STE -->|"/actuator/prometheus"| PRO
    INF -->|"/metrics"| PRO
    ORM -->|"/actuator/prometheus"| PRO
    GRA -->|"/metrics"| PRO
    IOTA -->|"/metrics"| PRO
    QL -->|"/metrics"| PRO

Flux Détaillés (Mise à jour 06/05/2026)

1 Flux MQTT — Brokers

Broker Port Protocol Topics
EMQX 11883 MQTT city/sensors/{type}/{id}
Mosquitto 1883 MQTT city/sensors/{type}/{id}
BunkerM 1900 MQTTS (TLS) city/sensors/{type}/{id}

Le simulateur publie simultanément sur les 3 brokers vers IoT Agent.

2 Flux IoT Agent — NGSI-LD

  • IoT Agent JSON : Réception MQTT → Transformation en entités NGSI-LD
  • Port : 4041
  • Configuration :
    # Enregistrement service
    curl -X POST http://localhost:4041/iot/services \
      -H 'Content-Type: application/json' \
      -H 'fiware-service: smartcity' \
      -d '{"services": [{"apikey": "smartcity-api-key", "cbroker": "http://orion-ld:1026", "entity_type": "Device", "ngsi_version": "ld"}]}'
    
  • Entités créées dans : Orion-LD (port 1026) et Stellio (port 8080)

3 Flux Context Brokers → QuantumLeap → CrateDB

  1. Orion-LD / Stellio : Reçoivent les entités NGSI-LD de IoT Agent
  2. QuantumLeap (port 8668) : Souscrit aux mises à jour NGSI-LD via Subscription
  3. CrateDB (port 5432/4200) : Stockage temporel PostgreSQL-compatible
  4. Grafana : Dashboards connectés à CrateDB (PostgreSQL datasource)

4 Flux InfluxDB — Temps Réel

  • API : http://localhost:8086/api/v2/write
  • Bucket : iot_data
  • Org : digitribe
  • Mode : Asynchrone (thread daemon) pour ne pas bloquer le publish MQTT

5 OpenRemote — MQTT Agent

L'agent MQTT d'OpenRemote souscrit aux topics city/sensors/# sur les brokers MQTT. Les payloads sont automatiquement parsés et les attributs des assets sont mis à jour.

6 Flux Prometheus — Métriques

Service Endpoint /metrics Statut
Simulator localhost:8001
EMQX emqx_emqx_1:8081/api/v5/metrics
Stellio stellio-api-gateway:8080/actuator/prometheus
InfluxDB smart-city-influxdb:8086/metrics
OpenRemote openremote-manager-1:8080/actuator/prometheus
Grafana smart-city-grafana:3000/metrics
IoT Agent iot-agent:4041/metrics ⚠️ À vérifier
QuantumLeap quantum-leap:8668/metrics ⚠️ À vérifier

Nouveaux Composants (06/05/2026)

🤖 IoT Agent JSON

  • Rôle : Pont entre MQTT et NGSI-LD (Orion-LD / Stellio)
  • Port : 4041
  • Statut : En cours de réparation (erreur MongoDB)
  • Correction : Fournir IOTA_MONGO_URL=mongodb://mongodb:27017/iotagent

📈 QuantumLeap

  • Rôle : Analytics NGSI-LD → CrateDB
  • Port : 8668
  • Statut : Fonctionnel (interne), port non exposé sur l'hôte
  • Action : Exposer le port dans docker-compose

🗄️ CrateDB

  • Rôle : Base de données temporelle PostgreSQL-compatible
  • Port : 4200 (UI), 5432 (PostgreSQL)
  • Statut : Opérationnel
  • Usage : Stockage des séries temporelles depuis QuantumLeap

Tableau Récapitulatif (Mise à jour)

Composant Technologie Port Statut
Simulator Python + paho-mqtt Host:8001 (metrics) Actif
EMQX MQTT Broker 11883 Connecté
Mosquitto MQTT Broker 1883 Connecté
BunkerM MQTTS Broker 1900 Connecté
IoT Agent NGSI-LD Bridge 4041 Erreur MongoDB
Orion-LD NGSI-LD Broker 1026 ⚠️ À vérifier
Stellio NGSI-LD Broker 8080 ⚠️ Ports occupés par OpenRemote
FROST-Server SensorThings API 8080 ⚠️ À vérifier
QuantumLeap NGSI-LD → CrateDB 8668 Interne
CrateDB PostgreSQL Time-Series 4200/5432 Opérationnel
OpenRemote IoT Platform 8080 ⚠️ 403 (Service Account)
InfluxDB Time Series DB 8086 Bucket iot_data
Grafana Visualisation 3001 Dashboards + CrateDB
GeoServer Geo Data 8080 REST OK
MapStore Cartographie 8080 WMS/WMTS

Actions Prioritaires

  1. Corriger IoT Agent : Ajouter MongoDB et configurer IOTA_MONGO_URL
  2. Exposer QuantumLeap : Mapper le port 8668 dans docker-compose
  3. Déployer Orion-LD : Créer le service s'il n'existe pas
  4. Libérer les ports : Résoudre le conflit Stellio/OpenRemote sur le port 8080
  5. Configurer CrateDB : Créer les tables pour QuantumLeap
  6. Mettre à jour le simulateur : ENABLE_PULSAR=false (recommandé)

Commandes Utiles

# Vérifier IoT Agent
curl -s http://localhost:4041/iot/services -H 'fiware-service: smartcity'

# Vérifier QuantumLeap
curl -s http://localhost:8668/version

# Vérifier CrateDB
psql -h localhost -p 5432 -U crate -c "SELECT * FROM ql_entities LIMIT 5;"

# Vérifier Orion-LD
curl -s http://localhost:1026/version

# Voir les logs IoT Agent
docker logs smart-city-iot-agent --tail 30

Fichiers associés :

  • Simulateur : ~/smart-city-digital-twin-martinique/simulator.py
  • Dashboard Grafana : ~/smart-city-digital-twin-martinique/grafana_dashboard_smartcity.json
  • Ce diagramme : ~/smart-city-digital-twin-martinique/data-flow-diagram.md
  • Session Resume : ~/smart-city-digital-twin-martinique/session_resume_2026-05-07.md