Jesko Anschütz
2534dbbe05
PDF-Darstellung: Sidebar und Toolbar ausblenden via URL-Parameter
...
PDF-URLs bekommen #toolbar=0&navpanes=0&scrollbar=0&view=Fit&page=1
angehängt, damit Chromium den PDF-Viewer ohne Sidebar und Toolbar
im Vollbild rendert. PDF.js als Folgeschritt in TODO dokumentiert.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 12:18:52 +01:00
Jesko Anschütz
a334dbd95a
Fix: Relative Upload-Pfade zu absoluten Backend-URLs in Playlist
...
Agent ergänzt relative src-Pfade (/uploads/...) mit ServerBaseURL
beim Playlist-Fetch, damit Chromium Medien direkt vom Backend lädt
statt 404 auf dem lokalen Agent-Server zu bekommen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 12:08:19 +01:00
Jesko Anschütz
6931181916
Fix: Transition-Race, Auto-Reload nach Deploy, Playlist-Latenz < 1s
...
- hideAllContent() prüft opacity bevor display=none gesetzt wird
(verhindert Race mit displayItem)
- Neuer /api/startup-token Endpoint: Browser erkennt Agent-Neustart
und reloaded automatisch
- MQTT-Debounce von 3s auf 500ms, Browser-Poll von 30s auf 5s
reduziert für sub-sekunden Playlist-Updates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 11:48:57 +01:00
Jesko Anschütz
585cb83ed0
MQTT-Playlist-Push: Änderungen erreichen Client binnen 5 Sekunden
...
Backend published auf signage/screen/{slug}/playlist-changed nach
Playlist-Mutationen (2s Debounce). Agent subscribed und fetcht
Playlist sofort (3s Debounce). 60s-Polling bleibt als Fallback.
Neue Packages: mqttnotifier (Backend), mqttsubscriber (Agent)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 11:35:50 +01:00
Jesko Anschütz
d4ab1da5aa
Fix: Player-UI Content unsichtbar wegen display='' statt display='block'
...
Die Transition-Logik in displayItem() setzte element.style.display = '',
wodurch die CSS-Klassen-Regel display:none wieder griff und alle
Content-Elemente (iframe, img, video) unsichtbar blieben.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 11:20:16 +01:00
Jesko Anschütz
62c1b8cd5c
UX Block 2: Lösch-Modals, Status-Page Deutsch, Transitions, lokale Assets, Accessibility
...
- Lösch-Bestätigung: Bulma-Modal statt browser-nativer confirm()
- Status-Page komplett auf Deutsch, relative Zeitstempel ("vor 2 Min")
- Querlinks Admin ↔ Status-Page
- Bulma CSS + SortableJS als lokale go:embed Assets statt CDN
- Player-UI: sanfte Fade-Transitions (500ms) bei Content-Wechsel
- Player-UI: erweitertes Sysinfo-Overlay (Titel, Playlist-Länge, Netzwerk)
- Aria-Labels für Lösch-Buttons und Drag-Handles
- Larry-Fixes: Null-Checks in copy()/switchTab(), Umlaut-Korrektur
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 11:03:04 +01:00
Jesko Anschütz
f11bd4f6c4
Bugfixes: Player-UI Content-Rendering, Backend-URL Dev-Display, MIME-Type-Erkennung
...
- Player-UI: Content-Type-Handling (image/video/web statt alles-iframe),
Fast-Retry-Polling beim Start, Splash wird korrekt ausgeblendet,
Fallback-Anzeige bei X-Frame-Options-Blockade
- Dev-Display: Backend-URL auf 192.168.64.1 für Multipass-Netz korrigiert
- Media-Upload: Typ wird aus MIME-Type abgeleitet statt blind aus Formular
- TODO: Daten-Bug dokumentiert
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 10:50:17 +01:00
Jesko Anschütz
e03948f25d
Kopplung Agent↔Backend: Selbstregistrierung + Playlist-Rotation
...
Backend:
- ScreenStore.Upsert(): idempotentes INSERT ON CONFLICT für Self-Registration
- POST /api/v1/screens/register: Agent registriert sich beim Start (upsert)
- manage/register.go: neuer Handler, immer unter Tenant "morz"
Agent:
- config: screen_name + screen_orientation (mit Fallback auf screen_id / landscape)
- app.go: registerScreen() — POST /api/v1/screens/register beim Start (Retry 30s)
- app.go: pollPlaylist() — GET /api/v1/screens/{slug}/playlist alle 60s
- app.go: nowFn liefert Playlist statt statischer URL; PlayerContentURL als Fallback
- playerserver: PlaylistItem-Struct in NowPlaying; JS rotiert Items per duration_seconds
- JS: Playlist-Fingerprint verhindert Reset laufender Rotation bei unverändertem Stand
Ansible:
- config.json.j2: screen_name + screen_orientation ergänzt
- host_vars/info10: screen_name + screen_orientation
- host_vars/info01-dev: screen_name + screen_orientation
Kopplung per Konvention: screen_id (config.json) = slug (DB)
Beim ersten Neustart der Agents erscheinen die Bildschirme automatisch im Admin-UI.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 05:57:58 +01:00
Jesko Anschütz
bbcf0a1228
Baue Ebene 1: Player-UI, Kiosk-Display und vollstaendiges Ansible-Deployment
...
Player-UI (playerserver):
- Lokale Kiosk-Seite unter /player mit orientierungsgerechtem Splash-Bild
- Splash-PNGs (Portrait/Landscape) eingebettet via go:embed
- Unteres-Drittel-Overlay mit erweiterbaren Sysinfo-Items (Hostname, Uptime)
- /api/now-playing und /api/sysinfo JSON-Endpunkte
- iframe-Overlay fuer spaetere Inhalts-URL
Ansible-Rolle signage_display (neu):
- Pakete: xserver-xorg-core, xinit, openbox, chromium, unclutter
- Kiosk-Skript mit openbox als WM (noetig fuer korrektes --kiosk-Vollbild)
- systemd-Unit mit Conflicts=getty@tty1 (behebt TTY-Blockierung beim Start)
- Chromium Managed Policy: TranslateEnabled=false, Notifications/Geolocation blockiert
- --lang=de Flag gegen Sprachauswahl-Dialog
Ansible-Rolle signage_player (erweitert):
- Legt signage_user an falls nicht vorhanden
- PlayerListenAddr und PlayerContentURL in Konfiguration
- journald volatile Storage (SD-Karten-Schonung)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 22:34:16 +01:00
Jesko Anschütz
d461abc3f5
Reduziere SD-Karten-Schreiblast: leiser Agent + journald volatile
...
- Agent loggt im Normalfall nichts mehr (kein heartbeat_tick, kein
mqtt_heartbeat_sent, kein status_report_sent)
- nur noch Fehler und Zustandsaenderungen werden geloggt
- Ansible: journald auf Storage=volatile + RuntimeMaxUse=20M (RAM-only,
automatisches Verdraengen alter Eintraege bei vollem Puffer)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 21:13:23 +01:00
Jesko Anschütz
1dbebc0a2b
Ergaenze MQTT-Authentifizierung mit Username und Password
...
- Config: mqtt_username / mqtt_password (JSON + Env MORZ_INFOBOARD_MQTT_USERNAME/PASSWORD)
- mqttheartbeat.New() nimmt username und password entgegen,
setzt Credentials nur wenn username nicht leer ist (kein-Auth-Broker bleibt kompatibel)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 21:00:15 +01:00
Jesko Anschütz
d0137179e5
Fuege MQTT-Heartbeat zum Agent hinzu (kein Broker konfiguriert = skip)
...
- neues Paket mqttheartbeat: Publisher mit paho, topic signage/screen/<id>/heartbeat,
payload {screen_id, ts, status, server_connectivity}, auto-reconnect bei Ausfall
- MORZ_INFOBOARD_MQTT_BROKER leer (Standard) -> MQTT komplett uebersprungen
- app.emitHeartbeat() publiziert bei jedem Tick per MQTT wenn Broker konfiguriert,
loggt Fehler und laeuft weiter (kein Stop bei MQTT-Ausfall)
- mqtt.Close() bei context.Done()
- MQTTBroker-Default von tcp://127.0.0.1:1883 auf "" geaendert
- erste externe Dep: github.com/eclipse/paho.mqtt.golang v1.5.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 20:54:12 +01:00
Jesko Anschütz
1f4fa3d985
Schaerfe Semantik des Statuspfads nach
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 18:41:32 +01:00
Jesko Anschütz
8f0f06ae25
Transportiere Server-Connectivity im Statuspfad
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 18:27:44 +01:00
Jesko Anschütz
a69135c0b9
Fuehre Offline-Schwelle fuer Server-Connectivity ein
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 18:25:01 +01:00
Jesko Anschütz
9ee24fe4ae
Trenne Lifecycle und Server-Connectivity im Agenten
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 18:22:23 +01:00
Jesko Anschütz
f8a57b3e6b
Bereinige signalstarke Linter-Funde
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 17:56:56 +01:00
Jesko Anschütz
6623a313bb
Melde Agent-Status periodisch an das Backend
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 17:43:01 +01:00
Jesko Anschütz
0c7f0b5b13
Fuehre HTTP-Status-Reporter fuer den Agenten ein
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 17:42:51 +01:00
Jesko Anschütz
fa57cb4e71
Bereinige Agent-Shutdown fuer bereits gestoppte Contexts
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 17:00:17 +01:00
Jesko Anschütz
45fb9b2bf4
Dokumentiere Agent-Lifecycle fuer v1
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 16:55:29 +01:00
Jesko Anschütz
3b01594638
Fuehre Health-Modell und strukturierte Agent-Logs ein
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-22 16:55:20 +01:00
Jesko Anschütz
bf993a5945
Baue Layout-Resolver und lokale Entwicklungsgerueste aus
2026-03-22 16:03:21 +01:00
Jesko Anschütz
6a65505304
Lege Entwicklungsleitfaden und Go-Gerueste an
2026-03-22 13:42:00 +01:00