Skip to content

Functions DataAggregationResource

Florian Fehring edited this page Oct 5, 2026 · 1 revision

Die DataAggregationResource bietet Methoden zum Aggregieren von Datensätzen.

Funktion 1: Temporale Aggregation

Findet Datensätze, die zeitlich beieinander liegen und fasst sie zu einem neuen Datensatz zusammen. Dabei wird:

  • Ein mittlerer Zeitstempel für den neuen Datensatz berechnet, der dem arithmetischen Mittel der Einzelzeitstempel entspricht
  • Falls mehrere Datensätze zu einem Attribut gefunden werden, wird auch hier das arithmetische Mittel berechnet.
  • Datensätze aus mehreren Datenquellen (auch unterschiedlichen SmartData-Instanzen) können als Eingangsdatensätze verwendet werden.

Der Aufruf erfolgt per POST unter Übergabe eines Konfigurations-JSONS.

Konfigurations-JSON: Das Konfigurations-JSON besteht aus folgenden Inhalten:

Bezeichnung Beschreibung Standardwert
start Zeitpunkt ab dem Datensätze berücksichtig werden sollen -
end Zeitpunkt bis zu dem Datensätze berücksichtig werden sollen -
date_attr Name des Attributs das Zeitstempel enthällt ts
cluster_seconds Größe eines Clusters in Sekunden 30
traceability Adds output to the resulting json to support traceability false
onlyclosedclusters If set to false datasets of running timeslots will also used true
processed_attr Name of an attribute to set to "true" when processed successfully for aggregation -
mapping Mapping JSON Objects consisting of the following attributes: -
-source_attr Name of values source attribute -
-source_pointer Json-Path to find value in JSON content inside the source attribute (optional) -
-target_attr Name of the attribute the value should be outputted to -
datasources Array of datasources with the following attributes: -
name Reader friendly name for datasource -
-smartdataurl URL unter der das SmartData mit den Daten zu finden ist http://localhost:8080/SmartData
-collection Name der Collection -
-storage Storage der Collection public
-dateatrribute Name of the attribute holding the time information ts
-includes Attribute, die berücksichtig werden sollen *
-filter SmartData filter expression for filtering used datasets (multiple times useable) -
-limit Max. Anzahl zu verarbeitender Datensätze 100

Beispiel:

{
  "start": "2025-01-01T00:00",
  "end": "2025-12-31T23:59",
  "date_attr": "ts",
  "cluster_seconds": 30,
  "traceability": true,
  "onlyclosedclusters": false,
  "processed_attr": "processed",
  "mapping": {
    "inn_temp": {
		"source_attr": "result",
		"source_pointer": "/statemsg/values/temperature_celsius",
		"target_attr": "inn_temp"
	},
	"inn_hum": {
		"source_attr": "result",
		"source_pointer": "/statemsg/values/humidity_percent",
		"target_attr": "inn_hum"
	},
	"inn_pres": {
		"source_attr": "result",
		"source_pointer": "/statemsg/values/pressure_hPa",
		"target_attr": "inn_pres"
	},
	"temp1": {
		"source_attr": "result",
		"source_pointer": "/statemsg/sensors/0/values/temperature_celsius",
		"target_attr": "temp1"
	},
	"temp2": {
		"source_attr": "result",
		"source_pointer": "/statemsg/sensors/1/values/temperature_celsius",
		"target_attr": "temp2"
	},
    "temp3": {
		"source_attr": "result",
		"source_pointer": "/statemsg/sensors/2/values/temperature_celsius",
		"target_attr": "temp3"
	},
	"pm2_5": {
		"source_attr": "result",
		"source_pointer": "/statemsg/values/pm2.5",
		"target_attr": "pm2_5"
	},
	"pm10_0": {
		"source_attr": "result",
		"source_pointer": "/statemsg/values/pm10.0",
		"target_attr": "pm10_0"
	},
	"co2": {
		"source_attr": "result",
		"source_pointer": "/statemsg/values/co2_ppm",
		"target_attr": "co2"
	}
  },
  "datasources": [
    {
      "name": "datajobs_log",
      "smartdataurl": "/SmartDataTest",
      "collection": "datajobs_log",
      "storage": "smartmonitoring",
      "dateattribute": "ts",
      "filter": ["datajob_id,in,1,2,3,4,5&filter=processed,eq,false"],
      "limit": 10
    },
    {
      "name": "datajobs_log2",
      "smartdataurl": "/SmartDataTest",
      "collection": "datajobs_log2",
      "storage": "smartmonitoring",
      "dateattribute": "ts",
      "filter": ["datajob_id,in,1,2,3,4,5&filter=processed,eq,false"],
      "limit": 10
    }
  ]
}

Antwort: Die Antwort besteht aus einem JsonObject, das in "records" die berechneten Datensätze enthält. In "clustererrors" werden Fehlermeldungen und Hinweise zur Anwendung des Mappings gegeben.

{
    "clustererrors": [
        {
            "incorrect": "/statemsg/sensors/1/values/temperature_celsius",
            "suggestion": "/statemsg/values/temperature_celsius",
            "json": {
                "cmdstr": "python;/home/pi/payara/scripts/bme280.py",
                "state": "finished",
                "statemsg": {
                    "sensor": "bme280",
                    "hostname": "raspberrypi",
                    "timestamp": "2025-06-24T13:49:14.771331+00:00",
                    "values": {
                        "temperature_celsius": 26.33,
                        "humidity_percent": 35.55,
                        "pressure_hPa": 1003.96
                    }
                }
            }
        }
    ],
    "records": [
        {
            "ts": "2025-06-24T15:49:14.968Z",
            "inn_hum": 35.55,
            "inn_temp": 26.33,
            "pm2_5": 2.5,
            "pm10_0": 10.5,
            "inn_pres": 1003.96,
            "temp2": 26.44,
            "temp3": 26.5,
            "temp1": 26.0
        },
        {
            "ts": "2025-06-24T15:52:14.571Z",
            "inn_hum": 35.66,
            "inn_temp": 26.4,
            "pm2_5": 2.6,
            "pm10_0": 7.1,
            "inn_pres": 1003.91,
            "temp2": 26.56,
            "temp3": 26.62,
            "temp1": 26.19
        },
        {
            "ts": "2025-06-24T15:53:51.079Z",
            "co2": 416.0
        }
    ]
}

Mapping: Das Mapping wird mit einem JSON Object definiert, das seinerseits für jedes Mapping ein JSON Ojekt beinhaltet. Die Attribute für das Mapping sind:

Attribut Beschreibung
source_attr Name des Attributs, in dem der Wert gefunden werden soll
source_pointer JSON Pointer, falls sich in source_attr ein JSON befindet und ein gezielter Wert daraus genutzt werden soll.
target_attr Name des Attributs im neu anzulegenden Datensatz.

Beispiel:

{
	"inn_temp": {
		"source_attr": "result",
		"source_pointer": "/statemsg/values/temperature_celsius",
		"target_attr": "inn_temp"
	},
	"temp1": {
		"source_attr": "result",
		"source_pointer": "/statemsg/sensors/0/values/temperature_celsius",
		"target_attr": "temp1"
	}
}

Clone this wiki locally