v1.8.6
🌼 Pollen Levels v1.8.6
✨ Stable release since 1.8.3.
Focus: map-based setup, safer coordinates and titles, faster manual refresh, and cleaner tooling/runtime alignment.
🚀 Highlights (since 1.8.3)
🗺️ Map-first setup & safer coordinates (1.8.5)
- The setup flow now uses a map-based location selector instead of raw latitude/longitude fields.
- Defaults to your Home Assistant location (name + coordinates) when valid, and validates coordinates using HA helpers.
- Invalid or missing HA coordinates are dropped instead of pre-filling the map at
(0,0)or empty locations, and when HA has no usable location the selector simply stays empty until you pick a point. invalid_coordinateserrors and translations have been updated to talk about choosing a valid map location, not typing numeric values.- Config and re-auth flows still expose short, sanitized error messages for
cannot_connect, while setup errors no longer show raw HTTP status codes and options flows use generic localized connectivity messages.
🏷️ Cleaner device titles & options UX (1.8.5–1.8.6)
- Device names now include the config entry title (for example,
Home – Pollen Types) while keeping existing identifiers intact. - Empty or whitespace-only titles are normalized to a sensible default name, avoiding blank device labels.
- Options flow descriptions also display the entry title and map unexpected validation errors to a generic
unknownmessage instead of implying connectivity failures.
⚡ Faster manual refresh for multi-location setups (1.8.6)
- The
pollenlevels.force_updateservice now refreshes all entry coordinators in parallel, so manual updates are much faster when multiple locations are configured. - Per-entry results and failures are logged against the right entries, even if some coordinators are missing, and a single failure no longer aborts other refreshes.
🐍 Python & Home Assistant alignment (1.8.6)
- Runtime integration code remains compatible with Home Assistant’s Python 3.13 floor.
- Tooling (formatters, linters, etc.) targets Python 3.14+, and tests enforce
requires-python = ">=3.14". - The minimum Home Assistant version is now 2025.3.0, and the integration version is finalized at 1.8.6.
🧪 Stronger tests & simpler runtime validation (1.8.4–1.8.6)
- Added Home Assistant type hints for sensor setup and coordinator helpers, guarded so the lightweight test harness works without a full HA install.
- Hardened the asyncio test hook and HA stubs to better mirror entity callbacks, fail fast on unexpected running loops, and restore prior loops once tests finish.
- Stub coordinators now stamp a placeholder
last_updatedon initial refresh to better match HA semantics. - Runtime revalidation of coordinates and forecast ranges has been simplified: config and options flows now enforce these values, leaving just a minimal guard for corrupted entries.
- Per-day cleanup coverage for D+1/D+2 sensors is consolidated into a single parametrized test, keeping coverage while reducing duplication.
- Test helpers gained bounds checks and manifest metadata consistency checks to catch misconfigurations earlier in CI.
🔧 Detailed changes
1.8.6 – Parallel force_update, Python/HA alignment, simplified validation
Changed
- Parallelized the
pollenlevels.force_updateservice so it refreshes all entry coordinators concurrently and logs per-entry failures without aborting other updates. - Aligned
force_updateresult logging with the entries that spawned refresh tasks so errors are attributed to the correct location. - Clarified tooling-versus-runtime Python guidance: integration code targets Home Assistant’s Python 3.13 floor, while tooling targets Python 3.14+.
- Added Home Assistant type hints for sensor setup and coordinator helpers and guarded imports so the lightweight test harness can run without the full Home Assistant package installed.
- Hardened tests by:
- enforcing
requires-python >= 3.14, - verifying sensor device metadata trims or defaults titles,
- strengthening the asyncio test hook and stubs,
- and stamping stub coordinators with placeholder
last_updatedvalues.
- enforcing
- Raised the minimum Home Assistant requirement to 2025.3.0 and finalized the integration version at 1.8.6.
- Simplified runtime validation by relying on config and options flows for coordinates and forecast ranges, keeping only a minimal guard for missing/corrupted entries.
- Consolidated per-day cleanup coverage into a single parametrized test covering D+1/D+2 removal combinations without duplicating setup code.
1.8.5 – Map-based setup & UX improvements
Changed
- Sanitized map selector defaults and suggested values to drop invalid Home Assistant coordinates instead of pre-filling the map at
(0,0)or an empty location, keeping setup reliable even when core location settings are missing. - Normalized config entry titles and device translation placeholders to fall back to the default name when users supply blank or whitespace-only titles, preventing empty device labels in the UI.
- Cleared stale
error_messageplaceholders when unexpected errors surface asunknownin the config flow to avoid misleading details in the setup form. - Trimmed whitespace-only names in the
ConfigEntrytest stub to mirror runtime title handling and keep test behavior aligned with production. - Avoided suggesting null map coordinates when Home Assistant has no valid location, keeping the selector empty until the user picks a point.
- Simplified user-facing connection errors during setup by removing raw HTTP status codes from the
error_messageplaceholder while retaining detailed logging for debugging. - Hardened the map selector defaults to validate Home Assistant coordinates and fall back to a safe entry title when core configuration values are missing or invalid, keeping setup usable in edge cases.
- Expanded the Home Assistant constant test stub with common config keys to improve isolation of sensor tests without altering runtime behavior.
- Fixed legacy coordinate validation to surface
invalid_coordinateson the appropriate field:- the map location when present,
- base-level only for legacy lat/lon reauth forms;
and aligned the longitude test stub with Home Assistant’s invalid-type behavior. Unexpected validation errors now map tounknown.
- Simplified options-flow connectivity errors to use generic localized messages without the
error_messageplaceholder, keeping detailed HTTP context limited to setup and reauthentication flows. - Updated
invalid_coordinatestranslations across all locales to reference selecting a valid location on the map instead of entering raw latitude/longitude values. - Removed the unused entry-name constant and cleaned up import declarations to drop dead code without altering entity identifiers.
- Removed the unused
options.error.invalid_coordinatestranslation key across all locales to keep translation strings aligned with the current options flow. - Updated options flow descriptions so they:
- show the config entry title, and
- map unexpected validation errors to the generic
unknownmessage instead of implying connectivity failures.
- Switched the setup form to a map-based location selector that defaults to the Home Assistant location name and coordinates while validating latitude/longitude with Home Assistant helpers.
- Updated config-flow messaging and translations to reflect the new map selector and include richer connection and location validation errors.
- Added sanitized
error_messageplaceholders tocannot_connectresponses in the config and reauthentication flows so users see short reasons for HTTP, timeout, and malformed response failures without exposing secrets. - Updated the remaining locale setup descriptions to reference selecting a location on the map instead of entering latitude and longitude manually.
- Replaced Home Assistant common translation placeholders with explicit labels across all locales so the custom integration strings render correctly in setup and options.
- Updated device names to include the config entry title (for example,
Home – Pollen Types) while keeping identifiers unchanged for existing entities.
Added
- Expanded config flow tests to cover:
- map selector input,
- coordinate edge cases,
- connectivity failures,
while ensuring normalized coordinates are stored in entries.
- Added regression coverage ensuring
error_messageis set when validation maps tocannot_connect, keeping the new placeholder behavior guarded.
1.8.4 – Test helpers & manifest hygiene
Fixed
- Added a bounds check to the sensor test
SequenceSessionhelper so exhausting the fake response list raises a clearAssertionErrorinstead of anIndexError. - Added metadata consistency tests to keep the package name/version aligned with the manifest and catch missing fields early in CI.
- Corrected the manifest JSON formatting so metadata parses cleanly without trailing separators.
If you’re upgrading from 1.8.3 or earlier, pay special attention to:
- The new map-based setup and error messages in config/options flows.
- The minimum Home Assistant 2025.3.0+ requirement.
pollenlevels.force_updatebehavior with multiple locations and the new per-entry logging.
As always, bug reports and feedback are very welcome. 💬
What's Changed
- Format test suite by @eXPerience83 in #37
- Configure Renovate by @renovate[bot] in #38
- Update actions/checkout action to v6 by @renovate[bot] in #39
- Update actions/setup-python action to v6 by @renovate[bot] in #40
- Improve config validation logging and test robustness by @eXPerience83 in #42
- Add map-based location selector for configuration by @eXPerience83 in #43
- Bump to 1.8.6-alpha1 and refine typing and tests by @eXPerience83 in #45
New Contributors
Full Changelog: v1.8.3...v1.8.6