Dokumentation

Bildschirme per Tabelle planen

Ein Veranstaltungsort führt seinen Zeitplan in einer Tabelle: ein Bildschirmcode, ein Dateiname, ein Beginn und ein Ende in jeder Zeile. Importieren Sie die Tabelle, und screenRIG prüft jede Zeile gegen Ihre Bildschirme und Medien, nennt jedes Problem nach Zeile und Spalte, zeigt in der Vorschau den Kalender, dem Ihre Bildschirme folgen würden, und wendet alles an oder nichts.

Von der Tabelle zu den Bildschirmen

  1. Mit der Vorlage beginnen. Speichern Sie die Vorlage als CSV oder XLSX oder verwenden Sie Ihre eigene Tabelle mit denselben Spalten.
  2. Eine Zeile je Zeitplanzeile ausfüllen. Nennen Sie den Bildschirm (oder einen Ordner oder ein Tag), die Datei, den Beginn und das Ende.
  3. Importieren. Legen Sie die Datei im Import-Dialog auf dem Tab Zeitplan des Dashboards ab oder führen Sie screenrig schedule import FILE aus.
  4. Zeilen mit Fehlern korrigieren. Jeder Fehler nennt die Zeile, die Spalte und einen Code. Bearbeiten Sie die Zelle im Dialog oder bearbeiten Sie die Tabelle und importieren Sie sie erneut.
  5. Vorschau prüfen. Sie listet die Ebenen auf, die die Tabelle anlegt, die, die sie ändert oder entfernt, und den Kalender der betroffenen Bildschirme.
  6. Veröffentlichen. Alle Zeilen werden zusammen angewendet oder keine.

Die Schritte 1 bis 5 schreiben nichts. Ein Bildschirm benötigt eine Zeitzone (screen set-timezone) und eine Standard-Playlist (screen assign), bevor eine Zeile ihn planen kann, und eine Datei muss ein genehmigtes Bild oder Video sein.

Die Tabelle

Die erste Zeile benennt die Spalten. Jede weitere Zeile ist eine Zeitplanzeile. Leere Zeilen werden übersprungen. Eine Tabelle ist eine CSV-Datei (UTF-8, durch Komma oder Semikolon getrennt) oder eine XLSX-Arbeitsmappe, und eine XLSX-Arbeitsmappe wird aus ihrem ersten Blatt gelesen.

SpalteAuch gelesen alsWas sie enthält
targetscreen, screen code, code, room, room id, screen name, screen idDie Bildschirme, die die Zeile plant. Erforderlich
contentfile, file name, media, asset, playlistWas abgespielt wird. Erforderlich
startstart date, from, beginWann die Zeile beginnt
endend date, until, stopWann die Zeile endet
timezonetime zone, tzDie Zone, in der die Zeiten der Zeile geschrieben sind
daysweekdays, dayDie Wochentage, an denen die Zeile spielt
daily startwindow start, time fromDie Uhrzeit, zu der jedes Abspielfenster öffnet
daily endwindow end, time toDie Uhrzeit, zu der jedes Abspielfenster schließt
priority0 bis 100. Die höhere Zahl wird vor der niedrigeren abgespielt. Standard 0
namelevel, labelEin Name für die Ebene, die die Zeile erzeugt
displaydisplays, outputDie Videowand-Ausgänge, auf denen die Zeile spielt, etwa 1 oder 1,2

Kopfzeilen stimmen unabhängig von Groß- und Kleinschreibung, Leerzeichen und Satzzeichen überein. Eine Spalte, die nichts liest, wird ignoriert, und die Vorschau listet sie auf. Eine Zeile braucht ein target, ein content und mindestens eines von start, end, days oder ein Tagesfenster.

