9243e40b54
Before sunrise, first sunrise is shown and then sunset. After sunrise, before sunset, first sunet is shown, and then tomorrow's sunrise. After sunset, first sunrise is shown and then sunset, both for tomorrow.
111 lines
3.2 KiB
Python
111 lines
3.2 KiB
Python
# pylint: disable=C0111,R0903
|
|
|
|
"""Displays sunrise and sunset times
|
|
|
|
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:
|
|
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
|