+
Select an attribute to view or set its value
`
@@ -152,6 +158,13 @@ export class ZHAClusterAttributes extends LitElement {
Get Zigbee Attribute
+ ${this.showHelp
+ ? html`
+
+ Get the value for the selected attribute
+
+ `
+ : ""}
`
: ""}
@@ -201,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,
};
}
@@ -220,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,
};
}
@@ -312,6 +326,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 28a68af9ab..d8bbcac2e4 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,13 +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";
export class ZHAClusterCommands extends LitElement {
public hass?: HomeAssistant;
@@ -107,7 +114,7 @@ export class ZHAClusterCommands extends LitElement {
${this._showHelp
? html`
-
+
Select cluster to view attributes and commands
`
@@ -143,9 +148,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-config-panel.ts b/src/panels/config/zha/zha-config-panel.ts
new file mode 100644
index 0000000000..114c0f20ff
--- /dev/null
+++ b/src/panels/config/zha/zha-config-panel.ts
@@ -0,0 +1,70 @@
+import "../../../layouts/hass-loading-screen";
+
+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 {
+ @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(): void {
+ 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(): void {
+ super.disconnectedCallback();
+ while (this._listeners.length) {
+ this._listeners.pop()!();
+ }
+ }
+
+ protected updatePageEl(el): void {
+ 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-device-card.ts b/src/panels/config/zha/zha-device-card.ts
index d68d724ecb..c37d3902d9 100644
--- a/src/panels/config/zha/zha-device-card.ts
+++ b/src/panels/config/zha/zha-device-card.ts
@@ -1,40 +1,123 @@
+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,
+ PropertyValues,
TemplateResult,
- CSSResult,
- css,
} from "lit-element";
-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 { fireEvent } from "../../../common/dom/fire_event";
+import compare from "../../../common/string/compare";
+import {
+ AreaRegistryEntry,
+ fetchAreaRegistry,
+} from "../../../data/area_registry";
+import {
+ DeviceRegistryEntryMutableParams,
+ updateDeviceRegistryEntry,
+} from "../../../data/device_registry";
+import { reconfigureNode, ZHADevice } from "../../../data/zha";
import { haStyle } from "../../../resources/styles";
import { HomeAssistant } from "../../../types";
+import { ItemSelectedEvent, NodeServiceData } from "./types";
-import "../../../components/entity/state-badge";
-import { ZHADevice } from "../../../data/zha";
+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() public showActions?: boolean;
+ @property() public isJoinPage?: boolean;
+ @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`
-
+
+ ${
+ 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}
+ `
+ : ""
+ }
@@ -49,24 +132,145 @@ 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}
+
+
+ `
+ : ""}
`
)}
+