import { fetchWeatherApi } from "openmeteo";
const params = {
latitude: 52.52,
longitude: 13.41,
daily: ["temperature_2m_max", "temperature_2m_min", "sunrise", "sunset", "daylight_duration", "sunshine_duration"],
hourly: ["temperature_2m", "relative_humidity_2m", "apparent_temperature", "precipitation", "precipitation_probability", "rain", "showers", "snowfall", "cloud_cover", "visibility", "uv_index", "is_day", "sunshine_duration"],
wind_speed_unit: "mph",
};
const url = "https://api.open-meteo.com/v1/forecast";
const responses = await fetchWeatherApi(url, params);
// Process first location. Add a for-loop for multiple locations or weather models
const response = responses[0];
// Attributes for timezone and location
const latitude = response.latitude();
const longitude = response.longitude();
const elevation = response.elevation();
const utcOffsetSeconds = response.utcOffsetSeconds();
console.log(
`\nCoordinates: ${latitude}°N ${longitude}°E`,
`\nElevation: ${elevation}m asl`,
`\nTimezone difference to GMT+0: ${utcOffsetSeconds}s`,
);
const hourly = response.hourly()!;
const daily = response.daily()!;
// Define Int64 variables so they can be processed accordingly
const sunrise = daily.variables(2)!;
const sunset = daily.variables(3)!;
// Note: The order of weather variables in the URL query and the indices below need to match!
const weatherData = {
hourly: {
time: Array.from(
{ length: (Number(hourly.timeEnd()) - Number(hourly.time())) / hourly.interval() },
(_, i) => new Date((Number(hourly.time()) + i * hourly.interval() + utcOffsetSeconds) * 1000)
),
temperature_2m: hourly.variables(0)!.valuesArray(),
relative_humidity_2m: hourly.variables(1)!.valuesArray(),
apparent_temperature: hourly.variables(2)!.valuesArray(),
precipitation: hourly.variables(3)!.valuesArray(),
precipitation_probability: hourly.variables(4)!.valuesArray(),
rain: hourly.variables(5)!.valuesArray(),
showers: hourly.variables(6)!.valuesArray(),
snowfall: hourly.variables(7)!.valuesArray(),
cloud_cover: hourly.variables(8)!.valuesArray(),
visibility: hourly.variables(9)!.valuesArray(),
uv_index: hourly.variables(10)!.valuesArray(),
is_day: hourly.variables(11)!.valuesArray(),
sunshine_duration: hourly.variables(12)!.valuesArray(),
},
daily: {
time: Array.from(
{ length: (Number(daily.timeEnd()) - Number(daily.time())) / daily.interval() },
(_, i) => new Date((Number(daily.time()) + i * daily.interval() + utcOffsetSeconds) * 1000)
),
temperature_2m_max: daily.variables(0)!.valuesArray(),
temperature_2m_min: daily.variables(1)!.valuesArray(),
// Map Int64 values to according structure
sunrise: [...Array(sunrise.valuesInt64Length())].map(
(_, i) => new Date((Number(sunrise.valuesInt64(i)) + utcOffsetSeconds) * 1000)
),
// Map Int64 values to according structure
sunset: [...Array(sunset.valuesInt64Length())].map(
(_, i) => new Date((Number(sunset.valuesInt64(i)) + utcOffsetSeconds) * 1000)
),
daylight_duration: daily.variables(4)!.valuesArray(),
sunshine_duration: daily.variables(5)!.valuesArray(),
},
};
// The 'weatherData' object now contains a simple structure, with arrays of datetimes and weather information
console.log("\nHourly data:\n", weatherData.hourly)
console.log("\nDaily data:\n", weatherData.daily)
