From 99aec683eb4c6544ea2e0b0ab266bad704fc271a Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 6 Jun 2014 03:15:06 +0200 Subject: add solar-python wrapper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/plugins/solar.py | 203 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 195 insertions(+), 8 deletions(-) diff --git a/src/plugins/solar.py b/src/plugins/solar.py index c5c742a..9e9fc39 100644 --- a/src/plugins/solar.py +++ b/src/plugins/solar.py @@ -17,23 +17,210 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' -from util import * +import solar_python -class Solar: # TODO add static functions that does not require blueshift +class Solar: + ''' + Solar information + ''' + + + SOLAR_ELEVATION_SUNSET_SUNRISE = 0.0 + ''' + :float The Sun's elevation at sunset and sunrise, + measured in degrees + ''' + + SOLAR_ELEVATION_CIVIL_DUSK_DAWN = -6.0 + ''' + :float The Sun's elevation at civil dusk and civil + dawn, measured in degrees + ''' + + SOLAR_ELEVATION_NAUTICAL_DUSK_DAWN = -12.0 + ''' + :float The Sun's elevation at nautical dusk and + nautical dawn, measured in degrees ''' - Solar information using Blueshift - @variable output:str The output of blueshift + SOLAR_ELEVATION_ASTRONOMICAL_DUSK_DAWN = -18.0 + ''' + :float The Sun's elevation at astronomical dusk + and astronomical dawn, measured in degrees + ''' + + SOLAR_ELEVATION_RANGE_TWILIGHT = (-18.0, 0.0) + ''' + :(float, float) The Sun's lowest and highest elevation during + all periods of twilight, measured in degrees ''' + SOLAR_ELEVATION_RANGE_CIVIL_TWILIGHT = (-6.0, 0.0) + ''' + :(float, float) The Sun's lowest and highest elevation + during civil twilight, measured in degrees + ''' - def __init__(self, configuration_file): + SOLAR_ELEVATION_RANGE_NAUTICAL_TWILIGHT = (-12.0, -6.0) + ''' + :(float, float) The Sun's lowest and highest elevation + during nautical twilight, measured in degrees + ''' + + SOLAR_ELEVATION_RANGE_ASTRONOMICAL_TWILIGHT = (-18.0, -12.0) + ''' + :(float, float) The Sun's lowest and highest elevation during + astronomical twilight, measured in degrees + ''' + + + EQUINOX = 0 + SUMMER = 1 + WINTER = 2 + + + def __init__(self, latitude, longitude, t = None): ''' Constructor - @param configuration_file:str Blueshift configuration file that prints the information, - you can base it on `/usr/share/doc/blueshift/examples/` + @param latitude:float The latitude in degrees northwards from + the equator, negative for southwards + @param longitude:float The longitude in degrees eastwards from + Greenwich, negative for westwards + @param t:float? The time in Julian Centuries, `None` + for the current time of when the functions + are called + ''' + self.lat = latitude + self.lon = longitude + self.t = t + self.u = solar_python.julian_centuries_to_epoch + + + def now(self): + return solar_python.julian_centuries() if self.t is None else self.t + + + def season(self): + t = self.now() + rc = Solar.SUMMER + solar_python.is_summer(self.lat, t) + rc += Solar.WINTER + solar_python.is_winter(self.lat, t) + return rc % 3 + + + def have_sunrise_and_sunset(self): + ''' + Determine whether solar declination currently is + so that there can be sunrises and sunsets. If not, + you either have 24-hour daytime or 24-hour nighttime. + + @return Whether there can be sunrises and sunsets where you are located + ''' + return solar_python.have_sunrise_and_sunset(self.lat, self.now()) + + + def declination(self): + ''' + Calculates the Sun's declination + + @return :float The Sun's declination, in degrees + ''' + return solar_python.degrees(solar_python.solar_declination(self.now())) + + + def elevation(self): + ''' + Calculates the Sun's elevation as apparent + from a geographical position + + @return :float The Sun's apparent at the specified time + as seen from the specified position, + measured in degrees + ''' + return solar_python.solar_elevation(self.lat, self.lon, self.now()) + + + def future_equinox(self): + ''' + Predict the time point of the next equinox + + @return :float The calculated time point, in POSIX time + ''' + return self.u(solar_python.future_equinox(self.now())) + + + def past_equinox(self): + ''' + Predict the time point of the previous equinox + + @return :float The calculated time point, in POSIX time + ''' + return self.u(solar_python.past_equinox(self.now())) + + + def future_solstice(self): + ''' + Predict the time point of the next solstice + + @return :float The calculated time point, in POSIX time + ''' + return self.u(solar_python.future_solstice(self.now())) + + + def past_solstice(self): + ''' + Predict the time point of the previous solstice + + @return :float The calculated time point, in POSIX time + ''' + return self.u(solar_python.past_solstice(self.now())) + + + def future_elevation(self, elevation): + ''' + Predict the time point of the next time the + Sun reaches a specific elevation + + @param elevation:float The elevation of interest + @return :float? The calculated time point, in POSIX time, + `None` if none were found within a year + ''' + return self.u(solar_python.future_elevation(self.lat, self.lon, elevation, self.now())) + + + def past_elevation(self, elevation): + ''' + Predict the time point of the previous time the Sun + reached a specific elevation + + @param elevation:float The elevation of interest + @return :float? The calculated time point, in POSIX time, + `None` if none were found within a year + ''' + return self.u(solar_python.past_elevation(self.lat, self.lon, elevation, self.now())) + + + def future_elevation_derivative(self, derivative): + ''' + Predict the time point of the next time the + Sun reaches a specific elevation derivative + + @param derivative:float The elevation derivative value of interest + @return :float? The calculated time point, in POSIX time, + `None` if none were found within a year + ''' + return self.u(solar_python.future_elevation_derivative(self.lat, self.lon, derivative, self.now())) + + + def past_elevation_derivative(self, derivative): + ''' + Predict the time point of the previous time + the Sun reached a specific elevation derivative + + @param derivative:float The elevation derivative value of interest + @return :float? The calculated time point, in POSIX time, + `None` if none were found within a year ''' - self.output = spawn_read('blueshift', '-c', configuration_file) + return self.u(solar_python.past_elevation_derivative(self.lat, self.lon, derivative, self.now())) -- cgit v1.2.3-70-g09d2