Guida Utente MediaVista — MVP

Documentazione completa per la versione MVP della piattaforma di digital signage. Dalla configurazione iniziale alla gestione avanzata dei contenuti.

01

Primi Passi

Accesso al Pannello Admin

Il pannello di amministrazione di MediaVista si trova all'indirizzo /admin. Per accedere, utilizza le credenziali fornite dall'amministratore del sistema. Il pannello utilizza Filament come framework di gestione e offre un'interfaccia intuitiva per tutte le operazioni.

Creazione Workspace

Il workspace rappresenta l'unità organizzativa principale di MediaVista. Ogni workspace raggruppa dispositivi, asset, playlist e utenti. Un super admin può creare nuovi workspace dal pannello navigando in Workspace → Crea Nuovo.

Primo Accesso e Configurazione Utente

Al primo accesso, ogni utente deve completare la configurazione del proprio profilo. I ruoli determinano i permessi operativi all'interno di ciascun workspace. Un utente può appartenere a più workspace contemporaneamente con ruoli differenti.

Suggerimento: Il super admin ha accesso globale a tutti i workspace e può bypassare le restrizioni di tenancy.
02

Impianti (Plants)

Cosa sono gli Impianti

Un impianto rappresenta una locazione fisica dove sono installati uno o più dispositivi di digital signage. Può essere un negozio, un ufficio, un centro commerciale o qualsiasi altro punto di installazione. Gli impianti permettono di raggruppare logicamente i dispositivi per posizione geografica.

Come Creare un Impianto

Dal pannello admin, naviga nella sezione Impianti → Crea Nuovo e compila i seguenti campi:

Assegnazione Dispositivi e Playlist

Una volta creato l'impianto, è possibile associare dispositivi esistenti tramite la relazione nella scheda dettaglio. Ogni dispositivo può appartenere a un solo impianto alla volta. Le playlist e i layout vengono gestiti a livello di singolo dispositivo, ma l'impianto fornisce un contesto organizzativo per le operazioni di gruppo.

03

Dispositivi

I dispositivi sono gli schermi fisici che riproducono i contenuti. MediaVista supporta due flussi di pairing per collegare un nuovo dispositivo al sistema.

Flusso 1 — Bootstrap dal Player

Questo flusso viene avviato direttamente dal dispositivo alla prima accensione.

  1. Il player si avvia e chiama POST /api/v1/devices/bootstrap inviando il proprio hardware_id univoco
  2. Il server crea il record del device e genera un codice di pairing a 6 cifre con scadenza di 10 minuti
  3. Il codice viene mostrato sullo schermo del player in formato grande e leggibile
  4. L'admin apre il pannello Filament, individua il dispositivo nella lista e inserisce il codice di pairing
  5. POST /api/v1/pairing/verify valida il codice e, se corretto, restituisce il device_token JWT
  6. Il player salva il token in locale e inizia immediatamente a scaricare il manifest

Flusso 2 — Codice Generato dall'Admin

Questo flusso viene avviato dall'amministratore quando vuole pre-registrare un dispositivo.

  1. L'admin accede al pannello e clicca "Genera codice di pairing" nella sezione dispositivi
  2. POST /api/v1/workspaces/{id}/devices/pair genera un codice univoco
  3. Il codice viene comunicato all'operatore in loco (via telefono, email o altro canale)
  4. L'operatore inserisce il codice nel player tramite l'interfaccia di pairing
  5. POST /api/v1/workspaces/{id}/devices/claim associa il device al workspace e completa il pairing
  6. Il player riceve il token JWT e inizia a operare normalmente
Attenzione: I codici di pairing scadono dopo 10 minuti dalla generazione. Se il codice scade, è necessario generarne uno nuovo.
04

Asset e Playlist

Upload Asset

Gli asset sono i contenuti multimediali che verranno riprodotti sui dispositivi. MediaVista supporta diversi formati:

