Dokumentation

CLI-Befehlsreferenz

Die screenRIG-CLI veröffentlicht Medien, Playlists und Anwendungen auf TVs und Kiosken über ein Terminal oder einen Agenten. Befehle, Parameter, JSON-Ausgabe und Revisionsregeln für die Veröffentlichung von Inhalten und den Betrieb von Bildschirmen finden.

Jeder Befehl läuft auf dieselbe Weise

screenrig [--json | --human] [--api-url URL] [--config PATH] [--request-id ID]
      [--project-id ID] [--idempotency-key KEY] [--timeout MS] [--beta-key KEY] <command> [args]

Globale Flags

MarkierenTypStandardNotizen
--jsonbooleanJSON für OperationenExplizite JSON-Ausgabe, aus Kompatibilitätsgründen beibehalten. Wählt auch strukturierte Hilfe aus. Kann nicht mit --human kombiniert werden.
--humanbooleanausWählen Sie eine menschenlesbare Betriebsanzeige. Kann nicht mit --json kombiniert werden.
--project-id IDstringzuletzt verwendetes ProjektDiese Aufruf auf ein zwischengespeichertes Projekt korrigieren, ohne die Auswahl zu ändern. Jeder Befehl behält sein Ziel und seinen Wiederherstellungszustand für die gesamte Ausführung.
--api-url URLstringhttps://api.screenrig.aiUrsprung der Steuerungsebene. SCREENRIG_API_URL setzt dasselbe.
--config PATHPfaddie BenutzerkonfigurationsdateiVerwenden Sie eine spezifische Konfigurationsdatei. SCREENRIG_CONFIG setzt dasselbe.
--request-id IDstringpro Lauf generiertIhre eigene Anforderungs-ID, zurückgegeben als request_id. Behalten Sie sie in Berichten bei.
--idempotency-key KEYstringpro Schreibvorgang abgeleitetDiesen Schlüssel wiederverwenden, um einen mehrdeutigen Schreibvorgang erneut zu versuchen. Der Server gibt das ursprüngliche Ergebnis für vierundzwanzig Stunden zurück; ein anderer Inhalt unter demselben Schlüssel ist idempotency_mismatch.
--timeout MSinteger30000 pro AnfrageBegrenzt jede HTTP-Anfrage. Bei einem Befehl, der auf eine Operation wartet, ist stattdessen die Wartefrist maßgeblich, standardmäßig 120000.
--beta-key KEYstringNicht festgelegtWird nur gesendet, wenn die Steuerungsebene eine anfordert. SCREENRIG_BETA_KEY setzt dasselbe.
--help, -hbooleanausDrucken Sie fokussierte Hilfe für den Befehl oder die Gruppe und beenden Sie. Fügen Sie --json für strukturierte Hilfe hinzu.
--version, -VbooleanausDrucken Sie die gebündelte CLI-Version und beenden Sie. Gleichbedeutend mit dem Befehl version.

Umgebung

VariableEffekt
SCREENRIG_API_URLUrsprung der Steuerungsebene, der die gespeicherte Konfiguration überschreibt.
SCREENRIG_CONFIGPfad zur Konfigurationsdatei.
XDG_CONFIG_HOMEBasis des Konfigurationsverzeichnisses. Sonst %APPDATA%\screenrig unter Windows oder ~/.config/screenrig.
SCREENRIG_BETA_KEYBeta-Schlüssel, wenn die Steuerungsebene einen anfordert.
SCREENRIG_FFMPEGAbsoluter Pfad zu ffmpeg, wenn media upload ihn nicht von PATH beziehen soll.
SCREENRIG_FFPROBEAbsoluter Pfad zu ffprobe.
SCREENRIG_CWEBPAbsoluter Pfad zu cwebp, dem Fallback-Still-Encoder.
SCREENRIG_CLIENT_IDFühren Sie es als diesen Service-Client (scl_…) aus, mit genau einem der nächsten beiden.
SCREENRIG_CLIENT_KEY_FILEDie private Schlüsseldatei des Service-Clients, ein JWK oder PEM, in eine private_key_jwt-Assertion signiert.
SCREENRIG_CLIENT_SECRETDas Geheimnis des Service-Clients, gesendet mit HTTP Basic.

Es gibt keine Token-Flag und keine Token-Umgebungsvariable. Die CLI liest die Sitzung, die das Plugin für diese Installation gespeichert hat, in einer benutzerprivaten Datei, die ein Plugin-Upgrade überdauert, und erneuert sie selbstständig. Mit SCREENRIG_CLIENT_ID angemeldet, meldet sie sich stattdessen als dieser Service-Client an, hält das Token im Speicher und liest oder schreibt die gespeicherte Konfiguration nie.

Ausgabe

Betriebsbefehle schreiben standardmäßig JSON auf stdout, einschließlich Fehler. Ein einzelnes Ergebnis enthält einen Umschlag: ok, dann data, request_id, operation_id und warnings[] bei Erfolg oder error bei Fehler. Fortschritt, sichere URLs und menschliche Notizen gehen an stderr. events follow gibt NDJSON aus: ein JSON-Umschlag pro Ereignis, jeweils in einer eigenen Zeile. Die Umleitung von stdout ändert das Format nicht.

Verwenden Sie --human zur manuellen Inspektion. Ereignisbefehle drucken dann eine logfmt-Zeile pro Ereignis. Hilfe und reine Befehlsgruppen bleiben standardmäßig lesbarer Text; verwenden Sie screenrig --json playlist --help für strukturierte Entdeckung. --json und --human können nicht kombiniert werden.

Ältere Plugin-Bundles benötigen möglicherweise explizit --json für Betriebsergebnisse. Prüfen Sie die Hilfe der installierten CLI bei der Arbeit mit einem älteren Bundle. Playlist-Autorendateien bleiben JSON-Dokumente; ein Befehlsresultatumschlag ist kein bearbeitbares Playlist-Dokument.

Ein Fehlerumschlag enthält error.status, ein stabiles error.code und oft error.next.command, die genau angeben, was als Nächstes ausgeführt werden soll. Verzweigen Sie danach statt nach Text.

Eine Änderung, die auf die Überprüfung durch eine Person wartet, ist ein Erfolg, kein Fehler: ok: true, Beenden 0, data.status: pending_review mit dem review, eine pending_review Warnung mit dem Namen der Überprüfungs-URL und data.next zeigt auf reviews show ID. Ein erneutes Taggen von genehmigten Medien unter Überprüfung ist ok, Beenden 0, mit der Warnung media_review_pending stattdessen: Die Überprüfung erscheint innerhalb weniger Sekunden in reviews list. Siehe Reviews.

Beendigungscodes

CodeBedeutung
0Erfolg.
1Unerwarteter Fehler.
2Nutzungsfehler. Es wurde nichts gesendet.
3Problem mit den Zugangsdaten. Diese Installation kann sich nicht authentifizieren.
4Nicht gefunden.
5Konflikt.
6Vorbedingung fehlgeschlagen, einschließlich revision_conflict: die --expect-rev-Revision war veraltet.
7Ratenbegrenzung. Beachten Sie Retry-After, angezeigt als retry_after_seconds.
8Andere clientseitige Ablehnung.
9Serverfehler.
10Netzwerkfehler.
11Zeitüberschreitung.
12Konfigurationsfehler.
13Der Vorgang selbst ist fehlgeschlagen.

Übliche Fehlercodes im Umschlag:

CodeBedeutungNächster Schritt
not_enrolledDiese Installation enthält noch keine Projektanmeldeinformationen.Erstellen Sie ein Projekt mit screenrig agent enroll --email ADDRESS --organization NAME oder melden Sie diese Installation mit screenrig login bei einem Projekt an, dem Sie angehören.
session_endedDie Anmeldung wurde widerrufen, ist abgelaufen oder beendet.screenrig login, genehmigt von einer Person im Dashboard.
insufficient_accessDas Zugriffslevel der Sitzung kann dies nicht: Nur Lesen ändert nichts, und Vorschlagen kann nicht löschen, Bildschirme steuern oder ausgeben.screenrig agent status zeigt effective_access. Wenn access_limited_by project oder person nennt, ändert der Projekteigentümer die Überprüfungseinstellung; sonst screenrig login --access manage, genehmigt von einer Person.
approver_requiredNur der Projektinhaber oder ein Mitglied, das genehmigen kann, darf dies tun, z. B. einem Agenten Manage geben.Bitten Sie den Projektinhaber, "Kann genehmigen" einzuschalten oder "Nur lesen" oder "Vorschlagen" zu wählen.
playlist_not_approvedDie Playlist hat noch keine genehmigte Version, daher kann sie von keinem Bildschirm angezeigt werden.Warten Sie auf die Überprüfung (screenrig reviews show ID) oder wählen Sie eine genehmigte Playlist.
review_not_pendingDie Überprüfung wurde bereits entschieden, zurückgezogen oder ersetzt.screenrig reviews show ID für seinen Status.
login_denied, login_expiredDie Person hat die Anmeldung verweigert oder ihr 24-Stunden-Code ist abgelaufen.Führen Sie screenrig login erneut aus.
client_auth_failedDer Schlüssel, das Secret oder die ID eines Service-Clients wurde abgelehnt.Gleichen Sie die Schlüssel- oder Geheimnisdatei, mit der sich die Konfiguration anmeldet (login --client-id ID --client-key-file FILE oder --client-secret-file FILE), mit screenrig service-client show ID ab.
capability_requiredDem Projekt fehlt die Fähigkeit, die dieser Befehl benötigt, wie z. B. screens oder advertiser.screenrig project capabilities, dann wählen Sie das passende --intent für ein neues Projekt oder ändern Sie den Zweck des Projekts.
rate_limitedZu viele Anfragen im aktuellen Zeitraum.Warten auf retry_after_seconds und dann erneut versuchen.
free_organization_limitDie Person besitzt bereits ihre kostenlose Standard-Organisation, daher kann project create keine weitere starten.Fügen Sie das Projekt der in den Details genannten Organisation hinzu: screenrig project create NAME --organization-id ID. Eine weitere Organisation benötigt Plus, Premium oder Enterprise über das Kontaktformular unter https://screenrig.ai/contact#message.
organization_plan_requiredDie Organisation nimmt keine neuen Bildschirme auf, bis ein Plan dafür bezahlt wird.Der Eigentümer verschiebt das Projekt mit screenrig project moves und screenrig project move --organization-id ID, oder die Organisation bucht Plus, Premium oder Enterprise über das Kontaktformular unter https://screenrig.ai/contact#message.

Revisionen und Wiederholungen

Revisionsschutz ist optional. Lassen Sie --expect-rev weg, um die aktuelle Ressource ohne vorheriges Revisionslesen zu schreiben. Geben Sie es mit einer bekannten revision an, um veraltete Schreibvorgänge abzulehnen. Bei revision_conflict Ressource erneut abrufen, Änderung erneut anwenden und mit der zurückgegebenen Revision erneut versuchen. Bei einem mehrdeutigen Transportfehler mit derselben --idempotency-key erneut versuchen; die Steuerungsebene gibt das ursprüngliche Ergebnis zurück, anstatt zweimal zu schreiben.

Guthaben

Die Steuerungsebene berechnet einen Credit je abgerechnetem authentifiziertem Befehl und einen je abgerechnetem Projekt-Stream-Ereignis. Diese Befehle der Steuerungsebene belasten ihn nicht und funktionieren auch bei null Credits weiter: project show, agent status, notes list, notes show, screen reload, screen toast und screen screenshot. Das Öffnen von events follow kostet einen Credit für das Abonnieren, und die erneute Wiedergabe nach einer Wiederverbindung ist kostenlos. Ein Flottenbefehl, screen assign, screen reload, screen toast oder screen tag mit mehreren Bildschirm-IDs oder --tag, ist eine abgerechnete Aktion ohne Begrenzung der Bildschirmanzahl, einschließlich aller Fortsetzungen, sodass ein Neuladen oder Toast für die ganze Flotte abgerechnet wird, obwohl es für einen einzelnen Bildschirm kostenlos ist. screen screenshot --tag folgt allen Listenseiten, jede abgerechnet, um die getaggten Bildschirme aufzulösen; die Aufnahmen selbst sind kostenlos. E-Mails von Benachrichtigungen und Bildschirmmeldungen sind kostenlos. Jeder Webhook-Zustellversuch eines Projekt-Ereignisses wird wie ein abgerechnetes Listen-Stream-Ereignis gemessen. Jede JSON-Seite von playback plays oder playback list ist eine abgerechnete Anfrage, und ein Playback-CSV-Export ist eine abgerechnete Anfrage für den gesamten Bereich.

Im Bundle enthaltene CLI-Oberfläche

Befehle sind so gruppiert, wie die CLI sie gruppiert. Installation und erste Verwendung sind in Start beschrieben; die Wahl zwischen Upload, Generierung, Karten und Selektoren in Compose.

Befehlsnamen und -erkennung

Verwenden Sie show zur Inspektion einer Ressource, list für Sammlungen und kv get / kv set für Werte. Verwenden Sie --name für Anzeigenamen, --screen-id, --app-id, --playlist-id und --release-id für Ressourcenselektoren, --expect-rev für Revisionsschutz und --after für Ereignis-Cursor. Die Gruppe ist app; „application“ ist der Ressourcenname. Kommentare behalten comment ACTION screen|playlist ID bei.

Verwenden Sie screenrig help --all für den vollständigen Bestand oder screenrig playlist init --help für fokussierte Hilfe. Fügen Sie --json für Argument-Metadaten, Auswahlmöglichkeiten, Standardwerte, Beispiele, Aliase und Optionsbeziehungen hinzu. exactlyOne, atLeastOne und together Gruppen werden vor Konfiguration oder Netzwerkzugriff geprüft; requires bedeutet, dass die erste Option alle verbleibenden Optionen erfordert. Lesen Sie stdin nur, wenn die Befehls-Hilfe - ausdrücklich unterstützt.

Ein neues Projekt erstellen

screenrig agent enroll --email ADDRESS --organization "Screens"

agent enroll erstellt eine Identität, Organisation, Screens-Projekt und Mitgliedschaft und speichert Identitäts- und Projektanmeldeinformationen privat. Verwenden Sie den bereits angegebenen Organisationsnamen erneut oder verwenden Sie Screens ohne Auswahlaufforderung. --organization ist erforderlich; --name benennt den Agenten separat. Verwenden Sie die tatsächliche Kontakt-E-Mail der Person. Die Anmeldung sendet eine Einladung zur Projektmitgliedschaft per E-Mail; sie gibt nicht preis, ob diese Adresse bereits einen Login hat. Die Person öffnet die Einladung und erstellt einen Login mit einer Passkey oder meldet sich an, um das Projekt zu ihrem bestehenden Login hinzuzufügen. Die Annahme verschiebt das Projekt in die Organisation, die die verifizierte E-Mail-Domäne der Person hält, andernfalls in die kostenlose Standard-Organisation, die sie bereits besitzt, umbenannt bei Namenskonflikt.

Fügen Sie --intent advertising für ein Projekt hinzu, das Anzeigen kauft, anstatt Bildschirme zu koppeln. --force ersetzt den Einschreibungs- oder ausstehenden Verbindungsstatus dieser Installation, wenn absichtlich ein anderes Projekt erstellt wird.

agent enroll --email ADDRESS --organization NAME [--name NAME]
    [--intent signage|advertising] [--force]

Mit AgentID anmelden

Ein Agent mit einem AgentID meldet sich bei https://api.screenrig.ai/agentid/start, an, erhält einen Anspruchscode, installiert das offizielle Plugin und führt screenrig agent enroll --agentid-claim CODE --organization NAME aus. Die verifizierte E-Mail des Eigentümers erhält die Dashboard-Einladung.

Bei einem bestehenden Konto anmelden

screenrig login

login meldet diese Installation bei einem bereits existierenden Konto an. Es druckt eine Dashboard-Adresse und einen Code und wartet dann bis zu 24 Stunden. Eine Person öffnet die Adresse, die den Code enthält, prüft, ob er übereinstimmt, passt das Projekt, Nur lesen, Vorschlagen oder Verwalten oder die Fähigkeitsbereiche an, wenn gewünscht, und drückt einmal Verbinden; eine Dashboard-Anmeldung der letzten Stunde ist der Nachweis, sodass keine zweite Passkey-Abfrage erfolgt. Die CLI speichert die Sitzung, wählt das genehmigte Projekt aus und gibt status: signed_in mit Projekt, Organisation und access zurück.

login [--project ID] [--access read|propose|manage] [--name NAME] [--no-wait] [--resume ID]
logout

--access fragt nach einem Level; der Standard ist manage, und die Person entscheidet. --project schlägt das Projekt vor. --no-wait gibt status: pending mit dem verification_uri_complete, dem user_code und einem login_-Handle zurück, das kein Geheimnis enthält; login --resume ID wartet später auf die Genehmigung. Führen Sie login erneut auf einer angemeldeten Installation aus, um ein weiteres Projekt hinzuzufügen oder ein Nur-Lesen- oder Vorschlag-Projekt zu Verwalten zu erhöhen.

Jede Sitzung trägt Fähigkeitsbereiche: screens, content, playlists, advertising, reports und project. Eine Sitzung ruft nur Befehle in ihren Bereichen auf; reports liest auch jeden Bereich. Ein Befehl außerhalb davon gibt 403 forbidden mit Detail This agent credential lacks the <name> capability. zurück. Nur-Lesen-Sitzungen listen und lesen. Vorschlags-Sitzungen laden auch Medien hoch, schreiben Notizen und schlagen Medien-, Playlist- und Bildschirmänderungen vor, die auf die Überprüfung einer Person warten. Eine Änderung über das Sitzungsniveau hinaus gibt 403 insufficient_access zurück.

logout widerruft die Anmeldung auf dem Server und entfernt die gespeicherten Tokens. Ein Fehler, der den Server möglicherweise nicht erreicht hat, behält sie, sodass ein erneutes Ausführen von logout sicher ist. doctor zeigt, wann die Sitzung endet: 90 Tage nach der letzten Nutzung und höchstens ein Jahr nach der Anmeldung. Siehe Authentifizierung.

Projekt- und Organisationslebenszyklus

Das aktuelle Projekt ist das zuletzt verwendete. Jeder JSON-Umschlag enthält Organisations- und Projektkontext; die menschliche Ausgabe benennt beide. Identitätsanmeldeinformationen sind durch die Mitgliedschaft des ausgewählten Projekts begrenzt. Der Wiederholungsstatus bleibt pro Projekt getrennt.

project list
project use ID
project create NAME [--organization-id ID | --organization NAME]
project moves
project move --organization-id ID
project transfer-owner --user-id ID
project deletion-preview
project delete --name NAME --revision N --yes
organization list
organization rename ID NAME
agent revoke-identity --yes

project list überprüft zugängliche Mitgliedschaften. project use wählt eine aus. Erstellen erfordert einen in der Organisation eindeutigen Namen und verwendet standardmäßig die Organisation des aktuellen Projekts, dann die Organisation, die Sie verwalten; wenn keine benannt ist, kommt zuerst die Organisation, die die verifizierte E-Mail-Domain des Eigentümers hält. Die verantwortliche Person wird Eigentümer. Jeder Plan begrenzt, wie viele Projekte eine Organisation hält; jede Person hat eine kostenlose Standardorganisation, eine zweite benötigt Plus, Premium oder Enterprise. Ohne aktuelles Projekt und ohne benannte Organisation platziert der Server das Projekt auf dieselbe Weise. --organization NAME startet eine neue Organisation nur für eine Person, die keine kostenlose besitzt; andernfalls wird die Erstellung mit free_organization_limit abgelehnt, dessen Detail die zu verwendende Organisation nennt. Die Anmeldung unterliegt Ratenbegrenzungen.

Der Eigentümer kann in ein Ziel umziehen, das von project moves zurückgegeben wird, oder das Eigentum an ein bestehendes verifiziertes Mitglied übertragen. Ein Umzug überträgt Bildschirme, und eine Zielorganisation, die bereits so viele Projekte hat, wie ihr Plan erlaubt, lehnt ihn mit project_limit_reached ab. Die Löschung verwendet den exakt aktuellen Namen und die positive Revision aus der Vorschau. Es erfordert null nicht archivierte Bildschirme, keinen eigenen Plan, keine Wallet-Verpflichtungen und keine aktive Werbung. Es sendet E-Mails an Mitglieder und behält einen Grabstein.

Organisationsnamen können sich wiederholen; verwenden Sie explizite IDs beim Umbenennen einer von Ihnen verwalteten Organisation. Eine Organisation hat benannte Admins und Mitglieder mit dieser Heimatorganisation; Admins laden andere Admins und Mitglieder per E-Mail über das Dashboard ein. organization list markiert free und plan_required Organisationen und meldet new_organization_allowed. Die Projektliste gewährt keinen Zugriff auf Projektinhalte. Die Organisation zahlt: ihr Geld und ihre Kontingente werden von ihren Projekten geteilt; die Nutzung bleibt Projekten zugeordnet und historische Gebühren behalten ihren ursprünglichen Zahler.

login --project ID fragt nach diesem Projekt mit derselben Identität. Nur die ausdrückliche Genehmigung dieser Anfrage gewährt eine Mitgliedschaft. agent disconnect --yes widerruft eine Mitgliedschaft; agent revoke-identity --yes widerruft separat die Identität und alle Mitgliedschaften. Eine mehrdeutige Antwort behält lokale Anmeldeinformationen und Wiederholungsstatus für die Abstimmung bei.

Werbeberichte behalten Abrechnungsdaten über die Ereignisaufbewahrung hinaus. Lesen Sie deren Metadaten: Fehlende historische Wiedergaben oder unbekannte genehmigte Dauer sind unbekannt, niemals null. Ein Bericht kann vollständige finanzielle Gesamtsummen und unvollständige Ergebnisverläufe enthalten.

Projekte, Einladungen und Diagnosen

Projektbefehle listen Mitgliedschaften auf, wählen ein Projekt aus, erstellen Projekte und verwalten deren Namen, Eigentümer, Verschiebungen und Löschungen. Einladungen bringen Personen in Projekte oder Werbenetzwerke.

project show#

Lese den Projekt-Datensatz und dessen verbleibendes Guthaben.

project show

Keine Parameter.

screenrig project show

data.credit_remaining ist eine ganze Ganzzahl der Guthaben. Unter 1000 kann der Umschlag eine credits_low-Warnung tragen. Bis zum 1. Januar 2027 ist die Nutzung im Rahmen vernünftig kostenlos, sodass das verbleibende Guthaben ein ganzzahliger Zähler ist, den ein Agent lesen kann, keine Abschaltanweisung.

project rename#

Legen Sie den Namen fest, den Personen im Dashboard-Projektumschalter sehen.

project rename NAME

project capabilities#

Lese den Plan des Projekts, unabhängige screens und advertiser Feature-Flags sowie den effektiven Funktionsumfang. Eine Routenverweigerung hat Vorrang vor einer veralteten Funktionslesung.

project capabilities

project uptime#

Lese die tägliche Bildschirmverfügbarkeit des Projekts über UTC-Tage.

project uptime [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]
ParameterTypErforderlichStandardNotizen
--day-from YYYY-MM-DDstringnein29 Tage vor --day-toErster UTC-Tag, einschließlich.
--day-to YYYY-MM-DDstringneinheuteLetzter UTC-Tag, inklusive. Maximal 366 Tage nach --day-from.
screenrig project uptime
screenrig project uptime --day-from 2026-09-01 --day-to 2026-09-30

Bereich und Standardwerte entsprechen denen von screen uptime. data.items listet eine Zeile pro UTC-Tag, älteste zuerst: online_s und offline_s summiert über die Bildschirme mit an diesem Tag aufgezeichnetem Status, availability, coverage (der Anteil der Tageszeit dieser Bildschirme mit aufgezeichnetem Status) und screens (wie viele einen Status hatten). Die heutige Zeile umfasst bisher beendete Intervalle; screen list zeigt, wer jetzt online ist.

project health-trend#

Lese den Gesundheitszustand der Flotte nach UTC-Stunden: meldende Bildschirme, heiß, Display getrennt, Abstürze.

project health-trend [--from TIME] [--to TIME]
ParameterTypErforderlichStandardNotizen
--from TIMEstringnein24 Stunden vor --toInklusive Stundenbeginn: ein RFC-3339-Zeitpunkt mit Sekunden und Offset (normalisiert auf UTC), now, oder ein Alter wie 7d, 12h oder 30m.
--to TIMEstringneinjetztExklusives Ende, in denselben Formen. Höchstens 93 Tage nach --from.
screenrig project health-trend
screenrig project health-trend --from 7d

data.items listet den Zustand der Flotte nach UTC-Stunden: hour, screens_reporting, hot (Spitzentemperatur bei oder über 80 °C), display_disconnected und crashing (3 oder mehr Abstürze in 24 Stunden). Die CLI folgt next_cursor bis zum Ende und antwortet jede Stunde mit next_cursor null. Stunden folgen Berichten um bis zu etwa 5 Minuten.

invitations#

Erstellen, auflisten oder widerrufen Sie Einladungen für Projektmitglieder und Anzeigenkäufer.

invitations create --email ADDRESS[,ADDRESS] [--kind member|ad-buyer]
invitations create --link
    [--screen-id ID] [--slot-id ID] [--policy trusted|review_required]
invitations list [--kind member|ad-buyer] [--status STATUS]
invitations revoke ID

--kind verwendet standardmäßig member. E-Mail-Zustellung ist Standard und läuft nach sieben Tagen ab. --email akzeptiert durch Kommas getrennte Empfänger, bis zu fünfzig pro Anfrage. --link ist nur für Mitglieder, erfordert genau einen vorgesehenen Empfänger und gibt eine 24-Stunden-Einladungs-URL einmalig für direkte Übergabe zurück. Geben Sie diese URL niemals in Protokolle, Notizen oder ein geteiltes Transkript ein. Listen geben sie nie zurück.

Werbekäufer verwenden nur E-Mail und benötigen einen eigenen Bildschirm- oder Slot-Bereich (oder beides). --screen-id und --slot-id akzeptieren durch Kommas getrennte IDs; --policy wählt trusted oder review_required. Statusfilter sind queued, sent, issued, accepted, revoked, expired und failed.

screenrig invitations create --email teammate@example.com
screenrig invitations create --kind ad-buyer --email buyer@example.com --screen-id scr_LOBBY --policy review_required

Agenten akzeptieren keine Einladungen. Die eingeladene Person öffnet die E-Mail, meldet sich an oder erstellt eine Passkey und akzeptiert im Dashboard. Die Link-Anmeldung überprüft zuerst ihre E-Mail. Das Widerrufen einer akzeptierten Einladung hebt keine Mitgliedschaft auf; verwenden Sie die Käufer-Mitgliedschaftskontrollen, um den Werbezugang zu widerrufen.

agent status#

Melden, ob diese Installation eine verwendbare Anmeldeinformation enthält.

agent status

Keine Parameter.

screenrig agent status

Nur lesend. Ändert niemals lokalen oder Serverzustand und kostet nichts. Das Ergebnis enthält die Sitzung access, deren effective_access und, wenn die Projektbewertungseinstellung oder ein Mitglied, das nicht genehmigen kann, sie niedriger hält, access_limited_by (project oder person).

login#

Diese Installation mit einem bestehenden Konto anmelden, mit Zustimmung einer Person im Dashboard.

login [--project ID] [--access read|propose|manage] [--name NAME] [--no-wait] [--resume ID]
ParameterTypErforderlichStandardNotizen
--project IDstringneinkeineSchlagen Sie das Projekt vor, das die Person genehmigt.
--access LEVELstringneinverwaltenread, propose oder manage. Die Person trifft die endgültige Entscheidung.
--name NAMEstringneinkeineBenennen Sie diese Installation, maximal 80 Zeichen.
--no-waitbooleanneinausGibt status: pending mit der Adresse, dem Code und einem login_-Handle zurück.
--resume IDstringneinkeineWarten Sie auf die ausstehende Anmeldung, die --no-wait gestartet hat.
screenrig login --access read

Gibt die Dashboard-Adresse und einen achtstelligen Code auf stderr aus, wartet dann bis zu 24 Stunden. Die Person prüft, ob der Code übereinstimmt, und drückt einmal Verbinden, ohne dass nach einer Dashboard-Anmeldung in der letzten Stunde eine zweite Passkey-Abfrage erfolgt. Der Umschlag meldet status: signed_in, das Projekt, die Organisation und access. Ein erneutes Ausführen auf einer angemeldeten Installation fügt ein Projekt hinzu oder erhöht von Nur-Lesen oder Vorschlagen auf Verwalten. Ablehnung ist login_denied und Ablauf ist login_expired.

logout#

Anmeldung dieser Installation beenden und deren Tokens entfernen.

logout

Keine Parameter.

screenrig logout

Widerruft die Anmeldung auf dem Server, entfernt dann die gespeicherten Tokens und meldet status: signed_out. Ein Fehler, der den Server möglicherweise nicht erreicht hat, behält sie, sodass ein erneutes Ausführen sicher ist. Führen Sie screenrig login aus, um sich erneut anzumelden.

dashboard#

Öffnen Sie die gewöhnliche Dashboard-URL. Dieser Befehl erstellt keinen Anmeldelink, keine Sitzung und benötigt keine Agenten-Anmeldeinformationen.

dashboard [open]
screenrig dashboard

Das Dashboard zeigt die Projekte der Person nach der Anmeldung an. Die Browser-Projektauswahl ändert nicht das an einen Agenten gebundene Projekt.

dashboard reset-sign-in#

Anmelderücksetzungs-E-Mail ohne Agenten-Anmeldeinformationen anfordern.

dashboard reset-sign-in --email ADDRESS

Die Bestätigung verrät nicht, ob die E-Mail eine Anmeldung hat. Die per E-Mail gesendete Zurücksetzung läuft nach einer Stunde ab; die Person erstellt einen neuen Passkey. Die Fertigstellung ersetzt ihre Anmeldeinformationen und widerruft andere Sitzungen.

doctor#

Prüfen Sie diese Installation und melden Sie jede Prüfung mit Namen.

doctor [--repair-config]
Parameter Typ Erforderlich Standard Notizen
--repair-config boolean nein aus Berechtigungen für eine vorhandene Konfigurationsdatei, die für Gruppe oder andere lesbar ist, verschärfen.
screenrig doctor

data.checks benennt jede Prüfung und ihren Status: die Node-Laufzeit, den aufgelösten Konfigurationspfad und dessen Berechtigungen, die Steuerungsebene und ihre Service-Routen, die beworbene feedback-Fähigkeit und die optionale Medientoolkette (ffmpeg, ffprobe, encoder_libx264, encoder_libx265, encoder_libwebp, cwebp, filter_hdr_tonemap).

Jede fehlgeschlagene Prüfung lässt doctor mit einem Nicht-Null-Exit enden, lesen Sie also die einzelnen Namen, bevor Sie die Installation als nicht gesund markieren. Eine fehlende Medientoolchain betrifft nur media upload.

version#

Drucken Sie die gebündelte CLI-Version und ihren Protokolladapter.

version

Keine Parameter.

screenrig version

Führen Sie dies zuerst in einer Sitzung aus. Ein erfolgreiches Envelope beweist, dass der Launcher die gebündelte CLI aufgelöst hat. --version und -V machen dasselbe von überall in der Befehlszeile.

Service-Clients

Ein Service-Client ist ein Server, Skript oder CI-Job, der dem Projekt gehört und sich mit einem eigenen Schlüssel oder Secret statt mit der Genehmigung einer Person anmeldet. Zum Erstellen oder Ändern eines Clients benötigt der Agent Manage-Zugriff für seine Identität mit dem Geltungsbereich identity, eine eigene Manage-Berechtigung mit der Fähigkeit project im Zielprojekt und eine verifizierte verantwortliche Person, die die Organisation dieses Projekts verwaltet. Ein Service-Client verwaltet niemals Clients. Um Befehle als Client auszuführen, setzen Sie SCREENRIG_CLIENT_ID mit SCREENRIG_CLIENT_KEY_FILE oder SCREENRIG_CLIENT_SECRET. Siehe Service-Clients.

service-client list#

Service-Clients dieses Projekts auflisten, aktiv und widerrufen, mit ihren Schlüsseln, geheimen IDs und Nutzung.

service-client list

Keine Parameter.

screenrig service-client list

Gibt niemals ein Geheimnis zurück.

service-client show#

Einen Service-Client anzeigen.

service-client show ID
ParameterTypErforderlichStandardNotizen
IDstringjakeineDie Client-ID, scl_….
screenrig service-client show scl_ID

Jeden Schlüssel kid und jede geheime css_ ID für die Rotation auflisten.

service-client create#

Erstellen Sie einen Service-Client, der diesem Projekt gehört.

service-client create --name NAME [--capability NAME]... [--access read|propose|manage] [--key-file PATH] [--secret-file PATH]
ParameterTypErforderlichStandardNotizen
--name NAMEstringjakeineMaximal 80 Zeichen.
--capability NAMEstringneinalle sechsWiederholbar: screens, content, playlists, advertising, reports, project, jeweils innerhalb Ihrer.
--access LEVELstringneinlesenread, propose oder manage. propose sendet Playlist- und Bildschirmänderungen an die Überprüfung einer Person.
--key-file PATHPfadeines davonkeineEin JWK oder PEM: Ed25519, EC P-256 oder RSA mit mindestens 2048 Bit. Es wird nur die öffentliche Hälfte gesendet.
--secret-file PATHPfadeines davonkeineEin Geheimnis erzeugen und in diese neue 0600-Datei schreiben. Es wird einmal angezeigt.
screenrig service-client create --name "Nightly report" --access read --capability reports --key-file screenrig-client.pem

Erfordert die oben beschriebenen Berechtigungen für Identität, Projekt und Organisationsverwaltung. Höchstens 50 aktive Clients pro Organisation, gezählt über alle ihre Projekte. Ein Schlüssel ohne eigenes kid wird durch seinen RFC-7638-Fingerabdruck identifiziert.

service-client add-key#

Registrieren Sie einen zweiten öffentlichen Schlüssel für eine Rotation ohne Ausfallzeiten.

service-client add-key ID --key-file PATH
ParameterTypErforderlichStandardNotizen
IDstringjakeineDie Client-ID.
--key-file PATHPfadjakeineDer neue öffentliche Schlüssel, ein JWK oder PEM.
screenrig service-client add-key scl_ID --key-file new.pem

Ein Client hält höchstens zwei Schlüssel.

service-client add-secret#

Ein zweites Geheimnis für eine Rotation ohne Ausfallzeit erzeugen.

service-client add-secret ID --secret-file PATH
ParameterTypErforderlichStandardNotizen
IDstringjakeineDie Client-ID.
--secret-file PATHPfadjakeineEine neue 0600-Datei, die das Secret erhält.
screenrig service-client add-secret scl_ID --secret-file new-secret

Ein Client hält höchstens zwei Geheimnisse. Das aktuelle funktioniert weiter, bis Sie es entfernen.

service-client remove-key#

Schlüssel entfernen; damit ausgestellte Tokens funktionieren innerhalb von Sekunden nicht mehr.

service-client remove-key ID --kid KID
ParameterTypErforderlichStandardNotizen
IDstringjakeineDie Client-ID.
--kid KIDstringjakeineDie Schlüssel-ID von service-client show.
screenrig service-client remove-key scl_ID --kid KID

Ein Client behält mindestens einen Schlüssel oder ein Geheimnis.

service-client remove-secret#

Geheimnis entfernen; damit ausgestellte Tokens funktionieren innerhalb von Sekunden nicht mehr.

service-client remove-secret ID --secret-id css_ID
ParameterTypErforderlichStandardNotizen
IDstringjakeineDie Client-ID.
--secret-id IDstringjakeineDie css_ Geheim-ID von service-client show.
screenrig service-client remove-secret scl_ID --secret-id css_ID

service-client revoke#

Einen Service-Client dauerhaft widerrufen.

service-client revoke ID --yes
ParameterTypErforderlichStandardNotizen
IDstringjakeineDie Client-ID.
--yesbooleanjaausDie dauerhafte Widerrufung bestätigen.
screenrig service-client revoke scl_ID --yes

Löscht seine Schlüssel und Geheimnisse; seine Tokens funktionieren innerhalb von Sekunden nicht mehr. Der Datensatz bleibt zur Prüfung erhalten.

Medien

Ein Medienobjekt ist ein Standbild, ein Clip oder eine MP3-Audiospur, gespeichert als genau eine Wiedergabevariante. Es gibt kein gerätespezifisches Fallback, sodass das, was media upload oder media generate speichert, von jedem Bildschirm dekodiert werden muss.

Medienordner organisieren die Bibliothek. Eine Ordner-ID beginnt mit mfd_ und eine Datei-ID mit med_. Ein Upload landet im Bibliotheksstamm, sofern --folder keinen Ordner benennt, media move und media folder update den Baum umstrukturieren, und ein Playlist-by:folder-Selektor spielt die Dateien direkt in einem Ordner ab, nicht die seiner Unterordner. Eine Organisation enthält höchstens 1000 Ordner über alle ihre Projekte, die maximal 10 Ebenen tief verschachtelt sind, mit Namen von 1 bis 100 Zeichen.

Ein Medium behält seine ID, wenn sich seine Datei ändert: media replace tauscht die Datei an Ort und Stelle aus, sodass jede Playlist und jeder Zeitplan, die es verwenden, die neue Datei abspielen, und media versions listet alle Dateien auf, die das Element hatte.

media generate#

Ein präsentierbares Vollseiten-Standbild im Medienarchiv des Projekts erzeugen.

media generate --prompt TEXT [--aspect-ratio RATIO] [--quality low|medium|high] [--tag TAG]
               [--no-progress]
ParameterTypErforderlichStandardNotizen
--prompt TEXTstringjakeine1 bis 4000 Zeichen. Geben Sie alle Fakten und den gesamten Text im Prompt ein, damit das Bildmodell ihn setzen kann.
--aspect-ratio RATIOstringnein16:91:1, 16:9, 9:16, 4:3, 3:4, 3:2 oder 2:3.
--qualitystringneinmediumlow, medium oder high. Ändert die Detailgenauigkeit des Standbilds.
--tag TAGstringneinkeineGleiches 1 bis 32 Zeichen langes Buchstaben- oder Ziffern-Tag wie beim Upload.
--no-progressbooleanneinausUnterdrücken Sie die gestartete stderr-Zeile.
screenrig media generate --prompt "A 16:9 restaurant menu poster for North Lobby Cafe. Dark walnut, gold type. Title NORTH LOBBY CAFE. Items: Espresso $4, Cortado $4.50, House Blend $3. Footer Open 7am to 7pm. Typeset every line of copy in the image." --aspect-ratio 16:9 --quality high --tag LobbyMenu

Der Befehl speichert ein verlustbehaftetes WebP im Projekt-Medien-Store und gibt data.media_id (med_…) zurück. Laden Sie die Bytes nicht erneut hoch. Drucken Sie niemals Pixel oder den Prompt. Der Autorbaum und der Prompt-Vertrag befinden sich auf Compose.

media upload#

Eine lokale Datei in Lieferbytes konvertieren, hochladen und warten, bis das Objekt bereit ist.

media upload <file> [--content-type TYPE] [--tag TAG] [--folder ID] [--no-wait] [--poll-ms MS]
             [--timeout MS] [--no-transcode] [--codec h264|hevc] [--max-fps N]
             [--max-edge PIXELS] [--webp-quality 1-100] [--no-progress]
             [--preset signage-1080p30|signage-4k30] [--no-audio]
ParameterTypErforderlichStandardNotizen
<file>PfadjakeineDas Quell-Still, der Clip oder die Audiospur. Der Dateiname wird zum lesbaren Namen in Listen, Playlists und Wiedergabemeldungen, benennen Sie ihn also nach dem, was er zeigt.
--content-type TYPEstringneinerkannt aus den hochgeladenen BytesGeben Sie den Medientyp selbst an, anstatt ihn vom CLI erkennen zu lassen.
--tag TAGstringneinkeineEin bis 32 Buchstaben oder Ziffern, passend zu ^[A-Za-z0-9]{1,32}$. Bindestriche werden abgelehnt. Ein Tag ist das, was media list --tag TAG zu einer zuverlässigen Dateiname-zu-ID-Zuordnung macht.
--folder IDstringneinBibliotheksstammEin vorhandener mfd_ Medienordner, der vor Beginn jeglicher Arbeit überprüft wird. Der bereite Upload wird in diesen verschoben und data.folder_id meldet dies. Abgelehnt mit --no-wait (usage_error, Exit 2), da die Medien-ID noch nicht existiert: Führen Sie media move aus, sobald das Objekt bereit ist.
--no-waitbooleanneinausGibt zurück, sobald der Commit akzeptiert ist. Das Objekt ist noch nicht bereit; beenden mit operations wait.
--poll-ms MSintegernein1000Intervall zwischen Abfragen von Operationen während des Wartens.
--timeout MSintegernein120000Frist für das Warten. Sie begrenzt auch jede zugrunde liegende Anfrage.
--no-transcodebooleanneinausLaden Sie die Quelldaten unverändert hoch. ffmpeg, ffprobe und cwebp werden nicht ausgeführt. Verlustfreies WebP wird weiterhin abgelehnt.
--codecstringneinh264h264 oder hevc; avc und h265 werden als Aliase akzeptiert. Verwenden Sie hevc nur, wenn jeder Bildschirm, der den Clip abspielt, ein nativer Player ist.
--max-fps Nnumbernein30Konstante Ausgabebildrate. Jedes Video wird genau mit dieser Rate kodiert, unabhängig von seiner Quellrate, sodass aufeinanderfolgende Clips nie die Rate ändern. Größer als 0 und höchstens 240.
--max-edge PIXELSintegernein3840Grenze wird an jede Kante angewendet, von 16 bis 3840. Das Seitenverhältnis bleibt erhalten und eine kleinere Quelle wird nie hochskaliert.
--webp-qualityintegernein90Standbildqualität für die WebP-Codierung, von 1 bis 100.
--presetstringneinNicht festgelegtsignage-1080p30 oder signage-4k30. Orientierungssensitives Videoformat und konstante 30 fps. --max-edge und --max-fps können ein Preset verschärfen, aber nicht vergrößern. Nur Video; kann nicht mit --no-transcode kombiniert werden.
--no-audiobooleanneinausDie Audiospur bei der Videoübertragung weglassen. Nur Video; kann nicht mit --no-transcode kombiniert werden.
--no-progressbooleanneinausKeine Fortschrittsausgabe ausgeben. Fortschritt wird immer an stderr gesendet; stdout bleibt für den einzelnen Ergebnisumschlag reserviert.
screenrig media upload ./lobby-welcome-loop.mp4 --tag LobbyLoop

Video wird standardmäßig zu MP4: H.264 High Profile Level 4.2 oder H.265 mit --codec hevc in yuv420p getaggtem Rec. 709. Eine HDR-Quelle wird auf Rec. 709 tonemapped. Audio, falls vorhanden, ist AAC mit 192 kbit/s, 48 kHz, Stereo.

Standbilder werden bei Qualität 90 zu verlustbehaftetem WebP, wobei Alpha erhalten bleibt, wenn die Quelle es hat. Eine animierte Quelle läuft endlos. Ein WebP, das bereits die Größenbeschränkung erfüllt, wird durchgereicht statt neu codiert.

Audio wird zu einer MP3 für den Playlist-Soundtrack. Eine MP3-Quelle wird unverändert hochgeladen; WAV-, AAC-, M4A-, OGG- und FLAC-Quellen werden in eine 128 kb/s MP3 konvertiert, wofür ein ffmpeg-Build mit libmp3lame benötigt wird. Ein Track läuft von 1 Sekunde bis 3 Stunden. playlist init wandelt Audioeingaben in Soundtrack-Tracks statt Seiten um. Das fertige Objekt ist ein audio Medienobjekt mit einer Dauer. Es kann nicht auf einer Seite platziert werden; benennen Sie es stattdessen in der Playlist audio soundtrack.

Die fertige Objekt-ID ist data.media_id. Derselbe Wert ist data.id und data.operation.result.media_id. Diese ID nimmt ein Playlist-Selektor.

Ein informationsarmer Dateiname wie video.mp4 fügt dem Umschlag eine beratende generic_filename-Warnung hinzu. Der Upload gelingt trotzdem, und die CLI benennt die Datei nie um; wählen Sie den Namen vor dem Ausführen des Befehls.

Konvertierung führt ffmpeg und ffprobe von PATH aus oder von den absoluten Pfaden in SCREENRIG_FFMPEG und SCREENRIG_FFPROBE. Standbilder bevorzugen den ffmpeg libwebp-Encoder und fallen auf cwebp bei PATH oder SCREENRIG_CWEBP zurück. Führen Sie doctor vor dem ersten Upload einer Sitzung aus.

--preset signage-1080p30 begrenzt die lange Kante auf 1920, die kurze Kante auf 1080 und die Rate auf konstante 30 fps. signage-4k30 begrenzt die lange Kante auf 3840, die kurze Kante auf 2160 und die Rate auf konstante 30 fps. Beide funktionieren mit Landschaft, Hochformat und quadratischen Inhalten. --no-audio lässt die Audio-Codierung für stille Clips weg. Diese Optionen gelten nur für Video.

screenrig media upload ./lobby.mov --preset signage-1080p30 --no-audio
screenrig media upload ./menu.png --folder mfd_01EXAMPLEFOLDER000000000

Der Upload landet im Bibliotheksstamm und wird in den Ordner verschoben, sobald er bereit ist. media upload-batch --folder verschiebt jedes hochgeladene Element auf dieselbe Weise.

Unter Vorschlagszugang oder wenn das Projekt eine Überprüfung für Agentenänderungen erfordert, wartet ein neuer Upload auf die Überprüfung durch eine Person, bevor ein Tag, ein Ordner oder ein all-Selektor ihn abspielt; siehe Überprüfungen.

media upload-batch#

Viele lokale Dateien aus einem Manifest hochladen, Fortsetzung aus einer erforderlichen Statusdatei.

media upload-batch <manifest.json> [--state FILE] [--concurrency N] [--tag TAG] [--folder ID]
                   [--poll-ms MS] [--timeout MS] [--no-transcode] [--codec h264|hevc]
                   [--max-fps N] [--max-edge PIXELS] [--webp-quality 1-100] [--no-progress]
                   [--preset signage-1080p30|signage-4k30] [--no-audio]
ParameterTypErforderlichStandardNotizen
<manifest.json>Pfadjakeine{ "items": [ { "path": "./a.png", "tag"?: "Lobby", "content_type"?: "image/png" } ] } mit 1 bis 1000 Elementen. Pfade sind relativ zur Manifestdatei.
--state FILEPfadneinprivate Datei neben der KonfigurationEine 0600 JSON-Datei, die nach dem SHA-256 der lokalen Bytes jeder Quelldatei indiziert ist. Bereits vorhandene Elemente mit einem media_id werden als resumed gemeldet. Teilen Sie keine Zustandsdatei über Projekte hinweg.
--concurrency Nintegerneindie CLI-StandardeinstellungParallele Uploads.
--no-transcodebooleanneinausLaden Sie die Quelldaten unverändert hoch, wie media upload es tut.
--poll-ms MSintegernein1000Intervall zwischen Abfragen von Operationen während des Wartens.
--timeout MSintegernein120000Frist für das Warten. Sie begrenzt auch jede zugrunde liegende Anfrage.
--codecstringneinh264h264 oder hevc; avc und h265 werden als Aliase akzeptiert. Verwenden Sie hevc nur, wenn jeder Bildschirm, der den Clip abspielt, ein nativer Player ist.
--max-fps Nnumbernein30Konstante Ausgabebildrate. Jedes Video wird genau mit dieser Rate kodiert, unabhängig von seiner Quellrate, sodass aufeinanderfolgende Clips nie die Rate ändern. Größer als 0 und höchstens 240.
--max-edge PIXELSintegernein3840Grenze wird an jede Kante angewendet, von 16 bis 3840. Das Seitenverhältnis bleibt erhalten und eine kleinere Quelle wird nie hochskaliert.
--webp-qualityintegernein90Standbildqualität für die WebP-Codierung, von 1 bis 100.
--presetstringneinNicht festgelegtsignage-1080p30 oder signage-4k30. Orientierungssensitives Videoformat und konstante 30 fps. --max-edge und --max-fps können ein Preset verschärfen, aber nicht vergrößern. Nur Video; kann nicht mit --no-transcode kombiniert werden.
--no-audiobooleanneinausDie Audiospur bei der Videoübertragung weglassen. Nur Video; kann nicht mit --no-transcode kombiniert werden.
--tag TAGstringneinkeineAngewendet, wenn ein Element seinen eigenen Tag weglässt.
--folder IDstringneinBibliotheksstammEin vorhandener mfd_ Medienordner. Jedes hochgeladene Element wird nach dem Upload in diesen verschoben, und data.folder_id meldet dies.
--no-progressbooleanneinausKeine Fortschrittsausgabe ausgeben.
screenrig media upload-batch ./images.json --state ./upload-state.json

Der Umschlag enthält data.items[] in Manifestreihenfolge, jeweils mit path, source_filename, sha256, outcome (accepted oder resumed) und media_id. data.failed[] enthält Elemente, die nicht angekommen sind.

media replace#

Die Datei eines Mediums an Ort und Stelle ersetzen. Seine ID, Playlists und Zeitpläne funktionieren weiter.

media replace <id> <file> [--expect-rev REVISION] [--note TEXT] [--content-type TYPE] [--no-wait]
              [--poll-ms MS] [--timeout MS] [--no-transcode] [--codec h264|hevc] [--max-fps N]
              [--max-edge PIXELS] [--webp-quality 1-100] [--no-progress]
              [--preset signage-1080p30|signage-4k30] [--no-audio]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie med_ Objekt-ID.
<file>PfadjakeineDas neue Standbild, der neue Clip oder die neue Audiospur. Sie muss dieselbe Art wie das Medium sein: Bild für Bild, Video für Video, Audio für Audio. Wird geprüft, bevor Arbeit beginnt (usage_error, Exit-Code 2).
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Ein übergebener veralteter Wert ist revision_conflict, und der deklarierte Upload wird abgebrochen: Lesen Sie media show ID und führen Sie den Befehl erneut aus.
--note TEXTstringneinkeineWird mit der neuen Version gespeichert und der Person gezeigt, die sie überprüft. Höchstens 280 Zeichen.
--content-type TYPEstringneinerkannt aus den hochgeladenen BytesGeben Sie den Medientyp selbst an, anstatt ihn vom CLI erkennen zu lassen.
--no-waitbooleanneinausGibt zurück, sobald der Austausch akzeptiert ist. Die neue Datei ist noch nicht im Einsatz; beenden mit operations wait.
--poll-ms MSintegernein1000Intervall zwischen Abfragen von Operationen während des Wartens.
--timeout MSintegernein120000Frist für das Warten. Sie begrenzt auch jede zugrunde liegende Anfrage.
--no-transcodebooleanneinausLaden Sie die Quelldaten unverändert hoch. ffmpeg, ffprobe und cwebp werden nicht ausgeführt. Verlustfreies WebP wird weiterhin abgelehnt.
--codecstringneinh264h264 oder hevc; avc und h265 werden als Aliase akzeptiert. Verwenden Sie hevc nur, wenn jeder Bildschirm, der den Clip abspielt, ein nativer Player ist.
--max-fps Nnumbernein30Konstante Ausgabebildrate. Jedes Video wird genau mit dieser Rate kodiert, unabhängig von seiner Quellrate, sodass aufeinanderfolgende Clips nie die Rate ändern. Größer als 0 und höchstens 240.
--max-edge PIXELSintegernein3840Grenze wird an jede Kante angewendet, von 16 bis 3840. Das Seitenverhältnis bleibt erhalten und eine kleinere Quelle wird nie hochskaliert.
--webp-qualityintegernein90Standbildqualität für die WebP-Codierung, von 1 bis 100.
--presetstringneinNicht festgelegtsignage-1080p30 oder signage-4k30. Orientierungssensitives Videoformat und konstante 30 fps. --max-edge und --max-fps können ein Preset verschärfen, aber nicht vergrößern. Nur Video; kann nicht mit --no-transcode kombiniert werden.
--no-audiobooleanneinausDie Audiospur bei der Videoübertragung weglassen. Nur Video; kann nicht mit --no-transcode kombiniert werden.
--no-progressbooleanneinausKeine Fortschrittsausgabe ausgeben. Fortschritt wird immer an stderr gesendet; stdout bleibt für den einzelnen Ergebnisumschlag reserviert.
screenrig media replace med_01EXAMPLEIMAGE0000000000 ./menu-v2.png
screenrig media replace med_01EXAMPLEVIDEO0000000000 ./intro.mp4 --expect-rev 3 --note "Spring cut"

Das Medium behält seine ID, seine Tags und seinen Ordner, sodass jede Playlist und jeder Zeitplan, die es nennen, die neue Datei beim nächsten Manifest abspielen und auch die Selektoren für Tag, Ordner und all sie übernehmen. Nichts wird neu geplant. Der Befehl führt dieselben Schritte aus wie media upload (Konvertierung, Video-Bytelimit des Tarifs, Größenlimits, Speicherkontingent, signierte Übertragung) und ersetzt dann, statt neues Medium hinzuzufügen. Er akzeptiert weder --tag noch --folder.

Standardmäßig wartet der Befehl auf die Verarbeitung. data.media_id und data.id sind die Medien-ID, data.version ist die Nummer der neuen Datei in media versions und data.revision ist die neue Revision des Mediums. data.warnings, data.operation, data.upload, data.transcode und die Zeitangaben werden wie bei media upload gemeldet, und die Operations-ID steht in der Antwort. Mit --no-wait ist data.operation die akzeptierte Operation, und data.version und data.warnings fehlen.

Ein geändertes Seitenverhältnis ist erlaubt. Die Antwort enthält eine Warnung aspect_ratio_changed, und data.warnings[].playlists nennt die Playlists, die das Medium verwenden; prüfen Sie also, wie sie aussehen. Eine Datei mit denselben Bytes wie die aktuelle wird mit resource_conflict abgelehnt (Exit-Code 13).

Jede frühere Datei bleibt im Verlauf des Mediums und zählt zu den gespeicherten Bytes, bis ihre Version gelöscht wird; siehe media versions.

Unter Propose-Zugang oder wenn das Projekt eine Überprüfung für Agentenänderungen verlangt, wartet der Austausch auf eine Person, und der Befehl ist erfolgreich (Exit-Code 0): data.status ist pending_review, data.review_id nennt die Überprüfung, die Warnung pending_review nennt ihre URL, und data.next ist screenrig reviews show ID. Das Medium spielt seine aktuelle Datei weiter ab, bis eine Person freigibt; sagen Sie ihr also, dass es wartet, und wiederholen Sie den Schreibvorgang nicht. Ein neuerer Austausch desselben Mediums ersetzt den wartenden. Siehe Überprüfungen.

media versions#

Die Dateien auflisten, die ein Medium hatte, die Datei im Einsatz zuerst.

media versions <id> [--limit N] [--cursor CURSOR]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie med_ Objekt-ID.
--limit Nintegerneinjede SeiteEine Seite mit dieser Anzahl von Versionen lesen, 1 bis 100.
--cursor CURSORstringneinkeineDie Seite nach dem data.next_cursor der vorherigen Seite lesen.
screenrig media versions med_01EXAMPLEIMAGE0000000000

data.items enthält einen Eintrag für jede Datei, die das Medium hatte: number, current, filename, content_type, sha256, bytes, width, height, duration_ms, codecs, source (upload, replace, sync oder restore), note, by (Art person, agent, client oder sync, mit ID und Name) und restored_from. Die Datei im Einsatz steht zuerst (current: true), danach die übrigen, neueste zuerst. Version 1 ist der erste Upload; jeder Austausch, jede Wiederherstellung und jede Änderung durch die Mediensynchronisierung vergibt die nächste Nummer.

Ohne --limit und --cursor werden alle Seiten gelesen, und data.next_cursor ist null. Mit einem von beiden wird eine Seite gelesen: Solange data.next_cursor ein String ist, führen Sie den Befehl erneut aus, wobei --cursor darauf gesetzt wird. Schreibgeschützter Zugang genügt. Die Bytes einer früheren Version bleiben gespeichert und zählen zu den gespeicherten Bytes des Projekts, bis media version delete sie entfernt; es gibt kein Limit, wie viele Versionen aufbewahrt werden, und gespeicherte Bytes über dem kostenlosen Speicher des Tarifs werden wie jeder andere Speicher abgerechnet.

media restore#

Eine frühere Version als neue Version wieder in Einsatz bringen.

media restore <id> --number N [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie med_ Objekt-ID.
--number NintegerjakeineDie Nummer der wieder in Einsatz zu bringenden Version, wie media versions sie auflistet.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Ein übergebener veralteter Wert ist revision_conflict: Lesen Sie media show ID und führen Sie den Befehl erneut aus.
--note TEXTstringneinkeineWird mit der neuen Version gespeichert und der Person gezeigt, die sie überprüft. Höchstens 280 Zeichen.
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2 --expect-rev 5 --note "Back to the winter menu"

Das Medium behält seine ID und erhält eine neue Revision, und jede Playlist und jeder Zeitplan, die es nennen, spielen diese Datei wieder ab. Die kopierte Version bleibt im Verlauf und teilt ihre Bytes; die neue Version zählt wie jede andere zu den gespeicherten Bytes. data.media ist das Medium, und data.warnings enthält aspect_ratio_changed, das die Playlists nennt, die das Medium verwenden, wenn die wiederhergestellte Datei ein anderes Seitenverhältnis hat.

Die Version im Einsatz kann nicht wiederhergestellt werden (resource_conflict, Exit-Code 5), und eine unbekannte Version ist not_found (Exit-Code 4). Unter Propose-Zugang oder wenn das Projekt eine Überprüfung für Agentenänderungen verlangt, wartet die Wiederherstellung auf eine Person, und der Befehl ist erfolgreich (Exit-Code 0): data.status ist pending_review mit data.review, die Warnung pending_review nennt ihre URL, und data.next ist screenrig reviews show ID. Das Medium spielt seine aktuelle Datei weiter ab, bis eine Person freigibt; wiederholen Sie den Schreibvorgang daher nicht.

media version delete#

Eine frühere Version und ihre gespeicherten Bytes löschen.

media version delete <id> --number N
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie med_ Objekt-ID.
--number NintegerjakeineDie Nummer der zu löschenden Version, wie media versions sie auflistet.
screenrig media version delete med_01EXAMPLEIMAGE0000000000 --number 2

Der Datensatz der Version verschwindet, und ihre Bytes werden sofort von den gespeicherten Bytes des Projekts abgezogen. Das gespeicherte Objekt wird nach 24 Stunden entfernt, sofern nicht eine andere Version oder die Datei im Einsatz dieselbe Datei hält. Eine gelöschte Version kann nicht wiederhergestellt werden. Die Version im Einsatz kann nicht gelöscht werden, und keine Version kann gelöscht werden, solange ein Austausch des Mediums auf Überprüfung wartet; beides ist resource_conflict (Exit-Code 5), und media versions ID zeigt, welche Version im Einsatz ist. Eine unbekannte Version ist not_found (Exit-Code 4). Das Löschen erfordert Manage-Zugang: Ein Propose-Zugangsdatensatz wird mit insufficient_access abgelehnt, und das Löschen wird nie zur Überprüfung vorgeschlagen.

media show#

Ein Medienobjekt lesen, einschließlich seiner aktuellen Revision.

media show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie med_ Objekt-ID.
screenrig media show med_01EXAMPLEIMAGE0000000000

media download#

Schreiben Sie eine gespeicherte Wiedergabe auf die Festplatte zur Inspektion. Drucken Sie niemals die Bytes aus.

media download <id> [--output FILE]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie med_ Objekt-ID.
--output FILEPfadnein./<id>.<ext> im aktuellen VerzeichnisEin Dateipfad, kein Verzeichnis. Eine vorhandene Datei wird überschrieben. Die Erweiterung folgt dem Inhaltstyp.
screenrig media download med_01EXAMPLEIMAGE0000000000 --output ./lobby.webp

Der Umschlag meldet media_id, path, bytes, sha256, content_type, primitive, filename, optional source_filename und width / height. Er enthält nie Pixel. Verwenden Sie dies, um ein generiertes Standbild zu prüfen, bevor es auf dem Bildschirm erscheint.

media list#

Medienobjekte auflisten, optional gefiltert nach Tag und Typ.

media list [--tag TAG] [--primitive image|video|audio] [--folder ID|root] [--library]
ParameterTypErforderlichStandardNotizen
--tag TAGstringneinkeineÜbereinstimmung ^[A-Za-z0-9]{1,32}$. Nicht markierte Objekte werden ausgelassen, wenn dieser Filter vorhanden ist.
--primitivestringneinalleimage, video oder audio. Beschränken Sie die Auflistung auf Standbilder, Clips oder Soundtrack-Spuren.
--folder ID|rootstringneinjeder OrdnerNur Dateien direkt in diesem mfd_ Ordner, nicht in seinen Unterordnern, oder mit root nur Dateien im Bibliotheksstamm. Die API wendet den Filter an.
--librarybooleanneinausListet stattdessen die Medien der Bibliothek der Organisation auf, schreibgeschützt: Die Zeilen tragen library: true. Verwenden Sie ihre IDs in Playlist-Seiten; ändern Sie sie nur im Bibliotheksprojekt.
screenrig media list --tag LobbyLoop --primitive video
screenrig media list --folder mfd_01EXAMPLEFOLDER000000000
screenrig media list --library

Jede Zeile trägt folder_id, das an der Bibliothekswurzel fehlt.

media update#

Ändern oder löschen Sie das Tag eines Objekts. Seine Verfügbarkeitsregel setzen Sie mit media availability.

media update <id> (--tag TAG | --tags TAG1,TAG2 | --clear-tag) [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie med_ Objekt-ID.
--tag TAGstringeines von beidenkeineDas Ersatz-Tag, ein bis 32 Buchstaben oder Ziffern.
--clear-tagbooleaneines von beidenausSenden Sie null und lassen Sie das Objekt unmarkiert.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig media update med_01EXAMPLEIMAGE0000000000 --tag LobbyLoop

Unter Vorschlagszugang oder wenn das Projekt eine Überprüfung für Agentenänderungen erfordert, beantwortet das erneute Taggen genehmigter Medien ok mit der Warnung media_review_pending: Bildschirme spielen es mit seinen genehmigten Tags weiter ab, bis eine Person die Änderung genehmigt, und eine Ablehnung setzt die Tags zurück. Die Überprüfung erscheint innerhalb weniger Sekunden in reviews list; ein erneutes Taggen, das keine genehmigte Playlist und keine Playlist, die auf Überprüfung wartet, ändert, wird automatisch angewendet. Siehe Überprüfungen.

media availability#

Legt fest oder löscht, wann dynamische Selektoren eine Datei auswählen dürfen.

media availability <id> (--file FILE | --clear) [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie med_ Objekt-ID.
--file FILEstringeines von beidenkeineEine JSON-Verfügbarkeitsregel.
--clearbooleaneines von beidenausEntfernt die Regel; die Datei ist immer verfügbar.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig media availability med_01EXAMPLEIMAGE0000000000 --file rule.json

Die Bestandteile und das Verhalten der Regel stehen unter Medienverfügbarkeit.

media delete#

Ein Medienobjekt löschen.

media delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie med_ Objekt-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig media delete med_01EXAMPLEIMAGE0000000000

media move#

Mediendateien und Ordner in einen Ordner verschieben oder zurück zum Bibliotheksstamm.

media move <id>... (--folder ID | --root)
ParameterTypErforderlichStandardNotizen
<id>...stringjakeineEine oder mehrere med_ Datei-IDs und mfd_ Ordner-IDs, insgesamt höchstens 1000.
--folder IDstringeines von beidenkeineDer Ziel-mfd_-Ordner.
--rootbooleaneines von beidenausZum Bibliotheksstamm verschieben.
screenrig media move med_01EXAMPLEIMAGE0000000000 med_01EXAMPLEVIDEO0000000000 --folder mfd_01EXAMPLEFOLDER000000000
screenrig media move mfd_01EXAMPLEFOLDER000000000 --root

Der Vorgang ist eine Alles-oder-Nichts-Anfrage. Ein Ordner kann nicht in sich selbst oder einen darin enthaltenen Ordner verschoben werden, und Ordner verschachteln sich höchstens 10 Ebenen tief. Elemente, die sich bereits im Ziel befinden, bleiben unverändert. data.media und data.folders zählen, was verschoben wurde.

Das Verschieben von Dateien ändert, was die by:folder-Selektoren ihrer alten und neuen Ordner abspielen, ab der nächsten Auflösung des Selektors jedes Bildschirms; das Verschieben eines Ordners ändert keine Dateien des Ordners selbst. Unter Vorschlag Zugriff oder wenn das Projekt eine Überprüfung für Agentenänderungen erfordert, wartet jede verschobene Datei auf die Überprüfung durch eine Person (reviews list) und genehmigte Playlists spielen sie weiterhin über den Ordner ab, mit dem sie genehmigt wurden; siehe Reviews.

media folder list#

Medienordner des Projekts auflisten.

media folder list [--library]
ParameterTypErforderlichStandardNotizen
--librarybooleanneinausListet stattdessen die Ordner der Bibliothek der Organisation auf, schreibgeschützt: Die Zeilen tragen library: true, und ein by:folder-Selektor kann einen davon benennen, um seine Dateien abzuspielen.
screenrig media folder list
screenrig media folder list --library

Gibt jeden Ordner des Projekts zurück, höchstens 1000, sortiert nach Name: data.items mit id, name, parent_id (null im Bibliotheksstamm) und revision. Bauen Sie den Baum aus parent_id auf. Der Ordner einer Datei ist folder_id auf media list und media show; er fehlt im Bibliotheksstamm.

media folder show#

Einen Medienordner lesen.

media folder show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie mfd_ Ordner-ID.
screenrig media folder show mfd_01EXAMPLEFOLDER000000000

Der Umschlag enthält die name, parent_id und revision des Ordners.

media folder create#

Erstellen Sie einen Medienordner im Bibliotheksstamm oder in einem anderen Ordner.

media folder create --name NAME [--parent ID]
ParameterTypErforderlichStandardNotizen
--name NAMEstringjakeine1 bis 100 Zeichen, gekürzt. Namen können sich wiederholen.
--parent IDstringneinBibliotheksstammDer mfd_ Ordner, in dem sie erstellt wird.
screenrig media folder create --name Menus
screenrig media folder create --name Lunch --parent mfd_01EXAMPLEFOLDER000000000

Eine Organisation enthält höchstens 1000 Ordner über alle ihre Projekte, verschachtelt bis zu 10 Ebenen tief. Eine Playlist spielt die Dateien eines Ordners mit einem by:folder-Selektor ab.

media folder update#

Einen Medienordner umbenennen oder ihn mit allem Inhalt in einen anderen Ordner verschieben.

media folder update <id> [--name NAME] [--parent ID | --root] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie mfd_ Ordner-ID.
--name NAMEstringMindestens eine von --name, --parent, --rootUnverändertDer neue Name, 1 bis 100 Zeichen.
--parent IDstringMindestens eine von --name, --parent, --rootUnverändertVerschieben Sie den Ordner mit allem Inhalt in diesen mfd_ Ordner. Nicht mit --root.
--rootbooleanMindestens eine von --name, --parent, --rootausVerschieben Sie den Ordner zum Bibliotheksstamm. Nicht mit --parent.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --name Archive
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --root

Ein Ordner kann nicht in sich selbst oder einen darin enthaltenen Ordner verschoben werden, und ein Verschieben muss alle Ordner innerhalb von 10 Ebenen halten. Das Senden der aktuellen Werte ist eine No-Op.

media folder delete#

Einen Medienordner löschen. Seine Dateien und Ordner werden eine Ebene höher verschoben.

media folder delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie mfd_ Ordner-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig media folder delete mfd_01EXAMPLEFOLDER000000000

Löscht nur den Ordner. Seine Dateien und Ordner werden in den übergeordneten Ordner oder in die Bibliothekswurzel verschoben, wenn keiner vorhanden ist. Ein by:folder-Selector, der ihn benennt, trifft dann auf nichts, also weisen Sie diese Playlists zuerst neu zu.

Mediensynchronisierung

Eine Mediensynchronisierung gleicht einen Medienordner mit einem SharePoint-, OneDrive-for-Work-, Dropbox- oder Google-Drive-Ordner ab. Jeder Lauf importiert die Bilder (png, jpeg, webp, gif), Videos (mp4, webm) und Audiodateien (mp3), die direkt im Quellordner liegen; Unterordner werden ignoriert. Eine geänderte Datei ersetzt ihre Bytes unter derselben Medien-ID, sodass jede Playlist, die sie abspielt, aktualisiert wird, und eine an der Quelle entfernte oder herausverschobene Datei verlässt die Wiedergabe: Ihr Medium wird gelöscht oder, solange ein Bildschirm es noch zeigt, in einen Unterordner Removed verschoben und gelöscht, sobald nichts mehr darauf zugreift. Andere Dateien werden mit dem Grund als übersprungen aufgelistet: Zeigen Sie eine Office-Datei oder ein PDF mit einem Dokumentlink in einer Playlist, und exportieren Sie MOV und Ähnliches als MP4 H.264. Eine Playlist spielt den Ordner mit einem by:folder-Selektor ab.

Jede Synchronisierung liest über ein Konto des Projekts. Eine Konto-ID beginnt mit msa_ und eine Synchronisierungs-ID mit msy_. media sync account add microsoft365 speichert Ihre eigene Microsoft-Entra-App oder nennt eine Microsoft-Verbindung des Projekts; media sync account add dropbox gibt einen einmaligen Link für die Person aus, der das Dropbox-Konto gehört; media sync account add google-drive liest die Ordner, die für die Adresse eines Dienstkontos freigegeben sind, von screenRIG oder Ihrem eigenen. Testen Sie das Konto und legen Sie dann aus der Adresse eines Ordners eine Synchronisierung an: Sie ist sofort fällig.

Geben Sie ein Client-Secret mit --secret-file FILE und einen Google-Drive-Schlüssel mit --key-file FILE an, oder - für stdin, nie als Argument. Secrets werden auf dem Server versiegelt und nur als data.secret {set, hint} zurückgegeben. Das Lesen braucht Lesezugriff, und jede Änderung braucht Manage-Zugriff.

media sync account add microsoft365#

Fügt Ihre eigene Microsoft-Entra-App oder eine Microsoft-Verbindung des Projekts hinzu, damit eine Synchronisierung einen SharePoint- oder OneDrive-for-Work-Ordner lesen kann.

media sync account add microsoft365 --name NAME
    (--tenant-id TENANT --client-id ID --secret-file FILE | --connection-id ID)
ParameterTypErforderlichStandardNotizen
--name NAMEstringjakeine1 bis 80 Zeichen.
--tenant-id TENANTstringohne --connection-idkeineDie Verzeichnis-ID (Mandanten-ID) Ihrer Organisation oder deren primäre Domain, etwa contoso.onmicrosoft.com; nie common, organizations oder consumers. Zusammen mit --client-id und --secret-file.
--client-id IDstringohne --connection-idkeineDie Anwendungs-ID (Client-ID) der App-Registrierung, eine GUID.
--secret-file FILEstringohne --connection-idkeineLiest den Wert des Client-Secrets aus dieser Datei oder - für stdin (nie als Argument); die Datei enthält nur den Wert.
--connection-id IDstringohne --tenant-idkeineMeldet sich über eine Microsoft-Verbindung (pcn_…) des Projekts in einem der beiden Modi an, anstelle von --tenant-id, --client-id und --secret-file. Nicht mit ihnen.
screenrig media sync account add microsoft365 --name Contoso --tenant-id contoso.onmicrosoft.com --client-id 0b1d2f3a-4c5e-4f60-8a7b-9c0d1e2f3a4b --secret-file secret.txt
screenrig media sync account add microsoft365 --name Contoso --connection-id pcn_01EXAMPLECONNECTION0000

Registrieren Sie im Microsoft-Entra-Admin-Center eine App mit nur einem Mandanten ohne Weiterleitungs-URI, fügen Sie ein Client-Secret hinzu (kopieren Sie seinen Wert, nicht die Secret-ID), fügen Sie die Microsoft-Graph-Anwendungsberechtigung Sites.Selected hinzu (erteilen Sie der App dann Lesezugriff auf jede Site) oder Files.Read.All und erteilen Sie die Administratorzustimmung. Die App gehört zu diesem Projekt. Führen Sie als Nächstes media sync account test aus.

media sync account add dropbox#

Fügt ein Dropbox-Konto hinzu und gibt den einmaligen Link aus, den die Person, der das Konto gehört, bei Dropbox angemeldet öffnet, um es zu verbinden.

media sync account add dropbox --name NAME [--app-key KEY]
ParameterTypErforderlichStandardNotizen
--name NAMEstringjakeine1 bis 80 Zeichen.
--app-key KEYstringneindie Dropbox-App von screenRIGDer App-Schlüssel Ihrer eigenen Dropbox-App: 1 bis 64 Buchstaben und Ziffern, nie ihr App-Secret.
screenrig media sync account add dropbox --name "Marketing Dropbox"
screenrig media sync account add dropbox --name "Marketing Dropbox" --app-key YOURAPPKEY

data.authorize_url ist der Link und data.authorize_expires_at sein Ablauf. Die CLI öffnet nie einen Browser: Senden Sie den Link an die Person, der das Dropbox-Konto gehört und die den Lesezugriff erlaubt (files.metadata.read, files.content.read, account_info.read). Führen Sie media sync account show aus, bis data.state den Wert ready hat (zu Beginn ist es pending_consent), und dann media sync create dropbox. Ihre eigene Dropbox-App braucht diese aktivierten Berechtigungen und die Redirect-URI, die die Ausgabe nennt.

media sync account add google-drive#

Fügt ein Google-Drive-Konto hinzu, sofort bereit, und gibt die Dienstkonto-Adresse aus, für die Ordner freigegeben werden.

media sync account add google-drive --name NAME [--key-file FILE]
ParameterTypErforderlichStandardNotizen
--name NAMEstringjakeine1 bis 80 Zeichen.
--key-file FILEstringneindas Dienstkonto von screenRIGLiest den JSON-Schlüssel Ihres eigenen Google-Cloud-Dienstkontos aus dieser Datei oder - für stdin (nie als Argument).
screenrig media sync account add google-drive --name "Marketing Drive"
screenrig media sync account add google-drive --name "Marketing Drive" --key-file key.json

data.config.service_account_email ist die Adresse, für die jeder Ordner freigegeben wird; Viewer genügt. Über das Dienstkonto von screenRIG wird ein Ordner nur synchronisiert, wenn ein Mitglied dieses Projekts mit verifizierter E-Mail ihn freigegeben hat oder besitzt (sonst media_sync_sharer_not_member). Mit Ihrem eigenen Schlüssel wird jeder für das Dienstkonto freigegebene Ordner synchronisiert.

media sync account list#

Listet die Konten der Mediensynchronisierung dieses Projekts mit Art, Zustand und letztem Test auf; es wird kein Secret zurückgegeben.

media sync account list

Keine Parameter.

screenrig media sync account list

media sync account show#

Zeigt ein Konto: seinen Mandanten und die Client-ID, den Zustand, das maskierte Secret und den letzten Test.

media sync account show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDas Konto (msa_…).
screenrig media sync account show msa_01EXAMPLEACCOUNT0000000

Ein Dropbox-Konto zeigt zusätzlich, wer es verbunden hat, sowie app_key; ein Google-Drive-Konto zeigt zusätzlich service_account_email.

media sync account update#

Benennt ein Konto um, ändert Mandant, Anwendungs-ID oder Client-Secret einer Microsoft-App oder ersetzt den eigenen Schlüssel eines Google-Drive-Kontos.

media sync account update <id> [--name NAME] [--tenant-id TENANT] [--client-id ID]
    [--secret-file FILE | --key-file FILE] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDas Konto (msa_…).
--name NAMEstringneinUnverändertBenennt das Konto um.
--tenant-id TENANTstringneinUnverändertDie Verzeichnis-ID oder primäre Domain des Mandanten.
--client-id IDstringneinUnverändertDie Anwendungs-ID (Client-ID) der App-Registrierung.
--secret-file FILEstringneinUnverändertLiest den Wert des neuen Client-Secrets aus dieser Datei oder - für stdin; er ersetzt das gespeicherte Secret. Ein ausgelassenes Secret bleibt erhalten.
--key-file FILEstringneinUnverändertLiest den eigenen JSON-Schlüssel eines Google-Drive-Kontos aus dieser Datei oder - für stdin; er muss zum selben Dienstkonto gehören. Nicht mit --secret-file.
--expect-rev REVISIONintegerneinkeineLehnt die Änderung ab, wenn das Konto nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig media sync account update msa_01EXAMPLEACCOUNT0000000 --secret-file new-secret.txt
screenrig media sync account update msa_01EXAMPLEACCOUNT0000000 --name "Contoso tenant" --expect-rev 2

Mindestens eine Änderung ist erforderlich. Eine Änderung der Zugangsdaten löscht last_test: Testen Sie das Konto erneut. Client-Secrets von Entra laufen ab, ersetzen Sie das Secret hier also, bevor es so weit ist.

media sync account connect#

Erzeugt einen neuen einmaligen Link, um ein Dropbox-Konto zu verbinden oder erneut zu verbinden.

media sync account connect <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDas Konto (msa_…).
screenrig media sync account connect msa_01EXAMPLEACCOUNT0000000

data.authorize_url und data.authorize_expires_at tragen den Link, der den früheren ersetzt. Senden Sie ihn an die Person, der das Dropbox-Konto gehört. Verwenden Sie ihn, wenn die Person den Vorgang nicht abgeschlossen hat oder das Konto reconnect_required ist (Dropbox erkennt die Verbindung nicht mehr an). Ein verbundenes Konto bleibt verbunden, bis die neue Zustimmung abgeschlossen ist, und ein anderes Dropbox-Konto, das sich anmeldet, übernimmt die Verbindung.

media sync account test#

Prüft ein Konto: die Anmeldung und die Graph-Berechtigungen einer Microsoft-App oder die Verbindung oder den Schlüssel eines Dropbox- oder Google-Drive-Kontos.

media sync account test <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDas Konto (msa_…).
screenrig media sync account test msa_01EXAMPLEACCOUNT0000000

Die Antwort wird als last_test gespeichert. Bei einer Microsoft-App meldet der Test credentials (Microsoft hat ein Token ausgestellt; eine Ablehnung trägt den AADSTS-Code, etwa AADSTS7000215 für ein Secret, das die ID statt des Werts ist) und permissions (die Graph-Anwendungsberechtigungen, die das Token trägt). Sites.Selected allein ist eine Warnung: Jede Site braucht weiterhin ihre Freigabe, und ein Freigabelink braucht Files.Read.All. Der Test beurteilt weder die Freigabe einer Site noch einen Ordner: media sync create liest den Ordner, den Sie nennen. Eine fehlgeschlagene Prüfung ist data.ok false mit Exit 0.

media sync account delete#

Löscht ein Konto, das keine Synchronisierung nutzt.

media sync account delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDas Konto (msa_…).
--expect-rev REVISIONintegerneinkeineLehnt das Löschen ab, wenn das Konto nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig media sync account delete msa_01EXAMPLEACCOUNT0000000

Solange Synchronisierungen das Konto nutzen, lautet die Antwort resource_conflict (Exit 5) und nennt sie: Löschen Sie diese zuerst.

media sync create sharepoint#

Synchronisiert einen SharePoint- oder OneDrive-for-Work-Ordner in einen Medienordner.

media sync create sharepoint --account-id ID --url URL [--folder-id ID] [--every DURATION] [--name NAME]
ParameterTypErforderlichStandardNotizen
--account-id IDstringjakeineDas Konto, über das gelesen wird (msa_…).
--url URLstringjakeineDie SharePoint-Adresse des Ordners, etwa https://contoso.sharepoint.com/sites/Marketing/Shared%20Documents/Lobby%20Signs, die mit Sites.Selected funktioniert, sobald die Site freigegeben wurde, oder sein Freigabelink (Teilen, Link kopieren), der Files.Read.All braucht. Persönliches OneDrive (onedrive.live.com, 1drv.ms) kann mit einer Organisations-App nicht gelesen werden.
--folder-id IDstringneinein neuer, nach dem Quellordner benannter MedienordnerDer Medienordner (mfd_…), in dem die Dateien landen.
--every DURATIONstringnein15mWie oft nach Änderungen gesucht wird, 5 Minuten bis 24 Stunden: 15m, 1h, 6h oder reine Sekunden (300 bis 86400).
--name NAMEstringneinder Name des Quellordners1 bis 80 Zeichen.
screenrig media sync create sharepoint --account-id msa_01EXAMPLEACCOUNT0000000 --url https://contoso.sharepoint.com/sites/Marketing/Shared%20Documents/Lobby%20Signs
screenrig media sync create sharepoint --account-id msa_01EXAMPLEACCOUNT0000000 --url "https://contoso.sharepoint.com/:f:/s/Marketing/EabcDEF" --folder-id mfd_01EXAMPLEFOLDER000000000 --every 1h --name "Lobby signs"

Ein Ordner, den Microsoft ablehnt, ist media_sync_source_refused (Exit 5), mit der zu erteilenden Berechtigung; es wird nichts gespeichert.

media sync create dropbox#

Synchronisiert einen Dropbox-Ordner in einen Medienordner.

media sync create dropbox --account-id ID --url URL|PATH [--folder-id ID] [--every DURATION] [--name NAME]
ParameterTypErforderlichStandardNotizen
--account-id IDstringjakeineDas verbundene Dropbox-Konto, über das gelesen wird (msa_…).
--url URLstringjakeineDie Dropbox-Adresse des Ordners (https://www.dropbox.com/home/...), ein Link zu einem freigegebenen Ordner, den das Konto zu seinem Dropbox hinzugefügt hat, oder ein Pfad, der mit / beginnt. Ein Ordner in einem Team-Space wird vom Stammverzeichnis des Teams aus gelesen.
--folder-id IDstringneinein neuer, nach dem Quellordner benannter MedienordnerDer Medienordner (mfd_…), in dem die Dateien landen.
--every DURATIONstringnein15mWie oft nach Änderungen gesucht wird, 5 Minuten bis 24 Stunden: 15m, 1h, 6h oder reine Sekunden (300 bis 86400).
--name NAMEstringneinder Name des Quellordners1 bis 80 Zeichen.
screenrig media sync create dropbox --account-id msa_01EXAMPLEACCOUNT0000000 --url https://www.dropbox.com/home/Marketing/Lobby%20Signs
screenrig media sync create dropbox --account-id msa_01EXAMPLEACCOUNT0000000 --url /Marketing/Lobby --folder-id mfd_01EXAMPLEFOLDER000000000 --every 1h --name "Lobby signs"

Jeder Lauf setzt an der von Dropbox gespeicherten Position im Ordner fort und liest nur, was sich geändert hat. Ein Ordner, den das Konto nicht öffnen kann, ist media_sync_source_refused, und eine Verbindung, die Dropbox nicht mehr anerkennt, ist dropbox_reconnect_required (media sync account connect): beide mit Exit 5, nichts wird gespeichert.

media sync create google-drive#

Synchronisiert einen Google-Drive-Ordner, der für das Dienstkonto eines Kontos freigegeben ist, in einen Medienordner.

media sync create google-drive --account-id ID --url URL|ID [--folder-id ID] [--every DURATION] [--name NAME]
ParameterTypErforderlichStandardNotizen
--account-id IDstringjakeineDas Google-Drive-Konto, über das gelesen wird (msa_…).
--url URLstringjakeineDie Adresse des Ordners (https://drive.google.com/drive/folders/ID) oder seine ID. Geben Sie den Ordner zuerst für die service_account_email des Kontos frei; Viewer genügt.
--folder-id IDstringneinein neuer, nach dem Quellordner benannter MedienordnerDer Medienordner (mfd_…), in dem die Dateien landen.
--every DURATIONstringnein15mWie oft nach Änderungen gesucht wird, 5 Minuten bis 24 Stunden: 15m, 1h, 6h oder reine Sekunden (300 bis 86400).
--name NAMEstringneinder Name des Quellordners1 bis 80 Zeichen.
screenrig media sync create google-drive --account-id msa_01EXAMPLEACCOUNT0000000 --url https://drive.google.com/drive/folders/1AbCdEfGhIjKlMnOpQrStUvWxYz --folder-id mfd_01EXAMPLEFOLDER000000000 --every 1h
screenrig media sync create google-drive --account-id msa_01EXAMPLEACCOUNT0000000 --url 1AbCdEfGhIjKlMnOpQrStUvWxYz

Über das Dienstkonto von screenRIG wird der Ordner nur synchronisiert, wenn ein Mitglied dieses Projekts mit verifizierter E-Mail ihn freigegeben hat oder besitzt (media_sync_sharer_not_member, Exit 3, nichts wird gespeichert). Jeder Lauf prüft das erneut, und ein Ordner, der einen solchen Freigeber verliert, stoppt die Synchronisierung im Zustand error, wobei ihre Medien erhalten bleiben: Geben Sie ihn erneut über das Google-Konto eines Mitglieds frei und führen Sie dann media sync update ID --resume aus. Dateien aus Google Docs, Sheets und Slides werden als unsupported_type übersprungen. Ein Ordner, den die Adresse nicht öffnen kann, ist media_sync_source_refused (Exit 5): Geben Sie ihn für das Dienstkonto frei.

media sync list#

Listet die Mediensynchronisierungen dieses Projekts mit Medienordner, Rhythmus, Zustand und Status des letzten Laufs auf.

media sync list

Keine Parameter.

screenrig media sync list

media sync show#

Zeigt eine Synchronisierung und die Zusammenfassung ihres letzten Laufs.

media sync show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Synchronisierung (msy_…).
screenrig media sync show msy_01EXAMPLESYNC000000000

data.last_run enthält status (ok, partial oder error), added, updated, removed, pending_delete (entfernte Dateien, die ein Bildschirm noch hält und die im Ordner Removed warten) und skipped mit dem Grund jeder Datei (unsupported_type, too_large, storage, subfolder, download_failed, unreadable, in_use); ein fehlgeschlagener Lauf enthält error mit einem code und einem detail, die die Behebung nennen. data.source fügt path für Dropbox und shared_by für Google Drive hinzu.

Eine Synchronisierung im Zustand error muss repariert werden. Ihr Medienordner wurde gelöscht: Richten Sie sie mit media sync update --folder-id auf einen anderen aus. Ihr Quellordner wurde gelöscht oder verschoben: Löschen Sie die Synchronisierung und legen Sie eine neue an. Bei Google Drive über das Dienstkonto von screenRIG hat der Ordner seinen verifizierten Freigeber verloren (sharer_not_member): Geben Sie ihn erneut über das Google-Konto eines Projektmitglieds frei und führen Sie dann media sync update ID --resume aus. Ein Dropbox-Lauf schlägt mit reconnect_required fehl, wenn Dropbox die Verbindung nicht mehr anerkennt (media sync account connect).

media sync update#

Ändert Name, Rhythmus oder Medienordner einer Synchronisierung oder pausiert und setzt sie fort.

media sync update <id> [--name NAME] [--every DURATION] [--folder-id ID]
    [--pause | --resume] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Synchronisierung (msy_…).
--name NAMEstringneinUnverändertBenennt die Synchronisierung um.
--every DURATIONstringneinUnverändertWie oft nach Änderungen gesucht wird, 5 Minuten bis 24 Stunden.
--folder-id IDstringneinUnverändertFüllt stattdessen diesen Medienordner (mfd_…). Der nächste Lauf liest die gesamte Quelle erneut und legt jede synchronisierte Datei darin ab.
--pausebooleanneinausHält die Ausführung an, bis sie fortgesetzt wird. Nicht mit --resume.
--resumebooleanneinausLäuft wieder; startet auch eine durch einen Fehler gestoppte Synchronisierung neu. Nicht mit --pause.
--expect-rev REVISIONintegerneinkeineLehnt die Änderung ab, wenn die Synchronisierung nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig media sync update msy_01EXAMPLESYNC000000000 --every 1h
screenrig media sync update msy_01EXAMPLESYNC000000000 --pause
screenrig media sync update msy_01EXAMPLESYNC000000000 --folder-id mfd_01EXAMPLEFOLDER000000000 --expect-rev 3

Mindestens eine Änderung ist erforderlich.

media sync run#

Führt eine Synchronisierung jetzt statt zu ihrem nächsten Zeitpunkt aus.

media sync run <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Synchronisierung (msy_…).
screenrig media sync run msy_01EXAMPLESYNC000000000

Die Synchronisierung läuft innerhalb von etwa 30 Sekunden, und media sync show zeigt dann ihren letzten Lauf. Eine pausierte Synchronisierung muss zuerst fortgesetzt werden.

media sync delete#

Stoppt eine Synchronisierung; ihre Medien und ihr Ordner bleiben erhalten.

media sync delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Synchronisierung (msy_…).
--expect-rev REVISIONintegerneinkeineLehnt das Löschen ab, wenn die Synchronisierung nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig media sync delete msy_01EXAMPLESYNC000000000

Die Synchronisierung vergisst, welche Quelldatei zu welchem Medium wurde. Die importierten Medien und der Medienordner bleiben erhalten, und nichts wird entfernt.

Anwendungen

Eine Anwendung ist ein bereits erstelltes statisches Verzeichnis mit einer Wurzel index.html. Der Packer injiziert das Browser-SDK bei _screenrig/runtime.js und fügt sein Skript-Tag hinzu, sodass die App window.screenrig ohne Build-Schritt und ohne Abhängigkeiten erreicht. Nichts im Verzeichnis wird während des Packens gebaut oder ausgeführt.

app pack#

Packen Sie ein statisches Verzeichnis in ein deterministisches Archiv, ohne es hochzuladen.

app pack <directory> [--output FILE]
ParameterTypErforderlichStandardNotizen
<directory>PfadjakeineDas erstellte statische Verzeichnis. Es benötigt ein Root-index.html.
--output FILEPfadneinnichts geschriebenSchreiben Sie das Archiv auch an diesen Pfad. Ohne diesen meldet der Befehl das Archiv und behält es im Speicher.
screenrig app pack ./lobby-board --output ./lobby-board.tgz

Der Umschlag meldet sha256, compressed_bytes, expanded_bytes, file_count, die Eintragsliste und ob die SDK-Laufzeit injiziert wurde. app upload packt das Verzeichnis selbst, greifen Sie also nur zu diesem Befehl, wenn Sie das Archiv zuerst inspizieren wollen.

Anwendungen laufen unter einer Content-Security-Policy, die Inline-Code blockiert. Packing verschiebt Inline-Style- und Script-Blöcke in Dateien unter _screenrig/inline/ und verlinkt sie. Inline-Event-Handler wie onclick= und javascript: URLs können nicht verschoben werden; Packing lehnt sie ab und nennt Datei und Zeile.

app upload#

Packen Sie ein Verzeichnis, veröffentlichen Sie es als neue Anwendungsfreigabe und warten Sie, bis die Veröffentlichung erfolgreich ist.

app upload <directory> [--name NAME] [--no-wait] [--poll-ms MS] [--timeout MS]
ParameterTypErforderlichStandardNotizen
<directory>PfadjakeineDas erstellte statische Verzeichnis.
--name NAMEstringneinkeineAnwendungsname, maximal 120 Zeichen.
--no-waitbooleanneinausGibt zurück, bevor der Veröffentlichungsprozess abgeschlossen ist. Führen Sie operations wait aus, bevor Sie die Version in eine Playlist einfügen.
--poll-ms MSintegernein1000Intervall zwischen Abfragen von Operationen während des Wartens.
--timeout MSintegernein120000Frist für das Warten. Sie begrenzt auch jede zugrunde liegende Anfrage.
screenrig app upload ./lobby-board --name "Lobby board"

Lese drei Felder: data.operation.state ist succeeded, data.application.release_id ist die rel_ ID, ein application Primitive pinnt, und data.application.id ist die app_ ID, die kv Befehle verwenden. Ein erfolgreicher Vorgang, nicht eine Release-ID allein, bedeutet, dass die Veröffentlichung nutzbar ist.

Jede app upload erstellt eine neue Anwendung und eine erste unveränderliche Version. Um eine spätere Version derselben App zu veröffentlichen, verwenden Sie app update. Eine Playlist bedient weiterhin die Version, die sie bereits festhält, bis Sie dieses Primitive bearbeiten.

app update#

Eine neue Version einer bestehenden Anwendung veröffentlichen und dabei Identität, Namen und Anwendungsschlüssel/Wert erhalten.

app update <id> <directory> [--expect-rev REVISION] [--no-wait] [--poll-ms MS]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie app_ Anwendungs-ID.
<directory>PfadjakeineDas erstellte statische Verzeichnis.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
--no-waitbooleanneinausGibt zurück, bevor der Veröffentlichungsprozess abgeschlossen ist. Führen Sie operations wait aus, bevor Sie die Version in eine Playlist einfügen.
--poll-ms MSintegernein1000Intervall zwischen Abfragen von Operationen während des Wartens.
screenrig app update app_01EXAMPLEAPP00000000000 ./lobby-board

Warten Sie auf data.operation.state: "succeeded" und verwenden Sie dann playlist replace-release, um die genaue Seite, das Primitive, die neue Version und die betroffenen Bildschirme zu überprüfen. Wenden Sie dies mit dem zurückgegebenen Impact-Token und einer optionalen Revisionssperre wie im Playlist-Workflow beschrieben an. Bestehende Playlist-Pins bleiben bis zur Anwendung unverändert. Bei einem Revisionskonflikt lesen Sie die App erneut, bevor Sie entscheiden, ob Sie es erneut versuchen; erstellen Sie keine Ersatzanwendung, nur um den Konflikt zu umgehen.

app list#

Anwendungen des Projekts auflisten.

app list

Keine Parameter.

screenrig app list

app show#

Eine Anwendung lesen.

app show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie app_ Anwendungs-ID.
screenrig app show app_01EXAMPLEAPP00000000000

latest_ready_release fehlt, bis eine erste Veröffentlichung bereit ist. Der Veröffentlichungsstatus lebt auf der Operation und der Version, nicht auf der Anwendung.

app delete#

Eine Anwendung und alle ihre Releases löschen.

app delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie app_ Anwendungs-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig app delete app_01EXAMPLEAPP00000000000

Es gibt kein Löschverfahren pro Release. Solange ein Bildschirm eine der Releases der Anwendung zeigt, antwortet das Löschen mit application_in_use: Geben Sie diesen Bildschirmen zuerst andere Inhalte. Das Löschen prüft keine Playlists, die eine Release anheften, ohne sie anzuzeigen, aktualisieren oder löschen Sie daher auch diese Playlists.

Anwendungs-Schlüssel/Wert

Key/Value-Speicher gehört zu einer Anwendung und ist binärsicher. Jeder Befehl nimmt --app-id mit der app_ ID von app upload und niemals eine Release-ID. Verwenden Sie genau einen Wertmodus pro Schreibvorgang.

kv list#

Für eine Anwendung gespeicherte Schlüssel auflisten.

kv list --app-id ID
ParameterTypErforderlichStandardNotizen
--app-id IDstringjakeineDie app_ Anwendungs-ID.
screenrig kv list --app-id app_01EXAMPLEAPP00000000000

kv get#

Einen Schlüssel lesen.

kv get --app-id ID <key>
ParameterTypErforderlichStandardNotizen
--app-id IDstringjakeineDie app_ Anwendungs-ID.
<key>stringjakeineDer zu lesende Schlüssel.
screenrig kv get --app-id app_01EXAMPLEAPP00000000000 menu

kv set#

Schreiben Sie einen Schlüssel aus JSON, einer Datei oder Base64-Bytes.

kv set --app-id ID <key> --json-value JSON [--expect-rev REVISION]
kv set --app-id ID <key> --file FILE [--content-type TYPE] [--expect-rev REVISION]
kv set --app-id ID <key> --value-base64 BASE64 [--content-type TYPE] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
--app-id IDstringjakeineDie app_ Anwendungs-ID.
<key>stringjakeineDer zu schreibende Schlüssel.
--json-value JSONstringein ModuskeineEin JSON-Wert, vor dem Senden kanonisiert, immer als application/json gespeichert. Ein expliziter application/json Inhaltstyp wird ebenfalls akzeptiert.
--file FILEPfadein ModuskeineLese die Wert-Bytes aus einer Datei oder stdin mit -. Standard ist application/octet-stream.
--value-base64 BASE64stringein ModuskeineKanonisches gepolstertes Standard-Base64 ohne Leerzeichen, maximal 1.398.104 Zeichen. Standard ist application/octet-stream.
--content-type TYPEstringneinapplication/octet-stream für BytesEin bis 127 Zeichen.
--expect-rev REVISIONstringneinkeineNur schreiben, wenn der gespeicherte Eintrag noch auf dieser Revision ist.
screenrig kv set --app-id app_01EXAMPLEAPP00000000000 menu --json-value '{"soup":"lentil"}'

kv delete#

Einen Schlüssel löschen.

kv delete --app-id ID <key> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
--app-id IDstringjakeineDie app_ Anwendungs-ID.
<key>stringjakeineDer zu löschende Schlüssel.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig kv delete --app-id app_01EXAMPLEAPP00000000000 menu

Key/Value-Webhooks

Ein Schlüssel/Wert-Webhook ist eine URL, die einen Schlüssel einer Anwendung schreibt, sodass jedes externe System wie eine Verkaufsstelle, ein Tabellenkalkulationsskript oder ein Cron-Job Daten mit einem HTTP POST an Bildschirme sendet. Eine Anwendung, die sich mit kv.onChange abonniert, aktualisiert innerhalb von Sekunden jeden Bildschirm, der sie ausführt. Eine Anwendung hat höchstens 20 Webhooks.

Der Sender authentifiziert sich mit dem Geheimnis des Webhooks, srkw_…, als Authorization: Bearer <secret> oder mit HTTP Basic unter Verwendung der Webhook-ID als Benutzername und des Geheimnisses als Passwort; ein Geheimnis in der URL oder Abfragezeichenfolge wird nie akzeptiert. Der Rohkörper, höchstens 1 MiB, wird zum Wert des Schlüssels und Content-Type zum Inhaltstyp. Jeder Post ist eine berechnete API-Anfrage, wird gemessen und zählt zum Speicher wie kv set, erhöht die Revision und antwortet mit den neuen Metadaten des Schlüssels, nie mit dessen Wert. Ein optionaler Idempotency-Key-Header dedupliziert Wiederholungen eines Senders für 24 Stunden. Ein Webhook nimmt höchstens 120 Posts pro Minute an, und ein fehlendes oder falsches Geheimnis oder ein unbekannter Webhook antwortet mit 401. Push-Daten von einem anderen System enthält curl Beispiele.

Das Geheimnis wird nur von kv webhook create und kv webhook rotate-secret angezeigt. Die URL ist nicht geheim. Das Erstellen, Drehen und Löschen eines Webhooks fügt kv_webhook.created, kv_webhook.secret_rotated und kv_webhook.deleted dem Projekt-Ereignisprotokoll hinzu, und jeder Post fügt kv.updated wie jeder Schreibvorgang hinzu.

ProblemcodeBeendenBedeutung
kv_webhook_limit_reached5Die Anwendung hat bereits 20 Webhooks. Es wurde nichts erstellt. Löschen Sie zuerst einen.
not_found4Die Anwendung ist nicht in diesem Projekt oder kein Webhook mit dieser ID ist darauf vorhanden.

kv webhook create#

Erstellen Sie einen Webhook, der einen Schlüssel schreibt, und erhalten Sie dessen URL und Geheimnis einmalig.

kv webhook create <key> --app-id ID [--description TEXT]
ParameterTypErforderlichStandardNotizen
<key>stringjakeineDer Schlüssel, den jeder Beitrag schreibt, 1 bis 256 Zeichen: zuerst ein Buchstabe oder eine Ziffer, dann Buchstaben, Ziffern, ., _, :, / oder -. Der Schlüssel muss noch nicht existieren.
--app-id IDstringjakeineDie app_ Anwendungs-ID.
--description TEXTstringneinkeineWas an es gesendet wird, maximal 200 Zeichen. Es darf keine Zugangsdaten enthalten.
screenrig kv webhook create menu --app-id app_01EXAMPLEAPP00000000000 --description "Point of sale menu feed"

Der Umschlag ist der Webhook: data.id (kvw_…), data.key, data.url (https://api.screenrig.ai/api/applications/<app_id>/kv-webhooks/<id>/write) und data.secret (srkw_…). Geben Sie die URL und das Geheimnis jetzt im sendenden System ein. Kein späterer Befehl zeigt dieses Geheimnis erneut an.

kv webhook list#

Webhooks einer Anwendung auflisten, älteste zuerst.

kv webhook list --app-id ID
ParameterTypErforderlichStandardNotizen
--app-id IDstringjakeineDie app_ Anwendungs-ID.
screenrig kv webhook list --app-id app_01EXAMPLEAPP00000000000

Jedes Element hat id, key, description, url, created_at und, sobald es geschrieben wurde, last_used_at. Eine Liste enthält niemals ein Geheimnis.

kv webhook delete#

Einen Webhook löschen. Seine URL funktioniert sofort nicht mehr, der Schlüssel behält seinen Wert.

kv webhook delete <webhook_id> --app-id ID
ParameterTypErforderlichStandardNotizen
<webhook_id>stringjakeineDie kvw_ Webhook-ID.
--app-id IDstringjakeineDie app_ Anwendungs-ID.
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000

kv webhook rotate-secret#

Geheimnis eines Webhooks ersetzen und das neue einmal erhalten.

kv webhook rotate-secret <webhook_id> --app-id ID
ParameterTypErforderlichStandardNotizen
<webhook_id>stringjakeineDie kvw_ Webhook-ID.
--app-id IDstringjakeineDie app_ Anwendungs-ID.
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000

Der Umschlag enthält das neue Geheimnis in data.secret. Das alte Geheimnis funktioniert sofort nicht mehr, daher geben Sie das neue im sendenden System ein.

Karten-Webhooks

Ein Karten-Webhook ist eine URL, die das Datendokument einer Karte schreibt, sodass ein externes System wie ein CMS, eine Verkaufsstelle oder ein Skript mit einem einzigen HTTP POST Daten an eine Karte sendet. kv webhook create, list, rotate-secret und delete akzeptieren --card CARD_ID anstelle von --app-id; update und deliveries unten funktionieren nur für Karten. Eine Karte hat höchstens 20 Webhooks.

kv webhook create --card CARD_ID [--description TEXT] [--map FILE|-] [--signing]
kv webhook list --card CARD_ID
kv webhook rotate-secret <webhook_id> --card CARD_ID [--signing]
kv webhook delete <webhook_id> --card CARD_ID

Beim Erstellen eines Karten-Webhooks ist kein Schlüssel nötig. --map FILE (oder - für stdin) ist das Mapping und --signing schaltet die Signierung ein. Die Antwort enthält data.secret und, wenn der Webhook signiert, data.signing_secret, jeweils nur einmal angezeigt.

Der Absender authentifiziert sich wie bei einem Anwendungs-Webhook: Authorization: Bearer <secret> mit dem Geheimnis srkw_… oder HTTP Basic mit der Webhook-ID als Benutzername, sodass https://kvw_ID:srkw_…@api.screenrig.ai/… für einen Absender geeignet ist, der nur eine URL annimmt. Der Body, höchstens 1 MiB, ist JSON oder application/x-www-form-urlencoded; ein wiederholter Formularname wird zu einem Array. Ohne Mapping ist das gesendete Objekt das Datendokument der Karte.

Ein Mapping ist eine JSON-Vorlage, die das Dokument aus dem Body aufbaut. Ein String mit Platzhaltern wie {{body.alert.title}} oder {{body.items[0].name}} ist Text, und ein String, der genau ein Platzhalter ist, behält den Typ des Werts. Ein Pfad beginnt mit body oder query (die Abfrageparameter der URL), und ein Pfad, der nichts enthält, ist im Text leer und lässt einen einzelnen Wert weg. $each bildet ein Array ab, mit item und index im Gültigkeitsbereich, $group mit $by gruppiert in der Reihenfolge des ersten Auftretens, $number liest 1,234.50, $3.50, 3,50 € oder 12% (fügen Sie "$decimal": "," für ein Dezimalkomma hinzu), $bool liest true, yes, y, 1 und x, und $text mit $max kürzt Text. Die Vorlage wird beim Speichern geprüft: invalid_request nennt die fehlerhafte Stelle.

{
  "title": "{{body.alert.title}}",
  "body": "{{body.alert.message}}",
  "items": { "$each": "{{body.items}}", "$limit": 20, "$template": { "text": "{{item.name}}" } }
}
curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks/kvw_01EXAMPLEWEBHOOK00000/write \
  -H "Authorization: Bearer $CARD_WEBHOOK_SECRET" \
  -H "Content-Type: application/json" \
  --data '{"alert":{"title":"Fire drill","message":"Leave by the east door"},"items":[{"name":"Floor 2"}]}'

Jeder Post wird als die eigenen Daten der Karte geprüft: card_data_invalid nennt den Pfad, und es wird nichts geschrieben. Ein Dokument, das dem aktuellen der Karte entspricht, wird mit unchanged beantwortet und nichts geschrieben, sodass kein Bildschirm geweckt wird. Ein akzeptierter Post ist eine abgerechnete API-Anfrage, ein Webhook nimmt höchstens 120 Posts pro Minute an, und ein Idempotency-Key-Header dedupliziert die Wiederholungen eines Absenders 24 Stunden lang.

Eine falsche Adresse, ein falsches oder fehlendes Geheimnis, ein deaktivierter Webhook, eine fehlende oder falsche Signatur und jedes GET werden mit demselben 404 beantwortet, sodass eine Link-Vorschau oder ein Raten nichts verrät. kv webhook deliveries nennt den Grund.

Mit --signing muss jeder Post außerdem ScreenRig-Signature: t=<unix seconds>,v1=<hex> tragen, wobei v1 der HMAC-SHA256 von t, einem Punkt und dem rohen Body unter dem Signaturgeheimnis whsec_… ist und t höchstens fünf Minuten von der Serveruhr abweichen darf. Es ist das Format der eigenen Webhook-Signaturen von screenRIG.

Signaturen und Handshakes der Anbieter

Anbieter signieren ihre Zustellungen auf ihre eigene Weise, und manche können Ihr Secret gar nicht senden. Ein Karten-Webhook kann die Signatur des Anbieters anstelle des Secrets prüfen und den Einrichtungs-Handshake des Anbieters beantworten, sodass GitHub, Stripe, Shopify, Slack, Linear, Vercel, Asana, Microsoft Graph, monday.com, Trello und Azure Event Grid direkt an ihn senden, ohne Zwischenstation. Jeder andere Sender, der mit HMAC signiert, funktioniert ebenfalls. Setzen Sie verify und handshake über die API, wenn Sie den Webhook anlegen oder ändern (POST /api/cards/{id}/kv-webhooks, dann PATCH /api/cards/{id}/kv-webhooks/{webhook_id}).

  • verify ist {vendor, secret}, plus für generic_hmac den header, die encoding (hex oder base64), einen timestamp_header und tolerance_seconds (standardmäßig 300). Eine Zustellung mit der gültigen Signatur des Anbieters wird ohne das eigene srkw_-Secret des Webhooks akzeptiert, das daneben weiter funktioniert. Das Secret des Anbieters wird versiegelt gespeichert und nur als set und seine letzten vier Zeichen angezeigt. Eine Änderung, die verify ohne secret sendet, behält das gespeicherte, solange der Anbieter derselbe bleibt, und verify: null entfernt die Prüfung. verify und --signing schließen einander aus.
  • handshake ist microsoft_graph, monday, trello oder azure_event_grid, und null entfernt ihn. Slack und Asana beantworten ihre eigenen Handshakes über verify.vendor.
verify.vendorKopfzeileWas signiert wirdZeitstempel
githubX-Hub-Signature-256HMAC-SHA256 des BodyKeine
stripeStripe-SignatureHMAC-SHA256 aus Zeitstempel, einem Punkt und dem Body; jedes v1 darf passen5 Minuten
shopifyX-Shopify-Hmac-Sha256HMAC-SHA256 des Body, in Base64Keine
slackX-Slack-SignatureHMAC-SHA256 aus v0:, dem Zeitstempel, einem Doppelpunkt und dem BodyX-Slack-Request-Timestamp, 5 Minuten
linearLinear-SignatureHMAC-SHA256 des BodywebhookTimestamp im Body, 1 Minute
vercelx-vercel-signatureHMAC-SHA1 des BodyKeine
asanaX-Hook-SignatureHMAC-SHA256 des Body, mit dem X-Hook-Secret des Handshakes als SchlüsselKeine
generic_hmacDer header, den Sie benennenHMAC-SHA256 des Body oder, mit einem timestamp_header, aus Zeitstempel, einem Punkt und dem Bodytolerance_seconds

Der Schlüssel jedes HMAC ist der Text des Secrets, wie ihn der Anbieter zeigt (bei Stripe einschließlich whsec_). Eine Signatur wird am Body genau so geprüft, wie er ankam, in konstanter Zeit, bevor die Zustellung Schreibbudget verbraucht, und sie wird vor ihrem Zeitstempel beurteilt: timestamp_stale bedeutet immer, dass das Secret stimmte. Ein Body kann JSON, ein Formular oder multipart/form-data sein, wobei ein Textfeld body.FIELD ist und Dateien gezählt, nicht gelesen werden.

AnbieterscreenRIG antwortetSpätere Zustellungen
Slack (verify.vendor slack)Das signierte url_verification mit seinem challenge; wer mit curl testet, kann stattdessen das Secret des Webhooks sendenMit dem Signing-Secret signiert
Asana (asana)Der X-Hook-Secret des Handshakes, den es versiegelt als Schlüssel jedes X-Hook-Signature behält. Dasselbe Secret erneut ist ein Wiederholungsversuch; ein anderes wird als handshake_invalid abgelehntX-Hook-Signature
Microsoft Graph (microsoft_graph)Das decodierte ?validationToken= als text/plainTragen das Secret des Webhooks
monday.com (monday)Das challenge, das es sendet, als JSON zurückgegebenTragen das Secret des Webhooks
Trello (trello)Eine HEAD-Prüfung wird mit 200 ohne Body beantwortet, nur für diesen WebhookTragen das Secret des Webhooks
Azure Event Grid (azure_event_grid){"validationResponse": "CODE"}Tragen das Secret des Webhooks

Ein Handshake wird nur für einen Webhook beantwortet, der für diesen Anbieter eingerichtet ist, bevor irgendwelche Zugangsdaten verlangt werden, auf eine Anfrage, die dieser Handshake ist, und nie von einem deaktivierten Webhook. Er schreibt nichts, wird nie abgerechnet und verbraucht kein Ratenbudget. Microsoft Graph, monday.com, Trello und Azure Event Grid senden keinen Header, den screenRIG prüft, daher werden ihre Zustellungen nur mit dem Secret des Webhooks akzeptiert. Azure Event Grid übergibt es als statischen Zustell-Header, Authorization: Bearer srkw_…, als geheim markiert, und seine Ereignisse kommen als Array an, sodass eine Zuordnung body[0] liest.

AnbieterIn den Einstellungen des Anbieters
GitHubSettings, Webhooks, Add webhook: Die Payload URL ist die url des Webhooks, der Content-Typ application/json und dasselbe Secret. Der ping von GitHub ist signiert und wird akzeptiert
StripeWorkbench, Webhooks: Fügen Sie die url hinzu und zeigen Sie das Signing-Secret an. Während Stripe ein Secret rotiert, sendet es für jedes ein v1, und beide werden akzeptiert; ersetzen Sie das gespeicherte Secret danach per PATCH
ShopifyAbonnieren Sie mit der url im JSON-Format. Das Secret ist das Client-Secret der App
SlackDie Request URL der Events API ist die url, und das Secret ist das Signing-Secret der App. Ein Slash-Befehl sendet ein Formular: {{body.text}}, {{body.user_name}}
LinearLegen Sie in den API-Einstellungen einen Webhook mit der url an und kopieren Sie sein Signing-Secret. Der webhookTimestamp im Body muss innerhalb einer Minute zur Uhr des Servers liegen
VercelTeam settings, Webhooks: Legen Sie einen mit der url an. Vercel zeigt das Secret nur einmal
AsanaLegen Sie den Webhook mit {"verify": {"vendor": "asana"}} an: Er hat noch kein Secret und lehnt Ereignisse mit secret_pending ab. Legen Sie dann den Asana-Webhook mit target auf die url gesetzt an, und der Handshake setzt das Secret. Um ein neues Secret zu übernehmen, PATCH mit verify null, dann erneut mit dem Anbieter
Microsoft GraphLegen Sie das Abonnement mit notificationUrl auf die url gesetzt an
monday.comFühren Sie create_webhook mit der url aus
TrelloPOST /1/webhooks mit callbackURL auf die url gesetzt
Azure Event GridLegen Sie das Ereignisabonnement mit der url als Webhook-Endpunkt an und fügen Sie den obigen Zustell-Header hinzu
curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks \
  -H "Authorization: Bearer $SCREENRIG_TOKEN" -H "Content-Type: application/json" \
  --data '{"description":"Pushes","verify":{"vendor":"github","secret":"YOUR_SECRET"},
    "mapping":{"title":"{{body.repository.full_name}}","body":"{{body.head_commit.message}}"}}'

Ein Sender, der mit seinem eigenen HMAC signiert, nennt den Header, die Codierung und, wenn er einen Zeitstempel signiert, den Zeitstempel-Header:

curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks \
  -H "Authorization: Bearer $SCREENRIG_TOKEN" -H "Content-Type: application/json" \
  --data '{"verify":{"vendor":"generic_hmac","secret":"YOUR_SECRET","header":"X-Acme-Signature",
    "encoding":"base64","timestamp_header":"X-Acme-Time","tolerance_seconds":120},
    "mapping":{"title":"{{body.sensor}}","body":"{{body.state}}"}}'
ts=$(date +%s); body='{"sensor":"door","state":"open"}'
sig=$(printf '%s.%s' "$ts" "$body" | openssl dgst -sha256 -hmac "$SECRET" -binary | openssl base64 -A)
curl "$URL" -H "Content-Type: application/json" -H "X-Acme-Time: $ts" -H "X-Acme-Signature: $sig" -d "$body"

Jeder Fehler ergibt dasselbe 404 wie jede andere Ablehnung. kv webhook deliveries zeigt den Grund, und ein Handshake erscheint mit dem Ergebnis handshake:

GrundBedeutung
signature_missingverify ist gesetzt, und die Zustellung trug weder das Secret noch den Header des Anbieters
signature_invalidDer Header ist fehlerhaft oder passt nicht zum Body
timestamp_missingDie Signatur braucht einen Zeitstempel, den die Zustellung nicht trug
timestamp_staleDie Signatur ist gültig, und ihr Zeitstempel liegt außerhalb des Fensters
secret_pendingEine Asana-Verifizierung wartet noch auf ihren Handshake
handshake_invalidDie Anfrage ist der Handshake eines Anbieters und kann nicht beantwortet werden

kv webhook update#

Einen Karten-Webhook ändern: Beschreibung, Mapping, Aktivierungsstatus oder Signierung.

kv webhook update <webhook_id> --card CARD_ID [--description TEXT] [--map FILE|-] [--clear-map]
                   [--enable|--disable] [--signing|--no-signing]
ParameterTypErforderlichStandardNotizen
<webhook_id>stringjakeineDie kvw_ Webhook-ID.
--card CARD_IDstringjakeineDie crd_ Karten-ID.
--description TEXTstringneinkeineWas an es gesendet wird, maximal 200 Zeichen. Es darf keine Zugangsdaten enthalten.
--map FILEPfadneinkeineDas Mapping durch ein JSON-Objekt aus einer Datei ersetzen, oder - für stdin.
--clear-mapbooleanneinausDas Mapping entfernen: Das gesendete Objekt wird zum Dokument.
--enable / --disablebooleanneinaus--disable beantwortet jeden Post wie ein falsches Geheimnis, bis --enable gesetzt wird.
--signing / --no-signingbooleanneinaus--signing verlangt den Signatur-Header und gibt das Signaturgeheimnis einmal aus; --no-signing verlangt ihn nicht mehr.
screenrig kv webhook update kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --map alert-map.json

Der Umschlag ist der Webhook. data.signing_secret erscheint einmal, in der Antwort, die die Signierung eingeschaltet hat.

kv webhook deliveries#

Das Zustellungsprotokoll eines Karten-Webhooks lesen, neueste zuerst, für die letzten sieben Tage.

kv webhook deliveries <webhook_id> --card CARD_ID [--limit N]
ParameterTypErforderlichStandardNotizen
<webhook_id>stringjakeineDie kvw_ Webhook-ID.
--card CARD_IDstringjakeineDie crd_ Karten-ID.
--limit Nnumbernein100Wie viele Zustellungen zurückgegeben werden, 1 bis 100.
screenrig kv webhook deliveries kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000

Jeder Eintrag hat at, outcome (written, unchanged, refused, invalid oder handshake), reason (zum Beispiel credentials, signature, disabled, body, mapping, card_data_invalid oder rate_limited), detail, status, bytes, revision und request_id. Weder Body noch Header noch Zugangsdaten werden gespeichert, und eine Zustellung an eine falsche Adresse hinterlässt keine Zeile.

Playlists

Eine Playlist ist ein JSON-Dokument von Seiten. playlist init bereitet ein Vollbild-Dokument aus geordneten Eingaben vor. playlist create und playlist update lesen dieses Dokument aus einer Datei; die Form wird unter den Befehlen zusammengefasst.

playlist init#

Eine bearbeitbare Vollbild-Playlist aus lokalen Mediendateien, fertigen Medien-IDs, Anwendungsfreigabe-IDs oder HTTP- oder HTTPS-URLs vorbereiten.

playlist init <inputs...> --name NAME --output FILE [--overwrite] [--screen-id ID]
              [--target-width PX --target-height PX] [--duration-ms MS] [--fit contain|cover|fill]
              [--no-transcode] [--no-progress] [--poll-ms MS]
ParameterTypErforderlichStandardNotizen
<inputs...>Dateien, med_ IDs, rel_ IDs oder HTTP- oder HTTPS-URLsjakeineWiedergabereihenfolge. Lokale Bild-/Videodateien werden hochgeladen und warten auf Bereitschaft, es sei denn --no-transcode. Bestehende Medien müssen bereits bereit sein. HTTP- und HTTPS-URLs dürfen LAN-Hosts und eingebettete Zugangsdaten enthalten und werden nicht abgerufen. Die Player-Web-App benötigt HTTPS-URLs ohne Benutzernamen oder Passwort.
--name NAMEstringjakeineAnzeigename der Playlist.
--output FILEPfadjakeineSchreiben Sie das bearbeitbare {name, pages} Dokument. Übergeordnete Verzeichnisse werden erstellt. Standardmäßig exklusiv.
--overwritebooleanneinausEine bestehende Ausgabedatei atomar ersetzen.
--screen-id IDstringneinkeineLesen Sie die Abmessungen und die Revision des Zielbildschirms.
--target-width PX / --target-height PXintegerzusammenNicht festgelegtCanvas-Größe überschreiben. Beide oder keine. Erforderlich, wenn kein Bildschirm angegeben ist oder der Bildschirm unbekannte oder mehrere Oberflächen meldet.
--duration-ms MSintegernein8000Dauer für Nicht-Video-Seiten.
--fitstringneincontaincontain, cover oder fill für Bild- und Videoseiten. Anwendungen und iframes verwenden fill.
--no-transcodebooleanneinausHochgeladene Datei unverändert akzeptiert.
--no-progressbooleanneinausUnterdrücken Sie den Upload-Fortschritt auf stderr.
--poll-ms MSintegernein1000Abfrageintervall hochladen.
screenrig playlist init med_POSTER med_VIDEO --name "Lobby loop" --screen-id scr_LOBBY --output lobby.json

Die Vorbereitung schreibt das lokale Dokument und kann Medien hochladen; sie erstellt weder eine entfernte Playlist noch weist sie einen Bildschirm zu. Dokument prüfen, dann screen publish. Siehe Playlists vorbereiten, veröffentlichen und bearbeiten.

playlist validate#

Validieren Sie ein Playlist-Dokument lokal vor Erstellung oder Aktualisierung. Kein Netzwerk erforderlich.

playlist validate <file>
ParameterTypErforderlichStandardNotizen
<file>PfadjakeineDas Playlist-Dokument.
screenrig playlist validate ./lobby-loop.json

Fehler benennen exakte JSON-Pfade. Ein Bestehen bedeutet, dass lokale Form und feldübergreifende Semantik gültig sind; Autorisierung, Medienbereitschaft, dynamische Selektoranzahlen, Dauern und entfernte Verfügbarkeit erfordern weiterhin Serverprüfungen. Erstellen und Aktualisieren führen diese Prüfung vor dem Schreiben aus. Das Ergebnis enthält außerdem lint-Befunde zur Geometrie, die die Prüfung nicht fehlschlagen lassen: motion_overuse, collision, safe_margin und adjacent_repeat. Um zu sehen, wie eine Seite aussieht, veröffentlichen Sie sie und führen Sie screen screenshot aus.

playlist create#

Eine Playlist aus einem JSON-Dokument, aus einer Vorlage oder aus der integrierten Vorlage „Dringende Mitteilung“ erstellen.

playlist create [file] [--from-template ID --name NAME [--set NAME=VALUE...] [--dry-run]] [--starter KEY [--name NAME]] [--format-region REGION --format-orientation ORIENTATION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
[file]PfadneinkeineDas Playlist-Dokument. Geben Sie es an, oder --from-template, oder --starter.
--from-template IDstringneinkeineDie Playlist aus dieser Vorlage erstellen (eine pl_-ID): ihre aktuellen Seiten mit den --set-Werten, geprüft wie jede Playlist.
--name NAMEstringmit --from-templatekeineDer Name der neuen Playlist.
--set NAME=VALUEstringneinkeineMit --from-template: der Wert eines Felds, bei einem Medienfeld die ID eines bereiten Bildes oder Videos. Wiederholbar.
--dry-runbooleanneinausMit --from-template: die Werte prüfen und die Seitenzahl melden, ohne etwas zu erstellen.
--starter KEYstringneinkeineEine integrierte Vorlage hinzufügen: urgent-notice, eine Überschrift und eine Nachricht für schnelle Ankündigungen.
--format-region REGIONstringneinkeineheader, footer oder side: macht die Playlist zu einem Streifen, der entlang dieser Kante über die Seite gelegt wird, und ersetzt ein format in der Datei. Geben Sie ihn zusammen mit --format-orientation an. Siehe Streifen.
--format-orientation ORIENTATIONstringmit --format-regionkeinelandscape oder portrait: die Ausrichtung des Displays, für das der Streifen gemacht ist, wie der Betrachter sie sieht.
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung überprüft: Klartext, höchstens 280 Zeichen. Wird ignoriert, wenn die Änderung sofort angewendet wird.
screenrig playlist create ./lobby-loop.json
screenrig playlist create --from-template pl_01EXAMPLETEMPLATE00000 --name "Monday notice" --set headline="Open late"

data.id der Antwort ist die pl_-ID, die screen assign erwartet. Wartet die Änderung auf Prüfung, ist data gleich {status: pending_review, review, playlist}: Die Playlist existiert mit approved_revision: 0, und kein Bildschirm kann sie zeigen, bis eine Person genehmigt (playlist_not_approved). Eine Vorlage ist eine Playlist, die fields deklariert; sie wird nie auf einem Bildschirm gezeigt (playlist_is_template), und eine daraus erstellte Playlist ist eine gewöhnliche, die sich zuweisen, planen und überarbeiten lässt.

playlist update#

Ein Playlist-Dokument ersetzen.

playlist update <id> <file> [--format-region REGION --format-orientation ORIENTATION] [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie pl_ Playlist-ID.
<file>PfadjakeineDas Ersatzdokument.
--format-region REGIONstringneinkeineheader, footer oder side: macht die Playlist zu einem Streifen, der entlang dieser Kante über die Seite gelegt wird, und ersetzt ein format in der Datei. Geben Sie ihn zusammen mit --format-orientation an. Siehe Streifen.
--format-orientation ORIENTATIONstringmit --format-regionkeinelandscape oder portrait: die Ausrichtung des Displays, für das der Streifen gemacht ist, wie der Betrachter sie sieht.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung überprüft: Klartext, höchstens 280 Zeichen. Wird ignoriert, wenn die Änderung sofort angewendet wird.
screenrig playlist update pl_01EXAMPLEPLAYLIST000000 ./lobby-loop.json

Wenn die Änderung auf Überprüfung wartet, wird die Live-Playlist unverändert weiter abgespielt, bis eine Person den Vorschlag genehmigt.

playlist show#

Eine Playlist lesen, einschließlich ihrer aktuellen Revision.

playlist show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie pl_ Playlist-ID.
screenrig playlist show pl_01EXAMPLEPLAYLIST000000

Sie gibt die Live-Version zurück. approved_revision ist 0 für eine Playlist, die noch keine Person genehmigt hat, und approval nennt die offene Überprüfung, während eine Änderung wartet; reviews show ID gibt den Vorschlag zurück.

playlist list#

Playlists des Projekts auflisten.

playlist list [--templates] [--library]
ParameterTypErforderlichStandardNotizen
--templatesbooleanneinausNur Vorlagen: Playlists, die Felder deklarieren.
--librarybooleanneinausListet stattdessen die Playlists der Bibliothek der Organisation auf, schreibgeschützt: Weisen Sie sie Bildschirmen, Zeitplänen und Stapeln zu oder kopieren Sie eine mit playlist create --from-template; ändern Sie sie nur im Bibliotheksprojekt.
screenrig playlist list --templates
screenrig playlist list --library

playlist fields#

Die Felder einer Vorlage oder die Werte einer Kopie anzeigen, oder die Werte ändern und die Kopie auf den neuesten Stand bringen.

playlist fields <id> [--set NAME=VALUE...] [--clear NAME...] [--refresh] [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie pl_-ID einer Vorlage oder einer daraus erstellten Playlist.
--set NAME=VALUEstringneinkeineDen Wert eines Felds setzen. Wiederholbar.
--clear NAMEstringneinkeineDen Wert eines optionalen Felds löschen. Wiederholbar.
--refreshbooleanneinausDie Seiten unabhängig von den Werten neu aus der aktuellen Version der Vorlage erstellen.
--expect-rev REVISIONstringneinkeineOptional diese Ressourcenversion verlangen.
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung prüft.
screenrig playlist fields pl_01EXAMPLECOPY00000000 --set headline="Closed today"

Ohne Optionen zeigt es die Felder einer Vorlage und wie viele Playlists daraus erstellt wurden, oder die Werte einer Kopie, die Vorlagenversion, aus der sie erstellt wurde, und ob die Vorlage eine neuere hat. Jede Änderung und --refresh allein erstellt die Seiten der Kopie neu aus der aktuellen Version der Vorlage; so erreicht eine Markenänderung an der Vorlage bestehende Kopien, nichts wird automatisch übertragen. Werte werden wie beim Erstellen geprüft. Mit Propose-Zugriff wird eine Änderung zur Prüfung.

playlist instances#

Die aus einer Vorlage erstellten Playlists und die Vorlagenversion, aus der jede erstellt wurde, auflisten.

playlist instances <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie pl_-ID der Vorlage.
screenrig playlist instances pl_01EXAMPLETEMPLATE00000

outdated kennzeichnet eine Playlist, die aus einer älteren Version der Vorlage erstellt wurde; playlist fields ID --refresh bringt sie auf den neuesten Stand.

playlist revisions#

Die Revisionen einer Playlist auflisten, die neueste zuerst.

playlist revisions <id> [--after CURSOR]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie pl_ Playlist-ID.
--after CURSORstringneinkeineDie next_cursor der vorherigen Seite.
screenrig playlist revisions pl_01EXAMPLEPLAYLIST000000

Jede Revision nennt, was sie erzeugt hat (created, edited, promoted mit der kopierten Revision oder baseline, die Revision, die die Playlist hatte, als ihr Verlauf begann), wer sie erstellt hat, wann, wie viele Seiten sie enthält und ob sie aktuell ist. Eine Seite enthält 50 Revisionen; next_cursor liest die nächste.

playlist revision show#

Eine Revision lesen und die Playlist, wie sie zu diesem Zeitpunkt war.

playlist revision show <id> --revision N
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie pl_ Playlist-ID.
--revision NintegerjakeineDie zu lesende Revision.
screenrig playlist revision show pl_01EXAMPLEPLAYLIST000000 --revision 3

playlist promote#

Eine frühere Revision wieder aktuell machen, indem sie als neue Revision übernommen wird.

playlist promote <id> --revision N --expect-rev CURRENT
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie pl_ Playlist-ID.
--revision NintegerjakeineDie Revision, die übernommen wird.
--expect-rev CURRENTstringjakeineDie aktuelle Revision der Playlist (playlist show). Ein veralteter Wert ist revision_conflict: die Playlist erneut lesen und erneut versuchen.
screenrig playlist promote pl_01EXAMPLEPLAYLIST000000 --revision 3 --expect-rev 9

Seiten, Soundtrack und Format der Revision werden zur nächsten Revision. Der Name bleibt, frühere Revisionen bleiben in der Liste, und jeder Bildschirm, der die Playlist zeigt, wird aktualisiert. Das Hochstufen braucht eine Berechtigung, die live veröffentlicht; eine, deren Änderungen auf eine Prüfung warten, erhält forbidden. Eine Revision, deren Inhalt bereits aktuell ist, ändert nichts.

playlist delete#

Eine Playlist löschen.

playlist delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie pl_ Playlist-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig playlist delete pl_01EXAMPLEPLAYLIST000000

playlist export#

Bild- und Videodateien, Soundtrack-Audio und iframe-URLs als portables Playlist-Bundle exportieren.

playlist export <id> --output DIRECTORY [--skip-applications]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie pl_ Playlist-ID.
--output DIRECTORYPfadjakeineZielverzeichnis. Es darf noch nicht existieren; das Bundle wird über ein temporäres Geschwister geschrieben und an den Platz umbenannt.
--skip-applicationsFlagneinausAnwendungsprimitive sowie leere oder von Anwendungen gesteuerte Seiten verwerfen. Mindestens eine Seite muss übrig bleiben. Das Ergebnis listet die IDs der übersprungenen Primitive und Seiten auf.
screenrig playlist export pl_01EXAMPLEPLAYLIST000000 --output ./lobby-bundle

Das Bundle enthält ein Manifest, das Playlist-Dokument und inhaltsadressierte Bild-, Video- und Soundtrack-Audiodateien. Dynamische Selektoren all, tag und folder werden als exakte IDs festgehalten, iframe-URLs bleiben erhalten und Kommentare sind ausgeschlossen.

Karten, Streams und adslot-Seiten stoppen den Export vor dem Download der Medien. Anwendungen stoppen ihn ebenfalls standardmäßig; --skip-applications entfernt Anwendungsprimitive sowie leere oder von Anwendungen gesteuerte Seiten und meldet die IDs der übersprungenen Primitive und Seiten. Mindestens eine Seite muss übrig bleiben. Karten, Streams und adslot-Seiten stoppen den Export auch mit dieser Option.

Für ein bearbeitbares Dokument, das Karten- und Anwendungsreferenzen beibehält, verwenden Sie screenrig playlist show pl_01EXAMPLEPLAYLIST000000 --output playlist.json. Das Dokument verwendet vorhandene Ressourcen desselben Projekts.

playlist import#

Erstellen Sie eine Playlist aus einem Bundle-Verzeichnis oder aktualisieren Sie eine bestehende daraus.

playlist import <directory> [--name NAME] [--update ID [--expect-rev REVISION] [--note TEXT]]
ParameterTypErforderlichStandardNotizen
<directory>PfadjakeineEin Bundle-Verzeichnis, geschrieben von playlist export.
--name NAMEstringneinName der Bundle-Playlist1 bis 120 Zeichen. Importieren Sie das Bundle als neue Playlist unter diesem Namen.
--update IDstringneineine neue Playlist wird erstelltDiese pl_ Playlist aktualisieren statt eine neue zu erstellen. Akzeptiert optional --expect-rev.
--expect-rev REVISIONstringneinkeineDie aktuelle Revision der Ziel-Playlist.
--note TEXTstringneinkeineMit --update: eine Notiz für die Person, die die Änderung überprüft, maximal 280 Zeichen.
screenrig playlist import ./lobby-bundle
screenrig playlist import ./lobby-bundle --name "Lobby loop (copy)"

Anzeigenamen von Playlists können sich wiederholen. Import erstellt eine separate Playlist, auch wenn der Name übereinstimmt; verwenden Sie --update mit einer ID, um eine vorhandene Playlist zu ersetzen.

Import validiert das gesamte Bundle lokal, bevor es das Projekt berührt: Manifest, Dokument, Pfade, Medientypen, Längen und Hashes. Bestehende Medien werden bei exaktem Dateinamen-, Medientyp-, Byte-Längen-, Hash- und Tag-Abgleich wiederverwendet; der Rest wird ohne Konvertierung hochgeladen, und die Playlist wird erst geschrieben, wenn jedes Objekt bereit ist.

Import löscht oder kürzt entfernte Medien niemals. Wenn ein späterer Schritt nach Beginn eines Uploads fehlschlägt, listet der Fehler die bestätigten bereiten Objekte auf und gibt an, ob der Playlist-Schreibvorgang begonnen hat. Ein erneuter Versuch desselben Bundles verwendet diese Objekte wieder.

Das Playlist-Dokument

Eine Playlist ist name plus pages, mit einem optionalen audio-Soundtrack. Jede Seite enthält id, canvas, transition, advance, optional visibility, optional audio_cue und primitives.

Eine Vorlage fügt dem Dokument fields hinzu, [{name, label, type, required, max_length?}] mit type von text, media oder url, und kann jedes Primitiv als locked: true markieren. Eine Seite liest ein Feld als {field.NAME} in den params einer Karte (Text- und URL-Felder), als selector.media_id eines Bild- oder Videos (ein Medienfeld) oder als gesamtes src eines Iframes (ein URL-Feld). Jeder Platzhalter muss ein deklariertes Feld des richtigen Typs nennen, jedes Feld muss gelesen werden, und ein gesperrtes Primitiv liest keines; playlist validate prüft das offline. Nur die Inhaberin oder der Inhaber oder ein Mitglied, das genehmigen darf, ändert ein gesperrtes Primitiv (primitive_locked).

Die sechs Primitiven sind image, hochgeladen video, live stream, web iframe und application, sowie card. Copy und chrome sind keine Wire-Typen: Platzieren Sie eine card für Live-Text oder laden Sie ein fertiges Standbild hoch (media generate erzeugt eines) und platzieren Sie es als Bild.

Ein Stream verwendet eine oder zwei geordnete Quellen mit einzigartigen Protokollen und ein bereites Bild aus demselben Projekt als fallback_media_id. Verwenden Sie höchstens einen Stream pro Seite und dauerbasierte Fortschritte. HLS verwendet eine öffentliche HTTPS-URL; Android- und Qt-Player verbinden sich einschließlich der Anmeldedaten direkt mit RTSP-Kamerastreams. Die Details zum Kameratransport beschreiben die URL-Formate, die jeder Player öffnet; optionales direktes UDP/MPEG-TS-Multicast auf Android und Qt verwendet eine IPv4-Gruppe in 239/8 und einen Port. Eine Quelle kann nur ihre url angeben und das Schema das Protokoll bestimmen lassen. Andere Player wählen die HLS-Alternative oder zeigen den Fallback an. Stream-Bytes werden für die Wiedergabe nicht zwischengespeichert. Audio ist standardmäßig stummgeschaltet. Der Import und Export von Playlist-Bundles unterstützt keine Streams.

{
  "id": "live",
  "primitive": "stream",
  "sources": [
    {
      "protocol": "udp-mpegts",
      "group": "239.10.0.1",
      "port": 5000
    },
    {
      "protocol": "hls",
      "url": "https://example.com/live.m3u8"
    }
  ],
  "fallback_media_id": "med_fallback",
  "muted": true,
  "rect": {
    "x": 0,
    "y": 0,
    "width": 1920,
    "height": 1080
  },
  "layer": 0,
  "content_fit": "contain"
}

Verwenden Sie dieses Primitive auf einer Seite mit advance: {"mode":"duration","after_ms":30000}. Ersetzen Sie den Beispiel-Feed und die Fallback-ID. Player-Anforderungen und Transport-Einrichtung.

Jedes Primitive ist flach: id, primitive, die eigenen Felder dieses Primitives, dann rect, layer, content_fit und optional enter. Es gibt kein verschachteltes Inhaltsobjekt.

Bild- und Video-Primitive erfordern ein selector. selector.by ist id mit einem bereiten media_id und one_at_a_time false, ids mit 1 bis 1.024 eindeutigen bereiten media_ids, all für jedes bereite Objekt dieses Primitivs, tag passend zu ^[A-Za-z0-9]{1,32}$, oder folder mit dem folder_id eines vorhandenen mfd_ Medienordners, der die bereiten Dateien direkt darin abspielt und keine seiner Unterordner. Setzen Sie media_id nicht auf das Primitiv selbst und senden Sie keine vom Server aufgelösten Elemente. Ein application-Primitiv fixiert ein release_id und ein iframe-Primitiv nimmt ein src und einen Titel, sodass keines von beiden einen Selektor akzeptiert. src ist jede http- oder https-Seite, die der Bildschirm erreichen kann, einschließlich einer LAN-Seite oder einer Seite hinter einem Login; ein YouTube-Link wird als sein automatisch abspielendes Embed gespeichert. src und das optionale fallback_src eines Iframes können Bildschirm-Token wie {screen.field.kiosk_id} tragen, und ein application-Primitiv kann params mit denselben Token tragen, sodass eine Playlist jedem Bildschirm seine eigene Seite gibt. Die Player für Android, Amazon Signage Stick, Linux, Raspberry Pi und Windows öffnen die Seite selbst. Die Player-Web-App und die Player für macOS, Samsung Tizen, LG webOS und BrightSign binden sie in einen Frame ein, sodass eine Seite, die X-Frame-Options sendet (DENY, SAMEORIGIN oder das veraltete ALLOW-FROM), oder eine Content-Security-Policy-frame-ancestors-Liste ohne den Ursprung des Players dort einen blockierten Frame zeigt, und die Player-Web-App zeigt nur https-Seiten ohne Login in der Adresse. Erkennt das Veröffentlichen eine öffentliche HTTPS-Seite, die das Einbetten verweigert, gelingt der Schreibvorgang trotzdem, und die CLI gibt den warnings-Eintrag des Servers aus: Code iframe_framing_refused, page_id, primitive_id und src, den Header, der abgelehnt hat, und den nächsten Schritt (eine Seite verwenden, die das Einbetten vom Ursprung des Players erlaubt, oder deren Inhaber bitten, diesen Ursprung zu erlauben). Der Server hängt außerdem eine playlist.iframe_framing_refused-Warnung an das Ereignisprotokoll an, eine pro ablehnender Seite, die events list mit primitive_id ausgibt. Eine LAN-Seite, eine http-Seite und eine Seite, die der Server innerhalb weniger Sekunden nicht erreicht, werden nicht geprüft. Ein Player meldet eine Playlist als spielend, sobald ihr Manifest auf dem Bildschirm ist, sodass ein verifiziertes Veröffentlichen nicht beweist, dass eine Iframe-Seite gerendert wurde: Handeln Sie auf die Warnung oder sehen Sie auf den Bildschirm. Beide Web-Primitive erfordern content_fit von fill, weil keines eine intrinsische Größe hat.

advance.mode ist duration mit after_ms, das auf einer Seite mit genau einem YouTube-Video (keine Playlist und kein Livestream) auch until mit dem Wert video_end tragen kann, damit die Seite bis zum Ende des Videos läuft und after_ms die Anzeigedauer ist, wenn der Bildschirm die Länge des Videos nicht lesen kann, media_end auf einer Seite mit genau einem Bild- oder Videoelement, audio_end auf einer Seite, deren audio_cue eine Soundtrack-Spur benennt, oder application mit max_ms, wenn die App ihren eigenen Zug beendet, indem sie window.screenrig.nextPage() aufruft. Eine application-Seite benötigt genau ein als controller markiertes Element; jeder andere Modus verbietet das.

transition.type ist eines von crossfade, swipe-left, swipe-right, swipe-up, swipe-down, dip, wipe-left, wipe-right, wipe-up, wipe-down, slide-left, slide-right, slide-up, slide-down oder stinger. duration_ms ist erforderlich, Werte von 0 bis 60000. Die Standardseite ist ein 200 ms Crossfade. Swipe bewegt beide Seiten zusammen wie ein Karussell. Slide schiebt die eingehende Seite über die ausgehende, die um ein Viertel mitgezogen wird. Wipe deckt die eingehende Seite hinter einer bewegten harten Kante auf. Dip blendet die ausgehende Seite zu einer Vollfarbe aus und dann zur eingehenden Seite ein; color ist ein optionaler #RRGGBB, Standard #000000, und gilt nur für dip. Richtungsnamen bezeichnen die Bewegungsrichtung: wipe-left ist eine Kante, die nach links bewegt wird. ease ist optional: linear, in, out oder in-out; Standard ist linear für crossfade und swipe-* sowie in-out für dip, wipe-* und slide-*; nicht erlaubt bei stinger. Die eingehende Seite besitzt ihre eigene Transition. Die erste Seite einer Playlist spielt keine Transition ab.

Ein Stinger ist eine thematische Vollbildgrafik, die die ausgehende Seite überdeckt, während der Bildschirm bedeckt ist die eingehende Seite einblendet und sie dann wieder freigibt. Verwenden Sie ihn, um einen Abschnitt einer Playlist zu benennen: Setzen Sie ihn auf die erste Seite des Abschnitts. Das stinger-Objekt ist für type: "stinger" erforderlich und bei anderen Typen nicht erlaubt. Alle seine Mitglieder sind optional. theme ist eines von neomustard (Standard), cyanotype, propaganda, signal, avant-garde, bloom oder primetime und entspricht den Kartenthemen. title ist bis zu 40 Zeichen lang und subtitle bis zu 60, eingestellt im Anzeigetyp des Themas. logo ist media: plus die ID eines bereiten Bildes im Projekt, zum Beispiel media:med_01EXAMPLE. accent ist ein optionales #RRGGBB, das den Akzent des Themas ersetzt. duration_ms für einen Stinger liegt zwischen 2000 und 6000 und deckt den gesamten Bumper ab; typische Längen sind 2700 bis 4000. Der Titel bleibt für hang_ms vollständig sichtbar, 0 bis 6000, Standard 1000 (eine Sekunde), und hang_ms beträgt höchstens 60 Prozent von duration_ms; ein längeres Verweilen benötigt eine längere duration_ms. Ein Player, der keinen Stinger darstellen kann, spielt eine Crossfade mit derselben Länge. Siehe die Live-Stinger-Karten-Seite, um die Übergangswiedergabe zu sehen.

Das folgende Beispiel zeigt einen Stinger-Seitenübergang:

{ "type": "stinger", "duration_ms": 3500, "stinger": { "theme": "primetime", "title": "BREAKFAST", "subtitle": "Served until 11", "logo": "media:med_01EXAMPLE", "hang_ms": 1000 } }

Ein optionales enter Objekt auf einem Primitive fügt eine Objektanimation hinzu: fade-up, fade-down, fade-left, fade-right, fade-in, zoom-in oder zoom-out.

Ein optionales Seiten-visibility Objekt begrenzt, wann die Seite abgespielt wird: ein erforderliches enabled Boolean, optionale zivile from und until Grenzen und bis zu 16 wiederkehrende windows von Tagen und zivilen Zeiten. Jede Playlist behält mindestens eine Seite ohne jegliches visibility Feld, und ein Bildschirm, der eine geplante Playlist abspielt, benötigt eine Zeitzone. Stellen Sie diese Zeitzone zuerst ein; screen assign und playlist update lehnen lokal ohne eine solche ab und nennen den Befehl, der dies behebt.

Eine Seitenbedingung visibility.data, {key, path?, equals?}, zeigt die Seite nur an, solange ein Kartendaten-Dokument passt: key ist ein Kartendaten-Schlüssel oder eine Karten-ID, path ein RFC-6901-Zeiger in das Dokument und equals eine Zeichenfolge, Zahl, ein Boolean oder null (weglassen, um zu prüfen, ob der Wert existiert). Der Schlüssel {screen.weather} liest das Wetter am eigenen Standort jedes Bildschirms, den screen update ID --location LAT,LON festlegt: {"enabled":true,"data":{"key":"{screen.weather}","path":"/condition","equals":"rain"}} zeigt die Seite nur an, solange es dort regnet, wo der Bildschirm steht. Das Wetterdokument enthält condition (clear, cloud, fog, rain, snow, storm oder wind), band (freezing unter 0 °C, cold 0 bis 9, mild 10 bis 17, warm 18 bis 24, hot ab 25), temperatureC in ganzen Grad und isDay. Es ist das aktuelle Wetter der 0,25-Grad-Zelle des Bildschirms, etwa stündlich aktualisiert, keine Vorhersage. Ein Bildschirm ohne Standort zeigt die Seite nie an, und das Veröffentlichen lehnt einen path oder einen equals ab, den das Dokument nicht enthalten kann, etwa cloudy statt cloud. Behalten Sie eine gewöhnliche Seite ohne visibility als Ersatz.

Ein optionales Top-Level-audio Objekt fügt einen Soundtrack hinzu, der kontinuierlich spielt, während sich die Seiten ändern. tracks listet 1 bis 128 Einträge in Wiedergabereihenfolge auf, jeder mit einer eindeutigen id (dem Seiten-ID-Muster) und der media_id eines bereiten audio Medienobjekts. loop ist standardmäßig true und startet nach dem letzten Track wieder beim ersten; volume ist standardmäßig 1 und reicht von 0 bis 1, multipliziert mit der Player-Lautstärke; cued ist standardmäßig false und true stoppt den Soundtrack nach jedem Track, sodass ein Track nur spielt, wenn eine Seite audio_cue ihn startet. Eine gewöhnliche Seite kann audio_cue mit einer track ID aus dieser Liste und einem optionalen restart Boolean (Standard false) tragen: Wenn die Seite erscheint, wechselt der Player zu diesem Track von dessen Anfang, startet ihn nur neu, wenn er bereits spielt und restart true ist. Cues sind Hinweise, Werbeplatz-Seiten können sie nicht tragen, und ein Cue ohne Soundtrack wird abgelehnt. Eine Seite mit advance {"mode":"audio_end"} endet, wenn der Track, den ihr audio_cue benennt, endet, benötigt also diesen Cue und einen Soundtrack, nimmt kein after_ms und folgt den duration Regeln für Bild- und Video-Primitives; ein stream Primitive benötigt weiterhin eine duration Seite, und eine Anwendung auf der Seite ist niemals deren Steuerung; max_ms ist ein optionaler Hinweis, den der Server überschreibt. playlist update ersetzt das gesamte Dokument, sodass das Weglassen von audio den Soundtrack entfernt. Soundtrack-Erstellung.

Karten

Entdecken Sie Kartentypen, erstellen Sie eine Instanz und aktualisieren Sie deren Live-Daten. Eine Playlist platziert die zurückgegebene Karten-ID.

screenrig cards list
screenrig cards show gauge
screenrig card create --type gauge --file gauge-params.json
screenrig card list
screenrig card show crd_EXAMPLE
screenrig card params crd_EXAMPLE --file gauge-params.json
screenrig card data get crd_EXAMPLE
screenrig card data put crd_EXAMPLE --file gauge-data.json --expect-rev 1
screenrig card preview crd_EXAMPLE --output gauge.png

Bildschirme

Ein Bildschirm ist ein Player. Diese Befehle lesen ihn, weisen ihm eine Playlist zu und verwalten sein Leben. Revisionsvoraussetzungen sind bei Schreibvorgängen optional.

Tags gruppieren Bildschirme in Flotten. Jeder Bildschirm trägt 0 bis 16 einzigartige Tags mit 1 bis 32 Buchstaben oder Ziffern, gesetzt mit screen tag. screen assign, screen reload, screen toast, screen tag und screen screenshot nehmen eine Bildschirm-ID, mehrere IDs oder --tag TAG und eine Flottenantwort meldet jeden Bildschirm: siehe Flottenergebnisse.

Bildschirmordner gruppieren Bildschirme nach Ort, ein Ordner pro Bildschirm. Ein Flottenbefehl akzeptiert auch --folder ID: siehe Bildschirmordner.

screen pair#

Koppeln Sie einen Player mit dem auf seinem Bildschirm angezeigten Code.

screenrig screen pair "$PAIRING_CODE" --name "Lobby"

screen list#

Bildschirme auflisten. Archivierte Bildschirme werden ausgelassen, es sei denn, Sie fordern sie an.

screen list [--state archived] [--tag TAG] [--folder ID|root]
ParameterTypErforderlichStandardNotizen
--statestringneinaktive BildschirmeDer einzige akzeptierte Wert ist archived, der nur archivierte Bildschirme auflistet.
--tag TAGstringneinjeder BildschirmNur Bildschirme auflisten, die genau dieses Tag tragen.
--folder ID|rootstringneinjeder BildschirmListet nur die Bildschirme direkt in diesem Bildschirmordner sfd_ auf, nicht die seiner Unterordner, oder mit root nur Bildschirme außerhalb jedes Ordners.
screenrig screen list --tag Lobby
screenrig screen list --folder sfd_01EXAMPLEFOLDER000000000

Jede Zeile trägt die tags des Bildschirms. Mit --human fügt die Tabelle eine TAGS-Spalte hinzu, wenn ein aufgelisteter Bildschirm Tags hat.

screen show#

Einen Bildschirm lesen, einschließlich Revision, Zuordnung und Aktivität.

screen show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
screenrig screen show scr_01EXAMPLESCREEN00000000

tags listet die Flotten-Tags des Bildschirms. effective_playlist, takeover und playlist_schedule berichten, was der Bildschirm abspielt und warum; siehe Zeitpläne und Übernahmen. health und die Host-Fähigkeiten des Players sind in Gerätezustand und Stromversorgung. online ist wahr, solange ein Player verbunden ist, einschließlich eines kurzen Wiederverbindungsfensters. Optionale last_online_at und last_ip erscheinen nach der ersten Verbindung. Optionales observation meldet die Oberflächen, die ein Player gezeichnet hat: id, width, height, pixel_ratio und presentation. Alle diese sind schreibgeschützt; screen update kann sie nicht senden, und ein archivierter Bildschirm liefert seine Zeile weiterhin zurück.

commands listet die letzten 10 Neustarts, Neuladevorgänge, Cache-Leerungen, App-Neustarts und Updates des Bildschirms auf, den ältesten zuerst, jeweils mit seinem type, seinem state (queued, sent, done, failed, expired, cancelled oder superseded), seinem source (schedule für einen Neustart, den ein Neustartplan ausgelöst hat; fehlt bei einem, den eine Person angefordert hat), seinem expires_at und wann er gesendet oder ausgeführt wurde. reboot_schedule und next_reboot_at melden den Neustartplan des Bildschirms und den Beginn seines nächsten Neustartfensters. Eine Cache-Leerung, ein App-Neustart oder ein Update, die der Player beendet hat, enthält außerdem cause und eine kurze detail, die --human als Spalte CAUSE und als Zeile unter der Tabelle ausgibt. suspension enthält message und since eines ausgesetzten Bildschirms. Ein von screen replace archivierter Bildschirm meldet replaced_by, den Bildschirm, auf den sein Gerät umgezogen ist. Mit --human gibt screen show jeden davon aus.

last_outage meldet den letzten Ausfall des Bildschirms: offline_since, back_at und duration_s und, sobald ein Zustandsbericht sie festlegt, eine likely_cause aus device_restart, app_crash, app_restart, network oder platform; sie fehlt, wenn screenRIG sie nicht bestimmen kann. Ein Neustart wird festgelegt, sobald der Bildschirm zurückkehrt, während eine Netzwerk- oder screenRIG-Ursache auf den nächsten Zustandsbericht des Players wartet, was bis zu fünfzehn Minuten dauern kann. glass enthält die Urteile, die screenRIG aus den Wiedergabeberichten und Screenshots des Bildschirms gezogen hat. Mit --human gibt screen show Last outage und Likely cause sowie Playlist stalled, Blank screen oder Frozen picture für ein Urteil aus, das ein Problem gefunden hat; Benachrichtigungen sagt, was die Urteile nicht beurteilen.

screen update#

Ändern Sie den Namen, die Playlist-Zuweisung oder die Zeitzone eines Bildschirms in einem Aufruf.

screen update <id> [--name NAME] [--playlist-id ID] [--timezone ZONE] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--name NAMEstringneinUnverändertAnzeigename für den Bildschirm.
--playlist-id IDstringneinUnverändertDie pl_ Playlist, die dieser Bildschirm abspielen soll.
--timezone ZONEstringneinUnverändertEin IANA-Zonenkennzeichen wie America/Los_Angeles. Validiert gegen die Zonendatenbank des Servers. Ein Patch löscht niemals eine Zone.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen update scr_01EXAMPLESCREEN00000000 --name "Lobby"

Unter Überprüfung wird eine Änderung von --playlist-id allein wie screen assign vorgeschlagen; eine Vorschlags-Sitzung kann die anderen Felder nicht ändern.

screen publish#

Erstellen Sie eine neue Playlist aus einer vorbereiteten Datei und weisen Sie sie einem Bildschirm zu.

screen publish <id> <file> [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
<file>PfadjakeineDas vorbereitete Playlist-Dokument oder - für stdin.
--expect-rev REVISIONstringneinkeineOptionale Bildschirm-Revision-Voraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung überprüft: Klartext, höchstens 280 Zeichen. Wird ignoriert, wenn die Änderung sofort angewendet wird.
screenrig screen publish scr_LOBBY lobby.json

Dies erstellt eine neue Playlist und weist sie zu. Es aktualisiert keine bestehende Playlist nach Namen. Prüfen Sie zuerst das vorbereitete Dokument. Wiederholen Sie identische Eingaben, um einen mehrdeutigen Fehler fortzusetzen. Die Rückmeldung der Zuweisung beweist keine Wiedergabe; fordern Sie einen Screenshot separat an. Bei Überprüfung gibt es stage: pending_review mit beiden Bewertungen zurück. Siehe Playlists vorbereiten, veröffentlichen und bearbeiten.

screen assign#

Weisen Sie einem Bildschirm oder einer Flotte von Bildschirmen eine Playlist zu.

screen assign (<id>... | --tag TAG) --playlist-id ID [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs. Mehrere IDs laufen als eine Flottenanfrage.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--playlist-id IDstringjakeineDie pl_ Playlist, die abgespielt werden soll.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung überprüft: Klartext, höchstens 280 Zeichen. Wird ignoriert, wenn die Änderung sofort angewendet wird.
screenrig screen assign scr_01EXAMPLESCREEN00000000 --playlist-id pl_01EXAMPLEPLAYLIST000000
screenrig screen assign --tag Lobby --playlist-id pl_01EXAMPLEPLAYLIST000000

Wenn die Playlist eine Seite plant und der Bildschirm keine Zeitzone hat, verweigert die CLI das Senden und nennt den screen set-timezone-Befehl zum Ausführen. Keine Revision wird durch diese Verweigerung verbraucht. In einer Flotte wendet jeder Bildschirm diese Regel selbst an: Ein Bildschirm ohne Zeitzone schlägt im Ergebnis fehl, die anderen werden zugewiesen.

Um in eine Flotte zu veröffentlichen, erstellen Sie die Playlist einmal mit playlist create und führen dann screen assign --tag TAG --playlist-id ID aus. screen publish richtet sich an einen Bildschirm.

screen set-timezone#

Legen Sie die zivile Zeitzone fest, in der eine geplante Playlist gelesen wird.

screen set-timezone <id> --timezone ZONE [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--timezone ZONEstringjakeineEin IANA-Zonenkennzeichen wie Europe/Berlin.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen set-timezone scr_01EXAMPLESCREEN00000000 --timezone America/Los_Angeles

Seitenpläne sind bürgerliche Zeiten, daher ohne Zeitzone bedeutungslos. Eine Änderung der Zeitzone erneuert die Manifestrevision.

screen archive#

Einen Bildschirm ausblenden und das Glas abdunkeln.

screen archive <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen archive scr_01EXAMPLESCREEN00000000

Archivieren blendet den Bildschirm aus der Standardliste aus und verdunkelt das Glas. Die Bindung des Players wird nicht aufgehoben.

screen unarchive#

Archivierten Bildschirm in die Standardliste zurückführen.

screen unarchive <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen unarchive scr_01EXAMPLESCREEN00000000

Ein Player kann auch seinen eigenen Bildschirm archivieren: ein bestätigtes Zurücksetzen auf einem Player, der einen Schlüssel besitzt, oder das Entkoppeln eines per Cookie gekoppelten Browser-Players. screen show meldet dann archive_reason als device_reset oder device_unpair (project für ein von Ihnen angefordertes Archiv) mit archived_at. Der Bildschirm behält seine Gerätebindung aus allen Gründen, sodass ein Player, der diesen Schlüssel oder Geräte-Cookie noch besitzt, dunkel bleibt und beim Entarchivieren ohne erneutes Koppeln fortsetzt. Der zurückgesetzte oder entkoppelte Player verwirft seinen Schlüssel oder Cookie und koppelt sich als neuer Bildschirm erneut. Ein durch eine bestätigte Bildschirmwiederherstellung ersetzter Schlüssel bleibt außer Dienst.

Ein als replaced durch screen replace archivierter Bildschirm behält keine Gerätebindung, daher lehnt das Entarchivieren ihn ab, und screen delete entfernt ihn.

screen suspend#

Eine Mitteilung auf einem Bildschirm anstelle seines Inhalts anzeigen, bis er fortgesetzt wird.

screen suspend <id> --message TEXT [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--message TEXTstringjakeineDie Mitteilung, die der Bildschirm anzeigt: 1 bis 280 Zeichen nach dem Trimmen. Zeilenvorschub ist das einzige erlaubte Steuerzeichen, und der Player bricht den Text um und behält seine Zeilenvorschübe.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen suspend scr_01EXAMPLESCREEN00000000 --message "Closed for stocktake. Back at 9am."

Ein ausgesetzter Bildschirm zeigt die Nachricht anstelle seines Inhalts. Sonst ändert sich nichts: Playlist, Zeitplan, Übernahme und Display-Steuerung bleiben bestehen und entwickeln sich weiter, und screen resume zeigt, was der Bildschirm jetzt anzeigen würde. screen show meldet suspension mit message und since; das erneute Aussetzen eines ausgesetzten Bildschirms ersetzt die Nachricht und behält since. Das Aussetzen erhöht die Bildschirmrevision, und der Player ruft sofort erneut ab. Ein archivierter Bildschirm antwortet mit screen_archived.

screen resume#

Die Aussetzung eines Bildschirms beenden, damit er wieder seinen eigenen Inhalt zeigt.

screen resume <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen resume scr_01EXAMPLESCREEN00000000

Fortsetzen zeigt wieder den eigenen Inhalt des Bildschirms an, ausgehend von dem, was der Bildschirm jetzt anzeigen würde, und der Player ruft sofort erneut ab. Ein Bildschirm, der nicht ausgesetzt ist, antwortet unverändert und ohne Revisionsänderung. Ein archivierter Bildschirm antwortet mit screen_archived.

screen delete#

Einen Bildschirm löschen.

screen delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen delete scr_01EXAMPLESCREEN00000000

Löschen entfernt einen Bildschirm nur, solange ihm kein Player-Schlüssel zugeordnet ist, und screen show meldet deletable: true für diesen Bildschirm. Ein Player, der sich per Code koppelt, ob nativ oder als Browser-Player, besitzt einen Schlüssel, und der Schlüssel bleibt an seinen Bildschirm gebunden: Das Löschen dieses Bildschirms antwortet mit 409 screen_archive_required (Exit-Code 5), archivieren Sie ihn stattdessen. Nur ein per Cookie gekoppelter Browser-Player besitzt keinen Schlüssel, und sein Bildschirm lässt sich löschen, ob er gekoppelt ist oder noch aussteht.

screen replace#

Das als anderer Bildschirm gekoppelte Gerät auf diesen Bildschirm verschieben und dabei die Einstellungen und den Verlauf dieses Bildschirms behalten.

screen replace <id> --with ID [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDer scr_ Bildschirm, der behalten werden soll.
--with IDstringjakeineDer scr_ Bildschirm, dessen gekoppeltes Gerät übernimmt. Er muss ein anderer Bildschirm des Projekts sein.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung für den zu behaltenden Bildschirm. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen replace scr_01EXAMPLESCREEN00000000 --with scr_01EXAMPLENEWSCREEN000000

Koppeln Sie die neue Hardware zuerst als eigenen Bildschirm und führen Sie dann den Austausch durch. Der Schlüssel des Geräts oder die Anmeldedaten eines Browser-Players öffnen nun <id>; dabei bleiben Name, Tags, Zeitzone, Playlist, Zeitpläne, Übernahme, Display-Zeitplan samt Überschreibung, Videowand, Kommentare, Felder, Standort und Verlauf erhalten, und Host und Player des Ersatzgeräts werden übernommen. Gerätezustand, Status, Speicher und Befehle in der Warteschlange beginnen von vorn. Der durch --with benannte Bildschirm wird mit archive_reason replaced archiviert, und replaced_by benennt <id>. Er behält keine Gerätebindung, daher kann screen unarchive ihn nicht wiederherstellen und screen delete entfernt ihn. Der Schlüssel, den <id> besaß, wird nach einem fünfzehnminütigen Kulanzfenster zurückgezogen, danach wird das alte Gerät abgelehnt. Beide Bildschirme müssen aktiv sein und einen gekoppelten Player haben: Ein Bildschirm, der noch auf die Kopplung wartet, antwortet mit resource_conflict, ein archivierter mit screen_archived, und eine Videowand benötigt einen Ersatz-Player, der display.wall meldet (wall_unsupported). Die Anfrage trägt immer einen Idempotenzschlüssel, und eine exakte Wiederholung gibt die ursprüngliche Antwort zurück.

screen rotate-public-id#

Eine neue öffentliche ID für einen Bildschirm ausgeben.

screen rotate-public-id <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen rotate-public-id scr_01EXAMPLESCREEN00000000

screen reload#

Bitten Sie den Player eines Bildschirms oder jeden Player in einer Flotte, einmal neu zu laden.

screen reload (<id>... | --tag TAG) [--expires-in DURATION] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs. Mehrere IDs laufen als eine Flottenanfrage.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--expires-in DURATIONstringnein24h, vom Server angewendetWie lange die Anfrage darauf wartet, dass ein Offline-Bildschirm online geht: 90s, 30m, 2h oder 1d, von 60s bis 24h.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
screenrig screen reload scr_01EXAMPLESCREEN00000000
screenrig screen reload scr_01EXAMPLESCREEN00000000 --expires-in 2h
screenrig screen reload --tag Lobby

Die Antwort enthält reload_id, state und expires_at. Einem Bildschirm, der online ist, wird das Neuladen sofort gesendet (state sent); ein Offline-Bildschirm hält es als queued vor und erhält es, wenn er vor expires_at online geht, 24 Stunden nach der Anfrage, sofern --expires-in nichts anderes festlegt. Ein neueres Neuladen ersetzt ein noch in der Warteschlange stehendes; screen show listet die commands des Bildschirms auf, und screen command cancel bricht ein noch in der Warteschlange stehendes ab. In einer Flotte enthält jedes Ergebnis in reload dasselbe Feld state. Ein Web-Player lädt an seiner nächsten Seitenbegrenzung neu; ein nativer Player verbindet sich neu, lädt sein Manifest erneut und prüft auf ein Update. Ein Player ignoriert ein Neuladen innerhalb von zehn Minuten nach dem letzten, auf das er reagiert hat. Neuladen funktioniert bei aktiven und archivierten Bildschirmen und ändert die Bildschirmrevision nicht.

screen toast#

Eine einmalige Nachricht als Bühnen-Chrome auf einem Live-Bildschirm oder einer Flotte posten.

screen toast (<id>... | --tag TAG) --text TEXT [--level info] [--duration-ms MS]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs. Mehrere IDs laufen als eine Flottenanfrage.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--text TEXTstringjakeineEin bis 120 Zeichen, Zeilenumbruch als einziger Umbruch, höchstens drei Zeilen.
--level LEVELstringneininfoinfo, alert oder error. Der gehostete Player zeigt Fehlermeldungen als Toasts an. Info und Warnung sind Diagnoseebenen, die unterdrückt werden können; ein erfolgreicher Befehl garantiert keine Sichtbarkeit.
--duration-ms MSintegernein10000, vom Server angewendetZwischen 2000 und 60000, wenn angegeben.
screenrig screen toast scr_01EXAMPLESCREEN00000000 --text "Lobby closed"
screenrig screen toast --tag Lobby --text "Closing in ten minutes"

Ein Toast ist kein Primitivelement: Es belegt keinen Canvas-Slot, hat keine Ebene und nimmt nicht an Bereitschaft oder Crossfade teil. Das Neueste gewinnt, es gibt keine Warteschlange und kein Abbrechen, und der akzeptierte Umschlag ist nur { expires_at }. Setzen Sie niemals Zugangsdaten oder andere geheime Materialien in den Text.

screen identify#

Den Namen eines Bildschirms eine Weile über seinem Inhalt anzeigen, um ihn vor Ort zu finden.

screen identify <id> [--duration DURATION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--duration DURATIONstringnein60s, vom Server angewendetWie lange die Überlagerung eingeblendet bleibt, gezählt ab dem Zeitpunkt, zu dem der Player die Anfrage erhält: 30s, 2m oder 1m30s, von 2s bis 10m.
screenrig screen identify scr_01EXAMPLESCREEN00000000
screenrig screen identify scr_01EXAMPLESCREEN00000000 --duration 2m

Der Player zeichnet eine Vollbild-Überlagerung über seinen Inhalt, mit dem Namen des Bildschirms sehr groß und seiner ID klein darunter. Die Wiedergabe läuft darunter weiter, und ein neueres Identifizieren ersetzt die Überlagerung. Der akzeptierte Umschlag enthält identify_id, duration_ms und expires_at 60 Sekunden nach der Anfrage, sodass ein Offline-Bildschirm sie später nie anzeigt. Nur ein Player, der die Fähigkeit identify meldet, zeigt die Überlagerung an: Jeder andere Bildschirm antwortet mit 409 identify_unsupported (Exit-Code 5), und es wird nichts gesendet; aktualisieren Sie daher den Player oder zeigen Sie den Namen mit screen toast an. Ein archivierter Bildschirm antwortet mit screen_archived, und ein Bildschirm, der noch auf die Kopplung wartet, antwortet mit resource_conflict. Das Identifizieren ändert die Bildschirmrevision nicht.

screen screenshot#

Machen Sie eine Einzelaufnahme eines aktiven Bildschirms oder aller Bildschirme einer Flotte und speichern Sie sie auf der Festplatte.

screen screenshot <id> [--output FILE] [--timeout MS] [--poll-ms MS]
screen screenshot (<id> <id>... | --tag TAG) [--output DIRECTORY] [--concurrency N] [--timeout MS] [--poll-ms MS]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag, ohne Bildschirmanzahlbegrenzung.
--output FILEPfadnein./<id>.webpFür einen Bildschirm ein Dateipfad; eine vorhandene Datei wird ohne Nachfrage überschrieben. Für mehrere IDs oder --tag ein Verzeichnis, das bei Fehlen erstellt wird und pro Bildschirm eine <screen_id>.webp erhält.
--concurrency Nintegernein4Erfasst gleichzeitig für mehrere IDs oder --tag, von 1 bis 8.
--timeout MSintegernein35000Wie lange auf die Aufnahme gewartet wird.
--poll-ms MSintegernein500Intervall zwischen Statusabfragen der Aufnahme.
screenrig screen screenshot scr_01EXAMPLESCREEN00000000 --output ./lobby.webp
screenrig screen screenshot --tag Lobby --output ./lobby-shots

Der Befehl blockiert, bis das WebP auf der Festplatte ist; es gibt kein --no-wait. Der Umschlag meldet screen_id, capture_id, path, bytes, sha256, width und height und niemals Bildbytes. Neueste gewinnt: Eine spätere Anfrage ersetzt eine laufende Aufnahme. Ein Screenshot des Web-Players zeichnet jede iframe-Seite als dunkelgraue Kachel mit der Beschriftung „Embedded web page“ und jede Anwendung so, wie sie sich selbst darstellt; das Bild trägt keine Markierung für die Kachel und beweist daher nicht, dass eine Iframe-Seite gerendert wurde.

Für mehrere IDs oder --tag ist die Antwort ein Flottenergebnis mit action: "screenshot", dem selector und dem output-Verzeichnis; jedes ok-Ergebnis enthält path, bytes, sha256, width und height. Mit --tag listet die CLI zuerst die getaggten Bildschirme nach jeder Listen-Seite; jede Listen-Seite wird berechnet, die Aufnahmen selbst sind kostenlos, und mehrere IDs benötigen keine Liste. --idempotency-key wird in dieser Form abgelehnt, da jede Aufnahme eigene Schlüssel verwendet. Wenn eine Aufnahme unerwartet fehlschlägt, ist das Ergebnis dieses Bildschirms unexpected_error, es starten keine neuen Aufnahmen, die wartenden Bildschirme melden not_attempted und der Exit-Code ist 1.

screen tag#

Tags auf einem Bildschirm oder einer Flotte setzen, hinzufügen, entfernen oder löschen.

screen tag (<id>... | --tag TAG) (--set TAGS | --add TAGS | --remove TAGS | --clear) [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs. Mehrere IDs laufen als eine Flottenanfrage.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--set TAGSstringgenau eine AktionkeineDas gesamte Set mit diesen durch Kommas getrennten Tags ersetzen, z. B. Lobby,Floor2.
--add TAGSstringgenau eine AktionkeineFügen Sie diese durch Kommas getrennten Tags hinzu.
--remove TAGSstringgenau eine AktionkeineDiese durch Kommas getrennten Tags entfernen.
--clearbooleangenau eine AktionausAlle Tags entfernen.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
screenrig screen tag scr_01EXAMPLESCREEN00000000 --set Lobby,Floor2
screenrig screen tag scr_01EXAMPLESCREEN00000000 --add Spring
screenrig screen tag --tag Lobby --add Spring

Ein Tag besteht aus 1 bis 32 Buchstaben oder Ziffern, und ein Bildschirm trägt höchstens 16 eindeutige Tags. Tags wählen Flotten aus; sie sind niemals Autorisierung und erreichen niemals den Player. Das Ändern von Tags erhöht die Bildschirmrevision, nicht die Manifestrevision. Für einen Bildschirm ist der Umschlag der aktualisierte Bildschirm. --add und --remove lesen zuerst den Bildschirm und schreiben die neue Menge geschützt durch --expect-rev oder die gerade gelesene Revision, sodass eine gleichzeitige Änderung revision_conflict (Exit 6) zurückgibt, anstatt überschrieben zu werden; führen Sie den Befehl erneut aus. In einer Flotte gelten --add und --remove atomar für jeden gespeicherten Satz eines Bildschirms, und ein Bildschirm, der mehr als 16 Tags hätte, schlägt in seinem eigenen Ergebnis mit invalid_request fehl.

Überall dort, wo sich Tags ändern (screen tag, eine Bildschirmaktualisierung über die API, der Tag-Editor des Dashboards), listet levels in der Antwort unter gained und lost die Kampagnen auf, deren Tag-Zielgruppe der Bildschirm betreten oder verlassen hat, jeweils mit source (campaign), id, der Anzahl screens und, wenn die Kampagne eine Reichweite hat, reach_before und reach_after. screen tag der Flotte summiert sie über die Flotte. Lesen Sie levels.lost, bevor Sie eine Tag-Änderung für harmlos halten: Das Entfernen des letzten passenden Tags von den Bildschirmen einer Kampagne leert diese Gruppe und löst die reach_dropped- und group_empty-Benachrichtigungen aus.

Flottenergebnisse

Bei mehreren Bildschirm-IDs oder --tag, screen assign, screen reload, screen toast und screen tag wird eine gemessene Aktion ohne Bildschirmanzahlbegrenzung ausgeführt. Die CLI folgt automatisch begrenzten Ergebnisseiten, wartet, wenn Steuerungsbudgets erschöpft sind, und behält währenddessen denselben Schlüssel und die ausgewählte Flotte bei. --tag wählt nur aktive Bildschirme; IDs können jeden Bildschirm benennen. Eine einzelne Bildschirm-ID liefert die Einzelbildschirm-Antwort. Flottenbefehle benötigen kein --expect-rev, da Revisionsschutz pro Bildschirm gilt. Jeder Flottenbefehl trägt einen Idempotenzschlüssel. Nach einer unterbrochenen Anfrage, z. B. bei Verbindungsverlust, führen Sie denselben Befehl erneut aus, um abgeschlossene Bildschirme ohne Wiederholung ihrer Nebeneffekte abzuspielen. Nach einer endgültigen Antwort mit Fehlern wiederholen Sie nur die fehlgeschlagenen IDs: Die erneute Ausführung des gesamten Befehls wirkt wieder auf alle Bildschirme. Die Wiederverwendung desselben expliziten --idempotency-key innerhalb von 24 Stunden liefert stattdessen die aufgezeichnete Antwort.

Der Umschlag behält ok: true. Teilweiser Erfolg ist eine normale Antwort, kein Transportfehler:

{
  "ok": true,
  "data": {
    "action": "reload",
    "matched": 3, "succeeded": 2, "failed": 1,
    "results": [
      { "screen_id": "scr_LOBBY", "status": "ok", "reload": { "reload_id": "…", "expires_at": "…", "state": "sent" } },
      { "screen_id": "scr_GONE", "status": "failed", "problem": { "code": "not_found", "status": 404 } },
      { "screen_id": "scr_ENTRANCE", "status": "ok", "reload": { "reload_id": "…", "expires_at": "…", "state": "queued" } }
    ]
  },
  "warnings": [{ "code": "fleet_partial_failure", "message": "1 of 3 screens failed; 2 succeeded." }]
}

Ein ok-Ergebnis enthält das Ein-Bildschirm-Ergebnis: revision für assign, revision und tags für Tag-Änderungen, reload für Neuladen und toast für Toast. Ein failed-Ergebnis enthält das Problem, das die eigene Anfrage dieses Bildschirms zurückgegeben hätte. Bildschirmbegrenzungen gelten weiterhin innerhalb einer Flottenaktion, sodass ein Flotten-Neuladen oder Toast rate_limited für einen gerade neu geladenen oder getoasteten Bildschirm melden kann; versuchen Sie diese Bildschirm-ID später erneut. Bildschirmbegrenzungen sind 6 Neuladungen und 20 Toasts pro Minute. Flotten-Neuladungen und Toasts belasten auch ein Organisationsbudget von 600 Bildschirmen pro Minute: Der Server pausiert, wenn das verbleibende Budget erschöpft ist, und die CLI beachtet Retry-After vor der automatischen Fortsetzung.

ErgebnisBeendigungscodeWarnung
Jeder zugeordnete Bildschirm war erfolgreich0keine
Einige oder alle Bildschirme sind ausgefallenDer Code des ersten fehlgeschlagenen Bildschirms, z. B. 4 für not_found oder 6 für revision_conflictfleet_partial_failure
Kein Bildschirm gefunden0fleet_no_match
Fehlerhafter Selektor oder Aktion2 oder der eigene Code der Anfrage; keine Bildschirmänderungenkeine

Bildschirmordner

Ein Bildschirmordner ordnet Bildschirme nach Ort. Eine Ordner-ID beginnt mit sfd_, und ein Bildschirm liegt in höchstens einem Ordner, gemeldet als folder_id in screen show und screen list und im Projektstamm nicht vorhanden. Eine Organisation enthält höchstens 1000 Ordner über alle ihre Projekte, verschachtelt bis zu 10 Ebenen tief, mit Namen aus 1 bis 100 Zeichen, die unter Geschwisterordnern eindeutig sind. Tags bleiben für Gruppen, die quer über Orte verlaufen.

screen folder list
screen folder show <id>
screen folder create --name NAME [--parent ID] [--default-playlist-id ID]
screen folder update <id> [--name NAME] [--parent ID | --root] [--default-playlist-id ID | --clear-default] [--expect-rev REVISION]
screen folder delete <id> [--expect-rev REVISION]
screen move <id>... (--folder ID | --root)
screenrig screen folder create --name "North Tower"
screenrig screen folder create --name "Level 2" --parent sfd_01EXAMPLEFOLDER000000000 --default-playlist-id pl_01EXAMPLEPLAYLIST000000
screenrig screen move scr_01EXAMPLESCREEN00000000 --folder sfd_01EXAMPLEFOLDER000000000

screen folder list gibt jeden Ordner in data.items zurück mit id, name, parent_id (null im Projektstamm), default_playlist_id, sofern gesetzt, screens (die aktiven Bildschirme direkt darin) und revision. screen move akzeptiert Bildschirm- und Ordner-IDs in beliebiger Mischung, höchstens 1000 in einer Alles-oder-nichts-Anfrage; ein Ordner wird samt Inhalt verschoben und kann nicht in sich selbst oder in einen Ordner in sich verschoben werden. screen list --folder ID listet nur die Bildschirme direkt in einem Ordner auf.

Bei jedem Flottenbefehl, der --tag TAG akzeptiert, wählt --folder ID jeden aktiven Bildschirm in diesem Ordner und in jedem Ordner darin aus. Eine Kampagne akzeptiert dasselbe: --folder ID bei campaign create und campaign update oder eine {"folder":"sfd_…"}-Regel in --audience, die sich mit Tag-Regeln kombinieren lässt, wie in {"all":[{"folder":"sfd_BUILDING"},{"tag":"overhead"}]}.

Die Standard-Playlist eines Ordners ist das, was seine Bildschirme zeigen, wenn sie keine eigene Playlist haben. Der nächste Ordner über einem Bildschirm, der eine festlegt, gewinnt, und effective_playlist meldet source folder mit der Ordner-ID als entry_id. Eine Übernahme, eine Kampagne, ein Zeitplan und die dem Bildschirm selbst zugewiesene Playlist haben alle Vorrang davor; siehe Zeitpläne und Übernahme. Die Playlist muss genehmigt sein (playlist_not_approved, Exit 5).

Das Verschieben von Bildschirmen oder eines Ordners oder das Ändern der Standard-Playlist eines Ordners löst die betroffenen Bildschirme innerhalb von etwa 15 Sekunden neu auf. levels in der Antwort listet unter gained und lost die Kampagnen, deren Ordner-Zielgruppe diese Bildschirme betreten oder verlassen haben, und die Standard-Playlists von Ordnern, die sie zu zeigen begonnen oder aufgehört haben, jeweils mit source (campaign oder folder), id und der Anzahl screens. Das Löschen eines Ordners löscht nichts darin: Seine Bildschirme und Ordner rücken in den übergeordneten Ordner auf, und resource_conflict (Exit 5) verweigert das Löschen, solange eine Kampagnen-Zielgruppe den Ordner nennt. Das Löschen antwortet mit 200 und levels, wie es ein Verschieben tut.

Schreibvorgänge erfordern Manage-Zugriff und warten nie auf eine Überprüfung: Eine Propose-Sitzung antwortet mit 403 insufficient_access. Jeder Schreibvorgang fügt den Projektereignissen screen.folder_created, screen.folder_updated, screen.folder_deleted oder screen.moved hinzu.

Zeitpläne und Übernahme

Die Kampagnen eines Bildschirms und die Zeitplaneinträge seiner Playlist sind Ebenen eines Stapels. Der Server entscheidet von oben, was jeder Bildschirm abspielt: seine Übernahme, die Kampagnen, die ihn erreichen (zuerst --priority, dann die neueste), die eigenen Zeitplaneinträge des Bildschirms der Reihe nach, die mit screen assign zugewiesene Playlist, dann die Standard-Playlist des nächsten Bildschirmordners, der eine festlegt. Die erste Ebene, die gilt, wird abgespielt. Wechsel erfolgen innerhalb von etwa einer Minute nach einer Grenze, und Player benötigen kein Update. Eine Tabelle mit Zeitplanzeilen für viele Bildschirme wird in einem Schritt importiert: siehe Zeitplan-Import.

Eine Ebene gilt, solange alle ihre Regeln gelten: from und until, wöchentliche windows, monthly-Regeln, dates, except-Daten, eine data-Bedingung und eine interaction-Bedingung. Eine monthly-Regel ist ein day des Monats (1 bis 31; ein Monat ohne diesen Tag überspringt sie) oder der Wochentag mit der Nummer nth (1 bis 4, oder -1 für den letzten) mit einem weekday; ein dates-Eintrag ist ein einzelnes date; beide akzeptieren optionale Zeiten start und end und decken sonst den ganzen Tag ab. Ein except-Datum entfernt jedes Vorkommen, das an diesem Tag beginnt, einschließlich über Nacht reichender Ausläufer, und ein über Nacht reichendes Vorkommen gehört zu dem Datum, an dem es beginnt. data ist {key, path?, equals?} und gilt, solange diese Kartendaten existieren oder dem Skalar entsprechen. interaction ist {idle_s} (5 bis 3600, Standard 60): Die Ebene wird abgespielt, solange jemand den Bildschirm per Berührung oder Klick bedient, und fällt nach idle_s Sekunden ohne Eingabe zurück, etwa als interaktive Seite über einer Werbeschleife. displays listet die Videowand-Ausgänge (1 bis 12) auf, auf denen die Ebene abgespielt wird. start ist next_item (Standard), das wartet, bis das aktuelle Element endet, oder on_time, das es zum Zeitpunkt unterbricht. Ein Player, der seinen eigenen Stapel auflöst, spielt Ebenen mit interaction, data und displays ab; campaign explain meldet die Ebene für jeden anderen Player als off mit dem Grund stack_only (benötigt einen Player, der seinen eigenen Stapel auflöst).

screen show, screen list und jeder unten stehende Befehl geben effective_playlist zurück ({id, source, entry_id?, until?}, wobei source takeover, campaign, schedule, default oder folder ist), takeover und playlist_schedule. entry_id ist die Kampagnen-ID für campaign, die Eintrags-ID für schedule und die Ordner-ID für folder. until ist der nächste Zeitpunkt, an dem die Auswahl bekanntlich geändert wird. screen show --human gibt sie in der Zeitzone des Bildschirms aus, wie in Assigned: pl_LUNCH (schedule entry lunch until 2026-08-14 15:00 America/Los_Angeles) oder Assigned: pl_LUNCH (campaign cmp_LUNCH until 2026-08-14 15:00 America/Los_Angeles) (UTC, beschriftet, wenn der Bildschirm keine Zone hat); JSON-Ausgabe behält RFC 3339-Zeitpunkte bei. Menschliche Zeitplantabellen sind mit der Zeitzone des Bildschirms beschriftet, und screen list --human fügt eine ASSIGNED-Spalte hinzu, wenn ein aufgelisteter Bildschirm etwas anderes als seine Standard-Playlist abspielt.

ProblemcodeBeendenBedeutung
invalid_request8Der Bildschirm hat keine zugewiesene Standard-Playlist (next ist screen assign), ein Zeitplan zielt auf einen Bildschirm ohne Zeitzone (next ist screen set-timezone), oder eine benannte Playlist kann nicht zugewiesen werden.
screen_archived5Ein archivierter Bildschirm lehnt Zeitpläne und Übernahmen ab. next ist screen unarchive.
revision_conflict6Die --expect-rev Revision war veraltet.
rate_limited7Zeitpläne und Übernahmeschreibvorgänge teilen sich Minutenlimits: 600 pro Organisation, 20 pro Bildschirm und 60 pro IP. Bitte warten Sie auf retry_after_seconds.

Bei einer einzelnen Bildschirm-ID geben diese Befehle den aktualisierten Bildschirm zurück und --expect-rev schützt dessen Revision. Mehrere IDs oder --tag werden als eine Flottenanfrage mit Flottenhülle und Abbruchregeln ausgeführt; jeder Bildschirm schlägt einzeln fehl, und die CLI pausiert und setzt automatisch fort, wenn das Projektbudget erschöpft ist.

screen schedule show#

Zeigen Sie den Playlist-Zeitplan eines Bildschirms und die aktuell ausgewählte Playlist an.

screen schedule show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
screenrig screen schedule show scr_CAFE

Die JSON-Ausgabe kann direkt an screen schedule set --file zurückgegeben werden.

screen schedule set#

Den Playlist-Zeitplan auf einem Bildschirm oder einer Flotte ersetzen.

screen schedule set (<id>... | --tag TAG) --file FILE [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--file FILEPfadjakeineDas Zeitplandokument oder - für stdin.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung überprüft: Klartext, höchstens 280 Zeichen. Wird ignoriert, wenn die Änderung sofort angewendet wird.
screenrig screen schedule set scr_CAFE --file dayparts.json
screenrig screen schedule set --tag Cafe --file dayparts.json

Jede Playlist, die ein Zeitplan benennt, wird als Zuweisung validiert, und der Bildschirm benötigt eine Zeitzone und eine zugewiesene Standard-Playlist. Gilt kein Eintrag, wird die zugewiesene Playlist abgespielt. Wenn eine geplante Playlist später nicht angezeigt werden kann, werden ihre Einträge übersprungen und screen.playlist_unavailable wird protokolliert.

screen schedule clear#

Den Playlist-Zeitplan von einem Bildschirm oder einer Flotte entfernen.

screen schedule clear (<id>... | --tag TAG) [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung überprüft: Klartext, höchstens 280 Zeichen. Wird ignoriert, wenn die Änderung sofort angewendet wird.
screenrig screen schedule clear --tag Cafe

screen schedule preview#

Zeigen, was das Ersetzen des Playlist-Zeitplans eines Bildschirms ändern würde, ohne es auszuführen.

screen schedule preview <id> --file FILE [--calendar-from INSTANT] [--calendar-to INSTANT]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--file FILEPfadjakeineDas Zeitplandokument, wie screen schedule set es nimmt, oder - für stdin. Das JSON von screen schedule show wird zurückgenommen.
--calendar-from INSTANTstringneinjetztDie Kalender zu diesem Zeitpunkt mit Zone beginnen lassen, etwa 2026-12-01T00:00:00Z.
--calendar-to INSTANTstringneineine Woche nach dem BeginnDie Kalender zu diesem Zeitpunkt mit Zone enden lassen, höchstens 93 Tage nach dem Beginn.
screenrig screen schedule preview scr_LOBBY --file dayparts.json
screenrig screen schedule preview scr_LOBBY --file dayparts.json --calendar-from 2026-12-01T00:00:00Z --calendar-to 2027-01-01T00:00:00Z

Es wird nichts geschrieben. Die Einträge werden so geprüft, wie screen schedule set sie prüft, daher verweigert eine Vorschau, was das Setzen verweigert. data.gained und data.lost sagen, ob der Bildschirm Ebenen seines Zeitplans gewinnen oder verlieren würde; ein Eintrag mit "paused": true liegt auf keinem Bildschirm, daher gewinnt man ihn mit seiner Veröffentlichung. data.calendar.before und data.calendar.after sind der Kalender des Bildschirms, wie er ist und wie er von --calendar-from bis --calendar-to wäre.

screen schedule revisions#

Die Revisionen des Playlist-Zeitplans eines Bildschirms auflisten, die neueste zuerst.

screen schedule revisions <id> [--after CURSOR]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--after CURSORstringneindie erste SeiteAb dem data.next_cursor der vorherigen Seite fortfahren.
screenrig screen schedule revisions scr_LOBBY
screenrig screen schedule revisions scr_LOBBY --after CURSOR

data.items enthält höchstens 50 Revisionen, jeweils mit revision (die Revision des Bildschirms beim Schreiben, daher haben die Nummern Lücken, wo sich der Bildschirm anders geändert hat), created_at, change, current, author, wenn bekannt, und entries, dem gesamten Zeitplan nach diesem Schreibvorgang (none bedeutet, dass der Bildschirm keinen Zeitplan hatte). change ist edited (ein Setzen, ein Löschen oder ein Zeitplanimport), restored (eine Kopie der früheren Revision, die restored_from nennt) oder baseline. Solange data.next_cursor ein String ist, gibt es ältere Revisionen: Führen Sie den Befehl erneut aus, mit --after darauf gesetzt. Revisionen verschwinden mit dem Löschen des Bildschirms. Lesezugriff genügt.

screen schedule restore#

Den Zeitplan einer früheren Revision auf einem Bildschirm wiederherstellen, indem er nach vorn kopiert wird.

screen schedule restore <id> --revision N [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--revision NintegerjakeineDie Revision, die nach vorn kopiert wird, wie screen schedule revisions sie nummeriert.
--expect-rev REVISIONstringneindie gerade gelesene RevisionDiese aktuelle Bildschirmrevision verlangen, nicht N. Ohne sie liest die CLI den Bildschirm unmittelbar vor dem Schreiben und sendet diese Revision; eine Änderung dazwischen ist revision_conflict (Exit 6).
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung überprüft: Klartext, höchstens 280 Zeichen. Wird ignoriert, wenn die Änderung sofort angewendet wird.
screenrig screen schedule restore scr_LOBBY --revision 4
screenrig screen schedule restore scr_LOBBY --revision 4 --expect-rev 9

Die Einträge der Revision N werden zum Zeitplan des Bildschirms, derselbe Schreibvorgang wie screen schedule set mit diesen Einträgen (oder screen schedule clear, wenn diese Revision keine hatte), so geprüft, wie sie jetzt geprüft werden: Eine inzwischen gelöschte Playlist verweigert ihn. Unter Propose-Zugriff oder in einem Projekt, das Überprüfung für Agentenänderungen verlangt, wartet die Wiederherstellung wie das Setzen auf eine Person, und auf dem Bildschirm ändert sich nichts, bis sie sie genehmigt. Frühere Revisionen bleiben, wie sie waren.

screen takeover#

Zeigen Sie eine Playlist auf einem Bildschirm oder einer Flotte vor Kampagnen, dem Zeitplan und der Zuweisung an.

screen takeover [set] (<id>... | --tag TAG) --playlist-id ID [--until TIME | --for DURATION] [--reason TEXT] [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--playlist-id IDstringjakeineDie pl_ Playlist, die angezeigt werden soll.
--until TIMEstringneingehalten bis zur FreigabeEin strikter RFC 3339-Zeitpunkt mit Sekunden und Offset, in der Form YYYY-MM-DDTHH:MM:SSZ oder YYYY-MM-DDTHH:MM:SS-07:00, gesendet normalisiert auf UTC; strikt in der Zukunft und höchstens 7 Tage voraus. Oder none, um bis screen takeover clear zu warten.
--for DURATIONstringneingehalten bis zur Freigabe30m, 2h oder 3d, bis zu 6d23h59m, umgewandelt in eine until von der Uhr dieses Computers. 7d wird lokal abgelehnt; verwenden Sie --until für volle 7 Tage. Nicht mit --until.
--reason TEXTstringneinkeineEine Betreiber-Notiz zum Takeover und seinen Ereignissen. Gekürzt, maximal 120 Zeichen, und ohne Steuerzeichen.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung überprüft: Klartext, höchstens 280 Zeichen. Wird ignoriert, wenn die Änderung sofort angewendet wird.
screenrig screen takeover scr_LOBBY --playlist-id pl_DRILL --for 30m --reason "Fire drill"
screenrig screen takeover --tag Lobby --playlist-id pl_LAUNCH --for 2h
screenrig screen takeover scr_A scr_B --playlist-id pl_NOTICE --until none

screen takeover ID ist die Kurzform von screen takeover set ID. Eine neue Übernahme ersetzt die vorherige. Wenn sie endet, kehrt der Bildschirm eigenständig zu einer geltenden Kampagne, seinem Zeitplan oder seiner zugewiesenen Playlist zurück. Eine Übernahme, deren Playlist nicht angezeigt werden kann, endet. Ein --for-Wiedergabedurchlauf nach einem unklaren Fehler berechnet ein neues Ende und wird als neue Anfrage gesendet.

screen takeover clear#

Übernahme auf einem Bildschirm oder einer Flotte beenden.

screen takeover clear (<id>... | --tag TAG) [--expect-rev REVISION] [--note TEXT]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
--note TEXTstringneinkeineEine Notiz für die Person, die die Änderung überprüft: Klartext, höchstens 280 Zeichen. Wird ignoriert, wenn die Änderung sofort angewendet wird.
screenrig screen takeover clear --tag Lobby

Die Zeitplandatei

Ein Zeitplan listet 1 bis 32 Einträge in Prioritätsreihenfolge auf; der erste geltende Eintrag gewinnt. Ein Eintrag setzt mindestens eine Regel einer Ebene: windows, monthly, dates, except, data, interaction, from oder until, und optional displays, start und paused. windows hat 1 bis 16 Einträge in der Bildschirmzeitzone: days verwendet mon bis sun, und start und end sind HH:MM; beide weglassen für den ganzen Tag. Ein end um oder vor start überschreitet Mitternacht und gehört zum Starttag. Optionale from (einschließlich) und until (ausschließlich) sind zivile Minuten wie 2026-12-24T18:00 ohne Offset. Ein ausgelassenes id wird zu entry_N. Ein Eintrag mit "paused": true ist ein Entwurf: Er liegt auf keinem Bildschirm-Stapel, screen schedule show markiert ihn, und der Kalender zeichnet ihn gestrichelt. Senden Sie den Zeitplan ohne paused erneut, um ihn zu veröffentlichen. Die CLI prüft diese Form vor dem Senden. Frühstücks-, Mittags- und Abendessen-Zeitfenster:

{
  "entries": [
    { "id": "breakfast", "playlist_id": "pl_BREAKFAST",
      "windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "06:00", "end": "11:00" },
                  { "days": ["sat", "sun"], "start": "08:00", "end": "12:00" }] },
    { "id": "lunch", "playlist_id": "pl_LUNCH",
      "windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "11:00", "end": "15:00" }] },
    { "id": "dinner", "playlist_id": "pl_DINNER",
      "windows": [{ "days": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"], "start": "17:00", "end": "22:00" }] }
  ]
}

Ein Menü, das abgespielt wird, solange jemand den Bildschirm bedient, über einem Brunch am ersten Sonntag, der ein Datum auslässt:

{
  "entries": [
    { "id": "browse", "playlist_id": "pl_MENU", "interaction": { "idle_s": 90 } },
    { "id": "brunch", "playlist_id": "pl_BRUNCH",
      "monthly": [{ "nth": 1, "weekday": "sun", "start": "10:00", "end": "14:00" }],
      "except": ["2026-12-06"] }
  ]
}

Ein Playlist-Zeitplan wählt zwischen Playlists; Seite visibility innerhalb einer Playlist wählt weiterhin zwischen ihren Seiten.

Zeitpläne und Übernahmeereignisse

events list und events follow drucken screen.playlist_switched (playlist_id, previous_playlist_id, source, entry_id, until), screen.takeover_started (playlist_id, until, wobei none bedeutet, bis zur Löschung gehalten, und reason), screen.takeover_ended (reason expired, cleared, replaced, playlist_deleted, oder playlist_unavailable), und die Warnung screen.playlist_unavailable (playlist_id, entry_ids, und code playlist_deleted oder playlist_unavailable).

Das Löschen einer Playlist, die noch von einem Bildschirm, einschließlich archivierter, angezeigt werden kann, schlägt mit resource_conflict (Exit 5) fehl: zugewiesen, durch einen Zeitplaneintrag benannt, durch eine Übernahme gehalten, durch eine Kampagne angezeigt oder wirksam. next verweist auf screen list.

Kampagnen

Eine Kampagne schaltet jeden Bildschirm einer Zielgruppe auf eine Playlist um, solange ihre Regeln gelten, und wieder zurück, wenn sie nicht mehr gelten. Eine Kampagne lässt die Mittagsmenüs in jedem north-Store laufen, und ein Bildschirm, der später mit north getaggt wird, erhält sie ebenfalls. Ohne gesetzte Regeln gilt sie immer.

Pro Bildschirm wählt der Server dessen Übernahme, sonst die erste geltende Kampagne (--priority 0 bis 100, höhere zuerst, dann die neueste), sonst den Playlist-Zeitplan, sonst die zugewiesene Playlist; siehe Zeitpläne und Übernahmen für den Stapel und die Regeln. Eine Kampagne erreicht einen Bildschirm, der eine Standard-Playlist hat (screen assign). Eine mit einer Datums- oder Zeitregel benötigt außerdem die Zeitzone des Bildschirms (screen set-timezone), da dies zivile Zeiten sind, die in der eigenen Zeitzone jedes Bildschirms gelesen werden. Bildschirme schalten innerhalb von etwa einer Minute um, und Player benötigen kein Update.

Eine pausierte Kampagne ist ein Entwurf: Sie liegt auf keinem Bildschirm, bis campaign publish sie veröffentlicht; das kann zuerst für einen Testordner oder einige Testbildschirme geschehen, und campaign promote legt dann ihre Zielgruppe auf sie. campaign preview zeigt eine Änderung, bevor sie vorgenommen wird, und campaign revisions und campaign restore bewahren frühere Versionen auf und stellen sie wieder her. Dieselben Entwürfe, Vorschauen und denselben Verlauf gibt es für Zeitplaneinträge weiter unten; siehe Entwürfe, Test und Hochstufen, Verlauf.

Kampagnenbefehle verwenden die screens-Fähigkeit. Schreibvorgänge erfordern Manage-Zugriff und warten nie auf eine Überprüfung: Eine Propose-Sitzung antwortet mit 403 insufficient_access. Eine Organisation hat höchstens 100 Kampagnen über alle ihre Projekte (campaign_limit_reached, Exit 5), und die Playlist muss genehmigt sein (playlist_not_approved, Exit 5). Jeder Schreibvorgang fügt den Projektereignissen campaign.created, campaign.updated oder campaign.deleted hinzu, und ein Bildschirm, den eine Kampagne umschaltet, zeichnet screen.playlist_switched mit source campaign und der Kampagnen-ID als entry_id auf. ads campaigns kaufen Werbezeit auf anderen Bildschirmen und sind eine andere Ressource.

campaign list#

Die Kampagnen des Projekts in der Reihenfolge auflisten, in der Bildschirme sie lesen.

campaign list

Keine Parameter.

screenrig campaign list

data.items enthält höchstens 100 Kampagnen, höchste Priorität zuerst und innerhalb einer Priorität die neueste zuerst. Eine pausierte Kampagne wird aufgelistet und gilt nirgends.

campaign show#

Eine Kampagne lesen.

campaign show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
screenrig campaign show cmp_LUNCH

Gibt name, playlist_id, audience (die exakte Regel), priority, paused, die gesetzten from, until, windows, monthly, dates, except, interaction, displays und start sowie revision zurück, den Wert für --expect-rev bei einem späteren Schreibvorgang. reach meldet, auf wie viele Bildschirme die Zielgruppe passt: published bei der letzten Veröffentlichung der Kampagne (erstellt oder aktualisiert mit neuer Zielgruppe, Playlist oder Pausenstatus), current und at für die neueste Anzahl sowie empty_groups, die tag:NAME- und folder:ID-Elemente der Zielgruppe, die auf keinen Bildschirm passen. Ein Tag, Ordner, eine Archivierung oder eine Löschung, die die Anzahl ändert, wird innerhalb von etwa 15 Sekunden neu gezählt; campaign list trägt auch reach, und die Benachrichtigungen reach_dropped und group_empty überwachen sie. Eine ID aus ads campaigns list antwortet hier mit not_found (Exit 4).

campaign create#

Die Bildschirme einer Zielgruppe auf eine Playlist umschalten, immer oder solange ihre Regeln gelten.

campaign create --name NAME --playlist-id ID (--tag TAG | --any-tag TAG | --screen-id ID | --folder ID | --all-screens | --audience RULE) [--from TIME] [--until TIME] [--window SPEC] [--monthly SPEC] [--date SPEC] [--except DATES] [--on-touch [IDLE_S]] [--displays N[,N]] [--start on-time|next-item] [--covers WHERE] [--priority N] [--paused]
ParameterTypErforderlichStandardNotizen
--name NAMEstringjakeineEin Name mit 1 bis 120 Zeichen.
--playlist-id IDstringjakeineDie pl_ Playlist, die die Zielgruppe zeigt, solange die Kampagne gilt. Sie muss genehmigt sein.
--tag TAGstringeine ZielgruppenoptionkeineBildschirme, die dieses Tag tragen. Wiederholen oder durch Kommas trennen, um jedes aufgeführte Tag zu verlangen.
--any-tag TAGstringeine ZielgruppenoptionkeineBildschirme, die mindestens eines dieser Tags tragen. Wiederholen oder durch Kommas trennen.
--screen-id IDstringeine ZielgruppenoptionkeineDiese Bildschirme. Wiederholen oder durch Kommas trennen.
--folder IDstringeine ZielgruppenoptionkeineDie Bildschirme in diesem Bildschirmordner sfd_ und in jedem Ordner darin. Um einen Ordner mit Tags zu kombinieren, verwenden Sie --audience.
--all-screensbooleaneine ZielgruppenoptionausJeder Bildschirm im Projekt.
--audience RULEstringeine ZielgruppenoptionkeineEine Regel als JSON, @FILE, um sie aus einer Datei zu lesen, oder - für stdin.
--from TIMEstringneinkein StartZu dieser zivilen Zeit in der Zeitzone jedes Bildschirms beginnen, YYYY-MM-DDTHH:MM ohne Offset.
--until TIMEstringneinkein EndeVor dieser zivilen Zeit in der Zeitzone jedes Bildschirms enden, in derselben Form und später als --from.
--window SPECstringneinkeineNur in diesem wöchentlichen Fenster gelten, DAYS oder DAYS@HH:MM-HH:MM, z. B. mon-fri@09:00-17:00 oder sat,sun. Bis zu 16-mal wiederholen; die Kampagne gilt in jedem davon.
--monthly SPECstringneinkeineNur bei diesem monatlichen Vorkommen gelten: ein Tag des Monats (15 oder day15; ein Monat ohne diesen Tag überspringt ihn) oder der n-te Wochentag (1st-mon, 2nd-tue, 3rd-wed, 4th-thu, last-sun), jeweils mit optionalem @HH:MM-HH:MM. Bis zu 16-mal wiederholen.
--date SPECstringneinkeineNur an diesem Tag gelten, YYYY-MM-DD oder YYYY-MM-DD@HH:MM-HH:MM. Bis zu 100-mal wiederholen.
--except DATEstringneinkeineDiese Daten überspringen, YYYY-MM-DD, wiederholt oder durch Kommas getrennt, bis zu 100. Eine Ausnahme entfernt jedes Vorkommen, das an diesem Datum beginnt, einschließlich über Nacht reichender Ausläufer.
--on-touch [IDLE_S]integerneinausNur gelten, solange jemand den Bildschirm per Berührung oder Klick bedient, bis IDLE_S Sekunden, 5 bis 3600 (Standard 60), ohne Eingabe vergehen.
--displays N[,N]stringneinjede AusgabeNur auf diesen Videowand-Ausgängen abspielen, 1 bis 12, durch Kommas getrennt.
--start WHENstringneinnext-itemon-time wechselt exakt zum Zeitpunkt und unterbricht das aktuelle Element; next-item wartet, bis es endet.
--covers WHEREstringneinfullWo die Playlist spielt: full (die Seite), main oder header, footer oder side, ein über die Seite gelegter Streifen, der eine für diese Region gemachte Playlist braucht. Siehe Streifen.
--priority Nintegernein00 bis 100. Die höhere Zahl gewinnt, wenn zwei Kampagnen auf einem Bildschirm gelten.
--pausedbooleanneinausPausiert erstellen: ein Entwurf, der auf keinem Bildschirm liegt, bis campaign publish oder campaign resume.
screenrig campaign create --name "Lunch menu" --playlist-id pl_LUNCH --tag north --window mon-fri@11:00-14:00
screenrig campaign create --name "North Tower welcome" --playlist-id pl_WELCOME --folder sfd_01EXAMPLEFOLDER000000000
screenrig campaign create --name "Holiday hours" --playlist-id pl_HOLIDAY --tag Lobby --from 2026-12-20T00:00 --until 2027-01-02T00:00 --priority 10
screenrig campaign create --name "North cafes" --playlist-id pl_CAFE --audience '{"all":[{"tag":"North"},{"any":[{"tag":"Cafe"},{"tag":"Patio"}]}]}' --paused
screenrig campaign create --name "Brunch" --playlist-id pl_BRUNCH --tag Cafe --monthly 1st-sun@10:00-14:00 --except 2026-12-06
screenrig campaign create --name "Touch to browse" --playlist-id pl_MENU --screen-id scr_KIOSK --on-touch 90
screenrig campaign create --name "Holiday opening" --playlist-id pl_HOLIDAY --tag Lobby --date 2026-12-24@18:00-22:00 --start on-time
screenrig campaign create --name "Wall outputs 1 and 2" --playlist-id pl_WALL --screen-id scr_WALL --displays 1,2

Tags bestehen aus 1 bis 32 Buchstaben oder Ziffern. DAYS ist daily, ein Wochentag (mon), ein Bereich (mon-fri; fri-mon läuft über das Ende der Woche hinaus) oder eine Kommaliste (sat,sun). Ohne Uhrzeit ist das Fenster der ganze Tag, und ein Ende um oder vor dem Start überschreitet Mitternacht und gehört zum Starttag. In einer --audience-Regel hat jedes Mitglied genau eines von all, any, tag, screen_id oder folder, Gruppen sind höchstens 3 Ebenen tief verschachtelt, eine Zielgruppe hat höchstens 500 Regeln, und {"all":[]} ist jeder Bildschirm.

Nach einer unterbrochenen oder mehrdeutigen Erstellung führen Sie denselben Befehl innerhalb von 24 Stunden erneut aus: Er verwendet den gespeicherten Idempotenzschlüssel, und der Server liefert dieselbe Kampagne zurück, anstatt eine neue zu erstellen.

campaign update#

Eine Kampagne ändern; die Bildschirme ihrer alten und neuen Zielgruppe werden innerhalb einer Minute neu aufgelöst.

campaign update <id> [--name NAME] [--playlist-id ID] [audience option] [--from TIME | --clear-from] [--until TIME | --clear-until] [--window SPEC | --clear-windows] [--monthly SPEC | --clear-monthly] [--date SPEC | --clear-dates] [--except DATES | --clear-except] [--on-touch [IDLE_S] | --clear-on-touch] [--displays N[,N] | --clear-displays] [--start WHEN] [--covers WHERE] [--priority N] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
--name NAMEstringneinUnverändertDie Kampagne umbenennen.
--playlist-id IDstringneinUnverändertStattdessen diese Playlist anzeigen. Sie muss genehmigt sein.
--tag, --any-tag, --screen-id, --folder, --all-screens, --audiencestringneinUnverändertHöchstens eine, geschrieben wie in campaign create. Sie ersetzt die gesamte Zielgruppe.
--from TIME, --until TIMEstringneinUnverändertEine zivile Zeit wie in campaign create. --from muss früher als --until bleiben, sonst invalid_request (Exit 8).
--clear-from, --clear-untilbooleanneinausDen Start oder das Ende entfernen.
--window SPECstringneinUnverändertErsetzt alle Fenster durch diese. Bis zu 16-mal wiederholen.
--clear-windowsbooleanneinausAlle Fenster entfernen.
--monthly SPEC, --date SPEC, --except DATEstringneinUnverändertWie bei campaign create; jede ersetzt alle Regeln ihrer Art.
--on-touch [IDLE_S], --displays N[,N], --start WHENstringneinUnverändertWie bei campaign create; --on-touch ohne Wert bedeutet 60 Sekunden.
--clear-monthly, --clear-dates, --clear-except, --clear-on-touch, --clear-displaysbooleanneinausEntfernt sie. Eine Kampagne ohne jede Regel gilt immer.
--covers WHEREstringneinUnverändertfull, main, header, footer oder side, wie bei campaign create.
--priority NintegerneinUnverändert0 bis 100.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig campaign update cmp_LUNCH --playlist-id pl_LUNCH2 --expect-rev 2
screenrig campaign update cmp_LUNCH --tag Lobby --window sat,sun --priority 20
screenrig campaign update cmp_LUNCH --clear-until --clear-windows
screenrig campaign update cmp_BRUNCH --monthly 2nd-sun@10:00-14:00 --except 2026-12-13,2027-01-10
screenrig campaign update cmp_BROWSE --clear-on-touch --clear-displays

Übergeben Sie mindestens eine Änderung; nur die Felder, die Sie übergeben, ändern sich. Ein neues --playlist-id wird wie bei der Erstellung geprüft. Nach einer unterbrochenen oder mehrdeutigen Anfrage führen Sie denselben Befehl erneut aus: Er verwendet den gespeicherten Idempotenzschlüssel, und der Server liefert die bereits erfolgte Aktualisierung zurück, anstatt sie erneut anzuwenden.

campaign pause#

Eine Kampagne auf jedem Bildschirm stoppen, ohne sie zu löschen.

campaign pause <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig campaign pause cmp_LUNCH

Bildschirme, die sie angezeigt haben, kehren innerhalb einer Minute zu dem zurück, was sie ohne sie anzeigen würden. campaign resume startet sie erneut.

campaign resume#

Eine pausierte Kampagne erneut starten.

campaign resume <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig campaign resume cmp_LUNCH

Jeder Bildschirm der Zielgruppe, für den die Kampagne gelten kann, schaltet innerhalb einer Minute auf ihre Playlist um, solange die Kampagne gilt.

campaign delete#

Eine Kampagne löschen.

campaign delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig campaign delete cmp_LUNCH

Die Kampagne kommt nicht zurück. Jeder Bildschirm, der sie anzeigt, kehrt innerhalb einer Minute zu dem zurück, was er ohne sie anzeigen würde; Playlists, Bildschirme und Tags bleiben bestehen. campaign pause stoppt eine Kampagne und behält sie.

campaign screens#

Die Bildschirme anzeigen, die eine Kampagne erreicht, und den Status auf jedem.

campaign screens <id> [--limit N] [--cursor CURSOR]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
--limit Nintegernein100Bildschirme pro Seite, 1 bis 500.
--cursor CURSORstringneindie erste SeiteDie data.next_cursor der vorherigen Seite.
screenrig campaign screens cmp_LUNCH

data.counts deckt jeden Live-Bildschirm der Zielgruppe ab: audience, dann eine Anzahl pro vorhandenem Status. data.items ist eine Seite dieser Bildschirme in der Reihenfolge der Bildschirm-IDs, jeweils mit dem status der Kampagne. data.next_cursor fehlt auf der letzten Seite. Auf einem Bildschirm, dessen Player seinen eigenen Stapel auflöst, ist der Status der, den dieser Stapel der Kampagne gibt: Eine Streifen- oder main-Kampagne spielt in ihrer Region, eine --displays-Kampagne auf ihren Displays.

StatusBedeutung
playingDer Bildschirm zeigt die Playlist der Kampagne.
pendingSie sollte angezeigt werden, und die Umschaltung erfolgt innerhalb einer Minute.
waitingDerzeit außerhalb von --from, --until und den Fenstern; next_start, wenn sie innerhalb von acht Tagen beginnt.
ended--until ist verstrichen.
outrankedSie gilt, aber eine Bildschirmübernahme (reason takeover) oder eine andere Kampagne (reason campaign, mit by) gewinnt.
conditionalSie gilt zeitlich und spielt, solange jemand den Bildschirm benutzt (reason interaction) oder solange ihre Datenbedingung erfüllt ist (reason data). Nur der Player sieht seine Eingaben und Kartendaten.
pausedDie Kampagne ist pausiert.
blockedSie kann hier nicht angezeigt werden. reason ist no_default_playlist (screen assign), no_timezone (screen set-timezone), playlist_unavailable (die Playlist fehlt, ist nicht genehmigt oder passt nicht zum Bildschirm), region_not_laid_out (sie passt auf kein Display des Bildschirms: Ihr Streifen passt auf keines, oder ihr --displays nennt keines, und die Kampagne bleibt aus dessen Stapel ausgenommen) oder stack_only (der Player des Bildschirms löst seinen eigenen Stapel nicht auf, und nur einer, der das tut, beachtet eine Region, eine Display-Sperre, --on-touch oder eine Datenbedingung).

campaign explain#

Zeigen, warum jede Kampagne auf einem Bildschirm abgespielt wird oder nicht, jetzt oder zu einem gewählten Zeitpunkt.

campaign explain <screen-id> [--at TIME] [--to TIME]
ParameterTypErforderlichStandardNotizen
<screen-id>stringjakeineDie scr_ Bildschirm-ID.
--at TIMEstringneinjetztDiesen Zeitpunkt statt jetzt erklären: ein Zeitpunkt mit Zone (2026-12-24T10:00:00-08:00) oder eine Uhrzeit auf der eigenen Uhr des Bildschirms (2026-12-24T18:00). Eine Uhrzeit, die die Sommerzeit überspringt oder wiederholt, wird abgelehnt.
--to TIMEstringneinkeineListet außerdem die Playlist-Wechsel von --at (standardmäßig jetzt) bis zu diesem Zeitpunkt auf, in denselben Formen. Es gibt keine Grenze, wie weit; eine Antwort listet höchstens 500 Abschnitte auf.
screenrig campaign explain scr_LOBBY
screenrig campaign explain scr_LOBBY --at 2026-12-24T18:00 --to 2026-12-26T00:00

data.items listet jede Kampagne des Projekts in der Reihenfolge auf, in der der Bildschirm sie liest, jeweils mit einem Status aus campaign screens oder not_in_audience; eine blocked-Zeile nennt die Abhilfe. data.effective_playlist ist die Playlist, die der Bildschirm gerade abspielt (id, source und bei campaign die Kampagnen-ID als entry_id), oder null, wenn der Bildschirm keine Playlist anzeigt. Es ändert nichts.

Mit --at enthält data.at die Antwort für diesen Zeitpunkt: effective_playlist (ihr until ist die nächste Änderung) und eine verdicts-Zeile für die Übernahme, jede Kampagne und jeden Zeitplaneintrag, in der Reihenfolge, in der der Bildschirm sie liest.

Ein Urteil ist won (die angezeigte Playlist), outranked (sie gilt, und by nennt den Gewinner), not_started (vor ihrem Beginn), ended (nach ihrem Ende), outside_hours (innerhalb ihrer Daten, außerhalb ihrer Fenster, Monatsregeln oder Termine, oder an einem Ausnahmedatum), conditional (sie gilt zeitlich und spielt, solange jemand den Bildschirm benutzt, reason interaction, oder solange ihre Datenbedingung erfüllt ist, reason data) oder off (sie gilt nicht, und reason nennt den Grund, etwa stack_only). Auf einem Bildschirm, dessen Player seinen eigenen Stapel auflöst, lesen die Urteile diesen Stapel: Eine Streifen- oder main-Ebene gewinnt in ihrer Region oder wird dort übertroffen, eine Display-Sperre auf ihren Displays. effective_playlist und die Zeitleiste bleiben die Seite auf Display 1, und data.at.not_judged nennt player_stack.

--to fügt data.at.timeline hinzu, die Abschnitte, in denen sich die Playlist nicht ändert, und timeline_truncated kennzeichnet eine Antwort, die vor --to endete. data.at.not_judged nennt, was nicht beurteilt wird: Übernahme, Zeitplan und Kampagnen werden so gelesen, wie sie jetzt sind, und data.items bleibt der aktuelle Stand.

campaign preview#

Zeigen, was das Erstellen oder Ändern einer Kampagne bewirken würde, bevor es geschieht.

campaign preview [<id>] [campaign create or update flags] [--paused | --publish] [--calendar-from INSTANT] [--calendar-to INSTANT]
ParameterTypErforderlichStandardNotizen
<id>stringneineine neue KampagneDie Kampagne cmp_, für die eine Änderung in der Vorschau angezeigt werden soll. Weglassen, um eine neue Kampagne aus den Flags von campaign create in der Vorschau zu zeigen.
--name, --playlist-id, eine Zielgruppenoption, die Regel-FlagsstringneinkeineDie Flags von campaign create für eine neue Kampagne (--name, --playlist-id und eine Zielgruppenoption sind erforderlich) oder von campaign update für eine Änderung. Sie werden so geprüft, wie der Schreibvorgang sie prüft, daher verweigert eine Vorschau, was der Schreibvorgang verweigert.
--pausedbooleanneinausAls Entwurf in der Vorschau anzeigen: pausiert, auf keinem Bildschirm.
--publishbooleanneinausDas Aufheben der Pause der Kampagne in der Vorschau anzeigen. Mit einer Zielgruppenoption zeigt es die Veröffentlichung für diese Zielgruppe.
--calendar-from INSTANTstringneinjetztDie Kalender zu diesem Zeitpunkt mit Zone beginnen lassen, etwa 2026-12-01T00:00:00Z.
--calendar-to INSTANTstringneineine Woche nach dem BeginnDie Kalender zu diesem Zeitpunkt mit Zone enden lassen, höchstens 93 Tage nach dem Beginn.
screenrig campaign preview cmp_LUNCH --tag Lobby
screenrig campaign preview cmp_LUNCH --publish --folder sfd_TEST
screenrig campaign preview cmp_LUNCH --publish --calendar-from 2026-12-01T00:00:00Z --calendar-to 2027-01-01T00:00:00Z
screenrig campaign preview --name "Holiday hours" --playlist-id pl_HOLIDAY --tag Lobby --from 2026-12-20T00:00 --until 2027-01-02T00:00

Es wird nichts geschrieben. data.gained und data.lost sind {count, screen_ids} (die ersten 500 nach ID): die Bildschirme, die die Kampagne künftig tragen würden und jetzt nicht tragen, und die, die sie nicht mehr tragen würden. Eine pausierte Kampagne liegt auf keinem Bildschirm, daher gewinnt man mit ihrer Veröffentlichung ihre Zielgruppe; eine Änderung, die die Kampagne auf einem Bildschirm belässt, zeigt sich nur in den Kalendern. data.calendar.before und data.calendar.after sind die Zeitplankalender von --calendar-from bis --calendar-to für die Bildschirme der alten und der neuen Zielgruppe, mit Entwürfen als pausierten Ebenen gezeichnet. --human gibt die Abschnitte des ersten Displays und die Entwürfe aus, die gelten würden, und sagt, wenn sich der Kalender nicht ändert.

campaign publish#

Die Pause einer Entwurfskampagne aufheben, wahlweise nur für einen Testordner oder einige Testbildschirme.

campaign publish <id> [--test-folder ID | --test-screen ID] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
--test-folder IDstringneindie Zielgruppe der KampagneNur für die Bildschirme in diesem Bildschirmordner sfd_ und in jedem Ordner darin veröffentlichen.
--test-screen IDstringneindie Zielgruppe der KampagneNur für diese Bildschirme veröffentlichen. Wiederholen oder durch Kommas trennen.
--expect-rev REVISIONstringneindie gerade gelesene RevisionDiese aktuelle Kampagnenrevision verlangen. Ohne sie liest die CLI die Kampagne unmittelbar vor dem Schreiben und sendet diese Revision; eine Änderung dazwischen ist revision_conflict (Exit 6).
screenrig campaign publish cmp_LUNCH
screenrig campaign publish cmp_LUNCH --test-folder sfd_TEST
screenrig campaign publish cmp_LUNCH --test-screen scr_LOBBY,scr_CAFE --expect-rev 2

Ein Entwurf ist eine pausierte Kampagne: Sie liegt auf keinem Bildschirm, bis sie veröffentlicht wird. Ohne Testoption erreicht die Kampagne ihre eigene Zielgruppe innerhalb einer Minute. Eine Testoption ersetzt die Zielgruppe im selben Schreibvorgang, sodass nur die Testbildschirme wechseln. Der übliche Ablauf: campaign create --paused mit der echten Zielgruppe, campaign publish ID --test-folder FOLDER, die Testbildschirme ansehen, dann campaign promote ID --revision N. campaign preview ID --publish zeigt zuvor die Wirkung.

campaign promote#

Nach seinem Test die Zielgruppe eines Entwurfs auf die Kampagne übertragen.

campaign promote <id> --revision N [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
--revision NintegerjakeineDie pausierte Revision des Entwurfs, wie campaign revisions sie nummeriert. Die Kampagne übernimmt die Zielgruppe dieser Revision.
--expect-rev REVISIONstringneindie gerade gelesene RevisionDiese aktuelle Kampagnenrevision verlangen. Ohne sie liest die CLI die Kampagne unmittelbar vor dem Schreiben und sendet diese Revision; eine Änderung dazwischen ist revision_conflict (Exit 6).
screenrig campaign promote cmp_LUNCH --revision 1
screenrig campaign promote cmp_LUNCH --revision 1 --expect-rev 2

Die Zielgruppe der Revision N wird in einem Schreibvorgang die der Kampagne, eine neue Revision, deren change promoted ist, und jeder Bildschirm der alten und der neuen Zielgruppe wird innerhalb einer Minute neu aufgelöst. Revision N muss eine pausierte Revision sein (sonst nennt sie invalid_request), und die Kampagne muss aktiv sein: Eine jetzt pausierte Kampagne hat keinen Test, der hochgestuft werden könnte. --expect-rev ist die aktuelle Revision der Kampagne, nicht N. Das Hochstufen erfordert den Zugriff, den campaign update erfordert.

campaign revisions#

Die Revisionen einer Kampagne auflisten, die neueste zuerst.

campaign revisions <id> [--after CURSOR]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
--after CURSORstringneindie erste SeiteAb dem data.next_cursor der vorherigen Seite fortfahren.
screenrig campaign revisions cmp_LUNCH
screenrig campaign revisions cmp_LUNCH --after CURSOR

data.items enthält höchstens 50 Revisionen, jeweils mit revision, created_at, change, current, author, wenn bekannt, und campaign, der Kampagne, wie sie nach diesem Schreibvorgang war, mit ihrem Pausenzustand. change ist created, edited, restored oder promoted (eine Kopie der früheren Revision, die restored_from nennt) oder baseline, die Revision, die die Kampagne hatte, als ihr Verlauf begann. Eine Kampagne, deren Verlauf keine nicht pausierte Revision enthält, ist ein Entwurf. Solange data.next_cursor ein String ist, gibt es ältere Revisionen: Führen Sie den Befehl erneut aus, mit --after darauf gesetzt. Revisionen bleiben so lange erhalten wie die Kampagne und verschwinden mit ihrem Löschen. Lesezugriff genügt.

campaign restore#

Eine frühere Revision wieder aktuell machen, indem sie nach vorn kopiert wird.

campaign restore <id> --revision N [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie cmp_ Kampagnen-ID.
--revision NintegerjakeineDie Revision, die nach vorn kopiert wird, wie campaign revisions sie nummeriert.
--expect-rev REVISIONstringneindie gerade gelesene RevisionDiese aktuelle Kampagnenrevision verlangen. Ohne sie liest die CLI die Kampagne unmittelbar vor dem Schreiben und sendet diese Revision; eine Änderung dazwischen ist revision_conflict (Exit 6).
screenrig campaign restore cmp_LUNCH --revision 3
screenrig campaign restore cmp_LUNCH --revision 3 --expect-rev 5

Name, Playlist, Zielgruppe, Regeln, Bereich, Priorität und Pausenzustand der Revision N werden zu einer neuen Revision, deren change restored ist, und werden so geprüft, wie campaign update geprüft wird: Ihre Playlist muss noch existieren und genehmigt sein (playlist_not_approved, Exit 5). Jeder Bildschirm der alten und der neuen Zielgruppe wird innerhalb einer Minute neu aufgelöst. Frühere Revisionen bleiben, wie sie waren, und das Wiederherstellen des aktuellen Inhalts ändert nichts. Das Wiederherstellen erfordert den Zugriff, den campaign update erfordert.

Überprüfungen

Wenn ein Projekt eine Überprüfung von Agentenänderungen erfordert oder die Sitzung Propose-Zugriff hat, warten Playlist- und Bildschirmänderungen auf eine Person, anstatt angewendet zu werden. Der Befehl gelingt trotzdem: ok: true, beenden 0, die Antwort des Servers in data, und eine pending_review Warnung.

{
  "ok": true,
  "data": {
    "status": "pending_review",
    "review": {
      "id": "rvw_LOBBY",
      "kind": "playlist_change",
      "state": "pending",
      "url": "https://screenrig.ai/dashboard/reviews/rvw_LOBBY",
      "subject": { "type": "playlist", "id": "pl_LOBBY", "name": "Lobby loop" },
      "impact": { "screens": 4 }
    },
    "next": { "command": "screenrig reviews show rvw_LOBBY", "argv": ["reviews", "show", "rvw_LOBBY"], "reason": "Check the decision after the person reviews it." }
  },
  "warnings": [{ "code": "pending_review", "message": "Waiting for a person to approve: https://screenrig.ai/dashboard/reviews/rvw_LOBBY" }]
}

Playlist erstellen und aktualisieren (einschließlich playlist import und playlist replace-release --apply), screen publish, screen assign, screen schedule set, clear und restore, sowie screen takeover und takeover clear warten auf Überprüfung, für einen Bildschirm oder eine Flotte. Eine Flottenänderung ist eine Überprüfung: Ihr Tag wird aufgelöst, wenn eine Person sie genehmigt, und reviews show meldet dann das Ergebnis jedes Bildschirms; eine große Flotte wird im Hintergrund angewendet, und screen_change.result.applying ist true, bis jeder Bildschirm sein Ergebnis hat. Abgesehen von den unten genannten Medienänderungen beantwortet jede andere Änderung 403 insufficient_access für eine Propose-Sitzung. --note TEXT bei diesen Befehlen sendet eine Klartextnotiz mit maximal 280 Zeichen, die der Prüfer im Dashboard liest.

Eine Person genehmigt, fordert Änderungen an oder lehnt auf der Reviews-Seite des Dashboards ab; Agenten können keine Playlist- oder Bildschirmänderungen genehmigen. Eine genehmigte Änderung wird so angewendet, als wäre sie dann gemacht worden, und ihre Ereignisse nennen die Person, die sie genehmigte, und den Agenten, der sie vorschlug. Polling, Schlafen oder Wiederholen des Schreibens während einer ausstehenden Überprüfung vermeiden: Später mit reviews show prüfen oder review.approved, review.rejected und review.changes_requested mit events follow --type review. verfolgen.

Medienänderungen warten ebenfalls auf eine Propose-Sitzung. Tag-, Ordner- und all-Selektoren überspringen einen neuen Upload, bis eine Person ihn genehmigt, und genehmigte Medien, die von der Sitzung umgetaggt oder verschoben werden, spielen weiterhin mit ihren genehmigten Tags und Ordnern, bis die Änderung genehmigt ist. Das Retag antwortet mit ok, Exit 0, mit Warnung media_review_pending, und die Überprüfung des Elements erscheint innerhalb weniger Sekunden in reviews list; kein Polling, Schlafen oder erneutes Versuchen. Jedes Element erhält eine Überprüfung, Art playlist_change mit Operation selector_refresh und einem media-Betreff: media_change zeigt seine Tags und Ordner before und after (before ist null für einen neuen Upload), und media_playlists listet jede genehmigte Playlist und jede vorgeschlagene Playlist, die auf eine Überprüfung wartet, auf, zu der die Änderung es hinzufügt oder entfernt (media_added, media_removed), mit ihren Bildschirmen. Genehmigung wendet die Änderung auf alle an; Ablehnung, Änderungsanforderung oder Rücknahme setzt ein umgetaggtes oder verschobenes Element auf den genehmigten Zustand zurück, und ein neuer Upload bleibt ungespielt. Eine Änderung, die keine genehmigte Playlist oder keinen Vorschlag ändert, wird automatisch angewendet, und eine Playlist, die das Element nach ID benennt, trägt es in ihrer eigenen Überprüfung. Wenn diese Playlists vor einer Entscheidung weitergehen, wird die Medienüberprüfung stale und eine neue ersetzt sie innerhalb von Sekunden.

Überprüfungszustände:

StatusBedeutungNächster Schritt
pendingWarten auf eine Person.Geben Sie der Person die Bewertungs-URL; prüfen Sie später erneut.
approvedAuf die Playlist oder Bildschirme angewendet.Überprüfen Sie auf dem Bildschirm mit screen show und einem Screenshot.
changes_requestedDie Person hat Änderungen angefordert; decision_note sagt welche.Überarbeiten und erneut vorschlagen mit --note.
rejectedDie Person hat abgelehnt; decision_note sagt warum.Senden Sie nicht dieselbe Änderung erneut; fragen Sie die Person.
withdrawnDer Antragsteller hat es zurückgezogen.Keine.
supersededEin neuerer Vorschlag für dieselbe Playlist oder denselben Bildschirm hat ihn ersetzt; superseded_by nennt ihn.Folgen Sie der neueren Bewertung.
staleDie Live-Playlist hat sich nach dem Vorschlag geändert, oder ihr Tag, Ordner oder all-Selektoren würden jetzt Medien abspielen, die sie beim Vorschlag nicht sah, daher kann sie nicht als geprüft angewendet werden. Eine Medienprüfung wird veraltet, wenn sich die darin aufgeführten Playlists ändern.Lese die Playlist erneut und schlage darauf basierend vor. Eine veraltete Medienbewertung wird innerhalb von Sekunden durch eine frische ersetzt.

reviews list#

Bewertungen auflisten, neueste zuerst.

reviews list [--state pending|decided|all] [--kind playlist_change|screen_change|ad_creative] [--limit N] [--cursor CURSOR]
ParameterTypErforderlichStandardNotizen
--state STATEstringneinpendingpending, decided oder all.
--kind KINDstringneinjede Artplaylist_change, screen_change oder ad_creative.
--limit Nintegernein50Überprüfungen pro Seite, 1 bis 100.
--cursor CURSORstringneindie erste SeiteDie next_cursor der vorherigen Seite.
screenrig reviews list --state all

Das Ergebnis trägt pending_count. Eine Sitzung sieht die Arten, die ihre Fähigkeiten lesen: playlists für Playlist-Änderungen, screens für Bildschirmänderungen und advertising für Werbekreativen.

reviews show#

Eine Bewertung lesen.

reviews show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Überprüfungs-ID aus dem pending_review Ergebnis.
screenrig reviews show rvw_LOBBY

Die Überprüfung meldet ihre state, den Antragsteller, Ihre note, die decision_note eine Person beim Ablehnen oder Anfordern von Änderungen hinterlassen hat, und impact.screens. Eine Playlist-Änderung fügt die diff hinzu, eine preview der Live- und vorgeschlagenen Playlists (keine bei einer Medienüberprüfung), media_change für eine Medienüberprüfung und media_playlists, die Playlists, deren Auswahl die Änderung beeinflusst. Bei einer Bildschirmänderung listet blockers die Playlist-Überprüfungen auf, die eine Person zuerst entscheidet, mit ihrem aktuellen Status.

reviews withdraw#

Nehmen Sie Ihren eigenen ausstehenden Vorschlag zurück.

reviews withdraw <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineEine ausstehende Überprüfung, die diese Sitzung vorgeschlagen hat.
screenrig reviews withdraw rvw_LOBBY

Nichts erreicht die Bildschirme, und eine zurückgezogene neue Playlist bleibt nicht genehmigt. Eine nicht mehr ausstehende Überprüfung antwortet auf review_not_pending (Exit 5).

Gerätezustand und Leistung

Jeder gekoppelte Player meldet den Gerätezustand beim Sitzungsstart, alle fünfzehn Minuten und sofort, wenn sich seine Display-Verbindung oder Stromversorgung ändert. Er gibt auch die unterstützten Host-Fähigkeiten an: reboot, clear_cache, restart_app und update, jeweils wo sie auf dem Gerät funktionieren, und die Display-Stromversorgungsmethoden, die er verwenden kann (display_power.serial, der RS-232-Steueranschluss des Displays; display_power.cec, display_power.ddc, display_power.backlight oder display_power.scrim, ein Bildschirm-Blackout). screen show gibt beide zurück.

screen show gibt den Zustand als data.health mit dem reported_at des Servers zurück; stale wird nach 35 Minuten ohne Bericht wahr, und der letzte Bericht bleibt sichtbar. Mit --human wird ein Health-Block ausgegeben: Berichtszeit, Betriebszeit von Gerät und Player, genutzter Speicher, CPU-Auslastung und Kerne, Temperatur, Display-Verbindung und Stromversorgung, Netzwerktyp und Wi-Fi-Signal, bei einem Gerät mit Akku Akkustand, Ladestatus und Stromquelle sowie Abstürze und Renderer-Neustarts in den letzten 24 Stunden. screen list --human fügt eine HEALTH-Spalte hinzu, wenn ein aufgeführter Bildschirm Aufmerksamkeit benötigt: display disconnected, hot (80 °C oder mehr), on battery, crashing (3 oder mehr Abstürze in 24 Stunden) oder stale.

Übergänge kommen als screen.health_changed-Ereignisse an, ausgegeben von events list und events follow mit einem kompakten changes=-Wert wie display_disconnected,temperature_high temperature_c=82. Power-Befehle hängen screen.reboot_requested und screen.display_changed an. Ein Neustartplan hängt screen.reboot_schedule_changed an, wenn er gesetzt oder gelöscht wird, und screen.reboot_skipped mit einem reason, wenn ein Fenster ohne Neustart vergeht; screen.reboot_requested trägt source und schedule, wenn der Plan ihn ausgelöst hat. Wie jedes screen.*-Ereignis sind sie kostenlos im Listen-Stream und als Webhook-Zustellungen. Eine Benachrichtigung sendet Ihnen eine E-Mail oder einen signierten Webhook per POST, wenn ein Display getrennt wird, ein Gerät heiß oder im Akkubetrieb läuft oder ein Player ständig abstürzt.

screen uptime, screen presence und screen health-history zeigen an, was ein Bildschirm im Laufe der Zeit getan hat: tägliche Verfügbarkeit, Online- und Offline-Übergänge sowie den gemeldeten Zustand. project uptime und project health-trend zeigen die Flotte an. Offline wird aufgezeichnet, nachdem ein Bildschirm 60 Sekunden lang nicht erreichbar war, und die Historie wird für die Ereignisaufbewahrung des Plans gespeichert.

ProblemcodeBeendenBedeutung
reboot_unsupported5Der Player des Bildschirms deklariert reboot nicht. Es wurde nichts gesendet oder gespeichert; screen reload aktualisiert Inhalte ohne Geräteneustart.
command_unsupported5Der Player des Bildschirms meldet clear_cache, restart_app oder update nicht, die Fähigkeit, die der Befehl braucht. Nichts wurde gesendet; screen show listet die Host-Fähigkeiten auf, und screen reload aktualisiert den Inhalt.
resource_conflict5Der Bildschirm wartet noch auf die Kopplung und hat noch keinen Player zum Umschalten. Ein Display-Zeitplan kann dennoch gesetzt werden.
invalid_request8Ein Anzeige- oder Neustartplan zielt auf einen Bildschirm ohne Zeitzone ab (next ist screen set-timezone), oder die Datei ist fehlerhaft.
rate_limited7Neustarts sowie Cache leeren, App neu starten und Software aktualisieren zusammen: 2 pro Bildschirm alle 10 Minuten und 600 pro Organisation und Minute. Display-Schreibvorgänge: 10 pro Bildschirm und 600 pro Organisation und Minute. Warten Sie retry_after_seconds.

Mehrere IDs oder --tag werden als eine Flottenanfrage mit Flottenumschlag und Austrittsregeln ausgeführt.

screen reboot#

Das Gerät eines Bildschirms oder die Geräte einer Flotte neu starten.

screen reboot (<id>... | --tag TAG) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--yesbooleanfür mehrere IDs oder --tagausBestätigt einen Neustart der Flotte. Die CLI fordert nie auf.
--expires-in DURATIONstringnein24h, vom Server angewendetWie lange die Anfrage darauf wartet, dass ein Offline-Bildschirm online geht: 90s, 30m, 2h oder 1d, von 60s bis 24h.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
screenrig screen reboot scr_LOBBY
screenrig screen reboot scr_LOBBY --expires-in 2h
screenrig screen reboot --tag Lobby --yes

Der Player startet das Gerät neu, nicht nur sich selbst. Ein Bildschirm, der online ist, erhält den Neustart sofort (state sent); ein Offline-Bildschirm hält ihn queued und erhält ihn, wenn er vor expires_at online kommt, 24 Stunden nach der Anfrage, sofern --expires-in nichts anderes sagt. Ein neuerer Neustart ersetzt einen noch wartenden. screen show listet die commands des Bildschirms auf: Ein gesendeter Neustart wird done, sobald das Gerät meldet, dass es gebootet hat, und screen command cancel bricht einen noch wartenden ab. In einer Flotte trägt das reboot jedes Ergebnisses dasselbe state. Eine abgelehnte oder fehlgeschlagene Anfrage und eine exakte Wiederholung derselben Anfrage zählen nicht zum Limit pro Bildschirm. Vom Moment des Sendens eines Neustarts, bis das Gerät meldet, dass es gebootet hat, oder zehn Minuten vergehen, öffnet der Bildschirm keinen screen_offline- oder display_disconnected-Alarm; eine Meldung zu einem von beiden, die dann fällig wird, wartet bis zum Ende dieses Zeitraums plus ihrer Wartezeit, und eine crashing-Meldung wird als planned_reboot übersprungen. Eine Bedingung, die danach noch gilt, öffnet normal.

screen clear-cache#

Die Caches des Players eines Bildschirms oder der Player einer Flotte leeren.

screen clear-cache (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id>, --tag oder --folderkeineEine oder mehrere scr_ Bildschirm-IDs. Mehrere IDs laufen als eine Flottenanfrage.
--tag TAGstringeines von <id>, --tag oder --folderkeineJeder aktive Bildschirm mit diesem Tag.
--folder IDstringeines von <id>, --tag oder --folderkeineJeder aktive Bildschirm im Bildschirmordner sfd_ und in den darin enthaltenen Ordnern.
--yesbooleanfür mehrere IDs, --tag oder --folderausBestätigt eine Flottenanfrage. Die CLI fragt nie nach.
--expires-in DURATIONstringnein24h, vom Server angewendetWie lange die Anfrage darauf wartet, dass ein Offline-Bildschirm online geht: 90s, 30m, 2h oder 1d, von 60s bis 24h.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
screenrig screen clear-cache scr_LOBBY
screenrig screen clear-cache scr_LOBBY --expires-in 2h
screenrig screen clear-cache --tag Lobby --yes

Der Player löscht seine heruntergeladenen Medien, Anwendungspakete und Daten-Caches, behält Kopplung, Identität und Einstellungen und ruft dann das Manifest und die Inhalte erneut ab; der Bildschirm kann seinen Ladezustand zeigen, während sich die Inhalte wieder füllen. Er erreicht nur einen Player, der clear_cache meldet. Einem Online-Bildschirm wird die Anfrage sofort gesendet (state sent); ein Offline-Bildschirm hält sie als queued und bekommt sie gesendet, wenn er vor expires_at online geht, 24 Stunden nach der Anfrage, sofern --expires-in nichts anderes festlegt. Die Antwort enthält command_id, command, state und expires_at. Ein Player, der die Fähigkeit nicht meldet, antwortet mit 409 command_unsupported, und nichts wird gesendet; in einer Flotte schlägt dieser Bildschirm allein fehl. screen show listet den Befehl unter commands auf und markiert ihn, sobald der Player meldet, als done oder failed mit cause und einem kurzen detail: cleared, wenn die Caches geleert sind und der erneute Abruf begonnen hat, oder clear_failed, wenn ein Cache nicht geleert werden kann. Ein gesendeter Befehl ohne Bericht bleibt sent. Ein neuerer Befehl derselben Art ersetzt einen noch in der Warteschlange stehenden, und screen command cancel bricht einen noch in der Warteschlange stehenden ab. In einer Flotte enthält command jedes Ergebnisses dasselbe state. Eine Flotte (mehrere IDs, --tag oder --folder) braucht --yes. Eine abgelehnte oder fehlgeschlagene Anfrage und eine exakte Wiederholung derselben Anfrage zählen nicht zum Limit von 2 Anfragen für clear-cache, restart-app und update-software zusammen pro Bildschirm pro 10 Minuten.

screen restart-app#

Die Anwendung des Players eines Bildschirms oder der Player einer Flotte neu starten.

screen restart-app (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id>, --tag oder --folderkeineEine oder mehrere scr_ Bildschirm-IDs. Mehrere IDs laufen als eine Flottenanfrage.
--tag TAGstringeines von <id>, --tag oder --folderkeineJeder aktive Bildschirm mit diesem Tag.
--folder IDstringeines von <id>, --tag oder --folderkeineJeder aktive Bildschirm im Bildschirmordner sfd_ und in den darin enthaltenen Ordnern.
--yesbooleanfür mehrere IDs, --tag oder --folderausBestätigt eine Flottenanfrage. Die CLI fragt nie nach.
--expires-in DURATIONstringnein24h, vom Server angewendetWie lange die Anfrage darauf wartet, dass ein Offline-Bildschirm online geht: 90s, 30m, 2h oder 1d, von 60s bis 24h.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
screenrig screen restart-app scr_LOBBY
screenrig screen restart-app scr_LOBBY --expires-in 2h
screenrig screen restart-app --tag Lobby --yes

Der Player startet seine Anwendung neu, nicht das Gerät (ein Web-Player lädt seine Seite neu) und meldet sich aus dem neu gestarteten Prozess. Er erreicht nur einen Player, der restart_app meldet; screen reboot startet das Gerät neu. Einem Online-Bildschirm wird die Anfrage sofort gesendet (state sent); ein Offline-Bildschirm hält sie als queued und bekommt sie gesendet, wenn er vor expires_at online geht, 24 Stunden nach der Anfrage, sofern --expires-in nichts anderes festlegt. Die Antwort enthält command_id, command, state und expires_at. Ein Player, der die Fähigkeit nicht meldet, antwortet mit 409 command_unsupported, und nichts wird gesendet; in einer Flotte schlägt dieser Bildschirm allein fehl. screen show listet den Befehl unter commands auf und markiert ihn, sobald der Player meldet, als done oder failed mit cause und einem kurzen detail: restarted oder restart_failed, wenn der Neustart nicht beginnen kann. Ein gesendeter Befehl ohne Bericht bleibt sent. Ein neuerer Befehl derselben Art ersetzt einen noch in der Warteschlange stehenden, und screen command cancel bricht einen noch in der Warteschlange stehenden ab. In einer Flotte enthält command jedes Ergebnisses dasselbe state. Eine Flotte (mehrere IDs, --tag oder --folder) braucht --yes. Eine abgelehnte oder fehlgeschlagene Anfrage und eine exakte Wiederholung derselben Anfrage zählen nicht zum Limit von 2 Anfragen für clear-cache, restart-app und update-software zusammen pro Bildschirm pro 10 Minuten.

screen update-software#

Den Player eines Bildschirms oder die Player einer Flotte auf die neueste Version aktualisieren.

screen update-software (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id>, --tag oder --folderkeineEine oder mehrere scr_ Bildschirm-IDs. Mehrere IDs laufen als eine Flottenanfrage.
--tag TAGstringeines von <id>, --tag oder --folderkeineJeder aktive Bildschirm mit diesem Tag.
--folder IDstringeines von <id>, --tag oder --folderkeineJeder aktive Bildschirm im Bildschirmordner sfd_ und in den darin enthaltenen Ordnern.
--yesbooleanfür mehrere IDs, --tag oder --folderausBestätigt eine Flottenanfrage. Die CLI fragt nie nach.
--expires-in DURATIONstringnein24h, vom Server angewendetWie lange die Anfrage darauf wartet, dass ein Offline-Bildschirm online geht: 90s, 30m, 2h oder 1d, von 60s bis 24h.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
screenrig screen update-software scr_LOBBY
screenrig screen update-software scr_LOBBY --expires-in 2h
screenrig screen update-software --tag Lobby --yes

Der Player prüft jetzt auf die neueste Player-Version und installiert sie, wo seine Plattform dem Player erlaubt, sich selbst zu aktualisieren; ein Web-Player aktualisiert seinen Service Worker und lädt dann neu. Er erreicht nur einen Player, der update meldet: Ein aus einem Store installierter oder von einer Geräteverwaltung verwalteter Player aktualisiert sich über diesen Kanal. Einem Online-Bildschirm wird die Anfrage sofort gesendet (state sent); ein Offline-Bildschirm hält sie als queued und bekommt sie gesendet, wenn er vor expires_at online geht, 24 Stunden nach der Anfrage, sofern --expires-in nichts anderes festlegt. Die Antwort enthält command_id, command, state und expires_at. Ein Player, der die Fähigkeit nicht meldet, antwortet mit 409 command_unsupported, und nichts wird gesendet; in einer Flotte schlägt dieser Bildschirm allein fehl. screen show listet den Befehl unter commands auf und markiert ihn, sobald der Player meldet, als done oder failed mit cause und einem kurzen detail: up_to_date, wenn die neueste Version bereits läuft, updated, sobald die neue Version gestartet ist, oder, bei einem Fehler, update_check_failed, download_failed, install_failed oder no_update_channel. Ein gesendeter Befehl ohne Bericht bleibt sent. Ein neuerer Befehl derselben Art ersetzt einen noch in der Warteschlange stehenden, und screen command cancel bricht einen noch in der Warteschlange stehenden ab. In einer Flotte enthält command jedes Ergebnisses dasselbe state. Eine Flotte (mehrere IDs, --tag oder --folder) braucht --yes. Eine abgelehnte oder fehlgeschlagene Anfrage und eine exakte Wiederholung derselben Anfrage zählen nicht zum Limit von 2 Anfragen für clear-cache, restart-app und update-software zusammen pro Bildschirm pro 10 Minuten.

screen command cancel#

Einen Befehl abbrechen, der für einen Offline-Bildschirm noch in der Warteschlange steht.

screen command cancel <id> <command_id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
<command_id>stringjakeineEine ID aus commands in screen show oder die reboot_id, reload_id oder command_id, mit der die Anfrage beantwortet wurde.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen command cancel scr_01EXAMPLESCREEN00000000 rbt_01EXAMPLEREBOOT00000000

Nur ein Befehl in der Warteschlange lässt sich abbrechen. Ein bereits gesendeter Befehl (sent oder done) antwortet mit 409 resource_conflict und der Meldung "The command was already sent.", ein Befehl, der nicht mehr in der Warteschlange steht (expired, cancelled oder superseded), antwortet mit 409 resource_conflict und der Meldung "The command is no longer queued.", und eine ID, die der Bildschirm nicht auflistet, antwortet mit 404 not_found. Die Antwort ist der Bildschirm mit dem Befehl im Zustand cancelled, und die Bildschirmrevision ändert sich nicht.

screen display#

Schalten Sie jetzt die Anzeige eines Bildschirms oder einer Flotte von Anzeigen ein oder aus oder heben Sie diese Überschreibung auf.

screen display [set] (<id>... | --tag TAG) --power on|off [--until TIME | --for DURATION] [--expect-rev REVISION]
screen display clear (<id>... | --tag TAG) [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs. Ein nachgestelltes on oder off nach den IDs ist dasselbe wie --power.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--power on|offstringja, für setkeineDie jetzt anzuwendende Macht.
--until TIMEstringneindie nächste Grenze des Display-ZeitplansEin strikter RFC 3339-Zeitpunkt, strikt in der Zukunft und höchstens 7 Tage voraus.
--for DURATIONstringneindie nächste Grenze des Display-Zeitplans30m, 2h oder 3d, bis zu 6d23h59m. Nicht mit --until.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
screenrig screen display scr_LOBBY --power off --for 2h
screenrig screen display --tag Lobby --power on
screenrig screen display clear --tag Lobby

screen display ist eine manuelle Überschreibung des Anzeigeplans. Ohne --until oder --for endet sie an der nächsten Grenze des Plans; eine spätere Änderung des Anzeigeplans oder der Zeitzone verschiebt dieses Ende zur neuen Grenze. Ohne Grenze in den nächsten acht Tagen, zum Beispiel ohne aktivierten Plan, bleibt sie bis screen display clear oder einem Ersatz bestehen. screen display clear beendet die Überschreibung, sodass der Anzeigeplan wieder gilt; ohne eine solche ist die Anzeige an. Der Player wendet jede Änderung auf einmal an und meldet die erreichte Leistung.

screen display-schedule#

Anzeigen, einstellen oder löschen, wann das Display eines Bildschirms eingeschaltet ist.

screen display-schedule show <id>
screen display-schedule set (<id>... | --tag TAG) --file FILE [--expect-rev REVISION]
screen display-schedule clear (<id>... | --tag TAG) [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs; show nimmt eine.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--file FILEPfadja, für setkeineDer Display-Zeitplan oder - für stdin.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
screenrig screen display-schedule set scr_LOBBY --file hours.json
screenrig screen display-schedule set --tag Cafe --file hours.json

Ein Anzeigezeitplan listet 1 bis 16 Fenster auf, wenn das Display eingeschaltet ist, in der Bildschirm-Zeitzone; außerhalb jedes Fensters geht das Display in den Standby. Der Player wertet ihn auf dem Gerät aus, sodass er offline weiter funktioniert. Ein Fenster, dessen end am oder vor seinem start liegt, überschreitet Mitternacht, und ein Fenster ohne start und end deckt den ganzen Tag ab. enabled: false behält die Fenster und lässt das Display an. Die gespeicherte Ausgabe von display-schedule show kann bearbeitet und mit set --file zurückgesendet werden.

{"enabled": true, "windows": [{"days": ["mon", "tue", "wed", "thu", "fri"], "start": "07:00", "end": "19:00"}, {"days": ["sat"]}]}

screen show --human druckt Display: mit der angeforderten Leistung, deren Quelle (manuelle Übersteuerung, Display-Zeitplan oder Standard) und bis wann in der Bildschirm-Zeitzone, die Zeitplanfenster und die vom Player gemeldete Leistung, nach 35 Minuten ohne Bericht als veraltet markiert.

screen display-idle#

Einen Bildschirm nach einiger Zeit ohne Nutzung abdunkeln oder diese Funktion ausschalten.

screen display-idle <id> --after SECONDS --wake WAKE [--expect-rev REVISION]
screen display-idle <id> --off [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--after SECONDSintegereines von --after oder --offkeineNach dieser Anzahl Sekunden ohne Nutzung abdunkeln, 30 bis 86400. Benötigt --wake.
--wake WAKEstringmit --afterkeineWas den Bildschirm wieder einschaltet: touch, presence oder touch,presence. Bei presence wird die Kamera des Geräts auf dem Gerät gelesen; kein Bild verlässt es.
--offbooleaneines von --after oder --offausDas Abdunkeln im Leerlauf ausschalten.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen display-idle scr_LOBBY --after 300 --wake touch
screenrig screen display-idle scr_LOBBY --after 600 --wake touch,presence --expect-rev 4
screenrig screen display-idle scr_LOBBY --off

Der Bildschirm wird nach --after Sekunden ohne Berührung oder Tastendruck oder, wenn --wake presence aufführt, ohne dass jemand vor dem Bildschirm steht, dunkel. Solange er dunkel ist, hält der Player die Wiedergabe an, ohne Wiedergaben und ohne Werbung, und meldet die Display-Stromversorgung als aus; ein Aufweckereignis schaltet den Bildschirm sofort wieder ein und die Wiedergabe wird fortgesetzt, und die Berührung, die einen dunklen Bildschirm aufweckt, wird nicht an die Seite weitergegeben. Ein Anzeigeplan oder eine Überschreibung, die das Panel ausgeschaltet hält, hat Vorrang, ebenso eine Anwendung, die device.display hält, solange ihre Seite auf dem Bildschirm ist. Nur display.idle ändert sich. Ein Player wendet es an, wenn screen show display_power.idle in seinen Host-Fähigkeiten aufführt; die Einstellung wird in jedem Fall gespeichert, und screen show führt sie als Display idle auf. Propose-Zugriff kann sie nicht ändern (insufficient_access), und ein Bildschirm in einem geschützten Ordner lehnt sie ab (protected_target).

screen brightness#

Festlegen, ob die Helligkeit eines Bildschirms dem Lichtsensor des Geräts folgt.

screen brightness <id> --mode auto|fixed [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--mode auto|fixedstringjakeineauto stellt die Helligkeit über den Lichtsensor des Geräts ein; fixed behält die Helligkeit des Betreibers bei, die Standardeinstellung.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen brightness scr_LOBBY --mode auto
screenrig screen brightness scr_LOBBY --mode fixed --expect-rev 4

Nur display.brightness ändert sich. Ein Player wendet auto an, wenn screen show brightness.auto in seinen Host-Fähigkeiten aufführt, was ein Gerät nur mit einem Lichtsensor deklariert; eine Anwendung, die die Helligkeit des Displays setzt, hat Vorrang, solange ihre Seite angezeigt wird. Die Einstellung wird in jedem Fall gespeichert, und screen show führt sie als Display brightness auf. Es gelten die Zugriffsregeln von screen display-idle.

screen kiosk-lock#

Den Player eines Bildschirms auf dem Bildschirm fixieren oder die Fixierung aufheben.

screen kiosk-lock <id> (--on | --off) [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--on, --offbooleaneines von beidenkeine--on fixiert den Player auf dem Bildschirm; --off hebt die Fixierung auf.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung. Weglassen, um die aktuelle Ressource zu schreiben. Ein übergebener veralteter Wert ist revision_conflict: erneut abrufen, erneut anwenden, erneut versuchen.
screenrig screen kiosk-lock scr_LOBBY --on
screenrig screen kiosk-lock scr_LOBBY --off --expect-rev 4

--on nutzt die Android-Bildschirmfixierung: Die Person am Bildschirm bestätigt sie beim ersten Mal, und Statusleiste, Home und Übersicht sind blockiert, solange der Player fixiert ist. Das Operator-Einstellungsfeld kann die Sperre verlassen, bis das nächste Manifest oder ein Neustart sie wieder anwendet. Ein Player wendet sie an, wenn screen show kiosk_lock in seinen Host-Fähigkeiten aufführt; die Einstellung wird in jedem Fall gespeichert, und screen show führt Kiosk lock auf, solange sie aktiv ist. Es gelten die Zugriffsregeln von screen display-idle.

screen reboot-schedule#

Zeigt an, setzt oder löscht, wann das Backend das Gerät eines Bildschirms neu startet.

screen reboot-schedule show <id>
screen reboot-schedule set (<id>... | --tag TAG) (--window SPEC... | --file FILE) [--enabled | --disabled] [--expect-rev REVISION]
screen reboot-schedule clear (<id>... | --tag TAG) [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>...stringeines von <id> oder --tagkeineEine oder mehrere scr_ Bildschirm-IDs; show nimmt eine.
--tag TAGstringeines von <id> oder --tagkeineJeder aktive Bildschirm mit diesem Tag.
--window SPECstringeines von --window oder --file, für setkeineNeustart zu Beginn dieses wöchentlichen Fensters, DAYS HH:MM-HH:MM in der Zeitzone des Bildschirms, etwa "Mon-Sun 04:00-04:30" (DAYS@HH:MM-HH:MM funktioniert auch). Bis zu 16-mal wiederholbar; jedes Fenster dauert 5 Minuten bis 24 Stunden.
--file FILEPfadeines von --window oder --file, für setkeineDer Neustartplan als JSON oder - für stdin, anstelle von --window.
--enabled, --disabledbooleannein--enabled--disabled behält die Fenster und startet nichts neu. Nicht mit --file.
--expect-rev REVISIONstringneinkeineNur eine Bildschirm-ID. Optionale Revisionsvoraussetzung.
screenrig screen reboot-schedule set scr_LOBBY --window "Mon-Sun 04:00-04:30"
screenrig screen reboot-schedule set --tag Cafe --window "Mon-Fri 04:00-04:30" --window "Sat,Sun 05:00-06:00"
screenrig screen reboot-schedule set scr_LOBBY --file reboots.json --expect-rev 4

Zu Beginn jedes Fensters löst screenRIG in der Zeitzone des Bildschirms denselben Neustart aus wie screen reboot, sodass "Mon-Sun 04:00-04:30" den Bildschirm jeden Tag um 04:00 Uhr Ortszeit neu startet. commands in screen show listet ihn mit source schedule auf, und screen show und reboot-schedule show geben next_reboot_at aus. Ein Fenster, dessen Ende auf oder vor seinem Beginn liegt, überschreitet Mitternacht, und ein Fenster ohne Zeiten deckt den ganzen Tag ab. Die gespeicherte Ausgabe von reboot-schedule show kann bearbeitet und mit set --file zurückgesendet werden:

{"enabled": true, "windows": [{"days": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"], "start": "04:00", "end": "04:30"}]}

Ein Online-Bildschirm erhält den Neustart sofort. Ein Offline-Bildschirm behält ihn nur in der Warteschlange, bis sein Fenster endet, sodass ein Neustart nie außerhalb des Fensters landet: Ein Bildschirm, der danach zurückkehrt, erhält keinen. Ein Start innerhalb einer Lücke bei der Umstellung auf Sommerzeit löst zur ersten gültigen Minute des Fensters aus, und eine Wiederholung bei der Umstellung auf Winterzeit löst einmal pro Fenster und lokalem Datum aus. Ein geplanter Neustart ersetzt nie einen von einer Person angeforderten, der noch auf den Bildschirm wartet; der Termin wird mit screen.reboot_skipped (reboot_pending) übersprungen. Der Bildschirm braucht eine gespeicherte Zeitzone und einen Player, der reboot deklariert; ein Bildschirm, der reboot später verliert, überspringt jedes Fenster und behält seinen Plan. Eine Änderung der Zeitzone verschiebt next_reboot_at in die neue Zone. Ein von einem Plan gesendeter Neustart löst keinen Offline-Alarm aus, wie unter screen reboot. screen.reboot_schedule_changed erfasst jedes Setzen oder Löschen. In einer Flotte ist jedes Ergebnis das des jeweiligen Bildschirms: reboot_unsupported für einen Bildschirm, dessen Player nicht neu starten kann.

screen uptime#

Lesen Sie die tägliche Verfügbarkeit eines Bildschirms über UTC-Tage.

screen uptime <id> [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--day-from YYYY-MM-DDstringnein29 Tage vor --day-toErster UTC-Tag, einschließlich.
--day-to YYYY-MM-DDstringneinheuteLetzter UTC-Tag, inklusive. Maximal 366 Tage nach --day-from.
screenrig screen uptime scr_01EXAMPLESCREEN00000000
screenrig screen uptime scr_01EXAMPLESCREEN00000000 --day-from 2026-09-01 --day-to 2026-09-30

data.items listet eine Zeile pro UTC-Tag mit aufgezeichnetem Zustand, älteste zuerst: online_s, offline_s, availability (online über die aufgezeichnete Zeit; null wenn nichts aufgezeichnet wurde), coverage (Anteil des Tages mit aufgezeichnetem Zustand), intervals und live für einen Tag, der das offene Intervall bis jetzt einschließt. Zeit ohne aufgezeichneten Zustand senkt coverage und ist niemals Ausfallzeit. Tage ohne Aufzeichnung haben keine Zeile.

screen presence#

Online- und Offline-Übergänge eines Bildschirms auflisten, neueste zuerst.

screen presence <id> [--since TIME] [--until TIME]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--since TIMEstringnein30 Tage vor --untilInklusive Beginn der Übergangszeit: ein RFC-3339-Zeitpunkt mit Sekunden und Offset (normalisiert auf UTC), now, oder ein Alter wie 7d, 12h oder 30m.
--until TIMEstringneinjetztExklusives Ende, in denselben Formen. Höchstens 366 Tage nach --since.
screenrig screen presence scr_01EXAMPLESCREEN00000000 --since 7d
screenrig screen presence scr_01EXAMPLESCREEN00000000 --since 2026-09-01T00:00:00Z --until 2026-09-08T00:00:00Z

data.items trägt at, state und detected_on_reconnect auf einem Offline, den der Server erst bemerkte, als der Bildschirm wieder verbunden wurde (at ist dann, wenn sein Präsenz-Lease endete). Die CLI folgt next_cursor bis zum Ende und antwortet auf jeden Übergang mit next_cursor null, also schränken Sie einen langen Bereich mit --since ein.

screen health-history#

Gesundheitsberichte eines Bildschirms über die Zeit auflisten, jeder Bericht oder eine Zusammenfassung pro Stunde.

screen health-history <id> [--from TIME] [--to TIME] [--resolution raw|hour]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ Bildschirm-ID.
--from TIMEstringnein24 Stunden vor --toInklusive Beginn der Berichtszeit: ein RFC-3339-Zeitpunkt mit Sekunden und Offset (normalisiert auf UTC), now, oder ein Alter wie 7d, 12h oder 30m.
--to TIMEstringneinjetztExklusives Ende, in denselben Formen. Höchstens 31 Tage nach --from, 93 mit --resolution hour.
--resolutionstringneinrawraw listet jeden akzeptierten Bericht; hour fasst jede UTC-Stunde zusammen.
screenrig screen health-history scr_01EXAMPLESCREEN00000000 --from 6h
screenrig screen health-history scr_01EXAMPLESCREEN00000000 --from 30d --resolution hour

raw antwortet mit data.samples, jeder akzeptierte Bericht ist geformt wie das health von screen show ohne stale. hour antwortet mit data.hours, eine Zusammenfassung pro UTC-Stunde: Berichte, Spitzen- und Durchschnittstemperatur, Spitzenlast und Speicherverhältnis, schwächstes Wi-Fi-Signal, display_disconnected, und Spitzenanzahl von Abstürzen und Renderer-Neustarts. Die CLI folgt next_cursor bis zum Ende, also schränken Sie einen langen Rohbereich ein oder verwenden Sie --resolution hour. Rohberichte kommen innerhalb von Sekunden und stündliche Zusammenfassungen innerhalb von etwa 5 Minuten an.

Kommentare

Ein Kommentar ist das eigene JSON-Objekt des Agenten, das an einen Bildschirm, eine Playlist oder eine Playlist-Seite angehängt ist. Die kompakte UTF-8-Darstellung dieses Objekts ist höchstens 1 KiB groß, und der Wert muss ein Objekt sein. screenRIG liest es nie, sendet es nie an Player und behandelt es nie als Autorisierung. Es erscheint nicht im Laufzeitmanifest und erhöht keine Revision, daher benötigen diese Befehle kein --expect-rev: Last write wins.

comment show#

Lese das Kommentarobjekt auf einem Bildschirm, einer Playlist oder einer Playlist-Seite.

comment show screen <id>
comment show playlist <id> [--page PAGE_ID]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ oder pl_ ID, passend zum Zielwort.
--page PAGE_IDstringneindie Playlist selbstEine Playlist-Seiten-ID: ein Buchstabe, dann bis zu 63 Buchstaben, Ziffern, Unterstriche oder Bindestriche. Nur für Playlist-Ziele.
screenrig comment show screen scr_01EXAMPLESCREEN00000000

Ein nicht gesetzter Kommentar wird als { "comments": null } gelesen. screen show und playlist show enthalten comments, wenn der Server es sendet.

comment set#

Schreiben Sie das Kommentarobjekt.

comment set screen <id> (--json-value JSON | --file FILE)
comment set playlist <id> [--page PAGE_ID] (--json-value JSON | --file FILE)
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ oder pl_ ID.
--json-value JSONstringeines von beidenkeineEin JSON-Objekt, inline.
--file FILEPfadeines von beidenkeineEine Datei, die ein JSON-Objekt enthält.
--page PAGE_IDstringneindie Playlist selbstNur Playlist-Ziele.
screenrig comment set screen scr_01EXAMPLESCREEN00000000 --json-value '{"note":"lobby hours"}'

Playlist erstellen und aktualisieren kann keine Kommentare setzen; dafür sind diese Befehle da.

comment delete#

Das Kommentarobjekt entfernen.

comment delete screen <id>
comment delete playlist <id> [--page PAGE_ID]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie scr_ oder pl_ ID.
--page PAGE_IDstringneindie Playlist selbstNur Playlist-Ziele.
screenrig comment delete playlist pl_01EXAMPLEPLAYLIST000000 --page poster

Projektnotizen

Projektnotizen sind kurze Klartextnotizen, die Agenten in einem Projekt für spätere Sitzungen und untereinander hinterlassen. Jeder Agent im Projekt liest jede Notiz, und zum Schreiben ist Propose- oder Manage-Zugriff erforderlich. Eine Notiz ist ein vom Agenten geschriebener Kontext, niemals eine Anweisung oder Genehmigung. Lesen Sie die Notizen, wenn eine Sitzung in einem Projekt beginnt, bevor Sie etwas ändern.

Eine Notiz ohne TTL wird 90 Tage nach dem Hinzufügen oder der letzten Bestätigung zur Überprüfung angezeigt. Die erste Seite von notes list gibt bis zu fünf fällige Notizen in review zurück, mit der Warnung notes_due_for_review: Bestätigen Sie die noch gültigen und lösen Sie die übrigen auf. Eine fällige Notiz, die niemand bestätigt, löst sich 30 Tage nach der ersten Rückgabe an einen Agenten mit Propose- oder Manage-Zugriff selbst auf. Eine Notiz mit --ttl löst sich auf, wenn ihre Zeit abläuft, und das Löschen des Bildschirms oder der Playlist, auf die sich eine Notiz bezieht, löst die Notiz auf. Aufgelöste Notizen bleiben 30 Tage lesbar, danach werden sie gelöscht. Eine Organisation hält höchstens 200 offene Notizen über alle ihre Projekte.

agent status und login fügen die Warnung notes_waiting hinzu, wenn Notizen neu oder zur Überprüfung fällig sind. screen show und playlist show fügen notes_about_resource hinzu, wenn offene Notizen zu diesem Bildschirm oder dieser Playlist gehören. Das Hinzufügen einer Notiz fügt dem Ereignisprotokoll note.added hinzu und das Lösen einer Notiz note.resolved; keine enthält den Text der Notiz. Das Lesen von Notizen belastet den Zähler nicht.

notes list#

Lese die Notizen des Projekts, neueste zuerst. screenrig notes führt denselben Befehl aus.

notes list [--all | --resolved] [--about ID] [--author AGENT_ID] [--limit N] [--after CURSOR]
ParameterTypErforderlichStandardNotizen
--allFlagneinoffene NotizenEingeschlossene aufgelöste Notizen.
--resolvedFlagneinoffene NotizenNur gelöste Notizen.
--about IDstringneinjede NotizNur Notizen über einen Bildschirm oder eine Playlist: screen:ID, playlist:ID oder die ID.
--author AGENT_IDstringneinjeder AutorNur Notizen, die dieser Agent geschrieben hat.
--limit Nintegernein50Seitengröße, 1 bis 200.
--after CURSORstringneindie erste SeiteDie next_cursor der vorherigen Seite.
screenrig notes

Jede Notiz trägt ihr author (den Namen und Typ des Agenten), created_at, about und zwei Flags: new für eine Notiz, die ein anderer Agent seit Ihrem letzten Lesen geschrieben hat, und due für eine Notiz, die zur Überprüfung fällig ist. Die erste Seite offener Notizen ohne --about oder --author ist Ihr Lesestatus: Sie verschiebt Ihren Lesemarker (ein Nur-Lesen-Agent verschiebt nichts), sodass new und counts.new beschreiben, was sich seit Ihrem vorherigen Lesen geändert hat.

notes show#

Eine Notiz lesen, offen oder gelöst.

notes show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie nte_ Notiz-ID.
screenrig notes show nte_01EXAMPLENOTE000000000

notes add#

Schreiben Sie eine Notiz für die Agenten des Projekts.

notes add <text> [--about ID] [--ttl DURATION] [--replaces ID]
notes add --file FILE [--about ID] [--ttl DURATION] [--replaces ID]
ParameterTypErforderlichStandardNotizen
<text>stringeines von beidenkeineDie Notiz: 1 bis 2000 Zeichen reiner Text nach dem Kürzen.
--file FILEPfadeines von beidenkeineLese die Notiz aus einer Datei oder - für Standardeingabe.
--about IDstringneindas gesamte ProjektNotiz an einen Bildschirm oder eine Playlist binden: screen:ID, playlist:ID oder die ID.
--ttl DURATIONstringneinÜberprüfung nach 90 TagenDie Notiz automatisch nach dieser Zeitspanne auflösen, in Stunden oder Tagen von 1h bis 365d, z. B. 12h oder 3d.
--replaces IDstringneinkeineEine offene Notiz, die diese hier ersetzt; sie wird als ersetzt gelöst.
screenrig notes add "The lobby screen is mounted in portrait: design for 1080x1920." --about screen:scr_01EXAMPLESCREEN00000000

Schreiben Sie Fakten, auf die ein anderer Agent reagieren würde, niemals Fortschrittsberichte oder Chat. Eine Notiz, deren Text (ohne Berücksichtigung von Groß-/Kleinschreibung und Leerzeichen) und Betreff eine offene Notiz wiederholt, bestätigt diese Notiz anstatt eine neue hinzuzufügen, mit der Warnung note_matched_open. Text in Form von Zugangsdaten wird mit note_contains_credential abgelehnt, und Text, der als Anweisung an ein Modell gelesen wird, mit note_rejected; nichts wird gespeichert. Die 201. offene Notiz in den Projekten der Organisation wird mit note_limit_reached abgelehnt, deren Details Notizen nennt, die zuerst aufgelöst werden müssen.

notes confirm#

Sagen, dass eine offene Notiz noch besteht. Die nächste Überprüfung ist in 90 Tagen.

notes confirm <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie nte_ ID einer offenen Notiz.
screenrig notes confirm nte_01EXAMPLENOTE000000000

notes resolve#

Eine offene Notiz auflösen, die falsch oder nicht mehr zutreffend ist.

notes resolve <id> <reason>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie nte_ ID einer offenen Notiz.
<reason>stringjakeineWas jetzt wahr ist, 1 bis 500 Zeichen
screenrig notes resolve nte_01EXAMPLENOTE000000000 "The lobby screen was remounted in landscape."

Eine gelöste Notiz wird mit note_not_open abgelehnt.

Operationen

Uploads und Veröffentlichungen laufen als Operationen. media upload, media replace und app upload warten standardmäßig auf ihre; mit diesen Befehlen schließen Sie eine ab, die Sie mit --no-wait laufen ließen.

operations show#

Den aktuellen Status einer Operation lesen.

operations show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Vorgangs-ID aus dem Umschlag, der ihn gestartet hat.
screenrig operations show op_01EXAMPLEOPERATION00000

operations wait#

Eine Operation abfragen, bis sie abgeschlossen ist.

operations wait <id> [--timeout MS] [--poll-ms MS]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Vorgangs-ID.
--timeout MSintegernein120000Frist für das Warten. Sie begrenzt auch jede zugrunde liegende Anfrage.
--poll-ms MSintegernein1000Intervall zwischen Abfragen von Operationen während des Wartens.
screenrig operations wait op_01EXAMPLEOPERATION00000

operations cancel#

Bitten Sie die Steuerungsebene, eine Operation abzubrechen.

operations cancel <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Vorgangs-ID.
screenrig operations cancel op_01EXAMPLEOPERATION00000

Ereignisse

Das Projekt-Ereignisprotokoll zeichnet auf, was das Projekt und die Flotte getan haben. Eine veröffentlichte Version fügt application.published hinzu; eine App, die screenrig.emit(code) aufruft, fügt ihr eigenes Ereignis hinzu, das der direkteste Beweis ist, dass sie auf einem Bildschirm lief.

Präsenz ist auch im Protokoll. screen.offline wird geschrieben, sobald ein Bildschirm 60 Sekunden offline war, und screen.online wenn er zurückkommt; eine Wiederverbindung innerhalb dieser 60 Sekunden schreibt keines von beiden. screen.offline enthält details.offline_since und, wenn der Bildschirm zuvor online war, details.last_online_at. screen.online enthält details.last_online_at plus details.offline_at, wenn der Bildschirm zuvor offline war, bevor er zurückkehrte. Wie jedes screen.*-Ereignis sind sie im Listen-Stream kostenlos, sodass ein Agent events follow offen halten kann, um eine Flotte zu überwachen.

events list#

Eine endliche Seite von Projektereignissen lesen.

events list [--after CURSOR] [--limit N] [--type TYPE] [--screen-id ID] [--app-id ID]
ParameterTypErforderlichStandardNotizen
--after CURSORstringneinder Beginn des SeitenfenstersNach diesem Cursor fortsetzen.
--limit Nintegerneindie Seitengröße des ServersAngeforderte Seitengröße.
--type TYPEstringneinjeder TypEin Ereignistyp oder eine Familie durch ein Präfix, das auf einen Punkt endet, wie note..
--screen-id IDstringneinjeder BildschirmEreignisse, deren Ressource dieser Bildschirm ist, einschließlich vom SDK gesendeter Ereignisse.
--app-id IDstringneinjede AnwendungEreignisse der Anwendungsressource, ihrer Releases und K/V-Einträge; vom SDK gesendete Ereignisse sind ausgeschlossen.
screenrig events list --limit 25
screenrig events list --type application.event --screen-id scr_SCREEN

Die SDK-Methoden emit() und emitConfirmed() fügen application.event-Datensätze hinzu, deren Ressource der Bildschirm ist. Lesen Sie diese mit --type application.event und optional --screen-id. Die zurückgegebenen Felder details.primitive_id und details.code identifizieren das sendende Primitive und die benannte Aktion. --app-id wählt Ereignisse der Anwendungsressource, ihrer Releases und K/V-Einträge aus und schließt diese Bildschirmereignisse daher aus.

Die Standardausgabe ist ein JSON-Umschlag für die Seite. Mit --human ist die Ausgabe eine logfmt-Zeile pro Ereignis: at=, type=, severity= und skalare Details.

events follow#

Bleiben Sie im Ereignisstrom und geben Sie Ereignisse aus, sobald sie eintreffen.

events follow [--after CURSOR] [--timeout MS] [--type TYPE]
ParameterTypErforderlichStandardNotizen
--after CURSORstringneinder Live-BereichAb diesem Cursor fortsetzen.
--timeout MSintegerneinkeine FristBeendet die gesamte Verfolgung, einschließlich Wiederverbindungs-Backoff.
--type TYPEstringneinjeder TypEin Ereignistyp oder eine Familie durch ein Präfix, das auf einen Punkt endet, wie note..
screenrig events follow

Eine Trennung oder ein vorübergehender Fehler verbindet sich mit Backoff neu und setzt ab der letzten Ereignis-ID fort. Wiedergabe nach einer Wiederverbindung ist kostenlos. Autorisierungs- und Nicht-Gefunden-Probleme stoppen den Befehl, anstatt ihn erneut zu versuchen.

Mit --type trägt der Stream weiterhin jedes Ereignis und die CLI druckt nur die passenden: screenrig events follow --type note. beobachtet Projektnotizen.

Die Standardausgabe ist NDJSON: ein Umschlag pro Ereignis in einer eigenen Zeile, statt eines einzelnen Umschlags. Verwenden Sie --human für logfmt-Zeilen.

Benachrichtigungen

Eine Benachrichtigung informiert eine Person oder ein anderes System, wenn ein Bildschirm den Zustand wechselt. Eine E-Mail-Benachrichtigung sendet jedem Empfänger eine E-Mail, eine Webhook-Benachrichtigung sendet einen signierten HTTPS-POST, und eine Slack-, Teams-, PagerDuty- oder Telegram-Benachrichtigung postet eine Nachricht in einen Chat oder Pager. Eine Organisation hat höchstens 50 über alle Kanäle und alle ihre Projekte zusammen, und jedes Projekt beginnt mit einer E-Mail an seinen Eigentümer, wenn ein Bildschirm 10 Minuten offline war.

Eine Benachrichtigung überwacht die Bedingungen, die Sie nennen:

BedingungBeginnEnde
screen_offlineDer Player ist seit 60 Sekunden offline.Der Bildschirm ist wieder online.
display_disconnectedDer Player meldet sein Display als getrennt.Das Display verbindet sich wieder.
running_hotDas Gerät meldet eine Temperatur, die die Hitzeschwelle erreicht oder überschreitet.Die Temperatur ist wieder normal.
on_batteryEin Gerät mit Akku meldet, dass es im Akkubetrieb läuft und nicht angeschlossen ist.Das Gerät meldet eine andere Stromquelle.
storage_fullDer Speicher des Players hat nicht genug Platz für seinen Inhalt.Der Platzmangel ist behoben.
content_stuckDie Inhaltsaktualisierung des Bildschirms wird wiederholt, ist fehlgeschlagen, blockiert oder nur teilweise abgeschlossen.Die Aktualisierung erreicht einen anderen Zustand.
not_playingDer Player zeigt statt seines Inhalts einen Fehler. Ein voller Speicher ist storage_full.Der Status des Players ist kein Fehler mehr.
loop_stalledEin Bildschirm, der online ist, im Zeitplan liegt und aktuelle Inhalte hat, hat länger kein Bild und kein Video gestartet, als seine Schleife erlaubt.Ein Bild oder Video startet wieder, oder screenRIG beurteilt den Bildschirm nicht mehr.
glass_blankDie Screenshots, die screenRIG über eine Serie aufgenommen hat, die die ganze Schleife abdeckt, hatten alle nur einen einzigen flachen Farbton.Zwei Screenshots hintereinander zeigen ein Bild, oder screenRIG beurteilt den Bildschirm nicht mehr.
glass_frozenDie Screenshots, die screenRIG über eine Serie aufgenommen hat, die die ganze Schleife abdeckt, zeigten alle dasselbe Bild.Zwei Screenshots hintereinander zeigen ein bewegtes Bild, oder screenRIG beurteilt den Bildschirm nicht mehr.
crashingDer Player ist wiederholt abgestürzt oder hat seinen Renderer wiederholt neu gestartet.Nie: Jede Spitze ist eine eigene Meldung.
source_failedDie Aktualisierung einer Datenquelle ist fehlgeschlagen.Eine Aktualisierung gelingt.
source_staleEine Datenquelle ist so lange ausgefallen, bis ihre Daten abgelaufen sind.Eine Aktualisierung gelingt.
card_data_staleDie Daten einer Karte, mit einem Ablauf geschrieben, haben ihn erreicht, während ein Bildschirm die Karte zeigt, und nichts hat sie erneuert.Ein Schreibzugriff auf die Daten der Karte geht durch.
reach_droppedEine Kampagne erreicht weniger Bildschirme als bei ihrer letzten Veröffentlichung, weil Bildschirme ihre Tags oder Ordner verlassen haben oder archiviert oder gelöscht wurden.Die Kampagne erreicht wieder so viele Bildschirme, oder sie wird erneut veröffentlicht.
group_emptyEin Tag oder Ordner in der Zielgruppe einer Kampagne passt auf keinen Bildschirm.Der Tag oder Ordner passt wieder auf einen Bildschirm, oder eine Veröffentlichung entfernt ihn aus der Zielgruppe.

Eine Bedingung löst eine Meldung aus, sobald sie --hold Minuten angedauert hat (Standard 10), sodass eine kurze Wiederverbindung ruhig bleibt. Endet sie vorher, wird nichts gesendet; endet sie, nachdem eine Meldung gesendet wurde, folgt eine Behebungsmeldung. crashing wird sofort gesendet. Eine Meldung wird außerdem übersprungen, wenn jemand den Alarm des Bildschirms während der Wartezeit quittiert oder zurückstellt oder wenn eine Stummschaltung den Bildschirm abdeckt. --tag beschränkt eine Benachrichtigung auf Bildschirme mit diesem Tag; ohne Tag zählt jeder Bildschirm.

Jede Meldung hat einen Schweregrad. Eine geöffnete Meldung ist error für screen_offline und warning für jede andere Bedingung, und eine behobene Meldung oder ein Test ist info. --min-severity LEVEL (info, warning oder error) erzeugt keine geöffnete Meldung unterhalb dieser Stufe, und eine behobene Meldung folgt ihrer geöffneten. --severity CONDITION=LEVEL, wiederholbar, setzt die Stufe einer Bedingung für diese Benachrichtigung, etwa --severity not_playing=error; sie zählt für --min-severity und ist der Schweregrad, den Teams und PagerDuty zeigen. Der Text von E-Mail, Slack und Telegram nennt den Schweregrad, und ein Webhook-Body enthält severity.

--active-hours SPEC sendet geöffnete Meldungen nur innerhalb wöchentlicher Fenster, gelesen in --timezone ZONE, das es voraussetzt. SPEC ist DAYS HH:MM-HH:MM, etwa "Mon-Fri 08:00-22:00"; bis zu 16-mal wiederholbar. Mit --outside-hours hold, dem Standard, wartet eine Meldung, die außerhalb der Zeiten fällig wird, auf das nächste Fenster und geht dann hinaus, wenn ihre Bedingung noch gilt; eine Bedingung, die vorher endet, sendet also nichts. Mit drop wird die Meldung als outside_hours übersprungen, was notifications deliveries auflistet. Eine behobene Meldung zu einer gesendeten geöffneten Meldung geht immer hinaus, crashing folgt den Zeiten wie jede andere Bedingung, eine Zurückstellung wird zuerst geprüft, und notifications test ignoriert Zeiten, Schweregrad und Zielgruppe.

--audience FILE (Inline-JSON, eine Datei oder - für stdin) wählt die Bildschirme mit den Regeln einer Kampagnen-Zielgruppe aus, etwa {"all":[{"tag":"level2"},{"tag":"overhead"}]} für Bildschirme mit beiden Tags; --all-tags TAG und --any-tag TAG sind die Kurzformen für eine all- und eine any-Regel von Tags, und --tag bedeutet ein beliebiges der Tags. --tag, --any-tag, --all-tags und --audience schließen einander aus.

loop_stalled, glass_blank und glass_frozen sind Urteile, die screenRIG aus den Wiedergabeberichten und Screenshots zieht, die es erhält, und sie lassen aus, was sie nicht beurteilen können: einen Bildschirm, der offline ist, dessen Anzeige aus ist, der übernommen oder gesperrt ist, der ein einzelnes Standbild oder eine Videowand zeigt oder dessen Player keine Wiedergabenummern sendet. Beurteilt screenRIG einen Bildschirm nicht mehr, den es in einem dieser Zustände gefunden hatte, wird der Alarm geschlossen, aber E-Mail, Slack, Teams und Telegram senden keine Behebungsmeldung, weil nichts gezeigt hat, dass sich der Bildschirm erholt; PagerDuty behebt seinen Vorfall trotzdem.

source_failed und source_stale überwachen die Datenquellen des Projekts, nicht seine Bildschirme: Eine Meldung nennt die Quelle und verlinkt ihre Seite, und --tag passt nie auf eine Quelle.

card_data_stale beobachtet eine Karte, keinen Bildschirm. Schreiben Sie die Daten einer Karte mit einem Ablauf, der auf den Zeitplan ihres Schreibers abgestimmt ist (card data put --ttl 30m): Hört der Job oder Agent auf, der sie erneuert, laufen die Daten ab, die Karte ist auf jedem Bildschirm leer, der sie zeigt, und diese Bedingung meldet es Ihnen. Die Meldung nennt die Karte und wann ihre Daten abgelaufen sind und verlinkt den Seiteneditor auf einer Seite, die sie platziert. Die Dokumente einer Datenquelle werden hier nie gemeldet (source_stale deckt sie ab), ebenso wenig eine Karte, die kein Bildschirm zeigt, ohne Ablauf geschriebene Daten oder gelöschte Daten. --tag trifft nie auf eine Karte zu.

reach_dropped und group_empty überwachen eine Kampagne, nicht einen Bildschirm. Die Meldung nennt die Kampagne und die Bildschirme, die sie zuvor und jetzt erreicht hat, oder den leeren Tag oder Ordner und verlinkt auf den Kalender der Kampagne. Eine Kampagne gehört zum Projekt, daher schränken --tag, --any-tag, --all-tags und --audience diese beiden nie ein; --min-severity, --severity, --active-hours und --hold gelten wie für jede Bedingung, und beide sind standardmäßig warning. --reach-drop-screens N und --reach-drop-percent P senden eine reach_dropped-Meldung nur bei einem Rückgang um mindestens N Bildschirme und mindestens P Prozent der Bildschirme, die die Kampagne bei ihrer Veröffentlichung erreicht hat; ein Rückgang muss beides erfüllen, und ohne sie löst jeder Rückgang eine Meldung aus. Sie setzen reach_dropped in --conditions voraus. Jeder leere Tag oder Ordner einer Kampagne ist eine eigene Meldung, und notifications deliveries zeigt ihn als audience_group (tag:Lobby oder folder:sfd_…). Eine Veröffentlichung, die eine leere Gruppe aus der Zielgruppe entfernt, schließt einen PagerDuty-Incident und den Alarm eines Webhooks, sendet aber keine Behebungs-E-Mail und keine Chat-Nachricht.

E-Mails gehen an die verifizierte Adresse jedes Empfängers: eine E-Mail pro Empfänger für alles, was innerhalb von etwa zwei Minuten fällig wird, mit einem Link zu jedem Bildschirm und zur Benachrichtigung im Dashboard. Empfänger sind owner, also wer beim Versand der Meldung Projektinhaber ist, und die Benutzer-IDs von Projektmitgliedern. Ein Empfänger, der keine verifizierte Adresse hat oder das Projekt verlassen hat, wird übersprungen. Benachrichtigungs-E-Mails und Bildschirmmeldungen sind kostenlos.

Jede E-Mail enthält einen Abmeldelink für ihren eigenen Empfänger: die Abmelden-Schaltfläche von Mail-Apps und einen Link in der Fußzeile. Wer ihm folgt, beendet die E-Mails dieser Benachrichtigung an genau diese Person, ohne sich anzumelden, und die geöffnete Seite hat eine Schaltfläche Resubscribe. Die anderen Empfänger sind nicht betroffen, und die Person bleibt unter den Empfängern. notifications show listet mit unsubscribed auf, wer sich abgemeldet hat, und notifications resubscribe schickt ihr wieder E-Mails. Eine Meldung, für die niemand mehr übrig ist, wird als no_recipients übersprungen.

Eine Webhook-Benachrichtigung sendet jede Meldung als JSON per POST; Sie verifizieren sie, wie unter Lieferung verifizieren beschrieben. Mit --events sendet sie außerdem rohe Projekt-Ereignisse per POST, sobald sie eintreten; diese Zustellungen werden wie unter Webhooks beschrieben gemessen.

Eine Slack-, Teams-, PagerDuty- oder Telegram-Benachrichtigung postet eine Nachricht pro Ausfall und Bildschirm: den Bildschirm, was sich geändert hat, seit wann, das Projekt, einen Link zum Bildschirm und, wenn ein Offline-Bildschirm zurück ist, seine wahrscheinliche Ursache, falls sie dann bekannt ist. Eine Wiederherstellungsnachricht folgt, sobald die erste gesendet wurde, und löst in PagerDuty den Vorfall auf, den die erste geöffnet hat. Die Zugangsdaten gibst du einmal an (--slack nimmt die URL eines eingehenden Webhooks, --teams die URL eines Workflows-Webhooks, --pagerduty einen Routing-Schlüssel der Events-API v2, --telegram ein Bot-Token mit --telegram-chat); sie werden versiegelt, nie wieder angezeigt, und destination_hint zeigt nur ihr maskiertes Ende. Ein - liest sie aus einer Zeile von stdin, damit sie nicht in deinem Shell-Verlauf landen. Ein fehlgeschlagener Post wird 24 Stunden lang wiederholt, und eine Benachrichtigung, die 72 Stunden lang fehlschlägt, wird deaktiviert.

ProblemcodeBeendenBedeutung
webhook_url_rejected8Die URL ist nicht https auf Port 443 oder 8443, oder ihr Host löst nicht nur auf öffentliche Internetadressen auf. error.detail enthält den Grund des Servers. Es wurde nichts erstellt oder geändert.
notification_destination_rejected8Das Ziel passt nicht zu seinem Kanal oder ist die URL eines eingestellten Office-365-Connectors. error.detail nennt die passende Form. Es wurde nichts erstellt oder geändert.
notification_limit_reached5Die Organisation hat bereits 50 Benachrichtigungen. Bitte löschen Sie zuerst eine.
revision_conflict6Die --expect-rev Revision war veraltet. Führen Sie notifications show aus und versuchen Sie es erneut.
rate_limited7Mehr als 20 notifications test Aufrufe pro Minute für diese Organisation.

notifications create#

Erstellt eine E-Mail-, Webhook-, Slack-, Teams-, PagerDuty- oder Telegram-Benachrichtigung.

notifications create (--email RECIPIENTS | --webhook URL | --slack URL | --teams URL | --pagerduty KEY
                      | --telegram TOKEN --telegram-chat CHAT_ID) [--conditions LIST] [--events TYPES]
                     [--tag TAG... | --any-tag TAG... | --all-tags TAG... | --audience FILE] [--hold MINUTES]
                     [--min-severity LEVEL] [--severity CONDITION=LEVEL]... [--active-hours SPEC]...
                     [--timezone ZONE] [--outside-hours hold|drop] [--reach-drop-screens N] [--reach-drop-percent P]
                     [--description TEXT] [--disabled]
ParameterTypErforderlichStandardNotizen
--email RECIPIENTSstringein Kanal-FlagkeineE-Mail an diese durch Kommas getrennten Empfänger senden: owner oder die Benutzer-ID eines Projektmitglieds, maximal 20.
--webhook URLstringein Kanal-FlagkeineEine https-URL auf Port 443 (Standard) oder 8443, deren Host nur auf öffentliche Internetadressen auflöst. Der Server prüft sie bei jedem Schreibvorgang und erneut vor jeder Lieferung. Eine URL mit Zugangsdaten (user:pass@ oder token@) oder einem #-Fragment wird lokal mit Exit 2 abgelehnt.
--conditions LISTstringja, außer bei einem WebhookkeineKommagetrennte Bedingungen aus der Tabelle oben. Ein Webhook benötigt diese, --events oder beides.
--slack URLstringein Kanal-FlagkeinePostet in Slack über die URL eines eingehenden Webhooks auf hooks.slack.com, oder -, um sie aus einer Zeile von stdin zu lesen.
--teams URLstringein Kanal-FlagkeinePostet in Teams über die URL eines Workflows-Webhooks (der Trigger „Wenn eine Teams-Webhookanforderung empfangen wird“), oder - für stdin. URLs von Office-365-Connectors sind eingestellt und werden abgelehnt.
--pagerduty KEYstringein Kanal-FlagkeineLöst PagerDuty-Vorfälle mit einem Routing-Schlüssel der Events-API v2 aus und löst sie wieder auf, oder - für stdin.
--telegram TOKENstringein Kanal-FlagkeinePostet in Telegram mit einem Bot-Token, oder - für stdin. Braucht --telegram-chat.
--telegram-chat CHAT_IDstringmit --telegramkeineDer Chat, in den gepostet wird: seine numerische ID, etwa -1001234567890, oder @channelname.
--events TYPESstringneinkeineNur für Webhooks. Außerdem diese rohen Projekt-Ereignisse per POST senden: 1 bis 32 durch Kommas getrennte genaue Typen, wie screen.online, oder Präfixe, die auf .* enden, wie screen.*.
--tag TAGstringneinjeder BildschirmNur Bildschirme mit diesem Tag. Wiederholen Sie das Flag oder trennen Sie mit Kommas, bis zu 16 Tags.
--hold MINUTESintegernein10Wie lange eine Bedingung andauern muss, bevor sie eine Meldung auslöst, 0 bis 1440. Bei crashing gibt es keine Wartezeit.
--all-tags TAGstringneinkeineNur Bildschirme mit allen aufgelisteten Tags. Wiederholen Sie das Flag oder trennen Sie mit Kommas.
--any-tag TAGstringneinkeineNur Bildschirme mit mindestens einem aufgelisteten Tag, wie --tag. Wiederholen Sie das Flag oder trennen Sie mit Kommas.
--audience FILEstringneinjeder BildschirmDie Bildschirme als Kampagnen-Zielgruppenregel in JSON: inline, eine Datei oder - für stdin. Nicht mit den Tag-Optionen.
--min-severity LEVELstringneinkeineinfo, warning oder error: darunterliegende geöffnete Meldungen werden nicht gesendet.
--severity CONDITION=LEVELstringneindie StandardwerteSetzt den Schweregrad einer Bedingung für diese Benachrichtigung. Wiederholen Sie das Flag.
--active-hours SPECstringneinimmerSendet geöffnete Meldungen nur innerhalb dieses wöchentlichen Fensters, DAYS HH:MM-HH:MM etwa "Mon-Fri 08:00-22:00". Bis zu 16-mal wiederholbar. Erfordert --timezone.
--timezone ZONEstringmit --active-hourskeineDie IANA-Zone, in der die Zeiten gelesen werden, etwa America/Los_Angeles.
--outside-hours MODEstringneinholdhold wartet auf das nächste Fenster; drop überspringt die Meldung.
--reach-drop-screens Nintegerneinjeder RückgangNur mit reach_dropped: sendet nur dann eine Meldung, wenn die Kampagne mindestens N Bildschirme verloren hat (1 oder mehr).
--reach-drop-percent Pintegerneinjeder RückgangNur mit reach_dropped: verlangt zusätzlich einen Verlust von mindestens P Prozent (1 bis 100) der Bildschirme, die die Kampagne bei ihrer Veröffentlichung erreicht hat.
--description TEXTstringneinkeineMaximal 200 Zeichen.
--stale-after DURATIONstringneinje nach ArtWie lange die Card die letzten guten Daten behält, wenn die Quelle nicht aktualisieren kann, von 1m bis 7d, mindestens das Doppelte von --refresh; none behält sie bis zur nächsten Aktualisierung. Danach laufen die Daten auf jedem Bildschirm ab. momentus ist standardmäßig 30m.
--disabledbooleanneinausDeaktiviert erstellen. Es wird nichts gesendet, bis notifications update --enable.
screenrig notifications create --email owner --conditions screen_offline,display_disconnected --tag Lobby
screenrig notifications create --webhook https://hooks.example.com/screenrig --conditions screen_offline,crashing
screenrig notifications create --slack - --conditions screen_offline,crashing < slack-url.txt

Der Umschlag ist die Benachrichtigung. Der Umschlag eines Webhooks enthält sein Signaturgeheimnis in data.secret (whsec_…) mit der Warnung webhook_secret_shown_once. Speichern Sie das Geheimnis sofort im Geheimnisspeicher des Empfängers. Nur notifications rotate-secret gibt es erneut zurück, und die CLI schreibt es nie in ihre Konfiguration, das Betriebsprotokoll oder den Wiederherstellungszustand. Nach einer unterbrochenen oder mehrdeutigen Erstellung führen Sie denselben Befehl innerhalb von 24 Stunden erneut aus: Er verwendet den gespeicherten Idempotenzschlüssel, und der Server liefert dieselbe Antwort inklusive Geheimnis zurück. Meldungen beginnen mit dem ersten Ereignis nach der Erstellung der Benachrichtigung.

notifications list#

Benachrichtigungen dieses Projekts auflisten, niemals deren Geheimnisse.

notifications list
screenrig notifications list

Unterhalb des Manage-Zugriffs ist url eines Webhooks leer, und url_redacted ist true.

notifications show#

Eine Benachrichtigung und deren Zustellungsstatus prüfen.

notifications show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Benachrichtigungs-ID ntf_ (jeder Kanal außer Webhook) oder whk_ (Webhook).
screenrig notifications show ntf_01EXAMPLENOTICE00000

status ist active, failing solange seit failing_since keine Zustellung erfolgreich war, oder disabled. Nach 72 Stunden ununterbrochenem Fehlschlag wird die Benachrichtigung mit disabled_reason: delivery_failures deaktiviert, und das Ereignisprotokoll verzeichnet notification.disabled. snoozed_until ist vorhanden, solange eine Pause gesetzt ist. last_success_at und last_failure_at melden die neuesten Ergebnisse.

notifications update#

Ändert Empfänger, URL, Ziel, Bedingungen, Bildschirme, Wartezeit, Pause oder Aktivierungszustand einer Benachrichtigung.

notifications update <id> [--email RECIPIENTS | --url URL | --destination VALUE] [--telegram-chat CHAT_ID]
                          [--conditions LIST | --clear-conditions]
                          [--events TYPES | --clear-events] [--tag TAG... | --any-tag TAG... | --all-tags TAG... | --audience FILE | --all-screens]
                          [--hold MINUTES] [--min-severity LEVEL | --clear-min-severity]
                          [--severity CONDITION=LEVEL]... [--clear-severity]
                          [--active-hours SPEC]... [--timezone ZONE] [--outside-hours hold|drop] [--clear-active-hours]
                          [--reach-drop-screens N] [--reach-drop-percent P] [--clear-reach-drop]
                          [--description TEXT | --clear-description] [--enable | --disable]
                          [--snooze WHEN] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Benachrichtigungs-ID ntf_ (jeder Kanal außer Webhook) oder whk_ (Webhook).
--email RECIPIENTSstringMindestens eine ÄnderungUnverändertE-Mail-Benachrichtigungen: ersetzt die Empfänger.
--url URLstringMindestens eine ÄnderungUnverändertWebhook-Benachrichtigungen: ersetzt die URL, geprüft wie bei create.
--destination VALUEstringMindestens eine ÄnderungUnverändertSlack-, Teams-, PagerDuty- und Telegram-Benachrichtigungen: ersetzt die Zugangsdaten, geprüft wie bei create. - liest sie aus einer Zeile von stdin.
--telegram-chat CHAT_IDstringMindestens eine ÄnderungUnverändertTelegram-Benachrichtigungen: ersetzt den Chat.
--conditions LISTstringMindestens eine ÄnderungUnverändertErsetzt die Bedingungen.
--clear-conditionsbooleanMindestens eine ÄnderungausAlle Bedingungen entfernen. Ein Webhook benötigt dann --events.
--events TYPESstringMindestens eine ÄnderungUnverändertWebhook-Benachrichtigungen: ersetzt die rohen Projekt-Ereignisse.
--clear-eventsbooleanMindestens eine ÄnderungausWebhook-Benachrichtigungen: keine rohen Projekt-Ereignisse mehr per POST senden. Sie benötigt dann Bedingungen.
--tag TAGstringMindestens eine ÄnderungUnverändertErsetzt die Bildschirm-Tags.
--all-screensbooleanMindestens eine ÄnderungausDie Bildschirm-Tags und die Zielgruppe entfernen; die Benachrichtigung deckt jeden Bildschirm ab.
--hold MINUTESintegerMindestens eine ÄnderungUnverändert0 bis 1440.
--all-tags TAGstringMindestens eine ÄnderungUnverändertErsetzt die Bildschirme durch die mit allen aufgelisteten Tags.
--any-tag TAGstringMindestens eine ÄnderungUnverändertErsetzt die Bildschirme durch die mit mindestens einem aufgelisteten Tag, wie --tag.
--audience FILEstringMindestens eine ÄnderungUnverändertErsetzt die Bildschirme durch eine Kampagnen-Zielgruppenregel in JSON: inline, eine Datei oder - für stdin.
--min-severity LEVELstringMindestens eine ÄnderungUnverändertinfo, warning oder error.
--clear-min-severitybooleanMindestens eine ÄnderungausDen Schweregradfilter entfernen.
--severity CONDITION=LEVELstringMindestens eine ÄnderungUnverändertErsetzt die Schweregrad-Übersteuerungen durch diese. Wiederholen Sie das Flag.
--clear-severitybooleanMindestens eine ÄnderungausJede Schweregrad-Übersteuerung entfernen.
--active-hours SPECstringMindestens eine ÄnderungUnverändertErsetzt die Fenster durch diese. Bis zu 16-mal wiederholbar. --timezone ist standardmäßig die Zone, die die Benachrichtigung bereits hat.
--timezone ZONEstringMindestens eine ÄnderungUnverändertDie IANA-Zone, in der die Zeiten gelesen werden. Allein behält es die aktuellen Fenster.
--outside-hours MODEstringMindestens eine ÄnderungUnveränderthold oder drop. Allein behält es die aktuellen Fenster.
--clear-active-hoursbooleanMindestens eine ÄnderungausDie aktiven Zeiten entfernen. Dafür zurückgehaltene Meldungen werden sofort neu beurteilt.
--reach-drop-screens NintegerMindestens eine ÄnderungUnverändertErsetzt die Mindestzahl an Bildschirmen, die die Kampagne für eine reach_dropped-Meldung verloren haben muss.
--reach-drop-percent PintegerMindestens eine ÄnderungUnverändertErsetzt den Mindestprozentsatz ihrer veröffentlichten Reichweite, den die Kampagne verloren haben muss.
--clear-reach-dropbooleanMindestens eine ÄnderungausEntfernt den Schwellenwert, sodass jeder Rückgang eine Meldung auslöst. Nehmen Sie reach_dropped nur zusammen damit aus --conditions.
--description TEXTstringMindestens eine ÄnderungUnverändertMaximal 200 Zeichen.
--clear-descriptionbooleanMindestens eine ÄnderungausDie Beschreibung entfernen.
--enablebooleanMindestens eine ÄnderungausSetzt den Fehlerzustand zurück und beginnt beim Ereignis, das die Änderung aufzeichnet; nichts aus der Zeit der Deaktivierung wird gesendet.
--disablebooleanMindestens eine ÄnderungausStoppt Meldungen; ausstehende Meldungen schlagen mit webhook_disabled fehl.
--snooze WHENstringMindestens eine ÄnderungUnverändertBis dahin nichts senden: eine Dauer wie 30m, 1h oder 2d (unter 30 Tagen), ein Zeitpunkt nach RFC 3339 mit Sekunden und Offset oder off, um die Pause zu beenden. Meldungen, die in der Zwischenzeit fällig werden, werden übersprungen und nicht später gesendet.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung.
screenrig notifications update ntf_01EXAMPLENOTICE00000 --snooze 2h

update ändert nur die Felder, die Sie übergeben. Der Kanal ändert sich nie.

notifications delete#

Eine Benachrichtigung löschen. Ausstehende Meldungen schlagen mit webhook_deleted fehl.

notifications delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Benachrichtigungs-ID ntf_ (jeder Kanal außer Webhook) oder whk_ (Webhook).
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung.
screenrig notifications delete ntf_01EXAMPLENOTICE00000

notifications rotate-secret#

Ersetzt das Signaturgeheimnis einer Webhook-Benachrichtigung und gibt das neue einmal aus. Jeder andere Kanal hat kein Geheimnis.

notifications rotate-secret <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Benachrichtigungs-ID ntf_ (jeder Kanal außer Webhook) oder whk_ (Webhook).
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung.
screenrig notifications rotate-secret whk_01EXAMPLEWEBHOOK00000

Der Umschlag enthält das neue Geheimnis in data.secret mit der Warnung webhook_secret_shown_once; speichern Sie es sofort. Das vorherige Geheimnis signiert nicht mehr, aber höchstens ein bereits laufender Versuch kann noch damit signiert ankommen, daher akzeptieren Sie beide für kurze Zeit. Nach einer unterbrochenen oder mehrdeutigen Rotation führen Sie denselben Befehl innerhalb von 24 Stunden erneut aus, um dasselbe Geheimnis zurückzubekommen.

notifications test#

Sendet nur an diese Benachrichtigung eine Test-E-Mail, einen signierten Test-POST oder eine Chat-Nachricht.

notifications test <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Benachrichtigungs-ID ntf_ (jeder Kanal außer Webhook) oder whk_ (Webhook).
screenrig notifications test ntf_01EXAMPLENOTICE00000

Der Umschlag ist die eingereihte Zustellung. Sie wird einmal ohne Wiederholungen versucht, funktioniert bei einer deaktivierten oder pausierten Benachrichtigung und ändert nie den Fehlerzustand der Benachrichtigung. Maximal 20 Testzustellungen pro Minute und Organisation; mehr ist rate_limited (Exit 7). Lesen Sie das Ergebnis mit notifications deliveries.

Ein PagerDuty-Test löst ein Informationsereignis mit dem Schlüssel screenrig:test:DELIVERY_ID aus und löst es sofort wieder auf, sodass kein Vorfall offen bleibt.

notifications resubscribe#

Sendet einer Person, die sich von den E-Mails einer Benachrichtigung abgemeldet hat, wieder E-Mails.

notifications resubscribe <id> --user USER_ID
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie ntf_-ID einer E-Mail-Benachrichtigung.
--user USER_IDstringjakeineDie Benutzer-ID der Person, wie notifications show sie unter unsubscribed aufführt.
screenrig notifications resubscribe ntf_01EXAMPLENOTICE00000 --user usr_01EXAMPLEPERSON0000

Der Umschlag ist die Benachrichtigung. Eine Person, die nicht abgemeldet ist, ändert nichts. Das erneute Anmelden einer Person erhöht die Revision und hängt notification.updated an. Eine Benachrichtigung eines anderen Kanals oder Projekts ist not_found (Exit 4).

notifications deliveries#

Das Zustellungsprotokoll einer Benachrichtigung lesen, neueste zuerst.

notifications deliveries <id> [--before CURSOR] [--limit N]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Benachrichtigungs-ID ntf_ (jeder Kanal außer Webhook) oder whk_ (Webhook).
--before CURSORstringneindas neueste EreignisDie next_cursor (whc1_…) der vorherigen Seite.
--limit Nintegernein50Zeilen pro Seite, 1 bis 200.
screenrig notifications deliveries ntf_01EXAMPLENOTICE00000 --limit 20

Jede Zeile ist ein Ereignis oder eine Meldung zu einer Bedingung auf einem Bildschirm: event_type, state (pending, succeeded, failed oder skipped), attempts, last_status und eine feste last_error-Klasse wie http_status, timeout, connection_failed, tls_failed, dns_failed, url_rejected, email_failed oder email_rejected. Eine Bildschirmmeldung fügt condition, phase (opened oder resolved), screen_id, screen_name und since hinzu, und eine E-Mail-Meldung fügt emailed hinzu, die Anzahl der erreichten Personen. Eine Meldung, die nie gesendet werden musste, ist skipped, mit ihrem Grund in last_error: condition_cleared (der Bildschirm hat den Zustand verlassen, bevor die Wartezeit endete), not_opened (es wurde keine Meldung gesendet, die als behoben zu melden wäre), snoozed (die Benachrichtigung ist pausiert), acknowledged (jemand hat den Alarm des Bildschirms während der Wartezeit quittiert oder zurückgestellt), muted (eine Stummschaltung deckt den Bildschirm ab), no_recipients (kein Empfänger ist ein Projektmitglied mit verifizierter Adresse, das sich nicht abgemeldet hat), grouped (der Bildschirm ist zusammen mit anderen in die Bedingung geraten, und eine Meldung in einer anderen Zeile nennt sie alle) oder no_longer_judged (eine Bedingung loop_stalled, glass_blank oder glass_frozen endete, weil screenRIG den Bildschirm nicht mehr beurteilte, daher wurde keine Wiederherstellung gemeldet). Die Meldung, die eine Gruppe von Bildschirmen nannte, trägt group (id, attribute, value und count), und jeder andere Bildschirm der Gruppe trägt group_id; --human zeigt beides in einer Spalte GROUP. Zeilen enthalten niemals die Antwort des Empfängers. next_cursor ist null am Ende des Protokolls. Ein fehlgeschlagener Versuch wird mit Backoff erneut versucht, ab 30 Sekunden verdoppelt bis zu einer Stunde, 24 Stunden lang; danach ist die Zeile failed.

Lieferung verifizieren

Der Body einer Bildschirmmeldung ist JSON: type (alert.opened oder alert.resolved), id (die Zustellungs-ID), notification_id, project_id, condition, screen (id und name), since (wann die Bedingung begann), at (wann sie lange genug angedauert hat oder behoben wurde) und event_id. Ein rohes Ereignis von --events ist dasselbe JSON-Objekt, das events list zurückgibt. Die Header sind ScreenRig-Webhook-Id (die Benachrichtigungs-ID), ScreenRig-Event-Id (stabil bei Wiederholungen: die Zustellungs-ID bei einer Meldung, der Ereignis-Cursor bei einem Ereignis) und ScreenRig-Signature: t=<unix seconds>,v1=<hex>, wobei v1 HMAC-SHA256 über "<t>.<raw body>" ist, mit dem geheimen String als Schlüssel. Berechnen Sie es über die Rohbytes vor dem Parsen von JSON, vergleichen Sie in konstanter Zeit, lehnen Sie ein altes t ab und deduplizieren Sie anhand von ScreenRig-Event-Id, da die Zustellung mindestens einmal und ungeordnet erfolgt. Antworten Sie innerhalb von 10 Sekunden mit 2xx; Weiterleitungen werden nicht verfolgt.

import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body bytes (Buffer) exactly as received.
function verify(rawBody, signatureHeader, secret, toleranceSeconds = 300) {
  if (typeof signatureHeader !== "string" || !signatureHeader) return false;
  const parts = Object.fromEntries(signatureHeader.split(",").map((part) => part.split("=", 2)));
  const t = Number(parts.t);
  if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > toleranceSeconds) return false;
  const expected = createHmac("sha256", secret).update(`${t}.`).update(rawBody).digest();
  const given = Buffer.from(parts.v1 ?? "", "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}

Berichte

reports show KIND erstellt einen Bericht (fleet_health, uptime, publishing, alerts, alert_log oder proof_of_play) und schreibt ihn mit --format csv, xlsx oder pdf und --output FILE in eine Datei; reports subscriptions sendet einen Bericht nach Zeitplan per E-Mail an Projektmitglieder; project export DIR schreibt Projektdaten mit dem Ergebnis jedes Abschnitts. Berichte und Exporte beschreibt jeden davon.

Audit-Protokoll

audit list|show|head|verify|export liest das Audit-Protokoll des Projekts: audit list durchsucht die Konfigurationsänderungen nach Akteur, Quelle, Ressource, Aktion und Feld, audit show zeigt einen Eintrag mit dem Vorher und Nachher jedes geänderten Felds, audit head zeigt den Kettenkopf, der als Anker aufzubewahren ist, audit verify berechnet die Kette neu (optional gegen einen Anker) und endet mit Code 13, wenn sie nicht verifiziert wird, und audit export schreibt das gefilterte Protokoll als CSV-, XLSX- oder PDF-Datei. Audit-Protokoll beschreibt jeden dieser Befehle.

Alarme

Ein Alarm ist ein Problem auf einem Bildschirm, solange es besteht. Er wird geöffnet, wenn ein Bildschirm in eine Benachrichtigungsbedingung außer crashing gerät, ob eine Benachrichtigung sie überwacht oder nicht, und wird behoben, wenn die Bedingung endet. Ein Bildschirm hat pro Bedingung höchstens einen offenen Alarm, und eine Absturzserie ist eine Meldung, nie ein Alarm. alerts list zeigt, was gerade offen ist.

Ein offener Alarm braucht Aufmerksamkeit, bis jemand ihn quittiert oder zurückstellt oder eine Stummschaltung seinen Bildschirm abdeckt. Quittieren bedeutet, dass sich jemand darum kümmert: Der Alarm bleibt offen, hält fest, wer ihn wann quittiert hat, und braucht bis zu seiner Behebung keine Aufmerksamkeit. Zurückstellen quittiert bis zu einem Zeitpunkt, der höchstens 30 Tage in der Zukunft liegt, und der Alarm braucht dann wieder Aufmerksamkeit, wenn er noch offen ist. Ein späteres Quittieren oder Zurückstellen ersetzt das frühere. Solange ein Alarm quittiert oder zurückgestellt ist, wird die Meldung einer Benachrichtigung dazu, die noch in der Wartezeit ist, übersprungen.

Eine Stummschaltung ist für Wartungsarbeiten gedacht: Sie nennt Bildschirme, Tags oder beides und endet zu einem Zeitpunkt, der höchstens 30 Tage in der Zukunft liegt. Sie deckt einen Bildschirm ab, solange seine ID aufgeführt ist oder er einen aufgeführten Tag trägt; ein später getaggter Bildschirm ist also abgedeckt, einer, der den Tag verliert, nicht mehr. Die Alarme eines stummgeschalteten Bildschirms werden weiterhin geöffnet und behoben, mit muted markiert, brauchen aber nie Aufmerksamkeit, und jede Benachrichtigung überspringt ihre Meldungen. Eine Organisation hat höchstens 50 aktuelle Stummschaltungen über alle ihre Projekte.

counts.attention in alerts list ist die Zahl, die das Dashboard neben Alarme anzeigt. Das Öffnen, Beheben und Quittieren eines Alarms fügt screen.alert_opened, screen.alert_resolved und screen.alert_acknowledged zum Projekt-Ereignisprotokoll hinzu, und das Anlegen und Beenden einer Stummschaltung fügt alert_mute.created und alert_mute.deleted hinzu. Wie jedes screen.*-Ereignis sind sie im Listen-Stream kostenlos. Behobene Alarme bleiben für die Ereignisaufbewahrung des Tarifs aufgelistet. Das Lesen von Alarmen und Stummschaltungen erfordert Nur-Lese-Zugriff; Quittieren, Zurückstellen, Stummschalten und Aufheben der Stummschaltung erfordern Verwalten-Zugriff.

ProblemcodeBeendenBedeutung
alert_not_open5Der Alarm ist bereits behoben, es gibt also nichts zu quittieren oder zurückzustellen. Führen Sie alerts list aus und verwenden Sie einen offenen.
alert_mute_limit_reached5Die Organisation hat bereits 50 aktuelle Stummschaltungen. Beenden Sie eine mit alerts unmute oder decken Sie mehr Bildschirme mit einer Stummschaltung per Tag ab.
invalid_request8Der Zeitpunkt --until liegt mehr als 30 Tage in der Zukunft. Nichts wurde geändert.
not_found4Kein Alarm und keine Stummschaltung im Projekt hat diese ID. Ein behobener Alarm ist nach der Ereignisaufbewahrung des Tarifs weg, eine Stummschaltung, sobald sie beendet ist.

alerts list#

Die Alarme dieses Projekts auflisten, offene zuerst.

alerts list [--state open|resolved|all] [--screen-id ID] [--before CURSOR] [--limit N]
ParameterTypErforderlichStandardNotizen
--state STATEstringneinopenopen, resolved oder all.
--screen-id IDstringneinjeder BildschirmNur die Alarme dieses Bildschirms.
--before CURSORstringneindie erste SeiteDie next_cursor der vorherigen Seite.
--limit Nintegernein100Zeilen pro Seite, 1 bis 200.
screenrig alerts list
screenrig alerts list --state all --screen-id scr_01EXAMPLESCREEN00000000

Jede Zeile ist ein Alarm: id (alr_…), screen_id, screen_name, condition, state (open oder resolved), since (wann die Bedingung begann), resolved_at nach der Behebung, acknowledged_at und acknowledged_by (kind, id und name der Person oder des Agenten) nach dem Quittieren, snoozed_until während der Zurückstellung, muted und attention. Offene Alarme stehen zuerst, die neuesten zuerst. counts enthält open und attention für das gesamte Projekt, unabhängig von Seite und Filtern, und next_cursor ist am Ende null.

alerts show#

Einen Alarm anzeigen.

alerts show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie alr_ Alarm-ID.
screenrig alerts show alr_01EXAMPLEALERT000000

Der Umschlag ist der Alarm, in der Form einer Zeile von alerts list.

alerts ack#

Einen offenen Alarm quittieren: Jemand kümmert sich darum.

alerts ack <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie alr_ Alarm-ID.
screenrig alerts ack alr_01EXAMPLEALERT000000

Der Alarm bleibt offen und braucht bis zu seiner Behebung keine Aufmerksamkeit; acknowledged_by nennt die Person oder den Agenten und acknowledged_at den Zeitpunkt. Die Meldung einer Benachrichtigung, die noch in der Wartezeit ist, wird übersprungen. Erneutes Quittieren ersetzt das frühere Quittieren oder Zurückstellen. Ein behobener Alarm ergibt alert_not_open (Exit 5). Der Umschlag ist der Alarm, und das Ereignisprotokoll verzeichnet screen.alert_acknowledged.

alerts snooze#

Einen offenen Alarm bis zu einem Zeitpunkt quittieren, damit er dann wieder Aufmerksamkeit braucht.

alerts snooze <id> (--for DURATION | --until TIME)
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie alr_ Alarm-ID.
--for DURATIONDauereines von --for, --untilkeineWie lange ab jetzt zurückgestellt wird: eine Dauer wie 30m, 4h oder 2d, höchstens 29d23h59m.
--until TIMEstringeines von --for, --untilkeineWann die Zurückstellung endet: ein Zeitpunkt nach RFC 3339 mit Sekunden und Offset, etwa 2026-11-01T09:00:00-07:00, höchstens 30 Tage in der Zukunft.
screenrig alerts snooze alr_01EXAMPLEALERT000000 --for 4h

snoozed_until ist der Zeitpunkt, zu dem die Zurückstellung endet. Bis dahin braucht der Alarm keine Aufmerksamkeit, und die Meldung einer Benachrichtigung, die noch in der Wartezeit ist, wird übersprungen, wie bei alerts ack; ist der Alarm zu diesem Zeitpunkt noch offen, braucht er wieder Aufmerksamkeit. Ein behobener Alarm ergibt alert_not_open (Exit 5).

alerts mute#

Bildschirme für Wartungsarbeiten stummschalten.

alerts mute [--screen-id ID]... [--tag TAG]... (--for DURATION | --until TIME) [--note TEXT]
ParameterTypErforderlichStandardNotizen
--screen-id IDstringmindestens eines von --screen-id, --tagkeineEine scr_ Bildschirm-ID. Wiederholen Sie sie oder listen Sie IDs kommasepariert auf; maximal 100.
--tag TAGstringmindestens eines von --screen-id, --tagkeineJeder Bildschirm mit diesem Tag. Wiederholen Sie es oder listen Sie Tags kommasepariert auf; maximal 16.
--for DURATIONDauereines von --for, --untilkeineWie lange die Stummschaltung ab jetzt gilt: eine Dauer wie 30m, 4h oder 2d, höchstens 29d23h59m.
--until TIMEstringeines von --for, --untilkeineWann die Stummschaltung endet: ein Zeitpunkt nach RFC 3339 mit Sekunden und Offset, etwa 2026-11-01T09:00:00-07:00, höchstens 30 Tage in der Zukunft.
--note TEXTstringneinkeineWarum die Bildschirme stummgeschaltet sind, für die Personen, die die Stummschaltung sehen; höchstens 200 Zeichen.
screenrig alerts mute --tag Lobby --for 2h --note "Rewiring the lobby displays"

Der Umschlag ist die Stummschaltung: id (amt_…), screen_ids, tags, until, note, created_by und created_at. Die Alarme jedes abgedeckten Bildschirms zeigen sofort muted, auch die bereits offenen. Eine Organisation hat höchstens 50 aktuelle Stummschaltungen über alle ihre Projekte; eine weitere ergibt alert_mute_limit_reached (Exit 5), und eine beendete Stummschaltung zählt nicht mehr. Lesen Sie nach einer unterbrochenen oder mehrdeutigen Stummschaltung zuerst alerts mutes: Dasselbe Kommando mit --until innerhalb von 24 Stunden erneut auszuführen liefert dieselbe Stummschaltung, während eine Wiederholung mit --for ab einem neuen Zeitpunkt zählt und eine weitere anlegt.

alerts mutes#

Die noch nicht beendeten Stummschaltungen auflisten, die zuerst endende zuerst.

alerts mutes
screenrig alerts mutes

Jede Zeile ist eine Stummschaltung, wie alerts mute sie ausgibt.

alerts unmute#

Eine Stummschaltung jetzt beenden.

alerts unmute <mute-id>
ParameterTypErforderlichStandardNotizen
<mute-id>stringjakeineDie amt_ Stummschaltungs-ID.
screenrig alerts unmute amt_01EXAMPLEMUTE0000000

Die offenen Alarme dieser Bildschirme brauchen wieder Aufmerksamkeit, und spätere Meldungen werden nicht mehr als stummgeschaltet übersprungen. Eine beendete Stummschaltung ergibt not_found (Exit 4). Das Ereignisprotokoll verzeichnet alert_mute.deleted.

Webhooks

Ein Webhook sendet die eigenen Ereignisse dieses Projekts an einen von Ihnen betriebenen HTTPS-Endpunkt als signierte POSTs, sodass ein passendes Ereignis einen Agenten, Bot oder Ihren eigenen Dienst wecken kann. Jedes passende Ereignis kommt als dasselbe JSON-Objekt an, das events list zurückgibt. Ein Webhook ist eine Benachrichtigung in ihrer ursprünglichen Form: Er wird auf die 50 Benachrichtigungen der Organisation angerechnet, und notifications list zeigt ihn an. Richten Sie Neues mit notifications ein; damit lassen sich auch E-Mails und Bildschirmmeldungen senden.

Jeder Zustellversuch wird wie ein berechnetes Listen-Stream-Ereignis gemessen: 1 Kredit nach dem monatlichen API- und Listen-Stream-Limit von 10.000. Dieselben Ereignisse, die im Listen-Stream kostenlos sind, sind hier ebenfalls kostenlos: screen.*, runtime.*, application.event, playback.page_failed und agent.command. Ein Versuch, der abgelehnt wird, bevor etwas gesendet wird, wird nicht berechnet.

webhooks create --url URL --event-types TYPES [--description TEXT] [--disabled]
webhooks list
webhooks show <id>
webhooks update <id> [--url URL] [--event-types TYPES] [--description TEXT | --clear-description]
                     [--enable | --disable] [--expect-rev REVISION]
webhooks delete <id> [--expect-rev REVISION]
webhooks rotate-secret <id> [--expect-rev REVISION]
webhooks test <id>
webhooks deliveries <id> [--before CURSOR] [--limit N]

webhooks create antwortet mit webhook_limit_reached (Exit 5), wenn die Organisation bereits 50 Benachrichtigungen hat, während notifications create mit notification_limit_reached antwortet. Eine abgelehnte URL ist bei beiden webhook_url_rejected (Exit 8).

CAP-Alarm-Auslöser

Ein Trigger ermöglicht es einem Notifikationssystem wie Everbridge, Rave, Alertus oder einem IPAWS-Relay, Bildschirme mit CAP 1.2-Warnungen zu übernehmen. Jeder Trigger hat seine eigene URL, Benutzername und Passwort, die Sie im sendenden System als dessen CAP-HTTP-POST-Ziel mit HTTP-Basic-Authentifizierung eingeben. Eine Organisation hat höchstens 20 Trigger über alle ihre Projekte.

Trigger gibt es in zwei Arten. Ein CAP-Trigger, hier beschrieben, nimmt die Meldungen eines Notfallsystems an. Ein Overlay-Trigger zeigt, was ein beliebiger Absender sendet, etwa Home Assistant, ein Sensor-Hub oder ein Alarmierungswerkzeug, als Streifen über dem Laufenden oder als Übernahme; triggers create --kind overlay legt einen an, und triggers update, triggers deliveries, triggers clear und triggers rotate-secret bedienen beide Arten.

Ein Trigger zielt auf ein Tag, das bei jedem Eintreffen einer Warnung aufgelöst wird, oder auf bis zu 500 Bildschirm-IDs. Jede Warnung wird zur Übernahme der eigenen Playlist des Triggers: eine Vollbildkarte in der Farbe ihrer Schwere, mit Ereignis, Überschrift, Beschreibung und Anweisung. Eine Übung fügt ein EXERCISE-Banner hinzu. Die Übernahme hält bis zum <expires> der Warnung, sonst bis zum Standard --for des Triggers (1 Minute bis 7 Tage, 1 Stunde, wenn nicht gesetzt), und niemals länger als 7 Tage. Ein Update zeichnet die Karte neu, und ein Abbruch oder AllClear gibt jeden Bildschirm zurück zu dem, was er vorher spielte. Eine neue Warnung ersetzt die angezeigte. Test-, System- und Entwurfsnachrichten, Ack- und Fehlermeldungen sowie abgelaufene Warnungen werden ignoriert, und ein wiederholter Absender und Bezeichner ist ein Duplikat. Ein Bildschirm benötigt eine Standard-Playlist, um übernommen zu werden; andere Bildschirme werden übersprungen.

Das Passwort, srtg_…, wird nur von triggers create und triggers rotate-secret angezeigt, mit der Warnung trigger_password_shown_once. Die CLI hält es aus ihrer Konfiguration, dem Betriebsprotokoll und dem Wiederherstellungszustand heraus. Die URL und der Benutzername sind nicht geheim.

ProblemcodeBeendenBedeutung
trigger_limit_reached5Die Organisation hat bereits 20 Trigger. Es wurde nichts erstellt. Bitte löschen Sie zuerst einen.
resource_conflict5triggers test oder triggers delete, während ein Alarm aktiv ist. next ist triggers clear.
not_found4Kein Trigger mit dieser ID im Projekt vorhanden.
revision_conflict6Die --expect-rev Revision war veraltet. Führen Sie triggers show aus und versuchen Sie es erneut.

triggers create#

Erstellen Sie einen Trigger und erhalten Sie dessen URL, Benutzernamen und Passwort.

triggers create --name NAME [--kind cap|overlay] (--tag TAG | --screen-id ID...) [--for DURATION] [--pull FILE]
    [--show bar|takeover] [--edge bottom|top] [--style FILE] [--map FILE] [--signing]
ParameterTypErforderlichStandardNotizen
--name NAMEstringjakeineDer Name des Triggers, 1 bis 80 Zeichen ohne Steuerzeichen.
--kind KINDcap oder overlayneincapcap nimmt die CAP-1.2-Meldungen eines Notfallsystems an. overlay nimmt wenige Worte von jedem Absender an und braucht --show.
--tag TAGstringeines von --tag oder --screen-idkeineJeder aktive Bildschirm mit diesem Tag, wenn ein Alarm eintrifft.
--screen-id IDstringeines von --tag oder --screen-idkeineEine scr_ Bildschirm-ID. Wiederholen Sie sie oder listen Sie IDs kommasepariert auf; maximal 500.
--for DURATIONDauernein1h (Overlay 10m)Wie lange eine Meldung ohne <expires> oder eine Overlay-Sendung ohne duration die Bildschirme hält, etwa 30m, 2h oder 1d; 1 Minute bis 7 Tage bei einem CAP-Trigger, 10 Sekunden bis 7 Tage bei einem Overlay-Trigger.
--pull FILEPfadneinkeineEin JSON-Objekt, aus einer Datei oder - für stdin, das auch die Plattform-CAP-Alarmquellen für den Auslöser liest. Seine Mitglieder sind die Parameter der cap-alert-Karte, unten aufgeführt.
--show SHOWbar oder takeovermit --kind overlaykeinebar zeichnet einen Streifen über das, was auf den Zielbildschirmen läuft. takeover spielt die Meldung vollbildlich ab.
--edge EDGEbottom oder topneinbottomDer Rand, den ein Streifen belegt. Nur mit --show bar.
--style FILEPfadneinkeineEin JSON-Objekt aus einer Datei oder aus - für die Standardeingabe mit dem Stil der Textkarte: theme, accent, background, backgroundColor, textColor und align.
--map FILEPfadneinkeineEine JSON-Vorlage aus einer Datei oder aus - für die Standardeingabe, die die Overlay-Meldung aus dem Body des Absenders baut; siehe Overlay-Trigger.
--signingFlagneinausAußerdem einen ScreenRig-Signature-Header bei jeder Sendung verlangen und das Signaturgeheimnis nur einmal ausgeben.
screenrig triggers create --name "Campus alerts" --tag Campus
screenrig triggers create --name "Campus alerts" --tag Campus --pull pull.json
screenrig triggers create --name "Lobby sensors" --kind overlay --show bar --tag Lobby
screenrig triggers create --name "Doorbell" --kind overlay --show takeover --tag Lobby --for 30s

Der Umschlag ist der Trigger mit data.url (https://api.screenrig.ai/api/triggers/<id>/cap oder .../overlay bei einem Overlay-Trigger), data.username (die Trigger-ID) und data.password. Tragen Sie sie jetzt im sendenden System ein; der Absender eines Overlay-Triggers braucht die URL und das Passwort (Authorization: Bearer). Mit --signing enthält der Umschlag auch data.signing_secret, nur einmal angezeigt, mit der Warnung trigger_signing_secret_shown_once. Wiederholen Sie nach einem unterbrochenen oder unklaren Anlegen binnen 24 Stunden denselben Befehl: Er verwendet den gespeicherten Idempotenzschlüssel erneut, und der Server liefert denselben Trigger und dasselbe Passwort, statt einen weiteren anzulegen.

--pull fügt Quellen hinzu, die die Plattform neben der geposteten URL liest, die weiterhin funktioniert. Das Objekt enthält sources (bis zu 5 http- oder https-URLs von CAP 1.0 bis 1.2 Warnungen oder ATOM/RSS-Indizes), publicAlerts, location (name, latitude, longitude und geocodes als [{name, value}]), minSeverity, maxSeverity, minUrgency, minCertainty, events, excludeEvents, senders, statuses, scopes, languages und areaUnknown; feeds get cap verwendet dieselben Filter wie Flags. location ist erforderlich, sofern nicht sources angegeben sind, und ohne sources werden die öffentlichen Feeds, die location abdecken, gelesen. Jede Quelle wird einmal pro Minute abgefragt. Die schwerwiegendste passende Warnung übernimmt die Bildschirme wie eine gepostete, und wenn die Quellen keine zeigen, endet eine gezogene Warnung; eine veraltete oder fehlerhafte Quelle beendet niemals eine Warnung. Zum Beispiel {"location": {"latitude": 49.25, "longitude": -123}, "minSeverity": "moderate"}.

triggers list#

Trigger dieses Projekts und deren letzte Warnungen auflisten, älteste zuerst.

triggers list
screenrig triggers list

--human gibt ID, KIND, LABEL, TARGET, ALERT und LAST_RECEIVED aus; bei einem Overlay-Trigger sagt ALERT, was er zeichnet und wie viele Meldungen er hält. Eine Liste enthält nie ein Passwort oder ein Signaturgeheimnis.

triggers show#

Einen Trigger und seine letzte Warnung prüfen.

triggers show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie trg_ Auslöser-ID.
screenrig triggers show trg_01EXAMPLETRIGGER00

data.alert ist die letzte Meldung: ihre CAP-Felder, state active oder ended (mit ended_reason cancelled, all_clear, cleared oder expired), until und screens mit targeted, taken_over, cleared, skipped, failed und pending. pending ist wahr, solange noch Bildschirme beschrieben werden, und fehlgeschlagene Bildschirme werden wiederholt. screen show meldet eine Meldung als Übernahme der Playlist des Triggers. Bei einem Overlay-Trigger enthält data.overlay show, edge, enabled, signing, card_id, alerts (die aktiven Meldungen, die neueste zuerst; die erste wird angezeigt), screens mit targeted, holding, taken_over, removed, edge_taken, skipped und failed sowie pending.

triggers test#

Zeigen Sie auf den Bildschirmen des Triggers eine 60-Sekunden-Übungswarnung an.

triggers test <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie trg_ Auslöser-ID.
screenrig triggers test trg_01EXAMPLETRIGGER00

Der Umschlag ist die Quittung: data.outcome shown und data.alert. Die Antwort kommt, bevor alle Bildschirme beschrieben sind; triggers show meldet die Zahlen. Ein Overlay-Trigger zeigt die Meldung screenrig-test (Etikett Test, Titel Test overlay) 60 Sekunden lang, und die Quittung ist die einer Sendung (data.alert_id, data.until, data.active). Beide Arten lehnen einen Test ab, solange eine Meldung angezeigt wird.

triggers update#

Einen Trigger ändern, ohne seine URL oder sein Geheimnis zu ändern.

triggers update <id> [--name NAME] [--tag TAG | --screen-id ID...] [--for DURATION] [--pull FILE | --no-pull]
    [--edge bottom|top] [--style FILE | --clear-style] [--map FILE | --clear-map] [--enable | --disable]
    [--signing | --no-signing] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie trg_ Auslöser-ID.
--name NAMEstringneinkeineDen Trigger umbenennen.
--tag TAG, --screen-id IDstringneinkeineEin neues Ziel, wie bei triggers create.
--for DURATIONDauerneinkeineEine neue Haltedauer für Meldungen ohne eigenes Ende.
--pull FILE, --no-pullPfad, FlagneinkeineEin CAP-Trigger: seine CAP-Quellen ersetzen oder nicht mehr lesen.
--edge EDGEbottom oder topneinkeineEin Overlay-Streifen: an diesen Rand verschieben.
--style FILE, --clear-stylePfad, FlagneinkeineEin Overlay-Trigger: den ganzen Stil ersetzen oder entfernen.
--map FILE, --clear-mapPfad, FlagneinkeineEin Overlay-Trigger: die Vorlage ersetzen oder entfernen, sodass das gesendete Objekt die Meldung ist.
--stale-after DURATIONstringneinUnverändertWie bei source create; none entfernt den Zeitraum.
--enable, --disableFlagneinkeineEin Overlay-Trigger: Ein deaktivierter Trigger beantwortet jede Sendung mit dem 404, das ein falsches Geheimnis bekommt.
--signing, --no-signingFlagneinkeineEin Overlay-Trigger: die Signaturprüfung einschalten (das Signaturgeheimnis wird einmal ausgegeben) oder ausschalten.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung.
screenrig triggers update trg_01EXAMPLETRIGGER00 --tag Lobby
screenrig triggers update trg_01EXAMPLETRIGGER00 --edge top --style style.json
screenrig triggers update trg_01EXAMPLETRIGGER00 --map map.json --signing

Mindestens eine Option außer --expect-rev ist erforderlich. Ein Streifen ordnet sich auf den neuen Zielbildschirmen und am neuen Rand neu ein; das neue Ziel eines Übernahme-Triggers gilt ab der nächsten beginnenden Meldung. Ein Trigger, der schon signiert, behält sein Signaturgeheimnis, wenn --signing wiederholt wird; triggers rotate-secret --signing ersetzt es. Wiederholen Sie nach einer unterbrochenen oder unklaren Aktualisierung denselben Befehl: Er verwendet den gespeicherten Idempotenzschlüssel erneut.

triggers deliveries#

Das Protokoll der Sendungen eines Overlay-Triggers lesen: warum jede angezeigt, ignoriert oder abgelehnt wurde.

triggers deliveries <id> [--limit N]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie trg_ Auslöser-ID.
--limit Nintegernein100Wie viele Zustellungen, die neuesten zuerst; 1 bis 100.
screenrig triggers deliveries trg_01EXAMPLETRIGGER00 --limit 20

data.items enthält die Zustellungen der letzten sieben Tage: at, outcome (shown, updated, unchanged, ended, ignored, refused, invalid oder handshake), reason für eine abgelehnte oder ungültige Zustellung (credentials, signature, disabled, body, mapping, field, rate_limited oder internal), detail (das fehlerhafte Mitglied oder der fehlerhafte Zuordnungspfad), status, bytes, alert_id und request_id. Das Protokoll speichert nie einen Body, einen Header oder Zugangsdaten. Ein falsches Secret, eine ungültige Signatur und ein deaktivierter Trigger geben dem Sender alle dasselbe 404, daher ist dieses Protokoll der Ort, an dem man liest, welches es war. Ein CAP-Trigger hat keine Zustellungen.

triggers clear#

Alarm des Triggers jetzt beenden.

triggers clear <id> [--alert-id ID]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie trg_ Auslöser-ID.
--alert-id IDstringneinkeineEin Overlay-Trigger: nur diese Meldung beenden. Ohne die Option enden alle Meldungen.
screenrig triggers clear trg_01EXAMPLETRIGGER00
screenrig triggers clear trg_01EXAMPLETRIGGER00 --alert-id front-door

Die Meldung endet mit ended_reason cleared, und ihre Bildschirme kehren zu dem zurück, was sie vorher spielten. Ein Bildschirm, dessen Übernahme seither etwas anderes ersetzt hat, bleibt unverändert. Ohne aktive Meldung ändert sich nichts. Bei einem Overlay-Trigger ändert das Beenden einer nicht aktiven Meldung nichts, und wenn die letzte Meldung endet, wird der Streifen gesenkt oder werden die Bildschirme der Übernahme zurückgegeben.

triggers rotate-secret#

Passwort eines Triggers ersetzen.

triggers rotate-secret <id> [--signing] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie trg_ Auslöser-ID.
--signingFlagneinausEin Overlay-Trigger, der signiert: das Signaturgeheimnis statt des Passworts ersetzen.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung.
screenrig triggers rotate-secret trg_01EXAMPLETRIGGER00

Der Umschlag enthält das neue Passwort in data.password. Das alte Passwort funktioniert sofort nicht mehr; tragen Sie das neue im sendenden System ein. Mit --signing enthält der Umschlag stattdessen das neue data.signing_secret, nur einmal angezeigt; das alte funktioniert sofort nicht mehr, und ein Trigger, der nicht signiert, antwortet mit invalid_request.

triggers delete#

Einen Trigger löschen. Seine URL nimmt sofort keine Meldungen und Sendungen mehr an; die Streifen eines Overlay-Triggers verschwinden von seinen Bildschirmen, und seine Karte wird gelöscht. Ein Trigger, der eine Meldung zeigt, wird mit resource_conflict abgelehnt: Führen Sie zuerst triggers clear aus.

triggers delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie trg_ Auslöser-ID.
--expect-rev REVISIONstringneinkeineOptionale Revisionsvoraussetzung.
screenrig triggers delete trg_01EXAMPLETRIGGER00

Overlay-Trigger

Ein Overlay-Trigger zeigt, was ein externes System sendet. Home Assistant, ein Tür- oder Bewegungsmelder-Hub, ein Kamerasystem oder ein Alarmierungswerkzeug sendet mit einem HTTP-POST wenige Worte, und die Bildschirme des Triggers zeigen sie, bis sie ablaufen oder der Absender sie beendet. Er ist ein Trigger wie ein CAP-Trigger: triggers create --kind overlay legt ihn an, und er zählt zum selben Limit von 20 pro Organisation.

--show bar zeichnet einen Streifen über das, was auf jedem Zielbildschirm läuft, am unteren Rand oder mit --edge top am oberen. Der Streifen gleitet ein, wenn eine Meldung beginnt, und aus, wenn die letzte endet; Playlist, Seiten und Timing bleiben unverändert. Ein Bildschirm hält einen Streifen pro Rand: Ein Overlay-Trigger, dessen Rand auf einem Bildschirm schon ein anderer Overlay-Trigger belegt, erscheint dort nicht (triggers show zählt diese Bildschirme als edge_taken), und eine Seite mit eigenem Streifen mit Präsenz an diesem Rand behält ihn. Eine Eck- oder Chip-Karte an diesem Rand rückt über die Höhe des Streifens hinaus nach innen, ob er sichtbar ist oder nicht. Auf einer Werbeplatz-Seite und während einer Übernahme wird kein Streifen gezeichnet. --show takeover spielt die Meldung vollbildlich auf den Zielbildschirmen ab, die eine Standard-Playlist haben, von der ersten Meldung bis zum Ende der letzten. Ein Übernahme-Trigger ersetzt nie eine Übernahme, die schon auf einem Bildschirm läuft, etwa die eines Operators oder einer Notfallmeldung, und eine CAP-Meldung ersetzt ihn.

Ein Tag-Ziel wird aufgelöst, wenn eine Meldung beginnt; ein später mit dem Tag versehener Bildschirm erhält den Streifen mit der nächsten beginnenden Meldung. Bildschirme ohne Standard-Playlist überspringt eine Übernahme. Ein Bildschirm, der offline ist, holt beim Wiederverbinden auf.

Der Absender sendet JSON (oder ein Formular) an data.url mit Authorization: Bearer SECRET oder mit HTTP Basic, die Trigger-ID als Benutzername und das Geheimnis als Passwort. Das Geheimnis steht nie in der URL. Eine Sendung hat diese Felder; ein unbekanntes Feld wird abgelehnt und benannt.

FeldTypNotizen
alert_idstringDie ID der Meldung, die der Absender wählt, 1 bis 200 Zeichen. Dieselbe ID aktualisiert diese Meldung, statt eine weitere zu stapeln. Ohne ID ist es eine einzelne Meldung namens default. Beim Beenden endet ohne ID jede Meldung.
labelstringEin kurzes Etikett über dem Titel: höchstens 40 Zeichen.
titlestringMaximal 120 Zeichen.
messagestringDer Haupttext: höchstens 400 Zeichen.
notestringEine ruhige Zeile am Fuß: höchstens 120 Zeichen.
durationZahl oder StringWie lange diese Sendung ihre Meldung ab jetzt hält: 10 bis 604800 Sekunden oder 10s, 5m, 2h, 1d oder until_cleared. Ohne Angabe gilt --for des Triggers (10 Minuten, wenn nicht festgelegt).
clearBoolean oder Stringtrue (oder yes, y, 1, x) beendet die Meldung; false (oder no, n, 0, leer) löst sie aus. Ein Beenden ignoriert die übrigen Felder.
statestringEin Zustandswort des Absenders. off, closed, clear, cleared, resolved, ok, normal, inactive und ended beenden in jeder Schreibweise die Meldung; jeder andere Zustand löst sie aus.

Ein Auslösen braucht mindestens eines von label, title, message und note. Längerer Text wird abgelehnt, ebenso duration außerhalb von 10 Sekunden bis 7 Tagen, beides mit invalid_request, das das Feld nennt. Jedes Auslösen oder Aktualisieren hält seine Meldung duration ab dieser Sendung; ein Bewegungsmelder, der alle paar Sekunden sendet, hält den Streifen oben, und er verschwindet duration nach der letzten Sendung. Ein Trigger zeigt seine neueste Meldung; endet sie, erscheint die davor wieder. Er hält zehn Meldungen, die elfte ersetzt die älteste. Eine Meldung endet etwa zehn Sekunden nach ihrer Zeit. Ein zweimal gesendetes Beenden beendet die Meldung nur einmal, und das Beenden einer nicht aktiven Meldung ändert nichts.

Die Antwort ist eine Quittung: outcome (shown, updated, unchanged, ended oder ignored), alert_id, until (null für eine bis zum Beenden gehaltene Meldung) und active, die Meldungen, die der Trigger nach der Sendung hält. Ein Idempotency-Key-Header mit 8 bis 200 Zeichen beantwortet die Wiederholung eines Absenders 24 Stunden lang mit der ersten Quittung. Ein Trigger nimmt 120 Sendungen pro Minute an. Ein Auslösen oder Aktualisieren ist eine abgerechnete API-Anfrage, wie eine Sendung an einen eingehenden Schlüssel-Wert-Webhook; ein Beenden ist kostenlos und wird nie wegen des Guthabens abgelehnt, sodass eine Meldung immer von den Bildschirmen genommen werden kann.

curl -X POST https://api.screenrig.ai/api/triggers/trg_01EXAMPLETRIGGER00/overlay \
  -H "Authorization: Bearer srtg_YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"alert_id":"front-door","title":"Front door","message":"The front door is open","duration":"10m"}'

Eine falsche Adresse, ein falsches Geheimnis, ein deaktivierter Trigger, eine fehlende oder falsche Signatur und jedes GET geben dasselbe 404 not_found; ein Absender oder die Linkvorschau erfährt so nichts darüber, was es war. triggers deliveries zeigt dem Projekt den Grund für die letzten sieben Tage, ohne den Body der Sendung. --style FILE legt theme, accent, background, backgroundColor, textColor und align der Textkarte fest; ein Trigger pro Aussehen.

--map FILE baut die Meldung aus dem Body, den ein Alarmierungswerkzeug sendet, mit der Vorlagensprache der Karten-Webhooks. Ein String mit {{body.title}} ist Text, ein String, der genau ein Platzhalter ist, behält seinen Typ, {"$text": "{{body.message}}", "$max": 400} kürzt Text, und ein Pfad beginnt mit body oder query. Diese Vorlage bildet eine Meldung eines Überwachungswerkzeugs ab und beendet sie, wenn ihr Status resolved ist:

{"alert_id": "{{body.groupKey}}", "title": "{{body.title}}", "message": {"$text": "{{body.message}}", "$max": 400}, "state": "{{body.status}}"}

--signing verlangt außerdem ScreenRig-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">, geschlüsselt mit data.signing_secret (whsec_…, nur einmal angezeigt), wobei t höchstens fünf Minuten von der Uhr des Servers abweichen darf. Ein Absender darf zwei v1-Werte mitsenden, während er das Geheimnis rotiert.

body='{"alert_id":"front-door","title":"Front door","message":"The front door is open"}'
t=$(date +%s)
sig=$(printf '%s.%s' "$t" "$body" | openssl dgst -sha256 -hmac "$SIGNING_SECRET" -hex | sed 's/^.* //')
curl -X POST "$URL" -H "Authorization: Bearer $SECRET" -H "ScreenRig-Signature: t=$t,v1=$sig" \
  -H "Content-Type: application/json" -d "$body"

Ein Alarmierungstool oder ein Anbieter, der seine eigenen Zustellungen signiert, kann seine Signatur anstelle des Secrets prüfen lassen, und sein Einrichtungs-Handshake wird beantwortet, wie bei Karten-Webhooks: overlay.verify und overlay.handshake kommen an POST /api/triggers und PATCH /api/triggers/{id}, und null entfernt jeweils eines. Dieselben Regeln gelten für das srtg_-Passwort und das Zustellprotokoll des Triggers, und ein Handshake ändert keinen Alarm.

Ein rest_command von Home Assistant sendet an den Trigger. Das Geheimnis gehört in secrets.yaml; jede Automatisierung nennt die Meldung, die sie auslöst oder beendet:

# secrets.yaml
screenrig_lobby_overlay: "Bearer srtg_YOUR_SECRET"

# configuration.yaml
rest_command:
  screenrig_lobby:
    url: "https://api.screenrig.ai/api/triggers/trg_01EXAMPLETRIGGER00/overlay"
    method: post
    headers:
      Authorization: !secret screenrig_lobby_overlay
    content_type: "application/json"
    payload: >-
      {{ {"alert_id": alert_id | default(""), "title": title | default(""),
          "message": message | default(""), "duration": duration | default("10m"),
          "clear": clear | default(false)} | tojson }}

# automations.yaml
- alias: Front door open on the lobby screens
  triggers:
    - trigger: state
      entity_id: binary_sensor.front_door
      to: "on"
  actions:
    - action: rest_command.screenrig_lobby
      data: {alert_id: front-door, title: Front door, message: The front door is open, duration: until_cleared}
- alias: Front door closed
  triggers:
    - trigger: state
      entity_id: binary_sensor.front_door
      to: "off"
  actions:
    - action: rest_command.screenrig_lobby
      data: {alert_id: front-door, clear: true}
- alias: Driveway motion
  triggers:
    - trigger: state
      entity_id: binary_sensor.driveway_motion
      to: "on"
  actions:
    - action: rest_command.screenrig_lobby
      data: {alert_id: driveway, title: Driveway, message: Motion at the driveway, duration: 2m}

Zwei Dinge sorgen dafür, dass das funktioniert. Jede Bewegungssendung hält den Streifen 2 Minuten ab dieser Sendung; er bleibt, solange die Bewegung anhält, und verschwindet 2 Minuten nach dem letzten Ereignis. Und Home Assistant rendert die {{ }}-Vorlage vor dem Senden, sodass der Trigger schlichtes JSON erhält; die eigene --map-Vorlage des Triggers ist ein getrennter Schritt, der jede Sendung durch die Vorlage laufen lässt; lassen Sie --map daher bei einem Absender weg, der die Overlay-Felder bereits selbst sendet, wie Home Assistant hier, oder geben Sie diesem Absender einen eigenen Trigger.

Wiedergabe

Wiedergabenachweise liegen in drei Formen vor. playback plays liest eine Zeile pro sichtbarem Start eines Bildes oder Videos auf einem Bildschirm, älteste zuerst nach received_at: Wiedergabenachweis für einen Bericht oder einen Werbetreibenden. playback list liest Tagesgesamtwerte, eine Zeile pro Bildschirm, Medienobjekt und UTC-Tag. playback totals liest Wiedergabezahlen pro UTC-Tag oder sortiert die meistgenutzten Bildschirme oder Medien. plays und list exportieren als CSV, und das Dashboard exportiert dieselben Dateien.

Abspielungen werden für die Ereignisaufbewahrung des Plans mindestens 30 Tage lang gespeichert.

ProblemcodeBeendenBedeutung
invalid_request8Ein Wiedergabebereich länger als 31 Tage, ein Tagesbereich länger als 366 Tage oder ein fehlerhafter Filter. Die CLI lehnt die meisten davon ab, bevor sie etwas sendet (Exit 2).
rate_limited7Das Wiedergabe-Export-Budget von 30 Anfragen pro Minute und Organisation ist aufgebraucht. Warten Sie retry_after_seconds.

Abrechnung: Jede JSON-Seite ist eine abgerechnete API-Anfrage, daher rechnet --all eine Anfrage pro Seite ab. Ein CSV-Export ist eine abgerechnete Anfrage für den gesamten Bereich. Jede Plays-Anfrage und jeder CSV-Export verbrauchen auch das Wiedergabe-Export-Budget. playback totals ist eine gemessene API-Anfrage und verbraucht kein Budget.

playback plays#

Lese einzelne Wiedergabeaufzeichnungen, eine Zeile pro sichtbarem Start.

playback plays [--from TIME] [--to TIME] [--screen-id ID] [--media-id ID] [--tag TAG] [--cursor CURSOR] [--limit N] [--all]
playback plays --format csv [--output FILE] [--from TIME] [--to TIME] [--screen-id ID] [--media-id ID] [--tag TAG]
ParameterTypErforderlichStandardNotizen
--from TIMEstringnein24 Stunden vor --toInklusive obere Grenze bei received_at: ein RFC-3339-Zeitpunkt mit Sekunden und Offset, now, oder ein Alter wie 7d, 12h oder 30m.
--to TIMEstringneinjetztExklusiv gebunden, in denselben Formen. Der Bereich beträgt höchstens 31 Tage.
--screen-id IDstringneinjeder BildschirmEin scr_ Bildschirm.
--media-id IDstringneinjedes ObjektEin med_ Medienobjekt.
--tag TAGstringneinjeder BildschirmEin Tag, den der Bildschirm trug, als die Wiedergabe empfangen wurde.
--cursor CURSORstringneinder Beginn des BereichsDie next_cursor der vorherigen Seite mit denselben Filtern.
--limit Nintegernein200Zeilen pro JSON-Seite, maximal 1000. Nicht mit --format csv.
--allbooleanneinausFolgen Sie dem Cursor bis zum Ende des Bereichs, 1000 Zeilen pro Seite, sofern --limit nichts anderes angibt, für maximal 50 Seiten.
--format csvstringneinJSONStreamen Sie den gesamten Bereich als CSV.
--output FILEPfadnein./playback-plays.csvCSV-Ziel oder - nur für stdout.
screenrig playback plays --from 7d --tag Lobby --all
screenrig playback plays --format csv --from 2026-09-01T00:00:00Z --to 2026-10-01T00:00:00Z --output september-plays.csv

Der CLI normalisiert beide Grenzen auf UTC und sendet sie bei jeder Anfrage; data.from und data.to geben sie zurück. Die neuesten 5 Sekunden werden zurückgehalten, bis sie sich stabilisieren, sodass eine Wiedergabe etwa 5 Sekunden nach Empfang erscheint, und data.to meldet dieses effektive Ende. JSON liefert eine Seite in data.items mit data.next_cursor, und data.next.argv ist der genaue Befehl für die nächste Seite. --all stoppt frühzeitig mit data.next und einer Warnung, beim Seitenlimit (playback_plays_truncated) oder wenn das Exportbudget aufgebraucht ist (playback_export_rate_limited), anstatt Anfragen in eine Ablehnung zu investieren.

Das CSV entspricht RFC 4180 mit der festen Kopfzeile screen_id,playlist_id,page_id,primitive_id,media_id,primitive,started_at,received_at,manifest_revision,playlist_revision und Zeiten in RFC 3339 UTC. primitive_id und started_at sind leer, sofern der Player sie nicht gemeldet hat. Eine Zelle, die mit =, +, -, @, Tabulator oder Wagenrücklauf beginnt, erhält ein führendes ', damit Tabellenkalkulationen sie nicht auswerten. Der CLI schreibt über eine private temporäre Datei im selben Verzeichnis und ersetzt eine vorhandene Datei erst nach sauberem Stream-Ende. --timeout ist das Limit für keinen Fortschritt im Stream, standardmäßig 60000 ms ohne Byte, nicht die Gesamtdauer. Der Umschlag meldet path, bytes, rows, sha256 und last_received_at; das CSV wird nie in den Umschlag aufgenommen.

Wenn ein Stream unterwegs fehlschlägt, beendet der Befehl mit einem Fehlercode und schreibt die Zieldatei nie. Die bereits empfangenen vollständigen Zeilen bleiben in FILE.partial, und error.next exportiert den Rest des Bereichs ab dem letzten received_at in eine ungenutzte FILE-rest.csv. Zeilen, die genau in diesem Moment empfangen werden, erscheinen in beiden, wiederholte Zeilen beim Zusammenfügen verwerfen.

playback list#

Lesen Sie tägliche Wiedergabesummen für dieses Projekt, neueste Tage zuerst.

playback list [--screen-id ID] [--media-id ID] [--day YYYY-MM-DD | --day-from YYYY-MM-DD --day-to YYYY-MM-DD] [--format csv] [--output FILE]
ParameterTypErforderlichStandardNotizen
--screen-id IDstringneinjeder BildschirmMuss mit scr_ beginnen.
--media-id IDstringneinjedes ObjektMuss mit med_ beginnen.
--day YYYY-MM-DDstringneinjeder TagEin UTC-Kalendertag.
--day-from YYYY-MM-DDstringneinkeineBeginn eines inklusiven UTC-Tagesbereichs mit --day-to, maximal 366 Tage.
--day-to YYYY-MM-DDstringneinkeineEnde dieses Bereichs.
--format csvstringneinJSONAls CSV exportieren. Ohne Bereich die 31 Tage bis heute.
--output FILEPfadnein./playback-aggregates.csvCSV-Ziel oder - nur für stdout.
screenrig playback list --screen-id scr_01EXAMPLESCREEN00000000 --day 2026-08-14
screenrig playback list --format csv --day-from 2026-09-01 --day-to 2026-09-30

Eine Zeile pro Bildschirm, Medienobjekt und UTC-Tag. Die Filter wählen die eigenen Zeilen des Anrufers aus. Die CSV-Kopfzeile ist screen_id,media_id,filename,primitive,day,play_count,last_page_id,last_manifest_revision,first_started_at,last_started_at. Ein fehlgeschlagener Tagesexport speichert nichts; führen Sie ihn erneut aus.

playback totals#

Lese Wiedergabezahlen pro UTC-Tag oder ordne die meistgenutzten Bildschirme oder Medien.

playback totals [--by day|screen|media|screen_day] [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]
                [--screen-id ID | --media-id ID] [--top N]
ParameterTypErforderlichStandardNotizen
--by GROUPINGstringneindayday antwortet mit einer Zeile pro UTC-Tag. screen oder media ordnet die geschäftigsten. screen_day antwortet mit der Tagesreihe der Top-Bildschirme.
--day-from YYYY-MM-DDstringnein29 Tage vor --day-toErster UTC-Tag, einschließlich.
--day-to YYYY-MM-DDstringneinheuteLetzter UTC-Tag, inklusive.
--screen-id IDstringneinjeder BildschirmMit --by day nur diesen Bildschirm zählen. Nicht mit --media-id.
--media-id IDstringneinjedes ObjektMit --by day nur dieses Medienobjekt zählen. Nicht mit --screen-id.
--top Nintegernein10Zeilen eines Rankings, 1 bis 100; 1 bis 10 mit --by screen_day. Erfordert --by; gilt nicht für --by day.
screenrig playback totals
screenrig playback totals --day-from 2026-09-01 --day-to 2026-09-30 --screen-id scr_01EXAMPLESCREEN00000000
screenrig playback totals --by screen --top 5
screenrig playback totals --by media --day-from 2026-09-01 --day-to 2026-09-30
screenrig playback totals --by screen_day --top 3

Zählungen stammen aus den täglichen Rollups, die bis zu etwa 21 Minuten nach der Aufnahme folgen; playback plays zeigt neuere Starts. day antwortet auf data.days, screen und media antworten auf data.screens und data.media, und screen_day antwortet auf data.screen_days. Eine Tagesreihe umfasst höchstens 366 Tage (92 mit --screen-id oder --media-id) und ein Ranking höchstens 92. data.truncated ist true, wenn ein Ranking über ein zu großes Fenster für einen Lesevorgang nur die besten Schlüssel jedes Abschnitts behielt.

Feeds

Ein Feed ist Drittanbieterdaten, die screenRIG abruft und zwischenspeichert, wie Wetter, Warnungen, Kurse und Schlagzeilen. feeds get liest ein Feed-Dokument, dasselbe Dokument, das eine eingebaute Karte mit denselben Parametern liest. Der Befehl ruft nie einen Drittanbieter auf.

feeds get#

Lesen Sie einen Feed einmal. Ein Feed ohne Dokument antwortet mit pending und seiner Wiederholzeit.

feeds get <family> [--lat DEGREES --lon DEGREES] [--radius-km KM] [--min-magnitude N] [--hours N]
                   [--basins LIST] [--base CODE] [--symbols IDS] [--currency CODE] [--url URL]...
                   [--public] [--geocode NAME:VALUE]... [--min-severity LEVEL] [--max-severity LEVEL]
                   [--min-urgency LEVEL] [--min-certainty LEVEL] [--event NAME]... [--exclude-event NAME]...
                   [--sender NAME]... [--status STATUS]... [--scope SCOPE]... [--language TAG]...
                   [--area-unknown hide|show]
ParameterTypErforderlichStandardNotizen
<family>stringjakeineweather, airquality, alerts, rates, crypto, earthquakes, cyclones, headlines oder cap.
--lat DEGREESnumberpro FamiliekeineBreitengrad, mit --lon. Erforderlich für weather, airquality, alerts und earthquakes; optional für cyclones und cap.
--lon DEGREESnumberpro FamiliekeineLängengrad, mit --lat.
--radius-km KMnumbernein500 für earthquakesearthquakes Radius oder die cyclones Fläche, von 10 bis 20000 km. Erfordert --lat und --lon.
--min-magnitude MAGNITUDEnumbernein2.5earthquakes: minimale Magnitude, 0 bis 9.
--hours HOURSnumbernein24earthquakes: Fenster in Stunden, 1 bis 168.
--basins LISTstringneinalle Beckencyclones: durch Kommas getrennte Becken at, ep, cp, wp.
--base CODEstringneinEURrates: Basiswährung.
--symbols IDSstringja, für cryptokeineKommagetrennte Krypto-IDs oder Ticker, maximal 20.
--currency CODEstringneinusdcrypto: Angebotswährung.
--url URLstringja, für headlineskeineheadlines: eine RSS- oder Atom-Feed-URL. cap: eine CAP-Alarm- oder ATOM/RSS-Index-URL; maximal 5 Wiederholungen.
--publicbooleanneinan ohne --urlcap: liest auch die öffentlichen Alarm-Feeds, die --lat und --lon abdecken. Erfordert --lat und --lon.
--geocode NAME:VALUEstringneinkeinecap: ein Gebietscode des Standorts, wie UGC:WAC033. Wiederholbar. Erfordert --lat und --lon.
--min-severity LEVELstringneinkeinecap: nur Alarme auf oder über minor, moderate, severe oder extreme.
--max-severity LEVELstringneinkeinecap: nur Alarme auf oder unter minor, moderate, severe oder extreme.
--min-urgency LEVELstringneinkeinecap: nur Alarme, die mindestens so dringend sind: past, future, expected oder immediate.
--min-certainty LEVELstringneinkeinecap: nur Alarme, die mindestens so sicher sind: unlikely, possible, likely oder observed.
--event NAMEstringneinirgendein Ereigniscap: nur dieses Ereignis; * steht für eine beliebige Zeichenfolge. Wiederholbar.
--exclude-event NAMEstringneinkeinecap: dieses Ereignis auslassen. Wiederholbar.
--sender NAMEstringneinirgendein Absendercap: nur Alarme von diesem Absender. Wiederholbar.
--status STATUSstringneinActualcap: Alarmstatus zum Lesen: Actual, Exercise, Test oder System. Wiederholbar.
--scope SCOPEstringneinPubliccap: Alarmbereich zum Lesen: Public, Restricted oder Private. Wiederholbar.
--language TAGstringneinkeinecap: Sprachpräferenz; die erste vorhandene wird verwendet. Wiederholbar.
--area-unknown MODEstringneinhidecap: ein Alarm, der nur durch Gebietscodes mitgeteilt wird, die der Standort nicht hat: hide oder show.
screenrig feeds get weather --lat 49.25 --lon -123
screenrig feeds get rates --base EUR
screenrig feeds get crypto --symbols btc,eth --currency usd
screenrig feeds get earthquakes --lat 49.25 --lon -123 --radius-km 500 --min-magnitude 4 --hours 72
screenrig feeds get cyclones --basins at,ep
screenrig feeds get headlines --url https://example.com/news.xml
screenrig feeds get cap --lat 49.25 --lon -123 --geocode UGC:WAC033 --min-severity moderate --event '*warning'
screenrig feeds get cap --url https://example.com/alerts.atom --url https://example.com/other.xml

weather, airquality, alerts und earthquakes benötigen --lat und --lon, die immer zusammen verwendet werden; earthquakes benötigt außerdem --radius-km, --min-magnitude und --hours. cyclones benötigt --basins, und mit --lat, --lon und --radius-km zusammen nur die Stürme in der Nähe dieses Ortes. rates benötigt --base, crypto benötigt --symbols und nimmt --currency auf, und headlines benötigt --url.

cap liest die CAP-Alarme, die zu einem Ort passen. Es benötigt --url (wiederholbar, bis zu 5 CAP-Alarm- oder ATOM/RSS-Index-URLs) oder --lat und --lon, die die öffentlichen Feeds lesen, die den Ort abdecken; --public fügt diese öffentlichen Feeds den --url-Quellen hinzu. Die Filterflags spiegeln die Mitglieder eines triggers create --pull-Objekts wider.

Ein zwischengespeichertes Dokument antwortet mit 200 und fetchedAt und attribution: Zeigen Sie die Quellenangabe überall dort an, wo die Daten dies anzeigen. Ohne Dokument meldet der Umschlag Zustand pending, retry_after_seconds und retry_at mit Exit 0; die CLI wiederholt nicht, führen Sie den Befehl nach retry_at erneut aus. Eine Organisation registriert höchstens 50 neue Feed-Schlüssel pro Tag, und rate_limited folgt darüber hinaus. Karten leiten Feed-Schlüssel aus statischen Parametern ab; schreiben Sie keine feed oder feed: Schlüssel selbst.

Datenquellen

Eine Datenquelle liest nach Zeitplan eine externe Adresse und schreibt das Ergebnis in die Daten einer Karte, sodass die Karte aktuell bleibt, ohne dass jemand neu veröffentlicht, und Bildschirme das Dokument neu abrufen, wenn es sich ändert. Die Arten sind ics, sheets, csv, json, microsoft365, google_calendar, square, shopify, toast und momentus. Eine Datenquelle schreibt eine Karte, und eine Organisation hat bis zu 200 über alle ihre Projekte. Eine fehlgeschlagene Synchronisierung schreibt nie: Die Karte behält ihr letztes gutes Dokument, und der Status der Datenquelle zeigt den Fehler. Die Einstellungen jeder Art, die Statuscodes und die Datenschutzregeln stehen unter Datenquellen.

Eine Voreinstellung ist eine fertige, getestete json-Quelle für einen Dienst, etwa einen Slack-Kanal, eine Stellenbörse oder eine Build-Übersicht: source presets listet sie auf, source presets NAME zeigt die Felder und Secrets einer Voreinstellung, und source create --preset NAME legt die Quelle an.

Geben Sie jede Zugangsberechtigung als --secret NAME=@FILE an, oder NAME=- für stdin, damit sie aus Ihrem Shell-Verlauf und der Prozessliste herausbleibt. Secrets werden versiegelt gespeichert und nur als maskierter Hinweis zurückgegeben. Die Secret-Namen sind calendar_url.KEY für ics (eines pro Kalender), token für eine csv- oder json-Adresse, die eines braucht (password, client_secret, header.NAME und query.NAME dienen den anderen Anmeldearten, beschrieben unter Anfragen, Anmeldung und Seiten), client_secret für microsoft365 und toast, service_account_key für google_calendar, access_token für square und shopify, api_key und api_secret für momentus und client_secret mit der Einstellung client_id für eine shopify-App, die im Shop installiert ist.

--settings nimmt das gesamte Einstellungsobjekt der Datenquelle als JSON, @FILE oder -. --set KEY=VALUE setzt ein Feld der obersten Ebene und kann wiederholt werden; der Wert ist JSON, wenn er sich parsen lässt (days=14, calendars='[{"key":"lobby"}]'), sonst Text (time_zone=America/Vancouver). Mit beiden ersetzen die Felder von --set die gleichen Felder von --settings; source update mit nur --set ändert diese Felder der gespeicherten Einstellungen. Die Option --config der CLI benennt ihre Zugangsdatendatei und hat nichts mit Datenquellen zu tun.

source list#

Listet die Datenquellen des Projekts auf, die neuesten zuerst, mit ihrem Status.

source list [--after CURSOR]
ParameterTypErforderlichStandardNotizen
--after CURSORstringneinerste SeiteDie data.next_cursor der vorherigen Seite.
screenrig source list

source show#

Zeigt eine Datenquelle: ihre Einstellungen, maskierten Geheimnisse, den letzten Lauf und den letzten Fehler.

source show <source_id>
ParameterTypErforderlichStandardNotizen
<source_id>stringjakeineDie Datenquelle (src_…).
screenrig source show src_01EXAMPLESOURCE000000

source presets#

Listet die fertigen Quellen-Voreinstellungen auf oder zeigt eine mit ihren Feldern und Secrets und wie man sie erhält.

source presets [<name>]
ParameterTypErforderlichStandardNotizen
<name>stringneinjede VoreinstellungDer Name einer Voreinstellung: kleingeschriebene, durch Bindestriche verbundene Wörter, etwa slack-channel.
screenrig source presets
screenrig source presets slack-channel

Die Liste zeigt für jede Voreinstellung den Titel, die Kartentypen, die sie füllt (der erste ist der, für den sie gemacht ist), und ihre Kategorie. Ein Name zeigt die zu setzenden Felder (--set NAME=VALUE: Text mit seinem Muster und einem Beispiel, eine Auswahl oder eine Liste, die ein JSON-Array nimmt), die einzutragenden Secrets (--secret NAME=@FILE) mit dem Ort, an dem der Anbieter jedes ausstellt, wie oft sie aktualisiert, wie lange eine Karte ihre letzten Daten behält und wessen Daten sie unter welchen Bedingungen liest. Es wird nichts angelegt.

source create#

Legt eine Datenquelle an. Sie läuft innerhalb von Sekunden und danach nach ihrem Zeitplan. Legen Sie zuerst die Karte an und sehen Sie die Vorschau mit source test an.

source create (--kind KIND | --preset NAME) --card CARD_ID --name NAME [--settings JSON|@FILE|-] [--set KEY=VALUE]...
               [--connection-id ID] [--secret NAME=VALUE]... [--refresh DURATION] [--stale-after DURATION|none] [--disabled]
ParameterTypErforderlichStandardNotizen
--kind KINDstringohne --presetkeineics, sheets, csv, json, microsoft365, google_calendar, square, shopify, momentus oder toast.
--preset NAMEstringohne --kindkeineLegt die Quelle aus einer fertigen, getesteten Voreinstellung an (source presets listet sie auf): --set und --settings geben dann die Felder der Voreinstellung an und --secret ihre Zugangsdaten. Nicht mit --kind.
--card CARD_IDstringjakeineDie Karte (crd_…), die die Datenquelle schreibt. Eine Karte hat eine Datenquelle; source_target_taken antwortet auf eine zweite.
--name NAMEstringjakeine1 bis 80 Zeichen.
--settings SETTINGSstringnein{}Eine Einstellung der obersten Ebene. Wiederholbar. Mit --preset ein Feld der Voreinstellung: der Text wie geschrieben, es sei denn, er ist ein JSON-Array oder ein JSON-Objekt (die Elemente eines Listenfelds).
--connection-id IDstringneinkeinemicrosoft365 und google_calendar: lesen über eine Projektverbindung (pcn_…, connection list) statt über einen Mandanten, client_id und ein eigenes Secret der Quelle. Das setzt die Einstellung connection_id.
--set KEY=VALUEstringneinkeineEine Einstellung der obersten Ebene. Wiederholbar.
--secret NAME=VALUEstringneinkeineZugangsdaten nach Name: NAME=@FILE, NAME=- (höchstens eine Option liest stdin) oder NAME=VALUE. Wiederholbar. Mit --preset die Zugangsdaten der Voreinstellung.
--refresh DURATIONstringneinje nach ArtWie oft synchronisiert wird, von 30s bis 24h. Die Art legt den Standard und das Minimum fest: ics synchronisiert alle 5 Minuten und mindestens jede Minute, microsoft365 und google_calendar alle 2 Minuten, momentus jede Minute und mindestens alle 30 Sekunden. Eine Voreinstellung legt ihre eigenen fest.
--stale-after DURATIONstringneinje nach ArtWie lange die Card die letzten guten Daten behält, wenn die Quelle nicht aktualisieren kann, von 1m bis 7d, mindestens das Doppelte von --refresh; none behält sie bis zur nächsten Aktualisierung. Danach laufen die Daten auf jedem Bildschirm ab. momentus ist standardmäßig 30m.
--disabledbooleanneinausLegt die Datenquelle angehalten an; bis source update --enable wird nichts abgerufen.
screenrig source create --kind ics --card crd_01EXAMPLECARD000000000 --name "Lobby calendar" --set calendars='[{"key":"lobby"}]' --set time_zone=America/Vancouver --secret calendar_url.lobby=@lobby.url
screenrig source create --kind sheets --card crd_01EXAMPLEMENU0000000000 --name "Cafe menu" --settings @menu-sheet.json
screenrig source create --kind json --card crd_01EXAMPLEKPI00000000000 --name "Daily numbers" --settings @kpi-api.json --secret token=@api.token
screenrig source create --kind square --card crd_01EXAMPLEMENU0000000000 --name "Counter menu" --secret access_token=@square.token
screenrig source create --kind microsoft365 --card crd_01EXAMPLEROOMS0000000000 --name "Meeting rooms" --settings @rooms.json --connection-id pcn_01EXAMPLECONNECTION0000
screenrig source create --preset slack-channel --card crd_01EXAMPLEWALL00000000000 --name "Team wall" --set channel=C0123456789 --secret token=@slack.token

source update#

Ändert eine Datenquelle. Eine andere Änderung als eine Umbenennung setzt ihren Fehlerzähler zurück und führt sie erneut aus.

source update <source_id> [--name NAME] [--card CARD_ID] [--settings JSON|@FILE|-] [--set KEY=VALUE]...
                          [--connection-id ID] [--secret NAME=VALUE]... [--unset-secret NAME]... [--refresh DURATION]
                          [--stale-after DURATION|none] [--enable | --disable] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<source_id>stringjakeineDie Datenquelle (src_…).
--name NAMEstringneinUnverändertBenennt die Datenquelle um.
--card CARD_IDstringneinUnverändertEine andere Karte schreiben.
--settings SETTINGSstringneinUnverändertÄndert eine Einstellung der obersten Ebene der gespeicherten. Wiederholbar. Bei einer aus einer Voreinstellung erstellten Quelle ein Feld der Voreinstellung; der Wert null entfernt ein optionales Feld.
--connection-id IDstringneinUnverändertWie bei source create. Eine Quelle von ihren eigenen Zugangsdaten abzulösen, erfordert --settings ohne tenant und client_id sowie --unset-secret client_secret.
--set KEY=VALUEstringneinkeineÄndert eine Einstellung der obersten Ebene der gespeicherten. Wiederholbar.
--secret NAME=VALUEstringneinkeineSetzt ein Geheimnis oder ersetzt es. Wiederholbar. Ein Geheimnis, das Sie nicht senden, behält seinen Wert, es sei denn, die Änderung richtet die Datenquelle auf etwas, das dieses Geheimnis nicht abdeckt (anderer Ursprung, Shop, andere Umgebung oder anderer Mandant): Dann fragt source_secret_required erneut danach.
--unset-secret NAMEstringneinkeineEntfernt ein Geheimnis. Wiederholbar.
--refresh DURATIONstringneinUnverändert30s bis 24h; es gilt das Minimum der Art.
--stale-after DURATIONstringneinUnverändertWie bei source create; none entfernt den Zeitraum.
--enable, --disablebooleanneinUnverändertSetzt den Zeitplan fort oder hält ihn an; die Karte behält ihr letztes Dokument. Höchstens eines von beiden.
--expect-rev REVISIONintegerneindie gelesene RevisionLehnt die Änderung ab, wenn die Datenquelle nicht in dieser Revision ist. --set sichert die gelesene Revision ab, sofern Sie keine andere nennen.

Mindestens eine Änderung ist erforderlich.

screenrig source update src_01EXAMPLESOURCE000000 --set days=14
screenrig source update src_01EXAMPLESOURCE000000 --secret calendar_url.lobby=@new.url --refresh 10m
screenrig source update src_01EXAMPLESOURCE000000 --disable
screenrig source update src_01EXAMPLEPRESET0000000 --set channel=C0123456789 --secret token=@new.token

source test#

Eine Datenquelle als Vorschau ansehen, ohne etwas zu speichern oder zu schreiben: Sie ruft die Adresse ab, bereitet die Antwort für die Karte auf und prüft sie gegen die Karte. Der Umschlag enthält das Dokument, valid, den Pfad und den Grund, wenn die Karte es ablehnt, Warnungen und Zähler. Übergeben Sie eine gespeicherte <source_id>, um sie mit den übrigen Optionen als Überschreibungen zu testen, oder --kind (oder --preset) und --card, um eine nicht gespeicherte zu testen. Ein Abruf- oder Aufbereitungsfehler ist source_test_failed mit dem Grund. Höchstens 30 Vorschauen pro Minute und Organisation.

source test [<source_id>] [--kind KIND | --preset NAME] [--card CARD_ID] [--settings JSON|@FILE|-] [--set KEY=VALUE]...
            [--connection-id ID] [--secret NAME=VALUE]...
ParameterTypErforderlichStandardNotizen
<source_id>stringneinkeineEine gespeicherte Datenquelle zum Testen.
--kind KINDstringohne <source_id> oder --presetkeineWie bei source create.
--preset NAMEstringneinkeineZeigt eine Vorschau einer aus dieser Voreinstellung erstellten Quelle, mit --set und --settings als ihren Feldern und --secret als ihren Zugangsdaten, statt --kind.
--card CARD_IDstringohne <source_id>keineDie zu füllende Karte.
--settings SETTINGSstringneindie gespeicherten EinstellungenDie Einstellungen der Art: JSON, @FILE oder - für stdin.
--connection-id IDstringneinkeineWie bei source create.
--set KEY=VALUEstringneinkeineEine Einstellung der obersten Ebene. Wiederholbar.
--secret NAME=VALUEstringneindie gespeicherten GeheimnisseEine Zugangsdaten-Angabe zum Ausprobieren. Wiederholbar.
screenrig source test --kind ics --card crd_01EXAMPLECARD000000000 --set calendars='[{"key":"lobby"}]' --secret calendar_url.lobby=@lobby.url
screenrig source test src_01EXAMPLESOURCE000000
screenrig source test --preset slack-channel --card crd_01EXAMPLEWALL00000000000 --set channel=C0123456789 --secret token=@slack.token

source refresh#

Synchronisiert eine Datenquelle jetzt und zeigt das Ergebnis. Sie läuft inline bis zu 60 Sekunden, setzt den Fehlerzähler zurück und liest die Adresse vollständig. Eine fehlgeschlagene Synchronisierung ändert die Karte nie. source_busy (Exitcode 5) antwortet, solange eine geplante Synchronisierung läuft. Höchstens 6 pro Minute und Datenquelle.

source refresh <source_id>
ParameterTypErforderlichStandardNotizen
<source_id>stringjakeineDie Datenquelle (src_…).
screenrig source refresh src_01EXAMPLESOURCE000000

source rooms#

Prüft, wie Bildschirme den Räumen einer Buchungssystem-Quelle (momentus) zugeordnet sind. Sie liest die Räume der letzten guten Aktualisierung der Quelle und die Bildschirme des Projekts und ruft nichts ab. Sie listet die Räume, die kein Bildschirm anzeigt, und jeden Bildschirm, der einen Raumwert hat oder dessen Playlist den Raumschlüssel der Quelle liest, jeweils mapped, missing (die Playlist liest das Feld, der Bildschirm hat keins) oder unknown (der Wert nennt keinen Raum, mit dem vermutlich gemeinten Raum). Korrigieren Sie einen Bildschirm mit screen update scr_ID --field room=ROOM_KEY.

source rooms <source_id>
ParameterTypErforderlichStandardNotizen
<source_id>stringjakeineEine Quelle (src_…), die die Räume eines Buchungssystems liest.
screenrig source rooms src_01EXAMPLESOURCE000000

source delete#

Löscht eine Datenquelle. Die Karte behält das letzte Dokument, das die Datenquelle geschrieben hat.

source delete <source_id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<source_id>stringjakeineDie Datenquelle (src_…).
--expect-rev REVISIONintegerneinkeineLehnt das Löschen ab, wenn die Datenquelle nicht in dieser Revision ist.
screenrig source delete src_01EXAMPLESOURCE000000

Verbindungen

Eine Verbindung ist der gespeicherte Zugriff des Projekts auf Microsoft oder Google für Arbeit, die ohne angemeldete Person läuft. Eine microsoft365- oder google_calendar-Datenquelle (source create --connection-id), eine Power-BI-Verbindung (bi connection create powerbi --connection-id) und ein SharePoint-Mediensynchronisierungskonto (media sync account add microsoft365 --connection-id) lesen über eine Verbindung, statt jeweils einen Mandanten, eine Client-ID und ein Secret mitzubringen. Eine Verbindungs-ID beginnt mit pcn_, und eine Organisation hat bis zu 50 Verbindungen über ihre Projekte hinweg. Die Modi, Status und Genehmigungsschritte stehen unter Microsoft und Google verbinden.

Der Modus own_app enthält Ihre eigene Anwendung: bei Microsoft eine Microsoft-Entra-App-Registrierung (--tenant-id, --client-id und der Wert eines Client-Secrets), bei Google den JSON-Schlüssel eines Dienstkontos. Der Modus screenrig_app nutzt die eigene Anwendung von screenRIG und braucht kein Secret: create gibt einen einmaligen Zustimmungslink aus (data.consent_url, gültig bis data.consent_expires_at) für die Person, die die Zustimmung abschließt: einen Microsoft-365-Administrator, der für den Mandanten zustimmt, oder den Inhaber eines Google-Kontos, der lesenden Zugriff auf Kalender gewährt. Senden Sie den Link nur an diese Person und lesen Sie dann status und last_error mit connection show. Eine Power-BI-Verbindung nimmt nur eine own_app-Verbindung entgegen.

Geben Sie ein Client-Secret mit --secret-file FILE und einen Google-Schlüssel mit --service-account-key-file FILE an, oder - für stdin, nie als Argument. Das Lesen braucht Lesezugriff, und jede Änderung braucht Manage-Zugriff.

connection list#

Listet die Verbindungen dieses Projekts mit ihrem Status auf.

connection list

Keine Parameter.

screenrig connection list

connection show#

Zeigt eine Verbindung: ihren Status, den letzten Fehler und den letzten Test.

connection show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (pcn_…).
screenrig connection show pcn_01EXAMPLECONNECTION0000

connection create microsoft#

Fügt eine Microsoft-365-Verbindung hinzu: Ihre eigene Entra-App oder die Anwendung von screenRIG mit einem Zustimmungslink.

connection create microsoft --mode own_app|screenrig_app [--name NAME]
    [--tenant-id ID --client-id ID --secret-file FILE]
ParameterTypErforderlichStandardNotizen
--mode MODEstringjakeineown_app: Ihre eigene Microsoft-Entra-App-Registrierung mit einem Client-Secret. screenrig_app: die Anwendung von screenRIG, der ein Microsoft-365-Administrator über den einmaligen Link zustimmt, den dieser Befehl ausgibt.
--name NAMEstringneinMicrosoft 3651 bis 80 Zeichen.
--tenant-id IDstringmit own_appkeineIhre Directory (tenant) ID in Microsoft Entra oder deren primäre Domain, etwa contoso.onmicrosoft.com. Zusammen mit --client-id und --secret-file.
--client-id IDstringmit own_appkeineDie Application (client) ID der App-Registrierung.
--secret-file FILEstringmit own_appkeineLiest den Wert des Client-Secrets aus dieser Datei oder - für stdin (nie als Argument); die Datei enthält nur den Wert.
screenrig connection create microsoft --mode own_app --tenant-id contoso.onmicrosoft.com --client-id 0b1d2f3a-4c5e-4f60-8a7b-9c0d1e2f3a4b --secret-file secret.txt
screenrig connection create microsoft --mode screenrig_app --name "Contoso rooms"

Der Modus screenrig_app nimmt weder --tenant-id, --client-id noch --secret-file entgegen: Er gibt den Zustimmungslink (data.consent_url) für den Microsoft-365-Administrator aus, der der Anwendung von screenRIG für den Mandanten zustimmt. Die App-Registrierung führt Calendars.Read für Raumkalender, Sites.Selected oder Files.Read.All für die SharePoint-Mediensynchronisierung und, bei Power BI, Mandanteneinstellungen und Mitgliedschaft im Arbeitsbereich statt Graph-Berechtigungen auf; connection test meldet, welche Berechtigungen das Token trägt. Ein Server ohne die Anwendung von screenRIG antwortet mit connection_app_not_configured: Der Modus own_app funktioniert weiterhin.

connection create google#

Fügt eine Google-Verbindung hinzu: Ihren eigenen Dienstkonto-Schlüssel oder die Anwendung von screenRIG mit einem Anmeldelink.

connection create google --mode own_app|screenrig_app [--name NAME]
    [--service-account-key-file FILE]
ParameterTypErforderlichStandardNotizen
--mode MODEstringjakeineown_app: Ihr eigener Dienstkonto-Schlüssel. screenrig_app: die Anwendung von screenRIG, bei der sich der Inhaber eines Google-Kontos über den einmaligen Link, den dieser Befehl ausgibt, anmeldet und lesenden Zugriff auf Kalender gewährt.
--name NAMEstringneinGoogle Calendar1 bis 80 Zeichen.
--service-account-key-file FILEstringmit own_appkeineLiest die JSON-Schlüsseldatei des Dienstkontos aus dieser Datei oder - für stdin (nie als Argument).
screenrig connection create google --mode own_app --service-account-key-file key.json
screenrig connection create google --mode screenrig_app --name "Venue calendars"

Geben Sie im Modus own_app jeden Raumkalender für die Adresse des Dienstkontos frei oder geben Sie der Quelle ein Subject (domänenweite Delegierung). Der Modus screenrig_app nimmt keinen Schlüssel entgegen und gibt den Anmeldelink (data.consent_url) für den Inhaber des Google-Kontos aus: Das Konto muss jeden Raumkalender sehen, den eine Quelle auflistet, und eine solche Quelle kann kein Subject nennen. Ein Server ohne die Anwendung von screenRIG antwortet mit connection_app_not_configured: Der Modus own_app funktioniert weiterhin.

connection update#

Benennt eine Verbindung um oder ändert im Modus own_app ihren Mandanten, ihre App oder ihr Secret.

connection update <id> [--name NAME] [--tenant-id ID] [--client-id ID]
    [--secret-file FILE] [--service-account-key-file FILE] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (pcn_…).
--name NAMEstringneinUnverändertBenennt die Verbindung um.
--tenant-id IDstringneinUnverändertMicrosoft own_app: die Directory (tenant) ID oder primäre Domain.
--client-id IDstringneinUnverändertMicrosoft own_app: die Application (client) ID.
--secret-file FILEstringneinUnverändertMicrosoft own_app: liest den Wert des Client-Secrets aus dieser Datei oder - für stdin; er ersetzt das gespeicherte Secret.
--service-account-key-file FILEstringneinUnverändertGoogle own_app: liest den JSON-Schlüssel des Dienstkontos aus dieser Datei oder - für stdin; er ersetzt den gespeicherten Schlüssel.
--expect-rev REVISIONintegerneinkeineLehnt die Änderung ab, wenn die Verbindung nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig connection update pcn_01EXAMPLECONNECTION0000 --secret-file new-secret.txt
screenrig connection update pcn_01EXAMPLECONNECTION0000 --name "Contoso rooms" --expect-rev 2

Mindestens eine Änderung ist erforderlich. Eine Änderung der Zugangsdaten setzt die Verbindung auf ready zurück, löscht ihren letzten Fehler und ihren letzten Test und verwirft jedes für die alten Zugangsdaten ausgestellte Token: Testen Sie sie erneut. Eine screenrig_app-Verbindung kann nur umbenannt werden: connection connect erzeugt einen neuen Zustimmungslink, um zu ändern, wer zugestimmt hat. Ein ausgelassenes Secret bleibt erhalten.

connection test#

Meldet sich mit einer Verbindung an und prüft, was ihre Zugangsdaten erlauben.

connection test <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (pcn_…).
screenrig connection test pcn_01EXAMPLECONNECTION0000

Bei Microsoft meldet der Test credentials (ein App-Token für den Mandanten) und permissions (welche von Calendars.Read, Sites.Selected, Files.Read.All, Sites.Read.All und Place.Read.All das Token trägt; fehlen alle, schlägt die Prüfung fehl, und Sites.Selected allein ist eine Warnung, weil jede Site eine eigene Freigabe braucht). Bei Google meldet er credentials und nennt das Konto, für das die Kalender sichtbar sein müssen. Eine Ablehnung setzt die Verbindung mit last_error auf error; ein Erfolg setzt sie auf ready zurück. Der Test beurteilt weder die Freigabe eines Kalenders noch eine Postfach-Zugriffsrichtlinie noch eine Site-Freigabe. Höchstens 30 pro Minute und Organisation.

connection connect#

Erzeugt einen neuen einmaligen Zustimmungslink für eine screenrig_app-Verbindung.

connection connect <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (pcn_…).
screenrig connection connect pcn_01EXAMPLECONNECTION0000

data.consent_url ist der Link für die Person, die die Zustimmung abschließt: der Microsoft-365-Administrator oder der Inhaber des Google-Kontos. Er ersetzt jeden früheren Link. Eine funktionierende Verbindung bleibt unverändert, bis die neue Zustimmung abgeschlossen ist; damit lässt sich also auch eine Verbindung erneuern, die auf error gewechselt ist (Zustimmung entfernt, Zugriff widerrufen), oder auf einen anderen Mandanten oder ein anderes Konto umstellen. Eine Verbindung im Modus own_app hat keinen Zustimmungsschritt. Höchstens 20 pro Minute und Organisation.

connection delete#

Löscht eine Verbindung, über die nichts liest.

connection delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (pcn_…).
--expect-rev REVISIONintegerneinkeineLehnt das Löschen ab, wenn die Verbindung nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig connection delete pcn_01EXAMPLECONNECTION0000
screenrig connection delete pcn_01EXAMPLECONNECTION0000 --expect-rev 2

Solange eine Datenquelle, eine Power-BI-Verbindung oder ein Mediensynchronisierungskonto über die Verbindung liest, lautet die Antwort resource_conflict (Exit 5) und nennt sie. Das Löschen beendet nicht die Seite des Anbieters: Ein Microsoft-365-Mandant behält die Anwendung von screenRIG, bis sein Administrator sie entfernt, und ein Google-Konto behält seine Freigabe, bis sein Inhaber sie widerruft.

BI-Verbindungen

Eine BI-Verbindung ist der Zugriff des Projekts auf ein eigenes System, das Dashboards zeigt: für Grafana seine Adresse und ein Dienstkonto-Token, für Power BI eine Microsoft-Entra-App (Dienstprinzipal) und ihr Client-Secret, für Tableau eine verbundene App und ein Benutzer und für eine Webseite das Dienstkonto einer Website, die ein Dashboard hinter einer Anmeldung zeigt, oder die Cookies eines angemeldeten Browsers. Eine Verbindungs-ID beginnt mit bic_. Secrets werden auf dem Server versiegelt und nie wieder angezeigt: Ein Lesezugriff zeigt secret {set, hint}. Verbindungen gehören zu einem Projekt. bi connection list, show und browse brauchen Lesezugriff, und jeder andere Befehl braucht Manage-Zugriff.

Geben Sie ein Secret in einer Datei an: --token-file für Grafana, --secret-file für Power BI und Tableau, --password-file, --totp-file und --cookies-file für eine Webseite. Jede dieser Optionen nimmt - für stdin entgegen, nie ein Argument, und höchstens eine Option eines Befehls liest stdin.

Eine Ansicht spielt ein Dashboard, einen Bericht oder eine Seite einer Verbindung über ein iframe-Primitiv ab, das ihre embed_url zeigt; bi view create --connection-id ID legt eine an. Ein Dashboard hinter einer Anmeldung anzeigen führt durch eine Web-Verbindung, und die API-Referenz deckt jede Art ab.

bi connection create grafana#

Fügt eine Grafana-Verbindung hinzu: ihre Adresse und ein Dienstkonto-Token.

bi connection create grafana --url URL --token-file FILE [--name NAME] [--org-id N]
ParameterTypErforderlichStandardNotizen
--url URLstringjakeineDie Adresse von Grafana auf einem öffentlichen Host, mit beliebigem Pfadpräfix: https://grafana.example.com oder https://example.com/grafana. Eine private, Loopback- oder reservierte Adresse ist invalid_request (Exit 8), und Grafana muss ohne Weiterleitung antworten.
--token-file FILEstringjakeineLiest das Dienstkonto-Token aus dieser Datei oder - für stdin (nie als Argument); die Datei enthält nur das Token.
--name NAMEstringneinder Hostname1 bis 80 Zeichen.
--org-id Nintegernein1Die Grafana-Organisation, zu der das Token gehört: eine ganze Zahl ab 1.
screenrig bi connection create grafana --url https://grafana.example.com --token-file token.txt
screenrig bi connection create grafana --url https://example.com/grafana --token-file - --name "Ops Grafana" --org-id 2

Installieren Sie in Grafana das Plugin Grafana Image Renderer oder den Remote-Rendering-Dienst (er zeichnet Dashboards als Bilder; ohne ihn wird nichts gerendert), erstellen Sie dann ein Dienstkonto mit der Rolle Viewer und fügen Sie ein Token hinzu. Führen Sie als Nächstes bi connection test aus.

bi connection create tableau#

Fügt eine Tableau-Verbindung hinzu: eine verbundene App (Direct Trust), den Benutzer, als der die Ansichten der Bildschirme angezeigt werden, und den Secret-Wert der App.

bi connection create tableau --url URL --client-id ID --secret-id ID --username USER
    --secret-file FILE [--site SITE] [--name NAME]
ParameterTypErforderlichStandardNotizen
--url URLstringjakeineDie https-Adresse von Tableau Server oder Ihres Tableau-Cloud-Pods, etwa https://10ay.online.tableau.com (der Pod, nicht online.tableau.com).
--site SITEstringneindie Standard-Site von Tableau ServerDie Content-URL der Site, der Teil nach /site/ oder /t/ in der Adresse einer Ansicht.
--client-id IDstringjakeineDie Client ID der verbundenen App.
--secret-id IDstringjakeineDie Secret ID eines für die verbundene App erzeugten Secrets.
--username USERstringjakeineDer Tableau-Benutzer, als der die Ansichten der Bildschirme angezeigt werden (eine E-Mail-Adresse in Tableau Cloud).
--secret-file FILEstringjakeineLiest den Wert des Secrets aus dieser Datei oder - für stdin (nie als Argument); die Datei enthält nur den Secret-Wert, nicht die Secret-ID.
--name NAMEstringneinder Hostname1 bis 80 Zeichen.
screenrig bi connection create tableau --url https://10ay.online.tableau.com --site lobby --client-id 11111111-2222-3333-4444-555555555555 --secret-id 66666666-7777-8888-9999-000000000000 --username screens@example.com --secret-file secret.txt

Einmalig in Tableau einrichten: Erstellen Sie unter Settings, Connected Apps eine verbundene App vom Typ Direct trust, kopieren Sie ihre Client ID, erzeugen Sie ein Secret, kopieren Sie die Secret ID und den Secret-Wert und aktivieren Sie die App und das Secret. Wählen Sie den Tableau-Benutzer, den die Bildschirme zeigen, oder legen Sie ihn an, und geben Sie ihm nur Zugriff auf die Ansichten, die Bildschirme zeigen: Wer das Ticket eines Bildschirms hält, kann jede Ansicht einbetten, die dieser Benutzer sehen kann. Führen Sie dann bi connection show ID aus und tragen Sie den Host von embed_origin in die Domain-Allowlist der verbundenen App ein. Erforderlich ist Tableau Cloud oder Tableau Server 2023.3 oder neuer; die Bildschirme müssen den Tableau-Host erreichen, und ihr Browser muss Cookies von Drittanbietern von ihm akzeptieren. Führen Sie als Nächstes bi connection test aus und dann bi connection browse, um eine Ansicht zu finden.

bi connection create powerbi#

Fügt eine Power-BI-Verbindung hinzu: eine Microsoft-Entra-App (Dienstprinzipal) und ihr Client-Secret oder eine Microsoft-Verbindung dieses Projekts.

bi connection create powerbi
    (--tenant-id ID --client-id ID --secret-file FILE | --connection-id ID) [--name NAME]
ParameterTypErforderlichStandardNotizen
--tenant-id IDstringohne --connection-idkeineIhre Directory (tenant) ID in Microsoft Entra oder deren Domain, etwa contoso.onmicrosoft.com; nicht common, organizations oder consumers. Zusammen mit --client-id und --secret-file.
--client-id IDstringohne --connection-idkeineDie Application (client) ID der App-Registrierung.
--secret-file FILEstringohne --connection-idkeineLiest den Wert des Client-Secrets aus dieser Datei oder - für stdin (nie als Argument); die Datei enthält nur den Secret-Wert, nicht die Secret-ID.
--connection-id IDstringohne --tenant-idkeineMeldet sich über eine Microsoft-Verbindung (pcn_…) dieses Projekts im Modus own_app an, anstelle von --tenant-id, --client-id und --secret-file. Eine screenrig_app-Verbindung wird abgelehnt. Nicht mit ihnen.
--name NAMEstringneinPower BI1 bis 80 Zeichen.
screenrig bi connection create powerbi --tenant-id 11111111-2222-3333-4444-555555555555 --client-id aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --secret-file secret.txt
screenrig bi connection create powerbi --connection-id pcn_01EXAMPLECONNECTION0000 --name "Contoso Power BI"

Einmalig einrichten. Erstellen Sie in Microsoft Entra eine App-Registrierung (nur ein Mandant, keine Weiterleitungs-URI, keine API-Berechtigungen) und ein Client-Secret. Ein Power-BI-Administrator aktiviert im Admin-Portal unter Mandanteneinstellungen, Entwicklereinstellungen die Einstellungen Embed content in apps und Service principals can call Fabric public APIs, für die gesamte Organisation oder für eine Sicherheitsgruppe, die die App enthält. Fügen Sie die App jedem Arbeitsbereich, den Sie zeigen, mit der Rolle Mitglied oder Administrator hinzu; Mitglied ist der geringste Zugriff. Für das Einbetten in der Produktion muss der Arbeitsbereich auf einer Kapazität vom Typ Fabric (F), Power BI Embedded (A) oder Premium (P/EM) liegen. Nur kommerzielle Cloud. Führen Sie als Nächstes bi connection test aus, dann bi connection browse, um einen Arbeitsbereich und einen Bericht zu finden.

bi connection create web#

Fügt eine Web-Verbindung hinzu: ein Dienstkonto einer Website, die ein Dashboard hinter einer Anmeldung zeigt, oder die Cookies eines angemeldeten Browsers.

bi connection create web --login-mode auto|steps|none [--login-url URL] [--username USER]
    [--password-file FILE] [--totp-file FILE] [--steps FILE] [--cookies-file FILE] [--name NAME]
ParameterTypErforderlichStandardNotizen
--login-mode MODEstringjakeineauto füllt das Formular unter --login-url mit --username und dem Passwort aus. steps führt das Skript --steps aus. none meldet sich nirgends an, sodass Seiten mit dem Cookie-Satz von --cookies-file angezeigt werden, und nimmt weder --login-url, --username, --password-file, --totp-file noch --steps entgegen.
--login-url URLstringmit auto oder stepskeineDie https-Adresse der Anmeldeseite der Website, auf einem öffentlichen Host. Das Passwort wird nur dort und in den goto-Schritten des Skripts eingegeben, nie in die Adresse einer Ansicht.
--username USERstringmit autokeineDer Benutzername des Dienstkontos.
--password-file FILEstringmit autokeineLiest das Passwort des Dienstkontos aus dieser Datei oder - für stdin (nie als Argument): Leerzeichen sind erlaubt, und ein abschließendes Zeilenende wird entfernt.
--totp-file FILEstringneinkeineLiest den Base32-Schlüssel, den die Website für die Authenticator-App des Kontos anzeigt (16 bis 128 Zeichen), oder seine otpauth://totp-Adresse aus dieser Datei oder -: Der Server berechnet die Codes.
--steps FILEstringmit stepskeineDas Anmeldeskript, ein JSON-Array mit höchstens 30 Schritten, aus einer Datei oder -. Aktionen: goto (url), fill (selector, value), click und wait_for (selector), press (value wie Enter, optional selector) und wait_ms (ms). Ein Wert darf {{username}}, {{password}} und {{otp}} enthalten, nie das Secret selbst. Nicht mit auto.
--cookies-file FILEstringneinkeineEin aus einem angemeldeten Browser exportierter Cookie-Satz: ein JSON-Array von Cookies (der Export einer Cookie-Erweiterung) oder ein Objekt mit einem Array cookies (der Storage-State von Playwright), aus einer Datei oder -; höchstens 100. Gesendet werden nur name, value, domain, path, expires, httpOnly, secure und sameSite.
--name NAMEstringneinder Anmelde-Host1 bis 80 Zeichen.
screenrig bi connection create web --login-mode auto --login-url https://login.example.com/signin --username screens@example.com --password-file password.txt --name "Ops dashboard"
screenrig bi connection create web --login-mode steps --login-url https://login.example.com/signin --username screens@example.com --password-file password.txt --steps steps.json
screenrig bi connection create web --login-mode none --cookies-file cookies.json --name "Signed-in jar"

Das Passwort, der Schlüssel und die Cookies werden versiegelt und nie wieder angezeigt: data.secret und data.totp_secret sagen, ob sie gesetzt sind, und data.session sagt, wie es um die Anmeldung steht (idle, active, login_needed, paused, stopped oder expired). Verwenden Sie ein Dienstkonto mit reinem Lesezugriff. Eine abgelehnte Anmeldung wartet 5 Minuten, dann 15, 60 und 120, und die fünfte in Folge stoppt die Verbindung, bis sich ihre Zugangsdaten oder Anmeldeeinstellungen ändern. Eine Website, die Anmeldungen auf einem Telefon genehmigt, Geräte prüft oder ein CAPTCHA zeigt, lässt sich nicht skripten: Verwenden Sie einen Cookie-Satz. Ein Server ohne den Seiten-Renderer antwortet mit bi_web_unavailable (Exit 5). Führen Sie als Nächstes bi connection test aus.

bi connection list#

Listet die BI-Verbindungen dieses Projekts mit ihrer Art, dem maskierten Secret und dem letzten Test auf.

bi connection list

Keine Parameter.

screenrig bi connection list

data.items enthält jede Verbindung des Projekts; es wird kein Secret zurückgegeben.

bi connection show#

Zeigt eine Verbindung und ihren letzten Test.

bi connection show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (bic_…).
screenrig bi connection show bic_01EXAMPLECONNECTION0000

Die Antwort enthält kind, config (url und org_id für Grafana; tenant_id und client_id für Power BI; url, site, client_id, secret_id und username für Tableau), secret {set, hint}, embed_origin (der Einbettungs-Host des Projekts, den die Domain-Allowlist einer verbundenen App nennt) und last_test.

bi connection update#

Ändert Name, Adresse, Organisation, Mandant, App, Site, Benutzer oder Secret einer Verbindung oder, bei einer Web-Verbindung, ihre Anmeldung und ihre Cookies.

bi connection update <id> [--name NAME] [--url URL] [--org-id N] [--tenant-id ID] [--client-id ID]
    [--site SITE | --default-site] [--secret-id ID] [--username USER]
    [--token-file FILE | --secret-file FILE | --password-file FILE | --clear-password]
    [--login-mode auto|steps|none] [--login-url URL] [--totp-file FILE | --clear-totp]
    [--steps FILE] [--cookies-file FILE | --clear-cookies] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (bic_…).
--name NAMEstringneinUnverändertBenennt die Verbindung um.
--url URLstringneinUnverändertDie neue Adresse von Grafana oder des Tableau-Servers oder -Pods.
--org-id NintegerneinUnverändertDie Grafana-Organisation, zu der das Token gehört.
--tenant-id IDstringneinUnverändertDer Microsoft-Entra-Mandant der Power-BI-Verbindung.
--client-id IDstringneinUnverändertDie Application (client) ID der Power-BI-Verbindung oder die Client ID der verbundenen Tableau-App.
--site SITEstringneinUnverändertDie Site-Content-URL der Tableau-Verbindung. Nicht mit --default-site.
--default-sitebooleanneinausTableau Server: meldet sich bei der Standard-Site an. Nicht mit --site.
--secret-id IDstringneinUnverändertDie Secret ID der verbundenen Tableau-App.
--username USERstringneinUnverändertDer Tableau-Benutzer, als der die Ansichten der Bildschirme angezeigt werden, oder das Dienstkonto der Web-Verbindung.
--token-file FILEstringneinUnverändertGrafana: liest das Dienstkonto-Token aus dieser Datei oder - für stdin; es ersetzt das gespeicherte Token. Höchstens eines von --token-file, --secret-file, --password-file und --clear-password.
--secret-file FILEstringneinUnverändertPower BI oder Tableau: liest den Secret-Wert aus dieser Datei oder - für stdin; er ersetzt das gespeicherte Secret.
--login-mode MODEstringneinUnverändertWeb: wie sie sich anmeldet, auto, steps oder none.
--login-url URLstringneinUnverändertWeb: die https-Adresse der Anmeldeseite der Website. Ein neuer Ursprung braucht im selben Befehl --password-file, damit das gespeicherte Passwort nie an eine Seite gesendet wird, der Sie es nicht gegeben haben.
--password-file FILEstringneinUnverändertWeb: liest das Passwort des Dienstkontos aus dieser Datei oder - für stdin; es ersetzt das gespeicherte Passwort.
--clear-passwordbooleanneinausWeb: entfernt das gespeicherte Passwort.
--totp-file FILEstringneinUnverändertWeb: liest den Authenticator-Schlüssel aus dieser Datei oder - für stdin; er ersetzt den gespeicherten Schlüssel. Nicht mit --clear-totp.
--clear-totpbooleanneinausWeb: entfernt den gespeicherten Authenticator-Schlüssel. Nicht mit --totp-file.
--steps FILEstringneinUnverändertWeb: ersetzt das Anmeldeskript, ein JSON-Array mit höchstens 30 Schritten, aus einer Datei oder -.
--cookies-file FILEstringneinUnverändertWeb: ersetzt den Cookie-Satz durch einen aus einem angemeldeten Browser exportierten, aus einer Datei oder - (die Formate, die bi connection create web akzeptiert). Nicht mit --clear-cookies.
--clear-cookiesbooleanneinausWeb: entfernt den gespeicherten Cookie-Satz. Nicht mit --cookies-file.
--expect-rev REVISIONintegerneinkeineLehnt die Änderung ab, wenn die Verbindung nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --token-file new-token.txt
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --password-file new-password.txt
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --clear-totp --clear-cookies
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --url https://grafana.example.com --token-file new-token.txt --name "Ops Grafana" --expect-rev 2

Mindestens eine Änderung ist erforderlich, und ein ausgelassenes Secret bleibt erhalten. Eine neue Adresse mit anderem Host, Schema oder Port braucht im selben Befehl --token-file (Grafana) oder --secret-file (Tableau): Das gespeicherte Secret wird nur an die Adresse gesendet, für die es gespeichert wurde. Eine Änderung von Adresse, Organisation, Mandant, App, Site, Benutzer oder Secret löscht last_test und verwirft jedes für die Ansichten der Verbindung zwischengespeicherte Rendering: Testen Sie die Verbindung erneut. Eine Änderung der Zugangsdaten oder Anmeldeeinstellungen hebt eine gestoppte Web-Sitzung auf.

bi connection test#

Prüft die Zugangsdaten: Token und Image Renderer von Grafana, App und Arbeitsbereiche von Power BI oder die Anmeldung bei Tableau.

bi connection test <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (bic_…).
screenrig bi connection test bic_01EXAMPLECONNECTION0000

Grafana: token (Grafana akzeptiert es) und image_renderer (das Plugin ist aufgeführt; Grafana ohne es warnt nur, weil ein Remote-Rendering-Dienst nicht als Plugin erscheint). Power BI: token (Microsoft Entra hat eines für die App ausgestellt) und workspaces (die Arbeitsbereiche, die die App sehen kann; ist keiner sichtbar, schlägt die Prüfung fehl, und eine Ablehnung nennt die Entwicklereinstellungen des Mandanten und die Rolle Mitglied oder Administrator der App im Arbeitsbereich). Tableau: signin als Benutzer der Verbindung mit einem Token zum Lesen von Inhalten, gefolgt von einer Abmeldung. Eine Ablehnung ist eine fehlgeschlagene Prüfung, die die eigene Antwort des Anbieters trägt, und das Ergebnis wird als last_test gespeichert. Der Test beurteilt weder eine Domain-Allowlist von Tableau noch Kapazität, Zeilensicherheit oder die Berechtigungen eines Dashboards: bi view test prüft eine Ansicht wirklich.

bi connection browse#

Listet auf, was eine Verbindung anzeigen kann: Grafana-Dashboards und -Panels, Power-BI-Arbeitsbereiche und -Berichte oder Tableau-Ansichten.

bi connection browse <id> [--query TEXT] [--dashboard UID] [--workspace ID]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (bic_…).
--query TEXTstringneinkeineNur Dashboards, Arbeitsbereiche, Berichte oder Ansichten, deren Name passt.
--dashboard UIDstringneinkeineGrafana: listet stattdessen die Panels dieses Dashboards auf.
--workspace IDstringneinkeinePower BI: listet stattdessen die Berichte dieses Arbeitsbereichs auf.
screenrig bi connection browse bic_01EXAMPLECONNECTION0000 --query lobby
screenrig bi connection browse bic_01EXAMPLECONNECTION0000 --dashboard abc123
screenrig bi connection browse bic_01EXAMPLECONNECTION0000 --workspace f089354e-8366-4e18-aea3-4cb4a3a50b48 --query sales

data.items listet für Grafana je Dashboard, das das Token anzeigen kann, uid, title, folder und tags auf, oder mit --dashboard je Panel des Dashboards id, title und type (Zeilen werden abgeflacht, sodass auch ein Panel in einer eingeklappten Zeile aufgeführt wird); für Power BI je Arbeitsbereich, den die App sehen kann, id und name, oder mit --workspace je Bericht des Arbeitsbereichs id, name und embed_url; für Tableau je Ansicht, die der Benutzer der Verbindung sehen kann, path (als Workbook/View) und name. Verwenden Sie diese Werte mit bi view create.

bi connection delete#

Löscht eine Verbindung, die keine Ansicht nutzt.

bi connection delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Verbindung (bic_…).
--expect-rev REVISIONintegerneinkeineLehnt das Löschen ab, wenn die Verbindung nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig bi connection delete bic_01EXAMPLECONNECTION0000

Solange Ansichten sie nutzen, lautet die Antwort resource_conflict (Exit 5) und nennt sie: Löschen Sie diese Ansichten zuerst.

BI-Ansichten

Eine Ansicht ist ein Dashboard oder Panel einer Grafana-Verbindung, ein Bericht eines Power-BI-Arbeitsbereichs, eine Ansicht einer Tableau-Site, eine Seite einer Web-Verbindung oder ein öffentlicher Link, der keine Verbindung braucht: ein öffentliches Grafana-Dashboard, ein Publish-to-web-Link von Power BI oder eine Tableau-Public-Visualisierung. Eine Ansichts-ID beginnt mit biv_, und eine Ansicht wird nur auf Bildschirmen ihres eigenen Projekts abgespielt.

Setzen Sie die embed_url der Ansicht in ein iframe-Primitiv mit content_fit fill und veröffentlichen Sie wie gewohnt: Die Playlist enthält keine Zugangsdaten. Grafana- und Web-Ansichten werden auf dem Server alle --refresh als Bild gezeichnet und von jedem Bildschirm derselben Größe geteilt, sodass zehn Lobby-Bildschirme ein Rendering erzeugen und der Bildschirm nie mit dem System spricht; das letzte gute Bild bleibt auf dem Bildschirm, solange eine Aufnahme fehlschlägt. Ein Power-BI-Bericht und eine Tableau-Ansicht werden mit einem Token nur zur Ansicht eingebettet, das der Server erzeugt und erneuert, und der Bildschirm hält nie das Secret. Ein Bild wird nur gezeichnet, solange das Manifest eines Bildschirms die Ansicht nennt.

Das Lesen braucht Lesezugriff, und jede Änderung braucht Manage-Zugriff. Jede Zieloption gehört zu einer Art von Verbindung, und bi connection browse ID listet die zu verwendenden Werte auf.

bi view create#

Fügt eine Ansicht für ein Dashboard, ein Panel, einen Bericht oder eine Tableau-Ansicht einer Verbindung oder für einen öffentlichen Link hinzu.

bi view create (--connection-id ID (--url URL | --dashboard UID | --workspace ID --report ID | --view WORKBOOK/VIEW)
    | --public-url URL) [--name NAME] [--refresh DURATION] [--fit contain|cover|fill] [--rotate DURATION]
    [--panel ID] [--from TIME] [--to TIME] [--var NAME=VALUE]... [--theme dark|light] [--timezone ZONE]
    [--page NAME]... [--all-pages] [--rotate-sheets] [--wait-for CSS] [--wait-ms MS] [--clip CSS]
ParameterTypErforderlichStandardNotizen
--connection-id IDstringohne --public-urlkeineDie Verbindung (bic_…), von der etwas angezeigt werden soll.
--url URLstringein ZielkeineEine Dashboard-Adresse auf dem Grafana-Host der Verbindung, die Adresse eines Power-BI-Berichts, die Adresse einer Tableau-Ansicht oder, bei einer Web-Verbindung, die https-Adresse der Seite auf einem öffentlichen Host. Der Rest des Ziels wird daraus gelesen.
--dashboard UIDstringein ZielkeineGrafana: die uid des Dashboards, der Teil nach /d/ in seiner Adresse.
--workspace IDstringein ZielkeinePower BI: die Arbeitsbereichs-ID, mit --report.
--report IDstringmit --workspacekeinePower BI: die Berichts-ID, mit --workspace.
--view WORKBOOK/VIEWstringein ZielkeineTableau: die Ansicht, die Namen nach /views/ in ihrer Adresse (bi connection browse listet sie auf).
--public-url URLstringein ZielkeineEin öffentlicher Grafana-Dashboard-Link, ein Publish-to-web-Link von Power BI oder die Adresse einer Tableau-Public-Visualisierung. Das Ziel braucht keine Verbindung und wird live von seinem Host abgespielt. Geben Sie es allein an, zusammen mit --name, --refresh, --fit und --rotate-sheets.
--name NAMEstringneinaus dem Ziel1 bis 80 Zeichen.
--refresh DURATIONstringnein5mGrafana: wie oft das Bild neu gezeichnet wird, von 30s bis 24h. Web: wie oft die Seite neu gezeichnet wird, von 60s bis 24h. Power BI und Tableau: wie oft Bericht oder Ansicht die Daten aktualisieren, von 60s bis 24h, oder 0 für keine.
--fit FITstringneincontainGrafana und Web: wie das Bild den Bildschirm füllt, contain, cover oder fill.
--rotate DURATIONstringneinkeinePower BI: wie lange jede Seite angezeigt wird, von 10s bis 1h; erforderlich bei zwei oder mehr --page oder bei --all-pages. Tableau: wie lange jedes Blatt angezeigt wird; erforderlich bei --rotate-sheets.
--page NAMEstringneinkeinePower BI: eine anzuzeigende Seite, nach Name oder Anzeigename. Wiederholbar; die Seiten werden in dieser Reihenfolge angezeigt.
--all-pagesbooleanneinausPower BI: rotiert durch jede sichtbare Seite, mit --rotate.
--rotate-sheetsbooleanneinausTableau: rotiert die veröffentlichten Blätter der Arbeitsmappe, mit --rotate.
--panel IDstringneindas gesamte DashboardGrafana: zeigt nur dieses Panel statt des gesamten Dashboards.
--from TIMEstringneinkeineGrafana: Beginn des Zeitraums, etwa now-6h.
--to TIMEstringneinkeineGrafana: Ende des Zeitraums, etwa now.
--var NAME=VALUEstringneinkeineGrafana: eine Dashboard-Variable. Wiederholbar.
--theme THEMEstringneindarkGrafana-Theme, dark oder light.
--timezone ZONEstringneinkeineGrafana: Zeitzone für das Dashboard, etwa Europe/Paris, utc oder browser.
--wait-for CSSstringneinkeineWeb: ein CSS-Selektor eines Elements, das erscheint, wenn die Seite bereit ist, und nur, wenn sie angemeldet ist. Die Aufnahme wartet darauf und schlägt mit bi_web_timeout fehl, wenn es nie erscheint.
--wait-ms MSintegerneinkeineWeb: Millisekunden Wartezeit, nachdem die Seite bereit ist, für spät ladende Diagramme, 0 bis 10000.
--clip CSSstringneindie gesamte SeiteWeb: ein CSS-Selektor des Teils der Seite, der gezeichnet werden soll.
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --url 'https://grafana.example.com/d/abc123/lobby?orgId=1&viewPanel=4' --refresh 5m
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --dashboard abc123 --panel 4 --from now-6h --to now --var host=web1 --theme light --name "Web CPU"
screenrig bi view create --public-url https://grafana.example.com/public-dashboards/TOKEN --name "Public status"
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --workspace f089354e-8366-4e18-aea3-4cb4a3a50b48 --report 5b218778-e7a5-4d73-8187-f10824047715 --page Overview --page Detail --rotate 30s --name "Sales rotation"
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --view Sales/Overview --rotate-sheets --rotate 30s --refresh 0 --name "Sales sheets"
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --url https://app.example.com/dashboards/42 --refresh 5m --wait-for '#dashboard.loaded' --wait-ms 1500 --clip '#chart-grid'

Geben Sie genau ein Ziel an: --url, --dashboard, --workspace mit --report, --view oder --public-url. Die Antwort enthält data.embed_url. Führen Sie als Nächstes bi view test aus.

Grafana: --url liest orgId, viewPanel oder panelId, from, to, var-* und theme aus der Adresse. Das Bild wird über den Rendering-Dienst von Grafana gezeichnet und von jedem Bildschirm derselben Größe geteilt, und ein Bildschirm behält das letzte Bild, mit der Zeit des Renderings in einer Ecke, solange Grafana ausgefallen ist. Ein öffentlicher Dashboard-Link wird live von Grafana abgespielt, das Einbettung erlauben muss (allow_embedding = true in seinen Einstellungen): bi view test prüft das.

Power BI: --url nimmt eine aus Power BI kopierte Berichtsadresse entgegen, https://app.powerbi.com/groups/WORKSPACE/reports/REPORT, mit optionaler Seite /ReportSection; oder geben Sie --workspace und --report an. Zwei oder mehr Seiten brauchen --rotate, und --rotate braucht zwei oder mehr Seiten oder --all-pages. --refresh 0 eignet sich für einen DirectQuery-Bericht oder einen Bericht mit automatischer Seitenaktualisierung, der sich selbst aktualisiert. --fit gilt nicht. Ein Publish-to-web-Link zeigt den Bericht jedem, der den Link hat, und wird so abgespielt, wie Power BI ihn ausliefert, alle --refresh neu geladen, ohne Seitenrotation.

Tableau: --url nimmt eine aus Tableau kopierte Ansichtsadresse entgegen, https://HOST/t/SITE/views/WORKBOOK/VIEW, https://HOST/#/site/SITE/views/WORKBOOK/VIEW von Tableau Cloud oder nur WORKBOOK/VIEW; die Adresse muss auf dem Host und der Site der Verbindung liegen. --rotate-sheets und --rotate setzen einander voraus. --fit gilt nicht. Die Bildschirme müssen den Tableau-Host erreichen und seine Cookies von Drittanbietern akzeptieren, und die embed_origin der Ansicht muss in der Domain-Allowlist der verbundenen App stehen. Eine Tableau-Public-Visualisierung (--public-url https://public.tableau.com/app/profile/USER/viz/WORKBOOK/VIEW oder ihre /views/-Adresse) braucht weder Verbindung noch Token, und --rotate-sheets funktioniert dort ebenfalls.

Web: --url ist die Adresse der Seite, und --wait-for, --wait-ms und --clip gelten nur für eine Web-Ansicht. Das letzte gute Bild bleibt auf dem Bildschirm, wenn eine Aufnahme fehlschlägt, und status.last_error sagt, warum: bi_web_login_failed, bi_web_otp_required, bi_web_session_expired, bi_web_login_paused, bi_web_timeout, bi_web_navigation_failed oder bi_web_blocked.

bi view list#

Listet die BI-Ansichten dieses Projekts mit Ziel, Rhythmus und Status auf.

bi view list

Keine Parameter.

screenrig bi view list

data.items enthält jede Ansicht des Projekts, jeweils mit ihrer embed_url.

bi view show#

Zeigt eine Ansicht, ihre embed_url und wie es ihr zuletzt auf dem Bildschirm erging.

bi view show <id>
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Ansicht (biv_…).
screenrig bi view show biv_01EXAMPLEVIEW0000000000

Die Antwort enthält connection_id, target (view und rotate_sheets für Tableau), refresh_s, rotate_s, fit, status und embed_url. status enthält last_ok_at und last_error mit einem code und einem detail: bi_upstream_refused, wenn Grafana das Token abgelehnt hat, bi_upstream_unavailable, wenn es nicht rendern konnte.

bi view update#

Ändert Name, Ziel, Rhythmus oder Anpassung einer Ansicht.

bi view update <id> [--name NAME] [--refresh DURATION] [--fit contain|cover|fill] [--rotate DURATION]
    [--url URL | --dashboard UID | --workspace ID | --view WORKBOOK/VIEW | --public-url URL] [--report ID]
    [--page NAME]... [--all-pages] [--rotate-sheets] [--panel ID] [--from TIME] [--to TIME]
    [--var NAME=VALUE]... [--theme dark|light] [--timezone ZONE] [--wait-for CSS | --clear-wait-for]
    [--wait-ms MS] [--clip CSS | --clear-clip] [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Ansicht (biv_…).
--name NAMEstringneinUnverändertBenennt die Ansicht um.
--url URLstringneinUnverändertDie Adresse eines Dashboards, eines Berichts oder einer Tableau-Ansicht oder die Seitenadresse einer Web-Ansicht; ersetzt das gesamte Ziel. Nicht mit den anderen Zieloptionen.
--dashboard UIDstringneinUnverändertGrafana: zeigt dieses Dashboard; ersetzt das gesamte Ziel.
--workspace IDstringneinUnverändertPower BI: zeigt einen Bericht dieses Arbeitsbereichs, mit --report; ersetzt das gesamte Ziel.
--report IDstringneinUnverändertPower BI: zeigt diesen Bericht, in --workspace oder im aktuellen.
--view WORKBOOK/VIEWstringneinUnverändertTableau: zeigt diese Ansicht; ersetzt das gesamte Ziel.
--public-url URLstringneinUnverändertEin öffentlicher Link; ersetzt das gesamte Ziel.
--rotate-sheetsbooleanneinausTableau: rotiert die veröffentlichten Blätter der Arbeitsmappe, mit --rotate.
--page NAMEstringneinUnverändertPower BI: die anzuzeigenden Seiten, nach Name oder Anzeigename. Wiederholbar; ersetzt die aktuellen Seiten.
--all-pagesbooleanneinausPower BI: rotiert durch jede sichtbare Seite.
--rotate DURATIONstringneinUnverändertPower BI: wie lange jede Seite angezeigt wird, von 10s bis 1h, oder 0 für eine Seite. Tableau: wie lange jedes Blatt angezeigt wird, oder 0, um die Rotation zu beenden.
--panel IDstringneinUnverändertGrafana: zeigt nur dieses Panel.
--from TIMEstringneinUnverändertGrafana: Beginn des Zeitraums.
--to TIMEstringneinUnverändertGrafana: Ende des Zeitraums.
--var NAME=VALUEstringneinUnverändertGrafana: setzt eine Dashboard-Variable. Wiederholbar; sie setzt eine Variable und behält die übrigen.
--theme THEMEstringneinUnverändertGrafana-Theme, dark oder light.
--timezone ZONEstringneinUnverändertGrafana: Zeitzone für das Dashboard.
--refresh DURATIONstringneinUnverändertWie oft das Bild neu gezeichnet oder der Bericht aktualisiert wird: Grafana 30s bis 24h; Web 60s bis 24h; Power BI und Tableau 60s bis 24h oder 0 für keine.
--fit FITstringneinUnverändertGrafana und Web: wie das Bild den Bildschirm füllt, contain, cover oder fill.
--wait-for CSSstringneinUnverändertWeb: das Element, das erscheint, wenn die Seite bereit und angemeldet ist. Nicht mit --clear-wait-for.
--clear-wait-forbooleanneinausWeb: wartet nicht mehr auf ein Element. Nicht mit --wait-for.
--wait-ms MSintegerneinUnverändertWeb: Millisekunden Wartezeit, nachdem die Seite bereit ist, 0 bis 10000; 0 entfernt die Wartezeit.
--clip CSSstringneinUnverändertWeb: der Teil der Seite, der gezeichnet werden soll. Nicht mit --clear-clip.
--clear-clipbooleanneinausWeb: zeichnet wieder die gesamte Seite. Nicht mit --clip.
--expect-rev REVISIONintegerneinkeineLehnt die Änderung ab, wenn die Ansicht nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --wait-for '#dashboard.loaded' --wait-ms 2000
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --clear-wait-for --clear-clip
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --theme light --var host=web2
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --dashboard def456 --panel 2 --expect-rev 3
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --page Overview --page Detail --rotate 45s
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --view Sales/Detail

Mindestens eine Änderung ist erforderlich. --url, --dashboard, --workspace und --public-url ersetzen das gesamte Ziel, während --panel, --from, --to, --var, --theme und --timezone das aktuelle Grafana-Ziel der Ansicht ändern, --report, --page und --all-pages das Power-BI-Ziel und --view und --rotate-sheets das Tableau-Ziel. --page ersetzt die Seitenliste; um sie zu leeren, geben Sie --workspace und --report erneut mit --rotate 0 an. --rotate 0 allein hindert eine Tableau-Ansicht daran, ihre Blätter zu rotieren. Ein neues Ziel löscht den Status und verwirft die zwischengespeicherten Renderings, und Bildschirme übernehmen die Änderung bei ihrer nächsten Aktualisierung ohne erneutes Veröffentlichen. Eine Ansicht behält ihre Verbindung und Art.

bi view test#

Prüft eine Ansicht wirklich: über ein Grafana-Rendering, ein Power-BI-Einbettungs-Token, eine Tableau-Abfrage oder einen öffentlichen Link.

bi view test <id> [--output FILE [--width PIXELS] [--height PIXELS]]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Ansicht (biv_…).
--output FILEstringneinkeineGrafana: speichert das gerenderte PNG hier, statt die Prüfungen auszuführen.
--width PIXELSintegernein1920Breite des gespeicherten Bildes, 1 bis 10000. Braucht --output.
--height PIXELSintegernein1080Höhe des gespeicherten Bildes, 1 bis 10000. Braucht --output.
screenrig bi view test biv_01EXAMPLEVIEW0000000000
screenrig bi view test biv_01EXAMPLEVIEW0000000000 --output lobby.png --width 1920 --height 1080

Grafana: Eine Verbindungsansicht wird wirklich gerendert, außerhalb des gemeinsamen Caches und ohne den Status der Ansicht zu berühren. data.ok ist false mit dem Grund von Grafana, wenn es das Token ablehnt, keinen Renderer hat oder das Dashboard nicht kennt; ein fehlgeschlagener Test liefert Daten, Exit 0. Öffnen Sie das gespeicherte PNG und sehen Sie es sich an, bevor Sie veröffentlichen. Bei einem öffentlichen Link ruft der Test die Seite ab und prüft, ob Grafana der Einbettungsseite der Ansicht erlaubt, sie einzubetten.

Tableau: Eine Verbindungsansicht meldet sich als Benutzer der Verbindung an und sucht die Ansicht (signin, view); eine Ansicht, die der Benutzer nicht sehen kann, oder ein Name mit falscher Groß-/Kleinschreibung ist eine fehlgeschlagene view-Prüfung, die den Pfad nennt. Eine Tableau-Public-Ansicht fragt Tableau Public, ob die Arbeitsmappe existiert. Power BI: Eine Verbindungsansicht liest den Bericht (report) und erzeugt dafür ein echtes Einbettungs-Token nur zur Ansicht (embed_token); der eigene Grund von Power BI wird angezeigt, wenn es ablehnt, etwa bei einem Dataset mit Zeilensicherheit, einem 401 oder 403 (Mandanteneinstellung oder Arbeitsbereichsrolle) oder einem Bericht, den die App nicht sehen kann. Ein Publish-to-web-Link wird abgerufen und seine Framing-Header werden gelesen.

Der Test beurteilt weder das, was das Bild zeigt, noch die Seiten, die die Ansicht nennt, noch die Kapazität noch eine Domain-Allowlist von Tableau.

bi view delete#

Löscht eine Ansicht.

bi view delete <id> [--expect-rev REVISION]
ParameterTypErforderlichStandardNotizen
<id>stringjakeineDie Ansicht (biv_…).
--expect-rev REVISIONintegerneinkeineLehnt das Löschen ab, wenn die Ansicht nicht in dieser Revision ist (revision_conflict, Exit 6).
screenrig bi view delete biv_01EXAMPLEVIEW0000000000
screenrig bi view delete biv_01EXAMPLEVIEW0000000000 --expect-rev 3

Ein Bildschirm, der die embed_url der Ansicht noch zeigt, antwortet mit not_found, bis sich seine Playlist ändert.

Support-Gespräche

Jeder Plan, einschließlich Standard, beinhaltet KI-Support über die CLI und die gelbe Support-Schaltfläche im Dashboard unten rechts, und Premium, Education und Enterprise können eine Person anfordern. Gespräche behalten ihren Verlauf. Das Dashboard hebt ungelesene Mitarbeiterantworten hervor und rendert Markdown, einschließlich anklickbarer Links, Listen und Code. Drücken Sie Enter zum Senden oder Shift+Enter für eine neue Zeile. Mitarbeiterantworten zeigen ihren Vornamen und Slack-Avatar, wenn verfügbar, mit ScreenRIG-Mitarbeitern und dem screenRIG-Logo als Fallback; Kunden verwenden einen generischen Personen-Avatar.

Verwenden Sie die Dokumentation und Ihren betreuenden Agenten, um Probleme zu diagnostizieren und zu beheben. Verwenden Sie feedback bug oder feedback feature, um Berichte zu senden.

support status
support submit (--body TEXT | --body-file FILE) [--conversation-id ID] [--human-requested]
support history [--before ID]
support history --conversation-id ID [--after SEQUENCE]
support follow [--conversation-id ID] [--after SEQUENCE] [--timeout MS]
support read --conversation-id ID --sequence SEQUENCE
support close --conversation-id ID

Starten Sie mit support status, das chat_allowed (dieses Projekt kann ein Gespräch beginnen oder fortsetzen), human_available (auf Anfrage kann eine Person beitreten), staffed (Mitarbeitende sind gerade in ihren Zeiten erreichbar) und hours (die besetzten Stunden) meldet. support submit akzeptiert eine Nachricht mit 1–4000 Zeichen. Lassen Sie --conversation-id weg, um ein Gespräch zu starten; verwenden Sie das zurückgegebene data.conversation.id für Folgefragen. Verwenden Sie denselben Idempotenzschlüssel bei erneuten Versuchen unsicherer Übermittlungen.

Verlaufseiten enthalten bis zu 100 Zeilen. Übergeben Sie die data.next einer Konversationsseite als --before für ältere Konversationen oder die letzte Nachrichtenfolge als --after für neuere Nachrichten. support follow streamt Antworten als SSE, setzt beim letzten Projektsequenzstand fort und unterdrückt Wiedergaben. Ein Konversationsfilter wählt aus, welche Antworten gedruckt werden, während der Projektcursor voranschreitet. support read bestätigt Mitarbeiterantworten bis zur gelesenen Sequenz. Beenden Sie eine gelöste Konversation mit support close oder der Konversation beenden-Schaltfläche im Dashboard. Das Schließen behält den Verlauf; starten Sie eine neue Konversation für weitere Hilfe.

screenrig support submit --body "How do I assign a playlist? Here are the checks I ran."
screenrig support follow --conversation-id sc_CONVERSATION --after 0 --timeout 60000
screenrig support submit --conversation-id sc_CONVERSATION --body "Please ask a human." --human-requested

Luna, der KI-Assistent, antwortet auf jedem Plan sofort. Eine Person tritt einem Gespräch nur auf Anfrage und nur bei Education, Premium und Enterprise bei (human_available); die Anforderung einer Person pausiert die KI in diesem Gespräch. Bei Standard und Plus wird die Anforderung ignoriert und Luna antwortet. Die Zeiten der Mitarbeitenden sind Montag bis Freitag von 09:00 bis 17:00 Uhr Vancouver-Zeit, ausgenommen gesetzliche Feiertage in B.C.; sie bestimmen nur, wann eine Person antwortet. Halten Sie Zugangsdaten aus Support-Nachrichten heraus.

Feedback

Fehlerberichte und Funktionsanfragen sind projektbezogen und unveränderlich. Die Art stammt vom Befehl, nie von einem Body-Feld, und eine Korrektur ist eine neue Einreichung, keine Bearbeitung.

feedback bug#

Fehlerbericht für screenRIG einreichen.

feedback bug <title> (--body TEXT | --body-file FILE) [--command "GROUP ACTION"] [--no-context]
ParameterTypErforderlichStandardNotizen
<title>stringjakeineMaximal 120 Zeichen.
--body TEXTstringeines von beidenkeineInline-Textkörper, maximal 4000 Zeichen.
--body-file FILEPfadeines von beidenkeineLese den Textkörper aus einer Datei, geeignet für mehrzeilige Berichte.
--commandstringneinkeineDer Befehl, über den der Bericht handelt, nur als Befehlsweg: bis zu vier Kleinbuchstabenwörter wie media upload. Er wird niemals von der ausgeführten Befehlszeile übernommen.
--no-contextbooleanneinausDen Diagnoseumschlag weglassen, der sonst die CLI-Version, den optionalen Befehlsweg und die Plattform enthält.
screenrig feedback bug "Playlist stalls after assignment" --body-file ./report.md --command "screen assign"

Der Server lehnt Text ab, der Anmeldeinformationen entspricht, anstatt ihn zu schwärzen, und gibt feldbezogene Hinweise zurück, damit Sie ihn umschreiben und erneut senden können. Ein exakter Wiederholungsversuch unter demselben Idempotenzschlüssel gibt die ursprüngliche Einreichung für vierundzwanzig Stunden zurück.

feedback feature#

Funktionswunsch einreichen.

feedback feature <title> (--body TEXT | --body-file FILE) [--command "GROUP ACTION"] [--no-context]
ParameterTypErforderlichStandardNotizen
<title>stringjakeineMaximal 120 Zeichen.
--body TEXTstringeines von beidenkeineInline-Textkörper, maximal 4000 Zeichen.
--body-file FILEPfadeines von beidenkeineLese den Textkörper aus einer Datei.
--commandstringneinkeineDer Befehl, über den die Anfrage handelt, nur als Befehlsweg.
--no-contextbooleanneinausDen Diagnoseumschlag weglassen.
screenrig feedback feature "Add a dry-run flag" --body "Preview a change first."

feedback list#

Eigene Einreichungen dieses Projekts auflisten.

feedback list [--kind bug|feature]
ParameterTypErforderlichStandardNotizen
--kindstringneinBeide Arten, neueste zuerstbug oder feature. Beschränken Sie die Auflistung auf eine Art.
screenrig feedback list --kind bug

Werbung

Kaufen Sie Werbung in einem Netzwerk, das Sie eingeladen hat, oder verkaufen Sie Werbepausen auf Bildschirmen, die Sie besitzen. Jeder Befehl liest zuerst screenrig project capabilities: Kaufen erfordert die advertiser-Fähigkeit, Verkaufen erfordert eigene Bildschirme. Geld wird als dezimale mcr (Millicredit)-Strings angegeben. Führen Sie für jede Markierung screenrig ads COMMAND --help --json aus. Der Kauf- und Verkaufsablauf ist in Start; Preise und Gebühren finden Sie unter Preise.

ads networks#

Käufer: Listen Sie die Netzwerke auf, zu denen dieses Projekt eingeladen wurde, und prüfen Sie den zulässigen Bestand und die Slots eines Netzwerks.

ads networks list
ads networks show <seller-project-id>
screenrig ads networks list

ads network#

Verkäufer: Überprüfen oder erstellen Sie das eigene Netzwerk dieses Projekts und legen Sie dessen Standardrate fest.

ads network show
ads network create --name NAME
ads network rate --rate-mcr-per-15s MCR --expect-rev REVISION
screenrig ads network rate --rate-mcr-per-15s 1000 --expect-rev 3

Der Tarif gilt pro 15 Sekunden abgeschlossener Wiedergabe. Ein geänderter effektiver Tarif pausiert betroffene Kampagnen, bis jeder Käufer ein neues Angebot akzeptiert.

ads inventory#

Verkäufer: Nehmen Sie einen eigenen Bildschirm in die Werbung auf oder schließen Sie ihn aus und beschreiben Sie ihn eingeladenen Käufern.

ads inventory list
ads inventory update <screen-id> [--enabled | --disabled] [--site-name NAME]
    [--city CITY] [--region REGION] [--venue-type TYPE] [--audience-tags TOKENS]
    [--placement TEXT] [--public-description TEXT]
    [--rate-mcr-per-15s MCR | --clear-rate]
    [--impressions-per-hour N | --clear-impressions-per-hour] [--expect-rev REVISION]
screenrig ads inventory update scr_LOBBY --enabled --venue-type cafe

Ausgelassene Flags behalten ihre aktuellen Werte. Eine neue Inventarzeile benötigt --enabled oder --disabled. --impressions-per-hour hält Ihre Schätzung der Impressionen fest, die der Bildschirm in einer Stunde liefert: Jede abgeschlossene Wiedergabe zählt dann diese Schätzung mal die gespielten Sekunden geteilt durch 3600 als estimated_impressions in ads reports spend, ads reports delivery und ads direct report.

ads slots#

Verkäufer: Definieren Sie wiederverwendbare Werbeplätze. Ein Slot ändert nichts am Bildschirm, bis seine Adslot-Seite in eine Playlist eingefügt wird.

ads slots list
ads slots create --name NAME --accepted-media image,video
    [--max-image-duration-ms MS] [--max-video-duration-ms MS]
    [--rate-mcr-per-15s MCR] [--enabled | --disabled] [--vast-tag-url URL]
ads slots update <slot-id> --expect-rev REVISION [same fields] [--clear-vast-tag-url]
screenrig ads slots create --name "Lobby break" --accepted-media image,video
screenrig ads slots create --name "Lobby video" --accepted-media video --vast-tag-url https://ads.example.com/vast.xml
screenrig ads slots update ads_LOBBY --clear-vast-tag-url --expect-rev 2

--vast-tag-url setzt den eigenen VAST 2-4-Werbetag des Verkäufers, der versucht wird, wenn keine eingeladene Kampagne den Slot auf Ihren eigenen Bildschirmen füllt; der Slot muss Video akzeptieren. Die URL ist HTTPS auf Port 443 oder 8443 zu einem öffentlichen Host. Das Backend ruft sie ab, folgt bis zu fünf Wrappers, importiert das gewählte progressive MP4 oder WebM in die Medien des Projekts und feuert Impression, creativeView und start bei akzeptiertem Start, complete bei akzeptiertem Abschluss und Error bei Fehler; Quartile-Tracker gibt es nicht. Die Makros [CACHEBUSTING], [TIMESTAMP], [SCREENRIG_SCREEN_ID], [SCREENRIG_SLOT_ID] und [SCREENRIG_PAGE_ID] werden erweitert, und Käufer sehen den Tag nie. Bei update ersetzt --vast-tag-url den Tag und --clear-vast-tag-url entfernt ihn; die beiden kombinieren sich nicht, und das Weglassen beider behält den gespeicherten Tag. ads slots list zeigt vast_tag_url dem Besitzverkäufer.

Advertising invitations#

Verwenden Sie die oben genannten gemeinsamen invitations Befehle:

screenrig invitations create --kind ad-buyer --email owner@bakery.example --screen-id scr_LOBBY --policy review_required
screenrig invitations list --kind ad-buyer
screenrig invitations revoke ID

Die eingeladene Person akzeptiert im Dashboard. Eine angemeldete Person wählt ihr Kaufprojekt aus und bestätigt mit einem frischen Passkey-Nachweis. Eine Person ohne Login erstellt während der Annahme ein Login und ein nur für Werbetreibende bestimmtes Projekt.

ads memberships#

Verkäufer: Ändern oder widerrufen Sie die Überprüfungspolitik und den Inventarbereich eines zugelassenen Käufers.

ads memberships list
ads memberships update <membership-id> --expect-rev REVISION
    [--policy trusted|review_required] [--screen-id IDS] [--slot-id IDS]
ads memberships revoke <membership-id>
screenrig ads memberships list

Widerruf stoppt neue Anzeigenschaltungen und bewahrt die finanzielle Historie.

ads creatives#

Käufer: Bereiten Sie genehmigte Medien einem unveränderlichen Werbemittel mit genehmigtem Text zu.

ads creatives list
ads creatives create --media-id ID --copy TEXT
ads creatives show <creative-id>
screenrig ads creatives create --media-id med_123 --copy "Fresh bread daily"

ads campaigns#

Käufer: Entwerfen Sie eine Kampagne, kalkulieren Sie den Preis und aktivieren Sie sie durch Annahme des Angebots.

ads campaigns list | show <campaign-id>
ads campaigns create <file>
ads campaigns update <campaign-id> <file> --expect-rev REVISION
ads campaigns preview <campaign-id> [--expect-rev REVISION]
ads campaigns activate <campaign-id> --quote-id ID --expect-rev REVISION
ads campaigns pause | resume <campaign-id> --expect-rev REVISION
ads campaigns accept-rates <campaign-id> --quote-id ID --expect-rev REVISION
screenrig ads campaigns preview cmp_123

Ein Entwurf reserviert nichts. preview gibt ein zeitlich begrenztes Angebot zurück und gibt nichts aus; activate erfordert genau dieses Angebot. Nach einer Verkäufer-Tarifänderung wird die Kampagne nur mit accept-rates und einem frischen Angebot fortgesetzt.

Ein Kampagnenentwurf nimmt eine optionale category aus der Liste der Werbetreibenden-Kategorien an. Zwei Anzeigen derselben Kategorie laufen nie im selben Werbeblock auf einem Bildschirm.

ads direct#

Verkäufer: Buchen Sie Ihre eigenen Geschäfte für Werbetreibende außerhalb von screenRIG auf Ihren eigenen Bildschirmen.

ads direct list | show <campaign-id>
ads direct create <file>
ads direct update <campaign-id> <file> --expect-rev REVISION
ads direct pause | resume | end <campaign-id> --expect-rev REVISION
ads direct availability <file>
ads direct report <campaign-id> [--from TIMESTAMP] [--to TIMESTAMP] [--format json|csv] [--output FILE|-]
screenrig ads direct create campaign.json

Ein Entwurf nennt name, advertiser, eine optionale category, flight_start und flight_end, media_ids (Ihre eigenen fertigen Bilder oder Videos), ein optionales goal_plays, einen optionalen price (cpm pro tausend Wiedergaben oder flat, mit einem amount und einer currency nach ISO 4217) und die Ausrichtung: screen_ids, slot_ids, venue_types, cities, tags und dayparts, wobei eine leere Liste jeden freigeschalteten Bildschirm oder Werbeplatz bedeutet. Eine Direktkampagne füllt einen Werbeblock vor eingeladenen Käufern. Ein Ziel wird gleichmäßig über die Laufzeit verteilt und läuft zuerst, solange es im Rückstand ist; eine Kampagne ohne Ziel belegt während ihrer Laufzeit jeden passenden Werbeplatz. Es werden keine Credits bewegt: Sie stellen dem Werbetreibenden selbst in Rechnung, und der Preis bewertet den Bericht.

availability liest eine Abfrage mit derselben Ausrichtung und Laufzeit und schätzt die Wiedergaben, die Sie noch buchen können: die jüngsten Werbeplatz-Vorkommen der ausgewählten Bildschirme abzüglich der Wiedergaben, die Ihre anderen Direktziele noch benötigen. Ein Ziel über der Schätzung gibt goal_overbooked zurück, sofern der Entwurf nicht "overbook": true setzt. report listet Wiedergaben im Verhältnis zum Ziel, Tempo, Wert, nicht abgespielte Wiedergaben sowie Zeilen nach UTC-Tag, Bildschirm, Werbeplatz und Medium; end ist endgültig.

ads reviews#

Verkäufer: Genehmigen, ablehnen oder Änderungen an exakt eingereichten kreativen Versionen von Käufern auf review_required anfordern.

ads reviews list
ads reviews show <review-id>
ads reviews approve <review-id>
ads reviews reject <review-id> --reason TEXT
ads reviews request-changes <review-id> --note TEXT
screenrig ads reviews request-changes arv_123 --note "Use the new logo"

request-changes sendet dem Käufer Ihre Anmerkung. Um die Überarbeitung einzureichen, verknüpfen Sie die überarbeiteten Medien mit einem neuen Werbemittel, fügen Sie es einer neuen Kampagne hinzu und führen Sie preview und activate mit dem neuen Angebot aus. Die Ersatzkampagne hat ein eigenes Budget und einen eigenen Prüfverlauf. Pausieren Sie die ursprüngliche Kampagne, bevor Sie deren Ersatz aktivieren, um parallele Auslieferungen zu vermeiden. Personen entscheiden über Werbemittel auf der Seite „Prüfungen“ im Dashboard, neben Playlist- und Bildschirmänderungen.

ads reports#

Lese Ausgaben als Käufer oder Lieferungen als Verkäufer.

ads reports spend --campaign-id ID
ads reports delivery --from TIMESTAMP --to TIMESTAMP
ads reports fill [--from TIMESTAMP] [--to TIMESTAMP]
screenrig ads reports delivery --from 2026-09-01T00:00:00Z --to 2026-10-01T00:00:00Z

Zustellungsberichte über Brutto, Servicegebühr und Netto für den Zeitraum. Ein Käuferbericht zeigt niemals andere Einnahmen eines Verkäufers. fill zeigt für bis zu 35 Tage, wie viele Werbeplatz-Vorkommen Ihre Bildschirme angefragt haben, wie viele davon Direktkampagnen, eingeladene Käufer und Ihr VAST-Tag gefüllt haben und warum der Rest leer blieb: no_demand, ineligible, separated oder capped.

Playlists vorbereiten, veröffentlichen und bearbeiten

Für fertige Bilder und Videos bereiten Sie eine Vollbild-Playlist in Wiedergabereihenfolge vor:

screenrig playlist init med_POSTER med_VIDEO --name "Lobby loop" --screen-id scr_LOBBY --output lobby.json
screenrig playlist validate lobby.json
screenrig screen publish scr_LOBBY lobby.json
screenrig screen screenshot scr_LOBBY

Validieren Sie das Dokument, veröffentlichen Sie es und sehen Sie sich dann den echten Bildschirm mit screen screenshot an. playlist init akzeptiert lokale Bild-/Videodateien, bereite med_-IDs, gepinnte rel_-Anwendungs-Releases und HTTP- oder HTTPS-Iframe-URLs in Wiedergabereihenfolge, einschließlich gemischter Eingaben:

screenrig playlist init ./poster.png med_VIDEO rel_APP https://example.com --name Lobby --screen-id scr_LOBBY --output lobby.json

Lokale Dateien werden über den normalen Medienpfad hochgeladen und warten auf die Bereitschaft. Dies erfordert ffmpeg und ffprobe, sofern nicht --no-transcode bereitgestellt wird. Die Vorbereitung schreibt das lokale Dokument und kann Medien hochladen; sie erstellt weder eine entfernte Playlist noch weist sie einen Bildschirm zu. Bestehende Medien müssen bereit sein. HTTP- und HTTPS-URLs dürfen LAN-Hosts und eingebettete Zugangsdaten enthalten und werden während der Vorbereitung nicht abgerufen. Die Player-Web-App benötigt HTTPS-URLs ohne Benutzernamen oder Passwort.

Für wiederholbare Dateivorbereitung wählen Sie --idempotency-key beim ersten Versuch und verwenden es erneut mit identischen Dateien und Eingabereihenfolge innerhalb des Server-Wiederholfensters. Jede Datei erhält eigene Upload-Schlüssel. Ohne expliziten Schlüssel erhält eine neue Aufruf neue Schlüssel. Hochgeladene Medien überleben spätere Vorbereitungsausfälle; prüfen Sie media list und verwenden Sie diese IDs bei der Abgleichung eines Teilergebnisses erneut.

Jede Eingabe wird zu einer Vollbildseite mit schwarzem Hintergrund und 200 ms Crossfade. Bilder und Videos verwenden --fit contain|cover|fill (Standard contain). Videos sind stummgeschaltet, wiederholen sich nicht und werden nach Abschluss fortgesetzt. Andere Seiten verwenden --duration-ms (Standard 8000). Anwendungen und Iframes verwenden fill; Anwendungsfreigaben sind mit zeitgesteuertem Fortschritt und ohne Controller-Rechte fixiert. Bearbeiten Sie das Dokument für anwendungssteuerbaren Fortschritt. Überprüfen Sie die Freigabebereitschaft und die tatsächliche Wiedergabe über den Server und den vorgesehenen Player. Beim Veröffentlichen können die Antwort-Header geeigneter öffentlicher HTTPS-Iframe-Seiten geprüft werden. Eine Seite, deren X-Frame-Options oder frame-ancestors das Einbetten verweigert, kann vom Web-Player sowie von den Playern für macOS, Samsung Tizen und BrightSign nicht angezeigt werden. Erkennt die Veröffentlichung eine Ablehnung, gelingt der Schreibvorgang trotzdem: screen publish und playlist create|update|patch geben eine iframe_framing_refused-Warnung aus, die Seite und Primitive nennt, und events list zeigt eine playlist.iframe_framing_refused-Warnung.

Geben Sie --screen-id an, um die Zielmaße und Revision zu lesen. Das Ergebnis enthält data.screen_id, data.screen_revision und data.publish.argv. Übergeben Sie dieses Argumentarray ohne Shell-Splitting an den gebündelten screenrig-Launcher: Es bewahrt Pfade, Konfiguration und API-Ursprung. Fügen Sie --expect-rev explizit hinzu, um spätere Bildschirmänderungen abzusichern. Ziel-Metadaten bleiben außerhalb des erstellten Dokuments.

Um die Leinwand zu überschreiben, geben Sie sowohl --target-width als auch --target-height an. Diese funktionieren auch ohne Bildschirm, in diesem Fall werden keine Veröffentlichungsargumente zurückgegeben. Unbekannte oder mehrere gemeldete Flächen erfordern explizite Abmessungen. Ausgabedateien sind standardmäßig exklusiv; verwenden Sie --overwrite, um eine vorhandene Authoring-Datei atomar zu ersetzen. Übergeordnete Verzeichnisse werden automatisch erstellt. URL- und Release-ID-Eingaben mit expliziten Abmessungen funktionieren ohne Anmeldung.

screen publish <screen-id> <file> erstellt eine neue Playlist, weist sie mit einer optionalen Bildschirm-Versionssperre zu und liest die Zuweisung zurück. Es aktualisiert keine vorhandene Playlist nach Namen. Anzeigenamen können sich wiederholen; verwenden Sie die Playlist-ID für eine explizite playlist update. Das JSON-Ergebnis meldet playlist_id, playlist_revision, screen_id, screen_revision, assignment_verified und playback_verified. Die Überprüfung der Zuweisung beweist keine Wiedergabe; fordern Sie einen Screenshot und relevante Wiedergabe-Nachweise separat an und prüfen Sie diese.

Wenn das Projekt eine Überprüfung von Agentenänderungen erfordert oder die Sitzung Propose-Zugriff hat, stoppt screen publish sobald die Playlist oder ihre Zuweisung vorgeschlagen wird: stage ist pending_review, das Ergebnis benennt beide Überprüfungen, und der Umschlag bleibt ok: true. Es wird nichts abgespielt, bis eine Person zustimmt. Fügen Sie --note TEXT hinzu, um dem Prüfer mitzuteilen, was sich geändert hat; siehe Reviews.

Das Veröffentlichen speichert automatisch ein privates lokales Journal. Nach einem unklaren Fehler wiederholen Sie denselben Befehl und die Eingabe mit derselben Konfiguration, um fortzufahren. Wenn die Playlist-Erstellung vor dem Fehler bei der Zuweisung erfolgreich war, identifiziert der Fehler die erstellte Playlist. Löschen Sie diese nicht oder starten Sie keine weitere Erstellung zur Wiederherstellung. Ein Revisionskonflikt erfordert die Überprüfung des Bildschirms und die Abstimmung der beabsichtigten Zuweisung; eine bereits erstellte Playlist kann explizit mit screen assign zugewiesen werden. Veröffentlichen aktualisiert die erwartete Revision niemals stillschweigend. Unvollständige Wiederherstellung endet nach dem 24-Stunden-Server-Idempotenzfenster; prüfen und klären Sie, bevor Sie weitere Schreibvorgänge durchführen.

Um eine vorhandene Playlist zu bearbeiten:

screenrig playlist show pl_EXISTING --output lobby.json
screenrig playlist update pl_EXISTING lobby.json

playlist show --output schreibt das editierbare {name, pages}-Dokument und gibt seinen Pfad, playlist_id und die Quell-revision auf stdout zurück. Optional übergeben Sie diese Revision mit --expect-rev, um das Update zu schützen. Es bewahrt dynamische Selektoren, Zeitpläne, Bewegung und angeheftete Anwendungsfreigaben, entfernt serverabgeleitete Medien- und Zeitfelder. Kommentare bleiben separat. Einfaches playlist show ist eine Inspektionsantwort; --editable ohne --output gibt data.document, data.playlist_id und data.revision zurück. Das Aktualisieren einer Playlist betrifft jeden zugewiesenen Bildschirm. In Prüfung schlägt playlist update das neue Dokument vor, und playlist show gibt weiterhin die Live-Version zurück, bis eine Person es genehmigt.

K/V und Kommentar schreiben akzeptieren --file - für stdin. Verwenden Sie playlist show ID --editable --human für das bearbeitbare Dokument auf stdout. Anwendungs- und Playlist-Anzeigenamen können sich wiederholen; verwenden Sie Ressourcen-IDs für Aktualisierungen.

Eine Anwendungsfreigabe ersetzen

Nach einem erfolgreichen app update nehmen Sie data.application.release_id und identifizieren die genaue Playlist, Seite und Anwendungsprimitive, die geändert werden sollen. Vorschau der Ersetzung:

screenrig playlist replace-release pl_EXISTING --page board-page --primitive board --release-id rel_NEW

Dies ist eine rein lesende Auswirkungsprüfung. Prüfen Sie data.previous_release_id, data.release_id und data.affected_screens, einschließlich archivierter Zuweisungen. Wenden Sie direkt mit --apply an. Um diese Auswirkungsprüfung zu aktivieren, liefern Sie auch --expect-impact mit der Vorschau-data.impact:

screenrig playlist replace-release pl_EXISTING --page board-page --primitive board --release-id rel_NEW --apply

Andere Primitive und Einstellungen bleiben erhalten. Das Update betrifft jeden Bildschirm, der dieser geteilten Playlist zugewiesen ist; archivierte Bildschirme behalten den neuen Pin für die spätere Verwendung. Wenn --expect-impact angegeben wird, erfordert eine geänderte Ersatz-, Revision- oder beobachtete Bildschirmauswirkung eine neue Vorschau. Direkte Anwendung überspringt die Bildschirmumfrage; affected_screens wird ausgelassen. Eine bereits gesetzte Veröffentlichung gelingt ohne Schreibvorgang. Zuweisungen können sich nach dem Snapshot ändern: Der Server prüft die Playlist-Revision atomar nur, wenn --expect-rev angegeben wird. Der Server validiert Verfügbarkeit und Eigentum der Veröffentlichung bei der Anwendung. Bestehende Pins bleiben bis zur Anwendung unverändert; danach überprüfen Sie Manifestrevisionen und Wiedergabe auf den betroffenen Bildschirmen. In der Überprüfung schlägt --apply den neuen Pin vor; fügen Sie --note TEXT für den Prüfer hinzu.

Playlist validieren, erstellen, aktualisieren und Bildschirmveröffentlichung akzeptieren - als Eingabedatei, um stdin zu lesen. JSON-Container werden nie in erstellte Dateien geschrieben. --expect-rev schützt eine Revision. Das Flag weglassen, um die aktuelle Ressource ohne Revisionsvoraussetzung zu schreiben. Eine angegebene veraltete Revision gibt weiterhin revision_conflict zurück.

Die Erzeugung akzeptiert entweder --prompt TEXT oder --prompt-file FILE, einschließlich --prompt-file - für stdin. Die Datei ist der vollständige Prompt, ohne Kürzung; die bestehende 4000-Zeichen-Grenze gilt. Prompts sind von Diagnosen ausgeschlossen.

Den Pfad kurz halten

Das gebündelte CLI verwendet api.screenrig.ai; Player verwenden play.screenrig.ai; das Dashboard liegt unter screenrig.ai/dashboard; Releases verwenden isolierte Ursprünge unter apps.screenrig.ai. Native Player-Pakete bleiben privat und serververmittelt. Die interne Transportreferenz bleibt für Transport-Tools verfügbar.

Tag-Filter und Wiedergabe-Batches

Medien tragen bis zu 32 eindeutige Tags, jeweils 1–32 Buchstaben oder Ziffern. Ersetzen Sie den gesamten Satz mit screenrig media update med_ID --tags Summer,Drinks. --tag Summer ersetzt ihn durch ein Tag; --clear-tag löscht alle Tags. media list --tag Summer stimmt mit Mitgliedschaft irgendwo im Satz überein. Tags sind case-sensitiv und niemals Autorisierung.

Ein dynamischer Selektor kann ein tag oder ein tags Filterobjekt verwenden:

{
  "by": "tag",
  "tags": { "all": ["Summer", "Drinks"], "any": ["Lobby", "Patio"], "none": ["Expired"] },
  "order": "random",
  "one_at_a_time": false,
  "batch_size": 3
}

all erfordert alle aufgelisteten Tags, any erfordert mindestens einen, und none schließt alle aufgelisteten Tags aus. Vorhandene Gruppen werden mit UND kombiniert; ausgelassene Gruppen setzen keine Bedingung. Mindestens eine nicht-leere Gruppe angeben. Jede Gruppe akzeptiert bis zu 32 eindeutige Tags. tag und tags schließen sich gegenseitig aus. Ein none-nur-Filter wählt alle bereiten Medien dieses Primitivs außer den ausgeschlossenen Tags aus. Bildselektoren wählen Bilder und Videoselektoren Videos aus.

Der Kandidatenpool enthält bis zu 1.024 bereite Medien pro Selektor, mit 1.024 Medienreferenzen im gesamten Loop-Snapshot. Ein größeres Match führt zu einem Fehler; verengen Sie die Filter. batch_size ist ein separates Limit von 1–1.024 Elementen pro Seitenbesuch. Auf einer media_end-Seite spielt one_at_a_time: false die nächste Charge in der Reihenfolge ab; das Weglassen von batch_size spielt den verbleibenden Durchgang ab. one_at_a_time: true spielt ein Element pro Erscheinung und erlaubt nur eine weggelassene Chargengröße oder batch_size: 1. Dauer, Anwendung und audio_end-Seiten erfordern one_at_a_time: true. Bilder auf media_end erfordern ebenfalls dwell_ms; Videos können auf dieser Seite nicht in einer Schleife abgespielt werden.

Der Player löst bei jedem Start der Playlist und an jeder Schleifenbegrenzung alle dynamischen Medienprimitive in einer Anfrage auf. Die Mitgliedschaft ist während der Schleife eingefroren. Hochladungen, Entfernungen, Tagging-Änderungen und Verfügbarkeitsgrenzen erzeugen das Manifest nicht neu. Beim nächsten Aktualisieren verlassen entfernte oder neu ausgeschlossene Elemente die Warteschlange; neue Übereinstimmungen treten bei Abschluss des aktuellen Durchlaufs bei. Eine letzte Charge kann weniger als die angeforderte Anzahl enthalten; sie füllt nicht aus dem nächsten Durchlauf auf. Die Dateinamenreihenfolge sortiert nach Dateiname, dann Medien-ID. Die Zufallsreihenfolge mischt einmal pro vollständigem Durchlauf und erhält die verbleibende Reihenfolge über Schleifenaktualisierungen. Die gewichtete Reihenfolge folgt ihren Gewichten, siehe unten. Der Cursor ist lokal für Bildschirm, Playlist, Seite und Primitive, bleibt über Neustarts erhalten und wird bei Änderung von Filter, Reihenfolge oder Batch-Policy zurückgesetzt. Die Offline-Wiedergabe verwendet den letzten erfolgreichen Schnappschuss. Leere Übereinstimmungen überspringen das Primitive und jede resultierende leere Seite.

Speichern Sie das obige Selector-Objekt als selector.json und prüfen Sie dann den aktuellen Kandidatenkatalog vor der Veröffentlichung:

screenrig media selector-preview selector.json --primitive video

Die Vorschau gibt matched_count zurück, dateinamegeordnet candidates mit Medien-IDs und Tags sowie die normalisierte selector-Richtlinie. Bei zufälliger Reihenfolge zeigt sie den Pool und die Shuffle-Richtlinie; sie wählt nicht das Shuffle des Players, setzt keinen Cursor vor, erstellt keine Wiedergabeberechtigung und ändert kein Manifest. Bei gewichteter Reihenfolge gibt sie für jeden Kandidaten weight und share_percent sowie cycle zurück. --rect WxH (API rect: {width, height}) ist die Größe des Slots und ist mit fit: "aspect" erforderlich; die ausgeschlossenen Treffer stehen in excluded mit dem Grund aspect_mismatch. Bildselektoren übergeben --primitive image. Die API ist POST /api/selectors/preview mit { "primitive": "video", "selector": ... }. Sie verwendet das authentifizierte Projekt und dieselben Übereinstimmungsregeln wie die Wiedergabe. Katalogänderungen nach der Vorschau werden beim nächsten Schleifenende der Wiedergabe berücksichtigt.

Der statische Bundle-Export friert dynamische Übereinstimmungen als exakte IDs ein. Er bewahrt die Wiedergabe einzeln oder komplett; eine begrenzte Laufzeitsequenz mit batch_size und one_at_a_time: false erfordert vor dem Export das Entfernen dieses Feldes oder die Auswahl expliziter IDs. Dies verhindert das stille Verlieren eines Laufzeit-Batch-Cursors in einem statischen Bundle.

Gewichtete Rotation und Seitenverhältnis-Anpassung

order: "weighted" rotiert die Creatives eines Slots nach Gewicht, sodass jeder Sponsor seinen Anteil an den Wiedergaben behält. weights ordnet einer Medien-ID (med_...) oder tag:NAME eine ganze Zahl von 1 bis 1.000 zu, mit höchstens 64 Schlüsseln. Es funktioniert mit by von all, tag oder folder:

{
  "by": "all",
  "order": "weighted",
  "one_at_a_time": true,
  "weights": { "tag:Acme": 50, "tag:Globex": 30, "tag:Initech": 20 },
  "fit": "aspect"
}

Gewichte von 50, 30 und 20 liefern in jedem Zyklus genau 5, 3 und 2 von 10 Wiedergaben, und ein Neustart setzt mitten im Zyklus fort. Das Gewicht eines Elements ist sein Medien-ID-Schlüssel, falls vorhanden; sonst der alphabetisch erste Schlüssel tag:NAME unter den Tags, die es trägt, gleichmäßig aufgeteilt auf die Elemente der Auswahl, die ihn tragen, sodass der Anteil eines Sponsors unabhängig von der Anzahl seiner Creatives gleich bleibt; sonst zählt das Element als eigene Gruppe mit Gewicht 1. Ein Zyklus hat höchstens 4.096 Wiedergaben; Anteile werden nur dann darauf gerundet, wenn das exakte Verhältnis einen längeren Zyklus erfordert.

Die gewichtete Reihenfolge spielt pro Besuch ein Element ab, setzen Sie also one_at_a_time: true oder batch_size: 1. weights ist mit gewichteter Reihenfolge erforderlich und nur dort erlaubt; andernfalls gibt das Schreiben invalid_request zurück. Web-, Android-, Apple-, Windows- und Linux-Player unterstützen die gewichtete Reihenfolge ab den Versionen, die die Host-Fähigkeit selector.weighted deklarieren. Ein älterer Player spielt den Selektor zufällig ab, und die Manifest-Diagnosen enthalten selector_order_downgraded.

fit: "aspect" an einem dynamischen Selektor behält nur Dateien, deren Verhältnis von Breite zu Höhe innerhalb von 5 % des Rechtecks des Slots liegt, auch bei einer Videowand oder einem Anzeigerahmen, gelesen beim Auflösen des Selektors. Ein Hochformat-Slot spielt nie eine Querformat-Datei ab. Am Player ändert sich nichts.

screenrig media selector-preview gibt den erwarteten Anteil jedes gewichteten oder seitenverhältnisangepassten Selektors aus, und der Seiteneditor des Dashboards zeigt dieselbe Tabelle im Inspektor. Der statische Bundle-Export friert einen gewichteten Selektor als exakte IDs in Dateinamenreihenfolge ein; Gewichte bleiben nicht erhalten.

Bildschirm-Token in Tag-Selektoren

Das tag eines Tag-Selektors und jeder Eintrag seines tags-Filters darf {screen.field.NAME} oder {screen.id} sein, die Kennung des Bildschirms ohne das Präfix scr_, die ein Tag ist. Der Server füllt den Token für jeden Bildschirm, wenn er dessen Manifest und Selektor-Snapshot erstellt, sodass eine Playlist die eigenen Medien jedes Bildschirms abspielt. Versehen Sie die Medien mit dem Tag Lobby oder Garage, setzen Sie das Feld jedes Bildschirms mit screenrig screen update scr_ID --field zone=Lobby und geben Sie dem Slot diesen Selektor:

{ "by": "tag", "tag": "{screen.field.zone}", "one_at_a_time": true }

Der eingesetzte Wert folgt den Tag-Regeln: 1 bis 32 Buchstaben oder Ziffern. Ein Bildschirm ohne das Feld oder mit einem Wert, der kein Tag ist, wählt nichts aus: Er spielt aus diesem Slot keine Datei ab, und die Manifest-Diagnosen enthalten screen_fact_missing oder screen_fact_invalid. Eine Änderung eines Felds erstellt das Manifest dieses Bildschirms neu. Ein Selektor mit einem Token lässt sich nicht in der Vorschau anzeigen (media selector-preview erwartet ein konkretes Tag) und wird von playlist export nicht eingefroren.

Bildschirm-Token in Iframe-Adressen und Anwendungsparametern

src und fallback_src einer iframe können Bildschirm-Token im Pfad, in der Query oder im Fragment einer http- oder https-Adresse tragen, ebenso das optionale params eines application-Primitivs: bis zu 16 Namen aus 1 bis 32 Kleinbuchstaben, Ziffern oder Unterstrichen (ticket und policy sind reserviert) mit Werten von bis zu 512 Zeichen. Der Server füllt sie für jeden Bildschirm:

TokenWert
{screen.id}Die Kennung des Bildschirms ohne sein Präfix scr_.
{screen.name}Der Name des Bildschirms.
{screen.timezone}Die gespeicherte IANA-Zeitzone des Bildschirms.
{screen.field.NAME}Das Feld NAME des Bildschirms, 1 bis 32 Kleinbuchstaben, Ziffern oder Unterstriche.
{screen.location.lat}, {screen.location.lon}Sein Standort in Dezimalgrad.
{screen.location.name}, {screen.location.address}Sein Ortsname und seine Straßenadresse.
{
  "primitive": "iframe",
  "src": "https://maps.example.com/directory?kiosk={screen.field.kiosk_id}&level={screen.field.level}",
  "title": "Directory"
}

Der Schreibvorgang speichert die Vorlage wie geschrieben, geschweifte Klammern eingeschlossen. Das Manifest jedes Bildschirms trägt seine eigene Adresse, jeder Wert prozentkodiert für seine Stelle in der URL: Ein kiosk_id von B 2&3 wird zu B%202%263. Ein Token im Schema, in den Zugangsdaten, im Host oder im Port oder in einem YouTube-Link, einem Google- oder Microsoft-Dokumentlink oder einer BI-Ansichtsadresse ist invalid_request bei src (oder fallback_src). Das Veröffentlichen überspringt die Framing-Prüfung für eine src mit Token, und Vorschauen zeigen die Vorlage wie geschrieben.

Ein Bildschirm, dem ein Wert fehlt (ein nicht gesetztes Feld, kein Standort), oder dessen Werte sich zu einer Adresse über 2048 Zeichen oder zu einer mit einem Pfadsegment . oder .. füllen, erhält kein solches Iframe und keine solche Anwendung, und seine Manifest-Diagnosen enthalten screen_fact_missing oder screen_fact_invalid; eine leer gebliebene Seite wird verworfen. Jeder Schreibvorgang, der einen solchen Bildschirm erreicht (ein Playlist-Schreibvorgang, screen assign, screen update, eine Flottenzuweisung, eine genehmigte Prüfung), antwortet mit einer screen_fact_missing-Warnung, die die Tokens, die ersten 20 Bildschirm-IDs und deren Anzahl nennt. Das Ändern eines Felds oder Standorts erstellt das Manifest der betroffenen Bildschirme neu.

Bei einer Anwendung wird jeder gefüllte Parameter nach ticket an die Startadresse angehängt, prozentkodiert, zusammen höchstens 4096 Zeichen, sodass die Anwendung ihn aus location.search liest (SDK). Startparameter erreichen die Player-Web-App und die Player, die sie ausführen (Samsung Tizen, BrightSign, LG webOS und Vega); die Qt-, Android-, Apple- und Windows-Player laden die Anwendung aus ihrem lokalen Paket und senden keine. Das Feld url einer Vorlage kann ein ganzes Iframe src sein, und sein Wert kann selbst Bildschirm-Token tragen, die beim Erstellen des Manifests gefüllt werden. Ein Tag-Selektor verwendet {screen.id} und {screen.field.NAME} genauso (oben). Karten behalten ihre eigenen {screen.…}-Token.

Medienverfügbarkeit

screenrig media availability med_ID --file rule.json legt fest, wann die dynamischen Selektoren (all, tag und folder) eine Datei auswählen dürfen. --clear entfernt die Regel und --expect-rev N schützt die Medienrevision. Die API ist PATCH /api/media/{id}/availability mit If-Match und { "availability": {...} | null }. Zum Setzen einer Regel ist Manage-Zugriff nötig; eine Propose-Anmeldeinformation erhält insufficient_access.

Die Regel ist die Uhrzeit-Grammatik des Zeitplans, gelesen in der Zeitzone jedes Bildschirms, und enthält mindestens ein Element: from und until (zivil YYYY-MM-DDTHH:MM, until exklusiv), windows (wöchentlich {days, start, end}), monthly ({day} oder {nth, weekday}, jeweils mit optionalem start und end), dates ({date, start, end}) und except (Daten, die ein Vorkommen entfernen, einschließlich über Mitternacht reichender Enden). Sie enthält weder data noch interaction. Der Creative eines Sponsors für das lange Wochenende, nur an Werktagabenden innerhalb des Zeitraums verfügbar:

{
  "from": "2026-11-27T00:00",
  "until": "2026-11-30T23:59",
  "windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "17:00", "end": "22:00" }]
}

Nur Selektoren lesen die Regel: Ein expliziter Selektor mit id oder ids ignoriert sie, ebenso die Medienverweise von Karten, Soundtrack-Audio und Anzeigen-Creatives. Eine Datei verlässt die Auswahl und kehrt bei der nächsten Playlist-Schleife jedes Bildschirms zurück, innerhalb von etwa einer Minute nach der Grenze. Keine Playlist- oder Manifest-Revision ändert sich, und ein Offline-Player behält seine letzte Auswahl, bis er sich wieder verbindet. screenrig media selector-preview --timezone ZONE (Standard UTC) listet die Dateien, die jetzt außerhalb ihrer Regel liegen, in excluded mit dem Grund outside_window auf.