Skip to content

Adaptive Cover Pro ⛅ v2.28.0-beta.9

Pre-release
Pre-release

Choose a tag to compare

@jrhubott jrhubott released this 13 Jun 18:30
· 146 commits to main since this release

ℹ Using release notes from: release_notes/v2.28.0-beta.9.md
Beta.9 lands four changes across the FOV workflow, position matching, and climate sensors. The two-mode "Define field of view by" selector introduced in beta.8 is replaced with a single "Generate field of view from measurements" button — a transient toggle that computes fov_left/fov_right from window width and reveal depth on submit, then clears itself so the user can fine-tune either angle directly. The FovMode enum and CONF_FOV_MODE are removed; any saved fov_mode values are inert and dropped on next save. Position matching is now opt-in with a new Enable toggle (default off) and a dedicated option to disable retry-on-mismatch; settling on a mismatched position engages manual override instead of retrying. The sensor.climate_status entity now always exposes threshold setpoints and a typed inactive_reason attribute. And the FOV preview in the measurements help text is no longer gated on reveal depth — depth 0 is a valid full-hemisphere result, not a blank.

🎯 Highlights

Beta — please test and report back.

  • Open the config flow for a vertical blind or venetian. Confirm the "Generate field of view from measurements" button appears instead of the old mode dropdown. Tick it, submit, and verify that fov_left and fov_right populate from your window dimensions. Confirm the toggle clears after submit so you can adjust either angle freely.
  • At reveal depth 0 (the default), open the measurements step and confirm the {computed_fov} preview renders in the toggle's help text rather than being blank.
  • If you have an existing config that saved a fov_mode value: edit and re-save the entry; verify no error and that the legacy key is silently dropped.
  • In Cover Settings, locate "Enable position matching" (default off). Leave it off, command the cover, and verify it is sent once and not retried if it settles slightly off — and that a noticeable delta triggers manual override. Then enable it and confirm retry behaviour resumes.
  • Move "Position match tolerance" to the Position Settings step and confirm it appears there rather than its previous location.
  • Open Developer Tools → States for sensor.climate_status. Confirm the attributes always include temp_low, temp_high, temp_summer_outside (rounded to one decimal) and inactive_reason, even when the climate handler is not active.
  • Verify inactive_reason cycles through meaningful slugs (active, mode_off, outside_time_window, thresholds_not_met, other_mode_active, readings_unavailable) as you change conditions.
  • Call the adaptive_cover_pro.set_position_limits service with enable_position_matching: true / false and confirm the option is accepted and reflected in diagnostics.

✨ Features

