Adaptive Cover Pro ⛅ v2.30.0-beta.1
Pre-releaseℹ Using release notes from: release_notes/v2.30.0-beta.1.md
Highlights
2.30.0-beta.1 is the first beta of the 2.30 series, focused almost entirely on venetian and coupled-cover behavior. The three functional changes are: a venetian drift-reset threshold that flushes accumulated actuator drift by driving slats through a full open-and-back cycle; a Sun Tracking switch that lets you pause solar position tracking at runtime while keeping glare-zone protection active; and a combined fix and opt-in for mechanically coupled venetians, where a live-actuator dedup check corrects silent tilt-axis drift and a new enforce_delta_at_endpoints option lets a coupled cover park near-endpoint instead of chasing an unreachable 0 or 100. All three new options default to off — CONF_VENETIAN_TILT_RESET_THRESHOLD defaults to 0 (disabled), CONF_ENABLE_SUN_TRACKING defaults to True (tracking stays on as before), and CONF_ENFORCE_DELTA_AT_ENDPOINTS defaults to False — so upgrading from v2.29.0 changes nothing without reconfiguration. Venetian and coupled-cover users are especially encouraged to test and report.
Added
-
Venetian drift-reset threshold (#663, #681): A new per-instance option
CONF_VENETIAN_TILT_RESET_THRESHOLD(keyvenetian_tilt_reset_threshold) sets an accumulated commanded-tilt-% threshold that triggers a mechanical drift-reset cycle. Each tilt command sent to the hardware — after dedup, delta gating, and dry-run checks — adds the absolute change from the prior anchor to a per-entity_accumulated_tiltcounter tracked byDualAxisSequencer. When the counter reaches the threshold, the sequencer drives the slats fully open (toPOSITION_OPEN, bypassing any configured tilt max) and back to the original target position, flushing mechanical actuator drift. A_reset_in_progressguard prevents the two re-zero sends from themselves re-accumulating. The default isDEFAULT_VENETIAN_TILT_RESET_THRESHOLD=0, which disables the feature entirely; range is 0–5000 accumulated %. The threshold can be changed without a reload and takes effect on the next tilt cycle. Thanks to @x4N70pHyLL (#663) for surfacing this. -
Sun Tracking switch; glare-zone protection without sun tracking (#678): A new "Sun Tracking" switch (
CONF_ENABLE_SUN_TRACKING, option keyenable_sun_tracking) exposes runtime control over whether the solar position engine drives cover movement. The switch defaults to on (True), so all existing installs continue to track the sun exactly as before. When toggled off,async_apply_sun_tracking_updaterebuilds the pipeline in place without a reload;CONF_ENABLE_SUN_TRACKINGis listed in_RUNTIME_APPLICABLE_OPTIONSso the update listener applies it without triggering a config-entry reload. TheGlareZoneHandler(priority 45, vertical covers only) is now aware of the tracking state: whenenable_sun_trackingis off, glare-zone protection can still override if its computed position is more protective than thecompute_default_positionresult, as determined bymore_protective_position;apply_snapshot_limitsenforces sun-dependent limits only when tracking is on. Thanks to @Zhephyr54 (#678) for contributing this feature and for filing issue #498. -
Opt-in endpoint delta enforcement for coupled covers (
enforce_delta_at_endpoints, #679, #680): A new boolean optionCONF_ENFORCE_DELTA_AT_ENDPOINTS(keyenforce_delta_at_endpoints, defaultFalse) brings the min-change delta gate to endpoint commands. By default (DEFAULT_ENFORCE_DELTA_AT_ENDPOINTS=False), the always-send-to-0/100 guarantee introduced in #629 is preserved byte-for-byte:build_special_positionsreturns[0, 100]and the tilt special-position bypass is in effect. When opted in,build_special_positionsreturns an empty list andcheck_position_deltaruns for endpoint targets too — useful on mechanically coupled covers where sending a full-open or full-close command disturbs the tilt axis and the actual hardware endpoint is unreachable (e.g. the cover parks at 3 rather than 0). Enabled via the config flow (Boolean selector, default off) and added toSYNC_CATEGORIES.
Fixed
- Venetian coupled-tilt recovery after
set_cover_position(#679, #680): On mechanically coupled venetians, aset_cover_positioncommand back-drives the tilt actuator, leaving the stored tilt target stale. The previous stored-target dedup (tilt_target == self._tilt_targets.get(entity_id)) silently discarded the next intended tilt command even when the actuator had drifted._target_already_satisfiednow compares the stored target against the live actuator reading via_resolve_tilt_anchor; it returnsTrueonly when the stored target matches the live reading withinVENETIAN_TILT_VERIFY_TOLERANCE. When the live reading has drifted out of tolerance, the dedup returnsFalseand the tilt command is re-sent, restoring the correct slat angle. This fix is always on — it is not gated byCONF_ENFORCE_DELTA_AT_ENDPOINTS. Thanks to @elmakus (#679) for reporting this.
Testing
4792 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.