Screen,File,Start,End,Timezone,Days,Daily start,Daily end,Priority,Name
LOBBY-01,welcome-spring.jpg,2026-11-05 18:00,2026-11-08 02:00,America/Los_Angeles,,,,0,
folder:Casino Floor,happy-hour.mp4,2026-11-05,2026-11-30,,Mon-Fri,16:00,19:00,5,Happy hour
tag:elevators,playlist:Holiday loop,2026-12-01 09:00,2026-12-26,,,,,0,
  • Zeile 2 spielt welcome-spring.jpg auf dem Bildschirm mit dem Code LOBBY-01 von 18 Uhr am 5. November bis 2 Uhr am 8. November, Pacific-Zeit.
  • Zeile 3 spielt happy-hour.mp4 auf jedem Bildschirm im Ordner Casino Floor und in den Ordnern darin, werktags von 16 bis 19 Uhr, vom 5. November bis zum Ende des 30. November.
  • Zeile 4 spielt die Playlist Holiday loop auf jedem Bildschirm mit dem Tag elevators, von 9 Uhr am 1. Dezember bis zum Ende des 25. Dezember.

Ziele

Ein Ziel ist eines der folgenden:

  • Ein Bildschirm. Eine Bildschirm-ID, der Wert eines beliebigen Felds des Bildschirms (ein Raumcode, eine Filialnummer) oder der Name des Bildschirms. --code-field oder code_field beschränkt die Übereinstimmung auf ein Feld, etwa code oder room_id.
  • Ein Ordner. folder:NAME oder folder:Parent/Child. Er erreicht den Ordner und jeden Ordner darin.
  • Ein Tag. tag:NAME erreicht jeden Bildschirm mit dem Tag.

Mehrere Ziele in einer Zelle werden durch ; oder | getrennt, wie in LOBBY-01;LOBBY-02|tag:elevators.

Inhalt

  • Eine Datei. Der Name einer Mediendatei im Projekt oder der ursprüngliche Dateiname eines konvertierten Uploads. Die Datei wird im Vollbild abgespielt. Der erste Commit, der eine Datei verwendet, erstellt die Ein-Datei-Playlist Scheduled: FILE, spätere Importe verwenden sie wieder.
  • Eine Playlist. playlist:NAME oder eine Playlist-ID. Die Playlist hat eine genehmigte Version und ist keine Vorlage.

Zeiten

  • Daten und Zeiten. 2026-11-05 18:00, 2026-11-05T18:00, 11/5/2026 6:00 PM und Datumszellen der Tabellenkalkulation werden gelesen. Eine Zeit mit einem Offset wie Z oder +02:00 wird abgelehnt.
  • Die eigene Uhr jedes Bildschirms. Zeiten werden auf der Uhr der Bildschirme gelesen, die die Zeile erreicht, sodass 18:00 überall 18 Uhr ist, wo der Bildschirm steht.
  • Eine andere Zone. Eine timezone-Zelle (oder das timezone der Anfrage) legt fest, dass die Zeile in dieser Zone geschrieben ist. Die Zeiten werden in die Zone der Bildschirme umgerechnet, wenn alle Bildschirme der Zeile dieselbe Zone haben. Eine Zeile, die Bildschirme in mehreren Zonen erreicht, lässt timezone leer und liest die eigene Uhr jedes Bildschirms.
  • Ein Datum allein als Ende schließt diesen Tag: 2026-11-30 endet am Ende des 30. November. Ein Datum allein als Beginn startet um Mitternacht.
  • Kein Ende lässt die Zeile weiterspielen, bis ein späterer Import sie entfernt. Die Vorschau warnt mit open_end.
  • Tage. Mon-Fri, Mon,Wed,Fri, Sat,Sun, weekdays, weekends oder daily. Eine Zeile mit days und ohne Tagesfenster spielt an diesen Tagen ganztägig.
  • Ein Tagesfenster. daily start und daily end geben die Uhrzeiten jedes Tages an, etwa 16:00 und 19:00 oder 4:00 PM und 7:00 PM. Geben Sie beide an. Ein Ende zum oder vor dem Beginn überschreitet Mitternacht und gehört zu dem Tag, an dem es beginnt. Ohne days gilt das Fenster jeden Tag.

Vorschau und Fehler

Die Vorschau prüft jede Zeile und jede Zelle, bevor etwas geschrieben wird. Eine Zeile mit einem Fehler wird mit ihren Zellen angezeigt, und jeder Fehler nennt die Spalte, einen Code und was zu ändern ist.

