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)
Example #2
0
    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())
Example #3
0
    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())
Example #4
0
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)
Example #5
0
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