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)