Files
smart-city-digital-twin-mar…/references/data-models.md
2026-05-04 22:39:27 -04:00

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_000
  • city/sensors/traffic/traffic_000
  • city/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)

  • airquality
  • traffic
  • parking
  • noise
  • weather
  • light

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) :

  1. 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)
    
  2. Mettre à jour ce document (references/data-models.md)

  3. Tester avec un simulateur frais (entities recréées)

  4. 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)