AggregateStreamData@1
Der Node AggregateStreamData@1 verdichtet die Spalten eines Stream-Data-Archivs zu Kennzahlen über einen Zeitraum — die Summe der Energie eines Monats, die maximale Datenqualität in diesem Monat. Er ist das Gegenstück zu GetStreamData@1, der die Zeilen selbst liefert.
Der Node schreibt ein Query-Ergebnis nach targetPath: eine Spalte je Kennzahl und, wenn groupBy verwendet wird, eine Zeile je Gruppe.
Adapter-Voraussetzungen
Node-Konfiguration
Zu den Feldern targetPath, targetValueWriteMode und targetValueKind siehe Überblick. Das Feld path wird in diesem Node nicht verwendet.
transformations:
- type: AggregateStreamData@1
archiveRtId: 68a1f0c5de73e7b175575401 # Runtime-ID des Archivs (muss aktiviert sein)
aggregations: # Die zu bildenden Kennzahlen, mindestens eine
- attributePath: Energy
function: Sum
- attributePath: DataQuality
function: Maximum
groupBy: # Spalten zur Gruppierung, leer ergibt eine einzige Ergebniszeile
- rtId
wellKnownNames: # Einschränkung auf Quell-Entitäten mit diesen Well-Known Names
- METER-4711
wellKnownNamesPath: $.meters # Alternativ: Well-Known Names aus dem Payload lesen
rtIds: # Einschränkung auf diese Quell-Entitäten
- 68a2b1c4de73e7b175575402
rtIdsPath: $.rtIds # Alternativ: Runtime-IDs aus dem Payload lesen
fieldFilters: # Zusätzliche Filter, mit UND verknüpft
- attributePath: DataQuality
operator: GreaterEqualsThan
comparisonValue: 90
from: 2026-07-01T00:00:00 # Beginn des aggregierten Zeitraums (UTC)
fromPath: $.from # Alternativ: Beginn des Zeitraums aus dem Payload lesen
to: 2026-08-01T00:00:00 # Ende des aggregierten Zeitraums (UTC)
toPath: $.to # Alternativ: Ende des Zeitraums aus dem Payload lesen
requireGapFree: true # Nur aggregieren, wenn der Zeitraum lückenlos abgedeckt ist
expectedInterval: PT15M # Intervall, in dem die Vollständigkeitsprüfung zählt
maxGapScanRows: 200000 # Obergrenze der Zeilen für die Vollständigkeitsprüfung
targetPath: $.monthly # Pfad, unter dem die Kennzahlen im Payload abgelegt werden
Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
archiveRtId | string | Ja | Runtime-ID des Archivs, aus dem gelesen wird. Das Archiv muss aktiviert sein |
aggregations | Array von AggregationColumnDto | Ja | Die zu bildenden Kennzahlen. Mindestens ein Eintrag; dieselbe Spalte darf mehrfach mit unterschiedlichen Funktionen vorkommen |
groupBy | Array von string | Nein | Spalten zur Gruppierung, z. B. rtId für eine Zeile je Quell-Entität. Leer ergibt eine einzige Zeile |
wellKnownNames | Array von string | Nein | Schränkt die Aggregation auf Quell-Entitäten mit diesen Well-Known Names ein |
wellKnownNamesPath | string | Nein | JSONPath-Alternative zu wellKnownNames; akzeptiert einen Einzelwert, ein Array oder einen Multi-Match-Pfad |
rtIds | Array von string | Nein | Schränkt die Aggregation auf diese Quell-Entitäten ein |
rtIdsPath | string | Nein | JSONPath-Alternative zu rtIds |
fieldFilters | Array von FieldFilterWithPathDto | Nein | Zusätzliche Filter auf die Spalten des Archivs, mit UND verknüpft |
from | Datum/Zeit | Nein | Beginn des aggregierten Zeitraums (UTC). Ohne Wert wird ab Archivbeginn aggregiert |
fromPath | string | Nein | JSONPath zum Beginn des Zeitraums im Payload |
to | Datum/Zeit | Nein | Ende des aggregierten Zeitraums (UTC). Ohne Wert wird bis zum Archivende aggregiert |
toPath | string | Nein | JSONPath zum Ende des Zeitraums im Payload |
requireGapFree | boolean | Nein | Nur aggregieren, wenn jede Quell-Entität für den gesamten Zeitraum Daten geliefert hat |
expectedInterval | Zeitspanne | Nein | Intervall, in dem die Vollständigkeitsprüfung zählt, z. B. PT15M. Standard ist die Periode des Archivs |
maxGapScanRows | integer | Nein | Obergrenze der Zeilen für die Vollständigkeitsprüfung (Standard 200000), muss größer als null sein |
Die verfügbaren Filteroperatoren sind bei GetRtEntitiesByType@1 beschrieben.
Aggregationsspalten
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
attributePath | string | Ja | Die zu aggregierende Spalte (z. B. Energy, Amount.Value) |
function | enum | Ja | Die Aggregationsfunktion |
comparisonValue | string | Nein | Für zustandsbasierte Aggregationen vorgesehen; von den unten genannten Funktionen ignoriert |
Unterstützt werden die Funktionen Count, Minimum, Maximum, Average und Sum.
TimeWeightedAverage und StateDuration lehnt dieser Node ab: Sie benötigen Metadaten, die der Node nicht tragen kann — einen Vergleichswert bzw. den Fortschreibungspfad eines Raw-Archivs —, und ihre Ergebnisschlüssel folgen anderen Regeln. Verwenden Sie dafür GetQueryById@1 mit einer persistierten Query, die die Aggregation je Spalte definiert.
Vorrang und Zeitzone
Je Wert gewinnt das Literal gegenüber seiner JSONPath-Variante: from vor fromPath, to vor toPath, wellKnownNames vor wellKnownNamesPath und rtIds vor rtIdsPath.
Zeitstempel werden als UTC gelesen. Ein Wert ohne Zeitzonen-Offset (2026-07-01T00:00:00) wird als UTC interpretiert, nicht als Lokalzeit des Adapter-Hosts.
Ein Pfad, der ins Leere zeigt, lässt die Grenze offen und erzeugt eine Warnung; ein vorhandener, aber nicht datumsartiger Wert lässt den Node fehlschlagen.
Spaltennamen
Die Namen in groupBy, fieldFilters und in den attributePath-Werten folgen demselben Vokabular wie bei GetStreamData@1: Timestamp, WindowStart / WindowEnd (nur bei Archiven mit Fenstern), WellKnownName oder jede vom Archiv deklarierte Spalte. Ein nicht auflösbarer Name lässt den Node fehlschlagen, statt ignoriert zu werden.
Bei einer Aggregation steht mehr auf dem Spiel als beim Lesen: Ein verworfener Filter würde die Kennzahl erhöhen, eine verworfene Gruppierungsspalte alle Gruppen zu einer einzigen Zeile zusammenfallen lassen. Deshalb werden unbekannte Namen abgelehnt und nicht übersprungen.
Ergebnisform
Das Ergebnis enthält zuerst die Gruppierungsspalten, danach eine Spalte je Kennzahl. Ohne groupBy gibt es genau eine Zeile — auch dann, wenn die Speicherschicht nichts zurückgeliefert hat; die Werte sind in diesem Fall null, statt dass die Zeile fehlt. Ein nachgelagerter Node findet damit immer die erwartete Struktur vor.
Wird derselbe Attributpfad mehrfach aggregiert, wird die Funktion an die Spaltenüberschrift angehängt, da ein reiner Pfadname nicht eindeutig wäre:
Energy (Minimum) | Energy (Maximum)
Vollständigkeitsprüfung
requireGapFree: true führt die Abdeckungsprüfung von GetStreamData@1 vor der Aggregation aus und nutzt dabei denselben Scan, dieselbe Zeilenobergrenze und denselben Intervall-Rückfall. Fehlen einer Entität Daten, schlägt der Node fehl und benennt die betroffenen Serien mit dem fehlenden Umfang und dem Beginn der ersten Lücke.
Teilergebnisse gibt es nicht: Ein unvollständiger Monat darf keine Kennzahl liefern, die gültig aussieht, aber zu niedrig ist. Die Prüfung setzt beide Zeitgrenzen und ein Archiv mit Fenstern (TimeRange oder Rollup) voraus.
Sumist nur bei disjunkten Fenstern korrekt. Identische Fenster kann es nicht geben — die Speicherschicht führt sie zusammen —, überlappende Fenster sind dagegen zulässig und ihr Überlappungsbereich wird doppelt gezählt.requireGapFreeschlägt darauf bewusst nicht fehl; es sichert Lückenfreiheit zu, nicht Überschneidungsfreiheit. Wer darauf reagieren muss, wertethasOverlapsaus dem Lückenbericht vonGetStreamData@1aus.Averageist arithmetisch, nicht zeitgewichtet. Bei gleich langen Fenstern (dem Viertelstundenfall) ist beides identisch; bei variablen Fensterlängen ist ein zeitgewichteter Mittelwert das richtige Mittel — und damitGetQueryById@1.- Keine Sortierung, Paginierung oder Zeilenobergrenze. Sie haben für eine Aggregation keine Bedeutung und fehlen deshalb in der Konfiguration, statt vorhanden und wirkungslos zu sein.
Anwendungsbeispiel
Die im Monat verbrauchte Energie je Zähler aufsummieren und die maximale Datenqualität desselben Zeitraums ausgeben — aber nur, wenn der Monat lückenlos vorliegt:
triggers:
- type: FromExecutePipelineCommand@1
transformations:
- type: AggregateStreamData@1
archiveRtId: 68a1f0c5de73e7b175575401
aggregations:
- attributePath: Energy
function: Sum
- attributePath: DataQuality
function: Maximum
groupBy:
- rtId
from: 2026-07-01T00:00:00
to: 2026-08-01T00:00:00
requireGapFree: true
expectedInterval: PT15M
targetPath: $.monthly
- type: QueryResultToMarkdownTable@1
path: $.monthly
targetPath: $.table
Anwendungsfälle
- Abrechnung: Verbrauch eines Abrechnungszeitraums je Zähler ermitteln, abgesichert gegen unvollständige Daten
- Kennzahlen-Reporting: Monats-, Wochen- oder Schichtsummen, Minima und Maxima bilden
- Qualitätsüberwachung: Schlechteste oder durchschnittliche Datenqualität eines Zeitraums melden
- Grenzwertüberwachung: Eine Kennzahl bilden und in einem nachfolgenden Control-Node darauf verzweigen
- Verdichtung vor der Übertragung: Wenige Kennzahlen statt tausender Rohdatenzeilen versenden
Siehe auch
GetStreamData@1— liefert die Zeilen selbst, inklusive LückenberichtGetQueryById@1— führt eine persistierte Query-Entität aus, inklusive zeitgewichteter Aggregationen und DownsamplingSaveStreamDataInArchive@1— das Schreib-Gegenstück