FOV mode selector replaced with generate-from-measurements button (#565, #595)

The two-mode selector ("Angles" vs "Measurements") is gone. In its place, a single "Generate field of view from measurements" button — CONF_FOV_COMPUTE — appears immediately before the fov_left/fov_right sliders whenever a cover type sets supports_fov_compute = True. Vertical blinds and venetians both set this flag via fov_compute_schema on the base policy; there is no duplication. Ticking the button and submitting fills both angle sliders from window width and reveal depth, then the button resets so the user can manually adjust either value. The sliders are always visible and editable regardless. CONF_FOV_MODE and the FovMode enum are removed from const.py; legacy values in existing config entries are inert and are dropped on the next save.

Position matching is now opt-in with a disable option (#591, #592)

A new CONF_ENABLE_POSITION_MATCHING option (default DEFAULT_ENABLE_POSITION_MATCHING = False) controls whether the cover command manager retries when a cover settles off-target. When disabled — the new default — the cover is commanded once and left where it lands; a position delta that would previously trigger a retry now engages manual override instead. When enabled, retry-up-to-max_retries behaviour is unchanged. The tolerance slider moves to the Position Settings step. enable_position_matching is exposed in the adaptive_cover_pro.set_position_limits service, in diagnostics, and is synced by the coordinator each cycle via the new enable_position_matching property on managers/cover_command.

Climate status sensor exposes threshold setpoints and typed inactive reason (#589, #590)

sensor.climate_status now always returns a populated attributes dict. It includes temp_low, temp_high, and temp_summer_outside (read from config_entry.options, rounded to one decimal by _round_threshold), and an inactive_reason slug from the new ClimateInactiveReason class in const.py. The slug values are: active, mode_off, outside_time_window, thresholds_not_met, other_mode_active, readings_unavailable. The inactive_reason_from_result function in pipeline/handlers/climate.py derives the slug from the pipeline result; describe_skip delegates to the same inactive_reason function via _SLUG_TO_PROSE so prose descriptions and attribute values stay in sync from a single source.

🐛 Fixes

FOV preview always shown in measurements help text (#596)

The {computed_fov} preview in the measurements help text was suppressed when reveal depth was 0 — the default. Depth 0 is a valid input (full-hemisphere 90°/90°), not an absence of data. The gate is removed; the preview now always renders. The {computed_fov} token also moved from the step description into the FOV-compute toggle's own help text so it appears directly adjacent to the control it describes. DE/FR translations synced; placeholder parity verified.

🔧 Internal

  • _as_optional(marker) moved from cover_types/blind.py to cover_types/base.py — available to all cover type policies.
  • supports_fov_compute replaces the removed supports_fov_mode ClassVar on the base policy.
  • inactive_reason and inactive_reason_from_result added to pipeline/handlers/climate.py; _SLUG_TO_PROSE and _PROSE_TO_SLUG are the single source of truth for slug-to-description mapping.
  • _enable_position_matching instance attribute and enable_position_matching property/setter added to managers/cover_command/__init__.py.
  • CONF_ENABLE_POSITION_MATCHING added to FIELD_VALIDATORS (as _bool_v()) and _SECTION_POSITION_LIMITS in services/options_service.py.

🧪 Testing

4,489 tests passing.

Previously in this beta line

Measurements-mode FOV sliders visible with editable suggested value, config summary shows [template] for Jinja2 threshold values (beta.8, #565, #577, #587, #588): The beta.8 step introduced a two-mode FOV selector and made sliders visible in Measurements mode with a pre-populated suggested value. That selector is now superseded by the button in beta.9. The [template] config-summary fix (#577, #587) remains in effect: any threshold field holding a Jinja2 expression renders as [template] rather than exposing the raw expression.

Force Override merged into Custom Positions, FOV formula corrected (beta.7, #563, #565, #584, #583): Force Override is now a Custom Position slot at safety priority 100, acting outside the time window and bypassing delta gates. The FOV-from-measurements formula was corrected from half-angle to full-angle.

Jinja2 templates in threshold fields and optional occupancy template (beta.6, #577, #578): Temperature threshold fields now accept Jinja2 templates in addition to numeric values. The occupancy template option is now optional.

Configuration Summary translated to user's language (beta.4/beta.5, #258, #575, #576): The Configuration Summary narrative in the options flow is now rendered in the user's HA language, with an English fallback.

Set-position covers can reach true 0% in solar tracking (beta.3/beta.4, #569, #572): The lower clamp in solar tracking was raised off zero; it is now restored so covers configured with a 0% floor can reach it.

Same-position gate reverted to exact equality, restoring 1–3% tracking moves (beta.3, #567, #574): The position gate was tightened too aggressively; it is reverted to exact equality so small tracking increments are not suppressed.

String entity_id in service targets now normalizes correctly (beta.3, #570, #571): Service calls with a plain string entity_id target (rather than a list) were not normalizing correctly; fixed.

FOV mode persisted on re-render, fixing save loop (beta.2/beta.3, #565): The FOV mode selection was lost on re-render, causing users to get stuck in a loop; it is now persisted correctly.

Measurements-mode config-flow save and imperial shaded-area compounding fixes (beta.2, #565): Saving a Measurements-mode config entry no longer errors; imperial shaded-area values no longer compound on successive saves.

Low-sun edge case returns closed position (beta.1, #559, #562): When the sun is below the geometry horizon the cover returns closed rather than an undefined position.

Write-gating, geometry caching, and sun availability guard (beta.1, #543): Cover commands are gated on actual state changes; geometry values are cached per cycle; the coordinator guards against sun data being unavailable at startup.

Compatibility

Requires Home Assistant 2026.3.0+. No new coupled-component requirements.

References