Per caricare un asset, naviga in Asset → Carica Nuovo dal pannello admin e seleziona il file. Il sistema accetta upload fino alla dimensione configurata nel server.

Processing Automatico

Dopo il caricamento, il sistema esegue automaticamente:

Creazione Playlist

Una playlist è una sequenza ordinata di asset. Per creare una playlist:

Configurazione Item

Ogni item della playlist può essere configurato con:

05

Layout

Creazione Layout Multi-Zona

Un layout definisce come lo schermo viene suddiviso in zone, ognuna delle quali riproduce una playlist indipendente. Questo permette di mostrare contenuti diversi contemporaneamente su parti diverse dello schermo.

Per creare un layout, naviga in Layout → Crea Nuovo e definisci le zone desiderate.

Definizione delle Zone

Ogni zona è definita dai seguenti parametri, tutti espressi in percentuale rispetto alle dimensioni dello schermo:

Esempio: Un layout tipico potrebbe avere una zona principale al 70% dell'altezza (x:0, y:0, width:100, height:70) e un ticker in basso al 30% (x:0, y:70, width:100, height:30).

Assegnazione Playlist e Dispositivi

Dopo aver definito le zone, assegna una playlist a ciascuna zona. Infine, assegna il layout completo a uno o più dispositivi. Ogni dispositivo può avere un solo layout attivo alla volta.

06

Struttura Manifest v2.0

Il manifest è il documento JSON che il player scarica per conoscere quali contenuti riprodurre, come disporli e con quali impostazioni operare. La versione 2.0 introduce un catalogo asset deduplicato e il supporto per aggiornamenti delta tramite ETag.

Esempio Completo

{
  "version": "2.0",
  "generated_at": "2026-02-06T10:30:00Z",
  "device_id": "uuid-device",
  "workspace_id": "uuid-workspace",
  "asset_catalog": {
    "asset-uuid-1": {
      "url": "/api/v1/assets/asset-uuid-1/download",
      "mime_type": "video/mp4",
      "size": 15728640,
      "checksum": "sha256:abc123...",
      "thumbnail_url": "/api/v1/assets/asset-uuid-1/thumbnail"
    }
  },
  "layout": {
    "id": "layout-uuid",
    "name": "Layout Principale",
    "zones": [
      {
        "id": "zone-uuid-1",
        "name": "Main",
        "x": 0, "y": 0, "width": 100, "height": 70,
        "playlist": {
          "id": "playlist-uuid",
          "name": "Playlist Principale",
          "items": [
            {
              "asset_id": "asset-uuid-1",
              "duration": 15,
              "position": 1,
              "transition": "fade"
            }
          ]
        }
      },
      {
        "id": "zone-uuid-2",
        "name": "Ticker",
        "x": 0, "y": 70, "width": 100, "height": 30,
        "playlist": { "...": "..." }
      }
    ]
  },
  "schedule": {
    "default_playlist_id": "playlist-uuid",
    "entries": []
  },
  "emergency": null,
  "commands_pending": 0,
  "settings": {
    "heartbeat_interval": 30,
    "manifest_poll_interval": 300,
    "log_level": "info"
  }
}

Descrizione dei Campi

version
Versione dello schema del manifest. Attualmente "2.0".
generated_at
Timestamp ISO 8601 della generazione del manifest lato server.
device_id
UUID del dispositivo a cui è destinato il manifest.
workspace_id
UUID del workspace di appartenenza del dispositivo.
asset_catalog
Catalogo deduplicato di tutti gli asset referenziati. Ogni asset è indicizzato per UUID e contiene URL di download, tipo MIME, dimensione in byte, checksum SHA-256 e URL della thumbnail.
layout
Definizione del layout attivo, con l'elenco delle zone. Ogni zona specifica posizione e dimensioni in percentuale, oltre alla playlist assegnata con i relativi item ordinati.
layout.zones[].playlist.items[]
Ogni item contiene il riferimento all'asset (asset_id), la durata in secondi, la posizione nella sequenza e il tipo di transizione.
schedule
Programmazione temporale dei contenuti. Contiene la playlist predefinita e un array di entry per la pianificazione oraria.
emergency
Messaggio di emergenza attivo. Valore null se non c'è nessuna emergenza in corso.
commands_pending
Numero di comandi remoti in attesa di esecuzione da parte del player.
settings
Configurazione operativa del player: intervallo heartbeat (secondi), intervallo di polling del manifest (secondi) e livello di log.
Delta Manifest: Il player invia l'header If-None-Match con l'ETag dell'ultimo manifest ricevuto. Se il manifest non è cambiato, il server risponde con 304 Not Modified, risparmiando banda e tempo di elaborazione.
07

