{"record":{"id":"b8d2c6944f5de388","repo":"home-assistant/core","slug":"cannot-join-player-to-itself","errorCode":null,"errorMessage":"Cannot join player to itself","messagePattern":"Cannot join player to itself","errorType":"validation","errorClass":"ServiceValidationError","httpStatus":null,"severity":"warning","filePath":"homeassistant/components/bluesound/media_player.py","lineNumber":453,"sourceCode":"    def shuffle(self) -> bool:\n        \"\"\"Return true if shuffle is active.\"\"\"\n        shuffle = False\n        if self._status is not None:\n            shuffle = self._status.shuffle\n\n        return shuffle\n\n    @property\n    @override\n    def group_members(self) -> list[str] | None:\n        \"\"\"Get list of group members. Leader is always first.\"\"\"\n        return self._group_members\n\n    @override\n    async def async_join_players(self, group_members: list[str]) -> None:\n        \"\"\"Join `group_members` as a player group with the current player.\"\"\"\n        if self.entity_id in group_members:\n            raise ServiceValidationError(\"Cannot join player to itself\")\n\n        entity_ids_with_sync_status = self._entity_ids_with_sync_status()\n\n        paired_players = []\n        for group_member in group_members:\n            sync_status = entity_ids_with_sync_status.get(group_member)\n            if sync_status is None:\n                continue\n            paired_player = id_to_paired_player(sync_status.id)\n            if paired_player:\n                paired_players.append(paired_player)\n\n        if paired_players:\n            await self._player.add_followers(paired_players)\n\n    @override\n    async def async_unjoin_player(self) -> None:\n        \"\"\"Remove this player from any group.\"\"\"","sourceCodeStart":435,"sourceCodeEnd":471,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/bluesound/media_player.py#L435-L471","documentation":"ServiceValidationError raised in async_join_players (the modern media_player.join service) when the caller includes the target entity itself in group_members. Grouping a player with itself is meaningless and would corrupt leader/follower topology, so the service call is rejected with a user-facing validation error.","triggerScenarios":"Calling media_player.join with target = a bluesound entity and group_members containing that same entity_id (e.g. selecting 'all players' as both target and members, or passing entity_id: all).","commonSituations":"Automations or UI scripts that build the member list dynamically and accidentally include the leader; using area/all expanders on both sides of the service call.","solutions":["Remove the target entity_id from the group_members list before calling join","Filter the list programmatically: members = [e for e in members if e != self.entity_id]","In UI actions, pick specific follower entities rather than 'all'"],"exampleFix":"# before\n- action: media_player.join\n  target:\n    entity_id: media_player.living_room\n  data:\n    group_members: all\n\n# after\n- action: media_player.join\n  target:\n    entity_id: media_player.living_room\n  data:\n    group_members:\n      - media_player.kitchen\n      - media_player.bedroom","handlingStrategy":"validation","validationCode":"def members_valid(leader: str, group_members: list[str]) -> bool:\n    return leader not in group_members","typeGuard":null,"tryCatchPattern":"from homeassistant.exceptions import ServiceValidationError\ntry:\n    await entity.async_join_players(members)\nexcept ServiceValidationError as err:\n    if \"itself\" in str(err):\n        members = [m for m in members if m != entity.entity_id]\n        await entity.async_join_players(members)","preventionTips":["Compute member lists with a filter that excludes the target entity_id","Prefer explicit entity lists over 'all'/area expanders in join calls"],"tags":["bluesound","media-player","service-validation","grouping"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}