Files
agessaman 5601a126dd refactor(weather): port the behavior-neutral weather refactor from refactor/maintainability
This brings the weather slices of my long-running refactor branch to dev ahead of converging wx and gwx, so the convergence PRs build on one copy of the code instead of rewriting it twice.

- `modules/weather_common.py` (WeatherCommandMixin): code wx and gwx shared by copy (MQTT and WXSIM source lookup, multi-day sending, high/low formatting, the forecast-option parser, the Open-Meteo model loader).
- `modules/nws_alerts.py`: one NWS alert entry parser for wx and the weather service, keeping each caller's own Special Weather Statement rules.
- `modules/http_retry.py`: one retrying session builder for the weather HTTP clients.
- wx: get_noaa_weather, the hourly, tomorrow and multi-day formatters, _add_period_details and the extract_* readers broken up or made table-driven; NOAA fetches go through `_noaa_fetch`.
- gwx: one fetch path; `_open_meteo_current` and `_open_meteo_daily_tail` split out of get_open_meteo_weather.
- solarforecast: `_format_forecast` built from one timestamp parser and one day builder (418 → 155 lines).
- aurora, rain, wx, gwx: companion and bot location lookups through `modules.location` (which gains optional logging arguments).

The changes outside these files that the refactor branch made (the base command's enabled_attr hook, the service base's run_periodic and _cancel_tasks) stay out: aurora and rain keep their can_execute overrides and the weather service its own loops, exactly as on dev.

Tests: characterization goldens over real captured NOAA, NWS, Open-Meteo and forecast.solar responses (tests/characterization, fixtures in tests/fixtures), 50 tests and several hundred cases, all of which also pass against dev's unmodified weather code. Each refactor step was additionally checked on the branch with an old-vs-new differential run (tens of thousands of generated inputs, including log calls and exceptions) and reviewed by codex.
2026-10-01 21:11:23 -07:00

1 line
17 KiB
JSON

