From c8bfd83467898fd34b9daafe924fe9837ce75340 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Sun, 10 Mar 2019 16:32:09 -0400 Subject: [PATCH 01/14] zha add device page add device join dialog stub update dialog stub fix spinner add messages and devices to dialog dialog updates update dialog update dialog add debug info fix reference add header update dialog test zha gateway message subscription add device join dialog stub add messages and devices to dialog dialog updates update dialog add debug info update dialog start transitioning to a page instead of a dialog fix import subpage update router remove old dialog handle remove dialog parts make add button call navigate change extract page add devices page cleanup --- src/panels/config/ha-panel-config.ts | 4 +- src/panels/config/zha/ha-config-zha.ts | 21 +-- src/panels/config/zha/zha-add-devices-page.ts | 155 ++++++++++++++++++ src/panels/config/zha/zha-config-panel.ts | 68 ++++++++ src/panels/config/zha/zha-network.ts | 45 ++--- src/panels/config/zha/zha-node.ts | 8 +- 6 files changed, 259 insertions(+), 42 deletions(-) create mode 100644 src/panels/config/zha/zha-add-devices-page.ts create mode 100644 src/panels/config/zha/zha-config-panel.ts diff --git a/src/panels/config/ha-panel-config.ts b/src/panels/config/ha-panel-config.ts index 0d78f87168d8..052c12aea3c9 100644 --- a/src/panels/config/ha-panel-config.ts +++ b/src/panels/config/ha-panel-config.ts @@ -73,9 +73,9 @@ class HaPanelConfig extends HassRouterPage { import(/* webpackChunkName: "panel-config-users" */ "./users/ha-config-users"), }, zha: { - tag: "ha-config-zha", + tag: "zha-config-panel", load: () => - import(/* webpackChunkName: "panel-config-zha" */ "./zha/ha-config-zha"), + import(/* webpackChunkName: "panel-config-zha" */ "./zha/zha-config-panel"), }, zwave: { tag: "ha-config-zwave", diff --git a/src/panels/config/zha/ha-config-zha.ts b/src/panels/config/zha/ha-config-zha.ts index 1708b9f5a882..14414b4439cb 100755 --- a/src/panels/config/zha/ha-config-zha.ts +++ b/src/panels/config/zha/ha-config-zha.ts @@ -1,5 +1,3 @@ -import "@polymer/app-layout/app-header/app-header"; -import "@polymer/app-layout/app-toolbar/app-toolbar"; import { html, LitElement, @@ -10,8 +8,8 @@ import { } from "lit-element"; import "@polymer/paper-icon-button/paper-icon-button"; import { HASSDomEvent } from "../../../common/dom/fire_event"; +import "../../../layouts/hass-subpage"; import { Cluster, ZHADevice, fetchBindableDevices } from "../../../data/zha"; -import "../../../layouts/ha-app-layout"; import "../../../components/ha-paper-icon-button-arrow-prev"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; @@ -38,16 +36,7 @@ export class HaConfigZha extends LitElement { protected render(): TemplateResult | void { return html` - - - - -
Zigbee Home Automation
-
-
- + ` : ""} -
+ `; } @@ -117,10 +106,6 @@ export class HaConfigZha extends LitElement { static get styles(): CSSResult[] { return [haStyle]; } - - private _onBackTapped(): void { - history.back(); - } } declare global { diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts new file mode 100644 index 000000000000..5510174c180a --- /dev/null +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -0,0 +1,155 @@ +import { + LitElement, + html, + css, + property, + CSSResult, + TemplateResult, + customElement, +} from "lit-element"; +import "@polymer/paper-spinner/paper-spinner"; +import "../../../layouts/hass-subpage"; +import "./zha-device-card"; +import { haStyle } from "../../../resources/styles"; +import { HomeAssistant } from "../../../types"; +import { ZHADevice } from "../../../data/zha"; + +@customElement("zha-add-devices-page") +class ZHAAddDevicesPage extends LitElement { + @property() public hass!: HomeAssistant; + @property() private _error?: string; + @property() private _discoveredDevices: ZHADevice[] = []; + @property() private _formattedEvents: string = ""; + @property() private _active: boolean = false; + private _addDevicesTimeoutHandle: any = undefined; + private _subscribed?: Promise<() => Promise>; + + public connectedCallback(): void { + super.connectedCallback(); + this._active = true; + this._subscribed = this.hass!.connection.subscribeMessage( + (message) => this._handleMessage(message), + { type: "zha/devices/add" } + ); + this._addDevicesTimeoutHandle = setTimeout( + () => this._unsubscribe(), + 60000 + ); + } + + public disconnectedCallback(): void { + super.disconnectedCallback(); + this._unsubscribe(); + this._error = undefined; + this._discoveredDevices = []; + this._formattedEvents = ""; + } + + protected render(): TemplateResult | void { + return html` + +

+ + Searching for ZHA Zigbee devices... +

+ ${this._error + ? html` +
${this._error}
+ ` + : ""} +
+ +
+
+

+ Discovered devices: +

+ ${this._discoveredDevices.map( + (device) => html` + + ` + )} +
+
+ `; + } + + private _handleMessage(message: any): void { + if (message.type === "log_output") { + this._formattedEvents += message.log_entry.message + "\n"; + } + if (message.type && message.type === "device_fully_initialized") { + this._discoveredDevices.push(message.device_info); + } + } + + private _unsubscribe(): void { + this._active = false; + if (this._addDevicesTimeoutHandle) { + clearTimeout(this._addDevicesTimeoutHandle); + } + if (this._subscribed) { + this._subscribed.then((unsub) => unsub()); + this._subscribed = undefined; + } + } + + static get styles(): CSSResult[] { + return [ + haStyle, + css` + .content { + min-height: 325px; + margin: 16px; + } + .error { + color: var(--google-red-500); + } + paper-spinner { + display: none; + margin-right: 20px; + margin-left: 16px; + } + paper-spinner[active] { + display: block; + float: left; + margin-right: 20px; + margin-left: 16px; + } + .card { + box-sizing: border-box; + display: flex; + flex: 1 0 300px; + min-width: 0; + max-width: 600px; + max-height: 450px; + padding-left: 28px; + padding-right: 28px; + padding-bottom: 10px; + } + .events { + margin: 16px; + border-top: 1px solid var(--light-primary-color); + padding-top: 16px; + min-height: 275px; + max-height: 275px; + overflow: scroll; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "zha-add-devices-page": ZHAAddDevicesPage; + } +} diff --git a/src/panels/config/zha/zha-config-panel.ts b/src/panels/config/zha/zha-config-panel.ts new file mode 100644 index 000000000000..a79788bbced3 --- /dev/null +++ b/src/panels/config/zha/zha-config-panel.ts @@ -0,0 +1,68 @@ +import { property, customElement } from "lit-element"; +import "../../../layouts/hass-loading-screen"; +import { HomeAssistant } from "../../../types"; +import { listenMediaQuery } from "../../../common/dom/media_query"; +import { + HassRouterPage, + RouterOptions, +} from "../../../layouts/hass-router-page"; + +@customElement("zha-config-panel") +class ZHAConfigPanel extends HassRouterPage { + @property() public hass!: HomeAssistant; + @property() public _wideSidebar: boolean = false; + @property() public _wide: boolean = false; + + protected routerOptions: RouterOptions = { + defaultPage: "configuration", + cacheAll: true, + preloadAll: true, + routes: { + configuration: { + tag: "ha-config-zha", + load: () => + import(/* webpackChunkName: "zha-configuration-page" */ "./ha-config-zha"), + }, + add: { + tag: "zha-add-devices-page", + load: () => + import(/* webpackChunkName: "zha-add-devices-page" */ "./zha-add-devices-page"), + }, + }, + }; + + private _listeners: Array<() => void> = []; + + public connectedCallback() { + super.connectedCallback(); + this._listeners.push( + listenMediaQuery("(min-width: 1040px)", (matches) => { + this._wide = matches; + }) + ); + this._listeners.push( + listenMediaQuery("(min-width: 1296px)", (matches) => { + this._wideSidebar = matches; + }) + ); + } + + public disconnectedCallback() { + super.disconnectedCallback(); + while (this._listeners.length) { + this._listeners.pop()!(); + } + } + + protected updatePageEl(el) { + el.route = this.routeTail; + el.hass = this.hass; + el.isWide = this.hass.dockedSidebar ? this._wideSidebar : this._wide; + } +} + +declare global { + interface HTMLElementTagNameMap { + "zha-config-panel": ZHAConfigPanel; + } +} diff --git a/src/panels/config/zha/zha-network.ts b/src/panels/config/zha/zha-network.ts index 87cf04383876..7c4c1fdbddb4 100644 --- a/src/panels/config/zha/zha-network.ts +++ b/src/panels/config/zha/zha-network.ts @@ -11,6 +11,7 @@ import "@polymer/paper-card/paper-card"; import "@polymer/paper-icon-button/paper-icon-button"; import "../../../components/buttons/ha-call-service-button"; import "../../../components/ha-service-description"; +import { navigate } from "../../../common/navigate"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import "../ha-config-section"; @@ -30,6 +31,7 @@ export class ZHANetwork extends LitElement { hass: {}, isWide: {}, _showHelp: {}, + _joinParams: {}, }; } @@ -37,29 +39,30 @@ export class ZHANetwork extends LitElement { return html`
- Network Management - + Network Management +
Commands that affect entire network -
- Permit - ${ - this._showHelp - ? html` - - ` - : "" - } +
+ + Add Devices + + ${this._showHelp + ? html` + + ` + : ""} +
`; @@ -69,6 +72,10 @@ export class ZHANetwork extends LitElement { this._showHelp = !this._showHelp; } + private _onAddDevicesClick() { + navigate(this, "add"); + } + static get styles(): CSSResult[] { return [ haStyle, diff --git a/src/panels/config/zha/zha-node.ts b/src/panels/config/zha/zha-node.ts index 959c7bc594f3..2edee43fab1e 100644 --- a/src/panels/config/zha/zha-node.ts +++ b/src/panels/config/zha/zha-node.ts @@ -70,14 +70,16 @@ export class ZHANode extends LitElement { public firstUpdated(changedProperties: PropertyValues): void { super.firstUpdated(changedProperties); - if (this._nodes.length === 0) { - this._fetchDevices(); - } this.addEventListener("hass-service-called", (ev) => this.serviceCalled(ev) ); } + public connectedCallback(): void { + super.connectedCallback(); + this._fetchDevices(); + } + protected serviceCalled(ev): void { // Check if this is for us if (ev.detail.success && ev.detail.service === "remove") { From 22f12d109605f5a9b3e98bd5b1a4974e72bccad0 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Mon, 18 Mar 2019 10:49:15 -0400 Subject: [PATCH 02/14] update device join page --- src/panels/config/zha/zha-add-devices-page.ts | 97 +++++++++++++++---- 1 file changed, 79 insertions(+), 18 deletions(-) diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index 5510174c180a..99c1e7207fd0 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -9,6 +9,8 @@ import { } from "lit-element"; import "@polymer/paper-spinner/paper-spinner"; import "../../../layouts/hass-subpage"; +import "../../../components/ha-service-description"; +import "@polymer/paper-icon-button/paper-icon-button"; import "./zha-device-card"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; @@ -21,20 +23,13 @@ class ZHAAddDevicesPage extends LitElement { @property() private _discoveredDevices: ZHADevice[] = []; @property() private _formattedEvents: string = ""; @property() private _active: boolean = false; + @property() private _showHelp: boolean = false; private _addDevicesTimeoutHandle: any = undefined; private _subscribed?: Promise<() => Promise>; public connectedCallback(): void { super.connectedCallback(); - this._active = true; - this._subscribed = this.hass!.connection.subscribeMessage( - (message) => this._handleMessage(message), - { type: "zha/devices/add" } - ); - this._addDevicesTimeoutHandle = setTimeout( - () => this._unsubscribe(), - 60000 - ); + this._subscribe(); } public disconnectedCallback(): void { @@ -48,13 +43,37 @@ class ZHAAddDevicesPage extends LitElement { protected render(): TemplateResult | void { return html` -

- - Searching for ZHA Zigbee devices... -

+ ${this._active + ? html` +

+ + Searching for ZHA Zigbee devices... +

+ ` + : html` +
+ + Search again + + + ${this._showHelp + ? html` + + ` + : ""} +
+ `} ${this._error ? html`
${this._error}
@@ -63,10 +82,12 @@ class ZHAAddDevicesPage extends LitElement {
-
+

Discovered devices:

+
+
${this._discoveredDevices.map( (device) => html` this._handleMessage(message), + { type: "zha/devices/add" } + ); + this._active = true; + this._addDevicesTimeoutHandle = setTimeout( + () => this._unsubscribe(), + 60000 + ); + } + + private _onHelpTap(): void { + this._showHelp = !this._showHelp; + } + static get styles(): CSSResult[] { return [ haStyle, css` + .content-header { + margin: 16px; + } .content { min-height: 325px; - margin: 16px; + display: flex; + flex-wrap: wrap; + padding: 4px; + justify-content: center; } .error { color: var(--google-red-500); @@ -143,6 +186,24 @@ class ZHAAddDevicesPage extends LitElement { max-height: 275px; overflow: scroll; } + .toggle-help-icon { + position: absolute; + margin-top: 16px; + margin-right: 16px; + top: -6px; + right: 0; + color: var(--primary-color); + } + ha-service-description { + margin-top: 16px; + margin-left: 16px; + display: block; + color: grey; + } + .search-button { + margin-top: 16px; + margin-left: 16px; + } `, ]; } From ceb4d6f396a964c19ce43948b1a8a8308b3f4658 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Mon, 18 Mar 2019 12:16:31 -0400 Subject: [PATCH 03/14] auto scroll log --- src/panels/config/zha/zha-add-devices-page.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index 99c1e7207fd0..b06e7567670c 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -79,9 +79,8 @@ class ZHAAddDevicesPage extends LitElement {
${this._error}
` : ""} -
- -
+ +

Discovered devices: @@ -106,6 +105,12 @@ class ZHAAddDevicesPage extends LitElement { private _handleMessage(message: any): void { if (message.type === "log_output") { this._formattedEvents += message.log_entry.message + "\n"; + if (this.shadowRoot) { + const textArea = this.shadowRoot.querySelector("ha-textarea"); + if (textArea) { + textArea.scrollTop = textArea.scrollHeight; + } + } } if (message.type && message.type === "device_fully_initialized") { this._discoveredDevices.push(message.device_info); From 72016bfae4b85a46cb21a6a4bdef2518d9a080c0 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Mon, 18 Mar 2019 16:23:02 -0400 Subject: [PATCH 04/14] update css and add device page layout --- src/data/zha.ts | 1 + src/panels/config/zha/types.ts | 6 + src/panels/config/zha/zha-add-devices-page.ts | 65 +++-- .../config/zha/zha-cluster-attributes.ts | 20 +- src/panels/config/zha/zha-cluster-commands.ts | 12 +- src/panels/config/zha/zha-clusters.ts | 8 +- src/panels/config/zha/zha-device-card.ts | 227 +++++++++++++++++- src/panels/config/zha/zha-network.ts | 6 + src/panels/config/zha/zha-node.ts | 221 ++++------------- src/translations/en.json | 13 +- 10 files changed, 366 insertions(+), 213 deletions(-) diff --git a/src/data/zha.ts b/src/data/zha.ts index bdb965e5bda0..517c0caaa0ce 100644 --- a/src/data/zha.ts +++ b/src/data/zha.ts @@ -16,6 +16,7 @@ export interface ZHADevice { manufacturer_code: number; device_reg_id: string; user_given_name: string; + area_id: string; } export interface Attribute { diff --git a/src/panels/config/zha/types.ts b/src/panels/config/zha/types.ts index 5e531c98aab5..3c416ee9cbcf 100644 --- a/src/panels/config/zha/types.ts +++ b/src/panels/config/zha/types.ts @@ -8,6 +8,12 @@ export interface ItemSelectedEvent { target?: PickerTarget; } +export interface ZHADeviceRemovedEvent { + detail?: { + device?: ZHADevice; + }; +} + export interface ChangeEvent { detail?: { value?: any; diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index b06e7567670c..36870d7d472d 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -42,7 +42,11 @@ class ZHAAddDevicesPage extends LitElement { protected render(): TemplateResult | void { return html` - + ${this._active ? html`

@@ -50,7 +54,9 @@ class ZHAAddDevicesPage extends LitElement { ?active="${this._active}" alt="Searching" > - Searching for ZHA Zigbee devices... + ${this.hass!.localize( + "ui.panel.config.zha.add_device_page.spinner" + )}

` : html` @@ -69,6 +75,7 @@ class ZHAAddDevicesPage extends LitElement { .hass="${this.hass}" domain="zha" service="permit" + class="help-text" /> ` : ""} @@ -79,25 +86,32 @@ class ZHAAddDevicesPage extends LitElement {
${this._error}
` : ""} - - -
-

- Discovered devices: -

-
+
- ${this._discoveredDevices.map( - (device) => html` - - ` - )} + ${this._discoveredDevices.length < 1 + ? html` +

+ ${this.hass!.localize( + "ui.panel.config.zha.add_device_page.discovery_text" + )} +

+ ` + : html` + ${this._discoveredDevices.map( + (device) => html` + + ` + )} + `}
+ +
`; } @@ -152,11 +166,13 @@ class ZHAAddDevicesPage extends LitElement { margin: 16px; } .content { - min-height: 325px; + border-top: 1px solid var(--light-primary-color); + min-height: 500px; display: flex; flex-wrap: wrap; padding: 4px; justify-content: center; + overflow: scroll; } .error { color: var(--google-red-500); @@ -178,7 +194,6 @@ class ZHAAddDevicesPage extends LitElement { flex: 1 0 300px; min-width: 0; max-width: 600px; - max-height: 450px; padding-left: 28px; padding-right: 28px; padding-bottom: 10px; @@ -187,8 +202,8 @@ class ZHAAddDevicesPage extends LitElement { margin: 16px; border-top: 1px solid var(--light-primary-color); padding-top: 16px; - min-height: 275px; - max-height: 275px; + min-height: 200px; + max-height: 200px; overflow: scroll; } .toggle-help-icon { @@ -209,6 +224,10 @@ class ZHAAddDevicesPage extends LitElement { margin-top: 16px; margin-left: 16px; } + .help-text { + color: grey; + padding: 16px; + } `, ]; } diff --git a/src/panels/config/zha/zha-cluster-attributes.ts b/src/panels/config/zha/zha-cluster-attributes.ts index c59126cbf2a7..fdd8efcc5741 100644 --- a/src/panels/config/zha/zha-cluster-attributes.ts +++ b/src/panels/config/zha/zha-cluster-attributes.ts @@ -115,7 +115,7 @@ export class ZHAClusterAttributes extends LitElement {

${this.showHelp ? html` -
+
Select an attribute to view or set its value
` @@ -152,6 +152,13 @@ export class ZHAClusterAttributes extends LitElement { Get Zigbee Attribute + ${this.showHelp + ? html` +
+ Get the value for the selected attribute +
+ ` + : ""} ` : ""} @@ -312,6 +320,16 @@ export class ZHAClusterAttributes extends LitElement { [hidden] { display: none; } + .help-text { + color: grey; + padding-left: 28px; + padding-right: 28px; + padding-bottom: 16px; + } + .help-text2 { + color: grey; + padding: 16px; + } `, ]; } diff --git a/src/panels/config/zha/zha-cluster-commands.ts b/src/panels/config/zha/zha-cluster-commands.ts index 28a68af9abda..b56a89b744ce 100644 --- a/src/panels/config/zha/zha-cluster-commands.ts +++ b/src/panels/config/zha/zha-cluster-commands.ts @@ -107,7 +107,7 @@ export class ZHAClusterCommands extends LitElement {
${this._showHelp ? html` -
Select a command to interact with
+
Select a command to interact with
` : ""} ${this._selectedCommandIndex !== -1 @@ -135,6 +135,7 @@ export class ZHAClusterCommands extends LitElement { .hass="${this.hass}" domain="zha" service="issue_zigbee_cluster_command" + class="help-text2" > ` : ""} @@ -242,7 +243,14 @@ export class ZHAClusterCommands extends LitElement { position: relative; } - .helpText { + .help-text { + color: grey; + padding-left: 28px; + padding-right: 28px; + padding-bottom: 16px; + } + + .help-text2 { color: grey; padding: 16px; } diff --git a/src/panels/config/zha/zha-clusters.ts b/src/panels/config/zha/zha-clusters.ts index bbabf3e2fa6c..8ba09f43f40c 100644 --- a/src/panels/config/zha/zha-clusters.ts +++ b/src/panels/config/zha/zha-clusters.ts @@ -90,7 +90,7 @@ export class ZHAClusters extends LitElement {
${this.showHelp ? html` -
+
Select cluster to view attributes and commands
` @@ -143,9 +143,11 @@ export class ZHAClusters extends LitElement { padding-right: 28px; padding-bottom: 10px; } - .helpText { + .help-text { color: grey; - padding: 16px; + padding-left: 28px; + padding-right: 28px; + padding-bottom: 16px; } `, ]; diff --git a/src/panels/config/zha/zha-device-card.ts b/src/panels/config/zha/zha-device-card.ts index d68d724ecbb7..9d1e861fe18a 100644 --- a/src/panels/config/zha/zha-device-card.ts +++ b/src/panels/config/zha/zha-device-card.ts @@ -4,25 +4,85 @@ import { property, TemplateResult, CSSResult, + PropertyValues, + customElement, css, } from "lit-element"; +import "@material/mwc-button"; +import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-icon-item"; import "@polymer/paper-item/paper-item-body"; import "@polymer/paper-card/paper-card"; import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; +import "../../../components/buttons/ha-call-service-button"; import { fireEvent } from "../../../common/dom/fire_event"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; - +import { NodeServiceData, ChangeEvent, ItemSelectedEvent } from "./types"; +import { + updateDeviceRegistryEntry, + DeviceRegistryEntryMutableParams, +} from "../../../data/device_registry"; +import { reconfigureNode, ZHADevice } from "../../../data/zha"; import "../../../components/entity/state-badge"; -import { ZHADevice } from "../../../data/zha"; +import { + fetchAreaRegistry, + AreaRegistryEntry, +} from "../../../data/area_registry"; +import compare from "../../../common/string/compare"; + +declare global { + // for fire event + interface HASSDomEvents { + "zha-device-removed": { + device?: ZHADevice; + }; + } +} +@customElement("zha-device-card") class ZHADeviceCard extends LitElement { @property() public hass?: HomeAssistant; @property() public narrow?: boolean; @property() public device?: ZHADevice; + @property() public showHelp: boolean = false; + @property() private _userSelectedName?: string; + @property() private _serviceData?: NodeServiceData; + @property() private _areas: AreaRegistryEntry[] = []; + @property() private _selectedAreaIndex: number = -1; + + public firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + this.addEventListener("hass-service-called", (ev) => + this.serviceCalled(ev) + ); + this._serviceData = { + ieee_address: this.device!.ieee, + }; + fetchAreaRegistry(this.hass!).then((areas) => { + this._areas = areas.sort((a, b) => compare(a.name, b.name)); + }); + } + + protected updated(changedProperties: PropertyValues): void { + if (changedProperties.has("device")) { + this._selectedAreaIndex = + this._areas.findIndex((area) => area.area_id === this.device!.area_id) + + 1; + } + super.update(changedProperties); + } + + protected serviceCalled(ev): void { + // Check if this is for us + if (ev.detail.success && ev.detail.service === "remove") { + fireEvent(this, "zha-device-removed", { + device: this.device, + }); + } + } protected render(): TemplateResult | void { return html` @@ -57,16 +117,147 @@ class ZHADeviceCard extends LitElement { ` )}
+
+ +
+
+ + + + ${this.hass!.localize( + "ui.panel.config.integrations.config_entry.no_area" + )} + + + ${this._areas.map( + (entry) => html` + ${entry.name} + ` + )} + + +
+
+ Reconfigure Device + ${this.showHelp + ? html` +
+ ${this.hass!.localize( + "ui.panel.config.zha.services.reconfigure" + )} +
+ ` + : ""} + Remove Device + ${this.showHelp + ? html` +
+ ${this.hass!.localize("ui.panel.config.zha.services.remove")} +
+ ` + : ""} + ${this.hass!.localize( + "ui.panel.config.zha.device_card.update_name_button" + )} + ${this.showHelp + ? html` +
+ ${this.hass!.localize( + "ui.panel.config.zha.services.updateDeviceName" + )} +
+ ` + : ""} +
`; } + private async _onReconfigureNodeClick(): Promise { + if (this.hass) { + await reconfigureNode(this.hass, this.device!.ieee); + } + } + + private _onUserSelectedNameChanged(value: ChangeEvent): void { + this._userSelectedName = value.detail!.value; + } + + private async _onUpdateDeviceNameClick(): Promise { + if (this.hass) { + const values: DeviceRegistryEntryMutableParams = { + name_by_user: this._userSelectedName, + area_id: this.device!.area_id ? this.device!.area_id : undefined, + }; + + await updateDeviceRegistryEntry( + this.hass, + this.device!.device_reg_id, + values + ); + + this.device!.user_given_name = this._userSelectedName!; + this._userSelectedName = ""; + } + } + private _openMoreInfo(ev: MouseEvent): void { fireEvent(this, "hass-more-info", { entityId: (ev.currentTarget as any).entity.entity_id, }); } + private async _selectedAreaChanged(event: ItemSelectedEvent) { + if (!this.device || !this._areas) { + return; + } + this._selectedAreaIndex = event!.target!.selected; + const area = this._areas[this._selectedAreaIndex - 1]; // account for No Area + if ( + (!area && !this.device.area_id) || + (area && area.area_id === this.device.area_id) + ) { + return; + } + + await updateDeviceRegistryEntry(this.hass!, this.device.device_reg_id, { + area_id: area ? area.area_id : undefined, + name_by_user: + this._userSelectedName || this._userSelectedName !== "" + ? this._userSelectedName + : undefined, + }); + } + static get styles(): CSSResult[] { return [ haStyle, @@ -104,6 +295,36 @@ class ZHADeviceCard extends LitElement { padding-top: 4px; padding-bottom: 4px; } + .editable { + padding-left: 28px; + padding-right: 28px; + padding-bottom: 10px; + } + .help-text { + color: grey; + padding: 16px; + } + .flex { + -ms-flex: 1 1 0.000000001px; + -webkit-flex: 1; + flex: 1; + -webkit-flex-basis: 0.000000001px; + flex-basis: 0.000000001px; + } + .node-picker { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-direction: row; + -webkit-flex-direction: row; + flex-direction: row; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding-left: 28px; + padding-right: 28px; + padding-bottom: 10px; + } `, ]; } @@ -114,5 +335,3 @@ declare global { "zha-device-card": ZHADeviceCard; } } - -customElements.define("zha-device-card", ZHADeviceCard); diff --git a/src/panels/config/zha/zha-network.ts b/src/panels/config/zha/zha-network.ts index 7c4c1fdbddb4..ee161ab95226 100644 --- a/src/panels/config/zha/zha-network.ts +++ b/src/panels/config/zha/zha-network.ts @@ -59,6 +59,7 @@ export class ZHANetwork extends LitElement { .hass="${this.hass}" domain="zha" service="permit" + class="help-text2" /> ` : ""} @@ -109,6 +110,11 @@ export class ZHANetwork extends LitElement { [hidden] { display: none; } + + .help-text2 { + color: grey; + padding: 16px; + } `, ]; } diff --git a/src/panels/config/zha/zha-node.ts b/src/panels/config/zha/zha-node.ts index 2edee43fab1e..d6e1b64adc8d 100644 --- a/src/panels/config/zha/zha-node.ts +++ b/src/panels/config/zha/zha-node.ts @@ -1,10 +1,10 @@ import { html, LitElement, - PropertyDeclarations, + property, TemplateResult, CSSResult, - PropertyValues, + customElement, css, } from "lit-element"; import "@material/mwc-button"; @@ -19,14 +19,10 @@ import "../../../components/ha-service-description"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import "../ha-config-section"; -import { ItemSelectedEvent, NodeServiceData, ChangeEvent } from "./types"; +import { ItemSelectedEvent, ZHADeviceRemovedEvent } from "./types"; import "./zha-clusters"; import "./zha-device-card"; -import { - updateDeviceRegistryEntry, - DeviceRegistryEntryMutableParams, -} from "../../../data/device_registry"; -import { reconfigureNode, fetchDevices, ZHADevice } from "../../../data/zha"; +import { fetchDevices, ZHADevice } from "../../../data/zha"; declare global { // for fire event @@ -37,62 +33,25 @@ declare global { } } +@customElement("zha-node") export class ZHANode extends LitElement { - public hass?: HomeAssistant; - public isWide?: boolean; - private _showHelp: boolean; - private _selectedNodeIndex: number; - private _selectedNode?: ZHADevice; - private _serviceData?: {}; - private _nodes: ZHADevice[]; - private _userSelectedName?: string; - - constructor() { - super(); - this._showHelp = false; - this._selectedNodeIndex = -1; - this._nodes = []; - } - - static get properties(): PropertyDeclarations { - return { - hass: {}, - isWide: {}, - _showHelp: {}, - _selectedNodeIndex: {}, - _selectedNode: {}, - _entities: {}, - _serviceData: {}, - _nodes: {}, - _userSelectedName: {}, - }; - } - - public firstUpdated(changedProperties: PropertyValues): void { - super.firstUpdated(changedProperties); - this.addEventListener("hass-service-called", (ev) => - this.serviceCalled(ev) - ); - } + @property() public hass?: HomeAssistant; + @property() public isWide?: boolean; + @property() private _showHelp: boolean = false; + @property() private _selectedDeviceIndex: number = -1; + @property() private _selectedDevice?: ZHADevice; + @property() private _nodes: ZHADevice[] = []; public connectedCallback(): void { super.connectedCallback(); this._fetchDevices(); } - protected serviceCalled(ev): void { - // Check if this is for us - if (ev.detail.success && ev.detail.service === "remove") { - this._selectedNodeIndex = -1; - this._fetchDevices(); - } - } - protected render(): TemplateResult | void { return html`
- Node Management + Device Management
- Run ZHA commands that affect a single node. Pick a node to see a list - of available commands.

Note: Sleepy (battery powered) + Run ZHA commands that affect a single device. Pick a device to see a + list of available commands.

Note: Sleepy (battery powered) devices need to be awake when executing commands against them. You can generally wake a sleepy device by triggering it.

Some devices such as Xiaomi sensors have a wake up button that you can @@ -110,11 +69,15 @@ export class ZHANode extends LitElement {
- + ${this._nodes.map( (entry) => html` @@ -130,95 +93,34 @@ export class ZHANode extends LitElement {
${this._showHelp ? html` -
- Select node to view per-node options +
+ Select device to view per-device options
` : ""} - ${this._selectedNodeIndex !== -1 + ${this._selectedDeviceIndex !== -1 ? html` ` : ""} - ${this._selectedNodeIndex !== -1 - ? html` -
- -
- ` - : ""} - ${this._selectedNodeIndex !== -1 ? this._renderNodeActions() : ""} - ${this._selectedNode ? this._renderClusters() : ""} + ${this._selectedDevice ? this._renderClusters() : ""} `; } - private _renderNodeActions(): TemplateResult { - return html` -
- Reconfigure Node - ${this._showHelp - ? html` -
- ${this.hass!.localize( - "ui.panel.config.zha.services.reconfigure" - )} -
- ` - : ""} - Remove Node - ${this._showHelp - ? html` - - ` - : ""} - Update Name - ${this._showHelp - ? html` -
- ${this.hass!.localize( - "ui.panel.config.zha.services.updateDeviceName" - )} -
- ` - : ""} -
- `; - } - private _renderClusters(): TemplateResult { return html` `; @@ -228,45 +130,10 @@ export class ZHANode extends LitElement { this._showHelp = !this._showHelp; } - private _selectedNodeChanged(event: ItemSelectedEvent): void { - this._selectedNodeIndex = event!.target!.selected; - this._selectedNode = this._nodes[this._selectedNodeIndex]; - this._userSelectedName = ""; - fireEvent(this, "zha-node-selected", { node: this._selectedNode }); - this._serviceData = this._computeNodeServiceData(); - } - - private async _onReconfigureNodeClick(): Promise { - if (this.hass) { - await reconfigureNode(this.hass, this._selectedNode!.ieee); - } - } - - private _onUserSelectedNameChanged(value: ChangeEvent): void { - this._userSelectedName = value.detail!.value; - } - - private async _onUpdateDeviceNameClick(): Promise { - if (this.hass) { - const values: DeviceRegistryEntryMutableParams = { - name_by_user: this._userSelectedName, - }; - - await updateDeviceRegistryEntry( - this.hass, - this._selectedNode!.device_reg_id, - values - ); - - this._selectedNode!.user_given_name = this._userSelectedName!; - this._userSelectedName = ""; - } - } - - private _computeNodeServiceData(): NodeServiceData { - return { - ieee_address: this._selectedNode!.ieee, - }; + private _selectedDeviceChanged(event: ItemSelectedEvent): void { + this._selectedDeviceIndex = event!.target!.selected; + this._selectedDevice = this._nodes[this._selectedDeviceIndex]; + fireEvent(this, "zha-node-selected", { node: this._selectedDevice }); } private async _fetchDevices() { @@ -275,6 +142,13 @@ export class ZHANode extends LitElement { }); } + private _onDeviceRemoved(event: ZHADeviceRemovedEvent): void { + this._selectedDeviceIndex = -1; + this._nodes.splice(this._nodes.indexOf(event.detail!.device!), 1); + this._selectedDevice = undefined; + fireEvent(this, "zha-node-selected", { node: this._selectedDevice }); + } + static get styles(): CSSResult[] { return [ haStyle, @@ -300,13 +174,10 @@ export class ZHANode extends LitElement { } .help-text { + color: grey; padding-left: 28px; padding-right: 28px; - } - - .helpText { - color: grey; - padding: 16px; + padding-bottom: 16px; } paper-card { @@ -357,12 +228,6 @@ export class ZHANode extends LitElement { right: 0; color: var(--primary-color); } - - .input-text { - padding-left: 28px; - padding-right: 28px; - padding-bottom: 10px; - } `, ]; } @@ -373,5 +238,3 @@ declare global { "zha-node": ZHANode; } } - -customElements.define("zha-node", ZHANode); diff --git a/src/translations/en.json b/src/translations/en.json index 67b7033392ea..29d5b8a73efd 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -875,7 +875,18 @@ "description": "Zigbee Home Automation network management", "services": { "reconfigure": "Reconfigure ZHA device (heal device). Use this if you are having issues with the device. If the device in question is a battery powered device please ensure it is awake and accepting commands when you use this service.", - "updateDeviceName": "Set a custom name for this device in the device registry." + "updateDeviceName": "Set a custom name for this device in the device registry.", + "remove": "Remove a device from the ZigBee network." + }, + "device_card": { + "device_name_placeholder": "User given name", + "area_picker_label": "Area", + "update_name_button": "Update Name" + }, + "add_device_page": { + "header": "Zigbee Home Automation - Add Devices", + "spinner": "Searching for ZHA Zigbee devices...", + "discovery_text": "Discovered devices will show up here. Follow the instructions for your device(s) and place the device(s) in pairing mode." } }, "zwave": { From e8b739a6f9e4de4787df5004eaaf245945491c98 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Mon, 18 Mar 2019 16:25:04 -0400 Subject: [PATCH 05/14] fix padding --- src/panels/config/zha/zha-add-devices-page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index 36870d7d472d..14d72e5af3f2 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -226,7 +226,7 @@ class ZHAAddDevicesPage extends LitElement { } .help-text { color: grey; - padding: 16px; + padding-left: 16px; } `, ]; From 07b52cf53e11cd3249f578eaf2903387b1815b6f Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Mon, 18 Mar 2019 16:58:47 -0400 Subject: [PATCH 06/14] fix missing imports --- src/panels/config/zha/zha-cluster-attributes.ts | 4 ++++ src/panels/config/zha/zha-cluster-commands.ts | 5 +++++ src/panels/config/zha/zha-clusters.ts | 3 +++ 3 files changed, 12 insertions(+) diff --git a/src/panels/config/zha/zha-cluster-attributes.ts b/src/panels/config/zha/zha-cluster-attributes.ts index fdd8efcc5741..72bd26be236f 100644 --- a/src/panels/config/zha/zha-cluster-attributes.ts +++ b/src/panels/config/zha/zha-cluster-attributes.ts @@ -29,6 +29,10 @@ import { SetAttributeServiceData, } from "./types"; import { formatAsPaddedHex } from "./functions"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-listbox/paper-listbox"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-input/paper-input"; export class ZHAClusterAttributes extends LitElement { public hass?: HomeAssistant; diff --git a/src/panels/config/zha/zha-cluster-commands.ts b/src/panels/config/zha/zha-cluster-commands.ts index b56a89b744ce..5dbb58579577 100644 --- a/src/panels/config/zha/zha-cluster-commands.ts +++ b/src/panels/config/zha/zha-cluster-commands.ts @@ -25,6 +25,11 @@ import { ItemSelectedEvent, } from "./types"; import { formatAsPaddedHex } from "./functions"; +import "@polymer/paper-input/paper-input"; +import "@polymer/paper-listbox/paper-listbox"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-icon-button/paper-icon-button"; +import "@polymer/paper-item/paper-item"; export class ZHAClusterCommands extends LitElement { public hass?: HomeAssistant; diff --git a/src/panels/config/zha/zha-clusters.ts b/src/panels/config/zha/zha-clusters.ts index 8ba09f43f40c..e47125174b13 100644 --- a/src/panels/config/zha/zha-clusters.ts +++ b/src/panels/config/zha/zha-clusters.ts @@ -17,6 +17,9 @@ import { HomeAssistant } from "../../../types"; import "../ha-config-section"; import { ItemSelectedEvent } from "./types"; import { formatAsPaddedHex } from "./functions"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-listbox/paper-listbox"; +import "@polymer/paper-item/paper-item"; declare global { // for fire event From a2dee8eaf1c1e3e967600af7f4233ec5dbdf765e Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Mon, 18 Mar 2019 17:15:04 -0400 Subject: [PATCH 07/14] fix imports --- src/panels/config/zha/ha-config-zha.ts | 22 +++++---- src/panels/config/zha/zha-add-devices-page.ts | 24 ++++++---- src/panels/config/zha/zha-binding.ts | 22 +++++---- .../config/zha/zha-cluster-attributes.ts | 28 ++++++----- src/panels/config/zha/zha-cluster-commands.ts | 26 +++++----- src/panels/config/zha/zha-clusters.ts | 22 +++++---- src/panels/config/zha/zha-config-panel.ts | 6 ++- src/panels/config/zha/zha-device-card.ts | 48 ++++++++++--------- src/panels/config/zha/zha-network.ts | 18 +++---- src/panels/config/zha/zha-node.ts | 32 +++++++------ 10 files changed, 137 insertions(+), 111 deletions(-) diff --git a/src/panels/config/zha/ha-config-zha.ts b/src/panels/config/zha/ha-config-zha.ts index 14414b4439cb..0c96d858a5d0 100755 --- a/src/panels/config/zha/ha-config-zha.ts +++ b/src/panels/config/zha/ha-config-zha.ts @@ -1,24 +1,26 @@ +import "../../../components/ha-paper-icon-button-arrow-prev"; +import "../../../layouts/hass-subpage"; +import "./zha-binding"; +import "./zha-cluster-attributes"; +import "./zha-cluster-commands"; +import "./zha-network"; +import "./zha-node"; +import "@polymer/paper-icon-button/paper-icon-button"; + import { + CSSResult, html, LitElement, property, PropertyValues, TemplateResult, - CSSResult, } from "lit-element"; -import "@polymer/paper-icon-button/paper-icon-button"; + import { HASSDomEvent } from "../../../common/dom/fire_event"; -import "../../../layouts/hass-subpage"; -import { Cluster, ZHADevice, fetchBindableDevices } from "../../../data/zha"; -import "../../../components/ha-paper-icon-button-arrow-prev"; +import { Cluster, fetchBindableDevices, ZHADevice } from "../../../data/zha"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import { ZHAClusterSelectedParams, ZHADeviceSelectedParams } from "./types"; -import "./zha-cluster-attributes"; -import "./zha-cluster-commands"; -import "./zha-network"; -import "./zha-node"; -import "./zha-binding"; export class HaConfigZha extends LitElement { @property() public hass?: HomeAssistant; diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index 14d72e5af3f2..28e225bbece8 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -1,20 +1,24 @@ +import "../../../components/ha-service-description"; +import "../../../components/ha-textarea"; +import "../../../layouts/hass-subpage"; +import "./zha-device-card"; +import "@material/mwc-button"; +import "@polymer/paper-icon-button/paper-icon-button"; +import "@polymer/paper-spinner/paper-spinner"; + import { - LitElement, - html, css, - property, CSSResult, - TemplateResult, customElement, + html, + LitElement, + property, + TemplateResult, } from "lit-element"; -import "@polymer/paper-spinner/paper-spinner"; -import "../../../layouts/hass-subpage"; -import "../../../components/ha-service-description"; -import "@polymer/paper-icon-button/paper-icon-button"; -import "./zha-device-card"; + +import { ZHADevice } from "../../../data/zha"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import { ZHADevice } from "../../../data/zha"; @customElement("zha-add-devices-page") class ZHAAddDevicesPage extends LitElement { diff --git a/src/panels/config/zha/zha-binding.ts b/src/panels/config/zha/zha-binding.ts index 3394262a8352..a2bc43c24719 100644 --- a/src/panels/config/zha/zha-binding.ts +++ b/src/panels/config/zha/zha-binding.ts @@ -1,20 +1,26 @@ +import "../../../components/buttons/ha-call-service-button"; +import "../../../components/ha-service-description"; +import "../ha-config-section"; +import "@material/mwc-button/mwc-button"; +import "@polymer/paper-card/paper-card"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-icon-button/paper-icon-button"; +import "@polymer/paper-listbox/paper-listbox"; + import { + css, + CSSResult, + customElement, html, LitElement, property, PropertyValues, TemplateResult, - CSSResult, - css, - customElement, } from "lit-element"; -import "@polymer/paper-card/paper-card"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-service-description"; -import { ZHADevice, bindDevices, unbindDevices } from "../../../data/zha"; + +import { bindDevices, unbindDevices, ZHADevice } from "../../../data/zha"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; import { ItemSelectedEvent } from "./types"; @customElement("zha-binding-control") diff --git a/src/panels/config/zha/zha-cluster-attributes.ts b/src/panels/config/zha/zha-cluster-attributes.ts index 72bd26be236f..ce3b03435fab 100644 --- a/src/panels/config/zha/zha-cluster-attributes.ts +++ b/src/panels/config/zha/zha-cluster-attributes.ts @@ -1,17 +1,24 @@ +import "../../../components/buttons/ha-call-service-button"; +import "../../../components/ha-service-description"; +import "../ha-config-section"; +import "@material/mwc-button"; +import "@polymer/paper-card/paper-card"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-icon-button/paper-icon-button"; +import "@polymer/paper-input/paper-input"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; + import { + css, + CSSResult, html, LitElement, PropertyDeclarations, PropertyValues, TemplateResult, - CSSResult, - css, } from "lit-element"; -import "@material/mwc-button"; -import "@polymer/paper-card/paper-card"; -import "@polymer/paper-icon-button/paper-icon-button"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-service-description"; + import { Attribute, Cluster, @@ -22,17 +29,12 @@ import { } from "../../../data/zha"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +import { formatAsPaddedHex } from "./functions"; import { ChangeEvent, ItemSelectedEvent, SetAttributeServiceData, } from "./types"; -import { formatAsPaddedHex } from "./functions"; -import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "@polymer/paper-listbox/paper-listbox"; -import "@polymer/paper-item/paper-item"; -import "@polymer/paper-input/paper-input"; export class ZHAClusterAttributes extends LitElement { public hass?: HomeAssistant; diff --git a/src/panels/config/zha/zha-cluster-commands.ts b/src/panels/config/zha/zha-cluster-commands.ts index 5dbb58579577..d8bbcac2e428 100644 --- a/src/panels/config/zha/zha-cluster-commands.ts +++ b/src/panels/config/zha/zha-cluster-commands.ts @@ -1,15 +1,23 @@ +import "../../../components/buttons/ha-call-service-button"; +import "../../../components/ha-service-description"; +import "../ha-config-section"; +import "@polymer/paper-card/paper-card"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-icon-button/paper-icon-button"; +import "@polymer/paper-input/paper-input"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; + import { + css, + CSSResult, html, LitElement, PropertyDeclarations, PropertyValues, TemplateResult, - CSSResult, - css, } from "lit-element"; -import "@polymer/paper-card/paper-card"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-service-description"; + import { Cluster, Command, @@ -18,18 +26,12 @@ import { } from "../../../data/zha"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; +import { formatAsPaddedHex } from "./functions"; import { ChangeEvent, IssueCommandServiceData, ItemSelectedEvent, } from "./types"; -import { formatAsPaddedHex } from "./functions"; -import "@polymer/paper-input/paper-input"; -import "@polymer/paper-listbox/paper-listbox"; -import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "@polymer/paper-icon-button/paper-icon-button"; -import "@polymer/paper-item/paper-item"; export class ZHAClusterCommands extends LitElement { public hass?: HomeAssistant; diff --git a/src/panels/config/zha/zha-clusters.ts b/src/panels/config/zha/zha-clusters.ts index e47125174b13..512cc16d7dc9 100644 --- a/src/panels/config/zha/zha-clusters.ts +++ b/src/panels/config/zha/zha-clusters.ts @@ -1,25 +1,27 @@ +import "../../../components/buttons/ha-call-service-button"; +import "../../../components/ha-service-description"; +import "../ha-config-section"; +import "@polymer/paper-card/paper-card"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; + import { + css, + CSSResult, html, LitElement, PropertyDeclarations, PropertyValues, TemplateResult, - CSSResult, - css, } from "lit-element"; -import "@polymer/paper-card/paper-card"; + import { fireEvent } from "../../../common/dom/fire_event"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-service-description"; import { Cluster, fetchClustersForZhaNode, ZHADevice } from "../../../data/zha"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; -import { ItemSelectedEvent } from "./types"; import { formatAsPaddedHex } from "./functions"; -import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "@polymer/paper-listbox/paper-listbox"; -import "@polymer/paper-item/paper-item"; +import { ItemSelectedEvent } from "./types"; declare global { // for fire event diff --git a/src/panels/config/zha/zha-config-panel.ts b/src/panels/config/zha/zha-config-panel.ts index a79788bbced3..99f1764bdd58 100644 --- a/src/panels/config/zha/zha-config-panel.ts +++ b/src/panels/config/zha/zha-config-panel.ts @@ -1,11 +1,13 @@ -import { property, customElement } from "lit-element"; import "../../../layouts/hass-loading-screen"; -import { HomeAssistant } from "../../../types"; + +import { customElement, property } from "lit-element"; + import { listenMediaQuery } from "../../../common/dom/media_query"; import { HassRouterPage, RouterOptions, } from "../../../layouts/hass-router-page"; +import { HomeAssistant } from "../../../types"; @customElement("zha-config-panel") class ZHAConfigPanel extends HassRouterPage { diff --git a/src/panels/config/zha/zha-device-card.ts b/src/panels/config/zha/zha-device-card.ts index 9d1e861fe18a..99e70fe91f32 100644 --- a/src/panels/config/zha/zha-device-card.ts +++ b/src/panels/config/zha/zha-device-card.ts @@ -1,37 +1,39 @@ +import "../../../components/buttons/ha-call-service-button"; +import "../../../components/entity/state-badge"; +import "@material/mwc-button"; +import "@polymer/paper-card/paper-card"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-input/paper-input"; +import "@polymer/paper-item/paper-icon-item"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-item/paper-item-body"; +import "@polymer/paper-listbox/paper-listbox"; + import { + css, + CSSResult, + customElement, html, LitElement, property, - TemplateResult, - CSSResult, PropertyValues, - customElement, - css, + TemplateResult, } from "lit-element"; -import "@material/mwc-button"; -import "@polymer/paper-input/paper-input"; -import "@polymer/paper-item/paper-icon-item"; -import "@polymer/paper-item/paper-item-body"; -import "@polymer/paper-card/paper-card"; -import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; -import "@polymer/paper-item/paper-item"; -import "@polymer/paper-listbox/paper-listbox"; -import "../../../components/buttons/ha-call-service-button"; + import { fireEvent } from "../../../common/dom/fire_event"; -import { haStyle } from "../../../resources/styles"; -import { HomeAssistant } from "../../../types"; -import { NodeServiceData, ChangeEvent, ItemSelectedEvent } from "./types"; +import compare from "../../../common/string/compare"; +import { + AreaRegistryEntry, + fetchAreaRegistry, +} from "../../../data/area_registry"; import { - updateDeviceRegistryEntry, DeviceRegistryEntryMutableParams, + updateDeviceRegistryEntry, } from "../../../data/device_registry"; import { reconfigureNode, ZHADevice } from "../../../data/zha"; -import "../../../components/entity/state-badge"; -import { - fetchAreaRegistry, - AreaRegistryEntry, -} from "../../../data/area_registry"; -import compare from "../../../common/string/compare"; +import { haStyle } from "../../../resources/styles"; +import { HomeAssistant } from "../../../types"; +import { ChangeEvent, ItemSelectedEvent, NodeServiceData } from "./types"; declare global { // for fire event diff --git a/src/panels/config/zha/zha-network.ts b/src/panels/config/zha/zha-network.ts index ee161ab95226..b6c92d694e38 100644 --- a/src/panels/config/zha/zha-network.ts +++ b/src/panels/config/zha/zha-network.ts @@ -1,20 +1,22 @@ +import "../../../components/buttons/ha-call-service-button"; +import "../../../components/ha-service-description"; +import "../ha-config-section"; +import "@material/mwc-button"; +import "@polymer/paper-card/paper-card"; +import "@polymer/paper-icon-button/paper-icon-button"; + import { + css, + CSSResult, html, LitElement, PropertyDeclarations, TemplateResult, - CSSResult, - css, } from "lit-element"; -import "@material/mwc-button"; -import "@polymer/paper-card/paper-card"; -import "@polymer/paper-icon-button/paper-icon-button"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-service-description"; + import { navigate } from "../../../common/navigate"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; export class ZHANetwork extends LitElement { public hass?: HomeAssistant; diff --git a/src/panels/config/zha/zha-node.ts b/src/panels/config/zha/zha-node.ts index d6e1b64adc8d..3dafd86e9667 100644 --- a/src/panels/config/zha/zha-node.ts +++ b/src/panels/config/zha/zha-node.ts @@ -1,28 +1,30 @@ -import { - html, - LitElement, - property, - TemplateResult, - CSSResult, - customElement, - css, -} from "lit-element"; +import "../../../components/buttons/ha-call-service-button"; +import "../../../components/ha-service-description"; +import "../ha-config-section"; +import "./zha-clusters"; +import "./zha-device-card"; import "@material/mwc-button"; import "@polymer/paper-card/paper-card"; import "@polymer/paper-icon-button/paper-icon-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox/paper-listbox"; + +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; + import { fireEvent } from "../../../common/dom/fire_event"; -import "../../../components/buttons/ha-call-service-button"; -import "../../../components/ha-service-description"; +import { fetchDevices, ZHADevice } from "../../../data/zha"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import "../ha-config-section"; import { ItemSelectedEvent, ZHADeviceRemovedEvent } from "./types"; -import "./zha-clusters"; -import "./zha-device-card"; -import { fetchDevices, ZHADevice } from "../../../data/zha"; declare global { // for fire event From d69c3f9552eae61ee40d2d147651903fddb66f23 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Mon, 18 Mar 2019 20:32:06 -0400 Subject: [PATCH 08/14] add -> permit --- src/panels/config/zha/zha-add-devices-page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index 28e225bbece8..a6f838fbee2b 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -149,7 +149,7 @@ class ZHAAddDevicesPage extends LitElement { private _subscribe(): void { this._subscribed = this.hass!.connection.subscribeMessage( (message) => this._handleMessage(message), - { type: "zha/devices/add" } + { type: "zha/devices/permit" } ); this._active = true; this._addDevicesTimeoutHandle = setTimeout( From 3e002318796756ce96f85cb24b0d5b51d17eebf1 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Tue, 19 Mar 2019 07:41:28 -0400 Subject: [PATCH 09/14] left justify device cards to prevent jumping --- src/panels/config/zha/zha-add-devices-page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index a6f838fbee2b..4f5ff9d4513b 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -175,7 +175,7 @@ class ZHAAddDevicesPage extends LitElement { display: flex; flex-wrap: wrap; padding: 4px; - justify-content: center; + justify-content: left; overflow: scroll; } .error { From fa986d3305ae485d65b46c7329d2a26c9b6a1042 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Thu, 21 Mar 2019 09:36:26 -0400 Subject: [PATCH 10/14] conditionally display entity ids --- src/panels/config/zha/zha-add-devices-page.ts | 5 +- src/panels/config/zha/zha-device-card.ts | 100 +++++++++++++----- src/panels/config/zha/zha-node.ts | 1 + 3 files changed, 77 insertions(+), 29 deletions(-) diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index 4f5ff9d4513b..7b66c7dad8f8 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -23,6 +23,7 @@ import { HomeAssistant } from "../../../types"; @customElement("zha-add-devices-page") class ZHAAddDevicesPage extends LitElement { @property() public hass!: HomeAssistant; + @property() public isWide?: boolean; @property() private _error?: string; @property() private _discoveredDevices: ZHADevice[] = []; @property() private _formattedEvents: string = ""; @@ -107,8 +108,10 @@ class ZHAAddDevicesPage extends LitElement { class="card" .hass="${this.hass}" .device="${device}" - .narrow="${true}" + .narrow="${!this.isWide}" .showHelp="${this._showHelp}" + .showRemove="${!this._active}" + .isJoinPage="${true}" > ` )} diff --git a/src/panels/config/zha/zha-device-card.ts b/src/panels/config/zha/zha-device-card.ts index 99e70fe91f32..7d556ba5bc14 100644 --- a/src/panels/config/zha/zha-device-card.ts +++ b/src/panels/config/zha/zha-device-card.ts @@ -50,7 +50,9 @@ class ZHADeviceCard extends LitElement { @property() public narrow?: boolean; @property() public device?: ZHADevice; @property() public showHelp: boolean = false; - @property() private _userSelectedName?: string; + @property() public showRemove: boolean = true; + @property() public isJoinPage?: boolean; + @property() private _userSelectedName?: string = ""; @property() private _serviceData?: NodeServiceData; @property() private _areas: AreaRegistryEntry[] = []; @property() private _selectedAreaIndex: number = -1; @@ -88,15 +90,31 @@ class ZHADeviceCard extends LitElement { protected render(): TemplateResult | void { return html` - + + ${this.isJoinPage + ? html` +
+
${this.device!.model}
+
+ ${this.hass!.localize( + "ui.panel.config.integrations.config_entry.manuf", + "manufacturer", + this.device!.manufacturer + )} +
+
+ ` + : ""}
-
IEEE:
-
${this.device!.ieee}
-
Quirk applied:
-
${this.device!.quirk_applied}
-
Quirk:
-
${this.device!.quirk_class}
+
IEEE:
+
${this.device!.ieee}
+ ${this.device!.quirk_applied + ? html` +
Quirk:
+
${this.device!.quirk_class}
+ ` + : ""}
@@ -111,10 +129,16 @@ class ZHADeviceCard extends LitElement { .stateObj="${this.hass!.states[entity.entity_id]}" slot="item-icon" > - -
${entity.name}
-
${entity.entity_id}
-
+ ${!this.isJoinPage + ? html` + +
${entity.name}
+
+ ${entity.entity_id} +
+
+ ` + : ""} ` )} @@ -168,24 +192,29 @@ class ZHADeviceCard extends LitElement {
` : ""} - Remove Device - ${this.showHelp + ${this.showRemove ? html` -
- ${this.hass!.localize("ui.panel.config.zha.services.remove")} -
+ Remove Device + ${this.showHelp + ? html` +
+ ${this.hass!.localize( + "ui.panel.config.zha.services.remove" + )} +
+ ` + : ""} ` : ""} ${this.hass!.localize( "ui.panel.config.zha.device_card.update_name_button" )} ` : ""} From 74d276c983cf448c00c41345b11532c3361c579d Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Thu, 21 Mar 2019 10:33:31 -0400 Subject: [PATCH 11/14] cleanup --- src/panels/config/zha/zha-add-devices-page.ts | 14 +- src/panels/config/zha/zha-device-card.ts | 151 ++++++++---------- src/panels/config/zha/zha-node.ts | 1 + 3 files changed, 72 insertions(+), 94 deletions(-) diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index 7b66c7dad8f8..2b550914fb2d 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -110,7 +110,7 @@ class ZHAAddDevicesPage extends LitElement { .device="${device}" .narrow="${!this.isWide}" .showHelp="${this._showHelp}" - .showRemove="${!this._active}" + .showActions="${!this._active}" .isJoinPage="${true}" > ` @@ -196,14 +196,10 @@ class ZHAAddDevicesPage extends LitElement { margin-left: 16px; } .card { - box-sizing: border-box; - display: flex; - flex: 1 0 300px; - min-width: 0; - max-width: 600px; - padding-left: 28px; - padding-right: 28px; - padding-bottom: 10px; + margin-left: 28px; + margin-right: 0px; + margin-bottom: 0px; + margin-top: 10px; } .events { margin: 16px; diff --git a/src/panels/config/zha/zha-device-card.ts b/src/panels/config/zha/zha-device-card.ts index 7d556ba5bc14..c37d3902d9a5 100644 --- a/src/panels/config/zha/zha-device-card.ts +++ b/src/panels/config/zha/zha-device-card.ts @@ -33,7 +33,7 @@ import { import { reconfigureNode, ZHADevice } from "../../../data/zha"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import { ChangeEvent, ItemSelectedEvent, NodeServiceData } from "./types"; +import { ItemSelectedEvent, NodeServiceData } from "./types"; declare global { // for fire event @@ -50,9 +50,8 @@ class ZHADeviceCard extends LitElement { @property() public narrow?: boolean; @property() public device?: ZHADevice; @property() public showHelp: boolean = false; - @property() public showRemove: boolean = true; + @property() public showActions?: boolean; @property() public isJoinPage?: boolean; - @property() private _userSelectedName?: string = ""; @property() private _serviceData?: NodeServiceData; @property() private _areas: AreaRegistryEntry[] = []; @property() private _selectedAreaIndex: number = -1; @@ -91,30 +90,34 @@ class ZHADeviceCard extends LitElement { protected render(): TemplateResult | void { return html` - ${this.isJoinPage - ? html` -
-
${this.device!.model}
-
- ${this.hass!.localize( - "ui.panel.config.integrations.config_entry.manuf", - "manufacturer", - this.device!.manufacturer - )} + ${ + this.isJoinPage + ? html` +
+
${this.device!.model}
+
+ ${this.hass!.localize( + "ui.panel.config.integrations.config_entry.manuf", + "manufacturer", + this.device!.manufacturer + )} +
-
- ` - : ""} + ` + : "" + }
IEEE:
${this.device!.ieee}
- ${this.device!.quirk_applied - ? html` -
Quirk:
-
${this.device!.quirk_class}
- ` - : ""} + ${ + this.device!.quirk_applied + ? html` +
Quirk:
+
${this.device!.quirk_class}
+ ` + : "" + }
@@ -146,8 +149,7 @@ class ZHADeviceCard extends LitElement {
-
- Reconfigure Device - ${this.showHelp + ${ + this.showActions ? html` -
- ${this.hass!.localize( - "ui.panel.config.zha.services.reconfigure" - )} -
- ` - : ""} - ${this.showRemove - ? html` - Remove Device - ${this.showHelp - ? html` -
- ${this.hass!.localize( - "ui.panel.config.zha.services.remove" - )} -
- ` - : ""} - ` - : ""} - ${this.hass!.localize( - "ui.panel.config.zha.device_card.update_name_button" - )} - ${this.showHelp - ? html` -
- ${this.hass!.localize( - "ui.panel.config.zha.services.updateDeviceName" - )} +
+ Reconfigure Device + ${this.showHelp + ? html` +
+ ${this.hass!.localize( + "ui.panel.config.zha.services.reconfigure" + )} +
+ ` + : ""} + + Remove Device + ${this.showHelp + ? html` +
+ ${this.hass!.localize( + "ui.panel.config.zha.services.remove" + )} +
+ ` + : ""}
` - : ""} + : "" + }
`; @@ -239,14 +229,10 @@ class ZHADeviceCard extends LitElement { } } - private _onUserSelectedNameChanged(value: ChangeEvent): void { - this._userSelectedName = value.detail!.value; - } - - private async _onUpdateDeviceNameClick(): Promise { + private async _saveCustomName(event): Promise { if (this.hass) { const values: DeviceRegistryEntryMutableParams = { - name_by_user: this._userSelectedName, + name_by_user: event.target.value, area_id: this.device!.area_id ? this.device!.area_id : undefined, }; @@ -256,8 +242,7 @@ class ZHADeviceCard extends LitElement { values ); - this.device!.user_given_name = this._userSelectedName!; - this._userSelectedName = ""; + this.device!.user_given_name = event.target.value; } } @@ -282,10 +267,7 @@ class ZHADeviceCard extends LitElement { await updateDeviceRegistryEntry(this.hass!, this.device.device_reg_id, { area_id: area ? area.area_id : undefined, - name_by_user: - this._userSelectedName || this._userSelectedName !== "" - ? this._userSelectedName - : undefined, + name_by_user: this.device!.user_given_name, }); } @@ -304,7 +286,7 @@ class ZHADeviceCard extends LitElement { paper-card { flex: 1 0 100%; padding-bottom: 10px; - min-width: 0; + min-width: 425px; } .device { width: 30%; @@ -329,11 +311,10 @@ class ZHADeviceCard extends LitElement { dl dt { padding-left: 12px; float: left; - width: 100px; + width: 50px; text-align: left; } dt dd { - margin-left: 10px; text-align: left; } paper-icon-item { diff --git a/src/panels/config/zha/zha-node.ts b/src/panels/config/zha/zha-node.ts index 71206c8a3aa6..39ab5a11817a 100644 --- a/src/panels/config/zha/zha-node.ts +++ b/src/panels/config/zha/zha-node.ts @@ -108,6 +108,7 @@ export class ZHANode extends LitElement { .device="${this._selectedDevice}" .narrow="${!this.isWide}" .showHelp="${this._showHelp}" + .showActions="${true}" @zha-device-removed="${this._onDeviceRemoved}" .isJoinPage="${false}" > From 8107ef88f370c24e5465d6b3d1a7af5b61ac5185 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Thu, 21 Mar 2019 11:21:59 -0400 Subject: [PATCH 12/14] fix vertical alignment --- src/panels/config/zha/zha-add-devices-page.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/panels/config/zha/zha-add-devices-page.ts b/src/panels/config/zha/zha-add-devices-page.ts index 2b550914fb2d..9ebcce185a1f 100644 --- a/src/panels/config/zha/zha-add-devices-page.ts +++ b/src/panels/config/zha/zha-add-devices-page.ts @@ -95,11 +95,13 @@ class ZHAAddDevicesPage extends LitElement {
${this._discoveredDevices.length < 1 ? html` -

- ${this.hass!.localize( - "ui.panel.config.zha.add_device_page.discovery_text" - )} -

+
+

+ ${this.hass!.localize( + "ui.panel.config.zha.add_device_page.discovery_text" + )} +

+
` : html` ${this._discoveredDevices.map( @@ -169,6 +171,7 @@ class ZHAAddDevicesPage extends LitElement { return [ haStyle, css` + .discovery-text, .content-header { margin: 16px; } @@ -196,8 +199,8 @@ class ZHAAddDevicesPage extends LitElement { margin-left: 16px; } .card { - margin-left: 28px; - margin-right: 0px; + margin-left: 16px; + margin-right: 16px; margin-bottom: 0px; margin-top: 10px; } From d3c9a42822d7b3b94af9485c09fc237389f63723 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Sat, 23 Mar 2019 07:25:25 -0400 Subject: [PATCH 13/14] review comments --- src/panels/config/zha/zha-config-panel.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/panels/config/zha/zha-config-panel.ts b/src/panels/config/zha/zha-config-panel.ts index 99f1764bdd58..114c0f20ffd9 100644 --- a/src/panels/config/zha/zha-config-panel.ts +++ b/src/panels/config/zha/zha-config-panel.ts @@ -35,7 +35,7 @@ class ZHAConfigPanel extends HassRouterPage { private _listeners: Array<() => void> = []; - public connectedCallback() { + public connectedCallback(): void { super.connectedCallback(); this._listeners.push( listenMediaQuery("(min-width: 1040px)", (matches) => { @@ -49,14 +49,14 @@ class ZHAConfigPanel extends HassRouterPage { ); } - public disconnectedCallback() { + public disconnectedCallback(): void { super.disconnectedCallback(); while (this._listeners.length) { this._listeners.pop()!(); } } - protected updatePageEl(el) { + protected updatePageEl(el): void { el.route = this.routeTail; el.hass = this.hass; el.isWide = this.hass.dockedSidebar ? this._wideSidebar : this._wide; From 18df68f6e8f9d6f21206df9526edfed68a0c8bec Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Mon, 25 Mar 2019 08:43:24 -0400 Subject: [PATCH 14/14] fix manufacturer overrides --- src/data/zha.ts | 2 +- src/panels/config/zha/types.ts | 2 +- src/panels/config/zha/zha-cluster-attributes.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/zha.ts b/src/data/zha.ts index 517c0caaa0ce..87ac9a3a8856 100644 --- a/src/data/zha.ts +++ b/src/data/zha.ts @@ -43,7 +43,7 @@ export interface ReadAttributeServiceData { cluster_id: number; cluster_type: string; attribute: number; - manufacturer: number; + manufacturer?: number; } export const reconfigureNode = ( diff --git a/src/panels/config/zha/types.ts b/src/panels/config/zha/types.ts index 3c416ee9cbcf..c785614efbc9 100644 --- a/src/panels/config/zha/types.ts +++ b/src/panels/config/zha/types.ts @@ -28,7 +28,7 @@ export interface SetAttributeServiceData { cluster_type: string; attribute: number; value: any; - manufacturer: number; + manufacturer?: number; } export interface IssueCommandServiceData { diff --git a/src/panels/config/zha/zha-cluster-attributes.ts b/src/panels/config/zha/zha-cluster-attributes.ts index ce3b03435fab..10f4a3677ec1 100644 --- a/src/panels/config/zha/zha-cluster-attributes.ts +++ b/src/panels/config/zha/zha-cluster-attributes.ts @@ -215,7 +215,7 @@ export class ZHAClusterAttributes extends LitElement { attribute: this._attributes[this._selectedAttributeIndex].id, manufacturer: this._manufacturerCodeOverride ? parseInt(this._manufacturerCodeOverride as string, 10) - : this.selectedNode!.manufacturer_code, + : undefined, }; } @@ -234,7 +234,7 @@ export class ZHAClusterAttributes extends LitElement { value: this._attributeValue, manufacturer: this._manufacturerCodeOverride ? parseInt(this._manufacturerCodeOverride as string, 10) - : this.selectedNode!.manufacturer_code, + : undefined, }; }