From bdff13d5e123c8643508a89255e62d0a35c02b49 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 6 Jan 2026 16:16:23 +0100 Subject: [PATCH] Use target selector to filter references entities (#28822) * Use target selector to filter references entities * Update ha-selector-state.ts --- .../ha-selector/ha-selector-state.ts | 26 ++++++++++++++----- src/data/selector.ts | 4 +-- .../types/ha-automation-condition-platform.ts | 5 +++- .../types/ha-automation-trigger-platform.ts | 5 +++- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/components/ha-selector/ha-selector-state.ts b/src/components/ha-selector/ha-selector-state.ts index 8d7c8b1b5a..e3efe00c8d 100644 --- a/src/components/ha-selector/ha-selector-state.ts +++ b/src/components/ha-selector/ha-selector-state.ts @@ -2,13 +2,16 @@ import type { HassServiceTarget } from "home-assistant-js-websocket"; import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; -import type { StateSelector } from "../../data/selector"; -import { extractFromTarget } from "../../data/target"; +import { + resolveEntityIDs, + type StateSelector, + type TargetSelector, +} from "../../data/selector"; import { SubscribeMixin } from "../../mixins/subscribe-mixin"; import type { HomeAssistant } from "../../types"; -import type { PickerComboBoxItem } from "../ha-picker-combo-box"; import "../entity/ha-entity-state-picker"; import "../entity/ha-entity-states-picker"; +import type { PickerComboBoxItem } from "../ha-picker-combo-box"; @customElement("ha-selector-state") export class HaSelectorState extends SubscribeMixin(LitElement) { @@ -30,6 +33,7 @@ export class HaSelectorState extends SubscribeMixin(LitElement) { filter_attribute?: string; filter_entity?: string | string[]; filter_target?: HassServiceTarget; + target_selector?: TargetSelector; }; @state() private _entityIds?: string | string[]; @@ -54,7 +58,8 @@ export class HaSelectorState extends SubscribeMixin(LitElement) { this._resolveEntityIds( this.selector.state?.entity_id, this.context?.filter_entity, - this.context?.filter_target + this.context?.filter_target, + this.context?.target_selector ).then((entityIds) => { this._entityIds = entityIds; }); @@ -104,7 +109,8 @@ export class HaSelectorState extends SubscribeMixin(LitElement) { private async _resolveEntityIds( selectorEntityId: string | string[] | undefined, contextFilterEntity: string | string[] | undefined, - contextFilterTarget: HassServiceTarget | undefined + contextFilterTarget: HassServiceTarget | undefined, + contextTargetSelector: TargetSelector | undefined ): Promise { if (selectorEntityId !== undefined) { return selectorEntityId; @@ -113,8 +119,14 @@ export class HaSelectorState extends SubscribeMixin(LitElement) { return contextFilterEntity; } if (contextFilterTarget !== undefined) { - const result = await extractFromTarget(this.hass, contextFilterTarget); - return result.referenced_entities; + return resolveEntityIDs( + this.hass, + contextFilterTarget, + this.hass.entities, + this.hass.devices, + this.hass.areas, + contextTargetSelector + ); } return undefined; } diff --git a/src/data/selector.ts b/src/data/selector.ts index 4a662490e9..3196661c3b 100644 --- a/src/data/selector.ts +++ b/src/data/selector.ts @@ -929,13 +929,13 @@ export const resolveEntityIDs = ( targetPickerValue: HassServiceTarget, entities: HomeAssistant["entities"], devices: HomeAssistant["devices"], - areas: HomeAssistant["areas"] + areas: HomeAssistant["areas"], + targetSelector: TargetSelector = { target: {} } ): string[] => { if (!targetPickerValue) { return []; } - const targetSelector = { target: {} }; const targetEntities = new Set(ensureArray(targetPickerValue.entity_id)); const targetDevices = new Set(ensureArray(targetPickerValue.device_id)); const targetAreas = new Set(ensureArray(targetPickerValue.area_id)); diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-platform.ts b/src/panels/config/automation/condition/types/ha-automation-condition-platform.ts index 3874ec30c8..f40472f1b3 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-platform.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-platform.ts @@ -268,8 +268,11 @@ export class HaPlatformCondition extends LitElement { return undefined; } - const context = {}; + const context: Record = {}; for (const [context_key, data_key] of Object.entries(field.context)) { + if (data_key === "target" && this.description?.target) { + context.target_selector = this._targetSelector(this.description.target); + } context[context_key] = data_key === "target" ? this.condition.target diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-platform.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-platform.ts index 8ef8facae1..bbc7775d0f 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-platform.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-platform.ts @@ -304,8 +304,11 @@ export class HaPlatformTrigger extends LitElement { return undefined; } - const context = {}; + const context: Record = {}; for (const [context_key, data_key] of Object.entries(field.context)) { + if (data_key === "target" && this.description?.target) { + context.target_selector = this._targetSelector(this.description.target); + } context[context_key] = data_key === "target" ? this.trigger.target