diff --git a/modules/contrib/sun.py b/modules/contrib/sun.py new file mode 100644 index 0000000..a356b35 --- /dev/null +++ b/modules/contrib/sun.py @@ -0,0 +1,117 @@ +# pylint: disable=C0111,R0903 + +"""Displays sunrise and sunset times + +Requires the following python packages: + * requests + * suntime + +Parameters: + * cpu.lat : Latitude of your location + * cpu.lon : Longitude of your location +""" + +try: + from suntime import Sun, SunTimeException +except ImportError: + pass +try: + import requests +except ImportError: + pass +try: + from dateutil.tz import tzlocal +except ImportError: + pass + +import datetime + +import bumblebee.input +import bumblebee.output +import bumblebee.engine + + +class Module(bumblebee.engine.Module): + def __init__(self, engine, config): + super(Module, self).__init__( + engine, config, + bumblebee.output.Widget(full_text=self.suntimes) + ) + self.interval(3600) + self._lat = self.parameter("lat", None) + self._lon = self.parameter("lon", None) + try: + if not self._lat or not self._lon: + location_url = "http://ipinfo.io/json" + location = requests.get(location_url).json() + self._lat, self._lon = location["loc"].split(",") + self._lat = float(self._lat) + self._lon = float(self._lon) + except Exception: + pass + self.update(None) + + def suntimes(self, _): + if self._sunset and self._sunrise: + if self._isup: + return u"\u21A7{} \u21A5{}".format( + self._sunset.strftime('%H:%M'), + self._sunrise.strftime('%H:%M')) + return u"\u21A5{} \u21A7{}".format(self._sunrise.strftime('%H:%M'), + self._sunset.strftime('%H:%M')) + return "?" + + def _calculate_times(self): + self._isup = False + try: + if not self._lat or not self._lon: + raise() + sun = Sun(self._lat, self._lon) + except Exception: + self._sunrise = None + self._sunset = None + return + + order_matters = True + + try: + self._sunrise = sun.get_local_sunrise_time() + except SunTimeException: + self._sunrise = "no sunrise" + order_matters = False + + try: + self._sunset = sun.get_local_sunset_time() + except SunTimeException: + self._sunset = "no sunset" + order_matters = False + + if not order_matters: + return + + now = datetime.datetime.now(tz=tzlocal()) + if now > self._sunset: + tomorrow = (now + datetime.timedelta(days=1)).date() + try: + self._sunrise = sun.get_local_sunrise_time(tomorrow) + self._sunset = sun.get_local_sunset_time(tomorrow) + except SunTimeException: + self._sunrise = "no sunrise" + self._sunset = "no sunset" + + elif now > self._sunrise: + tomorrow = (now + datetime.timedelta(days=1)).date() + try: + self._sunrise = sun.get_local_sunrise_time(tomorrow) + except SunTimeException: + self._sunrise = "no sunrise" + return + self._isup = True + + def update(self, widgets): + if not self._lat or not self._lon: + self._sunrise = None + self._sunset = None + self._calculate_times() + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4