From 07bb3384b9d2a8886e4b1d59fb67308bca4586c5 Mon Sep 17 00:00:00 2001 From: Eric FELIXINE Date: Wed, 6 May 2026 17:21:41 -0400 Subject: [PATCH] docs: Update data flow diagram - 3 IoT Agents per broker, Orion-LD, QuantumLeap --- data-flow-diagram.md | 328 ++++++++++++++++--------------------------- 1 file changed, 118 insertions(+), 210 deletions(-) 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)