Adaptive Cover Pro ⛅ v2.30.0-beta.2
Pre-releaseℹ Using release notes from: release_notes/v2.30.0-beta.2.md
Highlights
2.30.0-beta.2 adds diagnostic transparency and two more venetian/override options on top of beta.1's foundation. The six functional changes: a live solar_calculation sensor that surfaces the per-cycle geometric trace (sun elevation, gamma, computed position, and engine-specific intermediates) for every cover type; a follow-up that populates the sensor's attributes with sun inputs and a status reason even when the sun is outside the tracking window; a correction to the venetian proxy that now drives only the slat axis when a tilt is requested — previously the carriage moved instead; a new set_tilt service for automation use; a configurable drift-reset direction so hardware that rests near-closed can flush accumulated tilt drift faster; and input-sensor override detection for physical wall switches. CONF_VENETIAN_TILT_RESET_DIRECTION defaults to VENETIAN_TILT_RESET_OPEN — the prior hardcoded behavior — and CONF_MANUAL_OVERRIDE_INPUT_ENTITIES defaults to an empty list. Upgrading from beta.1 changes nothing without reconfiguration. Venetian users, users with physical wall switches, and anyone who uses the developer diagnostics are the most likely to see a difference; feedback on all six areas is welcome.
Added
-
Live
solar_calculationdiagnostic sensor for all cover types (#682, #683): Each cover now gets asolar_calculationsensor whose state is the per-cycle computedposition_pctand whose attributes carry the full geometric trace: sun elevation, gamma, engine-specific intermediates, and for venetian covers a nestedtiltsub-trace. The calc engines (vertical, horizontal, tilt, venetian) record their raw inputs and outputs in_last_calc_detailseach cycle.DiagnosticsBuilder._round_traceand_round_trace_valueround every numeric leaf at the presentation boundary and stampcover_typeandstatusbefore the data reaches the sensor or the diagnostics download. The sensor state is numeric and readsunknownwhen there is no solar target (see the fix below for when that happens). -
Configurable Venetian drift-reset direction (#686) (#690): A new per-instance option
CONF_VENETIAN_TILT_RESET_DIRECTION(keyvenetian_tilt_reset_direction, select:open/close) controls which mechanical endpoint the drift-reset drives the slats through before re-sending the target. The default isVENETIAN_TILT_RESET_OPEN(DEFAULT_VENETIAN_TILT_RESET_DIRECTION), which preserves the existing behavior — drive fully open then back. Set toVENETIAN_TILT_RESET_CLOSEon hardware that rests near-closed during sun tracking (quieter, faster reset) or that re-zeroes the slat actuator on a close command. The direction is wired through the same live-lambda path as the threshold so an options change takes effect without a reload; valid values are listed inVENETIAN_TILT_RESET_DIRECTIONS. Upgrading from beta.1 changes nothing without reconfiguration. Thanks to @elmakus (#686) for requesting this. -
Manual override detection from external input sensors (#688) (#691): A new per-instance option
CONF_MANUAL_OVERRIDE_INPUT_ENTITIES(keymanual_override_input_entities, multi-entity selector) accepts a list of binary sensors whose off→on edge engages manual override on every cover in the instance. Intended for a physical wall switch wired to an input (e.g. a Shelly 2PM exposingbinary_sensor.*_cover_input_0): pressing it pauses automatic control for the configured override duration instead of inferring a manual move from the cover's reported position. The edge filter is strict — on→on, None→on (startup restore), and unavailable/unknown states all do nothing. Each press re-arms the full override duration. Combine with "Only engage manual override from Adaptive Cover Pro commands" to make these sensors the sole override trigger. Defaults to an empty list (feature disabled) — upgrading from beta.1 changes nothing. Thanks to @elmakus (#688) for requesting this. -
set_tiltservice for the slat/tilt axis (#684) (#685): A newadaptive_cover_pro.set_tiltservice lets automations drive the venetian slat axis without touching the carriage. The service delegates toasync_apply_user_tilt, which routes through theapply_user_tiltpolicy hook:VenetianPolicydrives only the slats via the sequencer; other cover types fall back to the position path. Aforceparameter (defaultfalse) governs manual-override engagement, matchingset_positionsemantics. Implemented inset_tilt_service.pyviaasync_handle_set_tilt.
Fixed
-
Proxy tilt drove the carriage, not the slats (#684) (#685): The venetian proxy's
async_set_cover_tilt_positionwas callingasync_apply_user_positionwith the requested tilt value, which moved the carriage to that number and left the slats at whatever angle they held. It now callsasync_apply_user_tilt, which dispatches throughVenetianPolicy.apply_user_tilttoDualAxisSequencer.update_tilt_onlywithforce=True— the carriage is never commanded. Theforceflag onupdate_tilt_onlybypasses the target-unchanged dedup so a user re-requesting the current tilt value still fires. -
solar_calculationattributes blank outside the solar window (#682): When the sun was outside the tracking window the solar handler never ran, so_last_calc_detailswasNoneand the sensor readunknownwith empty attributes.DiagnosticsBuilder._build_position_calc_detailsnow emits a minimal fallback trace —sol_elev_deg,gamma_deg,position_pct=None— whenever no engine trace was recorded. Thestatusfield, drawn fromcontrol_state_reason, is stamped on every trace (full or fallback) to explain why no solar target was computed. -
Deploy script stamped raw sha, blocking integration load: The deploy script was writing a bare 7-character git sha as the manifest
versionfield. HA'sAwesomeVersionparser rejects shas that contain hex letters, silently blocking the integration from loading. The script now carries the sha as SemVer build metadata (e.g.2.30.0-beta.1+873727b) and strips any prior metadata on re-deploy.
Testing
4888 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.