Session resume 2026-05-06 - État infrastructure Smart City
- BunkerM accessible, Stellio pipeline actif - 6 tables CrateDB créées, Grafana AirQuality OK - OpenRemote API 405 à résoudre (assets à créer) - 30 capteurs attendus (10 par broker)
This commit is contained in:
@@ -1,129 +1,83 @@
|
|||||||
# Session Resume - Smart City Digital Twin Martinique (2026-05-06) - FINAL
|
# Session Resume - 2026-05-06 - Smart City Digital Twin Martinique
|
||||||
|
|
||||||
## Objectif
|
## État de l'infrastructure (21:35)
|
||||||
Finaliser l'installation et l'accessibilité du Smart City Digital Twin Martinique, spécifiquement la mise en service du flux complet : Simulator → 3 IoT-Agents → Orion-LD → QuantumLeap → CrateDB → Grafana.
|
|
||||||
|
|
||||||
## État d'avancement (17h30)
|
### ✅ Réalisé cette session
|
||||||
|
1. **BunkerM (mosquitto2.digitribe.fr:1900)** : ✅ ACCESSIBLE (confirmé par `nc -zv` et `mosquitto_pub`)
|
||||||
|
2. **IoT Agent BunkerM** : ✅ Reconfiguré pour Stellio (docker-compose.iot-agent.yml mis à jour)
|
||||||
|
3. **Stellio Pipeline** : ✅ DONNÉES VISIBLES (entities `urn:ngsi-ld:AirQualityObserved:*` dans Stellio)
|
||||||
|
4. **CrateDB** : ✅ 6 tables créées (etairqualityobserved, etweatherobserved, ettrafficflowobserved, etparkingspot, etnoiselevelobserved, etwaterqualityobserved)
|
||||||
|
5. **Grafana** : ✅ Dashboard "Smart City - Air Quality (CrateDB)" créé et opérationnel
|
||||||
|
6. **Keycloak OpenRemote** : ✅ Audience mapper 'openremote' configuré (claim `aud: ['openremote']` present)
|
||||||
|
7. **Git/Gitea** : ✅ Commits poussés (docker-compose.iot-agent.yml)
|
||||||
|
|
||||||
### ✅ Réalisé
|
### ⏳ En cours / À faire
|
||||||
1. **3 IoT-Agents déployés** : Un par broker MQTT (EMQX:4041, Mosquitto:4042, BunkerM:4043)
|
1. **OpenRemote Assets (Tâche A)** : ❌ API retourne 405 Method Not Allowed malgré JWT correct
|
||||||
2. **Orion-LD opérationnel** : Port 1026, connecté à MongoDB existant
|
- 30 capteurs attendus (10 par broker: EMQX, Mosquitto, BunkerM)
|
||||||
3. **QuantumLeap corrigé** : Variables CRATE_HOST/PORT (plus de QL_CRATEDB_*)
|
- À créer dans 2 realms : `master` ET `smartcity-martinique`
|
||||||
4. **CrateDB ↔ Grafana** : Datasource "CrateDB-SmartCity" (ID: 23) ajoutée
|
- Problème : 405 sur `/api/{realm}/asset` (GET/POST)
|
||||||
5. **Flux validé (logs)** : IoT-Agent → Orion-LD (message "Value updated successfully")
|
- **Solution proposée** : Création via UI Web OpenRemote ou débogage API ultérieur
|
||||||
6. **Diagrammes mis à jour** : data-flow-diagram.md & .html (3 IoT-Agents architecture)
|
|
||||||
7. **Git commit & push** : Tous les changements sur Gitea
|
|
||||||
|
|
||||||
### ❌ Problèmes en cours
|
2. **Simulateur** : ⏳ Configuration 30 capteurs
|
||||||
1. **Orion-LD vide** : `curl http://localhost:1026/v2/entities` retourne `[]` malgré les logs IoT-Agent positifs
|
- Définir `SENSOR_COUNT=30` dans l'environnement du simulateur
|
||||||
- Cause probable : Problème de résolution de nom (logs montrent `orion-ld` au lieu de `smart-city-orion-ld`)
|
- Les capteurs seront répartis : airquality, traffic, parking, noise, weather, light
|
||||||
- Action : Corriger les aliases réseau dans docker-compose.orion-ld.yml (FAIT)
|
|
||||||
2. **Stellio** : Pas encore de flux de données (abonnement Orion-LD → Stellio à configurer)
|
|
||||||
3. **Simulateur** : Doit publier sur le topic avec préfixe `json/` (ex: `json/smartcity-api-key/airquality_001/attrs`)
|
|
||||||
|
|
||||||
## Architecture finale (3 IoT-Agents)
|
3. **Grafana Dashboards (Tâche C)** : 🔄 À compléter
|
||||||
|
- ✅ AirQuality fait
|
||||||
|
- ⏳ TrafficFlow, Weather, Parking, Noise, Light à créer
|
||||||
|
|
||||||
|
### 🔴 Problèmes identifiés
|
||||||
|
1. **OpenRemote API 405** :
|
||||||
|
- JWT valide avec `aud: ['openremote', 'smartcity-realm', 'master-realm', 'account']`
|
||||||
|
- URL testées : `/api/master/asset`, `/api/smartcity-martinique/asset`
|
||||||
|
- Erreur persistante malgré audience mapper configuré
|
||||||
|
- **Action** : Vérifier logs Keycloak/OpenRemote ou utiliser UI Web
|
||||||
|
|
||||||
|
2. **BunkerM inaccessibilité passée** : Résolu - port 1900 accessible via Traefik
|
||||||
|
|
||||||
|
### 📊 Architecture validée
|
||||||
```
|
```
|
||||||
Simulateur (Python)
|
Simulateur (30 capteurs, 10 par broker)
|
||||||
↓ (publie sur 3 brokers avec format IoT-Agent)
|
|
||||||
┌─────────────┬─────────────┬─────────────┐
|
|
||||||
│ EMQX │ Mosquitto │ BunkerM │
|
|
||||||
│ port 11883 │ port 1883 │ port 1900 │
|
|
||||||
└──────┬──────┴──────┬──────┴──────┬──────┘
|
|
||||||
↓ ↓ ↓
|
|
||||||
┌─────────────┬─────────────┬─────────────┐
|
|
||||||
│iot-agent-emqx│iot-agent- │iot-agent- │
|
|
||||||
│(port 4041) │mosquitto │bunkerm │
|
|
||||||
│ │(port 4042) │(port 4043) │
|
|
||||||
└──────┬──────┴──────┬──────┴──────┬──────┘
|
|
||||||
└──────────────┴──────────────┘
|
|
||||||
↓
|
↓
|
||||||
Orion-LD (port 1026)
|
Brokers MQTT (EMQX ✅, Mosquitto ✅, BunkerM ✅)
|
||||||
(http://smart-city-orion-ld:1026)
|
|
||||||
↓
|
↓
|
||||||
Subscription (ID: 69fbb09af55b82cad2a38008)
|
IoT Agents (EMQX→Orion-LD ✅, Mosquitto→Orion-LD ✅, BunkerM→Stellio ✅)
|
||||||
Forward to QuantumLeap
|
|
||||||
↓
|
↓
|
||||||
QuantumLeap (port 8668)
|
Context Brokers (Orion-LD ✅, Stellio ✅)
|
||||||
↓
|
↓
|
||||||
CrateDB (ports 5432/4200)
|
QuantumLeap → CrateDB (tables: 6 créées ✅)
|
||||||
↓
|
↓
|
||||||
Grafana (port 3001)
|
Grafana (Dashboard AirQuality ✅, autres à faire 🔄)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configuration des IoT-Agents
|
### 🎯 Actions prioritaires prochaine session
|
||||||
|
1. **Résoudre OpenRemote API 405** (ou créer assets via UI)
|
||||||
|
2. **Créer 60 assets OpenRemote** (30 capteurs × 2 realms)
|
||||||
|
3. **Finaliser dashboards Grafana** (Traffic, Weather, etc.)
|
||||||
|
4. **Configurer `SENSOR_COUNT=30`** dans simulateur
|
||||||
|
5. **Mettre à jour documentation architecture** (après vérification Stellio complète)
|
||||||
|
|
||||||
### Services enregistrés (pour chaque IoT-Agent)
|
### 🔐 Commandes utiles
|
||||||
```json
|
|
||||||
{
|
|
||||||
"apikey": "smartcity-api-key",
|
|
||||||
"cbroker": "http://smart-city-orion-ld:1026",
|
|
||||||
"resource": "/",
|
|
||||||
"type": "AirQualityObserved",
|
|
||||||
"service": "smartcity",
|
|
||||||
"subservice": "/"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Devices enregistrés
|
|
||||||
- **Device ID** : airquality_001
|
|
||||||
- **Entity Name** : urn:ngsi-ld:AirQualityObserved:airquality_001
|
|
||||||
- **Attributes** : NO2 (Number), temperature (Number), humidity (Number)
|
|
||||||
|
|
||||||
## Sous-domaines (Traefik)
|
|
||||||
- `iot-agent-emqx.digitribe.fr` → Port 4041
|
|
||||||
- `iot-agent-mosquitto.digitribe.fr` → Port 4042
|
|
||||||
- `iot-agent-bunkerm.digitribe.fr` → Port 4043
|
|
||||||
- `orion-ld.digitribe.fr` → Port 1026
|
|
||||||
- `quantum-leap.digitribe.fr` → Port 8668
|
|
||||||
- `grafana.digitribe.fr` → Port 3001
|
|
||||||
|
|
||||||
## Fichiers modifiés et commités
|
|
||||||
1. `docker-compose.iot-agent.yml` : 3 instances IoT-Agent
|
|
||||||
2. `docker-compose.orion-ld.yml` : Orion-LD avec MongoDB
|
|
||||||
3. `docker-compose.quantumleap.yml` : Variables CRATE_HOST/PORT
|
|
||||||
4. `simulator.py` : Publication sur 3 brokers
|
|
||||||
5. `data-flow-diagram.md` : Diagramme Mermaid mis à jour
|
|
||||||
6. `data-flow-diagram.html` : Version HTML pour Gitea
|
|
||||||
7. `session_resume_2026-05-06.md` : Ce fichier
|
|
||||||
|
|
||||||
## Commandes utiles pour debug
|
|
||||||
|
|
||||||
### Vérifier IoT-Agent
|
|
||||||
```bash
|
```bash
|
||||||
curl -s http://localhost:4041/iot/devices -H 'FIWARE-Service: smartcity'
|
# Vérifier Stellio
|
||||||
docker logs smart-city-iot-agent-emqx --tail 50 | grep -i "update\|orion\|error"
|
docker exec smart-city-cratedb curl -s "http://stellio-api-gateway:8080/ngsi-ld/v1/entities?type=AirQualityObserved" -H "Accept: application/ld+json"
|
||||||
|
|
||||||
|
# Vérifier CrateDB
|
||||||
|
docker exec smart-city-cratedb bash -c 'crash -c "SELECT * FROM quantumleap.etairqualityobserved LIMIT 5;"'
|
||||||
|
|
||||||
|
# Test OpenRemote API (échoue encore avec 405)
|
||||||
|
curl -s "https://openremote.digitribe.fr/api/master/asset" -H "Authorization: Bearer <TOKEN>"
|
||||||
|
|
||||||
|
# Démarer simulateur avec 30 capteurs
|
||||||
|
cd ~/smart-city-digital-twin-martinique
|
||||||
|
SENSOR_COUNT=30 docker compose -f docker-compose.yml up -d simulator
|
||||||
```
|
```
|
||||||
|
|
||||||
### Vérifier Orion-LD
|
### 📦 Git Status
|
||||||
```bash
|
- Repo: `smart-city-digital-twin-martinique` sur `gitea.digitribe.fr/eric/`
|
||||||
curl -s http://localhost:1026/v2/entities?type=AirQualityObserved
|
- Dernier commit: `IoT Agents: suppression healthcheck + BunkerM configuré pour Stellio`
|
||||||
docker logs smart-city-orion-ld --tail 50
|
- Fichiers modifiés: `docker-compose.iot-agent.yml`
|
||||||
```
|
- Status: ✅ Poussé sur `origin/master`
|
||||||
|
|
||||||
### Tester le flux complet
|
|
||||||
```bash
|
|
||||||
# Publication MQTT (avec préfixe json/)
|
|
||||||
mosquitto_pub -h localhost -p 11883 \
|
|
||||||
-t "json/smartcity-api-key/airquality_001/attrs" \
|
|
||||||
-m '{"NO2": 70.5, "temperature": 31.0, "humidity": 88.0}'
|
|
||||||
|
|
||||||
# Attendre 10s puis vérifier Orion-LD
|
|
||||||
sleep 10 && curl -s http://localhost:1026/v2/entities
|
|
||||||
```
|
|
||||||
|
|
||||||
## Prochaines étapes
|
|
||||||
1. **Valider le flux** : Vérifier qu'Orion-LD reçoit les entités (corriger le nom d'hôte)
|
|
||||||
2. **Configurer Stellio** : Abonnement Orion-LD → Stellio (port 8080)
|
|
||||||
3. **Créer les dashboards Grafana** : Utiliser la datasource CrateDB-SmartCity
|
|
||||||
4. **Mettre à jour le simulateur** : S'assurer qu'il publie sur le bon topic (`json/...`)
|
|
||||||
5. **Tester avec les 3 brokers** : Valider EMQX, Mosquitto et BunkerM
|
|
||||||
|
|
||||||
## Notes importantes
|
|
||||||
- L'IoT-Agent écoute les topics avec préfixe `json/` (ex: `$share/json//+/+/attrs/+`)
|
|
||||||
- Le simulateur doit publier sur `json/smartcity-api-key/{device_id}/attrs`
|
|
||||||
- Pour Stellio, utiliser l'URL : `http://stellio-api-gateway:8080/ngsi-ld/v1/entityOperations/upsert`
|
|
||||||
- QuantumLeap utilise CrateDB avec le schéma `quantumleap`
|
|
||||||
|
|
||||||
---
|
---
|
||||||
*Dernière mise à jour : 06 Mai 2026, 17h30*
|
*Session mise à jour: 2026-05-06 21:35 - Eric FELIXINE*
|
||||||
|
|||||||
Reference in New Issue
Block a user