Adaptive Cover Pro ⛅ v2.28.0-beta.14
Pre-releaseℹ Using release notes from: release_notes/v2.28.0-beta.14.md
Beta.14 fixes a crash in the climate status sensor when threshold options are stored as strings, and migrates coordinator storage to Home Assistant's typed ConfigEntry.runtime_data API.
🎯 Highlights
Beta — please test and report back.
- If you have a climate-mode cover with numeric temperature thresholds, open the climate status sensor's attributes and confirm the threshold values display correctly. This fix targets setups where thresholds were configured after #577 introduced the TemplateSelector — those entries can persist the value as a string like
"20"or"20,5"rather than a float, which previously caused the sensor to crash on startup. - Confirm the sensor also handles Jinja2 template strings in threshold fields without crashing — template strings should now surface as no threshold value rather than raising.
- All other cover behavior is unchanged. The
runtime_datarefactor is internal plumbing; verify that cover entities, sensors, switches, buttons, and numbers all load and update normally after a restart.
🐛 Bug Fixes
Climate status sensor crashes when threshold options are stored as strings (#619)
After #577 switched threshold configuration to a TemplateSelector, threshold options can be persisted as strings — "20", "20.5", or locale comma-decimal variants like "20,5" — rather than floats. _round_threshold in sensor.py previously assumed a float and raised a TypeError on string inputs, crashing the climate status sensor at startup for any config entry that stored a threshold in that form.
_round_threshold now accepts float | str | None. It normalizes comma-decimal strings by replacing the comma separator before coercing to float, handles plain numeric strings ("20", "20.5"), and returns None for non-numeric inputs such as raw Jinja2 template strings — so a template threshold no longer crashes the sensor, it simply reports no threshold value. Regression tests covering all four input forms (string int, string float, comma-decimal, template string) were added in tests/test_sensor_climate_attrs.py under TestClimateStatusThresholdStringOptions. The fix shipped via #620.
🧹 Chores
Migrate coordinator storage to ConfigEntry.runtime_data
The coordinator was previously stored in the legacy hass.data[DOMAIN][entry_id] registry. All platform async_setup_entry paths (binary_sensor, button, cover, number, sensor, switch) and the services module now read the coordinator from entry.runtime_data instead. An AdaptiveConfigEntry type alias captures the typed entry shape, and a loaded_coordinators() helper in coordinator.py replaces ad-hoc dict lookups in the services layer. No user-facing behavior changes.
Previously in this beta line
- Vertical-drop shade model for the oscillating awning, anticipatory solar positioning across the throttle window (beta.13, #586, #616)
- Position matching preserved for covers upgraded from earlier in the beta line; held position surfaced in the manual-override decision trace (beta.12, #591, #606, #608)
Compatibility
Requires Home Assistant 2026.3.0+. No new coupled-component requirements.