CodeSpalteBedeutung und Behebung
requiredtarget, content, daily start, daily endDie Zelle ist leer, oder nur eine der Zellen des Tagesfensters ist ausgefüllt. Füllen Sie sie aus
unknown_screentargetKein Bildschirm hat diese ID, diesen Feldwert oder diesen Namen. Prüfen Sie den Code oder das Feld, das code_field nennt
ambiguous_screentargetDer Wert stimmt mit mehreren Bildschirmen überein. Verwenden Sie die Bildschirm-ID oder einen eindeutigen Code
unknown_foldertargetKein Bildschirmordner hat diesen Namen. Prüfen Sie die Schreibweise
ambiguous_foldertargetMehrere Ordner haben diesen Namen. Schreiben Sie den Pfad, etwa folder:Hotel/Casino Floor
unknown_tagtargetKein Bildschirm hat das Tag. Prüfen Sie die Schreibweise
unknown_filecontentKeine Datei und keine Playlist hat diesen Namen. Laden Sie die Datei hoch oder korrigieren Sie den Namen
ambiguous_filecontentMehrere Dateien haben diesen Namen. Benennen Sie eine um oder schreiben Sie playlist:NAME
not_playablecontentDie Datei ist kein Bild oder Video, das Medium wartet auf die Prüfung, oder die Playlist ist eine Vorlage oder hat keine genehmigte Version. Genehmigen Sie sie oder wählen Sie eine andere
invalid_timestart, end, daily start, daily endDie Zelle ist kein Datum mit Uhrzeit, oder sie enthält einen Zonen-Offset. Schreiben Sie 2026-11-05 18:00
reversed_timesendDas Ende liegt nicht nach dem Beginn. Korrigieren Sie eines von beiden
past_endendDas Ende liegt in der Vergangenheit. Verschieben Sie es nach hinten oder entfernen Sie die Zeile
no_timingstartDie Zeile sagt nichts darüber, wann. Geben Sie einen Beginn, ein Ende, Tage oder ein Tagesfenster an
invalid_valuedays, priority, displayDie Zelle ist keine Liste von Tagen wie Mon-Fri, keine ganze Zahl von 0 bis 100 und keine Display-Nummern wie 1,2
timezonetimezoneDie Zone ist unbekannt, oder das Ziel enthält Bildschirme in mehreren Zonen. Verwenden Sie eine Zone wie America/Los_Angeles oder lassen Sie sie leer
screen_not_readytargetEin Bildschirm hat keine Zeitzone oder keine Standard-Playlist. Führen Sie screen set-timezone oder screen assign aus
overlappriorityZwei Zeilen gelten auf einem Bildschirm gleichzeitig mit derselben Priorität. Geben Sie einer eine andere Priorität oder verschieben Sie eine Zeit
limittargetEin Bildschirm hätte mehr als 32 eigene Ebenen oder die Organisation mehr als 100 Kampagnen (jede gemeinsame Ebene ist eine). Fassen Sie Zeilen zusammen oder zielen Sie auf einen Ordner oder ein Tag

Zwei Warnungen stoppen einen Import nicht. open_end kennzeichnet eine Zeile ohne Ende. outranked kennzeichnet eine Zeile, über die auf einem Bildschirm eine gemeinsame Ebene (eine Zeile für mehrere Bildschirme, einen Ordner oder ein Tag) spielt.

Eine Tabelle ohne Zeilen, eine Datei, die nicht UTF-8 ist, mehr als 5,000 Zeilen, eine Datei über 8 MiB oder ein Commit, der die eigenen Zeitpläne von mehr als 400 Bildschirmen schreiben würde, wird mit Angabe des Grundes abgelehnt.

Ebenen

