Skip to content

Adaptive Cover Pro ⛅ v2.29.0-beta.2

Pre-release
Pre-release

Choose a tag to compare

@jrhubott jrhubott released this 23 Jun 02:41
· 74 commits to main since this 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_priority function reads per-handler overrides from options and falls back to the compiled-in default; pipeline_priorities_schema defines 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. promote cloud_suppression above manual_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_behavior and assembled via build_priority_chain and class 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_POS makes 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 to None; 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 via render_condition_or_none() and fold_condition_template(). All keys default to None; 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 calls apply_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 is None. 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 through async_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_open as 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_cache in 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 from SYNC_CATEGORIES in config_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_LENGTH upper 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.