docs: Update data-flow-diagram with IoT-Agent, QuantumLeap, CrateDB architecture (2026-05-06)

This commit is contained in:
Eric FELIXINE
2026-05-06 15:47:07 -04:00
parent 0ba25ef1a8
commit 303d6f3eb2
2 changed files with 468 additions and 512 deletions

View File

@@ -1,11 +1,12 @@
# Smart City Digital Twin Martinique — Diagramme des Flux de Données
**Dernière mise à jour :** 05 Mai 2026
**Projet :** Smart City Digital Twin Martinique
**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
## Architecture Globale (Mise à jour 06/05/2026)
```mermaid
graph TB
@@ -19,17 +20,21 @@ graph TB
BUN[BunkerM<br/>port 1900<br/>MQTTS/TLS]
end
subgraph Stream["⚡ Event Streaming"]
PUL[Pulsar<br/>port 6650<br/>Topics: smartcity-*]
RED[Redpanda<br/>port 8082 REST<br/>Topics: traffic, air-quality, ...]
subgraph IoT_Agent["🤖 IoT Agent (NGSI-LD)"]
IOTA[IoT Agent JSON<br/>port 4041<br/>Transforme MQTT → NGSI-LD]
end
subgraph CB["🔗 Context Brokers"]
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]
@@ -42,139 +47,135 @@ graph TB
end
subgraph VIZ["📊 Visualisation"]
GRA[Grafana<br/>Dashboards<br/>port 3000]
GRA[Grafana<br/>Dashboards<br/>port 3001]
MAP[MapStore<br/>WMS/WFS<br/>port 8080]
end
subgraph Distribution["🔄 Distribution Service"]
DIST[Pulsar Distribution<br/>Pulsar → Brokers]
end
subgraph Consumer["📥 Redpanda Consumer"]
RCONS[Redpanda → InfluxDB<br/>REST → InfluxDB]
end
%% ── Flux Simulateur ──────────────────────────────────────────────────
%% ── Flux Simulateur ──────────────────────────────────────────
SIM -->|"1⃣ MQTT publish<br/>city/sensors/{type}/{id}"| EMQ
SIM -->|"1⃣ MQTT publish"| MOS
SIM -->|"1⃣ MQTT publish"| BUN
SIM -->|"2⃣ HTTP POST<br/>NGSI-LD"| ORI
SIM -->|"2⃣ HTTP POST<br/>NGSI-LD"| STE
SIM -->|"2⃣ HTTP POST<br/>SensorThings"| FRO
SIM -->|"3⃣ Pulsar client<br/>pulsar://localhost:6650"| PUL
SIM -->|"4⃣ HTTP REST Proxy<br/>localhost:8082/topics/"| RED
SIM -->|"5⃣ InfluxDB v2 API<br/>async non-bloquant"| INF
%% ── Flux Distribution (Pulsar → Brokers) ──────────────────────────────
PUL -->|"Consomme<br/>smartcity-*"| DIST
DIST -->|"Republish<br/>MQTT"| EMQ
DIST -->|"Republish<br/>MQTT"| MOS
DIST -->|"Republish<br/>NGSI-LD"| ORI
DIST -->|"Republish<br/>NGSI-LD"| STE
DIST -->|"Republish<br/>SensorThings"| FRO
%% ── Flux MQTT → IoT Agent ──────────────────────────────────
EMQ -->|"MQTT subscribe<br/>city/sensors/#"| IOTA
MOS -->|"MQTT subscribe"| IOTA
BUN -->|"MQTT subscribe"| IOTA
%% ── Flux Redpanda → InfluxDB ──────────────────────────────────────────
RED -->|"REST poll<br/>topics/{name}/offsets"| RCONS
RCONS -->|"Line Protocol<br/>Write API"| INF
%% ── Flux IoT Agent → Context Brokers ───────────────────────
IOTA -->|"2⃣ NGSI-LD POST<br/>/ngsi-ld/v1/entities"| ORI
IOTA -->|"2⃣ NGSI-LD POST"| STE
%% ── OpenRemote MQTT Agent ──────────────────────────────────────────────
%% ── 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 ────────────────────────────────────────────────
%% ── Métriques Prometheus ────────────────────────────────────
SIM -->|"7⃣ /metrics<br/>port 8001"| PRO
EMQ -->|"/api/v5/metrics"| PRO
STE -->|"/actuator/prometheus"| PRO
FRO -->|"/metrics"| PRO
INF -->|"/metrics"| PRO
RED -->|"/public_metrics"| PRO
ORM -->|"/actuator/prometheus"| PRO
GRA -->|"/metrics"| PRO
%% ── Visualisation ─────────────────────────────────────────────────────
INF -->|"Datasources<br/>Flux IoT"| GRA
ORI -->|"NGSI-LD<br/>Datasource"| GRA
STE -->|"NGSI-LD<br/>Datasource"| GRA
FRO -->|"SensorThings<br/>Datasource"| GRA
GEO -->|"WMS/WMTS"| MAP
ORM -->|MapSettings<br/>Martinique| MAP
ORM -->|"Live assets<br/>REST"| GRA
IOTA -->|"/metrics"| PRO
QL -->|"/metrics"| PRO
```
---
## Flux Détaillés
## 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.
Le simulateur publie simultanément sur les 3 brokers vers **IoT Agent**.
### 2⃣ Flux HTTP REST — Context Brokers
### 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)
| Broker | Format | Port | Topics |
|--------|--------|------|--------|
| Orion-LD | NGSI-LD | 1026 | Entités par type |
| Stellio | NGSI-LD | 8080 | Entités par type |
| FROST-Server | SensorThings | 8080 | Things → Datastreams → Observations |
### 3⃣ Flux Pulsar — Event Streaming
- **Topics** : `persistent://public/default/smartcity-traffic`, `smartcity-airquality`, `smartcity-parking`, `smartcity-noise`, `smartcity-weather`, `smartcity-light`
- **Port binaire** : `6650` (connectable depuis le host)
- **Distribution** : Le service `pulsar-distribution` consomme ces topics et republie vers les brokers MQTT et context brokers
### 4⃣ Flux Redpanda — Kafka-compatible REST
- **REST Proxy** : `http://localhost:8082`
- **Topics** : `traffic`, `air-quality`, `parking`, `noise`, `weather`, `air-quality`
- **Payload** : Base64(JSON) dans `{"records": [{"value": "<base64>"}]}`
- **Consumer** : `redpanda/consumer.py` — poll toutes les 10s et écrit dans InfluxDB
### 5⃣ Flux InfluxDB — Temps Réel
### 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
### 6️⃣ OpenRemote — MQTT Agent
### 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.
L'agent MQTT d'OpenRemote souscrit aux topics `city/sensors/#` sur les brokers MQTT (EMQX, Mosquitto, BunkerM). Les payloads sont automatiquement parsés et les attributs des assets sont mis à jour.
**Configuration via Manager UI** (`https://openremote.digitribe.fr/manager/`) :
1. Se connecter avec `admin/Digitribe972`
2. Choisir le realm `smartcity`
3. **Assets → Agents → + Add Agent**
4. Type : **MQTT Agent**
5. Configurer :
- **MQTT Broker URI** : `tcp://emqx_emqx_1:1883` (réseau smartcity-shared)
- **Topic Filter** : `city/sensors/#`
- **QoS** : 1
- **Enabled** : ✅
### 7⃣ Flux Prometheus — Métriques
| Service | Endpoint `/metrics` | Scrape |
### 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` | ✅ |
| FROST | `frost_http-web-1:8080/metrics` | ✅ |
| InfluxDB | `smart-city-influxdb:8086/metrics` | ✅ |
| Redpanda | `smart-city-redpanda-console:8080/public_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 |
---
## Tableau Récapitulatif
## 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 |
|-----------|-------------|------|--------|
@@ -182,42 +183,54 @@ L'agent MQTT d'OpenRemote souscrit aux topics `city/sensors/#` sur les brokers M
| EMQX | MQTT Broker | 11883 | ✅ Connecté |
| Mosquitto | MQTT Broker | 1883 | ✅ Connecté |
| BunkerM | MQTTS Broker | 1900 | ✅ Connecté |
| Orion-LD | NGSI-LD Broker | 1026 | ✅ Données |
| Stellio | NGSI-LD Broker | 8080 | ✅ Données |
| FROST-Server | SensorThings API | 8080 | ✅ Données |
| OpenRemote | IoT Platform | 8080 | ✅ UI OK |
| **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 |
| Redpanda | Kafka-compatible | 8082 REST | ✅ Topics actifs |
| Pulsar | Event Streaming | 6650 | ✅ Connecté |
| Prometheus | Metrics | 9090 (conf) | ⏳ Container arrêté |
| Grafana | Visualisation | 3000 | ✅ Dashboards |
| 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
# Redémarrer le service de distribution Pulsar
cd ~/smart-city-digital-twin-martinique
docker build -t smart-city-pulsar-distribution:latest -f pulsar/Dockerfile pulsar/
docker compose -f docker-compose.yml -f docker-compose.distribution.yml up -d pulsar-distribution
# Vérifier IoT Agent
curl -s http://localhost:4041/iot/services -H 'fiware-service: smartcity'
# Redémarrer Prometheus (prometheus-brokers)
cd ~/smart-city-digital-twin-martinique
docker compose up -d prometheus-brokers
# Vérifier QuantumLeap
curl -s http://localhost:8668/version
# Lancer le consumer Redpanda (host)
cd ~/smart-city-digital-twin-martinique
python3 redpanda/consumer.py
# Vérifier CrateDB
psql -h localhost -p 5432 -U crate -c "SELECT * FROM ql_entities LIMIT 5;"
# Vérifier les topics Redpanda
curl -s http://localhost:8082/topics
# Vérifier Orion-LD
curl -s http://localhost:1026/version
# Vérifier les métriques simulator
curl -s http://localhost:8001/metrics | grep "^simulator_"
# Logs distribution service
docker logs -f smart-city-pulsar-distribution
# 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`