Skip to content

Adaptive Cover Pro ⛅ v2.28.0-beta.14

Pre-release
Pre-release

Choose a tag to compare

@jrhubott jrhubott released this 17 Jun 13:31
· 107 commits to main since this 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_data refactor 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.

References