diff --git a/script.service.hue/addon.xml b/script.service.hue/addon.xml index 116c1c01..38f9d5fa 100644 --- a/script.service.hue/addon.xml +++ b/script.service.hue/addon.xml @@ -1,4 +1,4 @@ - + diff --git a/script.service.hue/resources/language/resource.language.en_gb/strings.po b/script.service.hue/resources/language/resource.language.en_gb/strings.po index 74ab13f7..98dade42 100644 --- a/script.service.hue/resources/language/resource.language.en_gb/strings.po +++ b/script.service.hue/resources/language/resource.language.en_gb/strings.po @@ -458,6 +458,34 @@ msgctxt "#31335" msgid "Transition time (seconds):" msgstr "" + +#. Number of minutes before or after sunset to consider as sunset +msgctxt "#31336" +msgid "Sunset Offset:" +msgstr "" + +#. Help text for sunset offset setting +msgctxt "#31337" +msgid "Adjust sunset back or forwards by this many minutes" +msgstr "" + +#. Help text for "morning disable time" setting +msgctxt "#31338" +msgid "Time at which to disable the service in the morning" +msgstr "" + +#. Help text for 'Disable during daytime' +msgctxt "#31339" +msgid "Disable the service between configured time and sunset" +msgstr "" + +#. Help text for 'activate at sunset' +msgctxt "#31340" +msgid "Activate scenes at sunset, during playback" +msgstr "" + + + msgctxt "#30002" msgid "Bridge overloaded, stopping ambilight" msgstr "" @@ -482,3 +510,4 @@ msgstr "" msgctxt "#30028" msgid "Configure Hue Home location to use Sunset time, defaulting to 19:00" msgstr "" + diff --git a/script.service.hue/resources/lib/core.py b/script.service.hue/resources/lib/core.py index 2c53ef85..07654853 100644 --- a/script.service.hue/resources/lib/core.py +++ b/script.service.hue/resources/lib/core.py @@ -6,7 +6,7 @@ import sys import threading -from datetime import datetime +from datetime import datetime, timedelta, date import xbmc @@ -191,29 +191,43 @@ def _run_morning(self): def _run_sunset(self): xbmc.log(f"[SCRIPT.SERVICE.HUE] in run_sunset(): Sunset. ") cache_set("daytime", False) - self.hue_service.activate() + if self.settings_monitor.force_on_sunset: + self.hue_service.activate() + def _set_daytime(self): now = datetime.now() - xbmc.log(f"[SCRIPT.SERVICE.HUE] _set_daytime(): Morning Time: {self.morning_time}, Now: {now.time()}, bridge.sunset: {self.bridge.sunset}") - xbmc.log(f"[SCRIPT.SERVICE.HUE] _set_daytime(): Morning Time: {type(self.morning_time)}, Now: {type(now.time())}, bridge.sunset: {type(self.bridge.sunset)}") - if self.morning_time <= now.time() < self.bridge.sunset: - cache_set("daytime", True) + xbmc.log(f"[SCRIPT.SERVICE.HUE] _set_daytime(): Morning Time: {self.morning_time}, Now: {now.time()}, bridge.sunset: {self.bridge.sunset}, Sunset offset: {self.settings_monitor.sunset_offset}") + + # Convert self.bridge.sunset to a datetime object by combining it with today's date + sunset_datetime = datetime.combine(datetime.today(), self.bridge.sunset) + + # Apply the sunset offset + sunset_with_offset = sunset_datetime + timedelta(minutes=self.settings_monitor.sunset_offset) + + # Compare times + if self.morning_time <= now.time() < sunset_with_offset.time(): + daytime=True else: - cache_set("daytime", False) + daytime = False + cache_set("daytime", daytime) + xbmc.log(f"[SCRIPT.SERVICE.HUE] in _set_daytime(): Sunset with offset: {sunset_with_offset}, Daytime: {daytime} ") def _task_loop(self): - while not self.settings_monitor.abortRequested() and not self.stop_timers.is_set(): + while not self.settings_monitor.abortRequested() and not self.stop_timers.is_set(): #todo: Update timers if sunset offset changes. now = datetime.now() - self.morning_time = self.settings_monitor.morning_time + today = date.today() + # Convert self.morning_time to a datetime object #todo: Do this in settings.py, or something + morning_datetime = datetime.combine(today, self.settings_monitor.morning_time) + # Convert self.bridge.sunset to a datetime object and apply the sunset offset + sunset_datetime = datetime.combine(today, self.bridge.sunset) + timedelta(minutes=self.settings_monitor.sunset_offset) - time_to_sunset = self._time_until(now, self.bridge.sunset) - time_to_morning = self._time_until(now, self.morning_time) + time_to_sunset = self._time_until(now, sunset_datetime) + time_to_morning = self._time_until(now, morning_datetime) if time_to_sunset <= 0 or time_to_sunset > time_to_morning: - # Morning is next xbmc.log(f"[SCRIPT.SERVICE.HUE] Timers: Morning is next. wait_time: {time_to_morning}") if self.settings_monitor.waitForAbort(time_to_morning): @@ -234,3 +248,33 @@ def _time_until(current, target): now = datetime(1, 1, 1, current.hour, current.minute, current.second) then = datetime(1, 1, 1, target.hour, target.minute, target.second) return (then - now).seconds + +''' + def _task_loop(self): + + while not self.settings_monitor.abortRequested() and not self.stop_timers.is_set(): + + now = datetime.now() + self.morning_time = self.settings_monitor.morning_time + + time_to_sunset = self._time_until(now, self.bridge.sunset + timedelta(minutes=self.settings_monitor.sunset_offset)) + time_to_morning = self._time_until(now, self.morning_time) + + if time_to_sunset <= 0 or time_to_sunset > time_to_morning: + + # Morning is next + xbmc.log(f"[SCRIPT.SERVICE.HUE] Timers: Morning is next. wait_time: {time_to_morning}") + if self.settings_monitor.waitForAbort(time_to_morning): + break + self._run_morning() + + else: + # Sunset is next + xbmc.log(f"[SCRIPT.SERVICE.HUE] Timers: Sunset is next. wait_time: {time_to_sunset}") + if self.settings_monitor.waitForAbort(time_to_sunset): + break + self._run_sunset() + xbmc.log("[SCRIPT.SERVICE.HUE] Timers stopped") +''' + + diff --git a/script.service.hue/resources/lib/language.py b/script.service.hue/resources/lib/language.py index de6adc30..3c02761a 100644 --- a/script.service.hue/resources/lib/language.py +++ b/script.service.hue/resources/lib/language.py @@ -133,6 +133,11 @@ def get_string(t): _strings['reconnected'] = 30033 _strings['morning disable time:'] = 31334 _strings['transition time (seconds):'] = 31335 +_strings['sunset offset:'] = 31336 +_strings['adjust sunset back or forwards by this many minutes'] = 31337 +_strings['time at which to disable the service in the morning'] = 31338 +_strings['disable the service between configured time and sunset'] = 31339 +_strings['activate scenes at sunset, during playback'] = 31340 _strings['bridge overloaded, stopping ambilight'] = 30002 _strings['bridge unauthorized, please reconfigure.'] = 30025 _strings['connection failed, retrying...'] = 30026 diff --git a/script.service.hue/resources/lib/settings.py b/script.service.hue/resources/lib/settings.py index cc2e30f8..b21b6c6c 100644 --- a/script.service.hue/resources/lib/settings.py +++ b/script.service.hue/resources/lib/settings.py @@ -43,9 +43,11 @@ def reload_settings(self): # scheduling settings self.daylight_disable = ADDON.getSettingBool("daylightDisable") - self.schedule_enabled = ADDON.getSettingBool("enableSchedule") - + self.force_on_sunset = ADDON.getSettingBool("forceOnSunset") self.morning_time = convert_time(ADDON.getSettingString("morningTime")) + self.sunset_offset = ADDON.getSettingNumber("sunsetOffset") + + self.schedule_enabled = ADDON.getSettingBool("enableSchedule") self.schedule_start = convert_time(ADDON.getSettingString("startTime")) self.schedule_end = convert_time(ADDON.getSettingString("endTime")) diff --git a/script.service.hue/resources/settings.xml b/script.service.hue/resources/settings.xml index 92647b35..be66cd96 100644 --- a/script.service.hue/resources/settings.xml +++ b/script.service.hue/resources/settings.xml @@ -584,35 +584,52 @@ - + 1 True - + 1 False - + 2 08:00 31334 + + + true + + - - 1 - False - - - + + + 1 - False - + -30 + + -120 + 1 + 120 + + + false + + + + true + + + + + 1 @@ -644,6 +661,20 @@ + + + + 1 + False + + + + 1 + False + + + +