# 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) ```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 ``` --- ## 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** : ```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) ### 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 ```bash # 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`