12 KiB
Info-Board Neu - Datenmodell
Ziel
Das Datenmodell trennt klar zwischen:
- Mandanten und Benutzern
- Bildschirmen und ihrer technischen Laufzeitinformation
- Medien und Playlists
- Steuerbefehlen und Rueckmeldungen
Das Modell ist so ausgelegt, dass:
- jede Firma nur ihren eigenen Monitor bzw. Kanal pflegt
- die Administration alle Monitore zentral sehen und steuern kann
- Offline-Betrieb der Player moeglich bleibt
- Zeitsteuerung mit
valid_fromundvalid_untilsauber abbildbar ist
Kernentitaeten
tenant
Repraesentiert eine Firma bzw. einen abgeschotteten Inhaltsbereich.
Felder:
idslugnameactivecreated_atupdated_at
Hinweise:
- ein Tenant kann spaeter mehrere Screens haben, auch wenn zunaechst meist 1:1 gearbeitet wird
- alle Medien und Playlists sind einem Tenant zugeordnet
user
Repraesentiert einen Benutzer der Firmen- oder Admin-Oberflaeche.
Felder:
idtenant_idnullable fuer globale Adminsusernameemailpassword_hashrole(admin,tenant_user)activelast_login_atcreated_atupdated_at
Regeln:
tenant_userdarf nur Daten des eigenen Tenants sehen und bearbeitenadmindarf alle Tenants und alle Screens verwalten
screen
Repraesentiert einen physischen Monitor bzw. einen Player-Client.
Felder:
idtenant_idslugnamedescriptionlocationhardware_nameenabledrotation(0,90,180,270)resolution_widthresolution_heightfallback_dirsnapshot_interval_secondsoffline_overlay_enabledcreated_atupdated_at
Hinweise:
- der
slugdient als technische Kennung fuer Konfiguration, API und MQTT fallback_dirbeschreibt die lokale oder synchronisierte Fallback-Quelle auf dem Client
screen_registration
Optionale Trennung zwischen fachlichem Screen und technischer Registrierung.
Felder:
idscreen_iddevice_uuidhostnameapi_token_hashmqtt_client_idlast_seen_atlast_ipplayer_versionos_versioncreated_atupdated_at
Zweck:
- Wiedererkennung eines konkreten Geraets
- sichere Kommunikation mit API und Broker
- technische Inventarisierung
provisioning_job
Repraesentiert einen Provisionierungslauf fuer einen neuen oder neu aufzubauenden Screen.
Felder:
idscreen_idrequested_by_user_idtarget_iptarget_portremote_userauth_mode(password,key)provided_secret_refssh_key_fingerprintnullablestatus(queued,running,succeeded,failed,cancelled)stage(connect,bootstrap,key_install,package_install,deploy,verify,done)log_excerptnullableerror_messagenullablestarted_atnullablefinished_atnullablecreated_atupdated_at
Regeln:
- das eigentliche Passwort wird nicht im Klartext in der Datenbank gespeichert
provided_secret_refverweist auf einen kurzlebigen oder extern geschuetzten Secret-Eintrag- pro Job soll klar erkennbar sein, in welchem Schritt ein Fehler aufgetreten ist
screen_group
Optionale logische Gruppierung von Screens.
Felder:
idslugnamedescriptioncreated_atupdated_at
screen_group_member
Zuordnung eines Screens zu einer Gruppe.
Felder:
idscreen_group_idscreen_idcreated_at
Zweck:
- praktische Zielauswahl fuer Kampagnen und Provisionierungsaktionen
media_asset
Repraesentiert ein verwaltetes Medium.
Felder:
idtenant_idscreen_idnullabletitledescriptiontype(image,video,pdf,web)source_kind(upload,remote_url)storage_pathnullable bei reinen Web-URLsoriginal_urlnullablemime_typechecksumsize_bytesenabledcreated_by_user_idcreated_atupdated_at
Regeln:
uploadbedeutet: Datei liegt im Medien-Storageremote_urlbedeutet: Quelle ist extern und wird vom Player oder Server gecachtscreen_idkann optional gesetzt werden, wenn ein Medium nur fuer einen Monitor gedacht ist
playlist
Repraesentiert eine logische Playlist eines Screens.
Felder:
idtenant_idscreen_idnameis_activedefault_duration_secondsfallback_enabledfallback_dirshuffle_enabledcreated_atupdated_at
Regeln:
- pro Screen gibt es in v1 genau eine aktive Playlist
- spaeter koennen mehrere Playlists mit Umschaltung moeglich werden
display_template
Repraesentiert ein globales Admin-Template zur monitoruebergreifenden Orchestrierung.
Beispiele:
- Schriftzug ueber mehrere Monitore
- saisonales Motiv auf allen Monitoren
- Veranstaltungslayout fuer einen befristeten Zeitraum
Felder:
idslugnamedescriptiontemplate_type(message_wall,full_screen_media,screen_specific_scene)enabledcreated_by_user_idcreated_atupdated_at
template_scene
Repraesentiert die konkrete Auspraegung eines Templates fuer einen oder mehrere Screens.
Felder:
iddisplay_template_idscreen_idnullablescreen_slotnullabletype(image,video,pdf,web,html)srcduration_secondsload_timeout_secondscache_policyon_errorlayout_jsoncreated_atupdated_at
Hinweise:
screen_iderlaubt die direkte Zuweisung zu einem konkreten Monitorscreen_sloterlaubt spaeter abstrakte Wand-Slots wierow1-col2layout_jsonkann z. B. Textpositionen, Farben oder Teilbereiche des Gesamtmotivs beschreiben
campaign
Repraesentiert eine aktivierbare globale Kampagne auf Basis eines Templates.
Felder:
iddisplay_template_idnamedescriptionpriorityactivevalid_fromnullablevalid_untilnullableoverride_mode(replace_tenant_content,replace_all,merge_reserved_slots)created_by_user_idcreated_atupdated_at
Regeln:
- Kampagnen ueberschreiben in v1 standardmaessig den Firmencontent
- nach Ende oder Deaktivierung greift automatisch wieder der tenantbezogene Normalbetrieb
template_assignment
Repraesentiert die Zuordnung einer Kampagne oder eines Templates zu einem oder mehreren Screens.
Felder:
idcampaign_idscreen_idenabledcreated_atupdated_at
Zweck:
- Auswahl einzelner Monitore, Gruppen oder aller Monitore
playlist_item
Repraesentiert einen einzelnen Eintrag in einer Playlist.
Felder:
idplaylist_idscreen_idorder_indexmedia_asset_idnullabletype(image,video,pdf,web,dir)srctitleduration_secondsload_timeout_secondscache_policy(required,prefer_cache,no_cache)on_error(skip,retry,fallback)retry_countvalid_fromnullablevalid_untilnullableenabledcreated_atupdated_at
Regeln:
media_asset_idwird bei verwalteten Medien gesetztsrcenthaelt den effektiven Pfad oder die URL, damit der Player auch ohne Join-Struktur arbeiten kanntype=direrlaubt definierte Verzeichnisreferenzen innerhalb der Playlist
playlist_item_dir_rule
Optionale Zusatzregel fuer type=dir.
Felder:
idplaylist_item_iddirectory_pathsort_mode(name_asc,name_desc,mtime_asc,mtime_desc,shuffle)per_item_duration_secondsrecursivefile_filternullable
Zweck:
- sauberere Modellierung fuer Verzeichnisbasierte Fallbacks oder Einschuebe
screen_status
Repraesentiert den letzten bekannten Laufzeitstatus eines Players.
Felder:
screen_idonlineserver_connectedmqtt_connectedlast_heartbeat_atlast_sync_atcurrent_playlist_idcurrent_playlist_item_idnullablecurrent_content_source(campaign,tenant_playlist,fallback)current_campaign_idnullablecurrent_item_typenullablecurrent_item_labelnullablecurrent_item_started_atnullablecurrent_item_duration_secondsnullablecache_state(ok,stale,missing,error)overlay_state(online,degraded,offline)error_codenullableerror_messagenullableplayer_versionuptime_secondsfree_disk_bytesnullabletemperature_celsiusnullableupdated_at
Hinweise:
screen_statusist eine verdichtete Sicht fuer Dashboard und Ueberwachung- historische Verlaeufe koennen spaeter separat gespeichert werden
screen_snapshot
Repraesentiert eine Vorschauaufnahme des aktuellen Bildschirminhalts.
Felder:
idscreen_idcaptured_atstorage_pathwidthheightmime_typesource(scheduled,item_change,manual)
Regeln:
- in der UI wird typischerweise nur der letzte Snapshot angezeigt
- aeltere Snapshots koennen nach Zeit oder Anzahl aufgeraeumt werden
device_command
Repraesentiert einen an einen Screen gesendeten Befehl.
Felder:
idscreen_idcommand_type(reload,restart_player,reboot,display_on,display_off,refresh_snapshot,clear_cache)payload_jsonrequested_by_user_idrequested_atdelivery_state(queued,sent,acknowledged,failed,expired)delivered_atnullableacknowledged_atnullableresult_codenullableresult_messagenullable
Zweck:
- nachvollziehbare Fernsteuerung mit Audit-Trail
sync_state
Repraesentiert den Synchronisationsstand eines Screens.
Felder:
screen_idconfig_revisionplaylist_revisionmedia_revisionlast_successful_sync_atlast_failed_sync_atnullablelast_error_messagenullable
Zweck:
- Erkennung, ob ein Player auf dem aktuellen Stand ist
Beziehungen
- ein
tenanthat vieleusers - ein
tenanthat vielescreens - ein
tenanthat vielemedia_assets - ein
screenhat genau eine aktiveplaylistin v1 - eine
playlisthat vieleplaylist_items - ein
display_templatehat vieletemplate_scenes - ein
display_templatehat vielecampaigns - eine
campaignhat vieletemplate_assignments - ein
screenhat vieleprovisioning_jobs - eine
screen_grouphat vielescreen_group_members - ein
screenhat genau einen aktuellenscreen_status - ein
screenhat vielescreen_snapshots - ein
screenhat vieledevice_commands - ein
screenhat genau einen aktuellensync_state
Zugriffsregeln
Tenant-User
Ein tenant_user darf:
- nur den eigenen
tenantsehen - nur den eigenen
screenbzw. die dem Tenant zugeordneten Screens sehen - nur eigene Medien hochladen und pflegen
- nur eigene Playlists bearbeiten
- nur die Vorschau des eigenen Screens sehen
Ein tenant_user darf nicht:
- andere Tenants sehen
- globale Steuerkommandos senden
- andere Screens administrieren
Admin
Ein admin darf:
- alle Tenants, Screens, Medien und Playlists sehen
- globale Steuerbefehle senden
- Vorschau und Status aller Screens sehen
- neue Screens und Benutzer anlegen
Revisions- und Caching-Modell
Damit Offline-Betrieb einfach bleibt, arbeitet der Player nicht gegen beliebige Einzelobjekte, sondern gegen Revisionen.
Sinnvoll sind mindestens:
playlist_revisionmedia_revisionconfig_revisioncampaign_revision
Der Player kann damit erkennen:
- ob neue Konfiguration vorliegt
- ob Medien nachgeladen werden muessen
- ob die lokale Kopie noch gueltig ist
- ob sich globale Uebersteuerungen geaendert haben
Prioritaetsmodell der Inhaltsauswahl
Der Player wertet Inhalte in dieser Reihenfolge aus:
- aktive Kampagne mit gueltigem Zeitfenster und Assignment fuer den Screen
- aktive tenantbezogene Playlist des Screens
- Fallback-Verzeichnis
Eine Kampagne ist aktiv, wenn:
active = truevalid_fromleer oder erreicht istvalid_untilleer oder noch nicht abgelaufen ist- eine
template_assignmentfuer den Screen aktiv ist
Dadurch ist die globale Uebersteuerung ein Kernbestandteil und kein nachtraeglicher Sonderfall.
Beispiel fuer aktive Playlist-Auswertung
Ein playlist_item ist aktiv, wenn:
enabled = truevalid_fromleer oder in der Vergangenheit liegtvalid_untilleer oder in der Zukunft liegt
Wenn kein aktives Item existiert:
- greift die globale Fallback-Regel des Screens oder der Playlist
Beispiel fuer Admin-Steuerung
Wenn ein Admin reload ausloest:
- Ein
device_commandwird gespeichert - der Befehl wird per MQTT an den Screen signalisiert
- der Player fuehrt den Reload aus
- der Player sendet ein ACK
device_command.delivery_statewird aktualisiert
Offene spaetere Erweiterungen
- mehrere Screens pro Tenant in der Firmenoberflaeche
- Vorlagen und globale Playlists
- Historie der Statusdaten als Zeitreihe
- Geplante Kampagnen mit Prioritaeten
- serverseitige Konvertierung oder Transkodierung von Medien