Make weather update interval configurable, was hardcoded to 30 min
Screen.poll_interval was a fixed class attribute the scheduler read directly -- added Screen.get_poll_interval(settings) so a screen can make it settings-driven instead. WeatherScreen overrides it to read a new "update_minutes" field (default 30, matching the old hardcoded value). New number input on the Weather settings page. Caught a real edge case while testing: `raw or 30` treats an explicit 0 as falsy and silently replaces it with 30 instead of clamping to the 1-minute floor. Not reachable via the UI (min="1" on the input) but the method should still be correct standalone -- fixed with an explicit None-check instead.
This commit is contained in:
1 parent
15c7c38d86
commit
889c062212
5 files changed
+29
-3
No files matched your search
@@ -26,3 +26,9 @@ class Screen(ABC):
|
||||
"""Settings this screen needs, with defaults, merged under config.json's
|
||||
settings[self.id] on first run."""
|
||||
return {}
|
||||
|
||||
def get_poll_interval(self, settings: dict) -> int:
|
||||
"""Seconds between check() calls. Override to make it configurable
|
||||
via settings (e.g. a user-facing "update every N minutes" field);
|
||||
defaults to the fixed class-level poll_interval."""
|
||||
return self.poll_interval
|
||||
+13
-2
@@ -22,10 +22,21 @@ WEEKDAY_ABBR_DE = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
|
||||
class WeatherScreen(Screen):
|
||||
id = "weather"
|
||||
display_name = "Weather"
|
||||
poll_interval = 1800 # 30 minutes -- weather doesn't need to be fresher
|
||||
poll_interval = 1800 # fallback default (30 min) if settings has no update_minutes yet
|
||||
|
||||
def default_settings(self) -> dict:
|
||||
return {"city": "", "latitude": None, "longitude": None, "forecast_days": 3}
|
||||
return {"city": "", "latitude": None, "longitude": None, "forecast_days": 3, "update_minutes": 30}
|
||||
|
||||
def get_poll_interval(self, settings: dict) -> int:
|
||||
raw = settings.get("update_minutes")
|
||||
try:
|
||||
# `raw or 30` would also catch a legitimate 0 (falsy) and silently
|
||||
# replace it with 30 instead of clamping to the 1-minute floor
|
||||
# below -- only fall back to the default when it's genuinely unset.
|
||||
minutes = int(raw) if raw is not None else 30
|
||||
except (TypeError, ValueError):
|
||||
minutes = 30
|
||||
return max(1, minutes) * 60
|
||||
|
||||
def geocode(self, city: str):
|
||||
"""Resolve a city name to coordinates via Open-Meteo's free geocoding
|
||||
|
||||
Reference in new issue
Block a user