Datenmodell: ThingsBoard auf SensorThings abbilden
Zweck
Diese Seite beantwortet für jede SensorThings‑Entität, die der Adapter anlegt, woher jedes ihrer Felder kommt. Die Entitäten selbst und ihre Abfragesyntax beschreibt Schnittstellenbeschreibung SensorThings API; die Tabellen, aus denen die Zuordnungen stammen, Datenbankschema des Adapters.
Alles hier Beschriebene wird in den FROST‑Server eines Mandanten geschrieben — den, dessen Slug in der Ingest‑URL stand.
Überblick
ThingsBoard FROST (SensorThings)
Gerät ───────────► Thing
└─ Relation "Contains"
└─ Asset (Typ `building`) ───────────► Location
└─ Geräteprofil ───────────► Sensor
└─ Telemetrie-Schlüssel ───────────► Datastream
└─ Wert + Zeitstempel ───────────► Observation
Adapter-Datenbank
└─ observedproperty ───────────► ObservedProperty (Kopie je Mandant)
└─ telemetrykey ⌐ Name des Datastreams
└─ unitofmeasurement(key) └ eingebettetes unitOfMeasurement
Zwei Quellen also: die Gerätedaten kommen aus ThingsBoard, die Bedeutung der Telemetrie aus den Stammdaten des Adapters.
Thing
Ein Thing entspricht genau einem Gerät in ThingsBoard.
| Feld | Quelle | Anmerkung |
|---|---|---|
|
Gerätename |
Muss eindeutig sein und ist der Schlüssel, über den der Adapter das Thing wiederfindet. |
|
|
Fällt auf den Gerätenamen zurück, wenn keine Beschreibung gepflegt ist. |
|
Alle Attribute des Geräts als Objekt |
Hier landen auch die Attribute, die der Adapter selbst auswertet: |
|
Das verknüpfte |
Wird im selben |
Location
Der Standort stammt aus dem Asset, das über eine Contains‑Relation mit dem Gerät verknüpft ist und den Typ building trägt. Findet der Adapter kein solches Asset, lehnt er mit 404 ab und schreibt nichts.
| Feld | Quelle | Anmerkung |
|---|---|---|
|
Name des Assets |
Der Name identifiziert den Standort; mehrere Geräte im selben Gebäude teilen sich eine Location. |
|
|
Fällt auf den Asset‑Namen zurück. |
|
Die Attribute |
Als GeoJSON |
|
fest |
|
Sensor
Ein Sensor entspricht einem Geräteprofil in ThingsBoard — nicht einem einzelnen Gerät. Alle Geräte desselben Profils teilen sich einen Sensor.
| Feld | Quelle | Anmerkung |
|---|---|---|
|
Name des Geräteprofils |
|
|
Beschreibung des Geräteprofils |
|
|
Geräteattribut |
Üblicherweise ein Link auf ein Datenblatt. Fehlt das Attribut, steht dort |
|
fest |
|
ObservedProperty
Die einzige Entität, die nicht aus ThingsBoard stammt. Ihre Wahrheit liegt in der Tabelle observedproperty des Adapters; jeder Mandant hält in seinem FROST eine abgeleitete Kopie mit name, definition und description aus der kanonischen Zeile.
|
Die Kopie wird ausschließlich über die in |
Welche Observed Property zu einer Telemetrie gehört, entscheidet die Tabelle telemetrykey: Ein Schlüssel ohne Zuordnung erzeugt keinen Datastream und damit auch keine Observation — er wird still übergangen und protokolliert.
Datastream
Ein Datastream je Telemetrie‑Schlüssel und Gerät. Er verbindet Thing, Sensor und ObservedProperty.
| Feld | Quelle | Anmerkung |
|---|---|---|
|
Der Telemetrie‑Schlüssel |
Der Name ist der Schlüssel. Ein Telemetry Key hat keine eigene Identität in FROST — er existiert nur als dieser Name, weshalb eine Umbenennung die Datastreams direkt umschreiben muss. |
|
erzeugt |
|
|
fest |
|
|
Ein eingebettetes Objekt aus |
|
|
die oben angelegten Entitäten |
Wie die Maßeinheit bestimmt wird
Zwei Stufen, in dieser Reihenfolge:
-
Gerätespezifisch. Der Adapter liest das Geräteattribut
<telemetry_key>_uomaus denpropertiesdes Things und schlägt dessen Wert in der Tabelleunitofmeasurementkeynach. Ein Gerät, dessen Telemetrietemperaturein Fahrenheit liefert, bekommt damit über ein Attributtemperature_uomeine andere Einheit als alle anderen. -
Standard. Findet sich darüber nichts, gilt
telemetrykey.default_uom.
|
Die Maßeinheit wird nicht aus einem Suffix des Telemetrie‑Schlüssels abgeleitet. Sie kommt entweder aus dem Geräteattribut oder aus der Standardzuordnung des Schlüssels — beides gepflegt über die Verwaltungsoberfläche. |
Observation
Für jeden Telemetrie‑Schlüssel einer eingehenden Nachricht, der einen Datastream hat, entsteht eine Observation.
| Feld | Quelle | Anmerkung |
|---|---|---|
|
Der Wert des Telemetrie‑Felds |
|
|
|
Millisekunden seit Epoch, umgerechnet nach |
|
Der Datastream dieses Schlüssels an diesem Thing |
Fehlt er und ist der Schlüssel zugeordnet, wird er zuvor angelegt. |
FeatureOfInterest
Wird nicht verwendet. Der Adapter legt keine FeaturesOfInterest an; FROST erzeugt sie bei Bedarf selbst aus der Location des Things.
Beispiele
Die folgenden Ausschnitte zeigen die Entitäten eines Luftqualitätssensors, wie der Adapter sie anlegt.
{
"name": "KSPB-0507",
"description": "Luftqualitätssensor an der Schule an der Wakenitz",
"properties": {
"areaServed": "Schule an der Wakenitz",
"device_definition": "https://example.org/datasheets/kspb.pdf",
"co2_uom": "ppm"
}
}
{
"name": "Schule an der Wakenitz",
"description": "Geo-Position des Geräts KSPB-0507",
"encodingType": "application/geo+json",
"location": {
"type": "Point",
"coordinates": [10.7383340505368, 53.855998806145]
}
}
{
"name": "KSPB Umweltsensor",
"description": "Geräteprofil der KSPB-Messstationen",
"encodingType": "application/pdf",
"metadata": "https://example.org/datasheets/kspb.pdf"
}
{
"name": "CO2-Konzentration",
"definition": "https://en.wikipedia.org/wiki/Carbon_dioxide#Concentration",
"description": "Kohlenstoffdioxid-Konzentration in ppm"
}
{
"name": "co2",
"description": "Datastream for co2 measurements of KSPB-0507",
"observationType": "OM_Measurement",
"unitOfMeasurement": {
"name": "Parts per million",
"symbol": "ppm",
"definition": "https://unitsofmeasure.org"
},
"Thing": { "@iot.id": 1 },
"Sensor": { "@iot.id": 1 },
"ObservedProperty": { "@iot.id": 1 }
}
{
"result": 487.2485,
"phenomenonTime": "2024-06-20T06:58:06.594Z",
"Datastream": { "@iot.id": 1 }
}