> For the complete documentation index, see [llms.txt](https://docs.enlyze.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.enlyze.com/integrations/grafana/intermediate-features/02-transformations.md).

# 02 Transformationen

Transformationen bearbeiten Daten nach der Abfrage, aber bevor sie visualisiert werden: aggregieren, filtern, umbenennen, kombinieren. In diesem Tutorial lernst du die wichtigsten Transformationen und baust Schritt für Schritt eine Übersichtstabelle wie diese:

<figure><img src="/files/5AVTrqHeXeGFaiYMIAQm" alt=""><figcaption></figcaption></figure>

## Was du lernst

* Daten mit Reduce aggregieren (Minimum, Maximum, Mittelwert)
* Felder umbenennen, umsortieren und ausblenden
* Trendlinien mit Regressionsanalyse hinzufügen
* Daten aus mehreren Queries kombinieren
* Transformationen verketten

## Voraussetzungen

* Teil 1 und Teil 2 der Tutorials abgeschlossen
* Grundkenntnisse in der Panel-Erstellung

***

## Der Transform-Tab

1. Bearbeite ein Panel
2. Klicke auf den **Transform**-Tab (zwischen Query und Alert)
3. Klicke auf **+ Add transformation** und wähle eine Transformation

Transformationen werden von oben nach unten ausgeführt. Du kannst sie per Drag-and-Drop umsortieren, deaktivieren (Augen-Symbol) oder löschen (Papierkorb-Symbol).

{% hint style="info" %}
Die Reihenfolge beeinflusst das Ergebnis. Ein Filter vor Reduce liefert andere Ergebnisse als danach.
{% endhint %}

***

## Reduce

Wandelt Zeitreihendaten in aggregierte Werte um. Ideal für Übersichtstabellen.

1. Füge die Transformation **Reduce** hinzu
2. Wähle die Berechnungen:

| Berechnung             | Beschreibung                       |
| ---------------------- | ---------------------------------- |
| **Last \***            | Letzter Wert (nicht null)          |
| **Min** / **Max**      | Minimum / Maximum                  |
| **Mean**               | Mittelwert                         |
| **Sum**                | Summe aller Werte                  |
| **Difference percent** | Prozentuale Veränderung            |
| **All values**         | Array aller Werte (für Sparklines) |

<figure><img src="/files/7ehtEhWFc9zlV8VoHFBP" alt=""><figcaption></figcaption></figure>

***

## Organize Fields by Name

Spalten umbenennen, umsortieren und ausblenden. Unverzichtbar für aufgeräumte Tabellen.

1. Füge die Transformation **Organize fields by name** hinzu
2. Für jedes Feld:
   * **Rename**: Neuen Anzeigenamen eingeben
   * **Hide**: Augen-Symbol klicken zum Ausblenden
   * **Reorder**: Per Drag-and-Drop umsortieren

<figure><img src="/files/w3EGPxUtfFBLdypgxNF8" alt=""><figcaption></figcaption></figure>

***

## Rename by Regex

Mehrere Felder gleichzeitig mit Musterabgleich umbenennen.

| Einstellung | Beschreibung                                |
| ----------- | ------------------------------------------- |
| **Match**   | Regex-Muster zum Abgleich                   |
| **Replace** | Ersetzungstext ($1, $2 für Capture-Gruppen) |

**Beispiele:**

| Match                    | Replace    | Vorher               | Nachher        |
| ------------------------ | ---------- | -------------------- | -------------- |
| `Extruder (.) Durchsatz` | `Ext $1`   | Extruder A Durchsatz | Ext A          |
| `\(Soll\)`               | `(Target)` | Speed (Soll)         | Speed (Target) |
| `(.+) - (.+)`            | `$2`       | Kiefel - Durchsatz   | Durchsatz      |

<figure><img src="/files/1WK0JqvkOLHjqQjqwtZO" alt=""><figcaption></figcaption></figure>

### Gängige Regex-Muster

| Muster      | Beschreibung                               | Beispiel                        |
| ----------- | ------------------------------------------ | ------------------------------- |
| `.`         | Beliebiges einzelnes Zeichen               | `A`, `1`, `-`                   |
| `.*`        | Beliebig viele Zeichen                     | `Extruder A Durchsatz`          |
| `.+`        | Mindestens ein Zeichen                     | wie `.*`, aber nicht leer       |
| `(...)`     | Capture-Gruppe (im Replace als `$1`, `$2`) | `(Extruder .)` → `$1`           |
| `\(` / `\)` | Literale Klammern                          | `\(Soll\)` findet `(Soll)`      |
| `^` / `$`   | Anfang / Ende des Strings                  | `^Kiefel` findet nur am Anfang  |
| `[A-C]`     | Zeichenklasse                              | `Extruder [A-C]`                |
| `\d+`       | Eine oder mehrere Ziffern                  | `Sensor \d+` findet `Sensor 42` |

***

## Filter by Name

Nur bestimmte Felder in der Ausgabe anzeigen.

1. Füge die Transformation **Filter by name** hinzu
2. Wähle **Include** (nur ausgewählte Felder anzeigen) oder **Exclude** (ausgewählte ausblenden)
3. Felder manuell per Checkboxen auswählen oder per Regex filtern

<figure><img src="/files/Wcwx7VeW8SFDNYqefdUe" alt=""><figcaption></figcaption></figure>

**Regex-Beispiele für Filter by Name:**

| Modus   | Regex                   | Effekt                                       |
| ------- | ----------------------- | -------------------------------------------- |
| Include | `Durchsatz\|Temperatur` | Nur Durchsatz- und Temperaturfelder anzeigen |
| Exclude | `.*\(Soll\)`            | Alle Sollwerte ausblenden                    |
| Include | `Extruder [AB].*`       | Nur Extruder A und B anzeigen                |

{% hint style="info" %}
Mit **Filter data by values** kannst du auch Zeilen nach Bedingungen filtern, z. B. nur Datenpunkte anzeigen, bei denen die Temperatur > 200 °C liegt.
{% endhint %}

***

## Regressionsanalyse

Trendlinien hinzufügen, um die Entwicklung von Daten über die Zeit zu erkennen.

1. Füge die Transformation **Regression analysis** hinzu
2. Setze **X field** auf das Zeitfeld und **Y field** auf das Wertfeld

<figure><img src="/files/QVe7gZI24zKKiAV7umD3" alt=""><figcaption></figcaption></figure>

Die Regressionslinie zeigt den Gesamttrend: steigend, fallend oder stabil.

<figure><img src="/files/HkOUFymTBWNzCbwRJVPT" alt=""><figcaption></figcaption></figure>

### Trendlinie gestalten

Die Regressionslinie hat standardmäßig keine Einheit und erscheint auf einer separaten Y-Achse. Füge einen Override hinzu:

1. Feld per Regex abgleichen: `.*predicted.*`
2. Setze die **Unit** auf die gleiche Einheit wie die Originaldaten
3. Wähle eine andere Farbe (z. B. Rot) und einen gestrichelten Linienstil

***

## Daten kombinieren

Wenn du Daten aus mehreren Queries zusammenführen möchtest, stehen dir zwei Transformationen zur Verfügung:

| Transformation    | Beschreibung                                                                                                |
| ----------------- | ----------------------------------------------------------------------------------------------------------- |
| **Merge**         | Fasst alle Zeitreihen in einer Tabelle zusammen. Keine Konfiguration nötig.                                 |
| **Join by field** | Verknüpft Tabellen über ein gemeinsames Feld (z. B. Zeitstempel). Mode: Inner, Left outer oder Right outer. |

***

## Beispiel: Maschinenvergleich

Dieses Beispiel zeigt, wie du mit einer Transformationskette den Durchsatz zweier Maschinen in einer kompakten Vergleichstabelle zusammenfasst.

### Schritt 1: Zwei Queries anlegen

Erstelle zwei separate Queries, jeweils für eine Maschine. Benenne die Queries nach der Maschine (z. B. „Kiefel" und „Macchi"), damit die Daten später unterscheidbar sind.

<figure><img src="/files/nhPlk6CNE8v5dCCSIe8A" alt=""><figcaption></figcaption></figure>

### Schritt 2: Transformationskette aufbauen

Wechsle zum **Transform**-Tab und füge die folgenden fünf Transformationen nacheinander hinzu:

<figure><img src="/files/RtGDyOX0Qzg4CiVYQNCc" alt=""><figcaption></figcaption></figure>

1. **Rename by regex** (×2): Benenne das Feld „Durchsatz" in jeder Query um, damit die Maschine erkennbar wird. Match: `Durchsatz`, Replace: `Kiefel` bzw. `Macchi`. Klicke auf das Filter-Symbol der Transformation und wähle unter **Apply transformation to** die jeweilige Query aus (z. B. „Query: Kiefel"). Dadurch wirkt jede Umbenennung nur auf die zugehörige Query.
2. **Join by field**: Verbindet die beiden umbenannten Zeitreihen über den Zeitstempel zu einer gemeinsamen Tabelle.
3. **Reduce**: Aggregiert die Zeitreihen zu einer Zeile pro Maschine mit den Berechnungen Last \*, Min, Max, Mean, All values und Difference.
4. **Organize fields by name**: Benennt die Spalten lesbarer um (z. B. „Field" → „Machine", „Last \*" → „Current", „All values" → „Trend") und sortiert sie in die gewünschte Reihenfolge.

