New
- Add
/weatherSensorData, a compact endpoint for current, forecast, and historical weather values to be used used by OpenSprinkler firmware's WeatherSensor. - Add selectable current, forecast, and historical scopes.
- Add persistent multi-day history for local personal weather stations.
Improvements
- Normalize historical observations into complete local calendar days, including daylight-saving transitions.
- Improve ETo calculation, validation, and handling of incomplete historical data.
- Improve weather-data normalization across Apple WeatherKit, Open-Meteo, DWD, AccuWeather,
OpenWeather, Pirate Weather, Bright Sky, and Weather Underground. - Share provider caches between adjustment, forecast, and weather-sensor requests.
- Coalesce concurrent cache misses to reduce duplicate provider requests.
- Improve geocoder cache persistence.
- Honor
format=jsonfor watering-adjustment error responses. - Update the container runtime to Node.js 24.
- Expand API, configuration, provider, and testing documentation.
Fixes
- Allow Zimmerman calculations from local weather stations that do not report wind or solar
radiation (#178). - Restore support for configuring the server with the documented
PORTenvironment variable
(#179). - Correct humidity, precipitation, wind, solar-radiation, and forecast normalization issues
across multiple providers. - Improve handling of missing, zero, stale, and malformed provider values.
Compatibility
Existing /0 through /3, /weatherData, and legacy weatherX.py routes remain supported.
Legacy watering-adjustment response formatting remains the default unless format=json is
requested.
Local weather persistence incorporates work proposed by @mpietruschka in #144 and @ruimarinho
in #150.
Full Changelog:
3.0.2...3.1.0