feat(scheduler): check() unterdrückt display_on bei Wochenende/Override

This commit is contained in:
Jesko Anschütz 2026-03-27 20:15:21 +01:00
parent 81711f2f3d
commit 0ca63a5367

View file

@ -31,14 +31,14 @@ type AllScreensLister interface {
} }
// Run startet den Scheduler-Loop. Blockiert bis ctx abgebrochen wird. // Run startet den Scheduler-Loop. Blockiert bis ctx abgebrochen wird.
func Run(ctx context.Context, schedules *store.ScreenScheduleStore, screens ScreenSlugGetter, notifier DisplayCommander) { func Run(ctx context.Context, schedules *store.ScreenScheduleStore, screens ScreenSlugGetter, globalOverrides *store.GlobalOverrideStore, notifier DisplayCommander) {
ticker := time.NewTicker(1 * time.Minute) ticker := time.NewTicker(1 * time.Minute)
defer ticker.Stop() defer ticker.Stop()
for { for {
select { select {
case <-ticker.C: case <-ticker.C:
check(ctx, schedules, screens, notifier) check(ctx, schedules, screens, globalOverrides, notifier)
case <-ctx.Done(): case <-ctx.Done():
return return
} }
@ -153,9 +153,19 @@ func resolveDesiredState(sc store.ScreenSchedule, globalOverride *store.GlobalOv
} }
// check prüft alle aktiven Zeitpläne und sendet ggf. Befehle. // check prüft alle aktiven Zeitpläne und sendet ggf. Befehle.
func check(ctx context.Context, schedules *store.ScreenScheduleStore, screens ScreenSlugGetter, notifier DisplayCommander) { func check(ctx context.Context, schedules *store.ScreenScheduleStore, screens ScreenSlugGetter, globalOverrides *store.GlobalOverrideStore, notifier DisplayCommander) {
// Uses process-local timezone — ensure TZ env var is set in the container (e.g. Europe/Berlin). // Uses process-local timezone — ensure TZ env var is set in the container (e.g. Europe/Berlin).
now := time.Now().Format("15:04") now := time.Now()
nowStr := now.Format("15:04")
// Wochenende: keine Einschalte-Kommandos senden
isWeekend := now.Weekday() == time.Saturday || now.Weekday() == time.Sunday
// Globaler Override "off" aktiv?
globalOverrideOff := false
if o, err := globalOverrides.Get(ctx); err == nil && o != nil && now.Before(o.Until) && o.Type == "off" {
globalOverrideOff = true
}
enabled, err := schedules.ListEnabled(ctx) enabled, err := schedules.ListEnabled(ctx)
if err != nil { if err != nil {
@ -171,9 +181,9 @@ func check(ctx context.Context, schedules *store.ScreenScheduleStore, screens Sc
} }
var action string var action string
if sc.PowerOnTime != "" && sc.PowerOnTime == now { if sc.PowerOnTime != "" && sc.PowerOnTime == nowStr {
action = "display_on" action = "display_on"
} else if sc.PowerOffTime != "" && sc.PowerOffTime == now { } else if sc.PowerOffTime != "" && sc.PowerOffTime == nowStr {
action = "display_off" action = "display_off"
} }
@ -181,6 +191,19 @@ func check(ctx context.Context, schedules *store.ScreenScheduleStore, screens Sc
continue continue
} }
// display_on unterdrücken wenn per-Screen-Override, Wochenende oder globaler Override "off"
if action == "display_on" {
if sc.OverrideOnUntil != nil && now.Before(*sc.OverrideOnUntil) {
// per-Screen Override aktiv → Kommando trotzdem senden (Override = on)
} else if isWeekend {
slog.Info("scheduler: display_on unterdrückt (Wochenende)", "screen_id", sc.ScreenID)
continue
} else if globalOverrideOff {
slog.Info("scheduler: display_on unterdrückt (globaler Override off)", "screen_id", sc.ScreenID)
continue
}
}
if err := notifier.SendDisplayCommand(screen.Slug, action); err != nil { if err := notifier.SendDisplayCommand(screen.Slug, action); err != nil {
slog.Error("scheduler: send command failed", "screen_id", sc.ScreenID, "action", action, "err", err) slog.Error("scheduler: send command failed", "screen_id", sc.ScreenID, "action", action, "err", err)
} else { } else {