Comandi Remoti

MediaVista permette di inviare comandi remoti ai dispositivi per operazioni di gestione e manutenzione. I comandi possono essere inviati dal pannello admin o direttamente via API.

Comando Descrizione Effetto
restart Riavvia il player Il player esegue un riavvio completo dell'applicazione, ricaricando il manifest e tutti gli asset
screenshot Cattura screenshot Il player cattura un'immagine dello schermo corrente e la invia al server per la visualizzazione nel pannello admin
clear-cache Pulisce la cache locale Svuota la cache del Service Worker e degli asset scaricati, forzando il ri-download completo
force-reload Forza ricaricamento manifest Il player ignora l'ETag corrente e scarica una copia fresca del manifest dal server

Invio Comandi dal Pannello Admin

Nel pannello Filament, apri la scheda dettaglio di un dispositivo e utilizza i pulsanti di azione rapida nella sezione "Comandi". Il comando viene accodato e il player lo riceve al prossimo heartbeat o immediatamente via WebSocket.

Invio Comandi via API

I comandi possono essere inviati programmaticamente tramite l'endpoint dedicato. Il player recupera i comandi in attesa tramite GET /api/v1/devices/commands/pending durante il ciclo di heartbeat.

08

Emergenze

Messaggi Broadcast di Emergenza

Il sistema di emergenza permette di sovrascrivere istantaneamente il contenuto di tutti i dispositivi di un workspace con un messaggio prioritario. Questo è utile per comunicazioni urgenti, avvisi di sicurezza o informazioni critiche.

Come Creare un'Emergenza

Priorità e Comportamento

I messaggi di emergenza hanno la priorità massima e sovrascrivono qualsiasi contenuto in riproduzione. Il player interrompe la playlist corrente e mostra il messaggio a schermo intero fino alla cancellazione dell'emergenza.

Push Immediato via WebSocket

Le emergenze vengono inviate tramite WebSocket (Laravel Reverb) per garantire la ricezione istantanea. Il player non deve attendere il prossimo ciclo di polling — il messaggio arriva in tempo reale sul canale device.{id}.

Cancellazione

Per cancellare un'emergenza attiva, naviga nella sezione emergenze del pannello e utilizza l'azione "Termina". Tutti i dispositivi torneranno automaticamente alla riproduzione normale dei contenuti programmati.

09

API Reference

MediaVista espone due famiglie di API REST, tutte sotto il prefisso /api/v1/.

Device API (Autenticazione JWT)

Utilizzate dai player per comunicare con il server. L'autenticazione avviene tramite token JWT ottenuto durante il pairing.

Metodo Endpoint Descrizione
POST /api/v1/devices/bootstrap Bootstrap di un nuovo dispositivo con hardware_id
POST /api/v1/pairing/verify Verifica codice di pairing e ottiene il token JWT
GET /api/v1/devices/{id}/manifest Scarica il manifest completo del dispositivo
GET /api/v1/devices/{id}/manifest/delta Delta manifest con supporto ETag/304
POST /api/v1/devices/heartbeat Heartbeat periodico con stato del dispositivo
GET /api/v1/devices/commands/pending Recupera i comandi remoti in attesa
POST /api/v1/devices/pop Invia dati Proof of Play (report riproduzione)
GET /api/v1/devices/emergency Verifica messaggi di emergenza attivi
POST /api/v1/devices/screenshots Upload screenshot catturato dal player

