Skip to content

Adaptive Cover Pro ⛅ v2.29.0-beta.3

Pre-release
Pre-release

Choose a tag to compare

@jrhubott jrhubott released this 24 Jun 04:26
· 64 commits to main since this release

ℹ Using release notes from: release_notes/v2.29.0-beta.3.md

Highlights

This is the third beta of the 2.29 series. Building on the six features and eight fixes from beta.1 and beta.2, this build adds one new capability — the Control Status tracker entity now surfaces which custom-position slot is actively fixing tilt for tilt-only contributions — plus five fixes: tilt min-delta gate bypass for special positions 0/100, lux and irradiance switches gated on cloud suppression in addition to climate mode, resolution of ACP-owned non-cover entity service targets, manual override engagement on context-less remote moves with no recorded command target, and awning pivot-to-pane offset modeling with monotone low-sun shade correction. A new optional CONF_AWNING_PIVOT_OFFSET setting is introduced for oscillating awnings (default 0.0 m, flush mount — no behavior change for existing installs). All other beta.3 work is additive and behavior-preserving; no reconfiguration is required. Testing and feedback are welcome before the stable release.

Added

  • Runtime-configurable built-in handler priorities (#651): The built-in pipeline handler priorities (weather, manual override, motion timeout, cloud suppression, climate, glare zone, solar) can now be reconfigured rather than being fixed constants.
  • Config flow restructured into a 4-layer pipeline setup UI (#613, #614): The configuration flow is now organized into a four-layer pipeline setup for clearer, staged configuration.
  • 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. Leaving it unset preserves existing behavior exactly.
  • Daytime gate for sunset/sunrise automation (#632, #641): Sunset and sunrise position changes can now be gated on a binary sensor or a Jinja template. 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. 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 now respects the configured sun-tracking minimum position before returning a position.
  • Active tilt-only custom slot surfaced in Control Status (#667, #671): The Control Status tracker entity now shows which custom-position slot is actively fixing the tilt angle via tilt-only contributions. When a slot applies its tilt overlay to the position winner, PipelineResult.tilt_only_slot is set and the position explanation and control state reason both gain a "tilt fixed by Custom #N" annotation. The field is None when no tilt-only slot fired or when the slot was deferred because the position winner already set tilt (TiltAxisContribution.slot carries the slot identity through the registry).

Fixed

  • Diagnostics download triggers coordinator refresh when data is empty (#660): Downloading diagnostics now forces a coordinator refresh when data is empty, so the export isn't blank.
  • Daytime-gate sources tracked for immediate reposition (#632, #659): Daytime-gate sources are now tracked so a gate change repositions the cover immediately.
  • Night and custom positions dispatched when gate is dark but clock window is open (#656, #658): Night and custom positions are now dispatched correctly when the daytime gate reads dark but the clock window is still open.
  • SunData cache primed off the event loop to avoid tzdata blocking at boot (#655, #657): The SunData cache is primed off the event loop, avoiding a blocking tzdata import during startup.
  • Template keys for is_sunny/presence/weather now registered in SYNC_CATEGORIES (#649): The four template-mode config keys are now registered so the template-mode selections sync correctly across related config entries.
  • Oscillating awning arm_length UI cap raised to 6 m (#636, #640): The arm_length config UI cap is now 6.0 m. Thanks to @muhamedfazalps (#637) for surfacing this.
  • Resolved options used on apply-user-position path (#643, #644): The manual-control apply-user-position path now uses the resolved options cache, consistent with the scheduled update path.
  • Tilt min-delta gate bypassed for special positions 0 and 100 (#629, #672): Tilt commands targeting fully-open (100) or fully-closed (0) now bypass the min-delta drift-suppression gate via _TILT_SPECIAL_POSITIONS. Previously a venetian blind in tilt-only mode could silently swallow an explicit 0 or 100 tilt command when the actuator was already within the configured delta threshold — mirroring the bypass that the position axis already applied.
  • Lux and irradiance switches now gated on cloud suppression as well as climate mode (#668, #670): The _has_lux_feature() and _has_irradiance_feature() predicates now show the lux/irradiance toggle switches when cloud suppression is enabled, regardless of whether climate mode is on. Previously a configuration using cloud suppression without climate mode would not surface these switches even though the lux/irradiance entities were actively used.
  • ACP-owned non-cover entity service targets resolved correctly (#665, #666): _resolve_targets() now includes an entity registry fallback so diagnostic sensors, switches, and buttons owned by an ACP config entry can be used as service call targets. Previously targeting a diagnostic entity (e.g. sensor.*_decision_trace) silently no-opped because the entity was not in the coordinator's cover-entity list.
  • Override engaged on context-less remote move with no recorded command target (#654, #662): DetectionContext.old_position is now carried into position delta detection so a physical-remote move (no HA user context) with no prior ACP command can be distinguished from a resting-position republish. A genuine move — where the position changed between old and new state by more than the effective threshold — now engages manual override. A cover simply republishing its resting position (old ≈ new) remains suppressed per issue #546.
  • Awning pivot-to-pane offset modeled; monotone low-sun shade corrected (#586, #661): Introduces an optional CONF_AWNING_PIVOT_OFFSET setting (stored in OscillatingConfig.pivot_offset, default DEFAULT_AWNING_PIVOT_OFFSET = 0.0 m). The horizontal standoff of the arm/housing from the window glass is now added to the lip's projected reach, so at low sun the dropped fabric shades further down the pane on wall-mounted awnings. A monotone-coverage constraint is also applied: the solver now operates on the running floor of the raw lip-shadow array, ensuring the awning is never credited with less shade as it extends further — which eliminates a false mid-sweep optimum that previously drove the position to a partial angle at very low sun instead of full extension. Existing installs are unaffected (pivot_offset defaults to 0.0, reproducing the prior model exactly).

Testing

4735 tests 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.