Skip to content

Adaptive Cover Pro ⛅ v2.30.0-beta.4

Pre-release
Pre-release

Choose a tag to compare

@jrhubott jrhubott released this 27 Jun 22:47
· 17 commits to main since this release

Heads-up: I'm planning to cut a stable v2.30.0 release tomorrow, so this is likely the last beta on this line — please test now if you can. I'll also be traveling for the next week, so responses and fixes may be slower than usual. Thanks for your patience.

Highlights

2.30.0-beta.4 refines the Building Profile feature introduced in beta.3: a new linked-cover overview step surfaces sensor inheritance and divergence across all covers tied to a profile, and a per-cover override UI lets individual covers selectively deviate from inherited profile sensors. Outside the profile work, two new configuration options land: an on/off master toggle for the weather override (#719) and an opt-in summer-close sun-floor bypass (#689). The options flow also gains a warning when a custom-position slot is set to safety priority and bypasses all gates (#711). All of beta.3's additions carry forward — roof/skylight cover type, building profiles, multi-slot blind spots, ten custom-position slots, and endpoint-aware open/close. The config-entry schema moves from v3.5 to v3.6; existing installs keep weather override on automatically through migration, and the summer-close bypass defaults off.

To install, enable "Show beta versions" in HACS. Feedback is especially welcome on: the Building Profile overview and per-sensor override UI, the weather override toggle and its off-by-default for new installs, and the summer-close bypass in climate-aware configurations.

Added

  • Roof/skylight window cover type (#212, #696): New cover type "cover_roof_window" with pitch-aware sun geometry. Configure CONF_ROOF_PITCH and CONF_ROOF_HEIGHT_ABOVE to match the physical installation; RoofSunGeometry handles the tilted-plane math, RoofWindowCover drives position calculation, and RoofWindowPolicy provides the policy layer. The type is registered in ALL_COVER_TYPES alongside the existing blind/awning/tilt types. Closes the oldest open feature request.

  • Building profile (#693, #700, #706): A new virtual entry type — created via its own config-flow steps (async_step_create_building_profile(), async_step_building_profile_sensors()) — that holds shared building-level weather and climate sensors without controlling any covers. Linked covers receive live sensor propagation via _async_profile_propagate(); _copy_profile_to_cover() applies profile values and _covers_linked_to() tracks which entries reference a given profile. BuildingProfilePolicy and SensorSource define the data model. On deletion, async_remove_entry() cleans the dangling profile link from all linked covers. The standalone weather-retraction toggle was removed in the same pass (#706); the migration handles existing data transparently.

  • Building Profile overview of linked covers: async_step_profile_overview in the new building_overview.py presents a comparison table of every cover linked to the profile. Rows are modeled with the _CoverRecord, _DiffSpec, and _Entry dataclasses; diff logic uses _comparison_as_list, _comparison_as_table, and _format_diff_line, with local overrides rendered by _local_override_repr. Number normalization via _num ensures numeric values compare correctly regardless of representation.

  • Inherit/override model for Building Profile sensors: async_step_profile_overrides lets a linked cover override any inherited profile sensor locally. Each override is tracked as an OverrideRecord dataclass, giving the options flow a structured representation of which fields are inherited and which are locally set.

  • Multiple blind-spot slots with elevation modes (#701, #702, #708): Blind-spot configuration expands from one slot to three (BLIND_SPOT_SLOTS). Each slot carries left/right azimuth bounds plus an elevation threshold and an elevation mode: BLIND_SPOT_ELEV_MODE_BELOW blocks low-sun intrusion, BLIND_SPOT_ELEV_MODE_ABOVE blocks high-sun intrusion. BlindSpot is a frozen dataclass; _make_blind_spot() and _extra_blind_spots_from() build the slot list from config, _blind_spot_slot_keys() drives options-flow validation, _blind_spot_step_errors() validates bounds, and _sun_in_blind_spot() does the single containment check for both modes. Slot 1 reuses the legacy unsuffixed keys so existing configurations carry forward unchanged; slots 2 and 3 are optional and suffixed. Diagnostics loop over all active slots dynamically.

  • Ten custom-position slots (#703, #704): CUSTOM_POSITION_SLOT_NUMBERS now covers slots 1–10, up from 1–5. Slots 6–10 behave identically to existing slots and respect the same priority range (1–100, default 77).

  • Endpoint-aware open/close (#697, #699): When a cover supports set_position, open and close commands now drive the carriage to its physical endpoints rather than issuing only a generic service call. apply_user_position_endpoint_open() and apply_user_position_endpoint_close() handle the axis-aware dispatch; _POSITION_AXIS_SERVICES maps each axis to its service.

  • On/off master toggle for weather override (#719): CONF_WEATHER_ENABLED gates the entire weather handler. New installs default to off (DEFAULT_WEATHER_ENABLED = False); the v3.5→v3.6 migration sets CONF_WEATHER_ENABLED = True for all existing entries, so upgrading changes nothing for installs that already have weather sensors configured.

  • Opt-in summer-close sun-floor bypass (#689): CONF_SUMMER_CLOSE_BYPASS_SUN_FLOOR lets summer climate mode close covers regardless of sun position. Default off — enabling it is additive and changes nothing for installs that leave it unset.

  • Safety-slot warning (#711): The options flow warns when a custom-position slot is set to safety priority (100), which bypasses all gates including the time window and delta checks.

Fixed

  • Venetian tilt back-rotated after close (#694): On hardware where the motor drags the slats shut during a close, the integration previously left the verified-tilt flag set and never re-asserted the commanded angle. _tilt_targets_verified.discard() is now called after any position move so the sequencer re-reads actual tilt on the next update and re-asserts the correct angle. Thanks to @vaind for reporting and fixing the edge case.

  • Building Profile options flow routed to sensor-only step (#715, #717): The Building Profile options flow now routes to async_step_profile_sensors — a sensor-only step — rather than the full cover options flow, so profile entries can only configure shared sensors.

  • Building Profile template fields scoped and surfaced in UI (#720, #722): Template fields in the Building Profile options flow are now correctly scoped to the profile entry and visible in the UI; previously they could leak across entries or not appear.

  • Building Profile entries skipped in loaded_coordinators (#712): Building profile entries are now excluded from loaded_coordinators so coordinator lookups intended for cover entries don't inadvertently resolve to profile entries.

  • async_unload_entry guarded for non-cover building profiles (#712, #714): async_unload_entry now guards against non-cover building profile entries, preventing an unhandled path when unloading a profile entry.

  • German translation drift resolved (#709, #710): Several config and options flow strings were out of sync between English and German. The drift is resolved; no string keys changed.

Upgrade notes

Upgrading from any earlier beta or from a stable release requires no manual reconfiguration. The schema minor-version bumps to v3.6; the migration is transparent. Weather override: the v3.6 migration sets CONF_WEATHER_ENABLED = True for all existing entries — installs with weather sensors configured keep the same behavior, and the off-by-default applies only to new installs. Summer-close bypass: defaults off and only takes effect if you enable it under climate settings.

Testing

5183 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.