Dal foglio agli schermi
- Parti dal modello. Salva il modello come CSV o XLSX, oppure usa un tuo foglio con le stesse colonne.
- Compila una riga per ogni voce di programmazione. Indica lo schermo (o una cartella o un tag), il file, l’inizio e la fine.
- Importalo. Trascina il file nella finestra Importa della scheda Programmazione della dashboard, oppure esegui
screenrig schedule import FILE. - Correggi le righe con errori. Ogni errore indica la riga, la colonna e un codice. Modifica la cella nella finestra di dialogo, oppure modifica il foglio e importalo di nuovo.
- Controlla l’anteprima. Elenca i livelli creati dal foglio, quelli che modifica o rimuove e il calendario degli schermi che tocca.
- Pubblica. Tutte le righe vengono applicate insieme, oppure nessuna.
I passaggi da 1 a 5 non scrivono nulla. Uno schermo richiede un fuso orario (screen set-timezone) e una playlist predefinita (screen assign) prima che una riga possa programmarlo, e un file deve essere un’immagine o un video approvato.
Il foglio
La prima riga indica i nomi delle colonne. Ogni riga successiva è una voce di programmazione. Le righe vuote vengono saltate. Un foglio è un file CSV (UTF-8, separato da virgole o punti e virgola) o una cartella di lavoro XLSX, e una cartella di lavoro XLSX viene letta dal suo primo foglio.
| Colonna | Letto anche come | Cosa contiene |
|---|---|---|
target | screen, screen code, code, room, room id, screen name, screen id | Gli schermi che la riga programma. Obbligatorio |
content | file, file name, media, asset, playlist | Cosa viene riprodotto. Obbligatorio |
start | start date, from, begin | Quando inizia la riga |
end | end date, until, stop | Quando finisce la riga |
timezone | time zone, tz | Il fuso in cui sono scritti gli orari della riga |
days | weekdays, day | I giorni della settimana in cui la riga viene riprodotta |
daily start | window start, time from | L’ora del giorno in cui si apre ogni finestra di riproduzione |
daily end | window end, time to | L’ora del giorno in cui si chiude ogni finestra di riproduzione |
priority | Da 0 a 100. Un valore più alto prevale su uno più basso. Predefinito 0 | |
name | level, label | Un nome per il livello creato dalla riga |
display | displays, output | Le uscite del video wall su cui la riga viene riprodotta, come 1 o 1,2 |
Le intestazioni corrispondono senza distinguere maiuscole, spazi e punteggiatura. Una colonna che nulla legge viene ignorata e l’anteprima la elenca. Una riga richiede target, content e almeno uno tra start, end, days o una finestra giornaliera.
Screen,File,Start,End,Timezone,Days,Daily start,Daily end,Priority,Name
LOBBY-01,welcome-spring.jpg,2026-11-05 18:00,2026-11-08 02:00,America/Los_Angeles,,,,0,
folder:Casino Floor,happy-hour.mp4,2026-11-05,2026-11-30,,Mon-Fri,16:00,19:00,5,Happy hour
tag:elevators,playlist:Holiday loop,2026-12-01 09:00,2026-12-26,,,,,0,
- La riga 2 riproduce
welcome-spring.jpgsullo schermo con il codiceLOBBY-01dalle 6 PM del 5 novembre alle 2 AM dell’8 novembre, ora del Pacifico. - La riga 3 riproduce
happy-hour.mp4su ogni schermo della cartellaCasino Floore delle cartelle al suo interno, dalle 4 PM alle 7 PM nei giorni feriali, dal 5 novembre alla fine del 30 novembre. - La riga 4 riproduce la playlist
Holiday loopsu ogni schermo con il tagelevators, dalle 9 AM del 1 dicembre alla fine del 25 dicembre.
Destinazioni
Una destinazione è una di queste:
- Uno schermo. Un id schermo, il valore di un qualsiasi campo dello schermo (un codice stanza, un numero di negozio) o il nome dello schermo.
--code-fieldocode_fieldlimita la corrispondenza a un solo campo, comecodeoroom_id. - Una cartella.
folder:NAMEofolder:Parent/Child. Raggiunge la cartella e tutte le cartelle al suo interno. - Un tag.
tag:NAMEraggiunge ogni schermo con il tag.
Più destinazioni in una cella si separano con ; o |, come in LOBBY-01;LOBBY-02|tag:elevators.
Contenuto
- Un file. Il nome di un file multimediale del progetto, o il nome originale di un upload convertito. Il file viene riprodotto a schermo intero. Il primo commit che usa un file crea la playlist di un solo file
Scheduled: FILE; le importazioni successive la riutilizzano. - Una playlist.
playlist:NAMEo un id di playlist. La playlist ha una versione approvata e non è un modello.
Orari
- Date e orari. Vengono letti
2026-11-05 18:00,2026-11-05T18:00,11/5/2026 6:00 PMe le celle data del foglio di calcolo. Un orario con offset, comeZo+02:00, viene rifiutato. - L’orologio di ogni schermo. Gli orari sono letti sull’orologio degli schermi che la riga raggiunge, quindi
18:00sono le 6 PM ovunque si trovi lo schermo. - Un altro fuso orario. Una cella
timezone(o il parametrotimezonedella richiesta) indica che la riga è scritta in quel fuso. Gli orari vengono convertiti nel fuso degli schermi quando tutti gli schermi della riga condividono lo stesso fuso. Una riga che raggiunge schermi in più fusi lasciatimezonevuoto e legge l’orologio di ciascuno schermo. - Una sola data come fine chiude quel giorno:
2026-11-30termina alla fine del 30 novembre. Una sola data come inizio comincia a mezzanotte. - Nessuna fine mantiene la riga in riproduzione finché un’importazione successiva non la rimuove. L’anteprima segnala l’avviso
open_end. - Giorni.
Mon-Fri,Mon,Wed,Fri,Sat,Sun,weekdays,weekendsodaily. Una riga condayse senza finestra giornaliera riproduce tutto il giorno in quei giorni. - Una finestra giornaliera.
daily startedaily endindicano le ore di ogni giorno, per esempio16:00e19:00oppure4:00 PMe7:00 PM. Indicali entrambi. Una fine uguale o precedente all’inizio attraversa la mezzanotte e appartiene al giorno in cui inizia. Senzadays, la finestra vale ogni giorno.
Anteprima ed errori
L’anteprima controlla ogni riga e ogni cella prima di scrivere qualsiasi cosa. Una riga con un errore viene mostrata con le sue celle e ogni errore indica la colonna, un codice e cosa cambiare.
| Codice | Colonna | Significato e correzione |
|---|---|---|
required | target, content, daily start, daily end | La cella è vuota, oppure è compilata una sola delle celle della finestra giornaliera. Compilala |
unknown_screen | target | Nessuno schermo ha quell’id, valore di campo o nome. Controlla il codice, oppure il campo indicato da code_field |
ambiguous_screen | target | Il valore corrisponde a più schermi. Usa l’id dello schermo o un codice univoco |
unknown_folder | target | Nessuna cartella schermi ha quel nome. Controlla l’ortografia |
ambiguous_folder | target | Più cartelle hanno quel nome. Scrivi il percorso, per esempio folder:Hotel/Casino Floor |
unknown_tag | target | Nessuno schermo ha il tag. Controlla l’ortografia |
unknown_file | content | Nessun file o playlist ha quel nome. Carica il file, oppure correggi il nome |
ambiguous_file | content | Più file hanno quel nome. Rinominane uno, oppure scrivi playlist:NAME |
not_playable | content | Il file non è un’immagine o un video, il contenuto è in attesa di revisione, oppure la playlist è un modello o non ha una versione approvata. Approvalo, oppure scegline un altro |
invalid_time | start, end, daily start, daily end | La cella non è una data e un’ora, oppure contiene un offset di fuso. Scrivi 2026-11-05 18:00 |
reversed_times | end | La fine non è successiva all’inizio. Correggi uno dei due |
past_end | end | La fine è già passata. Spostala più avanti, oppure rimuovi la riga |
no_timing | start | La riga non dice nulla su quando. Indica un inizio, una fine, i giorni o una finestra giornaliera |
invalid_value | days, priority, display | La cella non è un elenco di giorni come Mon-Fri, un numero intero da 0 a 100, o numeri di display come 1,2 |
timezone | timezone | Il fuso è sconosciuto, oppure la destinazione contiene schermi in più fusi. Usa un fuso come America/Los_Angeles, oppure lascia vuoto |
screen_not_ready | target | Uno schermo non ha fuso orario o playlist predefinita. Esegui screen set-timezone o screen assign |
overlap | priority | Due righe sono valide nello stesso momento su uno schermo con la stessa priorità. Dai a una una priorità diversa, oppure sposta un orario |
limit | target | Uno schermo avrebbe più di 32 livelli propri, o l’organizzazione più di 100 campagne (ogni livello condiviso ne è una). Unisci le righe, oppure usa come destinazione una cartella o un tag |
Due avvisi non fermano un’importazione. open_end segnala una riga senza fine. outranked segnala una riga che un livello condiviso (una riga per più schermi, una cartella o un tag) sovrascrive in riproduzione su uno schermo.
Un foglio senza righe, un file che non è UTF-8, più di 5.000 righe, un file oltre 8 MiB, o un commit che scriverebbe le programmazioni proprie di più di 400 schermi viene rifiutato con il motivo.
Livelli
Le righe che coincidono per contenuto, orari, priorità, nome e display diventano un solo livello. La destinazione non fa parte del confronto, quindi dieci righe che riproducono lo stesso file agli stessi orari su dieci schermi creano un solo livello.
- Uno schermo crea una voce nella programmazione propria di quello schermo.
- Più schermi, una cartella o un tag creano un solo livello condiviso, una campagna su quel pubblico. Un livello condiviso prevale sui livelli propri di uno schermo.
Raggruppare trasforma i 200 schermi di un locale in una sola campagna e non in 200 voci, e una correzione nel foglio modifica un solo livello. La colonna name nomina un livello condiviso. Senza di essa, il livello prende il nome dall’importazione, dal contenuto e dalla destinazione, come in Spring promos: happy-hour.mp4 on Casino Floor.
Importa di nuovo
Il valore name di un’importazione la identifica e il predefinito è import. Importando di nuovo con lo stesso nome:
- aggiorna i livelli che ha creato, anche quando le date di una riga sono cambiate;
- aggiunge i livelli delle nuove righe;
- rimuove i livelli le cui righe non sono più nel foglio;
- non cambia nulla quando il foglio è lo stesso.
I livelli creati da un’importazione la portano nel proprio id (le voci di uno schermo iniziano con imp_) e le campagne portano un contrassegno import. I livelli creati a mano non vengono mai toccati. Usa un nome per un foglio e un nome diverso per un altro.
Esegui un’importazione
Dashboard
Apri la scheda Programmazione di un progetto e scegli Importa. Trascina un file CSV o XLSX. La finestra di dialogo mostra una tabella delle righe con ogni errore accanto alla sua cella e modifichi la cella direttamente lì. Mostra poi il calendario composto degli schermi che l’importazione modifica. Pubblica ne esegue il commit.
Riga di comando
screenrig schedule template --output schedule.csv
screenrig schedule import schedule.csv --name "Spring promos" --timezone America/Los_Angeles
screenrig schedule import schedule.csv --name "Spring promos" --timezone America/Los_Angeles --commit
schedule import mostra l’anteprima e non scrive nulla. --commit applica il foglio quando ogni riga è valida.
| Opzione | Significato |
|---|---|
--name NAME | Il nome dell’importazione, da 1 a 80 caratteri. Il predefinito è il nome del file senza estensione |
--timezone ZONE | Il fuso in cui sono scritti gli orari quando una riga non ha timezone |
--code-field FIELD | Leggi un codice schermo solo da questo campo dello schermo |
--commit | Applica il foglio |
--format csv|xlsx | schedule template: il formato del modello |
--output FILE | schedule template: dove salvarlo |
Il comando termina con 0 per un foglio valido, 8 quando le righe hanno errori (non viene scritto nulla) e 5 quando il progetto è cambiato dopo l’anteprima (eseguilo di nuovo). FILE è un file .csv, .xlsx o .json, oppure - per lo standard input. Un file JSON contiene un array di oggetti riga, oppure {"rows": [...]}, con chiavi pari ai nomi delle colonne.
API
Invia il foglio come righe JSON, oppure come corpo CSV o XLSX con le impostazioni come parametri di query. L’anteprima richiede accesso in lettura. Il commit richiede una credenziale con accesso in scrittura, che concede una persona che può approvare nella dashboard.
curl -s https://api.screenrig.ai/api/schedule/imports/preview \
--header "Authorization: Bearer $SCREENRIG_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"name": "Spring promos",
"timezone": "America/Los_Angeles",
"rows": [
{"target": "LOBBY-01", "content": "welcome-spring.jpg", "start": "2026-11-05 18:00", "end": "2026-11-08 02:00"},
{"target": "folder:Casino Floor", "content": "happy-hour.mp4", "start": "2026-11-05", "end": "2026-11-30",
"days": "Mon-Fri", "daily_start": "16:00", "daily_end": "19:00", "priority": 5, "name": "Happy hour"}
]
}'
Lo stesso foglio come file:
curl -s "https://api.screenrig.ai/api/schedule/imports/preview?name=Spring%20promos&timezone=America/Los_Angeles" \
--header "Authorization: Bearer $SCREENRIG_TOKEN" \
--header "Content-Type: text/csv" \
--data-binary @schedule.csv
La risposta, abbreviata:
{
"name": "Spring promos",
"valid": false,
"fingerprint": "FINGERPRINT",
"columns": ["target", "content", "start", "end", "days", "daily_start", "daily_end", "priority", "name"],
"summary": {"rows": 2, "rows_with_errors": 1, "levels": 1, "creates": 1, "updates": 0,
"unchanged": 0, "removes": 0, "screens": 1, "playlists": 1},
"rows": [
{"row": 2, "status": "ok", "level": "LEVEL_KEY"},
{"row": 3, "status": "error",
"errors": [{"column": "content", "code": "unknown_file",
"message": "No file or playlist is named \"happy-hour.mp4\"."}]}
],
"levels": [{"key": "LEVEL_KEY", "action": "create", "home": "screen", "screen_id": "scr_LOBBY",
"content": {"kind": "file", "id": "med_WELCOME", "name": "welcome-spring.jpg"},
"screens": 1, "priority": 0, "from": "2026-11-05T18:00", "until": "2026-11-08T02:00", "rows": [2]}],
"removals": []
}
rows[].cells restituisce le celle di ogni riga così come le ha fornite il foglio, così un client le corregge e invia di nuovo le righe. valid è true quando nessuna riga ha errori. calendar ha la forma di GET /api/schedule/calendar e mostra gli schermi che l’importazione modifica come sarebbero dopo un commit.
Il commit invia lo stesso foglio e il valore fingerprint della sua anteprima, come membro del corpo JSON o come parametro di query con un file. Invia un Idempotency-Key per riprovare in sicurezza.
curl -s https://api.screenrig.ai/api/schedule/imports \
--header "Authorization: Bearer $SCREENRIG_TOKEN" \
--header "Idempotency-Key: spring-promos-1" \
--header "Content-Type: application/json" \
--data @commit.json
La risposta contiene preview e applied, i conteggi di ciò che è stato creato, aggiornato, lasciato invariato e rimosso, con gli schermi scritti e le playlist create. Un commit viene rifiutato, senza scrivere nulla, come:
| Problema | Stato | Significato e correzione |
|---|---|---|
schedule_import_invalid | 422 | Alcune righe hanno errori. Correggile e visualizza di nuovo l’anteprima |
schedule_import_stale | 409 | Schermi, contenuti, playlist o livelli sono cambiati dopo l’anteprima, oppure le righe vengono lette in modo diverso. Visualizza di nuovo l’anteprima e invia il commit con il nuovo fingerprint |
GET /api/schedule/imports/template?format=csv e format=xlsx rispondono con il modello.
Limiti
- 5.000 righe e 8 MiB per foglio.
- 32 livelli propri per schermo. Un’organizzazione può avere fino a 100 campagne in tutti i suoi progetti, e ogni livello condiviso ne è una.
- Per ogni commit vengono scritte le programmazioni proprie di 400 schermi. Una riga con cartella o tag raggiunge un numero qualsiasi di schermi.
- Il nome di un’importazione ha da 1 a 80 caratteri.