Files
smart-city-digital-twin-mar…/data-flow-diagram.md

237 lines
9.3 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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<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** :
```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`