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())
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