From bcc50635e53db1b6ff84a70f842f365e7ff36f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesko=20Ansch=C3=BCtz?= Date: Thu, 26 Mar 2026 23:07:31 +0100 Subject: [PATCH] feat(agent): SendDisplayState im MQTT-Publisher + Interface --- player/agent/internal/app/app.go | 1 + .../agent/internal/mqttheartbeat/heartbeat.go | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/player/agent/internal/app/app.go b/player/agent/internal/app/app.go index a952597..2c9c5ec 100644 --- a/player/agent/internal/app/app.go +++ b/player/agent/internal/app/app.go @@ -91,6 +91,7 @@ type statusSender interface { type mqttSender interface { SendHeartbeat(status, connectivity string, ts time.Time) error + SendDisplayState(screenSlug, state string) error Close() } diff --git a/player/agent/internal/mqttheartbeat/heartbeat.go b/player/agent/internal/mqttheartbeat/heartbeat.go index abb58c3..1911f90 100644 --- a/player/agent/internal/mqttheartbeat/heartbeat.go +++ b/player/agent/internal/mqttheartbeat/heartbeat.go @@ -78,6 +78,26 @@ func (p *Publisher) SendHeartbeat(status, connectivity string, ts time.Time) err return token.Error() } +// SendDisplayState publiziert den aktuellen Display-Zustand auf dem display-state-Topic. +// QoS 0, nicht retained — Informationszweck/Monitoring. +func (p *Publisher) SendDisplayState(screenSlug, state string) error { + type dsPayload struct { + DisplayState string `json:"display_state"` + Timestamp string `json:"ts"` + } + data, err := json.Marshal(dsPayload{ + DisplayState: state, + Timestamp: time.Now().UTC().Format(time.RFC3339), + }) + if err != nil { + return err + } + topic := "signage/screen/" + screenSlug + "/display-state" + token := p.client.Publish(topic, 0, false, data) + token.WaitTimeout(3 * time.Second) + return token.Error() +} + // Close disconnects from the broker gracefully. func (p *Publisher) Close() { p.client.Disconnect(250)