Zeilen, die in Inhalt, Zeiten, Priorität, Name und Display übereinstimmen, werden zu einer Ebene. Das Ziel ist nicht Teil des Vergleichs, sodass zehn Zeilen, die dieselbe Datei zu denselben Zeiten auf zehn Bildschirmen abspielen, eine Ebene ergeben.

  • Ein Bildschirm erzeugt einen Eintrag im eigenen Zeitplan dieses Bildschirms.
  • Mehrere Bildschirme, ein Ordner oder ein Tag erzeugen eine gemeinsame Ebene, eine Kampagne über diese Zielgruppe. Eine gemeinsame Ebene hat Vorrang vor den eigenen Ebenen eines Bildschirms.

Die Gruppierung macht aus den 200 Bildschirmen eines Veranstaltungsorts eine Kampagne statt 200 Einträge, und eine Korrektur in der Tabelle ändert eine Ebene. Die Spalte name benennt eine gemeinsame Ebene. Ohne sie heißt die Ebene nach dem Import, dem Inhalt und dem Ziel, wie in Spring promos: happy-hour.mp4 on Casino Floor.

Erneut importieren

Der name eines Imports kennzeichnet ihn, und der Standard ist import. Wird unter demselben Namen erneut importiert:

  • aktualisiert die von ihm angelegten Ebenen, auch wenn sich die Daten einer Zeile geändert haben;
  • legt die Ebenen neuer Zeilen an;
  • entfernt die Ebenen, deren Zeilen in der Tabelle fehlen;
  • ändert nichts, wenn die Tabelle gleich ist.

Von einem Import angelegte Ebenen tragen ihn in ihrer ID (die Einträge eines Bildschirms beginnen mit imp_), und Kampagnen tragen eine import-Markierung. Von Hand angelegte Ebenen werden nie angetastet. Verwenden Sie einen Namen für eine Tabelle und einen anderen Namen für eine andere.

Import ausführen

Dashboard

Öffnen Sie den Tab Zeitplan eines Projekts und wählen Sie Import. Legen Sie eine CSV- oder XLSX-Datei ab. Der Dialog zeigt eine Tabelle der Zeilen mit jedem Fehler neben seiner Zelle, und Sie bearbeiten die Zelle direkt. Danach zeigt er den zusammengesetzten Kalender der Bildschirme, die der Import ändert. Veröffentlichen führt den Commit aus.

Befehlszeile

screenrig schedule template --output schedule.csv
screenrig schedule import schedule.csv --name "Spring promos" --timezone America/Los_Angeles
screenrig schedule import schedule.csv --name "Spring promos" --timezone America/Los_Angeles --commit

schedule import zeigt die Vorschau und schreibt nichts. --commit wendet die Tabelle an, wenn jede Zeile gültig ist.

OptionBedeutung
--name NAMEDer Name des Imports, 1 bis 80 Zeichen. Standard ist der Dateiname ohne Erweiterung
--timezone ZONEDie Zone, in der die Zeiten geschrieben sind, wenn eine Zeile kein timezone hat
--code-field FIELDEinen Bildschirmcode nur aus diesem Bildschirmfeld lesen
--commitTabelle anwenden
--format csv|xlsxschedule template: das Format der Vorlage
--output FILEschedule template: wo sie gespeichert wird

Der Befehl endet mit 0 bei einer gültigen Tabelle, mit 8, wenn Zeilen Fehler haben (nichts wird geschrieben), und mit 5, wenn sich das Projekt seit der Vorschau geändert hat (führen Sie ihn erneut aus). FILE ist eine .csv-, .xlsx- oder .json-Datei oder - für die Standardeingabe. Eine JSON-Datei enthält ein Array von Zeilenobjekten oder {"rows": [...]}, mit Spaltennamen als Schlüsseln.

API

Senden Sie die Tabelle als JSON-Zeilen oder als CSV- oder XLSX-Body, wobei die Einstellungen als Query-Parameter übergeben werden. Die Vorschau erfordert Lesezugriff. Der Commit erfordert Zugangsdaten mit Schreibzugriff, die eine Person gewährt, die im Dashboard genehmigen kann.