Admin / Workspace API (Autenticazione Sanctum)

Utilizzate dal pannello admin e da integrazioni esterne. L'autenticazione avviene tramite token Sanctum. Tutti gli endpoint sono prefissati con /api/v1/.

Metodo Endpoint Descrizione
POST /workspaces/{ws}/devices/pair Genera un nuovo codice di pairing per un dispositivo
POST /workspaces/{ws}/devices/claim Associa un dispositivo al workspace tramite codice
GET POST /workspaces/{ws}/assets Lista e caricamento degli asset multimediali
GET POST /workspaces/{ws}/playlists Gestione delle playlist
GET POST /workspaces/{ws}/layouts Gestione dei layout multi-zona
GET POST /workspaces/{ws}/plants Gestione degli impianti
POST /workspaces/{ws}/emergency Crea un messaggio di emergenza broadcast
GET /workspaces/{ws}/stats Statistiche e metriche del workspace
10

Debug Player

Il player MediaVista include strumenti di debug integrati per la diagnostica sul campo. Queste funzionalità sono accessibili tramite scorciatoie da tastiera.

Ctrl + Shift + D — Pannello Debug

Apre un pannello sovrapposto con informazioni diagnostiche in tempo reale:

  • Versione e timestamp dell'ultimo manifest ricevuto
  • Stato della cache locale (dimensione, numero di asset)
  • Stato della connessione WebSocket (connesso/disconnesso/riconnessione)
  • Ultimo heartbeat inviato e risposta del server
  • Comandi pendenti e log degli ultimi comandi eseguiti

Ctrl + Shift + M — Overlay Manifest

Mostra un overlay a schermo intero con il dump JSON completo del manifest corrente, formattato e navigabile. Utile per verificare la struttura dati ricevuta dal server e diagnosticare problemi di contenuto.

Console del Browser

Il player scrive log dettagliati nella console del browser. Apri gli strumenti di sviluppo (F12) per visualizzare:

Suggerimento: Il livello di log è configurabile nel manifest tramite il campo settings.log_level. I valori supportati sono: debug, info, warn, error.
11

Troubleshooting

Di seguito i problemi più comuni e le relative soluzioni.

Il dispositivo non si collega al server
Soluzione: Verificare che il dispositivo abbia connettività di rete. Controllare che l'endpoint di bootstrap (/api/v1/devices/bootstrap) sia raggiungibile. Verificare le regole del firewall e assicurarsi che le porte necessarie (80/443) siano aperte. Controllare i log del server per eventuali errori di autenticazione.
Il manifest non si aggiorna
Soluzione: Controllare che l'ETag venga inviato correttamente nell'header If-None-Match. Se il problema persiste, inviare il comando clear-cache dal pannello admin per forzare il player a scaricare una copia fresca. Verificare anche che il manifest_poll_interval nelle impostazioni sia configurato correttamente.
Il video non si riproduce
Soluzione: Verificare che il video sia codificato in formato H.264/MP4, il codec più ampiamente supportato. Controllare che la risoluzione e il bitrate siano compatibili con il dispositivo. Usare il pannello debug (Ctrl+Shift+D) per verificare che l'asset sia stato scaricato correttamente nella cache locale.
WebSocket disconnesso
Soluzione: Controllare che Laravel Reverb sia in esecuzione e che la porta 8085 sia accessibile dal dispositivo. Verificare la configurazione del firewall e dei proxy. Il player tenta automaticamente la riconnessione, ma se il problema persiste controllare i log di Reverb sul server.
Codice di pairing scaduto
Soluzione: I codici di pairing hanno una validità di 10 minuti dalla generazione. Se il codice è scaduto, generarne uno nuovo dal pannello admin oppure riavviare il player per ottenere un nuovo codice tramite il flusso di bootstrap.