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 72a77215..fddd7b0c 100644 Binary files a/__pycache__/simulator.cpython-313.pyc and b/__pycache__/simulator.cpython-313.pyc differ 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: