Skip to content

Proxy Cover Entity

Jason Rhubottom edited this page Jun 2, 2026 · 4 revisions

Proxy Cover Entity

Most cover cards on dashboards (the default HA Cover card, mushroom-cover-card, and similar) call cover.set_cover_position directly on whatever entity the card targets. If you point them at the physical cover, the slider, open button, and close button bypass ACP's min-mode floors entirely. The proxy cover entity fixes that without you having to write a template cover or a custom card.

When the Expose Proxy Cover Entity toggle is on, ACP creates one additional cover entity per source cover. Point your dashboard at the proxy instead of the source; ACP intercepts the dashboard commands, runs them through the same floor-clamp logic the adaptive_cover_pro.set_position service uses, and forwards the clamped position to the source cover.

Enabling the proxy

Turn on Expose Proxy Cover Entity in the Covers & Device step of the create flow, or any time afterwards in integration Options. It's off by default β€” without it, dashboards talk to the source cover directly and bypass ACP's floors.

ACP creates one proxy cover per source cover on the next reload.

What gets created

For new instances created against a cover that has an attached HA device, the entry Title defaults to the device name verbatim (e.g. a Zigbee device "Patio Stairs Shade" produces a title of Patio Stairs Shade), so the resulting proxy entity is cover.patio_stairs_shade_managed with friendly name Patio Stairs Shade Managed. For instances created without an attached device, the title gets the cover-type prefix and the word "Adaptive" (e.g. Vertical Adaptive Living Room Blind) β€” the examples in the table below cover both cases.

Property Value
Entity ID cover.{title_slug}_managed (single source) or cover.{title_slug}_managed_{source} (multi-source instances)
Friendly name {Title} Managed or {Title} Managed ({source label})
State Mirrors the source cover (open, opening, closing, closed, etc.)
Attributes Pass-through from the source (current_position, current_tilt_position, supported features)
unique_id {entry_id}_proxy_{slugified_source_entity_id} β€” stable across renames

The proxy advertises only the features its source advertises, so a position-only cover gets a proxy that exposes position, an open/close-only cover gets a proxy without a position slider, and a tilt-capable cover gets a proxy with both axes.

Intercepted services

Each command coming into the proxy gets routed through Coordinator.async_apply_user_position with a labelled trigger. The trigger shows up on the last_cover_action diagnostic sensor so you can tell at a glance what moved the cover.

Service called on the proxy Routed through floor clamp Trigger label
cover.set_cover_position βœ… proxy_managed
cover.open_cover βœ… (treated as position 100) proxy_open
cover.close_cover βœ… (treated as position 0) proxy_close
cover.set_cover_tilt_position (tilt-capable covers only) βœ… proxy_tilt
cover.stop_cover ❌ (forwards unclamped to the source) β€”

The clamp respects:

  • Active force-override and weather-override handlers β€” those still win, exactly as if you'd called the adaptive_cover_pro.set_position service.
  • The highest active custom-position min-mode floor across all slots.
  • The configured Minimum Position when Apply Min only during sun tracking is off. See Position Limits.

cover.stop_cover deliberately bypasses the clamp so a panic-stop from the dashboard always lands.

When to use it

Use the proxy whenever a dashboard, voice command, or third-party automation might otherwise call cover.set_cover_position directly on the physical cover and bypass your floors. Common cases:

  • The default Home Assistant cover card.
  • custom:mushroom-cover-card and similar cards that hard-code the service name.
  • Voice assistants (Google, Alexa) that emit cover.set_cover_position against the entity you exposed.
  • Quick-action buttons on a tablet dashboard.

If your dashboard already calls adaptive_cover_pro.set_position via a custom button or script, the proxy is redundant for that surface β€” the service path and the proxy path share the same helper.

Stopping false manual overrides. If you're getting spurious manual_override events from external sources (slow Zigbee shades, stale position reports, other automations, physical/RF remotes), pair the proxy with the "Only engage manual override from Adaptive Cover Pro commands" option (Automation β†’ Manual Override) and drive the cover only through the proxy. ACP then ignores every non-proxy state change while still honouring your proxy moves. See Troubleshooting β†’ workaround.

Migration note for v2.21.2 adopters

The proxy shipped in v2.21.2 with an _slider suffix; in the next release the suffix is _managed because the proxy intercepts open and close too, not only slider moves. The change is purely cosmetic at the integration level β€” ACP picks up the new entity name on new opt-ins automatically β€” but Home Assistant never auto-renames an existing entity_id after first registration.

If you turned the proxy on under v2.21.2 and you want the cleaner _managed entity ID, go to Settings β†’ Devices & Services β†’ Entities, find the entity ending in _slider, and rename it manually. The friendly name updates on its own. The underlying unique_id was always {entry_id}_proxy_{slug}, so the registry row survives untouched and no migration is needed.

Related

  • Runtime Configuration Services β€” adaptive_cover_pro.set_position is the scripted equivalent of what the proxy does for dashboards.
  • Position β€” where Min Position and the "Apply Min only during sun tracking" toggle live.
  • Custom Position β€” min-mode floors on a per-slot basis stack with the global min in the same clamp.

Clone this wiki locally