# 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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.enlyze.com/integrations/grafana/production-dashboards/04-production-status.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
