Von der Tabelle zu den Bildschirmen
- Mit der Vorlage beginnen. Speichern Sie die Vorlage als CSV oder XLSX oder verwenden Sie Ihre eigene Tabelle mit denselben Spalten.
- Eine Zeile je Zeitplanzeile ausfüllen. Nennen Sie den Bildschirm (oder einen Ordner oder ein Tag), die Datei, den Beginn und das Ende.
- Importieren. Legen Sie die Datei im Import-Dialog auf dem Tab Zeitplan des Dashboards ab oder führen Sie
screenrig schedule import FILEaus. - 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.
- Vorschau prüfen. Sie listet die Ebenen auf, die die Tabelle anlegt, die, die sie ändert oder entfernt, und den Kalender der betroffenen Bildschirme.
- 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.
| Spalte | Auch gelesen als | Was sie enthält |
|---|---|---|
target | screen, screen code, code, room, room id, screen name, screen id | Die Bildschirme, die die Zeile plant. Erforderlich |
content | file, file name, media, asset, playlist | Was abgespielt wird. Erforderlich |
start | start date, from, begin | Wann die Zeile beginnt |
end | end date, until, stop | Wann die Zeile endet |
timezone | time zone, tz | Die Zone, in der die Zeiten der Zeile geschrieben sind |
days | weekdays, day | Die Wochentage, an denen die Zeile spielt |
daily start | window start, time from | Die Uhrzeit, zu der jedes Abspielfenster öffnet |
daily end | window end, time to | Die Uhrzeit, zu der jedes Abspielfenster schließt |
priority | 0 bis 100. Die höhere Zahl wird vor der niedrigeren abgespielt. Standard 0 | |
name | level, label | Ein Name für die Ebene, die die Zeile erzeugt |
display | displays, output | Die 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.jpgauf dem Bildschirm mit dem CodeLOBBY-01von 18 Uhr am 5. November bis 2 Uhr am 8. November, Pacific-Zeit. - Zeile 3 spielt
happy-hour.mp4auf jedem Bildschirm im OrdnerCasino Floorund 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 loopauf jedem Bildschirm mit dem Tagelevators, 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-fieldodercode_fieldbeschränkt die Übereinstimmung auf ein Feld, etwacodeoderroom_id. - Ein Ordner.
folder:NAMEoderfolder:Parent/Child. Er erreicht den Ordner und jeden Ordner darin. - Ein Tag.
tag:NAMEerreicht 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:NAMEoder 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 PMund Datumszellen der Tabellenkalkulation werden gelesen. Eine Zeit mit einem Offset wieZoder+02:00wird 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 dastimezoneder 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ässttimezoneleer und liest die eigene Uhr jedes Bildschirms. - Ein Datum allein als Ende schließt diesen Tag:
2026-11-30endet 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,weekendsoderdaily. Eine Zeile mitdaysund ohne Tagesfenster spielt an diesen Tagen ganztägig. - Ein Tagesfenster.
daily startunddaily endgeben die Uhrzeiten jedes Tages an, etwa16:00und19:00oder4:00 PMund7: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. Ohnedaysgilt 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.
| Code | Spalte | Bedeutung und Behebung |
|---|---|---|
required | target, content, daily start, daily end | Die Zelle ist leer, oder nur eine der Zellen des Tagesfensters ist ausgefüllt. Füllen Sie sie aus |
unknown_screen | target | Kein Bildschirm hat diese ID, diesen Feldwert oder diesen Namen. Prüfen Sie den Code oder das Feld, das code_field nennt |
ambiguous_screen | target | Der Wert stimmt mit mehreren Bildschirmen überein. Verwenden Sie die Bildschirm-ID oder einen eindeutigen Code |
unknown_folder | target | Kein Bildschirmordner hat diesen Namen. Prüfen Sie die Schreibweise |
ambiguous_folder | target | Mehrere Ordner haben diesen Namen. Schreiben Sie den Pfad, etwa folder:Hotel/Casino Floor |
unknown_tag | target | Kein Bildschirm hat das Tag. Prüfen Sie die Schreibweise |
unknown_file | content | Keine Datei und keine Playlist hat diesen Namen. Laden Sie die Datei hoch oder korrigieren Sie den Namen |
ambiguous_file | content | Mehrere Dateien haben diesen Namen. Benennen Sie eine um oder schreiben Sie playlist:NAME |
not_playable | content | Die 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_time | start, end, daily start, daily end | Die Zelle ist kein Datum mit Uhrzeit, oder sie enthält einen Zonen-Offset. Schreiben Sie 2026-11-05 18:00 |
reversed_times | end | Das Ende liegt nicht nach dem Beginn. Korrigieren Sie eines von beiden |
past_end | end | Das Ende liegt in der Vergangenheit. Verschieben Sie es nach hinten oder entfernen Sie die Zeile |
no_timing | start | Die Zeile sagt nichts darüber, wann. Geben Sie einen Beginn, ein Ende, Tage oder ein Tagesfenster an |
invalid_value | days, priority, display | Die Zelle ist keine Liste von Tagen wie Mon-Fri, keine ganze Zahl von 0 bis 100 und keine Display-Nummern wie 1,2 |
timezone | timezone | Die 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_ready | target | Ein Bildschirm hat keine Zeitzone oder keine Standard-Playlist. Führen Sie screen set-timezone oder screen assign aus |
overlap | priority | Zwei Zeilen gelten auf einem Bildschirm gleichzeitig mit derselben Priorität. Geben Sie einer eine andere Priorität oder verschieben Sie eine Zeit |
limit | target | Ein 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.
| Option | Bedeutung |
|---|---|
--name NAME | Der Name des Imports, 1 bis 80 Zeichen. Standard ist der Dateiname ohne Erweiterung |
--timezone ZONE | Die Zone, in der die Zeiten geschrieben sind, wenn eine Zeile kein timezone hat |
--code-field FIELD | Einen Bildschirmcode nur aus diesem Bildschirmfeld lesen |
--commit | Tabelle anwenden |
--format csv|xlsx | schedule template: das Format der Vorlage |
--output FILE | schedule 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:
| Problem | Status | Bedeutung und Behebung |
|---|---|---|
schedule_import_invalid | 422 | Zeilen haben Fehler. Korrigieren Sie sie und rufen Sie die Vorschau erneut auf |
schedule_import_stale | 409 | Bildschirme, 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.