diff --git a/gallery/src/pages/components/ha-form.ts b/gallery/src/pages/components/ha-form.ts index a1be3cdc0c..a49cf9f131 100644 --- a/gallery/src/pages/components/ha-form.ts +++ b/gallery/src/pages/components/ha-form.ts @@ -40,7 +40,12 @@ const SCHEMAS: { schema: [ { name: "addon", selector: { addon: {} } }, { name: "entity", selector: { entity: {} } }, - { name: "device", selector: { device: {} } }, + { + name: "Attribute", + selector: { attribute: { entity_id: "" } }, + }, + { name: "Device", selector: { device: {} } }, + { name: "Duration", selector: { duration: {} } }, { name: "area", selector: { area: {} } }, { name: "target", selector: { target: {} } }, { name: "number", selector: { number: { min: 0, max: 10 } } }, diff --git a/gallery/src/pages/components/ha-selector.ts b/gallery/src/pages/components/ha-selector.ts index ce015a3756..b4fc18f118 100644 --- a/gallery/src/pages/components/ha-selector.ts +++ b/gallery/src/pages/components/ha-selector.ts @@ -21,7 +21,12 @@ const SCHEMAS: { name: "One of each", input: { entity: { name: "Entity", selector: { entity: {} } }, + attribute: { + name: "Attribute", + selector: { attribute: { entity_id: "" } }, + }, device: { name: "Device", selector: { device: {} } }, + duration: { name: "Duration", selector: { duration: {} } }, addon: { name: "Addon", selector: { addon: {} } }, area: { name: "Area", selector: { area: {} } }, target: { name: "Target", selector: { target: {} } }, diff --git a/src/components/ha-form/ha-form.ts b/src/components/ha-form/ha-form.ts index 884db9f6a9..bc93ca4242 100644 --- a/src/components/ha-form/ha-form.ts +++ b/src/components/ha-form/ha-form.ts @@ -81,6 +81,7 @@ export class HaForm extends LitElement implements HaFormElement { : ""} ${"selector" in item ? html` + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-selector-attribute": HaSelectorAttribute; + } +} diff --git a/src/components/ha-selector/ha-selector.ts b/src/components/ha-selector/ha-selector.ts index a41184a2de..145991228f 100644 --- a/src/components/ha-selector/ha-selector.ts +++ b/src/components/ha-selector/ha-selector.ts @@ -6,8 +6,10 @@ import { HomeAssistant } from "../../types"; import "./ha-selector-action"; import "./ha-selector-addon"; import "./ha-selector-area"; +import "./ha-selector-attribute"; import "./ha-selector-boolean"; import "./ha-selector-device"; +import "./ha-selector-duration"; import "./ha-selector-entity"; import "./ha-selector-number"; import "./ha-selector-object"; @@ -15,7 +17,6 @@ import "./ha-selector-select"; import "./ha-selector-target"; import "./ha-selector-text"; import "./ha-selector-time"; -import "./ha-selector-duration"; @customElement("ha-selector") export class HaSelector extends LitElement { diff --git a/src/data/selector.ts b/src/data/selector.ts index eac4404399..4ed8f9dd7b 100644 --- a/src/data/selector.ts +++ b/src/data/selector.ts @@ -1,7 +1,9 @@ export type Selector = | AddonSelector + | AttributeSelector | EntitySelector | DeviceSelector + | DurationSelector | AreaSelector | TargetSelector | NumberSelector @@ -11,6 +13,7 @@ export type Selector = | StringSelector | ObjectSelector | SelectSelector; + export interface EntitySelector { entity: { integration?: string; @@ -19,6 +22,12 @@ export interface EntitySelector { }; } +export interface AttributeSelector { + attribute: { + entity_id: string; + }; +} + export interface DeviceSelector { device: { integration?: string; diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-state.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-state.ts index 5b909c1ace..d50304561a 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-state.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-state.ts @@ -9,6 +9,7 @@ import { string, union, } from "superstruct"; +import memoizeOne from "memoize-one"; import { fireEvent } from "../../../../../common/dom/fire_event"; import { hasTemplate } from "../../../../../common/string/has-template"; import { StateTrigger } from "../../../../../data/automation"; @@ -33,6 +34,7 @@ const stateTriggerStruct = assign( const SCHEMA = [ { name: "entity_id", selector: { entity: {} } }, + { name: "attribute", selector: { attribute: { entity_id: "" } } }, { name: "from", required: false, selector: { text: {} } }, { name: "to", required: false, selector: { text: {} } }, { name: "for", required: false, selector: { duration: {} } }, @@ -48,6 +50,15 @@ export class HaStateTrigger extends LitElement implements TriggerElement { return { entity_id: "" }; } + private _schema = memoizeOne((entityId) => { + const schema = [...SCHEMA]; + schema[1] = { + name: "attribute", + selector: { attribute: { entity_id: entityId } }, + }; + return schema; + }); + public shouldUpdate(changedProperties: PropertyValues) { if (!changedProperties.has("trigger")) { return true; @@ -81,12 +92,13 @@ export class HaStateTrigger extends LitElement implements TriggerElement { const trgFor = createDurationData(this.trigger.for); const data = { ...this.trigger, ...{ for: trgFor } }; + const schema = this._schema(this.trigger.entity_id); return html`