100 lines
3.2 KiB
Python
100 lines
3.2 KiB
Python
import ephem
|
|
import datetime
|
|
import requests
|
|
|
|
from suntime import Sun, SunTimeException
|
|
from datetime import datetime
|
|
from dateutil import tz
|
|
from timezonefinder import TimezoneFinder
|
|
|
|
def get_sun_and_moon_phase(lat, long, date_str):
|
|
curr_date = datetime.strptime(date_str, "%Y%m%d")
|
|
date_str = f"{date_str[:4]}/{date_str[4:6]}/{date_str[6:8]}"
|
|
|
|
my_tz = get_timezone(lat, long)
|
|
sun = Sun(lat, long)
|
|
sunrise_time = sun.get_sunrise_time(curr_date, tz.gettz(my_tz)).strftime("%H:%M:%S")
|
|
sunset_time = sun.get_sunset_time(curr_date, tz.gettz(my_tz)).strftime("%H:%M:%S")
|
|
|
|
date = ephem.Date(date_str)
|
|
moon = ephem.Moon()
|
|
moon.compute(date)
|
|
|
|
return (sunrise_time, sunset_time, moon.phase)
|
|
|
|
def get_timezone(latitude: float, longitude: float):
|
|
obj = TimezoneFinder()
|
|
timezone_str = obj.timezone_at(lng=longitude, lat=latitude)
|
|
return timezone_str
|
|
|
|
def get_weather(latitude: float, longitude: float, date_str: str, hour: int) -> dict:
|
|
"""
|
|
Fetches weather data for the specified location and time.
|
|
|
|
Args:
|
|
latitude (float): Latitude of the location in degrees.
|
|
longitude (float): Longitude of the location in degrees.
|
|
date_str (str): Date in YYYYMMDD format.
|
|
hour (int): Hour (0-23) when you want to know the weather.
|
|
|
|
Returns:
|
|
dict: Dictionary containing temperature, condition, and sunrise/sunset times.
|
|
"""
|
|
# Convert date string components for API request
|
|
date = f"{date_str[:4]}-{date_str[4:6]}-{date_str[6:8]}"
|
|
|
|
stats_to_get = [
|
|
"temperature_2m",
|
|
"relative_humidity_2m",
|
|
"dew_point_2m",
|
|
"apparent_temperature",
|
|
"pressure_msl",
|
|
"surface_pressure",
|
|
"precipitation",
|
|
"rain",
|
|
"snowfall",
|
|
"cloud_cover",
|
|
"cloud_cover_low",
|
|
"cloud_cover_mid",
|
|
"cloud_cover_high",
|
|
"shortwave_radiation",
|
|
"direct_radiation",
|
|
"direct_normal_irradiance",
|
|
"diffuse_radiation",
|
|
"global_tilted_irradiance",
|
|
"sunshine_duration",
|
|
"wind_speed_10m",
|
|
"wind_speed_100m",
|
|
"wind_direction_10m",
|
|
"wind_direction_100m",
|
|
"wind_gusts_10m",
|
|
"et0_fao_evapotranspiration",
|
|
"weather_code",
|
|
"snow_depth",
|
|
"vapour_pressure_deficit",
|
|
"soil_temperature_0_to_7cm",
|
|
"soil_temperature_7_to_28cm",
|
|
"soil_temperature_28_to_100cm",
|
|
"soil_temperature_100_to_255cm",
|
|
"soil_moisture_0_to_7cm",
|
|
"soil_moisture_7_to_28cm",
|
|
"soil_moisture_28_to_100cm",
|
|
"soil_moisture_100_to_255cm",
|
|
]
|
|
|
|
stats_to_get = ','.join(stats_to_get)
|
|
timezone = get_timezone(latitude, longitude)
|
|
|
|
try:
|
|
api_url = f"https://archive-api.open-meteo.com/v1/archive?latitude={latitude}&longitude={longitude}&timezone={timezone}&start_date={date}&end_date={date}&hourly={stats_to_get}"
|
|
response = requests.get(api_url)
|
|
data = response.json()
|
|
|
|
if response.status_code != 200:
|
|
return {"error": "Failed to fetch weather", "details": data}
|
|
|
|
return data
|
|
|
|
except Exception as e:
|
|
return {"error": str(e), "details": f"No weather data available for {latitude}, {longitude} on {date_str}"}
|