5.8 KiB
5.8 KiB
Smart City Digital Twin - Data Models & Schemas
Vue d'ensemble
Ce document décrit les schémas de données utilisés par les différents brokers (MQTT, Fiware) avec les champs de traçabilité.
🔍 Champs de traçabilité (ajoutés le 05-05-2026)
| Champ | Type NGSI-LD | Type SensorThings | Description |
|---|---|---|---|
source |
Property (valeur: string) | Thing.properties (valeur: string) | Broker MQTT source (ex: "EMQX", "Mosquitto", "BunkerM", "simulator") |
mqttTopic |
Property (valeur: string) | Thing.properties (valeur: string) | Topic MQTT d'origine (ex: "city/sensors/airquality/airquality_000") |
Note : source est un champ standard NGSI-LD (ETSI). mqttTopic est une propriété personnalisée (autorisée par l'extension NGSI-LD).
1. NGSI-LD Entities (Orion-LD, Stellio)
Structure de base (avec traçabilité)
{
"@context": [
"https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld"
],
"id": "urn:ngsi-ld:AirQualityObserved:airquality_000",
"type": "AirQualityObserved",
"dateObserved": {"type": "Property", "value": "2026-05-05T02:00:00Z"},
"location": {"type": "GeoProperty", "value": {"type": "Point", "coordinates": [-61.0, 14.6]}},
"name": {"type": "Property", "value": "Port de Fort-de-France"},
"batteryLevel": {"type": "Property", "value": 85},
"source": {"type": "Property", "value": "EMQX"},
"mqttTopic": {"type": "Property", "value": "city/sensors/airquality/airquality_000"}
}
Mapping Smart Data Models → NGSI-LD Types
| Sensor Type | NGSI-LD Type | Exemple ID |
|---|---|---|
| airquality | AirQualityObserved | urn:ngsi-ld:AirQualityObserved:airquality_000 |
| traffic | TrafficFlowObserved | urn:ngsi-ld:TrafficFlowObserved:traffic_000 |
| parking | ParkingSpotObserved | urn:ngsi-ld:ParkingSpotObserved:parking_000 |
| noise | NoiseLevelObserved | urn:ngsi-ld:NoiseLevelObserved:noise_000 |
| weather | WeatherObserved | urn:ngsi-ld:WeatherObserved:weather_000 |
| light | LightObserved | urn:ngsi-ld:LightObserved:light_000 |
2. SensorThings API (FROST-Server)
Thing Properties (avec traçabilité)
{
"name": "Thing_airquality_000",
"description": "Smart City airquality sensor in Martinique",
"properties": {
"sensorType": "airquality",
"region": "Martinique",
"source": "EMQX",
"mqttTopic": "city/sensors/airquality/airquality_000"
}
}
Datastream Structure
{
"name": "Datastream airquality/pm25_ugm3",
"description": "Datastream for airquality sensor airquality_000 - pm25_ugm3",
"observationType": "http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement",
"unitOfMeasurement": {"name": "pm25_ugm3", "symbol": "µg/m³", "definition": "http://www.qudt.org/vocab/unit#MicrogramPerCubicMeter"},
"Sensor": {...},
"ObservedProperty": {...}
}
3. MQTT Topics (Brokers)
Format des topics
city/sensors/{sensor_type}/{sensor_id}
Exemples :
city/sensors/airquality/airquality_000city/sensors/traffic/traffic_000city/sensors/parking/parking_000
Mapping Topic → Entity ID
| MQTT Topic | NGSI-LD Entity ID | SensorThings Thing ID |
|---|---|---|
city/sensors/airquality/airquality_000 |
urn:ngsi-ld:AirQualityObserved:airquality_000 |
Thing_airquality_000 |
city/sensors/traffic/traffic_000 |
urn:ngsi-ld:TrafficFlowObserved:traffic_000 |
Thing_traffic_000 |
4. InfluxDB (Bucket: iot_data)
Measurements (v2 Flux)
airqualitytrafficparkingnoiseweatherlight
Tags
location: Nom du lieu (ex: "Port de Fort-de-France")sensor_id: ID du capteur (ex: "airquality_000")
Fields
- Valeurs spécifiques au type (ex:
pm25_ugm3,co_mgm3,vehicle_count, etc.)
5. Procédure de mise à jour des payloads
⚠️ CHAQUE FOIS que les payloads sont modifiés (ajout/suppression de champs) :
-
Nettoyer les bases :
# Orion-LD curl -s "http://localhost:2026/ngsi-ld/v1/entities?type=AirQualityObserved&limit=1000" | python3 -c "..." # (Supprimer chaque entité) # Stellio # Via API Stellio (http://localhost:8087/ngsi-ld/v1/entities) # FROST # Via API FROST (http://localhost:8086/FROST-Server/v1.1/Things) -
Mettre à jour ce document (
references/data-models.md) -
Tester avec un simulateur frais (entities recréées)
-
Committer et pousser vers Gitea :
git add references/data-models.md simulator.py git commit -m "Update data models: add/remove fields" git push origin master
6. Identification des messages par broker MQTT
Pour identifier quels messages ont été reçus par chaque broker Fiware :
Requête Orion-LD (source)
curl -s "http://localhost:2026/ngsi-ld/v1/entities?type=AirQualityObserved&limit=10" \
-H "Accept: application/ld+json" | python3 -c "
import sys, json
data = json.load(sys.stdin)
for e in data:
print(f\"{e['id']} | source: {e.get('source', {}).get('value')} | topic: {e.get('mqttTopic', {}).get('value')}\")
"
Requête Stellio (source)
curl -s "http://localhost:8087/ngsi-ld/v1/entities?type=AirQualityObserved&limit=10" \
-H "Accept: application/ld+json" -H "NGSI-LD-Tenant: urn:ngsi-ld:tenant:default" | ...
Requête FROST (Thing.properties)
curl -s "http://localhost:8086/FROST-Server/v1.1/Things" | python3 -c "
import sys, json
data = json.load(sys.stdin)
for t in data.get('value', []):
props = t.get('properties', {})
print(f\"{t['name']} | source: {props.get('source')} | topic: {props.get('mqttTopic')}\")
"
Dernière mise à jour : 05 Mai 2026
Auteur : Smart City Digital Twin Team
Version : 1.1 (avec traçabilité source/mqttTopic)