# @name Nachtmodus # @desc Display zwischen 23:00 und 06:00 Uhr dunkel # @author Ingo / Mod # @version 1.4 # @headless true # @config start_h number "Dunkel ab Stunde" default=23 min=0 max=23 unit=h # @config end_h number "Hell ab Stunde" default=6 min=0 max=23 unit=h # @config night_br slider "Helligkeit nachts" default=0 min=0 max=100 unit=% # @config day_br slider "Helligkeit tags (Fallback)" default=80 min=1 max=100 unit=% # @config notify_sec number "Vorlaufzeit Benachrichtigung" default=5 min=2 max=10 unit=s # @config notify_txt text "Benachrichtigungstext" default="..:ZZZ:.." class NightModeApp var start_h, end_h, night_br, day_br, notify_sec, notify_txt var is_dark, saved_br, saved_auto var notified def init() self.start_h = store.get("start_h") self.end_h = store.get("end_h") self.night_br = store.get("night_br") self.day_br = store.get("day_br") self.notify_sec = store.get("notify_sec") self.notify_txt = store.get("notify_txt") self.is_dark = store.get("is_dark") self.saved_br = store.get("saved_br") if self.saved_br == nil var cur_br = settings.get("brightness") self.saved_br = (cur_br != nil && cur_br > self.night_br) ? cur_br : self.day_br end self.saved_auto = store.get("saved_auto") if self.saved_auto == nil var cur_auto = settings.get("autoBrightness") self.saved_auto = cur_auto != nil ? cur_auto : false end self.notified = false end def in_night_window(h, sh, eh) if sh > eh return (h >= sh || h < eh) else return (h >= sh && h < eh) end end def loop() var h = hour() if h < 0 return end var m = minute() var s = second() # Vorlaufzeit aus Config laden (Fallback auf 5s, Grenzen 2-10s einhalten) var lead_sec = self.notify_sec != nil ? self.notify_sec : 5 if lead_sec < 2 lead_sec = 2 end if lead_sec > 10 lead_sec = 10 end # Vorlaufzeit auf maximale appDurationMs begrenzen var app_dur = settings.get("appDurationMs") if app_dur != nil && app_dur > 0 var max_sec = app_dur / 1000 if lead_sec > max_sec lead_sec = max_sec end end # Sicherheitsprüfung falls lead_sec durch kleine appDurationMs unter 1 sinkt if lead_sec < 1 lead_sec = 1 end var target_s = 60 - lead_sec var notify_h = (self.start_h - 1 + 24) % 24 if h == notify_h && m == 59 && s == target_s if !self.notified var txt = self.notify_txt != nil ? self.notify_txt : "ZZZzzz.." var notify_dur = lead_sec * 1000 notify({"text": txt, "durationMs": notify_dur}) self.notified = true end else self.notified = false end var should_be_dark = self.in_night_window(h, self.start_h, self.end_h) if should_be_dark var cur_br = settings.get("brightness") if self.is_dark != true || (cur_br != nil && cur_br != self.night_br) # Vor dem Umschalten aktuelle Tag-Helligkeit merken if cur_br != nil && cur_br > self.night_br self.saved_br = cur_br store.set("saved_br", cur_br) end var cur_auto = settings.get("autoBrightness") if cur_auto != nil && cur_auto != false self.saved_auto = cur_auto store.set("saved_auto", cur_auto) end settings.set("autoBrightness", false) settings.set("brightness", self.night_br) self.is_dark = true store.set("is_dark", true) end else if self.is_dark != false # Wiederherstellung der normalen Helligkeit am Morgen var target_br = self.saved_br != nil ? self.saved_br : self.day_br settings.set("brightness", target_br) if self.saved_auto != nil settings.set("autoBrightness", self.saved_auto) end self.is_dark = false store.set("is_dark", false) else # Tagsüber: Manuelle Änderungen des Nutzers für die nächste Nacht merken var cur_br = settings.get("brightness") if cur_br != nil && cur_br > self.night_br && cur_br != self.saved_br self.saved_br = cur_br store.set("saved_br", cur_br) end var cur_auto = settings.get("autoBrightness") if cur_auto != nil && cur_auto != self.saved_auto self.saved_auto = cur_auto store.set("saved_auto", cur_auto) end end end end end return NightModeApp()