### Ergebnis

Die fertige Tabelle vergleicht beide Maschinen auf einen Blick, inklusive Sparkline-Trendanzeige:

<figure><img src="/files/SDnq6DNDq1ATEQuCB0fv" alt=""><figcaption></figcaption></figure>

Die Spaltenformatierung (Bar Gauge für „Current", farbiger Hintergrund für „Change", Sparkline für „Trend") wird über **Overrides** > **Fields with name** > **Cell options** konfiguriert. Details dazu findest du im Tutorial [Tabellen](/integrations/grafana/visualisation-types/03-tables.md).

{% hint style="info" %}
Nutze den **Table view**-Toggle im Panel-Editor, um nach jeder Transformation das Zwischenergebnis zu prüfen.
{% endhint %}

***

## Tipps

* **Performance**: Transformationen werden im Browser ausgeführt. Wenn möglich, schon auf Query-Ebene filtern.
* **Debuggen**: Transformationen einzeln hinzufügen und den **Table view**-Toggle nutzen, um Zwischenergebnisse zu prüfen.
* **Gängige Muster**: Zeitreihe → Übersichtstabelle: Reduce + Organize fields. Sparklines: Reduce mit All values + Override auf Zelltyp.

***

## Nächste Schritte

* [**Einführung in die ENLYZE API**](/integrations/grafana/advanced-api/01-introduction.md) - API-basierte Dashboards für weiterführende Anwendungsfälle
