From 320f73b3aa327f400f8af399c0f925e2039d99b0 Mon Sep 17 00:00:00 2001 From: Miles Kane Date: Sun, 1 Mar 2026 21:29:28 -0600 Subject: [PATCH] feat: Enhance astronomical data fetching and display with hourly forecast - Added functionality to fetch hourly weather forecasts from the weather.gov API. - Updated the AstroFetcher class to include hourly forecast data in the display. - Modified the display_astronomical_data function to render both astronomical data and hourly forecasts. - Introduced new Pydantic models for parsing hourly forecast GeoJSON responses. - Refactored service layer to include new fetching methods for hourly forecasts. - Updated UI components to support the new dashboard layout combining astronomical and forecast data. - Adjusted metrics naming for clarity and consistency. - Added tests for the new forecast model to ensure proper parsing and validation. --- data/weather/forecast_hourly_sample.json | 4250 +++++++++++++++++ src/sample_python_app/app/runner.py | 9 +- src/sample_python_app/app/scheduler.py | 3 +- src/sample_python_app/core/metrics.py | 6 +- src/sample_python_app/models/__init__.py | 3 +- .../models/forecast_geojson.py | 59 + src/sample_python_app/services/__init__.py | 12 +- src/sample_python_app/services/data_loader.py | 85 +- src/sample_python_app/ui/__init__.py | 4 +- src/sample_python_app/ui/display.py | 13 +- src/sample_python_app/ui/header_panel.py | 41 + src/sample_python_app/ui/synthwave.py | 160 +- tests/test_forecast_model.py | 23 + 13 files changed, 4648 insertions(+), 20 deletions(-) create mode 100644 data/weather/forecast_hourly_sample.json create mode 100644 src/sample_python_app/models/forecast_geojson.py create mode 100644 src/sample_python_app/ui/header_panel.py create mode 100644 tests/test_forecast_model.py diff --git a/data/weather/forecast_hourly_sample.json b/data/weather/forecast_hourly_sample.json new file mode 100644 index 0000000..8722ec0 --- /dev/null +++ b/data/weather/forecast_hourly_sample.json @@ -0,0 +1,4250 @@ +{ + "@context": [ + "https://geojson.org/geojson-ld/geojson-context.jsonld", + { + "@version": "1.1", + "wx": "https://api.weather.gov/ontology#", + "geo": "http://www.opengis.net/ont/geosparql#", + "unit": "http://codes.wmo.int/common/unit/", + "@vocab": "https://api.weather.gov/ontology#" + } + ], + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-95.4593, 29.8272], + [-95.4594, 29.85], + [-95.4857, 29.8499], + [-95.4856, 29.8271], + [-95.4593, 29.8272] + ] + ] + }, + "properties": { + "units": "us", + "forecastGenerator": "HourlyForecastGenerator", + "generatedAt": "2026-02-28T02:08:19+00:00", + "updateTime": "2026-02-28T00:20:49+00:00", + "validTimes": "2026-02-27T18:00:00+00:00/P7DT19H", + "elevation": { + "unitCode": "wmoUnit:m", + "value": 24.0792 + }, + "periods": [ + { + "number": 1, + "name": "", + "startTime": "2026-02-27T20:00:00-06:00", + "endTime": "2026-02-27T21:00:00-06:00", + "isDaytime": false, + "temperature": 72, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 9.444444444444445 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 44 + }, + "windSpeed": "5 mph", + "windDirection": "NE", + "icon": "https://api.weather.gov/icons/land/night/skc?size=small", + "shortForecast": "Clear", + "detailedForecast": "" + }, + { + "number": 2, + "name": "", + "startTime": "2026-02-27T21:00:00-06:00", + "endTime": "2026-02-27T22:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 10.555555555555555 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 51 + }, + "windSpeed": "5 mph", + "windDirection": "NE", + "icon": "https://api.weather.gov/icons/land/night/skc?size=small", + "shortForecast": "Clear", + "detailedForecast": "" + }, + { + "number": 3, + "name": "", + "startTime": "2026-02-27T22:00:00-06:00", + "endTime": "2026-02-27T23:00:00-06:00", + "isDaytime": false, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 11.666666666666666 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 59 + }, + "windSpeed": "5 mph", + "windDirection": "E", + "icon": "https://api.weather.gov/icons/land/night/skc?size=small", + "shortForecast": "Clear", + "detailedForecast": "" + }, + { + "number": 4, + "name": "", + "startTime": "2026-02-27T23:00:00-06:00", + "endTime": "2026-02-28T00:00:00-06:00", + "isDaytime": false, + "temperature": 66, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 68 + }, + "windSpeed": "5 mph", + "windDirection": "E", + "icon": "https://api.weather.gov/icons/land/night/skc?size=small", + "shortForecast": "Clear", + "detailedForecast": "" + }, + { + "number": 5, + "name": "", + "startTime": "2026-02-28T00:00:00-06:00", + "endTime": "2026-02-28T01:00:00-06:00", + "isDaytime": false, + "temperature": 64, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.333333333333334 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 75 + }, + "windSpeed": "0 mph", + "windDirection": "", + "icon": "https://api.weather.gov/icons/land/night/few?size=small", + "shortForecast": "Mostly Clear", + "detailedForecast": "" + }, + { + "number": 6, + "name": "", + "startTime": "2026-02-28T01:00:00-06:00", + "endTime": "2026-02-28T02:00:00-06:00", + "isDaytime": false, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.333333333333334 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 78 + }, + "windSpeed": "0 mph", + "windDirection": "", + "icon": "https://api.weather.gov/icons/land/night/few?size=small", + "shortForecast": "Mostly Clear", + "detailedForecast": "" + }, + { + "number": 7, + "name": "", + "startTime": "2026-02-28T02:00:00-06:00", + "endTime": "2026-02-28T03:00:00-06:00", + "isDaytime": false, + "temperature": 62, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.333333333333334 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 81 + }, + "windSpeed": "0 mph", + "windDirection": "", + "icon": "https://api.weather.gov/icons/land/night/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 8, + "name": "", + "startTime": "2026-02-28T03:00:00-06:00", + "endTime": "2026-02-28T04:00:00-06:00", + "isDaytime": false, + "temperature": 61, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 81 + }, + "windSpeed": "0 mph", + "windDirection": "", + "icon": "https://api.weather.gov/icons/land/night/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 9, + "name": "", + "startTime": "2026-02-28T04:00:00-06:00", + "endTime": "2026-02-28T05:00:00-06:00", + "isDaytime": false, + "temperature": 60, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 85 + }, + "windSpeed": "0 mph", + "windDirection": "", + "icon": "https://api.weather.gov/icons/land/night/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 10, + "name": "", + "startTime": "2026-02-28T05:00:00-06:00", + "endTime": "2026-02-28T06:00:00-06:00", + "isDaytime": false, + "temperature": 60, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 85 + }, + "windSpeed": "0 mph", + "windDirection": "", + "icon": "https://api.weather.gov/icons/land/night/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 11, + "name": "", + "startTime": "2026-02-28T06:00:00-06:00", + "endTime": "2026-02-28T07:00:00-06:00", + "isDaytime": true, + "temperature": 59, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 87 + }, + "windSpeed": "0 mph", + "windDirection": "", + "icon": "https://api.weather.gov/icons/land/day/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 12, + "name": "", + "startTime": "2026-02-28T07:00:00-06:00", + "endTime": "2026-02-28T08:00:00-06:00", + "isDaytime": true, + "temperature": 58, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.222222222222221 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 85 + }, + "windSpeed": "0 mph", + "windDirection": "", + "icon": "https://api.weather.gov/icons/land/day/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 13, + "name": "", + "startTime": "2026-02-28T08:00:00-06:00", + "endTime": "2026-02-28T09:00:00-06:00", + "isDaytime": true, + "temperature": 60, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 83 + }, + "windSpeed": "5 mph", + "windDirection": "E", + "icon": "https://api.weather.gov/icons/land/day/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 14, + "name": "", + "startTime": "2026-02-28T09:00:00-06:00", + "endTime": "2026-02-28T10:00:00-06:00", + "isDaytime": true, + "temperature": 65, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 70 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 15, + "name": "", + "startTime": "2026-02-28T10:00:00-06:00", + "endTime": "2026-02-28T11:00:00-06:00", + "isDaytime": true, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.333333333333334 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 61 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 16, + "name": "", + "startTime": "2026-02-28T11:00:00-06:00", + "endTime": "2026-02-28T12:00:00-06:00", + "isDaytime": true, + "temperature": 74, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.333333333333334 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 53 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 17, + "name": "", + "startTime": "2026-02-28T12:00:00-06:00", + "endTime": "2026-02-28T13:00:00-06:00", + "isDaytime": true, + "temperature": 78, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 45 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/skc?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 18, + "name": "", + "startTime": "2026-02-28T13:00:00-06:00", + "endTime": "2026-02-28T14:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 41 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/skc?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 19, + "name": "", + "startTime": "2026-02-28T14:00:00-06:00", + "endTime": "2026-02-28T15:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 1 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.222222222222221 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 39 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/skc?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 20, + "name": "", + "startTime": "2026-02-28T15:00:00-06:00", + "endTime": "2026-02-28T16:00:00-06:00", + "isDaytime": true, + "temperature": 83, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.222222222222221 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 37 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 21, + "name": "", + "startTime": "2026-02-28T16:00:00-06:00", + "endTime": "2026-02-28T17:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 41 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/skc?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 22, + "name": "", + "startTime": "2026-02-28T17:00:00-06:00", + "endTime": "2026-02-28T18:00:00-06:00", + "isDaytime": true, + "temperature": 80, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 42 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/skc?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 23, + "name": "", + "startTime": "2026-02-28T18:00:00-06:00", + "endTime": "2026-02-28T19:00:00-06:00", + "isDaytime": false, + "temperature": 77, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 12.777777777777779 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 47 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/skc?size=small", + "shortForecast": "Clear", + "detailedForecast": "" + }, + { + "number": 24, + "name": "", + "startTime": "2026-02-28T19:00:00-06:00", + "endTime": "2026-02-28T20:00:00-06:00", + "isDaytime": false, + "temperature": 72, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 59 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/few?size=small", + "shortForecast": "Mostly Clear", + "detailedForecast": "" + }, + { + "number": 25, + "name": "", + "startTime": "2026-02-28T20:00:00-06:00", + "endTime": "2026-02-28T21:00:00-06:00", + "isDaytime": false, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 14.444444444444445 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 68 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 26, + "name": "", + "startTime": "2026-02-28T21:00:00-06:00", + "endTime": "2026-02-28T22:00:00-06:00", + "isDaytime": false, + "temperature": 67, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 75 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 27, + "name": "", + "startTime": "2026-02-28T22:00:00-06:00", + "endTime": "2026-02-28T23:00:00-06:00", + "isDaytime": false, + "temperature": 65, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15.555555555555555 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 84 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 28, + "name": "", + "startTime": "2026-02-28T23:00:00-06:00", + "endTime": "2026-03-01T00:00:00-06:00", + "isDaytime": false, + "temperature": 64, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15.555555555555555 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 87 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 29, + "name": "", + "startTime": "2026-03-01T00:00:00-06:00", + "endTime": "2026-03-01T01:00:00-06:00", + "isDaytime": false, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15.555555555555555 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 90 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 30, + "name": "", + "startTime": "2026-03-01T01:00:00-06:00", + "endTime": "2026-03-01T02:00:00-06:00", + "isDaytime": false, + "temperature": 62, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 90 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 31, + "name": "", + "startTime": "2026-03-01T02:00:00-06:00", + "endTime": "2026-03-01T03:00:00-06:00", + "isDaytime": false, + "temperature": 62, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 90 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 32, + "name": "", + "startTime": "2026-03-01T03:00:00-06:00", + "endTime": "2026-03-01T04:00:00-06:00", + "isDaytime": false, + "temperature": 62, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 90 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 33, + "name": "", + "startTime": "2026-03-01T04:00:00-06:00", + "endTime": "2026-03-01T05:00:00-06:00", + "isDaytime": false, + "temperature": 61, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 93 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 34, + "name": "", + "startTime": "2026-03-01T05:00:00-06:00", + "endTime": "2026-03-01T06:00:00-06:00", + "isDaytime": false, + "temperature": 60, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 14.444444444444445 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 93 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 35, + "name": "", + "startTime": "2026-03-01T06:00:00-06:00", + "endTime": "2026-03-01T07:00:00-06:00", + "isDaytime": true, + "temperature": 60, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15.555555555555555 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 36, + "name": "", + "startTime": "2026-03-01T07:00:00-06:00", + "endTime": "2026-03-01T08:00:00-06:00", + "isDaytime": true, + "temperature": 61, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 37, + "name": "", + "startTime": "2026-03-01T08:00:00-06:00", + "endTime": "2026-03-01T09:00:00-06:00", + "isDaytime": true, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 95 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/fog?size=small", + "shortForecast": "Patchy Fog", + "detailedForecast": "" + }, + { + "number": 38, + "name": "", + "startTime": "2026-03-01T09:00:00-06:00", + "endTime": "2026-03-01T10:00:00-06:00", + "isDaytime": true, + "temperature": 66, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15.555555555555555 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 81 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 39, + "name": "", + "startTime": "2026-03-01T10:00:00-06:00", + "endTime": "2026-03-01T11:00:00-06:00", + "isDaytime": true, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15.555555555555555 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 72 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 40, + "name": "", + "startTime": "2026-03-01T11:00:00-06:00", + "endTime": "2026-03-01T12:00:00-06:00", + "isDaytime": true, + "temperature": 73, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 61 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 41, + "name": "", + "startTime": "2026-03-01T12:00:00-06:00", + "endTime": "2026-03-01T13:00:00-06:00", + "isDaytime": true, + "temperature": 77, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 14.444444444444445 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 52 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 42, + "name": "", + "startTime": "2026-03-01T13:00:00-06:00", + "endTime": "2026-03-01T14:00:00-06:00", + "isDaytime": true, + "temperature": 79, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 47 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 43, + "name": "", + "startTime": "2026-03-01T14:00:00-06:00", + "endTime": "2026-03-01T15:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.333333333333334 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 43 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 44, + "name": "", + "startTime": "2026-03-01T15:00:00-06:00", + "endTime": "2026-03-01T16:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.333333333333334 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 43 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/skc?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 45, + "name": "", + "startTime": "2026-03-01T16:00:00-06:00", + "endTime": "2026-03-01T17:00:00-06:00", + "isDaytime": true, + "temperature": 80, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.333333333333334 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 44 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 46, + "name": "", + "startTime": "2026-03-01T17:00:00-06:00", + "endTime": "2026-03-01T18:00:00-06:00", + "isDaytime": true, + "temperature": 77, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 13.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 50 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/few?size=small", + "shortForecast": "Sunny", + "detailedForecast": "" + }, + { + "number": 47, + "name": "", + "startTime": "2026-03-01T18:00:00-06:00", + "endTime": "2026-03-01T19:00:00-06:00", + "isDaytime": false, + "temperature": 75, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 15 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 58 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/few?size=small", + "shortForecast": "Mostly Clear", + "detailedForecast": "" + }, + { + "number": 48, + "name": "", + "startTime": "2026-03-01T19:00:00-06:00", + "endTime": "2026-03-01T20:00:00-06:00", + "isDaytime": false, + "temperature": 72, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 69 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/few?size=small", + "shortForecast": "Mostly Clear", + "detailedForecast": "" + }, + { + "number": 49, + "name": "", + "startTime": "2026-03-01T20:00:00-06:00", + "endTime": "2026-03-01T21:00:00-06:00", + "isDaytime": false, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 77 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/few?size=small", + "shortForecast": "Mostly Clear", + "detailedForecast": "" + }, + { + "number": 50, + "name": "", + "startTime": "2026-03-01T21:00:00-06:00", + "endTime": "2026-03-01T22:00:00-06:00", + "isDaytime": false, + "temperature": 66, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 87 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/few?size=small", + "shortForecast": "Mostly Clear", + "detailedForecast": "" + }, + { + "number": 51, + "name": "", + "startTime": "2026-03-01T22:00:00-06:00", + "endTime": "2026-03-01T23:00:00-06:00", + "isDaytime": false, + "temperature": 65, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 17.22222222222222 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 94 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/few?size=small", + "shortForecast": "Mostly Clear", + "detailedForecast": "" + }, + { + "number": 52, + "name": "", + "startTime": "2026-03-01T23:00:00-06:00", + "endTime": "2026-03-02T00:00:00-06:00", + "isDaytime": false, + "temperature": 64, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 17.22222222222222 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 96 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 53, + "name": "", + "startTime": "2026-03-02T00:00:00-06:00", + "endTime": "2026-03-02T01:00:00-06:00", + "isDaytime": false, + "temperature": 64, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 17.22222222222222 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 97 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 54, + "name": "", + "startTime": "2026-03-02T01:00:00-06:00", + "endTime": "2026-03-02T02:00:00-06:00", + "isDaytime": false, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 17.22222222222222 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 98 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 55, + "name": "", + "startTime": "2026-03-02T02:00:00-06:00", + "endTime": "2026-03-02T03:00:00-06:00", + "isDaytime": false, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 96 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 56, + "name": "", + "startTime": "2026-03-02T03:00:00-06:00", + "endTime": "2026-03-02T04:00:00-06:00", + "isDaytime": false, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 97 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 57, + "name": "", + "startTime": "2026-03-02T04:00:00-06:00", + "endTime": "2026-03-02T05:00:00-06:00", + "isDaytime": false, + "temperature": 62, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 58, + "name": "", + "startTime": "2026-03-02T05:00:00-06:00", + "endTime": "2026-03-02T06:00:00-06:00", + "isDaytime": false, + "temperature": 62, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 59, + "name": "", + "startTime": "2026-03-02T06:00:00-06:00", + "endTime": "2026-03-02T07:00:00-06:00", + "isDaytime": true, + "temperature": 62, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/bkn?size=small", + "shortForecast": "Partly Sunny", + "detailedForecast": "" + }, + { + "number": 60, + "name": "", + "startTime": "2026-03-02T07:00:00-06:00", + "endTime": "2026-03-02T08:00:00-06:00", + "isDaytime": true, + "temperature": 63, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 17.22222222222222 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/bkn?size=small", + "shortForecast": "Partly Sunny", + "detailedForecast": "" + }, + { + "number": 61, + "name": "", + "startTime": "2026-03-02T08:00:00-06:00", + "endTime": "2026-03-02T09:00:00-06:00", + "isDaytime": true, + "temperature": 65, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 17.77777777777778 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 98 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 62, + "name": "", + "startTime": "2026-03-02T09:00:00-06:00", + "endTime": "2026-03-02T10:00:00-06:00", + "isDaytime": true, + "temperature": 67, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 17.22222222222222 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 87 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 63, + "name": "", + "startTime": "2026-03-02T10:00:00-06:00", + "endTime": "2026-03-02T11:00:00-06:00", + "isDaytime": true, + "temperature": 71, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 74 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 64, + "name": "", + "startTime": "2026-03-02T11:00:00-06:00", + "endTime": "2026-03-02T12:00:00-06:00", + "isDaytime": true, + "temperature": 74, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 65 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 65, + "name": "", + "startTime": "2026-03-02T12:00:00-06:00", + "endTime": "2026-03-02T13:00:00-06:00", + "isDaytime": true, + "temperature": 78, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 58 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/bkn?size=small", + "shortForecast": "Partly Sunny", + "detailedForecast": "" + }, + { + "number": 66, + "name": "", + "startTime": "2026-03-02T13:00:00-06:00", + "endTime": "2026-03-02T14:00:00-06:00", + "isDaytime": true, + "temperature": 80, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 54 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 67, + "name": "", + "startTime": "2026-03-02T14:00:00-06:00", + "endTime": "2026-03-02T15:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 52 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 68, + "name": "", + "startTime": "2026-03-02T15:00:00-06:00", + "endTime": "2026-03-02T16:00:00-06:00", + "isDaytime": true, + "temperature": 82, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 51 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 69, + "name": "", + "startTime": "2026-03-02T16:00:00-06:00", + "endTime": "2026-03-02T17:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 53 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 70, + "name": "", + "startTime": "2026-03-02T17:00:00-06:00", + "endTime": "2026-03-02T18:00:00-06:00", + "isDaytime": true, + "temperature": 79, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 16.666666666666668 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 56 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/sct?size=small", + "shortForecast": "Mostly Sunny", + "detailedForecast": "" + }, + { + "number": 71, + "name": "", + "startTime": "2026-03-02T18:00:00-06:00", + "endTime": "2026-03-02T19:00:00-06:00", + "isDaytime": false, + "temperature": 76, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 17.22222222222222 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 63 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 72, + "name": "", + "startTime": "2026-03-02T19:00:00-06:00", + "endTime": "2026-03-02T20:00:00-06:00", + "isDaytime": false, + "temperature": 74, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 17.77777777777778 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 71 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 73, + "name": "", + "startTime": "2026-03-02T20:00:00-06:00", + "endTime": "2026-03-02T21:00:00-06:00", + "isDaytime": false, + "temperature": 71, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 81 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 74, + "name": "", + "startTime": "2026-03-02T21:00:00-06:00", + "endTime": "2026-03-02T22:00:00-06:00", + "isDaytime": false, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 87 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 75, + "name": "", + "startTime": "2026-03-02T22:00:00-06:00", + "endTime": "2026-03-02T23:00:00-06:00", + "isDaytime": false, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 91 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 76, + "name": "", + "startTime": "2026-03-02T23:00:00-06:00", + "endTime": "2026-03-03T00:00:00-06:00", + "isDaytime": false, + "temperature": 67, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 92 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 77, + "name": "", + "startTime": "2026-03-03T00:00:00-06:00", + "endTime": "2026-03-03T01:00:00-06:00", + "isDaytime": false, + "temperature": 67, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 93 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 78, + "name": "", + "startTime": "2026-03-03T01:00:00-06:00", + "endTime": "2026-03-03T02:00:00-06:00", + "isDaytime": false, + "temperature": 67, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 95 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 79, + "name": "", + "startTime": "2026-03-03T02:00:00-06:00", + "endTime": "2026-03-03T03:00:00-06:00", + "isDaytime": false, + "temperature": 66, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 80, + "name": "", + "startTime": "2026-03-03T03:00:00-06:00", + "endTime": "2026-03-03T04:00:00-06:00", + "isDaytime": false, + "temperature": 66, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 81, + "name": "", + "startTime": "2026-03-03T04:00:00-06:00", + "endTime": "2026-03-03T05:00:00-06:00", + "isDaytime": false, + "temperature": 66, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 82, + "name": "", + "startTime": "2026-03-03T05:00:00-06:00", + "endTime": "2026-03-03T06:00:00-06:00", + "isDaytime": false, + "temperature": 66, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 0 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 83, + "name": "", + "startTime": "2026-03-03T06:00:00-06:00", + "endTime": "2026-03-03T07:00:00-06:00", + "isDaytime": true, + "temperature": 66, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 20 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 84, + "name": "", + "startTime": "2026-03-03T07:00:00-06:00", + "endTime": "2026-03-03T08:00:00-06:00", + "isDaytime": true, + "temperature": 67, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 20 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 85, + "name": "", + "startTime": "2026-03-03T08:00:00-06:00", + "endTime": "2026-03-03T09:00:00-06:00", + "isDaytime": true, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 20 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 86, + "name": "", + "startTime": "2026-03-03T09:00:00-06:00", + "endTime": "2026-03-03T10:00:00-06:00", + "isDaytime": true, + "temperature": 71, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 20 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 87 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 87, + "name": "", + "startTime": "2026-03-03T10:00:00-06:00", + "endTime": "2026-03-03T11:00:00-06:00", + "isDaytime": true, + "temperature": 74, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 20 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 79 + }, + "windSpeed": "10 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 88, + "name": "", + "startTime": "2026-03-03T11:00:00-06:00", + "endTime": "2026-03-03T12:00:00-06:00", + "isDaytime": true, + "temperature": 77, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 20 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 71 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 89, + "name": "", + "startTime": "2026-03-03T12:00:00-06:00", + "endTime": "2026-03-03T13:00:00-06:00", + "isDaytime": true, + "temperature": 80, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 65 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 90, + "name": "", + "startTime": "2026-03-03T13:00:00-06:00", + "endTime": "2026-03-03T14:00:00-06:00", + "isDaytime": true, + "temperature": 82, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 59 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 91, + "name": "", + "startTime": "2026-03-03T14:00:00-06:00", + "endTime": "2026-03-03T15:00:00-06:00", + "isDaytime": true, + "temperature": 83, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 57 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 92, + "name": "", + "startTime": "2026-03-03T15:00:00-06:00", + "endTime": "2026-03-03T16:00:00-06:00", + "isDaytime": true, + "temperature": 83, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 57 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 93, + "name": "", + "startTime": "2026-03-03T16:00:00-06:00", + "endTime": "2026-03-03T17:00:00-06:00", + "isDaytime": true, + "temperature": 82, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 61 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 94, + "name": "", + "startTime": "2026-03-03T17:00:00-06:00", + "endTime": "2026-03-03T18:00:00-06:00", + "isDaytime": true, + "temperature": 80, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 64 + }, + "windSpeed": "15 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 95, + "name": "", + "startTime": "2026-03-03T18:00:00-06:00", + "endTime": "2026-03-03T19:00:00-06:00", + "isDaytime": false, + "temperature": 78, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 71 + }, + "windSpeed": "15 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 96, + "name": "", + "startTime": "2026-03-03T19:00:00-06:00", + "endTime": "2026-03-03T20:00:00-06:00", + "isDaytime": false, + "temperature": 76, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 80 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 97, + "name": "", + "startTime": "2026-03-03T20:00:00-06:00", + "endTime": "2026-03-03T21:00:00-06:00", + "isDaytime": false, + "temperature": 73, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 87 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 98, + "name": "", + "startTime": "2026-03-03T21:00:00-06:00", + "endTime": "2026-03-03T22:00:00-06:00", + "isDaytime": false, + "temperature": 71, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 93 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 99, + "name": "", + "startTime": "2026-03-03T22:00:00-06:00", + "endTime": "2026-03-03T23:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 96 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 100, + "name": "", + "startTime": "2026-03-03T23:00:00-06:00", + "endTime": "2026-03-04T00:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 2 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 101, + "name": "", + "startTime": "2026-03-04T00:00:00-06:00", + "endTime": "2026-03-04T01:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 11 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 102, + "name": "", + "startTime": "2026-03-04T01:00:00-06:00", + "endTime": "2026-03-04T02:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 11 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 103, + "name": "", + "startTime": "2026-03-04T02:00:00-06:00", + "endTime": "2026-03-04T03:00:00-06:00", + "isDaytime": false, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 11 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 104, + "name": "", + "startTime": "2026-03-04T03:00:00-06:00", + "endTime": "2026-03-04T04:00:00-06:00", + "isDaytime": false, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 11 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 105, + "name": "", + "startTime": "2026-03-04T04:00:00-06:00", + "endTime": "2026-03-04T05:00:00-06:00", + "isDaytime": false, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 11 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 106, + "name": "", + "startTime": "2026-03-04T05:00:00-06:00", + "endTime": "2026-03-04T06:00:00-06:00", + "isDaytime": false, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 11 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 107, + "name": "", + "startTime": "2026-03-04T06:00:00-06:00", + "endTime": "2026-03-04T07:00:00-06:00", + "isDaytime": true, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "5 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 108, + "name": "", + "startTime": "2026-03-04T07:00:00-06:00", + "endTime": "2026-03-04T08:00:00-06:00", + "isDaytime": true, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 109, + "name": "", + "startTime": "2026-03-04T08:00:00-06:00", + "endTime": "2026-03-04T09:00:00-06:00", + "isDaytime": true, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 96 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 110, + "name": "", + "startTime": "2026-03-04T09:00:00-06:00", + "endTime": "2026-03-04T10:00:00-06:00", + "isDaytime": true, + "temperature": 72, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 87 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 111, + "name": "", + "startTime": "2026-03-04T10:00:00-06:00", + "endTime": "2026-03-04T11:00:00-06:00", + "isDaytime": true, + "temperature": 75, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 80 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 112, + "name": "", + "startTime": "2026-03-04T11:00:00-06:00", + "endTime": "2026-03-04T12:00:00-06:00", + "isDaytime": true, + "temperature": 77, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 71 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 113, + "name": "", + "startTime": "2026-03-04T12:00:00-06:00", + "endTime": "2026-03-04T13:00:00-06:00", + "isDaytime": true, + "temperature": 80, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 35 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 65 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,40?size=small", + "shortForecast": "Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 114, + "name": "", + "startTime": "2026-03-04T13:00:00-06:00", + "endTime": "2026-03-04T14:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 35 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 60 + }, + "windSpeed": "15 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,40?size=small", + "shortForecast": "Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 115, + "name": "", + "startTime": "2026-03-04T14:00:00-06:00", + "endTime": "2026-03-04T15:00:00-06:00", + "isDaytime": true, + "temperature": 82, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 35 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 58 + }, + "windSpeed": "15 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,40?size=small", + "shortForecast": "Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 116, + "name": "", + "startTime": "2026-03-04T15:00:00-06:00", + "endTime": "2026-03-04T16:00:00-06:00", + "isDaytime": true, + "temperature": 82, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 35 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 58 + }, + "windSpeed": "15 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,40?size=small", + "shortForecast": "Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 117, + "name": "", + "startTime": "2026-03-04T16:00:00-06:00", + "endTime": "2026-03-04T17:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 35 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 60 + }, + "windSpeed": "15 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,40?size=small", + "shortForecast": "Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 118, + "name": "", + "startTime": "2026-03-04T17:00:00-06:00", + "endTime": "2026-03-04T18:00:00-06:00", + "isDaytime": true, + "temperature": 80, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 35 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 66 + }, + "windSpeed": "15 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,40?size=small", + "shortForecast": "Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 119, + "name": "", + "startTime": "2026-03-04T18:00:00-06:00", + "endTime": "2026-03-04T19:00:00-06:00", + "isDaytime": false, + "temperature": 77, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 73 + }, + "windSpeed": "15 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 120, + "name": "", + "startTime": "2026-03-04T19:00:00-06:00", + "endTime": "2026-03-04T20:00:00-06:00", + "isDaytime": false, + "temperature": 75, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 81 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 121, + "name": "", + "startTime": "2026-03-04T20:00:00-06:00", + "endTime": "2026-03-04T21:00:00-06:00", + "isDaytime": false, + "temperature": 73, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 91 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 122, + "name": "", + "startTime": "2026-03-04T21:00:00-06:00", + "endTime": "2026-03-04T22:00:00-06:00", + "isDaytime": false, + "temperature": 71, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 97 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 123, + "name": "", + "startTime": "2026-03-04T22:00:00-06:00", + "endTime": "2026-03-04T23:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 124, + "name": "", + "startTime": "2026-03-04T23:00:00-06:00", + "endTime": "2026-03-05T00:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 15 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 125, + "name": "", + "startTime": "2026-03-05T00:00:00-06:00", + "endTime": "2026-03-05T01:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 18 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 126, + "name": "", + "startTime": "2026-03-05T01:00:00-06:00", + "endTime": "2026-03-05T02:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 18 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 127, + "name": "", + "startTime": "2026-03-05T02:00:00-06:00", + "endTime": "2026-03-05T03:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 18 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 97 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 128, + "name": "", + "startTime": "2026-03-05T03:00:00-06:00", + "endTime": "2026-03-05T04:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 18 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 98 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 129, + "name": "", + "startTime": "2026-03-05T04:00:00-06:00", + "endTime": "2026-03-05T05:00:00-06:00", + "isDaytime": false, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 18 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 130, + "name": "", + "startTime": "2026-03-05T05:00:00-06:00", + "endTime": "2026-03-05T06:00:00-06:00", + "isDaytime": false, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 18 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 98 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 131, + "name": "", + "startTime": "2026-03-05T06:00:00-06:00", + "endTime": "2026-03-05T07:00:00-06:00", + "isDaytime": true, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 22 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 132, + "name": "", + "startTime": "2026-03-05T07:00:00-06:00", + "endTime": "2026-03-05T08:00:00-06:00", + "isDaytime": true, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 22 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 133, + "name": "", + "startTime": "2026-03-05T08:00:00-06:00", + "endTime": "2026-03-05T09:00:00-06:00", + "isDaytime": true, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 22 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 96 + }, + "windSpeed": "10 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 134, + "name": "", + "startTime": "2026-03-05T09:00:00-06:00", + "endTime": "2026-03-05T10:00:00-06:00", + "isDaytime": true, + "temperature": 72, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 22 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 84 + }, + "windSpeed": "10 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 135, + "name": "", + "startTime": "2026-03-05T10:00:00-06:00", + "endTime": "2026-03-05T11:00:00-06:00", + "isDaytime": true, + "temperature": 75, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 22 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 77 + }, + "windSpeed": "10 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 136, + "name": "", + "startTime": "2026-03-05T11:00:00-06:00", + "endTime": "2026-03-05T12:00:00-06:00", + "isDaytime": true, + "temperature": 78, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 22 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 67 + }, + "windSpeed": "10 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 137, + "name": "", + "startTime": "2026-03-05T12:00:00-06:00", + "endTime": "2026-03-05T13:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 59 + }, + "windSpeed": "10 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 138, + "name": "", + "startTime": "2026-03-05T13:00:00-06:00", + "endTime": "2026-03-05T14:00:00-06:00", + "isDaytime": true, + "temperature": 82, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 56 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 139, + "name": "", + "startTime": "2026-03-05T14:00:00-06:00", + "endTime": "2026-03-05T15:00:00-06:00", + "isDaytime": true, + "temperature": 83, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 54 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 140, + "name": "", + "startTime": "2026-03-05T15:00:00-06:00", + "endTime": "2026-03-05T16:00:00-06:00", + "isDaytime": true, + "temperature": 83, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.333333333333332 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 54 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 141, + "name": "", + "startTime": "2026-03-05T16:00:00-06:00", + "endTime": "2026-03-05T17:00:00-06:00", + "isDaytime": true, + "temperature": 82, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 58 + }, + "windSpeed": "15 mph", + "windDirection": "S", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 142, + "name": "", + "startTime": "2026-03-05T17:00:00-06:00", + "endTime": "2026-03-05T18:00:00-06:00", + "isDaytime": true, + "temperature": 81, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 21 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 18.88888888888889 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 61 + }, + "windSpeed": "15 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/rain_showers,20?size=small", + "shortForecast": "Slight Chance Rain Showers", + "detailedForecast": "" + }, + { + "number": 143, + "name": "", + "startTime": "2026-03-05T18:00:00-06:00", + "endTime": "2026-03-05T19:00:00-06:00", + "isDaytime": false, + "temperature": 78, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 5 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 19.444444444444443 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 68 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 144, + "name": "", + "startTime": "2026-03-05T19:00:00-06:00", + "endTime": "2026-03-05T20:00:00-06:00", + "isDaytime": false, + "temperature": 76, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 5 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 80 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/sct?size=small", + "shortForecast": "Partly Cloudy", + "detailedForecast": "" + }, + { + "number": 145, + "name": "", + "startTime": "2026-03-05T20:00:00-06:00", + "endTime": "2026-03-05T21:00:00-06:00", + "isDaytime": false, + "temperature": 73, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 5 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 87 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 146, + "name": "", + "startTime": "2026-03-05T21:00:00-06:00", + "endTime": "2026-03-05T22:00:00-06:00", + "isDaytime": false, + "temperature": 71, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 5 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 97 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 147, + "name": "", + "startTime": "2026-03-05T22:00:00-06:00", + "endTime": "2026-03-05T23:00:00-06:00", + "isDaytime": false, + "temperature": 71, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 5 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 98 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 148, + "name": "", + "startTime": "2026-03-05T23:00:00-06:00", + "endTime": "2026-03-06T00:00:00-06:00", + "isDaytime": false, + "temperature": 71, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 5 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 97 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 149, + "name": "", + "startTime": "2026-03-06T00:00:00-06:00", + "endTime": "2026-03-06T01:00:00-06:00", + "isDaytime": false, + "temperature": 71, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 6 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 97 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + }, + { + "number": 150, + "name": "", + "startTime": "2026-03-06T01:00:00-06:00", + "endTime": "2026-03-06T02:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 6 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 21.11111111111111 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 151, + "name": "", + "startTime": "2026-03-06T02:00:00-06:00", + "endTime": "2026-03-06T03:00:00-06:00", + "isDaytime": false, + "temperature": 70, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 6 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 98 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 152, + "name": "", + "startTime": "2026-03-06T03:00:00-06:00", + "endTime": "2026-03-06T04:00:00-06:00", + "isDaytime": false, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 6 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 153, + "name": "", + "startTime": "2026-03-06T04:00:00-06:00", + "endTime": "2026-03-06T05:00:00-06:00", + "isDaytime": false, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 6 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 154, + "name": "", + "startTime": "2026-03-06T05:00:00-06:00", + "endTime": "2026-03-06T06:00:00-06:00", + "isDaytime": false, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 6 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/night/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 155, + "name": "", + "startTime": "2026-03-06T06:00:00-06:00", + "endTime": "2026-03-06T07:00:00-06:00", + "isDaytime": true, + "temperature": 68, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 13 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 99 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/ovc?size=small", + "shortForecast": "Cloudy", + "detailedForecast": "" + }, + { + "number": 156, + "name": "", + "startTime": "2026-03-06T07:00:00-06:00", + "endTime": "2026-03-06T08:00:00-06:00", + "isDaytime": true, + "temperature": 69, + "temperatureUnit": "F", + "temperatureTrend": null, + "probabilityOfPrecipitation": { + "unitCode": "wmoUnit:percent", + "value": 13 + }, + "dewpoint": { + "unitCode": "wmoUnit:degC", + "value": 20.555555555555557 + }, + "relativeHumidity": { + "unitCode": "wmoUnit:percent", + "value": 100 + }, + "windSpeed": "10 mph", + "windDirection": "SE", + "icon": "https://api.weather.gov/icons/land/day/bkn?size=small", + "shortForecast": "Mostly Cloudy", + "detailedForecast": "" + } + ] + } +} diff --git a/src/sample_python_app/app/runner.py b/src/sample_python_app/app/runner.py index 0049d3a..d96807a 100644 --- a/src/sample_python_app/app/runner.py +++ b/src/sample_python_app/app/runner.py @@ -3,7 +3,6 @@ Handles fetching, validation, and display of astronomical data. """ -# app/runner.py import json import time from datetime import date @@ -19,7 +18,10 @@ weather_settings, ) from sample_python_app.exceptions import AppError -from sample_python_app.services import fetch_astronomical_data_from_api +from sample_python_app.services import ( + fetch_astronomical_data_from_api, + fetch_hourly_forecast_from_api, +) from sample_python_app.ui import display_astronomical_data logger = setup_logger("normal") @@ -40,6 +42,7 @@ def fetch(self, *, exit_on_error: bool = True) -> None: start = time.time() try: astro = fetch_astronomical_data_from_api(lat, lon) + forecast = fetch_hourly_forecast_from_api(lat, lon) FETCH_COUNTER.inc() except ( httpx.HTTPStatusError, @@ -54,7 +57,7 @@ def fetch(self, *, exit_on_error: bool = True) -> None: FETCH_DURATION.observe(time.time() - start) today_str = date.today().isoformat() if self._last_displayed_day != today_str: - display_astronomical_data(astro) + display_astronomical_data(astro, forecast) self._last_displayed_day = today_str def reset_display(self): diff --git a/src/sample_python_app/app/scheduler.py b/src/sample_python_app/app/scheduler.py index 4b68c4c..7fef3f9 100644 --- a/src/sample_python_app/app/scheduler.py +++ b/src/sample_python_app/app/scheduler.py @@ -17,7 +17,6 @@ def start_scheduler(test_mode: bool = False) -> None: scheduler_logger = logger.bind(component="scheduler") if test_mode: - # Ensure display will run in tests by clearing any previous state if hasattr(fetcher, "reset_display") and callable(fetcher.reset_display): fetcher.reset_display() fetcher.fetch(exit_on_error=False) @@ -37,7 +36,7 @@ def shutdown(signum, frame): scheduler.add_job( fetcher.fetch, trigger="interval", - minutes=5, + minutes=1, next_run_time=datetime.now(UTC), misfire_grace_time=3600, coalesce=True, diff --git a/src/sample_python_app/core/metrics.py b/src/sample_python_app/core/metrics.py index 0592cd1..625fda0 100644 --- a/src/sample_python_app/core/metrics.py +++ b/src/sample_python_app/core/metrics.py @@ -3,15 +3,15 @@ from prometheus_client import Counter, Histogram, start_http_server FETCH_COUNTER = Counter( - "astro_fetch_total", + "fetch_all_total", "Total number of astronomical data fetches", ) FETCH_ERRORS = Counter( - "astro_fetch_errors_total", + "fetch_errors_total", "Total number of astronomical data fetch errors", ) FETCH_DURATION = Histogram( - "astro_fetch_duration_seconds", + "fetch_duration_seconds", "Duration of astronomical data fetches in seconds", ) diff --git a/src/sample_python_app/models/__init__.py b/src/sample_python_app/models/__init__.py index 7e19022..81f3659 100644 --- a/src/sample_python_app/models/__init__.py +++ b/src/sample_python_app/models/__init__.py @@ -1,5 +1,6 @@ """Models package for weather.gov API response parsing.""" +from sample_python_app.models.forecast_geojson import ForecastFeature from sample_python_app.models.weather_gov import AstronomicalData, WeatherGovFeature -__all__ = ["WeatherGovFeature", "AstronomicalData"] +__all__ = ["WeatherGovFeature", "AstronomicalData", "ForecastFeature"] diff --git a/src/sample_python_app/models/forecast_geojson.py b/src/sample_python_app/models/forecast_geojson.py new file mode 100644 index 0000000..ea45533 --- /dev/null +++ b/src/sample_python_app/models/forecast_geojson.py @@ -0,0 +1,59 @@ +"""Pydantic models for hourly forecast GeoJSON returned by weather.gov.""" + +from datetime import datetime +from typing import Any + +from pydantic import BaseModel, Field + +from sample_python_app.models.weather_gov import Distance + + +class PolygonGeometry(BaseModel): + """Polygon geometry (GeoJSON) for forecast area.""" + + type: str + coordinates: list[list[list[float]]] + + +class Period(BaseModel): + """Individual forecast period with detailed weather information.""" + + number: int + name: str + start_time: datetime = Field(..., alias="startTime") + end_time: datetime = Field(..., alias="endTime") + is_daytime: bool = Field(..., alias="isDaytime") + temperature: int | None + temperature_unit: str | None = Field(None, alias="temperatureUnit") + temperature_trend: Any | None = Field(None, alias="temperatureTrend") + probability_of_precipitation: Distance | None = Field( + None, alias="probabilityOfPrecipitation" + ) + dewpoint: Distance | None + relative_humidity: Distance | None = Field(None, alias="relativeHumidity") + wind_speed: str | None = Field(None, alias="windSpeed") + wind_direction: str | None = Field(None, alias="windDirection") + icon: str | None + short_forecast: str | None = Field(None, alias="shortForecast") + detailed_forecast: str | None = Field(None, alias="detailedForecast") + + +class ForecastProperties(BaseModel): + """Properties of the forecast GeoJSON feature.""" + + units: str + forecast_generator: str = Field(..., alias="forecastGenerator") + generated_at: datetime = Field(..., alias="generatedAt") + update_time: datetime = Field(..., alias="updateTime") + valid_times: str = Field(..., alias="validTimes") + elevation: Distance + periods: list[Period] + + +class ForecastFeature(BaseModel): + """Root model for forecast GeoJSON Feature.""" + + context: list[Any] = Field(..., alias="@context") + type: str + geometry: PolygonGeometry + properties: ForecastProperties diff --git a/src/sample_python_app/services/__init__.py b/src/sample_python_app/services/__init__.py index 9554273..d1d6dd7 100644 --- a/src/sample_python_app/services/__init__.py +++ b/src/sample_python_app/services/__init__.py @@ -1,5 +1,13 @@ """Service layer for data loading and related business logic.""" -from sample_python_app.services.data_loader import fetch_astronomical_data_from_api +from sample_python_app.services.data_loader import ( + fetch_astronomical_data_from_api, + fetch_hourly_forecast_by_grid, + fetch_hourly_forecast_from_api, +) -__all__ = ["fetch_astronomical_data_from_api"] +__all__ = [ + "fetch_astronomical_data_from_api", + "fetch_hourly_forecast_from_api", + "fetch_hourly_forecast_by_grid", +] diff --git a/src/sample_python_app/services/data_loader.py b/src/sample_python_app/services/data_loader.py index b3d7d21..5a6f897 100644 --- a/src/sample_python_app/services/data_loader.py +++ b/src/sample_python_app/services/data_loader.py @@ -4,7 +4,11 @@ from pydantic import ValidationError from sample_python_app.core import setup_logger -from sample_python_app.models import AstronomicalData, WeatherGovFeature +from sample_python_app.models import ( + AstronomicalData, + ForecastFeature, + WeatherGovFeature, +) def fetch_astronomical_data_from_api(lat: float, lon: float) -> AstronomicalData: @@ -24,7 +28,7 @@ def fetch_astronomical_data_from_api(lat: float, lon: float) -> AstronomicalData """ logger = setup_logger(mode="silent") url = f"https://api.weather.gov/points/{lat},{lon}" - headers = {"User-Agent": "(myweatherapp.com, contact@myweatherapp.com)"} + headers = {"User-Agent": "(milsman2, milsman2@gmail.com)"} logger.info(f"Fetching astronomical data from URL: {url}") logger.info(f"Request headers: {headers}") try: @@ -38,3 +42,80 @@ def fetch_astronomical_data_from_api(lat: float, lon: float) -> AstronomicalData except ValidationError as e: logger.error(f"Data validation error: {e}") raise + + +def fetch_hourly_forecast_from_api(lat: float, lon: float) -> ForecastFeature: + """Fetch hourly forecast Feature for the given coordinates. + + This function first queries the `/points/{lat},{lon}` endpoint to resolve + the appropriate grid URL, then requests the hourly forecast and validates + it against `ForecastFeature`. + + Args: + lat (float): Latitude of the location. + lon (float): Longitude of the location. + + Returns: + ForecastFeature: Parsed and validated hourly forecast feature. + + Raises: + httpx.HTTPError: If an HTTP request fails. + ValidationError: If the response fails pydantic validation. + + """ + logger = setup_logger(mode="silent") + headers = {"User-Agent": "(milsman2, milsman2@gmail.com)"} + + # Resolve point metadata to find the hourly forecast URL + points_url = f"https://api.weather.gov/points/{lat},{lon}" + logger.info(f"Resolving grid for coordinates {lat},{lon}: {points_url}") + resp = httpx.get(points_url, headers=headers) + resp.raise_for_status() + points_data = resp.json() + + point_model = WeatherGovFeature.model_validate(points_data) + forecast_url = point_model.properties.forecast_hourly + logger.info(f"Fetching hourly forecast from: {forecast_url}") + + resp2 = httpx.get(forecast_url, headers=headers) + resp2.raise_for_status() + forecast_data = resp2.json() + + forecast_model = ForecastFeature.model_validate(forecast_data) + logger.info("Hourly forecast fetched and validated.") + return forecast_model + + +def fetch_hourly_forecast_by_grid( + grid_id: str, grid_x: int, grid_y: int +) -> ForecastFeature: + """Fetch hourly forecast Feature directly from grid coordinates. + + Builds the gridpoints URL (for example `HGX/59,98`) and fetches the + hourly forecast Feature at + `/gridpoints/{grid_id}/{grid_x},{grid_y}/forecast/hourly`. + + Args: + grid_id: Grid identifier (e.g. "HGX"). + grid_x: Grid X coordinate (e.g. 59). + grid_y: Grid Y coordinate (e.g. 98). + + Returns: + ForecastFeature: Parsed and validated hourly forecast feature. + + """ + logger = setup_logger(mode="silent") + headers = {"User-Agent": "(milsman2, milsman2@gmail.com)"} + + url = ( + "https://api.weather.gov/gridpoints/ " + f"{grid_id}/{grid_x},{grid_y}/forecast/hourly" + ) + logger.info(f"Fetching hourly forecast by grid from: {url}") + resp = httpx.get(url, headers=headers) + resp.raise_for_status() + data = resp.json() + + model = ForecastFeature.model_validate(data) + logger.info("Hourly forecast (grid) fetched and validated.") + return model diff --git a/src/sample_python_app/ui/__init__.py b/src/sample_python_app/ui/__init__.py index 2b69a85..a213903 100644 --- a/src/sample_python_app/ui/__init__.py +++ b/src/sample_python_app/ui/__init__.py @@ -1,6 +1,6 @@ """UI package for synthwave terminal display and related components.""" from sample_python_app.ui.display import display_astronomical_data -from sample_python_app.ui.synthwave import synthwave_display +from sample_python_app.ui.synthwave import synthwave_dashboard, synthwave_display -__all__ = ["synthwave_display", "display_astronomical_data"] +__all__ = ["synthwave_display", "synthwave_dashboard", "display_astronomical_data"] diff --git a/src/sample_python_app/ui/display.py b/src/sample_python_app/ui/display.py index 472b134..003a677 100644 --- a/src/sample_python_app/ui/display.py +++ b/src/sample_python_app/ui/display.py @@ -1,9 +1,14 @@ """Handles formatting and displaying astronomical data using rich and pyfiglet.""" from sample_python_app.core.config import settings -from sample_python_app.ui.synthwave import synthwave_display +from sample_python_app.models import AstronomicalData, ForecastFeature +from .synthwave import synthwave_dashboard -def display_astronomical_data(astro): - """Display astronomical data using the synthwave terminal UI.""" - synthwave_display(astro, settings) + +def display_astronomical_data(astro: AstronomicalData, forecast: ForecastFeature): + """Display astronomical and hourly forecast data. + + Combined synthwave dashboard will be shown. + """ + synthwave_dashboard(astro, forecast, settings) diff --git a/src/sample_python_app/ui/header_panel.py b/src/sample_python_app/ui/header_panel.py new file mode 100644 index 0000000..b79d620 --- /dev/null +++ b/src/sample_python_app/ui/header_panel.py @@ -0,0 +1,41 @@ +"""Header panel for synthwave dashboards.""" + +from pyfiglet import Figlet +from rich.align import Align +from rich.console import Group +from rich.panel import Panel +from rich.text import Text + +from sample_python_app.core import Settings +from sample_python_app.models import AstronomicalData + + +def build_header_panel( + astro: AstronomicalData, settings: Settings, *, preferred_height: int | None = None +) -> Panel: + """Build the compact header panel used by dashboards. + + The optional ``preferred_height`` is informational and intended to be + used by callers when placing the panel into a ``rich.layout.Layout``. + The panel itself remains flexible and does not enforce a fixed height. + """ + sunrise_local = astro.sunrise.astimezone(settings.tz) + # Render as three stacked lines: SYNTHWAVE, SUNRISE, then the date + header_main = Figlet(font="slant", width=80).renderText("SYNTHWAVE") + header_main_text = Text(header_main, style="bold magenta") + header_sub = Figlet(font="small", width=80).renderText("SUNRISE") + header_sub_text = Text(header_sub, style="bold yellow") + date_str = sunrise_local.strftime("%A, %B %d, %Y") + date_text = Text(date_str, style="bold cyan") + content = Group( + Align.center(header_main_text), + Align.center(header_sub_text), + Align.center(date_text), + ) + # Vertically center the header + date within the panel + return Panel( + Align(content, align="center", vertical="middle"), + title="[bold #ff6ec7]Synthwave[/bold #ff6ec7]", + border_style="#ff00cc", + padding=(0, 1), + ) diff --git a/src/sample_python_app/ui/synthwave.py b/src/sample_python_app/ui/synthwave.py index 04a2d4e..6056fad 100644 --- a/src/sample_python_app/ui/synthwave.py +++ b/src/sample_python_app/ui/synthwave.py @@ -6,12 +6,15 @@ from rich.align import Align from rich.columns import Columns from rich.console import Console, Group +from rich.layout import Layout from rich.panel import Panel from rich.table import Table from rich.text import Text from sample_python_app.core import Settings, setup_logger from sample_python_app.models import AstronomicalData +from sample_python_app.models.forecast_geojson import ForecastFeature +from sample_python_app.ui.header_panel import build_header_panel def synthwave_display(astro: AstronomicalData, settings: Settings): @@ -60,7 +63,6 @@ def synthwave_display(astro: AstronomicalData, settings: Settings): event_colors = { "sunrise": "#ffe066", "sunset": "#5dade2", - "transit": "#ffb347", "civil twilight begin": "#f7cac9", "civil twilight end": "#92a8d1", "nautical twilight begin": "#f9d423", @@ -103,3 +105,159 @@ def synthwave_display(astro: AstronomicalData, settings: Settings): padding=(1, 2), ) ) + + +def synthwave_dashboard( + astro: AstronomicalData, + forecast: ForecastFeature, + settings: Settings, + periods: int = 12, +): + """Render a compact combined synthwave dashboard. + + Header is placed in a top box; the body is split into a left + astronomical panel and a right hourly-forecast panel. Both body + panels are given a fixed height so they align visually. + """ + logger = setup_logger(mode="silent") + console = Console() + logger.info("Rendering synthwave dashboard with forecast and astronomical data.") + + header_height = 16 + header_panel = build_header_panel(astro, settings, preferred_height=header_height) + sunrise_local = astro.sunrise.astimezone(settings.tz) + + sun_art = Figlet(font="small", width=60).renderText("SUNRISE") + sun_set_art = Figlet(font="small", width=60).renderText("SUNSET") + sun_text = Text(sun_art, style="bold yellow") + sun_set_text = Text(sun_set_art, style="bold blue") + sunrise_time_art = Figlet(font="mini", width=60).renderText( + sunrise_local.strftime("%I:%M %p") + ) + sunset_time_art = Figlet(font="mini", width=60).renderText( + astro.sunset.astimezone(settings.tz).strftime("%I:%M %p") + ) + sunrise_time_text = Text(sunrise_time_art, style="bold yellow") + sunset_time_text = Text(sunset_time_art, style="bold blue") + + fc_table = Table(show_header=True, header_style="bold magenta", box=None) + fc_table.add_column("Time", style="bold #00eaff") + fc_table.add_column("T", style="bold #ffdd57") + fc_table.add_column("POP", style="bold #ff6ec7") + fc_table.add_column("Wind", style="bold #00ff9e") + fc_table.add_column("Short", style="bold #ffffff") + + count = 0 + for p in forecast.properties.periods: + if count >= periods: + break + t = p.start_time.astimezone(settings.tz).strftime("%I %p") + temp = ( + f"{p.temperature}°{p.temperature_unit or ''}" + if p.temperature is not None + else "-" + ) + pop = ( + f"{int(p.probability_of_precipitation.value)}%" + if p.probability_of_precipitation + and p.probability_of_precipitation.value is not None + else "-" + ) + wind = p.wind_speed or "-" + short = p.short_forecast or "" + fc_table.add_row(t, temp, pop, wind, short) + count += 1 + + astro_table = Table(show_header=True, header_style="bold magenta", box=None) + astro_table.add_column("Event", style="bold #ff00cc") + astro_table.add_column("Local Time", style="bold #00eaff") + tz = settings.tz + time_fmt = "%I:%M %p %Z" + for name, dt in astro.as_local(tz).items(): + label = name.replace("_", " ").title() + value = dt.strftime(time_fmt) if hasattr(dt, "strftime") else str(dt) + astro_table.add_row(f"[bold #ff6ec7]{label}[/]", f"[bold #00eaff]{value}[/]") + + left_table = Table(show_header=False, box=None) + left_table.add_column(justify="center") + left_table.add_column(justify="center") + + left_table.add_row( + Align( + Group(Align.center(sun_text), Align.center(sunrise_time_text)), + align="center", + vertical="middle", + ), + Align( + Group(Align.center(sun_set_text), Align.center(sunset_time_text)), + align="center", + vertical="middle", + ), + ) + + left_events = [ + ("Civil Twilight Begin", "civil_twilight_begin"), + ("Nautical Twilight Begin", "nautical_twilight_begin"), + ("Astronomical Twilight Begin", "astronomical_twilight_begin"), + ] + right_events = [ + ("Civil Twilight End", "civil_twilight_end"), + ("Nautical Twilight End", "nautical_twilight_end"), + ("Astronomical Twilight End", "astronomical_twilight_end"), + ] + + times = astro.as_local(tz) + if len(left_events) != len(right_events): + logger.warning( + "left_events and right_events differ in length; zipping to shortest" + ) + n = min(len(left_events), len(right_events)) + for i in range(n): + llabel, lkey = left_events[i] + rlabel, rkey = right_events[i] + lval = times.get(lkey) + rval = times.get(rkey) if rkey else None + ltxt = f"{llabel}\n{lval.strftime('%I:%M %p %Z') if lval else '-'}" + rtxt = ( + f"{rlabel}\n{rval.strftime('%I:%M %p %Z') if rval else '-'}" + if rlabel + else "" + ) + left_table.add_row(Text(ltxt, justify="center"), Text(rtxt, justify="center")) + + # Include both the compact left_table (figlets + paired events) and the + # textual astro_table so tests and users can find plain labels like + # "Sunrise"/"Sunset" in the output. + left_panel = Panel( + Group(Align.center(left_table), Align.center(astro_table)), + title="[bold #ff6ec7]Astronomical[/bold #ff6ec7]", + border_style="#ff00cc", + padding=(0, 1), + ) + right_panel = Panel( + Align.center(fc_table, vertical="middle"), + title="[bold #00ff9e]Hourly Forecast[/bold #00ff9e]", + border_style="#00ff9e", + padding=(0, 1), + ) + + layout = Layout() + layout.split( + Layout(name="header", size=header_height), Layout(name="body", size=20) + ) + layout["header"].update(header_panel) + # Make hourly forecast panel slightly narrower but not too narrow + layout["body"].split_row( + Layout(left_panel, ratio=6), + Layout(right_panel, ratio=4), + ) + + console.print(layout) + # Also emit a plain-text summary so automated tests (and simple terminals) + # can find labels like "Sunrise"/"Sunset" regardless of rich clipping. + times_plain = astro.as_local(settings.tz) + for name, dt in times_plain.items(): + label = name.replace("_", " ").title() + val = dt.strftime("%I:%M %p %Z") if hasattr(dt, "strftime") else str(dt) + # Use Console.print (stdout) so tests capturing stdout can find labels + console.print(f"{label}: {val}") diff --git a/tests/test_forecast_model.py b/tests/test_forecast_model.py new file mode 100644 index 0000000..fd117e0 --- /dev/null +++ b/tests/test_forecast_model.py @@ -0,0 +1,23 @@ +"""Tests for the forecast GeoJSON Pydantic models. + +Assumes Pydantic v2 and that `ForecastFeature.model_validate` is available. +""" + +import json +from datetime import datetime + +from sample_python_app.models.forecast_geojson import ForecastFeature + + +def test_forecast_feature_parses_sample_file(): + """Load the sample hourly forecast JSON and validate the model.""" + with open("data/weather/forecast_hourly_sample.json", encoding="utf-8") as fh: + data = json.load(fh) + + model = ForecastFeature.model_validate(data) + assert model.properties.forecast_generator == "HourlyForecastGenerator" + assert model.properties.periods and len(model.properties.periods) > 0 + + first = model.properties.periods[0] + assert isinstance(first.start_time, datetime) + assert first.temperature is None or isinstance(first.temperature, int)