curl -s https://api.screenrig.ai/api/schedule/imports/preview \
  --header "Authorization: Bearer $SCREENRIG_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "name": "Spring promos",
    "timezone": "America/Los_Angeles",
    "rows": [
      {"target": "LOBBY-01", "content": "welcome-spring.jpg", "start": "2026-11-05 18:00", "end": "2026-11-08 02:00"},
      {"target": "folder:Casino Floor", "content": "happy-hour.mp4", "start": "2026-11-05", "end": "2026-11-30",
       "days": "Mon-Fri", "daily_start": "16:00", "daily_end": "19:00", "priority": 5, "name": "Happy hour"}
    ]
  }'

Dieselbe Tabelle als Datei:

curl -s "https://api.screenrig.ai/api/schedule/imports/preview?name=Spring%20promos&timezone=America/Los_Angeles" \
  --header "Authorization: Bearer $SCREENRIG_TOKEN" \
  --header "Content-Type: text/csv" \
  --data-binary @schedule.csv

Die Antwort, gekürzt:

{
  "name": "Spring promos",
  "valid": false,
  "fingerprint": "FINGERPRINT",
  "columns": ["target", "content", "start", "end", "days", "daily_start", "daily_end", "priority", "name"],
  "summary": {"rows": 2, "rows_with_errors": 1, "levels": 1, "creates": 1, "updates": 0,
              "unchanged": 0, "removes": 0, "screens": 1, "playlists": 1},
  "rows": [
    {"row": 2, "status": "ok", "level": "LEVEL_KEY"},
    {"row": 3, "status": "error",
     "errors": [{"column": "content", "code": "unknown_file",
                 "message": "No file or playlist is named \"happy-hour.mp4\"."}]}
  ],
  "levels": [{"key": "LEVEL_KEY", "action": "create", "home": "screen", "screen_id": "scr_LOBBY",
              "content": {"kind": "file", "id": "med_WELCOME", "name": "welcome-spring.jpg"},
              "screens": 1, "priority": 0, "from": "2026-11-05T18:00", "until": "2026-11-08T02:00", "rows": [2]}],
  "removals": []
}

rows[].cells gibt die Zellen jeder Zeile so zurück, wie die Tabelle sie lieferte, damit ein Client sie korrigieren und die Zeilen erneut senden kann. valid ist true, wenn keine Zeile einen Fehler hat. calendar hat die Form von GET /api/schedule/calendar und zeigt die Bildschirme, die der Import ändert, so, wie sie nach einem Commit wären.

Der Commit sendet dieselbe Tabelle und den fingerprint ihrer Vorschau, als Feld des JSON-Bodys oder als Query-Parameter bei einer Datei. Senden Sie einen Idempotency-Key, um sicher zu wiederholen.

curl -s https://api.screenrig.ai/api/schedule/imports \
  --header "Authorization: Bearer $SCREENRIG_TOKEN" \
  --header "Idempotency-Key: spring-promos-1" \
  --header "Content-Type: application/json" \
  --data @commit.json

Die Antwort enthält preview und applied, die Zähler dessen, was angelegt, aktualisiert, unverändert gelassen und entfernt wurde, mit den geschriebenen Bildschirmen und den angelegten Playlists. Ein Commit wird abgelehnt und schreibt nichts, als:

ProblemStatusBedeutung und Behebung
schedule_import_invalid422Zeilen haben Fehler. Korrigieren Sie sie und rufen Sie die Vorschau erneut auf
schedule_import_stale409Bildschirme, Medien, Playlists oder Ebenen haben sich seit der Vorschau geändert, oder die Zeilen werden anders gelesen. Rufen Sie die Vorschau erneut auf und committen Sie mit dem neuen Fingerprint

GET /api/schedule/imports/template?format=csv und format=xlsx liefern die Vorlage.

Limits

  • 5,000 Zeilen und 8 MiB je Tabelle.
  • 32 eigene Ebenen je Bildschirm. Eine Organisation fasst bis zu 100 Kampagnen über alle ihre Projekte, und jede gemeinsame Ebene ist eine davon.
  • Pro Commit werden die eigenen Zeitpläne von 400 Bildschirmen geschrieben. Eine Zeile mit Ordner oder Tag erreicht beliebig viele Bildschirme.
  • Ein Importname hat 1 bis 80 Zeichen.