def get_daylight_details(): """Get details of solar path/daylight hours at site for today (local)""" # Instantiating Astral object (for calculating position of sun and moon) a = Astral() a.solar_depression = 'civil' # Instantiating an Astral location (hard-coded here since dealing with one site only, but # easily scalable if site required login and site lat and long were tied to user profile) l = Location() l.latitude = 37.8195 l.longitude = -122.2523 l.timezone = 'US/Pacific' l.elevation = 125 sunrise = l.sunrise().strftime('%-I:%M%p') sunset = l.sunset().strftime('%-I:%M%p') day_length = str(l.sunset() - l.sunrise()) solar_noon = l.solar_noon().strftime('%-I:%M%p') solar_zenith = l.solar_elevation(l.solar_noon().replace(tzinfo=None)) solar_elevation = l.solar_elevation() daylight_data = { 'sunrise': sunrise, 'sunset': sunset, 'daylength': day_length, 'solar_noon': solar_noon, 'zenith': solar_zenith, 'elevation': solar_elevation } return jsonify(daylight_data)
def compute(self): location = Location(('name', 'reg', self.lat, self.lon, 'Europe/Moscow', self.alt)) # 15' sun bottom + 35' refraction alt = location.solar_elevation() daytime = 'day' daytime_ext = 'day' if -6 <= alt < -5. / 6: daytime = 'twilight' daytime_ext = 'civil_twilight' elif -12 <= alt < -6: daytime = 'night' daytime_ext = 'nautical_twilight' elif -18 <= alt < -12: daytime = 'night' daytime_ext = 'astro_twilight' elif alt < -18: daytime = 'night' daytime_ext = 'night' self.context.set_item_value('daytime', daytime) self.context.set_item_value('daytime_ext', daytime_ext) self.context.set_item_value('sun_alt', alt) self.context.set_item_value('sun_az', location.solar_azimuth()) sun = location.sun() self.context.set_item_value('sunrise', sun['sunrise']) self.context.set_item_value('sunset', sun['sunset']) self.context.set_item_value('noon', sun['noon']) self.context.set_item_value('moon_phase', location.moon_phase())
def compute(self): location = Location( ('name', 'reg', self.lat, self.lon, 'Europe/Moscow', self.alt)) # 15' sun bottom + 35' refraction alt = location.solar_elevation() daytime = 'day' daytime_ext = 'day' if -6 <= alt < -5. / 6: daytime = 'twilight' daytime_ext = 'civil_twilight' elif -12 <= alt < -6: daytime = 'night' daytime_ext = 'nautical_twilight' elif -18 <= alt < -12: daytime = 'night' daytime_ext = 'astro_twilight' elif alt < -18: daytime = 'night' daytime_ext = 'night' self.context.set_item_value('daytime', daytime) self.context.set_item_value('daytime_ext', daytime_ext) self.context.set_item_value('sun_alt', alt) self.context.set_item_value('sun_az', location.solar_azimuth()) sun = location.sun() self.context.set_item_value('sunrise', sun['sunrise']) self.context.set_item_value('sunset', sun['sunset']) self.context.set_item_value('noon', sun['noon']) self.context.set_item_value('moon_phase', location.moon_phase())
from astral import Location import argparse import datetime options = argparse.ArgumentParser() options.add_argument("lat", name="latitude", type=float) options.add_argument("lng", name="longitude", type=float) options.add_argument("timezone") args = options.parse_args() loc = Location(("Somewhere", None, args.lat, args.lng, args.timezone, 0)) solar_noon = loc.solar_noon() afternoon = datetime.datetime.now() > solar_noon elevation = loc.solar_elevation() if afternoon: angle = 180 - elevation else: angle = elevation print(angle)
class AstralPositions: def __init__(self, lat, lon, panel_tilt=20, session_id=None, ip_or_url='192.168.15.7', port=27017): # Date/wall time attributes if session_id == None: import uuid self.session_id = uuid.uuid1() self.a = Astral() self.timezone_string = 'US/Pacific' # Timezone from lat/lng tzfinder = timezonefinder.TimezoneFinder() self.tz = tzfinder.certain_timezone_at(lat=lat, lng=lon) self.location = Location(('Burlingame', 'Pacific West', lat, lon, self.timezone_string, 6.1)) self.sun = self.location.sun(date=dt.datetime.today().date(), local=True) print(self.sun) # MongoDB Tracking self.mongo_client = MongoClient(ip_or_url, port) self.db = self.mongo_client.astral # Tilt of theoretical panel self.tilt = math.radians(panel_tilt) def get_now_local(self): now = dt.datetime.now() localtime = pytz.timezone(self.tz) now_local = localtime.localize(now) return now_local @staticmethod def perdelta(start, end, delta): curr = start while curr <= end: yield curr curr += delta def get_azimuth(self, dt_local=None): if dt_local == None: dt_local = self.get_now_local() angle = self.location.solar_azimuth(dt_local) return angle def get_altitude(self, dt_local=None): if dt_local == None: dt_local = self.get_now_local() angle = self.location.solar_elevation(dt_local) return angle def _angular_doc(self): datetime = self.get_now_local() alt = self.get_curr_altitude(datetime) az = self.get_curr_azimuth(datetime) doc = { "altitude": alt, "azimuth": az, "datetime": datetime, "sessionid": self.session_id } solar_angles = self.db.solar_angles _id = solar_angles.insert_one(doc).inserted_id def collect_angular_data(period=2): pass def get_azimuth_angles(self, start, end, frequency=60, continuous=True): td = dt.timedelta(seconds=frequency) # datetimes = [start + i*td for i in ] # delta = end-start datetimes = list(self.perdelta(start, end, td)) angles = [self.get_azimuth(d) for d in datetimes] angles = pd.DataFrame({ 'Datetime Local': datetimes, 'Angle (deg)': angles }) # while datetime <= end: # start if not continuous: pass return angles def get_altitude_angles(self, start, end, frequency=60, continuous=True): td = dt.timedelta(seconds=frequency) # datetimes = [start + i*td for i in ] datetimes = list(self.perdelta(start, end, td)) angles = [self.get_altitude(d) for d in datetimes] angles = pd.DataFrame({ 'Datetime Local': datetimes, 'Angle (deg)': angles }) # while datetime <= end: # start if not continuous: pass return angles def get_solar_angles(self, start, end): local_start = self.tz.localize(start) local_end = self.tz.localize(end) azimuth_df = self.get_azimuth_angles(start=local_start, end=local_end) altitude_df = self.get_altitude_angles(start=local_start, end=local_end) altitude_angles = altitude_df['Angle (deg)'] azimuth_angles = azimuth_df['Angle (deg)'] zenith_angles = altitude_angles.apply(lambda x: 90 - x) datetimes = altitude_df['Datetime Local'] azimuth_angles_rad = azimuth_angles.map(math.radians) zenith_angles_rad = zenith_angles.map(math.radians) altitude_angles_rad = altitude_angles.map(math.radians) cos_correct_df = ap.get_cos_factors(azimuth_angles_rad, zenith_angles_rad) solar_angles_df = pd.DataFrame({ 'Azimuth (rad)': azimuth_angles_rad, 'Altitude (rad)': altitude_angles_rad, 'Datetime Local': datetimes }) return solar_angles_df