Adaptive Cover Pro ⛅ v2.29.0-beta.2
Pre-releaseℹ Using release notes from: release_notes/v2.29.0-beta.2.md
Highlights
This is the second beta of the 2.29 series. On top of the four features and two fixes that shipped in beta.1, this build adds two new capabilities — a restructured 4-layer config-flow setup UI and runtime-configurable built-in handler priorities — plus four bug fixes: a diagnostics refresh-on-empty path before export, consolidated daytime-gate source tracking for immediate reposition, correct dispatch of night and custom positions when the gate is dark but the clock window is still open, and an off-event-loop boot path that avoids a blocking tzdata import during startup. All new beta.2 work is additive and behavior-preserving for existing installs; no reconfiguration is required. Testing and feedback are welcome before the stable release.
Added
-
Runtime-configurable built-in handler priorities (#651): Each built-in pipeline handler's priority can now be overridden at the config-entry level without editing source code. The new
resolve_handler_priorityfunction reads per-handler overrides from options and falls back to the compiled-in default;pipeline_priorities_schemadefines the options-service schema for validation. Existing installs get no change in behavior — all handlers continue to run at their current default priorities unless an override is explicitly set. Advanced users can lower or raise individual handlers (e.g. promotecloud_suppressionabovemanual_override) without patching the integration. -
Config flow restructured into a 4-layer pipeline setup UI (#613, #614): The config and options flows are reorganized around four explicit steps — behavior, position, automation, and diagnostics — driven by
async_step_behaviorand assembled viabuild_priority_chainandclass PriorityChainEntry. The change eliminates the flat single-step form that became unwieldy as options grew, and gives each concern its own screen. Existing config entries are migrated transparently; no user action is required. Thanks to @zigomatichub (#613) for surfacing this. -
End-of-window close position (#625, #647): A new optional setting lets you configure a fixed close position that applies when the automation window ends, independently of sunset behavior. Previously the only options were the sunset position or the default. Setting
CONF_END_OF_WINDOW_POSmakes the cover move to a specific position at end-of-window; leaving it unset (None) preserves existing behavior exactly. Existing installs need no action. -
Daytime gate for sunset/sunrise automation (#632, #641): Sunset and sunrise position changes can now be gated on a binary sensor (
CONF_GATE_ENTITY) or a Jinja template (CONF_GATE_TEMPLATE). When the gate is inactive, the integration skips the sunset/sunrise position push — useful for installs where the sun schedule should not apply on cloudy days or during occupancy patterns. Both options default toNone; existing installs are unaffected. -
Jinja template option for is_sunny, presence, and weather sensors (#639, #646): The is_sunny, presence, weather-is-raining, and weather-is-windy inputs now accept Jinja2 templates in addition to entity IDs. Four new template keys (
CONF_IS_SUNNY_TEMPLATE,CONF_PRESENCE_TEMPLATE,CONF_WEATHER_IS_RAINING_TEMPLATE,CONF_WEATHER_IS_WINDY_TEMPLATE) and corresponding template-mode toggles (CONF_IS_SUNNY_TEMPLATE_MODE,CONF_PRESENCE_TEMPLATE_MODE,CONF_WEATHER_IS_RAINING_TEMPLATE_MODE,CONF_WEATHER_IS_WINDY_TEMPLATE_MODE) are available. Templates are resolved viarender_condition_or_none()andfold_condition_template(). All keys default toNone; existing entity-based configurations continue to work without change. -
Sun-tracking min position honored in summer climate close (#631, #648): The summer climate close path in
ClimateCoverState.get_state()now callsapply_snapshot_limits()before returning a position, which means the configured sun-tracking minimum position is respected. Previously, a summer-close command could move the cover below the sun-tracking min. No configuration change is needed; the behavior refinement applies automatically.
Fixed
-
Diagnostics download triggers coordinator refresh when data is empty (#660): The diagnostics export endpoint now calls
async def _refresh()before building the payload when coordinator data isNone. Previously, downloading diagnostics immediately after HA restart — before the first scheduled update — returned an empty or incomplete response. The two new tests (test_data_none_triggers_refresh_then_returns_full_diagnostics,test_data_present_does_not_trigger_refresh) confirm the refresh fires only when needed and is skipped on subsequent calls. -
Daytime-gate sources tracked for immediate reposition (#632, #659): Gate entity and template registrations are now consolidated through
_register_template_tracker, and state changes are routed throughasync_check_daytime_gate_template_change. Previously, a gate state change did not reliably trigger an immediate reposition — the cover would wait for the next scheduled cycle. The consolidated tracking path fires a coordinator refresh as soon as the gate opens or closes. Thanks to @MSL-DA (#632) for surfacing this. -
Night and custom positions dispatched when gate is dark but clock window is open (#656, #658): When the daytime gate is inactive (dark) but the clock-based automation window is still open, the coordinator was skipping the night and custom-position dispatch entirely. The fix introduces
clock_window_openas a distinct flag in_compute_data_window, separating "is it daytime?" from "is the automation window active?" so that night and custom positions are correctly applied regardless of gate state. Thanks to @isi07 (#656) for surfacing this. -
SunData cache primed off the event loop to avoid tzdata blocking at boot (#655, #657): The call to
prime_cachein the coordinator's startup path was issued on the event loop, causing a blocking tzdata file import that could stall HA startup under certain Python/tzdata combinations. The cache is now primed in an executor to keep the event loop free. Thanks to @MSL-DA (#655) for surfacing this. -
Template keys for is_sunny/presence/weather now registered in
SYNC_CATEGORIES(#649): The four template-mode config keys (CONF_IS_SUNNY_TEMPLATE_MODE,CONF_PRESENCE_TEMPLATE_MODE,CONF_WEATHER_IS_RAINING_TEMPLATE_MODE,CONF_WEATHER_IS_WINDY_TEMPLATE_MODE) added in #639 were missing fromSYNC_CATEGORIESinconfig_flow.py, which controls which option keys propagate across related config entries. This fix ensures the template-mode selections sync correctly. -
Oscillating awning arm_length UI cap raised to 6 m (#636, #640): The
_RANGE_ARM_LENGTHupper bound in the config UI was capped below the real-world maximum, blocking users with longer arms from entering accurate values. The cap is now 6.0 m. Thanks to @muhamedfazalps (#637) for surfacing this. -
Resolved options used on apply-user-position path (#643, #644):
async_apply_user_position()was reading raw config-entry options rather than_resolved_options, so any option that requires rendering (such as template-based thresholds) arrived unrendered on the manual-control path. The fix ensures the resolved cache is used, consistent with the scheduled update path.
Testing
- Full suite at 4710 passing.
Compatibility
Requires Home Assistant 2026.3.0+. The companion Lovelace card (jrhubott/adaptive-cover-pro-card) is a separate repo with its own release cycle.