{"latitude":33.440266,"longitude":-112.06021,"generationtime_ms":1.13677978515625,"utc_offset_seconds":-25200,"timezone":"America/Phoenix","timezone_abbreviation":"GMT-7","elevation":333.0,"current_units":{"time":"iso8601","interval":"seconds","temperature_2m":"°F","relative_humidity_2m":"%","apparent_temperature":"°F","precipitation":"inch","weather_code":"wmo code","wind_speed_10m":"mp/h","wind_direction_10m":"°","wind_gusts_10m":"mp/h","dewpoint_2m":"°F","visibility":"ft","surface_pressure":"hPa"},"current":{"time":"2026-10-01T19:15","interval":900,"temperature_2m":84.6,"relative_humidity_2m":32,"apparent_temperature":83.0,"precipitation":0.000,"weather_code":0,"wind_speed_10m":4.7,"wind_direction_10m":245,"wind_gusts_10m":5.8,"dewpoint_2m":51.5,"visibility":193241.472,"surface_pressure":971.1},"hourly_units":{"time":"iso8601","temperature_2m":"°F","weather_code":"wmo code","wind_speed_10m":"mp/h","wind_direction_10m":"°","wind_gusts_10m":"mp/h"},"hourly":{"time":["2026-10-01T00:00","2026-10-01T01:00","2026-10-01T02:00","2026-10-01T03:00","2026-10-01T04:00","2026-10-01T05:00","2026-10-01T06:00","2026-10-01T07:00","2026-10-01T08:00","2026-10-01T09:00","2026-10-01T10:00","2026-10-01T11:00","2026-10-01T12:00","2026-10-01T13:00","2026-10-01T14:00","2026-10-01T15:00","2026-10-01T16:00","2026-10-01T17:00","2026-10-01T18:00","2026-10-01T19:00","2026-10-01T20:00","2026-10-01T21:00","2026-10-01T22:00","2026-10-01T23:00","2026-10-02T00:00","2026-10-02T01:00","2026-10-02T02:00","2026-10-02T03:00","2026-10-02T04:00","2026-10-02T05:00","2026-10-02T06:00","2026-10-02T07:00","2026-10-02T08:00","2026-10-02T09:00","2026-10-02T10:00","2026-10-02T11:00","2026-10-02T12:00","2026-10-02T13:00","2026-10-02T14:00","2026-10-02T15:00","2026-10-02T16:00","2026-10-02T17:00","2026-10-02T18:00","2026-10-02T19:00","2026-10-02T20:00","2026-10-02T21:00","2026-10-02T22:00","2026-10-02T23:00","2026-10-03T00:00","2026-10-03T01:00","2026-10-03T02:00","2026-10-03T03:00","2026-10-03T04:00","2026-10-03T05:00","2026-10-03T06:00","2026-10-03T07:00","2026-10-03T08:00","2026-10-03T09:00","2026-10-03T10:00","2026-10-03T11:00","2026-10-03T12:00","2026-10-03T13:00","2026-10-03T14:00","2026-10-03T15:00","2026-10-03T16:00","2026-10-03T17:00","2026-10-03T18:00","2026-10-03T19:00","2026-10-03T20:00","2026-10-03T21:00","2026-10-03T22:00","2026-10-03T23:00","2026-10-04T00:00","2026-10-04T01:00","2026-10-04T02:00","2026-10-04T03:00","2026-10-04T04:00","2026-10-04T05:00","2026-10-04T06:00","2026-10-04T07:00","2026-10-04T08:00","2026-10-04T09:00","2026-10-04T10:00","2026-10-04T11:00","2026-10-04T12:00","2026-10-04T13:00","2026-10-04T14:00","2026-10-04T15:00","2026-10-04T16:00","2026-10-04T17:00","2026-10-04T18:00","2026-10-04T19:00","2026-10-04T20:00","2026-10-04T21:00","2026-10-04T22:00","2026-10-04T23:00","2026-10-05T00:00","2026-10-05T01:00","2026-10-05T02:00","2026-10-05T03:00","2026-10-05T04:00","2026-10-05T05:00","2026-10-05T06:00","2026-10-05T07:00","2026-10-05T08:00","2026-10-05T09:00","2026-10-05T10:00","2026-10-05T11:00","2026-10-05T12:00","2026-10-05T13:00","2026-10-05T14:00","2026-10-05T15:00","2026-10-05T16:00","2026-10-05T17:00","2026-10-05T18:00","2026-10-05T19:00","2026-10-05T20:00","2026-10-05T21:00","2026-10-05T22:00","2026-10-05T23:00","2026-10-06T00:00","2026-10-06T01:00","2026-10-06T02:00","2026-10-06T03:00","2026-10-06T04:00","2026-10-06T05:00","2026-10-06T06:00","2026-10-06T07:00","2026-10-06T08:00","2026-10-06T09:00","2026-10-06T10:00","2026-10-06T11:00","2026-10-06T12:00","2026-10-06T13:00","2026-10-06T14:00","2026-10-06T15:00","2026-10-06T16:00","2026-10-06T17:00","2026-10-06T18:00","2026-10-06T19:00","2026-10-06T20:00","2026-10-06T21:00","2026-10-06T22:00","2026-10-06T23:00","2026-10-07T00:00","2026-10-07T01:00","2026-10-07T02:00","2026-10-07T03:00","2026-10-07T04:00","2026-10-07T05:00","2026-10-07T06:00","2026-10-07T07:00","2026-10-07T08:00","2026-10-07T09:00","2026-10-07T10:00","2026-10-07T11:00","2026-10-07T12:00","2026-10-07T13:00","2026-10-07T14:00","2026-10-07T15:00","2026-10-07T16:00","2026-10-07T17:00","2026-10-07T18:00","2026-10-07T19:00","2026-10-07T20:00","2026-10-07T21:00","2026-10-07T22:00","2026-10-07T23:00","2026-10-08T00:00","2026-10-08T01:00","2026-10-08T02:00","2026-10-08T03:00","2026-10-08T04:00","2026-10-08T05:00","2026-10-08T06:00","2026-10-08T07:00","2026-10-08T08:00","2026-10-08T09:00","2026-10-08T10:00","2026-10-08T11:00","2026-10-08T12:00","2026-10-08T13:00","2026-10-08T14:00","2026-10-08T15:00","2026-10-08T16:00","2026-10-08T17:00","2026-10-08T18:00","2026-10-08T19:00","2026-10-08T20:00","2026-10-08T21:00","2026-10-08T22:00","2026-10-08T23:00","2026-10-09T00:00","2026-10-09T01:00","2026-10-09T02:00","2026-10-09T03:00","2026-10-09T04:00","2026-10-09T05:00","2026-10-09T06:00","2026-10-09T07:00","2026-10-09T08:00","2026-10-09T09:00","2026-10-09T10:00","2026-10-09T11:00","2026-10-09T12:00","2026-10-09T13:00","2026-10-09T14:00","2026-10-09T15:00","2026-10-09T16:00","2026-10-09T17:00","2026-10-09T18:00","2026-10-09T19:00","2026-10-09T20:00","2026-10-09T21:00","2026-10-09T22:00","2026-10-09T23:00","2026-10-10T00:00","2026-10-10T01:00","2026-10-10T02:00","2026-10-10T03:00","2026-10-10T04:00","2026-10-10T05:00","2026-10-10T06:00","2026-10-10T07:00","2026-10-10T08:00","2026-10-10T09:00","2026-10-10T10:00","2026-10-10T11:00","2026-10-10T12:00","2026-10-10T13:00","2026-10-10T14:00","2026-10-10T15:00","2026-10-10T16:00","2026-10-10T17:00","2026-10-10T18:00","2026-10-10T19:00","2026-10-10T20:00","2026-10-10T21:00","2026-10-10T22:00","2026-10-10T23:00","2026-10-11T00:00","2026-10-11T01:00","2026-10-11T02:00","2026-10-11T03:00","2026-10-11T04:00","2026-10-11T05:00","2026-10-11T06:00","2026-10-11T07:00","2026-10-11T08:00","2026-10-11T09:00","2026-10-11T10:00","2026-10-11T11:00","2026-10-11T12:00","2026-10-11T13:00","2026-10-11T14:00","2026-10-11T15:00","2026-10-11T16:00","2026-10-11T17:00","2026-10-11T18:00","2026-10-11T19:00","2026-10-11T20:00","2026-10-11T21:00","2026-10-11T22:00","2026-10-11T23:00","2026-10-12T00:00","2026-10-12T01:00","2026-10-12T02:00","2026-10-12T03:00","2026-10-12T04:00","2026-10-12T05:00","2026-10-12T06:00","2026-10-12T07:00","2026-10-12T08:00","2026-10-12T09:00","2026-10-12T10:00","2026-10-12T11:00","2026-10-12T12:00","2026-10-12T13:00","2026-10-12T14:00","2026-10-12T15:00","2026-10-12T16:00","2026-10-12T17:00","2026-10-12T18:00","2026-10-12T19:00","2026-10-12T20:00","2026-10-12T21:00","2026-10-12T22:00","2026-10-12T23:00","2026-10-13T00:00","2026-10-13T01:00","2026-10-13T02:00","2026-10-13T03:00","2026-10-13T04:00","2026-10-13T05:00","2026-10-13T06:00","2026-10-13T07:00","2026-10-13T08:00","2026-10-13T09:00","2026-10-13T10:00","2026-10-13T11:00","2026-10-13T12:00","2026-10-13T13:00","2026-10-13T14:00","2026-10-13T15:00","2026-10-13T16:00","2026-10-13T17:00","2026-10-13T18:00","2026-10-13T19:00","2026-10-13T20:00","2026-10-13T21:00","2026-10-13T22:00","2026-10-13T23:00","2026-10-14T00:00","2026-10-14T01:00","2026-10-14T02:00","2026-10-14T03:00","2026-10-14T04:00","2026-10-14T05:00","2026-10-14T06:00","2026-10-14T07:00","2026-10-14T08:00","2026-10-14T09:00","2026-10-14T10:00","2026-10-14T11:00","2026-10-14T12:00","2026-10-14T13:00","2026-10-14T14:00","2026-10-14T15:00","2026-10-14T16:00","2026-10-14T17:00","2026-10-14T18:00","2026-10-14T19:00","2026-10-14T20:00","2026-10-14T21:00","2026-10-14T22:00","2026-10-14T23:00","2026-10-15T00:00","2026-10-15T01:00","2026-10-15T02:00","2026-10-15T03:00","2026-10-15T04:00","2026-10-15T05:00","2026-10-15T06:00","2026-10-15T07:00","2026-10-15T08:00","2026-10-15T09:00","2026-10-15T10:00","2026-10-15T11:00","2026-10-15T12:00","2026-10-15T13:00","2026-10-15T14:00","2026-10-15T15:00","2026-10-15T16:00","2026-10-15T17:00","2026-10-15T18:00","2026-10-15T19:00","2026-10-15T20:00","2026-10-15T21:00","2026-10-15T22:00","2026-10-15T23:00","2026-10-16T00:00","2026-10-16T01:00","2026-10-16T02:00","2026-10-16T03:00","2026-10-16T04:00","2026-10-16T05:00","2026-10-16T06:00","2026-10-16T07:00","2026-10-16T08:00","2026-10-16T09:00","2026-10-16T10:00","2026-10-16T11:00","2026-10-16T12:00","2026-10-16T13:00","2026-10-16T14:00","2026-10-16T15:00","2026-10-16T16:00","2026-10-16T17:00","2026-10-16T18:00","2026-10-16T19:00","2026-10-16T20:00","2026-10-16T21:00","2026-10-16T22:00","2026-10-16T23:00"],"temperature_2m":[75.5,74.1,72.6,71.8,70.9,70.5,69.8,70.0,74.1,78.4,83.2,86.7,89.3,91.4,92.8,93.0,93.6,93.4,89.5,85.5,82.3,80.3,78.7,77.0,75.8,74.8,74.6,73.7,72.8,71.9,70.8,72.0,80.0,84.7,88.7,92.1,93.6,94.4,95.7,94.8,94.6,93.2,90.0,85.8,82.9,81.1,79.6,77.6,76.5,76.8,76.6,76.0,75.1,74.8,74.1,74.4,78.2,81.6,84.9,89.1,91.1,93.0,94.1,95.0,95.3,94.9,94.2,93.5,92.8,91.7,90.6,89.5,88.4,87.5,86.6,85.9,85.9,85.7,84.8,84.7,86.1,88.4,91.0,92.9,94.4,95.3,96.2,96.9,96.9,96.2,95.1,94.2,92.9,91.9,90.6,89.3,88.3,87.4,87.2,86.5,85.7,84.8,84.5,84.3,85.4,87.4,89.7,92.2,94.0,95.5,96.5,97.1,97.1,96.9,96.5,96.2,95.6,93.7,92.4,91.9,91.1,90.6,89.9,89.0,87.9,87.0,86.3,85.7,86.6,88.1,90.1,92.0,93.7,95.1,96.2,96.9,97.4,97.4,97.1,96.4,95.6,94.9,94.1,93.3,92.5,91.8,91.0,90.2,89.4,88.8,88.3,87.9,88.3,89.9,92.2,94.4,96.2,97.9,99.2,100.1,100.7,100.7,100.1,98.9,97.8,96.9,96.0,95.0,93.8,92.6,91.3,90.1,88.9,88.1,87.7,87.7,88.6,90.8,93.8,96.5,98.6,100.3,101.6,102.3,102.5,102.1,101.1,99.6,98.2,96.9,95.6,94.4,93.0,91.8,90.6,89.7,88.9,88.4,88.1,87.9,88.6,90.8,93.7,96.2,97.8,98.9,99.6,100.0,99.9,99.4,98.5,97.3,96.0,94.9,93.8,92.8,91.7,90.7,89.7,88.7,87.7,87.0,86.3,85.8,86.1,87.7,90.2,92.4,94.3,95.9,97.1,97.6,97.6,97.3,96.4,94.9,93.5,92.0,90.4,89.1,88.3,87.7,87.1,86.1,85.0,84.3,84.1,84.3,85.0,86.6,88.8,90.8,92.4,93.9,94.9,95.3,95.3,95.1,94.9,94.6,94.0,93.3,92.4,91.5,90.7,90.0,89.2,88.3,87.4,86.6,86.0,85.6,85.7,87.1,89.1,90.8,92.0,93.0,93.5,92.9,91.9,91.0,90.7,90.6,90.4,90.2,89.9,89.4,88.8,88.1,87.5,86.8,86.4,85.9,85.6,85.3,85.6,86.6,88.0,89.5,91.1,92.8,94.0,94.7,95.0,94.9,94.3,93.3,92.4,91.7,91.1,90.3,89.6,88.8,88.1,87.5,86.9,86.5,86.1,86.0,86.3,87.4,88.9,90.4,92.0,93.5,94.6,95.0,95.0,94.7,93.8,92.5,91.3,90.2,89.3,88.4,87.7,87.3,86.7,85.9,85.1,84.5,84.1,84.1,84.5,85.6,87.2,88.8,90.8,92.9,93.8,92.6,90.3,88.3,87.0,85.9,84.8,83.6,82.2,80.8,79.2,77.4,75.8,74.7,73.7,73.0,72.2,71.7,71.8,73.0,74.8,76.7,78.5,80.4,81.9,82.6,82.9,82.9,82.7,82.3,81.8,81.2,80.5,79.8],"weather_code":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,51,51,51,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,1,2,3,2,1,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"wind_speed_10m":[3.6,4.9,3.0,1.6,3.2,3.9,2.9,1.6,2.3,3.4,1.1,0.7,0.2,1.4,0.9,1.4,1.8,1.1,3.2,4.6,4.1,0.0,4.4,4.6,4.3,3.5,5.8,5.3,5.4,5.8,4.9,5.2,7.9,8.3,8.7,13.0,13.9,12.8,9.2,14.1,12.2,11.8,7.5,5.2,4.7,5.7,5.3,4.7,5.4,10.7,12.3,9.4,10.0,10.8,11.6,12.3,15.3,17.0,16.2,15.4,14.9,14.1,13.7,13.4,12.6,12.8,11.5,9.9,7.5,7.1,5.4,5.4,5.4,5.6,6.7,8.1,10.1,12.6,11.6,11.4,12.2,15.9,18.0,17.2,17.8,15.5,13.7,13.8,14.1,14.0,14.1,13.2,11.0,10.5,12.0,10.2,6.5,8.8,12.7,12.2,12.0,9.9,9.1,9.0,11.7,13.2,12.5,12.0,11.3,9.7,9.0,7.9,7.2,6.5,6.9,7.2,7.8,8.2,5.1,6.9,6.5,6.1,6.4,6.3,6.2,6.3,5.4,5.4,5.8,6.5,6.5,5.8,5.0,3.9,3.2,2.9,3.8,5.0,5.9,6.5,6.8,5.9,4.5,3.4,3.4,3.6,3.7,3.0,2.1,1.9,2.6,3.4,4.2,4.8,5.2,5.1,4.3,2.8,1.6,2.2,4.3,5.8,5.9,5.4,4.5,3.7,3.7,4.3,3.9,3.4,3.8,4.3,4.7,5.2,5.4,5.5,5.7,6.1,6.8,7.2,6.3,5.3,5.3,6.5,10.0,12.4,11.5,8.6,6.7,7.0,8.1,8.5,7.4,5.8,4.6,4.1,3.7,3.8,4.1,5.2,6.5,8.7,11.3,13.2,13.7,13.5,13.3,13.0,12.3,11.7,11.4,11.2,11.7,13.0,14.8,15.6,14.9,13.2,11.1,8.0,4.5,3.4,3.8,5.4,7.6,10.6,13.9,16.2,16.6,15.8,14.8,13.6,12.2,10.9,9.6,8.2,8.1,10.1,13.0,14.3,12.0,8.4,7.0,7.4,8.0,8.7,9.3,10.3,10.5,9.9,9.6,9.9,9.7,8.8,7.8,6.9,6.0,5.2,4.0,3.4,3.6,2.9,1.8,1.4,1.5,1.9,1.9,1.3,0.7,0.8,1.6,2.4,3.3,4.1,4.9,6.3,9.0,12.4,13.9,12.8,10.1,7.7,5.5,3.5,2.0,1.4,1.8,2.1,2.1,2.3,2.2,2.0,1.8,1.6,1.8,2.0,2.2,2.6,3.1,3.8,4.8,5.8,6.6,6.4,6.0,6.1,7.2,8.6,9.3,9.0,7.8,7.0,6.2,5.4,4.5,3.7,3.2,2.9,2.5,2.2,2.1,2.2,2.7,3.2,3.7,4.6,5.5,7.2,10.4,12.7,12.3,11.0,9.9,8.5,7.0,5.6,4.5,3.8,3.1,2.3,1.8,1.7,1.7,2.1,1.7,1.4,4.3,6.7,8.8,11.5,13.9,15.0,16.2,17.4,16.5,14.6,13.0,11.3,9.7,8.8,9.2,10.7,11.5,9.9,7.4,5.4,4.7,4.5,4.5,4.3,4.3,4.5,5.2,6.3,7.0,7.3,7.2,7.1,7.1,6.9,6.6,5.8,4.8,4.1],"wind_direction_10m":[101,120,73,74,98,100,81,172,101,86,37,18,360,321,76,108,97,143,205,241,229,270,30,129,87,108,106,118,120,113,137,149,119,104,103,101,86,112,93,117,122,119,120,130,115,116,112,90,95,102,102,91,99,96,80,78,82,86,83,103,108,110,112,113,117,123,122,115,113,108,99,97,88,85,84,85,93,86,79,79,82,88,97,108,117,117,118,113,110,112,113,108,108,102,112,105,76,69,73,77,73,76,80,81,86,93,99,104,115,116,120,115,104,98,103,104,87,116,92,94,88,82,80,82,77,73,83,90,90,86,88,86,77,59,34,356,315,297,281,268,261,261,270,281,293,300,308,318,342,21,52,67,72,68,59,52,47,45,16,315,291,286,279,268,264,284,322,348,10,37,62,69,71,72,71,69,72,86,99,106,96,75,68,96,119,128,129,129,127,130,132,133,131,126,119,119,123,118,103,85,82,90,99,106,111,119,123,122,119,119,125,134,138,135,128,125,126,130,132,128,110,82,83,97,104,105,105,104,104,103,104,107,114,121,127,135,141,139,135,131,123,106,81,74,77,78,73,70,70,82,102,115,119,117,117,123,132,137,124,90,68,67,83,108,117,111,111,121,162,236,270,292,290,279,270,264,263,264,264,267,273,278,284,288,297,288,263,252,252,259,264,264,270,270,270,270,276,290,300,306,304,298,294,290,285,276,268,261,259,263,270,277,283,287,290,284,262,247,243,246,257,264,275,278,287,293,284,261,245,239,245,257,267,267,261,254,250,249,249,253,277,293,310,319,310,219,189,194,212,231,244,260,276,285,283,274,266,261,257,255,263,272,278,278,273,270,270,276,279,279,276,276,277,278,279,282,286,290,294,299,303,302,298,292],"wind_gusts_10m":[6.5,8.9,6.0,5.6,6.0,8.5,4.9,3.4,3.1,4.3,4.5,3.4,5.8,10.3,9.8,9.2,11.0,9.8,5.6,5.1,8.3,4.3,6.9,7.2,7.4,4.5,11.6,9.6,9.6,12.1,12.5,17.9,21.3,17.2,15.4,18.8,22.1,19.2,20.1,19.0,18.6,18.3,17.4,10.7,12.5,16.1,12.8,9.8,12.1,17.9,24.2,19.5,22.1,23.0,24.2,29.5,29.8,29.1,25.5,23.3,22.4,23.9,23.0,21.3,17.4,16.0,14.1,13.4,11.6,12.5,11.4,12.1,14.1,17.9,19.9,21.9,23.7,23.7,22.1,21.5,21.3,22.6,23.9,21.9,21.0,18.8,16.6,16.3,16.8,17.0,17.0,16.1,16.3,17.9,19.0,16.3,14.8,19.2,22.4,23.0,23.3,22.4,21.7,21.5,21.9,19.2,17.2,14.8,13.2,9.6,8.5,8.1,8.3,8.7,9.6,9.8,10.5,11.9,11.9,13.0,11.2,10.1,10.1,9.6,8.3,8.5,8.5,7.8,7.6,6.9,6.3,5.6,4.9,4.3,4.0,4.5,5.4,6.0,6.5,6.7,6.7,6.3,5.6,4.9,4.3,3.8,3.4,3.4,3.6,4.0,4.9,6.0,6.7,6.5,5.6,5.1,5.4,5.8,6.5,7.2,7.8,8.1,7.8,7.4,6.9,7.2,7.4,7.6,7.4,7.2,7.4,8.3,9.6,10.3,10.1,9.2,8.5,8.5,8.7,8.9,9.4,10.1,10.7,11.2,11.4,11.6,11.6,11.4,12.1,14.5,17.7,19.5,18.6,16.6,14.1,11.6,8.9,7.4,7.6,9.2,11.0,13.4,16.3,18.1,17.9,16.6,15.2,14.3,13.6,13.4,13.9,15.0,16.6,19.0,21.9,23.7,23.5,22.1,20.6,18.3,15.9,14.3,14.8,16.6,18.1,19.5,20.8,21.3,20.6,19.2,17.9,16.8,15.4,14.5,13.6,13.0,13.4,16.3,20.1,22.4,20.6,17.0,14.8,15.4,17.4,19.0,19.2,19.0,18.1,16.6,14.3,12.3,10.7,9.6,8.5,7.6,6.7,6.0,5.6,5.6,5.1,4.5,3.6,2.9,2.7,2.7,2.7,2.5,2.5,2.7,3.6,4.9,5.8,6.0,6.0,6.3,6.9,8.1,8.7,8.9,8.9,8.3,6.3,3.8,2.0,1.6,2.0,2.5,2.7,2.7,2.7,2.2,1.8,1.6,1.8,2.0,2.5,2.9,3.4,3.8,4.3,4.7,5.1,5.1,5.1,5.4,6.3,7.4,8.5,9.6,10.5,11.0,10.7,10.1,8.9,6.9,4.5,2.7,1.8,1.6,1.6,1.8,2.5,3.4,5.1,7.2,8.9,9.8,10.3,10.7,11.0,11.2,11.0,10.5,10.1,8.9,6.9,4.7,2.9,2.2,2.2,2.2,1.8,1.3,1.8,4.0,7.2,10.5,13.9,17.2,19.7,21.0,21.7,21.7,21.5,20.8,19.5,16.6,13.2,11.0,11.6,13.6,14.3,12.5,9.4,6.9,5.4,4.3,3.6,3.6,4.0,4.5,5.1,5.8,6.3,6.3,6.0,5.8,6.3,6.7,6.9,6.5,5.8,5.1]},"daily_units":{"time":"iso8601","weather_code":"wmo code","temperature_2m_max":"°F","temperature_2m_min":"°F","precipitation_sum":"inch","precipitation_probability_max":"%","wind_speed_10m_max":"mp/h","wind_gusts_10m_max":"mp/h"},"daily":{"time":["2026-10-01","2026-10-02","2026-10-03","2026-10-04","2026-10-05","2026-10-06","2026-10-07","2026-10-08","2026-10-09","2026-10-10","2026-10-11","2026-10-12","2026-10-13","2026-10-14","2026-10-15","2026-10-16"],"weather_code":[0,0,0,0,3,3,0,0,0,0,0,2,1,51,3,1],"temperature_2m_max":[93.6,95.7,95.3,96.9,97.1,97.4,100.7,102.5,100.0,97.6,95.3,93.5,95.0,95.0,93.8,82.9],"temperature_2m_min":[69.8,70.8,74.1,84.7,84.3,85.7,87.9,87.7,87.9,85.8,84.1,85.6,85.3,86.0,80.8,71.7],"precipitation_sum":[0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.024,0.000,0.000],"precipitation_probability_max":[0,1,1,0,0,1,0,0,1,2,3,4,3,3,6,7],"wind_speed_10m_max":[4.9,14.1,17.0,18.0,13.2,6.8,5.9,12.4,15.6,16.6,12.0,13.9,9.3,12.7,17.4,11.5],"wind_gusts_10m_max":[11.0,22.1,29.8,23.9,23.3,11.2,8.1,19.5,23.7,23.5,20.6,8.9,11.0,11.2,21.7,14.3]}}