# 01 Produktionsstatus-Dashboard

In diesem Tutorial baust du ein Dashboard, das den aktuellen Produktionsstatus zweier Maschinen nebeneinander zeigt. Konstante Variablen speichern die Maschinen-UUIDs, alle Daten kommen über die ENLYZE API:

<figure><img src="https://3556205377-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fn6Jn6Re8NNPSKD1jGZyL%2Fuploads%2Fgit-blob-d68b34996f7b30712d2973701c31058df26cdd3d%2Fgrafana-status-hero-01.png?alt=media" alt=""><figcaption></figcaption></figure>

## Was du lernst

* Konstante Variablen für feste Maschinenkonfigurationen
* Maschinennamen über die API holen statt hartcodieren
* Laufende Aufträge mit JSONata erkennen
* OEE-Kennzahlen aus Production Runs anzeigen
* Multi-Maschinen-Layout mit Side-by-Side-Panels

## Voraussetzungen

* [ENLYZE API abfragen](https://docs.enlyze.com/integrations/grafana/advanced-api/02-api-queries), [Variablen](https://docs.enlyze.com/integrations/grafana/advanced-api/03-variables) und [Fortgeschrittene Variablen](https://docs.enlyze.com/integrations/grafana/advanced-api/03b-advanced-variables) abgeschlossen
* Verständnis des `production-runs`-Endpoints und von JSONata

***

## Wann konstante Variablen?

In [Variablen](https://docs.enlyze.com/integrations/grafana/advanced-api/03-variables) und [Fortgeschrittene Variablen](https://docs.enlyze.com/integrations/grafana/advanced-api/03b-advanced-variables) hast du Query-Variablen mit Dropdown-Auswahl erstellt. Für Shopfloor-Displays oder Statusmonitore, die immer dieselben Maschinen zeigen, ist ein Dropdown unnötig.

Konstante Variablen lösen diesen Fall:

* **Feste Konfiguration**: Die Maschinen-UUIDs stehen direkt in den Variable-Settings
* **Versteckt**: `Hide: Variable` blendet sie aus, da Nutzende sie nicht ändern sollen
* **Einziger Konfigurationspunkt**: Um eine Maschine zu tauschen, änderst du nur die Variable statt jede Query einzeln

***

## Konstante Variablen erstellen

Erstelle ein neues Dashboard und lege zwei konstante Variablen an:

| Name       | Typ      | Wert                                   | Hide     |
| ---------- | -------- | -------------------------------------- | -------- |
| `machine1` | Constant | `141e0927-62b3-4e76-8398-ad82d20f397f` | Variable |
| `machine2` | Constant | `f5c0b9d4-e89e-43ad-b81c-16bd5cbe3646` | Variable |

Die UUIDs findest du in der ENLYZE Web App oder über den `machines`-Endpoint.

***

## Maschinennamen anzeigen

Statt den Maschinennamen als weitere Konstante zu speichern, holst du ihn über die API. So bleibt der Name aktuell, wenn er in ENLYZE umbenannt wird.

Erstelle ein **Stat**-Panel mit diesen Einstellungen:

| Einstellung   | Wert                   |
| ------------- | ---------------------- |
| URL           | `machines/${machine1}` |
| Root selector | *(leer)*               |

Unter **Value options** > **Fields** wähle `name` aus dem Dropdown. So zeigt das Panel nur den Maschinennamen an.

<figure><img src="https://3556205377-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fn6Jn6Re8NNPSKD1jGZyL%2Fuploads%2Fgit-blob-2bbc2ecaf8260512e64d7154ee9e9075e6ac7bc9%2Fgrafana-status-machine-name-01.png?alt=media" alt=""><figcaption><p>Stat-Panel mit API-Query für den Maschinennamen</p></figcaption></figure>

Das Pattern kennst du aus [Variablen](https://docs.enlyze.com/integrations/grafana/advanced-api/03-variables): Die API gibt ein JSON-Objekt mit allen Feldern der Maschine zurück. Über den Field-Selektor zeigt das Panel nur das `name`-Feld an.

Konfiguriere das Panel:

* **Color mode**: None
* **Text mode**: Value
* **Transparent**: Aktivieren (für ein sauberes Layout ohne Panel-Rahmen)

***

## Laufenden Auftrag erkennen

Der `production-runs`-Endpoint gibt Aufträge nach Startzeit sortiert zurück. Der neueste Auftrag steht an Position `[0]`. Hat er keinen `end`-Zeitpunkt, läuft er noch.

### Status-Indikator

Erstelle ein **Stat**-Panel:

| Einstellung   | Wert                                                                      |
| ------------- | ------------------------------------------------------------------------- |
| URL           | `production-runs`                                                         |
| Query Params  | `machine=${machine1}`, `start=${__from:date:iso}`, `end=${__to:date:iso}` |
| Root selector | `$.data[0].end = null ? "Running" : "Completed"`                          |

Der Root Selector ist ein JSONata-Ausdruck: Wenn `end` des neuesten Auftrags `null` ist, gibt er "Running" zurück, sonst "Completed".

Unter **Value Mappings** zwei Einträge erstellen:

| Wert      | Anzeige   | Farbe |
| --------- | --------- | ----- |
| Running   | Running   | Grün  |
| Completed | Completed | Blau  |

Setze **Color mode** auf **Background**.

### Laufender Auftrag

Erstelle ein zweites **Stat**-Panel für die Auftragsnummer:

| Einstellung   | Wert                                                                      |
| ------------- | ------------------------------------------------------------------------- |
| URL           | `production-runs`                                                         |
| Query Params  | `machine=${machine1}`, `start=${__from:date:iso}`, `end=${__to:date:iso}` |
| Root selector | `$.data[0].production_order`                                              |

<figure><img src="https://3556205377-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fn6Jn6Re8NNPSKD1jGZyL%2Fuploads%2Fgit-blob-e62678ebed503c8522736f86960dbc2cc6a4c3ce%2Fgrafana-status-run-indicator-01.png?alt=media" alt=""><figcaption><p>Status-Indikator und laufender Auftrag</p></figcaption></figure>

***

## OEE des letzten Auftrags

Der `production-runs`-Endpoint liefert OEE-Kennzahlen pro Auftrag mit. Erstelle vier **Stat**-Panels für OEE, Availability, Performance und Quality.

### OEE-Panel

| Einstellung   | Wert                                                                      |
| ------------- | ------------------------------------------------------------------------- |
| URL           | `production-runs`                                                         |
| Query Params  | `machine=${machine1}`, `start=${__from:date:iso}`, `end=${__to:date:iso}` |
| Root selector | `$.data`                                                                  |

Klappe **Parsing options & Result fields** auf und füge eine **Column** hinzu:

| Selector             | Title        | Type   |
| -------------------- | ------------ | ------ |
| `productivity.score` | Productivity | Number |

Konfiguriere das Panel:

* **Unit**: Percent (0.0-1.0)
* **Color mode**: Background
* **Thresholds**: Rot (Basis), Gelb (0.6), Grün (0.8)
* **Value Mapping**: `null` → "NO DATA" (Grau)

### Warum Columns statt Root Selector?

Es wäre naheliegend, den Score direkt im Root Selector zu extrahieren, z.B. `$.data[0].productivity.score`. Das funktioniert, solange die API Daten zurückliefert. Läuft eine Maschine im gewählten Zeitraum jedoch nicht, ist `$.data` ein leeres Array. Der Zugriff auf `[0]` schlägt dann fehl und Grafana zeigt einen Fehler statt eines leeren Panels.

Die Lösung: Setze den Root Selector auf `$.data` und extrahiere den Wert über eine **Column** (`productivity.score`). Gibt es keine Daten, liefert die Column `null` zurück. Diesen `null`-Wert kannst du dann mit einem **Value Mapping** als "NO DATA" anzeigen.

### Weitere OEE-Panels

Erstelle nach dem gleichen Muster Panels für:

| Panel        | Root selector | Column Selector      |
| ------------ | ------------- | -------------------- |
| Availability | `$.data`      | `availability.score` |
| Performance  | `$.data`      | `performance.score`  |
| Quality      | `$.data`      | `quality.score`      |

Konfiguriere für alle Panels ein Value Mapping für `null` → "NO DATA" in Grau. Nicht alle Maschinen liefern Qualitätsdaten, und Maschinen ohne Produktion im gewählten Zeitraum zeigen für alle Kennzahlen "NO DATA".

<figure><img src="https://3556205377-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fn6Jn6Re8NNPSKD1jGZyL%2Fuploads%2Fgit-blob-7107c838bdb8aaf51a49ee227624210e514ca966%2Fgrafana-status-oee-row-01.png?alt=media" alt=""><figcaption><p>OEE-Kennzahlen des letzten Auftrags</p></figcaption></figure>

***

## Auftragsdetails-Tabelle

Zeige die letzten Aufträge mit OEE-Details als Tabelle.

Erstelle ein **Table**-Panel:

| Einstellung   | Wert                                                                      |
| ------------- | ------------------------------------------------------------------------- |
| URL           | `production-runs`                                                         |
| Query Params  | `machine=${machine1}`, `start=${__from:date:iso}`, `end=${__to:date:iso}` |
| Root selector | `$.data`                                                                  |

Füge unter **Parsing options & Result fields** Columns hinzu:

| Selector               | Title | Type      |
| ---------------------- | ----- | --------- |
| `production_order`     | Order | String    |
| `start`                | Start | Timestamp |
| `productivity.score`   | OEE   | Number    |
| `quantity_yield.value` | Yield | Number    |

Konfiguriere einen **Field Override** für die OEE-Spalte:

* **Unit**: Percent (0.0-1.0)
* **Min**: 0, **Max**: 1
* **Cell type**: Gauge (basic)
* **Color scheme**: Continuous - RdYlGr

<figure><img src="https://3556205377-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fn6Jn6Re8NNPSKD1jGZyL%2Fuploads%2Fgit-blob-fd494b7d4c8f5cb2418116338a6df32b2f23abe9%2Fgrafana-status-runs-table-01.png?alt=media" alt=""><figcaption><p>Production Runs Tabelle mit OEE als Gauge-Zelle</p></figcaption></figure>

***

## Zweite Maschine hinzufügen

Dupliziere alle Panels der ersten Maschine und ersetze `${machine1}` durch `${machine2}` in jeder Query. Positioniere die Panels nebeneinander: Linke Seite (x=0, Breite 12) für Machine 1, rechte Seite (x=12, Breite 12) für Machine 2.

{% hint style="info" %}
Für Dashboards mit vielen Maschinen ist das manuelle Duplizieren unpraktisch. Nutze stattdessen das Repeat-Pattern aus [Fortgeschrittene Variablen](https://docs.enlyze.com/integrations/grafana/advanced-api/03b-advanced-variables), um Panels automatisch für jede Maschine zu wiederholen.
{% endhint %}

***

## Tipps

* **Auto-Refresh**: Für Shopfloor-Displays ein Aktualisierungsintervall von 30 Sekunden bis 1 Minute einstellen (oben rechts neben der Zeitauswahl).
* **Laufende Aufträge**: Die API gibt Aufträge nach Startzeit sortiert zurück. `$.data[0]` ist immer der neueste Auftrag im gewählten Zeitraum.
* **Weitere Maschinen**: Für jede zusätzliche Maschine eine Konstante hinzufügen und die Panels duplizieren. Ab drei oder mehr Maschinen lohnt sich das Repeat-Pattern aus [Fortgeschrittene Variablen](https://docs.enlyze.com/integrations/grafana/advanced-api/03b-advanced-variables).

***

## Nächste Schritte

* [**OEE-Dashboard**](https://docs.enlyze.com/integrations/grafana/production-dashboards/05-oee-dashboard) — Aggregierte OEE-Berichte mit dem `productivity-metrics`-Endpoint erstellen
