getPastWeather method
Fetch past weather data (last N days, actual historical data only).
Returns HourlyWeatherData with hourly data for the past days.
Uses the archive API to get actual past weather, not forecasts.
Maximum days is 10 to ensure data is available (ERA5 has ~5-7 day delay).
Implementation
Future<HourlyWeatherData> getPastWeather({
required double latitude,
required double longitude,
int days = 10,
}) async {
if (days < 1 || days > 10) {
throw ArgumentError('days must be between 1 and 10');
}
// Calculate date range for past N days (excluding today)
final now = DateTime.now();
final endDate = now.subtract(const Duration(days: 1)); // Yesterday
final startDate = endDate.subtract(Duration(days: days - 1));
final startDateStr =
'${startDate.year}-${startDate.month.toString().padLeft(2, '0')}-${startDate.day.toString().padLeft(2, '0')}';
final endDateStr =
'${endDate.year}-${endDate.month.toString().padLeft(2, '0')}-${endDate.day.toString().padLeft(2, '0')}';
final uri = Uri.parse(_archiveUrl).replace(
queryParameters: {
'latitude': latitude.toString(),
'longitude': longitude.toString(),
'start_date': startDateStr,
'end_date': endDateStr,
'hourly': [
'temperature_2m',
'relative_humidity_2m',
'wind_speed_10m',
'precipitation',
].join(','),
'timezone': 'Australia/Sydney',
},
);
try {
final response = await http.get(uri);
if (response.statusCode == 200) {
final json = jsonDecode(response.body) as Map<String, dynamic>;
return HourlyWeatherData.fromJson(json);
} else {
throw Exception(
'Failed to load past weather data: ${response.statusCode}',
);
}
} catch (e) {
throw Exception('Failed to fetch past weather: $e');
}
}