From c27c2c10afabb026180e179f075a4107edc73cc7 Mon Sep 17 00:00:00 2001 From: Eric FELIXINE Date: Wed, 6 May 2026 19:26:13 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20QuantumLeap=20+=20Redis=20+=20simulateur?= =?UTF-8?q?=20MQTT-only=20+=20donn=C3=A9es=20test=20CrateDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RESUME_FINAL_2026-05-06.md | 156 +++++++++++++------------- __pycache__/simulator.cpython-313.pyc | Bin 70626 -> 71991 bytes docker-compose.mosquitto.yml | 34 ++++++ docker-compose.quantumleap.yml | 52 +++++++-- simulator.py | 16 +-- 5 files changed, 157 insertions(+), 101 deletions(-) create mode 100644 docker-compose.mosquitto.yml diff --git a/RESUME_FINAL_2026-05-06.md b/RESUME_FINAL_2026-05-06.md index 289c81b7..d4eb28ac 100644 --- a/RESUME_FINAL_2026-05-06.md +++ b/RESUME_FINAL_2026-05-06.md @@ -1,89 +1,83 @@ -# RESUMÉ FINAL - Smart City Digital Twin (06 Mai 2026 - 18h15) +# Résumé Final - Smart City Digital Twin (06 Mai 2026 - 19h30) -## ✅ RÉALISÉ (en parallèle) +## ✅ Ce qui fonctionne +1. **MQTT Brokers** : EMQX (11883), Mosquitto (1883), BunkerM (1900) - OK +2. **IoT-Agents** : Reçoivent les données MQTT et mettent à jour Orion-LD - OK +3. **Orion-LD** : Contient les entités (vérifier via `curl http://localhost:1026/v2/entities`) +4. **CrateDB** : Fonctionne parfaitement (INSERT manuel OK) +5. **Grafana** : Datasources CrateDB configurées (IDs 23, 24) +6. **Redis** : Installé et accessible par QuantumLeap -### 1. Pipelines complètes -**Pipeline 1 : Orion-LD** -- 3 IoT-Agents (EMQX:4041, Mosquitto:4042, BunkerM:4043) ✅ -- Orion-LD (port 1026) ✅ -- QuantumLeap-Orion (port 8668) ✅ -- CrateDB-Orion (port 5432/4200) ✅ **Contient des données** (`quantumleap.etairqualityobserved`) +## ❌ Problème bloquant : QuantumLeap → CrateDB +**Symptômes :** +- QuantumLeap reçoit les notifications (`/v2/notify` → "Notification successfully processed") +- Aucune donnée insérée dans CrateDB (`quantumleap.etairqualityobserved`) +- La queue Redis reste vide (`rq:queue:default` n'existe pas) +- `WQ_OFFLOAD_WORK=True` est activé mais les tâches ne sont pas ajoutées à la queue -**Pipeline 2 : Stellio** -- Stellio (port 8080) ✅ -- QuantumLeap-Stellio (port 8669) ✅ -- CrateDB-Stellio (port 5433/4201) ✅ **Vide (à tester)** +**Investigation :** +- `offload_to_work_queue()` retourne `True` ✅ +- `redis_connection()` utilise `REDIS_HOST=smart-city-redis` et `REDIS_PORT=6379` ✅ +- Worker RQ lancé et connecté ✅ +- Mais `InsertAction.enqueue()` n'ajoute rien à la queue Redis -### 2. Grafana ✅ -- URL: https://grafana.digitribe.fr -- **2 Datasources CrateDB** ajoutées : - - `CrateDB-SmartCity` (ID: 23) → smart-city-cratedb:5432, DB: quantumleap - - `CrateDB-Stellio` (ID: 24) → smart-city-cratedb-stellio:5432, DB: quantumleap_stellio +**Hypothèses :** +1. `InsertAction` n'est pas picklable (échec silencieux de `q.enqueue()`) +2. Problème de connexion Redis dans `enqueue()` +3. La méthode `trans.insert()` échoue silencieusement +4. Bug dans le module `wq` de QuantumLeap -### 3. Documentation (Gitea) ✅ -- ✅ `architecture-multi-cb.md` → Architecture 2 pipelines (corrigée) -- ✅ `data-flow-diagram.md` → Mermaid (3 IoT-Agents) -- ✅ `data-flow-diagram.html` → Version web -- ✅ `session_resume_2026-05-06.md` → Résumé complet -- ✅ `docker-compose.quantumleap-stellio.yml` → Nouveau fichier -- ✅ Tout commité et pushé sur Gitea - -### 4. Problèmes résolus -- ✅ Variables QuantumLeap (`CRATE_HOST/PORT` au lieu de `QL_*`) -- ✅ Images Docker (`fiware/quantum-leap:latest` avec tiret) -- ✅ Alias réseau Orion-LD (`orion-ld` + `smart-city-orion-ld`) -- ✅ Datasources Grafana (2 CrateDB connectées) - -## ⚠️ EN COURS / PROBLÈMES - -1. **Stellio Subscription** : Échoue en 405 (API NGSI-LD) - - Cause probable : Endpoint ou format de requête incorrect - - Action : Rechercher la bonne API Stellio - -2. **Orion-LD Subscriptions** : Retourne HTTP 000 (Timeout) - - Cause probable : Problème réseau interne (Orion → QuantumLeap) - - Action : Vérifier les logs Orion-LD - -3. **Simulateur** : Doit publier sur `json/smartcity-api-key/{id}/attrs` - - Action : Modifier `simulator.py` si nécessaire - -## 🎯 PROCHAINES ÉTAPES - -1. **Tester Stellio** : Trouver la bonne API pour les subscriptions NGSI-LD -2. **Finaliser le flux** : Valider Stellio → QuantumLeap-Stellio → CrateDB-Stellio -3. **Créer les dashboards Grafana** : Utiliser les 2 sources CrateDB -4. **Simulateur** : S'assurer qu'il publie correctement sur les 3 brokers - -## 📊 BILAN SERVICES - -| Service | Container | Port | Statut | Datasource Grafana | -|---------|-----------|------|--------|-------------------| -| **Orion-LD** | smart-city-orion-ld | 1026 | ✅ Up | - | -| **QuantumLeap-Orion** | smart-city-quantumleap | 8668 | ✅ Up | - | -| **CrateDB-Orion** | smart-city-cratedb | 5432/4200 | ✅ Up | `CrateDB-SmartCity` (23) ✅ | -| **Stellio** | stellio-api-gateway | 8080 | ✅ Up | - | -| **QuantumLeap-Stellio** | smart-city-quantumleap-stellio | 8669 | ✅ Up | - | -| **CrateDB-Stellio** | smart-city-cratedb-stellio | 5433/4201 | ✅ Up | `CrateDB-Stellio` (24) ✅ | -| **3 IoT-Agents** | smart-city-iot-agent-* | 4041-4043 | ✅ Up | - | -| **Grafana** | smart-city-grafana | 3001 | ✅ Up | 2 sources ✅ | - -## 📡 COMMANDES DE TEST (Flux complet) - -```bash -# 1. Publier sur EMQX (avec préfixe json/) -mosquitto_pub -h localhost -p 11883 \ - -t "json/smartcity-api-key/airquality_001/attrs" \ - -m '{"NO2": 80.5, "temperature": 33.0, "humidity": 95.0}' - -# 2. Vérifier Orion-LD -sleep 10 && curl -s http://localhost:1026/v2/entities - -# 3. Vérifier CrateDB-Orion -docker exec smart-city-cratedb crash -c "SELECT * FROM quantumleap.etairqualityobserved LIMIT 5;" - -# 4. Vérifier Grafana -curl -s http://localhost:3001/api/dashboards/home -u admin:Digitribe972 +## 🛠️ Solution temporaire (pour Grafana) +Des données de test ont été insérées manuellement dans CrateDB : +```sql +INSERT INTO quantumleap.etairqualityobserved (entity_id, time_index, no2, temperature, humidity) VALUES +('urn:ngsi-ld:AirQualityObserved:sensor001', 1778112000000, 45.5, 28.0, 85.0), +... ``` +**Dashboards Grafana configurés :** +- Dashboard Orion-LD (ID: 21) +- Dashboard Stellio (ID: 22) +- Datasource CrateDB-SmartCity (ID: 23, port 5432) +- Datasource CrateDB-Stellio (ID: 24, port 5433) + +## 📋 Actions pour finaliser +1. **Stellio Pipeline** : + - Corriger `docker-compose.quantumleap-stellio.yml` (CRATE_PORT=4200) + - Créer subscription Stellio → QuantumLeap-Stellio + - Vérifier `CrateDB-Stellio` + +2. **QuantumLeap Debug** (à faire ultérieurement) : + - Vérifier si `InsertAction` est picklable + - Ajouter des logs dans `wq/core/task.py` (`enqueue()`) + - Tester `trans.insert()` manuellement avec un payload simple + - Consulter la documentation QuantumLeap / issues GitHub + +3. **Simulateur** : + - `simulator.py` corrigé pour n'utiliser que MQTT (Orion/Stellio désactivés) + - MQTT OK, IoT-Agent OK, mais QuantumLeap ne traite pas les notifications + +## 🔧 Commandes utiles +```bash +# Vérifier CrateDB +docker exec smart-city-cratedb crash -c "SELECT * FROM quantumleap.etairqualityobserved LIMIT 10;" + +# Vérifier Redis +docker exec smart-city-redis redis-cli keys "*" + +# Voir les logs QuantumLeap +docker logs smart-city-quantumleap --tail 100 + +# Tester notification manuelle +curl -s -X POST http://localhost:8668/v2/notify -H 'Content-Type: application/json' \ + -d '{"subscriptionId": "test", "data": [{...}]}' +``` + +## 📊 Fichiers modifiés +- `docker-compose.quantumleap.yml` : +Redis, +healthcheck CrateDB, +variables environnement +- `simulator.py` : Orion-LD et Stellio désactivés (MQTT uniquement) +- `RESUME_FINAL_2026-05-06.md` : Ce fichier + --- -*Dernière mise à jour : 06 Mai 2026, 18h15 - 2 Pipelines isolées, Grafana prêt* \ No newline at end of file +**Prochaine étape** : Configurer la pipeline Stellio et finaliser les dashboards Grafana avec les données de test. +Le problème QuantumLeap nécessite une investigation plus poussée du code source (`wq` module). diff --git a/__pycache__/simulator.cpython-313.pyc b/__pycache__/simulator.cpython-313.pyc index 72a772154748e4d66c1fbaca734609e83d291052..fddd7b0c190b74d3f3fb667185eeb61b19419b84 100644 GIT binary patch delta 12672 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 BGv5FJ delta 11730 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 diff --git a/docker-compose.mosquitto.yml b/docker-compose.mosquitto.yml new file mode 100644 index 00000000..f92bed93 --- /dev/null +++ b/docker-compose.mosquitto.yml @@ -0,0 +1,34 @@ +# Mosquitto Broker for Smart City Simulator +# Usage: docker compose -f docker-compose.yml -f docker-compose.mosquitto.yml up -d +version: '3.8' + +services: + mosquitto: + image: eclipse-mosquitto:latest + container_name: smart-city-mosquitto + restart: unless-stopped + networks: + - smartcity-shared + - traefik-public + ports: + - "1883:1883" + - "9001:9001" + volumes: + - mosquitto-data:/mosquitto/data + - mosquitto-logs:/mosquitto/log + command: mosquitto -c /mosquitto/config/mosquitto.conf + healthcheck: + test: ["CMD", "mosquitto_sub", "-h", "localhost", "-p", "1883", "-t", "test", "-W", "1"] + interval: 30s + timeout: 10s + retries: 3 + +volumes: + mosquitto-data: + mosquitto-logs: + +networks: + smartcity-shared: + external: true + traefik-public: + external: true diff --git a/docker-compose.quantumleap.yml b/docker-compose.quantumleap.yml index fdb734bf..ba60fd16 100644 --- a/docker-compose.quantumleap.yml +++ b/docker-compose.quantumleap.yml @@ -1,15 +1,20 @@ version: '3.8' -networks: - traefik-public: - external: true - smartcity-shared: - external: true - services: + redis: + image: redis:7-alpine + container_name: smart-city-redis + networks: + - smartcity-shared + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + cratedb: - container_name: smart-city-cratedb image: crate:5.5 + container_name: smart-city-cratedb restart: unless-stopped environment: - CRATE_HEAP_SIZE=1g @@ -19,28 +24,51 @@ services: - smartcity-shared ports: - "4200:4200" - - "5432:5432" + healthcheck: + test: ["CMD", "curl", "-f", "-X", "POST", "-d", "{\"stmt\": \"SELECT 1\"}", "http://localhost:4200/_sql"] + interval: 10s + timeout: 5s + retries: 5 quantumleap: - container_name: smart-city-quantumleap image: fiware/quantum-leap:latest + container_name: smart-city-quantumleap restart: unless-stopped environment: - CRATE_HOST=smart-city-cratedb - CRATE_PORT=4200 - CRATE_DB_NAME=quantumleap - - QL_LOG_LEVEL=INFO + - QL_LOG_LEVEL=DEBUG + - RQ_MONITOR_REDIS_URL=redis://smart-city-redis:6379 + - REDIS_HOST=smart-city-redis + - REDIS_PORT=6379 + - WQ_OFFLOAD_WORK=True + - ORION_HOST=smart-city-orion-ld + - ORION_PORT=1026 depends_on: - - cratedb + cratedb: + condition: service_healthy + redis: + condition: service_healthy networks: - smartcity-shared - traefik-public + ports: + - "8668:8668" + # Le worker est géré en interne par wq (pas besoin de rq worker) + # Utilisation du command par défaut: python /src/ngsi-timeseries-api/src/app.py labels: - "traefik.enable=true" - - "traefik.http.routers.quantumleap.rule=Host(`quantum-leap.digitribe.fr`)" + - "traefik.http.routers.quantumleap.rule=Host(`quantum-leap.digitribe.fr')" - "traefik.http.routers.quantumleap.entrypoints=websecure" - "traefik.http.routers.quantumleap.tls=true" - "traefik.http.services.quantumleap.loadbalancer.server.port=8668" volumes: cratedb-data: + +networks: + smartcity-shared: + external: true + traefik-public: + external: true diff --git a/simulator.py b/simulator.py index 585f6150..ac08c198 100644 --- a/simulator.py +++ b/simulator.py @@ -1278,15 +1278,15 @@ def main(): ok_or = publish_openremote(sid, sensor, or_values) print(f" 🏠 OpenRemote: {'✅' if ok_or else '⚠️ skipped'}") - # --- Orion-LD --- - if ENABLE_ORION: - ok_or = publish_orion(sid, sensor) - print(f" 🌐 Orion-LD: {'✅' if ok_or else '⚠️ skipped'}") + # --- Orion-LD --- (DÉSACTIVÉ: Utiliser uniquement IoT-Agents MQTT) + # if ENABLE_ORION: + # ok_or = publish_orion(sid, sensor) + # print(f" 🌐 Orion-LD: {'✅' if ok_or else '⚠️ skipped'}") - # --- Stellio --- - if ENABLE_STELLIO: - ok_st = publish_stellio(sid, sensor) - print(f" 🏢 Stellio: {'✅' if ok_st else '❌'}") + # --- Stellio --- (DÉSACTIVÉ: Utiliser uniquement IoT-Agents MQTT) + # if ENABLE_STELLIO: + # ok_st = publish_stellio(sid, sensor) + # print(f" 🏢 Stellio: {'✅' if ok_st else '❌'}") # --- FROST --- if ENABLE_FROST: