+
Fire an event on the event bus.
-
-
-
-
Fire an event on the event bus.
-
-
-
-
-
-
-
-
+
-
-
+
+
+
+
+
+
+
`;
}
@@ -139,4 +122,4 @@ class HaPanelDevEvent extends EventsMixin(PolymerElement) {
}
}
-customElements.define("ha-panel-dev-event", HaPanelDevEvent);
+customElements.define("developer-tools-event", HaPanelDevEvent);
diff --git a/src/panels/dev-event/event-subscribe-card.ts b/src/panels/developer-tools/event/event-subscribe-card.ts
similarity index 93%
rename from src/panels/dev-event/event-subscribe-card.ts
rename to src/panels/developer-tools/event/event-subscribe-card.ts
index cc0196b235..4b56290f86 100644
--- a/src/panels/dev-event/event-subscribe-card.ts
+++ b/src/panels/developer-tools/event/event-subscribe-card.ts
@@ -10,10 +10,10 @@ import {
import "@material/mwc-button";
import "@polymer/paper-input/paper-input";
import { HassEvent } from "home-assistant-js-websocket";
-import { HomeAssistant } from "../../types";
-import { PolymerChangedEvent } from "../../polymer-types";
-import "../../components/ha-card";
-import format_time from "../../common/datetime/format_time";
+import { HomeAssistant } from "../../../types";
+import { PolymerChangedEvent } from "../../../polymer-types";
+import "../../../components/ha-card";
+import format_time from "../../../common/datetime/format_time";
@customElement("event-subscribe-card")
class EventSubscribeCard extends LitElement {
diff --git a/src/panels/dev-event/events-list.js b/src/panels/developer-tools/event/events-list.js
similarity index 95%
rename from src/panels/dev-event/events-list.js
rename to src/panels/developer-tools/event/events-list.js
index f27d9bd929..3ffba2e5f5 100644
--- a/src/panels/dev-event/events-list.js
+++ b/src/panels/developer-tools/event/events-list.js
@@ -1,7 +1,7 @@
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
-import { EventsMixin } from "../../mixins/events-mixin";
+import { EventsMixin } from "../../../mixins/events-mixin";
/*
* @appliesMixin EventsMixin
diff --git a/src/panels/developer-tools/ha-panel-developer-tools.ts b/src/panels/developer-tools/ha-panel-developer-tools.ts
new file mode 100644
index 0000000000..09814ff47b
--- /dev/null
+++ b/src/panels/developer-tools/ha-panel-developer-tools.ts
@@ -0,0 +1,121 @@
+import {
+ LitElement,
+ TemplateResult,
+ html,
+ CSSResultArray,
+ css,
+ customElement,
+ property,
+} from "lit-element";
+import "@polymer/app-layout/app-header-layout/app-header-layout";
+import "@polymer/app-layout/app-header/app-header";
+import "@polymer/app-layout/app-toolbar/app-toolbar";
+import "@polymer/paper-icon-button/paper-icon-button";
+import "@polymer/paper-tabs/paper-tab";
+import "@polymer/paper-tabs/paper-tabs";
+
+import "../../components/ha-menu-button";
+import "../../resources/ha-style";
+import "./developer-tools-router";
+
+import scrollToTarget from "../../common/dom/scroll-to-target";
+
+import { haStyle } from "../../resources/styles";
+import { HomeAssistant, Route } from "../../types";
+import { navigate } from "../../common/navigate";
+import isComponentLoaded from "../../common/config/is_component_loaded";
+
+@customElement("ha-panel-developer-tools")
+class PanelDeveloperTools extends LitElement {
+ @property() public hass!: HomeAssistant;
+ @property() public route!: Route;
+ @property() public narrow!: boolean;
+
+ protected render(): TemplateResult | void {
+ const page = this._page;
+ return html`
+
+
+
+
+ Developer Tools
+
+
+
+ ${this.hass.localize("panel.dev-info")}
+
+
+ ${this.hass.localize("panel.dev-events")}
+
+ ${isComponentLoaded(this.hass, "mqtt")
+ ? html`
+
+ ${this.hass.localize("panel.dev-mqtt")}
+
+ `
+ : ""}
+
+ ${this.hass.localize("panel.dev-services")}
+
+
+ ${this.hass.localize("panel.dev-states")}
+
+
+ ${this.hass.localize("panel.dev-templates")}
+
+
+
+
+
+ `;
+ }
+
+ private handlePageSelected(ev) {
+ const newPage = ev.detail.item.getAttribute("page-name");
+ if (newPage !== this._page) {
+ navigate(this, `/developer-tools/${newPage}`);
+ }
+
+ scrollToTarget(
+ this,
+ // @ts-ignore
+ this.shadowRoot!.querySelector("app-header-layout").header.scrollTarget
+ );
+ }
+
+ private get _page() {
+ return this.route.path.substr(1);
+ }
+
+ static get styles(): CSSResultArray {
+ return [
+ haStyle,
+ css`
+ :host {
+ color: var(--primary-text-color);
+ --paper-card-header-color: var(--primary-text-color);
+ }
+ paper-tabs {
+ margin-left: 12px;
+ --paper-tabs-selection-bar-color: #fff;
+ text-transform: uppercase;
+ }
+ `,
+ ];
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "ha-panel-developer-tools": PanelDeveloperTools;
+ }
+}
diff --git a/src/panels/developer-tools/info/developer-tools-info.ts b/src/panels/developer-tools/info/developer-tools-info.ts
new file mode 100644
index 0000000000..6e248a97c4
--- /dev/null
+++ b/src/panels/developer-tools/info/developer-tools-info.ts
@@ -0,0 +1,194 @@
+import {
+ LitElement,
+ html,
+ CSSResult,
+ css,
+ TemplateResult,
+ property,
+} from "lit-element";
+
+import { HomeAssistant } from "../../../types";
+import { haStyle } from "../../../resources/styles";
+
+import "./system-log-card";
+import "./error-log-card";
+import "./system-health-card";
+
+const JS_VERSION = __BUILD__;
+const OPT_IN_PANEL = "states";
+
+class HaPanelDevInfo extends LitElement {
+ @property() public hass!: HomeAssistant;
+
+ protected render(): TemplateResult | void {
+ const hass = this.hass;
+ const customUiList: Array<{ name: string; url: string; version: string }> =
+ (window as any).CUSTOM_UI_LIST || [];
+
+ const nonDefaultLink =
+ localStorage.defaultPage === OPT_IN_PANEL && OPT_IN_PANEL === "states"
+ ? "/lovelace"
+ : "/states";
+
+ const nonDefaultLinkText =
+ localStorage.defaultPage === OPT_IN_PANEL && OPT_IN_PANEL === "states"
+ ? "Go to the Lovelace UI"
+ : "Go to the states UI";
+
+ const defaultPageText = `${
+ localStorage.defaultPage === OPT_IN_PANEL ? "Remove" : "Set"
+ } ${OPT_IN_PANEL} as default page on this device`;
+
+ return html`
+
+
+
+
+ `;
+ }
+
+ protected firstUpdated(changedProps): void {
+ super.firstUpdated(changedProps);
+
+ // Legacy custom UI can be slow to register, give them time.
+ const customUI = ((window as any).CUSTOM_UI_LIST || []).length;
+ setTimeout(() => {
+ if (((window as any).CUSTOM_UI_LIST || []).length !== customUI.length) {
+ this.requestUpdate();
+ }
+ }, 1000);
+ }
+
+ protected _toggleDefaultPage(): void {
+ if (localStorage.defaultPage === OPT_IN_PANEL) {
+ delete localStorage.defaultPage;
+ } else {
+ localStorage.defaultPage = OPT_IN_PANEL;
+ }
+ this.requestUpdate();
+ }
+
+ static get styles(): CSSResult[] {
+ return [
+ haStyle,
+ css`
+ :host {
+ -ms-user-select: initial;
+ -webkit-user-select: initial;
+ -moz-user-select: initial;
+ }
+
+ .content {
+ padding: 16px 0px 16px 0;
+ direction: ltr;
+ }
+
+ .about {
+ text-align: center;
+ line-height: 2em;
+ }
+
+ .version {
+ @apply --paper-font-headline;
+ }
+
+ .develop {
+ @apply --paper-font-subhead;
+ }
+
+ .about a {
+ color: var(--dark-primary-color);
+ }
+
+ system-health-card {
+ display: block;
+ max-width: 600px;
+ margin: 0 auto;
+ }
+ `,
+ ];
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "developer-tools-info": HaPanelDevInfo;
+ }
+}
+
+customElements.define("developer-tools-info", HaPanelDevInfo);
diff --git a/src/panels/dev-info/dialog-system-log-detail.ts b/src/panels/developer-tools/info/dialog-system-log-detail.ts
similarity index 91%
rename from src/panels/dev-info/dialog-system-log-detail.ts
rename to src/panels/developer-tools/info/dialog-system-log-detail.ts
index 6ec2299a1b..eba62d72ac 100644
--- a/src/panels/dev-info/dialog-system-log-detail.ts
+++ b/src/panels/developer-tools/info/dialog-system-log-detail.ts
@@ -8,11 +8,11 @@ import {
} from "lit-element";
import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable";
-import "../../components/dialog/ha-paper-dialog";
+import "../../../components/dialog/ha-paper-dialog";
import { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail";
-import { PolymerChangedEvent } from "../../polymer-types";
-import { haStyleDialog } from "../../resources/styles";
+import { PolymerChangedEvent } from "../../../polymer-types";
+import { haStyleDialog } from "../../../resources/styles";
class DialogSystemLogDetail extends LitElement {
private _params?: SystemLogDetailDialogParams;
diff --git a/src/panels/dev-info/error-log-card.ts b/src/panels/developer-tools/info/error-log-card.ts
similarity index 93%
rename from src/panels/dev-info/error-log-card.ts
rename to src/panels/developer-tools/info/error-log-card.ts
index 46b4274492..9f2bfbd094 100644
--- a/src/panels/dev-info/error-log-card.ts
+++ b/src/panels/developer-tools/info/error-log-card.ts
@@ -9,8 +9,8 @@ import {
import "@polymer/paper-icon-button/paper-icon-button";
import "@material/mwc-button";
-import { HomeAssistant } from "../../types";
-import { fetchErrorLog } from "../../data/error_log";
+import { HomeAssistant } from "../../../types";
+import { fetchErrorLog } from "../../../data/error_log";
class ErrorLogCard extends LitElement {
public hass?: HomeAssistant;
diff --git a/src/panels/dev-info/show-dialog-system-log-detail.ts b/src/panels/developer-tools/info/show-dialog-system-log-detail.ts
similarity index 88%
rename from src/panels/dev-info/show-dialog-system-log-detail.ts
rename to src/panels/developer-tools/info/show-dialog-system-log-detail.ts
index 3e1899495f..b1c378b5a5 100644
--- a/src/panels/dev-info/show-dialog-system-log-detail.ts
+++ b/src/panels/developer-tools/info/show-dialog-system-log-detail.ts
@@ -1,5 +1,5 @@
-import { fireEvent } from "../../common/dom/fire_event";
-import { LoggedError } from "../../data/system_log";
+import { fireEvent } from "../../../common/dom/fire_event";
+import { LoggedError } from "../../../data/system_log";
declare global {
// for fire event
diff --git a/src/panels/dev-info/system-health-card.ts b/src/panels/developer-tools/info/system-health-card.ts
similarity index 95%
rename from src/panels/dev-info/system-health-card.ts
rename to src/panels/developer-tools/info/system-health-card.ts
index 82159ed847..82b819bc32 100644
--- a/src/panels/dev-info/system-health-card.ts
+++ b/src/panels/developer-tools/info/system-health-card.ts
@@ -7,13 +7,13 @@ import {
TemplateResult,
} from "lit-element";
import "@polymer/paper-spinner/paper-spinner";
-import "../../components/ha-card";
+import "../../../components/ha-card";
-import { HomeAssistant } from "../../types";
+import { HomeAssistant } from "../../../types";
import {
SystemHealthInfo,
fetchSystemHealthInfo,
-} from "../../data/system_health";
+} from "../../../data/system_health";
const sortKeys = (a: string, b: string) => {
if (a === "homeassistant") {
diff --git a/src/panels/dev-info/system-log-card.ts b/src/panels/developer-tools/info/system-log-card.ts
similarity index 91%
rename from src/panels/dev-info/system-log-card.ts
rename to src/panels/developer-tools/info/system-log-card.ts
index 0d1391c1ee..e3800dcfec 100644
--- a/src/panels/dev-info/system-log-card.ts
+++ b/src/panels/developer-tools/info/system-log-card.ts
@@ -10,13 +10,13 @@ import "@polymer/paper-icon-button/paper-icon-button";
import "@polymer/paper-item/paper-item-body";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-spinner/paper-spinner";
-import "../../components/ha-card";
-import "../../components/buttons/ha-call-service-button";
-import "../../components/buttons/ha-progress-button";
-import { HomeAssistant } from "../../types";
-import { LoggedError, fetchSystemLog } from "../../data/system_log";
-import formatDateTime from "../../common/datetime/format_date_time";
-import formatTime from "../../common/datetime/format_time";
+import "../../../components/ha-card";
+import "../../../components/buttons/ha-call-service-button";
+import "../../../components/buttons/ha-progress-button";
+import { HomeAssistant } from "../../../types";
+import { LoggedError, fetchSystemLog } from "../../../data/system_log";
+import formatDateTime from "../../../common/datetime/format_date_time";
+import formatTime from "../../../common/datetime/format_time";
import { showSystemLogDetailDialog } from "./show-dialog-system-log-detail";
const formatLogTime = (date, language: string) => {
diff --git a/src/panels/dev-mqtt/ha-panel-dev-mqtt.js b/src/panels/developer-tools/mqtt/developer-tools-mqtt.js
similarity index 90%
rename from src/panels/dev-mqtt/ha-panel-dev-mqtt.js
rename to src/panels/developer-tools/mqtt/developer-tools-mqtt.js
index 98bca44d17..ffaded67c8 100644
--- a/src/panels/dev-mqtt/ha-panel-dev-mqtt.js
+++ b/src/panels/developer-tools/mqtt/developer-tools-mqtt.js
@@ -7,10 +7,10 @@ import "@polymer/paper-input/paper-textarea";
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
-import "../../components/ha-card";
-import "../../components/ha-menu-button";
-import "../../resources/ha-style";
-import "../../util/app-localstorage-document";
+import "../../../components/ha-card";
+import "../../../components/ha-menu-button";
+import "../../../resources/ha-style";
+import "../../../util/app-localstorage-document";
class HaPanelDevMqtt extends PolymerElement {
static get template() {
@@ -86,4 +86,4 @@ class HaPanelDevMqtt extends PolymerElement {
}
}
-customElements.define("ha-panel-dev-mqtt", HaPanelDevMqtt);
+customElements.define("developer-tools-mqtt", HaPanelDevMqtt);
diff --git a/src/panels/dev-service/ha-panel-dev-service.js b/src/panels/developer-tools/service/developer-tools-service.js
similarity index 55%
rename from src/panels/dev-service/ha-panel-dev-service.js
rename to src/panels/developer-tools/service/developer-tools-service.js
index b4b0be23fe..05b1e7e1bf 100644
--- a/src/panels/dev-service/ha-panel-dev-service.js
+++ b/src/panels/developer-tools/service/developer-tools-service.js
@@ -1,17 +1,13 @@
-import "@polymer/app-layout/app-header-layout/app-header-layout";
-import "@polymer/app-layout/app-header/app-header";
-import "@polymer/app-layout/app-toolbar/app-toolbar";
import "@material/mwc-button";
import "@polymer/paper-input/paper-textarea";
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
-import { ENTITY_COMPONENT_DOMAINS } from "../../data/entity";
-import "../../components/entity/ha-entity-picker";
-import "../../components/ha-menu-button";
-import "../../components/ha-service-picker";
-import "../../resources/ha-style";
-import "../../util/app-localstorage-document";
+import { ENTITY_COMPONENT_DOMAINS } from "../../../data/entity";
+import "../../../components/entity/ha-entity-picker";
+import "../../../components/ha-service-picker";
+import "../../../resources/ha-style";
+import "../../../util/app-localstorage-document";
const ERROR_SENTINEL = {};
class HaPanelDevService extends PolymerElement {
@@ -22,9 +18,7 @@ class HaPanelDevService extends PolymerElement {
-ms-user-select: initial;
-webkit-user-select: initial;
-moz-user-select: initial;
- }
-
- .content {
+ display: block;
padding: 16px;
direction: ltr;
}
@@ -81,100 +75,87 @@ class HaPanelDevService extends PolymerElement {
}
-
-
-
-
- Services
-
-
+
+
+
+
-
-
-
-
+
+
+ The service dev tool allows you to call any available service in Home
+ Assistant.
+
-
-
- The service dev tool allows you to call any available service in
- Home Assistant.
-
-
-
-
-
- Select a service to see the description
+ value="[[_computeEntityValue(parsedJSON)]]"
+ on-change="_entityPicked"
+ disabled="[[!validJSON]]"
+ domain-filter="[[_computeEntityDomainFilter(_domain)]]"
+ allow-custom-entity
+ >
-
-
-
- No description is available
-
-
- [[_description]]
-
-
-
- Parameter |
- Description |
- Example |
-
-
-
- This service takes no parameters. |
-
-
-
-
- [[attribute.key]] |
- [[attribute.description]] |
- [[attribute.example]] |
-
-
-
-
+
+ Call Service
+
+ Invalid JSON
-
+
+
+ Select a service to see the description
+
+
+
+
+ No description is available
+
+
+ [[_description]]
+
+
+
+ Parameter |
+ Description |
+ Example |
+
+
+
+ This service takes no parameters. |
+
+
+
+
+ [[attribute.key]] |
+ [[attribute.description]] |
+ [[attribute.example]] |
+
+
+
+
+
+
`;
}
@@ -304,4 +285,4 @@ class HaPanelDevService extends PolymerElement {
}
}
-customElements.define("ha-panel-dev-service", HaPanelDevService);
+customElements.define("developer-tools-service", HaPanelDevService);
diff --git a/src/panels/dev-state/ha-panel-dev-state.js b/src/panels/developer-tools/state/developer-tools-state.js
similarity index 60%
rename from src/panels/dev-state/ha-panel-dev-state.js
rename to src/panels/developer-tools/state/developer-tools-state.js
index fc328a4f9b..92e6d3e038 100644
--- a/src/panels/dev-state/ha-panel-dev-state.js
+++ b/src/panels/developer-tools/state/developer-tools-state.js
@@ -1,6 +1,3 @@
-import "@polymer/app-layout/app-header-layout/app-header-layout";
-import "@polymer/app-layout/app-header/app-header";
-import "@polymer/app-layout/app-toolbar/app-toolbar";
import "@material/mwc-button";
import "@polymer/paper-checkbox/paper-checkbox";
import "@polymer/paper-input/paper-input";
@@ -8,10 +5,9 @@ import "@polymer/paper-input/paper-textarea";
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
-import "../../components/entity/ha-entity-picker";
-import "../../components/ha-menu-button";
-import "../../resources/ha-style";
-import { EventsMixin } from "../../mixins/events-mixin";
+import "../../../components/entity/ha-entity-picker";
+import "../../../resources/ha-style";
+import { EventsMixin } from "../../../mixins/events-mixin";
/*
* @appliesMixin EventsMixin
@@ -24,9 +20,7 @@ class HaPanelDevState extends EventsMixin(PolymerElement) {
-ms-user-select: initial;
-webkit-user-select: initial;
-moz-user-select: initial;
- }
-
- .content {
+ display: block;
padding: 16px;
direction: ltr;
}
@@ -70,107 +64,96 @@ class HaPanelDevState extends EventsMixin(PolymerElement) {
}
-
-
-
-
- States
-
-
+
+
+ Set the representation of a device within Home Assistant.
+ This will not communicate with the actual device.
+
-
-
-
- Set the representation of a device within Home Assistant.
- This will not communicate with the actual device.
-
+
+
+
+
Set State
+
-
+
Current entities
+
+
+ Entity |
+ State |
+
+ Attributes
+
+ |
+
+
+
-
- Set State
-
-
- Current entities
-
-
- Entity |
- State |
-
- Attributes
-
- |
-
-
-
-
- |
-
-
- |
-
-
- |
-
-
- No entities |
-
-
-
-
-
-
- [[entity.entity_id]]
- |
- [[entity.state]] |
-
- [[attributeString(entity)]] |
-
-
+
+
+
+ |
+
+
+ |
+
+
+ No entities |
+
+
+
+
+
+
+ [[entity.entity_id]]
+ |
+ [[entity.state]] |
+
+ [[attributeString(entity)]] |
-
-
-
+ |
+
+
`;
}
@@ -351,4 +334,4 @@ class HaPanelDevState extends EventsMixin(PolymerElement) {
}
}
-customElements.define("ha-panel-dev-state", HaPanelDevState);
+customElements.define("developer-tools-state", HaPanelDevState);
diff --git a/src/panels/dev-template/ha-panel-dev-template.js b/src/panels/developer-tools/template/developer-tools-template.js
similarity index 66%
rename from src/panels/dev-template/ha-panel-dev-template.js
rename to src/panels/developer-tools/template/developer-tools-template.js
index 47a597ef90..31e15812a3 100644
--- a/src/panels/dev-template/ha-panel-dev-template.js
+++ b/src/panels/developer-tools/template/developer-tools-template.js
@@ -1,6 +1,3 @@
-import "@polymer/app-layout/app-header-layout/app-header-layout";
-import "@polymer/app-layout/app-header/app-header";
-import "@polymer/app-layout/app-toolbar/app-toolbar";
import "@polymer/paper-input/paper-textarea";
import "@polymer/paper-spinner/paper-spinner";
import { timeOut } from "@polymer/polymer/lib/utils/async";
@@ -8,8 +5,7 @@ import { Debouncer } from "@polymer/polymer/lib/utils/debounce";
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
-import "../../components/ha-menu-button";
-import "../../resources/ha-style";
+import "../../../resources/ha-style";
class HaPanelDevTemplate extends PolymerElement {
static get template() {
@@ -67,52 +63,43 @@ class HaPanelDevTemplate extends PolymerElement {
}
-
-
-
-
- Templates
-
-
-
-
-
-
- Templates are rendered using the Jinja2 template engine with some
- Home Assistant specific extensions.
-
-
-
-
-
-
+
+
+
+ Templates are rendered using the Jinja2 template engine with some
+ Home Assistant specific extensions.
+
+
+
-
+
+
+
`;
}
@@ -207,4 +194,4 @@ For loop example:
}
}
-customElements.define("ha-panel-dev-template", HaPanelDevTemplate);
+customElements.define("developer-tools-template", HaPanelDevTemplate);