# 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`