Skip to content

Adaptive Cover Pro ⛅ v2.30.0-beta.1

Pre-release
Pre-release

Choose a tag to compare

@jrhubott jrhubott released this 25 Jun 23:59
· 52 commits to main since this 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 (key venetian_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_tilt counter tracked by DualAxisSequencer. When the counter reaches the threshold, the sequencer drives the slats fully open (to POSITION_OPEN, bypassing any configured tilt max) and back to the original target position, flushing mechanical actuator drift. A _reset_in_progress guard prevents the two re-zero sends from themselves re-accumulating. The default is DEFAULT_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 key enable_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_update rebuilds the pipeline in place without a reload; CONF_ENABLE_SUN_TRACKING is listed in _RUNTIME_APPLICABLE_OPTIONS so the update listener applies it without triggering a config-entry reload. The GlareZoneHandler (priority 45, vertical covers only) is now aware of the tracking state: when enable_sun_tracking is off, glare-zone protection can still override if its computed position is more protective than the compute_default_position result, as determined by more_protective_position; apply_snapshot_limits enforces 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 option CONF_ENFORCE_DELTA_AT_ENDPOINTS (key enforce_delta_at_endpoints, default False) 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_positions returns [0, 100] and the tilt special-position bypass is in effect. When opted in, build_special_positions returns an empty list and check_position_delta runs 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 to SYNC_CATEGORIES.

Fixed

  • Venetian coupled-tilt recovery after set_cover_position (#679, #680): On mechanically coupled venetians, a set_cover_position command 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_satisfied now compares the stored target against the live actuator reading via _resolve_tilt_anchor; it returns True only when the stored target matches the live reading within VENETIAN_TILT_VERIFY_TOLERANCE. When the live reading has drifted out of tolerance, the dedup returns False and the tilt command is re-sent, restoring the correct slat angle. This fix is always on — it is not gated by CONF_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.