A fully local Home Assistant integration that combines Google Cast, Android TV Remote, Android TV ADB, DLNA/MediaRenderer, manufacturer TV integrations, and optional AV-receiver media players into one organized controller device per real physical device.
- One integration entry under Settings → Devices & services.
- One integration-owned device and one compact
media_playercontroller per physical TV, Chromecast, Cast speaker, or smart display. - All native representations become capability providers beneath that physical device.
- All lazy metadata sensors are attached to the same physical device.
- Completely new independent devices are detected automatically.
- No generated button/select/number helper swarm.
- Existing v7 controller and sensor unique IDs are preserved during the v8 upgrade.
Automatic grouping deliberately avoids risky merges. Some televisions expose insufficient or contradictory identity information—for example, a Sony BRAVIA integration may expose one device while Android TV, ADB, Cast, and MediaRenderer expose separate representations.
V8 provides an authoritative device-level merge flow that matches what you see in Home Assistant.
- Open Settings → Devices & services.
- Open Cast Metadata & TV Controls.
- Select Configure.
- Choose Review detected physical devices to inspect the current grouping.
- Choose Merge duplicate physical devices.
- Select the two or more controller devices that are actually the same television.
- Optionally enter the final physical-device name.
- Save. The integration reloads, migrates the selected device settings, and removes obsolete generated devices/entities.
You select the duplicate physical controller devices, not every BRAVIA/ADB/Cast entity manually. V8 expands them automatically into their underlying native sources.
For unusual cases, choose Merge native source entities (advanced) and select the manufacturer, MediaRenderer, Android TV Remote, Android TV ADB, Cast, or receiver media_player entities directly.
Do not select the Controller entity created by this integration in the advanced source selector.
The Configure menu also provides:
- Edit a merged physical device
- Unmerge a manually merged device
- Remove all manual device merges
When devices are merged, V8 also moves their capability routes, managed-app preferences, command delays, activities, and Wake-on-LAN configuration to the surviving physical device.
Automatic grouping uses conservative evidence:
- Shared Home Assistant device-registry identity.
- Shared network connections such as MAC addresses.
- Matching meaningful names with area validation.
- Reciprocal manufacturer/model-family evidence between complementary integrations.
- Platform and capability priority.
The manufacturer-native TV representation is preferred for the final name, manufacturer, model, and area. Standalone Chromecast dongles, speakers, and displays remain independent.
The unified controller selects the most suitable source for each supported capability:
- Power on/off and restart
- Wake-on-LAN fallback
- Volume, mute, and volume stepping
- Play, pause, stop, previous, and next
- Corrected absolute and relative seeking
- Shuffle and repeat
- Native Android/Google TV application launching
- Cast receiver launching
- HDMI, tuner, console, receiver, and manufacturer inputs
- Remote navigation
- Current app, title, artist, album, artwork, duration, and position
Use Configure → Route controller capabilities only when a specific native integration is more reliable than automatic routing.
The application catalogue combines configured, learned, discovered, and manually registered apps. The controller separates mechanisms clearly:
TV App · YouTube
TV App · Netflix
Cast · YouTube
Input · HDMI 1
Input · PlayStation 5
Transient receiver states such as Ready to Cast are filtered. Apps can be renamed, hidden, favourited, and reordered under Configure → Manage applications.
Register a missing TV app:
action: cast_attribute_sensors.register_tv_app
data:
entity_id: media_player.living_room_tv_controller
app_id: com.example.androidtv
app_name: Example TV AppEach native source is watched continuously. A metadata sensor is created when a non-null value first appears, remains registered, and becomes unavailable/unknown when the source stops reporting it.
Examples include media_title, media_artist, app_id, app_name, source, volume_level, and manufacturer-specific media attributes.
Complete source snapshots are disabled by default as diagnostic entities to reduce interface and recorder clutter.
Each physical device can expose an opt-in Auto-skip YouTube ads switch.
- Cast uses the receiver's reported
SKIP_ADcapability. - Android TV ADB acts only after positively identifying a visible skip control while YouTube is confirmed active.
- No blind timed clicks or fixed screen coordinates.
- Unskippable advertisements are not bypassed.
Manual test:
action: cast_attribute_sensors.skip_ad
data:
entity_id: media_player.living_room_tv_controllerAll are configured from the integration's Configure menu without YAML helpers:
- Activity presets can power on, choose an app/input, set volume, and set mute.
- Per-device delays support slower televisions.
- Wake-on-LAN is used only when no working native power-on route exists.
Every physical device includes health/problem diagnostics and a transition event entity. Home Assistant Repairs warns about missing manually merged sources and stale capability routes.
Transition types include power_changed, application_changed, input_changed, playback_changed, volume_changed, and mute_changed.
The companion HACS dashboard repository is:
Togarriapa/HomeAssistant-Unified-TV-Card
It provides responsive artwork, playback, app/input dropdowns, mute beside volume, remote navigation, activities, favourites, diagnostics, and ad-skip controls.
type: custom:unified-tv-card
entity: media_player.living_room_tv_controller
show_artwork: true
show_remote: true
seek_seconds: 10-
Open HACS → Integrations.
-
Add this custom repository as category Integration:
https://github.com/Togarriapa/HomeAssistant-Cast-Metadata-Controls -
Install the latest version.
-
Restart Home Assistant.
-
Open Settings → Devices & services → Add integration.
-
Add Cast Metadata & TV Controls.
No YAML configuration is required.
HACS tracks the latest compatible full GitHub release. V8's release workflow creates and verifies that release automatically and also checks daily for a missing release.
If HACS still does not show the update:
- Confirm your Home Assistant Core version is at least 2025.12.0.
- Open HACS and use Update information / reload the repository data.
- Confirm the repository is installed as an Integration, not Dashboard or Theme.
- Open the repository in HACS and select Redownload if its local metadata is stale.
- Restart Home Assistant after the integration update.
V8 lowers the accidental 2026.7 compatibility floor used by older releases, which could prevent compatible installations from seeing an update.
- Update or redownload the integration in HACS.
- Confirm HACS reports 8.0.0.
- Restart Home Assistant completely.
- Wait several seconds for registry cleanup.
- Open the integration and use Review detected physical devices.
- Merge any remaining duplicate controller devices with Merge duplicate physical devices.
The v7 unique-ID namespace is deliberately retained, so existing dashboards and automations should continue using the same controller and metadata entity IDs.
The integration is local-first and adds no account, cloud API, telemetry, or analytics. Normal discovery is event-driven. Android TV ad detection polls locally only while explicitly enabled and while YouTube is active.
For recorder-sensitive installations, complete snapshot sensors remain disabled by default. They can also be excluded with:
recorder:
exclude:
entity_globs:
- sensor.*_attributesMIT License.