# Eine Notfallmeldung an einem Standort zeigen

Am Ende legt ein Befehl eine vorbereitete Szene bis zu einer festen Uhrzeit auf alle Displays eines Standorts, und ein zweiter beendet sie vorzeitig. Das hilft bei einer kurzfristigen Schließung, einem Wasserschaden oder einer Räumung, wenn keine Zeit bleibt, sich durchs Portal zu klicken.

> **Typ:** anleitung
> **Für wen:** Entwicklerinnen und Entwickler, die Alarm- oder Haustechnik anbinden oder ihrem Team einen Notfallknopf bauen
> **Voraussetzung:** ein Schlüssel `ak_…` der Klasse **Individuell** mit `location.list`, `fleet.player.list` und `schedule.update`, und eine veröffentlichte Szene mit der Meldung
> **Ort:** Kommandozeile

## So funktioniert es

Eine Übersteuerung liegt über jedem Programm und endet zur angegebenen Zeit. Sie gilt immer für ein einzelnes Display. Das Skript liest deshalb die Displays des Standorts Seite für Seite und setzt die Übersteuerung auf jedem. Das Programm jedes Displays bleibt, wie es ist, und übernimmt wieder, sobald die Übersteuerung endet.

Spielen alle Displays des Standorts dasselbe Programm, erreicht ein einmaliger Programmpunkt alle mit einem Aufruf, siehe [Eine Kampagne aus dem eigenen System einplanen](/de/recipes/schedule-campaign). Im Notfall ist die Übersteuerung der schnellere Weg, weil sie die Programme nicht kennen muss.

## Schritte

1. **Bereiten Sie die Szene vor** und veröffentlichen Sie sie im Portal, etwa eine rote Seite mit „Heute geschlossen“ und einer Telefonnummer. Öffnen Sie sie: Die Adresse endet mit ihrer Kennung `scn_…`. Bereiten Sie sie vor, bevor Sie sie brauchen.

2. **Suchen Sie die Standort-Kennung** mit `GET /v1/locations`:

   ```bash
   curl -sS "$SZENERA_API/v1/locations" \
     -H "Authorization: Bearer $SZENERA_API_KEY" \
     | jq -r '.locations[] | "\(.id)  \(.name)  \(.playerCount) displays"'
   ```

3. **Speichern Sie das Skript.** Es nimmt Standort, Szene und Endzeit und schreibt für jedes Display den Antwortcode aus:

   ```bash
   #!/usr/bin/env bash
   # emergency.sh <loc_…> <scn_…> <Ende, etwa 2026-10-26T18:00:00+01:00>
   set -euo pipefail
   location="$1" scene="$2" until="$3"
   auth="Authorization: Bearer $SZENERA_API_KEY"
   body=$(jq -nc --arg scene "$scene" --arg until "$until" \
     '{content: {kind: "scene", sceneId: $scene}, until: $until}')

   cursor=""
   while :; do
     page=$(curl -sS -G "$SZENERA_API/v1/players" -H "$auth" \
       --data-urlencode "locationId=$location" --data-urlencode "limit=100" \
       ${cursor:+--data-urlencode "cursor=$cursor"})
     for id in $(jq -r '.items[].id' <<<"$page"); do
       curl -sS -o /dev/null -w "$id %{http_code}\n" -X PUT \
         "$SZENERA_API/v1/players/$id/override" \
         -H "$auth" -H "Content-Type: application/json" -d "$body"
     done
     cursor=$(jq -r '.nextCursor // empty' <<<"$page")
     [ -z "$cursor" ] && break
   done
   ```

4. **Starten Sie es.** Die Endzeit trägt ihren Versatz zur UTC und meint damit überall denselben Moment:

   ```bash
   ./emergency.sh loc_01KFB7QPW0LOCATION00000001 scn_01KJPX8NH0SZENE00000000009 2026-10-26T18:00:00+01:00
   ```

   ```text
   ply_01KFB7QPW0PLAYER0000000001 200
   ply_01KFB7QPW0PLAYER0000000002 200
   ```

5. **Beenden Sie es vorzeitig** mit derselben Schleife und `DELETE` statt `PUT`, ohne Rumpf. Jedes Display kehrt sofort zu seinem Programm zurück:

   ```bash
   curl -sS -X DELETE "$SZENERA_API/v1/players/ply_01KFB7QPW0PLAYER0000000001/override" \
     -H "Authorization: Bearer $SZENERA_API_KEY"
   ```

Ein einzelnes Display geht auch über die Kommandozeile: `szenera player set-override <ply_…> --content=scene:<scn_…> --until=…` und `szenera player clear-override <ply_…>`.

## Ergebnis prüfen

- Jede Zeile der Ausgabe endet auf `200`.
- `GET /v1/players/{id}/program` zeigt die Übersteuerung unter `override`, mit `until` und der Szene.
- Im Portal zeigen die Displays des Standorts die Übersteuerung bis zur Endzeit.

## Wenn etwas nicht klappt

| Symptom | Bedeutung | Lösung |
|---|---|---|
| Die Ausgabe bleibt leer | Dem Standort ist kein Display zugeordnet, oder die Kennung stimmt nicht. | `playerCount` in `GET /v1/locations` prüfen. |
| `422` für jedes Display | Die Endzeit liegt in der Vergangenheit oder hat keinen Versatz. | Eine künftige Zeit mit Versatz angeben, etwa `+01:00`. |
| `422 Scene.Blocked` | Die Szene nutzt eine App, die Ihr Paket nicht mehr abdeckt. | Die App aus der Szene nehmen oder eine Szene ohne sie verwenden. |
| `422 Schedule.ContentNotFound` | Die Szenen-Kennung gibt es nicht. | Die Kennung in der Portal-Adresse prüfen. |
| `429 RateLimit.Exceeded` | Der Schlüssel hat seine Anfragen für das Zeitfenster aufgebraucht. | `Retry-After` abwarten und das Skript erneut starten. Dieselbe Übersteuerung zweimal zu setzen schadet nicht. |

## Weiterführendes

- [Befehle für Ihre Organisation](/de/cli/commands-organization)
- [Blättern: limit, cursor, items, nextCursor](/de/api/pagination)
- [Drosselung und Rate-Limit-Kopfzeilen](/de/api/rate-limits)
