- Skills créés: chirpstack-lorawan, the-things-stack-lorawan - docker-compose.chirpstack.yml: ChirpStack derrière Traefik - docker-compose.the-things-stack.yml: TTS derrière Traefik - data-flow-diagram.md: mise à jour avec LoRaWAN - DOCKER-ARCHITECTURE: ajout conteneurs LoRaWAN - Subdomaines Traefik: chirpstack, tts Skills créés dans ~/.hermes/skills/iot/: - chirpstack-lorawan - the-things-stack-lorawan
16 KiB
16 KiB
Smart City Digital Twin - Data Flow Diagram (Updated 2026-05-12)
Architecture complète avec LoRaWAN
┌─────────────────────────────────────────────────────────────────────────────┐
│ Smart City Simulator (Python) │
│ Publie sur 3 brokers MQTT + REST vers OpenRemote │
└──────────┬────────────────────┬──────────────────────┬───────────────────┘
│ │ │
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ EMQX Broker │ │ Mosquitto Broker │ │ BunkerM Broker │
│ (port 11883) │ │ (port 1883) │ │ (port 1900) │
└────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘
│ │ │
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ IoT-Agent-EMQX │ │IoT-Agent-Mosquitto│ │IoT-Agent-BunkerM │
│ Port: 4041 │ │ Port: 4042 │ │ Port: 4043 │
└────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘
│ │ │
└───────────────────────┴──────────────────────┘
│
▼
┌─────────────────────┐
│ Orion-LD Context │
│ Broker (port 1026)│
│ MongoDB backend │
└─────────┬───────────┘
│
│ Subscription → QuantumLeap
▼
┌─────────────────────┐
│ QuantumLeap │
│ (port 8668) │
└─────────┬───────────┘
│
▼
┌─────────────────────┐
│ CrateDB │
│ (ports 5432/4200)│
└─────────┬───────────┘
│
▼
┌─────────────────────┐
│ Grafana │
│ (port 3001) │
└─────────────────────┘
═══════════════════════════════════════════════════════════════════════════════
LoRaWAN Layer
═══════════════════════════════════════════════════════════════════════════════
┌──────────────────┐ ┌──────────────────┐
│ Gateway LoRaWAN │ UDP │ Gateway LoRaWAN │
│ (EU868) │ 1700 │ (EU868) │
└────────┬─────────┘ └────────┬─────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ ChirpStack LoRaWAN Network Server │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ chirpstack │ │ gateway-bridge │ │ rest-api │ │
│ │ (port 8080) │ │ (UDP 1700) │ │ (port 8090) │ │
│ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ PostgreSQL │ │ Redis │ │ Mosquitto (MQTT) │ │
│ │ (chirpstack DB) │ │ (cache) │ │ (port 1883) │ │
│ └──────────────────┘ └──────────────────┘ └────────┬─────────┘ │
└──────────────────────────────────────────────────────┬─────────────────────┘
│
▼
┌──────────────────┐
│ EMQX Broker │
│ (integration) │
└──────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ The Things Stack LoRaWAN Network Server │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ tts-stack │ │ tts-postgres │ │ tts-redis │ │
│ │ (port 1885) │ │ (TTN DB) │ │ (cache) │ │
│ └────────┬─────────┘ └──────────────────┘ └──────────────────┘ │
│ │ │
│ │ UDP 1700 (gateways) │
│ │ MQTT 1883 (events) │
│ │ HTTP 1884 (API) │
│ │ HTTP 1885 (Console) │
└───────────┬─────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────┐
│ EMQX Broker │
│ (integration) │
└──────────────────┘
═══════════════════════════════════════════════════════════════════════════════
OpenRemote Manager
═══════════════════════════════════════════════════════════════════════════════
┌─────────────────────────────────────────────────────────────────────────────┐
│ OpenRemote Manager (Artemis MQTT) │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Manager UI │ │ Keycloak │ │ PostgreSQL │ │
│ │ (port 8080) │ │ (port 8080) │ │ (port 5432) │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────┘ │
│ │
│ Assets IOTSensor avec agentLink MQTT + location (GeoJSON Point) │
│ Assets visualisés sur la carte Martinique (mapsettings.json) │
└─────────────────────────────────────────────────────────────────────────────┘
Flux de données (Step-by-step)
-
Simulator publie sur 3 brokers MQTT (EMQX:11883, Mosquitto:1883, BunkerM:1900)
- Topic:
smartcity-api-key/{device_id}/attrs - Format:
{"NO2": 45.5, "temperature": 26.0, "humidity": 70.0}
- Topic:
-
3 IoT-Agents (un par broker) reçoivent les messages
- iot-agent-emqx (port 4041) ← EMQX
- iot-agent-mosquitto (port 4042) ← Mosquitto
- iot-agent-bunkerm (port 4043) ← BunkerM
-
Orion-LD reçoit les entités NGSI-v2
- URL:
http://smart-city-orion-ld:1026 - Entité:
urn:ngsi-ld:AirQualityObserved:airquality_001
- URL:
-
Subscription Orion-LD → QuantumLeap
- Notify URL:
http://smart-city-quantumleap:8668/v2/op/notify
- Notify URL:
-
QuantumLeap stocke dans CrateDB
- Table:
quantumleap.etairqualityobserved
- Table:
-
Grafana visualise les données
- Datasource:
CrateDB-SmartCity
- Datasource:
-
ChirpStack gère les gateways et devices LoRaWAN
- Gateway Bridge (UDP 1700) → ChirpStack → MQTT → EMQX
- REST API (port 8090) pour gestion des devices/applications
-
The Things Stack gère les gateways et devices LoRaWAN (alternative)
- Gateway (UDP 1700) → TTS Stack → MQTT/REST API
- Console web (port 1885)
-
OpenRemote affiche les assets sur la map
- Assets IOTSensor avec location GeoJSON
- Agents MQTT pour mise à jour des valeurs
Sous-domaines (Traefik)
IoT Agents & Brokers
iot-agent-emqx.digitribe.fr→ IoT-Agent-EMQX (port 4041)iot-agent-mosquitto.digitribe.fr→ IoT-Agent-Mosquitto (port 4042)iot-agent-bunkerm.digitribe.fr→ IoT-Agent-BunkerM (port 4043)orion-ld.digitribe.fr→ Orion-LD (port 1026)quantum-leap.digitribe.fr→ QuantumLeap (port 8668)grafana.digitribe.fr→ Grafana (port 3001)
ChirpStack LoRaWAN
chirpstack.digitribe.fr→ ChirpStack Console (port 8080)chirpstack-api.digitribe.fr→ ChirpStack REST API (port 8090)chirpstack-ws.digitribe.fr→ Gateway Bridge WebSocket (port 3001)
The Things Stack LoRaWAN
tts.digitribe.fr→ TTS Console (port 1885)tts-api.digitribe.fr→ TTS REST API (port 1884)
OpenRemote
openremote.digitribe.fr→ OpenRemote Manager (port 8080)
Flux de données (Step-by-step)
-
Simulator publie sur 3 brokers MQTT (EMQX:11883, Mosquitto:1883, BunkerM:1900)
- Topic:
smartcity-api-key/{device_id}/attrs - Format:
{"NO2": 45.5, "temperature": 26.0, "humidity": 70.0}
- Topic:
-
3 IoT-Agents (un par broker) reçoivent les messages
- iot-agent-emqx (port 4041) ← EMQX
- iot-agent-mosquitto (port 4042) ← Mosquitto
- iot-agent-bunkerm (port 4043) ← BunkerM
- Chaque IoT-Agent a le service
smartcity-api-keyconfiguré - Chaque IoT-Agent a le device
airquality_001enregistré
-
Orion-LD reçoit les entités NGSI-v2
- URL:
http://smart-city-orion-ld:1026 - Entité:
urn:ngsi-ld:AirQualityObserved:airquality_001 - Type:
AirQualityObserved
- URL:
-
Subscription Orion-LD → QuantumLeap
- ID:
69fbb09af55b82cad2a38008 - Description: "Forward AirQualityObserved to QuantumLeap"
- Notify URL:
http://smart-city-quantumleap:8668/v2/op/notify - Attrs: NO2, temperature, humidity
- ID:
-
QuantumLeap stocke dans CrateDB
- Table:
quantumleap.etairqualityobserved - Colonnes: entity_id, time_index, NO2, temperature, humidity
- Table:
-
Grafana visualise les données
- Datasource:
CrateDB-SmartCity(ID: 23) - URL:
smart-city-cratedb:5432 - Database:
quantumleap
- Datasource:
Services et Devices (provisionnés)
IoT-Agent-EMQX (port 4041)
- Service:
smartcity-api-key→ Orion-LD (http://smart-city-orion-ld:1026) - Device:
airquality_001→urn:ngsi-ld:AirQualityObserved:airquality_001
IoT-Agent-Mosquitto (port 4042)
- Service:
smartcity-api-key→ Orion-LD (http://smart-city-orion-ld:1026) - Device:
airquality_001→urn:ngsi-ld:AirQualityObserved:airquality_001
IoT-Agent-BunkerM (port 4043)
- Service:
smartcity-api-key→ Orion-LD (http://smart-city-orion-ld:1026) - Device:
airquality_001→urn:ngsi-ld:AirQualityObserved:airquality_001
Sous-domaines (Traefik)
iot-agent-emqx.digitribe.fr→ IoT-Agent-EMQX (port 4041)iot-agent-mosquitto.digitribe.fr→ IoT-Agent-Mosquitto (port 4042)iot-agent-bunkerm.digitribe.fr→ IoT-Agent-BunkerM (port 4043)orion-ld.digitribe.fr→ Orion-LD (port 1026)quantum-leap.digitribe.fr→ QuantumLeap (port 8668)grafana.digitribe.fr→ Grafana (port 3001)
Test du flux complet
# 1. Publier un message MQTT (simuler le simulateur)
mosquitto_pub -h localhost -p 11883 -t "smartcity-api-key/airquality_001/attrs" \
-m '{"NO2": 50.5, "temperature": 30.0, "humidity": 90.0}'
# 2. Vérifier qu'Orion-LD a reçu l'entité
curl -s http://localhost:1026/v2/entities -w "\nHTTP %{http_code}\n"
# 3. Vérifier que QuantumLeap a reçu la notification
docker logs smart-city-quantumleap --tail 20 | grep -i "notify\|airquality"
# 4. Vérifier CrateDB
docker exec smart-city-cratedb crash -c "SELECT * FROM quantumleap.etairqualityobserved LIMIT 5;"
# 5. Vérifier Grafana
curl -s http://localhost:3001/api/datasources -u admin:Digitribe972 | jq '.[] | select(.type=="postgres") | .name'
Fichiers modifiés (2026-05-06)
docker-compose.iot-agent.yml: 3 instances IoT-Agent (emqx, mosquitto, bunkerm)docker-compose.orion-ld.yml: Orion-LD avec MongoDB existantdocker-compose.quantumleap.yml: Variables CRATE_HOST/PORT (fix)simulator.py: Publication sur 3 brokers avec format IoT-Agentdata-flow-diagram.md: Ce fichier (mis à jour)