You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.4 KiB
JavaScript
121 lines
3.4 KiB
JavaScript
const FORMAT = {
|
|
hourly: {
|
|
temperature: {
|
|
type: 'number',
|
|
unit: '°C',
|
|
},
|
|
precipitation: {
|
|
type: 'number',
|
|
unit: 'mm',
|
|
},
|
|
precipitationProbability: {
|
|
type: 'number',
|
|
unit: '%',
|
|
},
|
|
apparentTemperature: {
|
|
type: 'number',
|
|
unit: '°C',
|
|
},
|
|
weatherCode: {
|
|
type: 'number',
|
|
unit: 'WMO code',
|
|
},
|
|
},
|
|
daily: {
|
|
minimumTemperature: {
|
|
type: 'number',
|
|
unit: '°C',
|
|
},
|
|
maximumTemperature: {
|
|
type: 'number',
|
|
unit: '°C',
|
|
},
|
|
minimumApparentTemperature: {
|
|
type: 'number',
|
|
unit: '°C',
|
|
},
|
|
maximumApparentTemperature: {
|
|
type: 'number',
|
|
unit: '°C',
|
|
},
|
|
precipitationSum: {
|
|
type: 'number',
|
|
unit: 'mm',
|
|
},
|
|
weatherCode: {
|
|
type: 'number',
|
|
unit: 'WMO code',
|
|
},
|
|
},
|
|
}
|
|
|
|
const getDailyData = async () => {
|
|
const response = await fetch(
|
|
'https://api.open-meteo.com/v1/forecast?latitude=43.7085&longitude=10.4036&hourly=temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,precipitation_probability,weather_code&timezone=Europe%2FBerlin&forecast_days=3',
|
|
)
|
|
const body = await response.json()
|
|
|
|
const dataAt = (body, i) => {
|
|
return {
|
|
temperature: body.hourly.temperature_2m[i],
|
|
precipitation: body.hourly.precipitation[i],
|
|
precipitationProbability: body.hourly.precipitation_probability[i],
|
|
apparentTemperature: body.hourly.apparent_temperature[i],
|
|
weatherCode: body.hourly.weather_code[i],
|
|
}
|
|
}
|
|
|
|
let today = {}
|
|
const startTime = new Date().getHours() + 1
|
|
for (let i = startTime; i <= 23; i++) {
|
|
today[i] = dataAt(body, i)
|
|
}
|
|
|
|
let tomorrow = {}
|
|
for (let i = 0; i <= 23; i++) {
|
|
tomorrow[i] = dataAt(body, 24 + i)
|
|
}
|
|
|
|
let dayAfterTomorrow = {}
|
|
for (let i = 0; i <= 23; i++) {
|
|
dayAfterTomorrow[i] = dataAt(body, 48 + i)
|
|
}
|
|
return {
|
|
today,
|
|
tomorrow,
|
|
dayAfterTomorrow,
|
|
}
|
|
}
|
|
|
|
const getWeekData = async () => {
|
|
const response = await fetch(
|
|
'https://api.open-meteo.com/v1/forecast?latitude=43.7085&longitude=10.4036&daily=weather_code,temperature_2m_max,temperature_2m_min,apparent_temperature_max,apparent_temperature_min,precipitation_sum,precipitation_probability_max&timezone=Europe%2FBerlin',
|
|
)
|
|
const body = await response.json()
|
|
|
|
let week = {}
|
|
for (let i = 0; i <= 6; i++) {
|
|
week[i] = {
|
|
minimumTemperature: body.daily.temperature_2m_min[i],
|
|
maximumTemperature: body.daily.temperature_2m_max[i],
|
|
minimumApparentTemperature: body.daily.apparent_temperature_min[i],
|
|
maximumApparentTemperature: body.daily.apparent_temperature_max[i],
|
|
precipitationSum: body.daily.precipitation_sum[i],
|
|
precipitationProbabilityMax:
|
|
body.daily.precipitation_probability_max[i],
|
|
weatherCode: body.daily.weather_code[i],
|
|
}
|
|
}
|
|
|
|
return week
|
|
}
|
|
export default async () => {
|
|
const [daily, week] = await Promise.all([getDailyData(), getWeekData()])
|
|
|
|
return {
|
|
format: FORMAT,
|
|
...daily,
|
|
week,
|
|
}
|
|
}
|