Skip to content

capturegraph.scheduling.forecast.solar #

solar_position(location, time) #

Calculate solar position for a single datetime and location.

Uses the astral library for accurate calculations.

Parameters:

Name Type Description Default
location Location

Location with latitude, longitude, and altitude.

required
time datetime

Date and time (naive assumes UTC, or timezone-aware).

required

Returns:

Type Description
SolarPosition

SolarPosition with altitude and azimuth.

Source code in capturegraph-lib/capturegraph/scheduling/forecast/solar.py
@vectorize
def solar_position(
    location: Location,
    time: datetime,
) -> SolarPosition:
    """Calculate solar position for a single datetime and location.

    Uses the astral library for accurate calculations.

    Args:
        location: Location with latitude, longitude, and altitude.
        time: Date and time (naive assumes UTC, or timezone-aware).

    Returns:
        SolarPosition with altitude and azimuth.
    """
    try:
        from astral import Observer
        from astral.sun import azimuth, elevation
    except ImportError as e:
        raise ImportError(
            "solar_position requires astral. Install with: pip install astral"
        ) from e

    observer = Observer(
        latitude=location.latitude,
        longitude=location.longitude,
        elevation=location.altitude,
    )

    # check for numpy dt and convert to datetime
    if isinstance(time, np.datetime64):
        time = time.item()

    # normalize dt to UTC
    time = time.astimezone(timezone.utc)

    alt = elevation(observer, time)
    az = azimuth(observer, time)

    return SolarPosition(altitude=alt, azimuth=az)