80 lines
3.3 KiB
Python
80 lines
3.3 KiB
Python
import openmeteo_requests
|
|
|
|
import pandas as pd
|
|
import requests_cache
|
|
from retry_requests import retry
|
|
import geocoder
|
|
|
|
|
|
class HappyMeteo:
|
|
def __init__(self):
|
|
# Setup the Open-Meteo API client with cache and retry on error
|
|
cache_session = requests_cache.CachedSession('.cache', expire_after = 3600)
|
|
retry_session = retry(cache_session, retries = 5, backoff_factor = 0.2)
|
|
self.openmeteo = openmeteo_requests.Client(session = retry_session)
|
|
|
|
def get_current_location(self):
|
|
"""Get current location using IP geolocation"""
|
|
try:
|
|
g = geocoder.ip('me')
|
|
if g.ok:
|
|
latitude = g.latlng[0]
|
|
longitude = g.latlng[1]
|
|
print(f"Latitude: {latitude}")
|
|
print(f"Longitude: {longitude}")
|
|
print(f"Address: {g.address}")
|
|
return latitude, longitude
|
|
else:
|
|
print("Could not determine location")
|
|
return None, None
|
|
except Exception as e:
|
|
print(f"Error getting location: {e}")
|
|
return None, None
|
|
|
|
def openMeteoCall(self, timeLapse):
|
|
lat, lon = self.get_current_location()
|
|
|
|
# Make sure all required weather variables are listed here
|
|
# The order of variables in hourly or daily is important to assign them correctly below
|
|
url = "https://api.open-meteo.com/v1/forecast"
|
|
params = {
|
|
"latitude": lat,
|
|
"longitude": lon,
|
|
"daily": ["weather_code", "temperature_2m_mean", "rain_sum", "showers_sum", "precipitation_sum", "daylight_duration", "relative_humidity_2m_mean"],
|
|
"timezone": "auto",
|
|
"forecast_days": timeLapse
|
|
}
|
|
responses = self.openmeteo.weather_api(url, params=params)
|
|
|
|
# Process first location. Add a for-loop for multiple locations or weather models
|
|
response = responses[0]
|
|
|
|
# Process daily data. The order of variables needs to be the same as requested.
|
|
daily = response.Daily()
|
|
daily_weather_code = daily.Variables(0).ValuesAsNumpy()
|
|
daily_temperature_2m_mean = daily.Variables(1).ValuesAsNumpy()
|
|
daily_rain_sum = daily.Variables(2).ValuesAsNumpy()
|
|
daily_showers_sum = daily.Variables(3).ValuesAsNumpy()
|
|
daily_precipitation_sum = daily.Variables(4).ValuesAsNumpy()
|
|
daily_daylight_duration = daily.Variables(5).ValuesAsNumpy()
|
|
daily_relative_humidity_2m_mean = daily.Variables(6).ValuesAsNumpy()
|
|
|
|
# Return comprehensive data structure
|
|
return {
|
|
"daily_data": {
|
|
"weather_code": daily_weather_code.tolist(),
|
|
"temperature_2m_mean": daily_temperature_2m_mean.tolist(),
|
|
"rain_sum": daily_rain_sum.tolist(),
|
|
"showers_sum": daily_showers_sum.tolist(),
|
|
"precipitation_sum": daily_precipitation_sum.tolist(),
|
|
"daylight_duration": daily_daylight_duration.tolist(),
|
|
"relative_humidity_2m_mean": daily_relative_humidity_2m_mean.tolist()
|
|
},
|
|
"summary": {
|
|
"avg_temperature": float(daily_temperature_2m_mean.mean()),
|
|
"total_precipitation": float(daily_precipitation_sum.sum()),
|
|
"avg_humidity": float(daily_relative_humidity_2m_mean.mean()),
|
|
"total_daylight_hours": float(daily_daylight_duration.sum() / 3600) # Convert seconds to hours
|
|
}
|
|
}
|
|
|