diff --git a/data-flow-diagram.md b/data-flow-diagram.md
index aa772b09..efc86baf 100644
--- a/data-flow-diagram.md
+++ b/data-flow-diagram.md
@@ -1,236 +1,144 @@
-# Smart City Digital Twin Martinique — Diagramme des Flux de Données
+# Smart City Digital Twin - Data Flow Diagram (Updated 2026-05-06)
-**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 évoluée : 1 IoT-Agent par broker MQTT
----
-
-## Architecture Globale (Mise à jour 06/05/2026)
-
-```mermaid
-graph TB
- subgraph Simulateur["🖥️ Simulateur (Host Python)"]
- SIM[Smart City Simulator
10 capteurs
Intervalle: configurable]
- end
-
- subgraph MQTT_Brokers["📡 MQTT Brokers"]
- EMQ[EMQX
port 11883]
- MOS[Mosquitto
port 1883]
- BUN[BunkerM
port 1900
MQTTS/TLS]
- end
-
- subgraph IoT_Agent["🤖 IoT Agent (NGSI-LD)"]
- IOTA[IoT Agent JSON
port 4041
Transforme MQTT → NGSI-LD]
- end
-
- subgraph CB["🔗 Context Brokers (NGSI-LD)"]
- ORI[Orion-LD
NGSI-LD
port 1026]
- STE[Stellio
NGSI-LD
port 8080]
- FRO[FROST-Server
SensorThings
port 8080]
- end
-
- subgraph Analytics["📈 Analytics & Time-Series"]
- QL[QuantumLeap
NGSI-LD → CrateDB
port 8668]
- CRATEDB[CrateDB
PostgreSQL-compatible
port 4200/5432]
- end
-
- subgraph Storage["💾 Stockage & Métriques"]
- INF[InfluxDB
Bucket: iot_data
port 8086]
- PRO[Prometheus
Scrape: /metrics
port 9090]
- GEO[GeoServer
WMS/WFS/WMTS
port 8080]
- end
-
- subgraph IoT_Platform["🏢 Plateforme IoT"]
- ORM[OpenRemote Manager
MQTT Agent
port 8080]
- KC[Keycloak
port 8080]
- end
-
- subgraph VIZ["📊 Visualisation"]
- GRA[Grafana
Dashboards
port 3001]
- MAP[MapStore
WMS/WFS
port 8080]
- end
-
- %% ── Flux Simulateur ──────────────────────────────────────────
- SIM -->|"1️⃣ MQTT publish
city/sensors/{type}/{id}"| EMQ
- SIM -->|"1️⃣ MQTT publish"| MOS
- SIM -->|"1️⃣ MQTT publish"| BUN
- SIM -->|"5️⃣ InfluxDB v2 API
async non-bloquant"| INF
-
- %% ── Flux MQTT → IoT Agent ──────────────────────────────────
- EMQ -->|"MQTT subscribe
city/sensors/#"| IOTA
- MOS -->|"MQTT subscribe"| IOTA
- BUN -->|"MQTT subscribe"| IOTA
-
- %% ── Flux IoT Agent → Context Brokers ───────────────────────
- IOTA -->|"2️⃣ NGSI-LD POST
/ngsi-ld/v1/entities"| ORI
- IOTA -->|"2️⃣ NGSI-LD POST"| STE
-
- %% ── Flux Context Brokers → QuantumLeap ───────────────────
- ORI -->|"NGSI-LD Subscription
→ QuantumLeap"| QL
- STE -->|"NGSI-LD Subscription
→ QuantumLeap"| QL
-
- %% ── Flux QuantumLeap → CrateDB ────────────────────────────
- QL -->|"Insert
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
Martinique| MAP
- ORM -->|"Live assets
REST"| GRA
-
- %% ── OpenRemote MQTT Agent ───────────────────────────────────
- EMQ -->|"6️⃣ Subscribe
city/sensors/#"| ORM
- MOS -->|"6️⃣ Subscribe"| ORM
- BUN -->|"6️⃣ Subscribe"| ORM
-
- %% ── Métriques Prometheus ────────────────────────────────────
- SIM -->|"7️⃣ /metrics
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
+```
+┌─────────────────────────────────────────────────────────────────────────────┐
+│ Smart City Simulator (Python) │
+│ Publie sur 3 brokers MQTT avec format IoT-Agent JSON │
+└──────────┬────────────────────┬──────────────────────┬───────────────────┘
+ │ │ │
+ ▼ ▼ ▼
+┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
+│ EMQX Broker │ │ Mosquitto Broker │ │ BunkerM Broker │
+│ (port 11883) │ │ (port 1883) │ │ (port 1900) │
+│ Topic: smart- │ │ Topic: smart- │ │ Topic: smart- │
+│ city-api-key/ │ │ city-api-key/ │ │ city-api-key/ │
+│ {id}/attrs │ │ {id}/attrs │ │ {id}/attrs │
+└────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘
+ │ │ │
+ ▼ ▼ ▼
+┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
+│ IoT-Agent-EMQX │ │IoT-Agent-Mosquitto│ │IoT-Agent-BunkerM │
+│ Port: 4041 │ │ Port: 4042 │ │ Port: 4043 │
+│ Apikey: smart- │ │ Apikey: smart- │ │ Apikey: smart- │
+│ city-api-key │ │ city-api-key │ │ city-api-key │
+└────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘
+ │ │ │
+ └───────────────────────┴──────────────────────┘
+ │
+ ▼
+ ┌─────────────────────┐
+ │ Orion-LD Context │
+ │ Broker (port 1026)│
+ │ MongoDB backend │
+ └─────────┬───────────┘
+ │
+ │ Subscription (id: 69fbb09af55b82cad2a38008)
+ │ Forward to QuantumLeap
+ ▼
+ ┌─────────────────────┐
+ │ QuantumLeap │
+ │ (port 8668) │
+ │ /v2/op/notify │
+ └─────────┬───────────┘
+ │
+ ▼
+ ┌─────────────────────┐
+ │ CrateDB │
+ │ (ports 5432/4200)│
+ │ DB: quantumleap │
+ └─────────┬───────────┘
+ │
+ ▼
+ ┌─────────────────────┐
+ │ Grafana │
+ │ (port 3001) │
+ │ Datasource: │
+ │ CrateDB-SmartCity│
+ └─────────────────────┘
```
----
+## Flux de données (Step-by-step)
-## Flux Détaillés (Mise à jour 06/05/2026)
+1. **Simulator** publie sur 3 brokers MQTT (EMQX:11883, Mosquitto:1883, BunkerM:1900)
+ - Topic: `smartcity-api-key/{device_id}/attrs`
+ - Format: `{"NO2": 45.5, "temperature": 26.0, "humidity": 70.0}`
-### 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}` |
+2. **3 IoT-Agents** (un par broker) reçoivent les messages
+ - iot-agent-emqx (port 4041) ← EMQX
+ - iot-agent-mosquitto (port 4042) ← Mosquitto
+ - iot-agent-bunkerm (port 4043) ← BunkerM
+ - Chaque IoT-Agent a le service `smartcity-api-key` configuré
+ - Chaque IoT-Agent a le device `airquality_001` enregistré
-Le simulateur publie simultanément sur les 3 brokers vers **IoT Agent**.
+3. **Orion-LD** reçoit les entités NGSI-v2
+ - URL: `http://smart-city-orion-ld:1026`
+ - Entité: `urn:ngsi-ld:AirQualityObserved:airquality_001`
+ - Type: `AirQualityObserved`
-### 2️⃣ Flux IoT Agent — NGSI-LD
-- **IoT Agent JSON** : Réception MQTT → Transformation en entités NGSI-LD
-- **Port** : `4041`
-- **Configuration** :
- ```bash
- # 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)
+4. **Subscription Orion-LD → QuantumLeap**
+ - ID: `69fbb09af55b82cad2a38008`
+ - Description: "Forward AirQualityObserved to QuantumLeap"
+ - Notify URL: `http://smart-city-quantumleap:8668/v2/op/notify`
+ - Attrs: NO2, temperature, humidity
-### 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)
+5. **QuantumLeap** stocke dans **CrateDB**
+ - Table: `quantumleap.etairqualityobserved`
+ - Colonnes: entity_id, time_index, NO2, temperature, humidity
-### 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
+6. **Grafana** visualise les données
+ - Datasource: `CrateDB-SmartCity` (ID: 23)
+ - URL: `smart-city-cratedb:5432`
+ - Database: `quantumleap`
-### 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.
+## Services et Devices (provisionnés)
-### 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 |
+### IoT-Agent-EMQX (port 4041)
+- Service: `smartcity-api-key` → Orion-LD (`http://smart-city-orion-ld:1026`)
+- Device: `airquality_001` → `urn:ngsi-ld:AirQualityObserved:airquality_001`
----
+### IoT-Agent-Mosquitto (port 4042)
+- Service: `smartcity-api-key` → Orion-LD (`http://smart-city-orion-ld:1026`)
+- Device: `airquality_001` → `urn:ngsi-ld:AirQualityObserved:airquality_001`
-## Nouveaux Composants (06/05/2026)
+### IoT-Agent-BunkerM (port 4043)
+- Service: `smartcity-api-key` → Orion-LD (`http://smart-city-orion-ld:1026`)
+- Device: `airquality_001` → `urn:ngsi-ld:AirQualityObserved:airquality_001`
-### 🤖 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`
+## Sous-domaines (Traefik)
-### 📈 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
+- `iot-agent-emqx.digitribe.fr` → IoT-Agent-EMQX (port 4041)
+- `iot-agent-mosquitto.digitribe.fr` → IoT-Agent-Mosquitto (port 4042)
+- `iot-agent-bunkerm.digitribe.fr` → IoT-Agent-BunkerM (port 4043)
+- `orion-ld.digitribe.fr` → Orion-LD (port 1026)
+- `quantum-leap.digitribe.fr` → QuantumLeap (port 8668)
+- `grafana.digitribe.fr` → Grafana (port 3001)
-### 🗄️ 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
+## Test du flux complet
```bash
-# Vérifier IoT Agent
-curl -s http://localhost:4041/iot/services -H 'fiware-service: smartcity'
+# 1. Publier un message MQTT (simuler le simulateur)
+mosquitto_pub -h localhost -p 11883 -t "smartcity-api-key/airquality_001/attrs" \
+ -m '{"NO2": 50.5, "temperature": 30.0, "humidity": 90.0}'
-# Vérifier QuantumLeap
-curl -s http://localhost:8668/version
+# 2. Vérifier qu'Orion-LD a reçu l'entité
+curl -s http://localhost:1026/v2/entities -w "\nHTTP %{http_code}\n"
-# Vérifier CrateDB
-psql -h localhost -p 5432 -U crate -c "SELECT * FROM ql_entities LIMIT 5;"
+# 3. Vérifier que QuantumLeap a reçu la notification
+docker logs smart-city-quantumleap --tail 20 | grep -i "notify\|airquality"
-# Vérifier Orion-LD
-curl -s http://localhost:1026/version
+# 4. Vérifier CrateDB
+docker exec smart-city-cratedb crash -c "SELECT * FROM quantumleap.etairqualityobserved LIMIT 5;"
-# Voir les logs IoT Agent
-docker logs smart-city-iot-agent --tail 30
+# 5. Vérifier Grafana
+curl -s http://localhost:3001/api/datasources -u admin:Digitribe972 | jq '.[] | select(.type=="postgres") | .name'
```
----
+## Fichiers modifiés (2026-05-06)
-**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`
+- `docker-compose.iot-agent.yml` : 3 instances IoT-Agent (emqx, mosquitto, bunkerm)
+- `docker-compose.orion-ld.yml` : Orion-LD avec MongoDB existant
+- `docker-compose.quantumleap.yml` : Variables CRATE_HOST/PORT (fix)
+- `simulator.py` : Publication sur 3 brokers avec format IoT-Agent
+- `data-flow-diagram.md` : Ce fichier (mis à jour)