From 1b441a752eb00b933deff555ada6678609fc97eb Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 13 Jun 2019 11:57:56 -0700 Subject: [PATCH] Manage Alexa entities (#3269) * Reorg cloud components * Allow managing Alexa entities in the UI * Use observer * Update mwc version * Tweak some UI --- package.json | 11 +- src/data/alexa.ts | 10 + src/data/cloud.ts | 27 +- src/data/google_assistant.ts | 10 + .../cloud-account.js} | 39 +- .../cloud/{ => account}/cloud-alexa-pref.ts | 34 +- .../cloud/{ => account}/cloud-google-pref.ts | 10 +- .../cloud/{ => account}/cloud-remote-pref.ts | 10 +- .../cloud/{ => account}/cloud-webhooks.ts | 10 +- src/panels/config/cloud/alexa/cloud-alexa.ts | 361 ++++++++++++++++++ .../config/cloud/cloud-exposed-entities.ts | 115 ------ .../dialog-cloud-certificate.ts | 10 +- .../show-dialog-cloud-certificate.ts | 4 +- .../dialog-manage-cloudhook.ts} | 25 +- .../show-dialog-manage-cloudhook.ts} | 10 +- .../cloud-forgot-password.js} | 17 +- .../cloud-google-assistant.ts} | 55 +-- src/panels/config/cloud/ha-config-cloud.ts | 26 +- .../cloud-login.js} | 20 +- .../cloud-register.js} | 16 +- yarn.lock | 52 +-- 21 files changed, 573 insertions(+), 299 deletions(-) create mode 100644 src/data/alexa.ts create mode 100644 src/data/google_assistant.ts rename src/panels/config/cloud/{ha-config-cloud-account.js => account/cloud-account.js} (82%) rename src/panels/config/cloud/{ => account}/cloud-alexa-pref.ts (79%) rename src/panels/config/cloud/{ => account}/cloud-google-pref.ts (94%) rename src/panels/config/cloud/{ => account}/cloud-remote-pref.ts (92%) rename src/panels/config/cloud/{ => account}/cloud-webhooks.ts (95%) create mode 100644 src/panels/config/cloud/alexa/cloud-alexa.ts delete mode 100644 src/panels/config/cloud/cloud-exposed-entities.ts rename src/panels/config/cloud/{ => dialog-cloud-certificate}/dialog-cloud-certificate.ts (85%) rename src/panels/config/cloud/{ => dialog-cloud-certificate}/show-dialog-cloud-certificate.ts (78%) rename src/panels/config/cloud/{cloud-webhook-manage-dialog.ts => dialog-manage-cloudhook/dialog-manage-cloudhook.ts} (83%) rename src/panels/config/cloud/{show-cloud-webhook-manage-dialog.ts => dialog-manage-cloudhook/show-dialog-manage-cloudhook.ts} (62%) rename src/panels/config/cloud/{ha-config-cloud-forgot-password.js => forgot-password/cloud-forgot-password.js} (89%) rename src/panels/config/cloud/{ha-config-cloud-google-assistant.ts => google-assistant/cloud-google-assistant.ts} (88%) rename src/panels/config/cloud/{ha-config-cloud-login.js => login/cloud-login.js} (93%) rename src/panels/config/cloud/{ha-config-cloud-register.js => register/cloud-register.js} (93%) diff --git a/package.json b/package.json index 25ffead4b3..a1e74fceef 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,9 @@ "author": "Paulus Schoutsen (http://paulusschoutsen.nl)", "license": "Apache-2.0", "dependencies": { - "@material/mwc-button": "^0.5.0", - "@material/mwc-ripple": "^0.5.0", + "@material/mwc-base": "^0.6.0", + "@material/mwc-button": "^0.6.0", + "@material/mwc-ripple": "^0.6.0", "@mdi/svg": "3.5.95", "@polymer/app-layout": "^3.0.2", "@polymer/app-localize-behavior": "^3.0.1", @@ -77,13 +78,13 @@ "fuse.js": "^3.4.4", "google-timezones-json": "^1.0.2", "hls.js": "^0.12.4", - "home-assistant-js-websocket": "^4.2.1", + "home-assistant-js-websocket": "^4.2.2", "intl-messageformat": "^2.2.0", "jquery": "^3.3.1", "js-yaml": "^3.13.0", "leaflet": "^1.4.0", - "lit-element": "^2.1.0", - "lit-html": "^1.0.0", + "lit-element": "^2.2.0", + "lit-html": "^1.1.0", "marked": "^0.6.1", "mdn-polyfills": "^5.16.0", "memoize-one": "^5.0.2", diff --git a/src/data/alexa.ts b/src/data/alexa.ts new file mode 100644 index 0000000000..e3f154c558 --- /dev/null +++ b/src/data/alexa.ts @@ -0,0 +1,10 @@ +import { HomeAssistant } from "../types"; + +export interface AlexaEntity { + entity_id: string; + display_categories: string[]; + interfaces: string[]; +} + +export const fetchCloudAlexaEntities = (hass: HomeAssistant) => + hass.callWS({ type: "cloud/alexa/entities" }); diff --git a/src/data/cloud.ts b/src/data/cloud.ts index 5135867376..3cb13c886b 100644 --- a/src/data/cloud.ts +++ b/src/data/cloud.ts @@ -13,6 +13,10 @@ export interface GoogleEntityConfig { disable_2fa?: boolean; } +export interface AlexaEntityConfig { + should_expose?: boolean; +} + export interface CertificateInformation { common_name: string; expire_date: string; @@ -28,6 +32,9 @@ export interface CloudPreferences { google_entity_configs: { [entityId: string]: GoogleEntityConfig; }; + alexa_entity_configs: { + [entityId: string]: AlexaEntityConfig; + }; } export type CloudStatusLoggedIn = CloudStatusBase & { @@ -55,12 +62,6 @@ export interface CloudWebhook { managed?: boolean; } -export interface GoogleEntity { - entity_id: string; - traits: string[]; - might_2fa: boolean; -} - export const fetchCloudStatus = (hass: HomeAssistant) => hass.callWS({ type: "cloud/status" }); @@ -102,9 +103,6 @@ export const updateCloudPref = ( ...prefs, }); -export const fetchCloudGoogleEntities = (hass: HomeAssistant) => - hass.callWS({ type: "cloud/google_assistant/entities" }); - export const updateCloudGoogleEntityConfig = ( hass: HomeAssistant, entityId: string, @@ -118,3 +116,14 @@ export const updateCloudGoogleEntityConfig = ( export const cloudSyncGoogleAssistant = (hass: HomeAssistant) => hass.callApi("POST", "cloud/google_actions/sync"); + +export const updateCloudAlexaEntityConfig = ( + hass: HomeAssistant, + entityId: string, + values: AlexaEntityConfig +) => + hass.callWS({ + type: "cloud/alexa/entities/update", + entity_id: entityId, + ...values, + }); diff --git a/src/data/google_assistant.ts b/src/data/google_assistant.ts new file mode 100644 index 0000000000..982f3c456a --- /dev/null +++ b/src/data/google_assistant.ts @@ -0,0 +1,10 @@ +import { HomeAssistant } from "../types"; + +export interface GoogleEntity { + entity_id: string; + traits: string[]; + might_2fa: boolean; +} + +export const fetchCloudGoogleEntities = (hass: HomeAssistant) => + hass.callWS({ type: "cloud/google_assistant/entities" }); diff --git a/src/panels/config/cloud/ha-config-cloud-account.js b/src/panels/config/cloud/account/cloud-account.js similarity index 82% rename from src/panels/config/cloud/ha-config-cloud-account.js rename to src/panels/config/cloud/account/cloud-account.js index 0b530c8d61..d78754d9b9 100644 --- a/src/panels/config/cloud/ha-config-cloud-account.js +++ b/src/panels/config/cloud/account/cloud-account.js @@ -4,30 +4,27 @@ import "@polymer/paper-toggle-button/paper-toggle-button"; import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "../../../components/ha-card"; -import "../../../components/buttons/ha-call-api-button"; -import "../../../layouts/hass-subpage"; -import "../../../resources/ha-style"; +import "../../../../components/ha-card"; +import "../../../../components/buttons/ha-call-api-button"; +import "../../../../layouts/hass-subpage"; +import "../../../../resources/ha-style"; -import "../ha-config-section"; +import "../../ha-config-section"; import "./cloud-webhooks"; -import formatDateTime from "../../../common/datetime/format_date_time"; -import { EventsMixin } from "../../../mixins/events-mixin"; -import LocalizeMixin from "../../../mixins/localize-mixin"; -import { fireEvent } from "../../../common/dom/fire_event"; -import { fetchCloudSubscriptionInfo } from "../../../data/cloud"; +import formatDateTime from "../../../../common/datetime/format_date_time"; +import { EventsMixin } from "../../../../mixins/events-mixin"; +import LocalizeMixin from "../../../../mixins/localize-mixin"; +import { fetchCloudSubscriptionInfo } from "../../../../data/cloud"; import "./cloud-alexa-pref"; import "./cloud-google-pref"; import "./cloud-remote-pref"; -let registeredWebhookDialog = false; - /* * @appliesMixin EventsMixin * @appliesMixin LocalizeMixin */ -class HaConfigCloudAccount extends EventsMixin(LocalizeMixin(PolymerElement)) { +class CloudAccount extends EventsMixin(LocalizeMixin(PolymerElement)) { static get template() { return html` - `; - } -} - -declare global { - interface HTMLElementTagNameMap { - "cloud-exposed-entities": CloudExposedEntities; - } -} - -customElements.define("cloud-exposed-entities", CloudExposedEntities); diff --git a/src/panels/config/cloud/dialog-cloud-certificate.ts b/src/panels/config/cloud/dialog-cloud-certificate/dialog-cloud-certificate.ts similarity index 85% rename from src/panels/config/cloud/dialog-cloud-certificate.ts rename to src/panels/config/cloud/dialog-cloud-certificate/dialog-cloud-certificate.ts index 1c3f210542..69982db18a 100644 --- a/src/panels/config/cloud/dialog-cloud-certificate.ts +++ b/src/panels/config/cloud/dialog-cloud-certificate/dialog-cloud-certificate.ts @@ -8,15 +8,15 @@ import { } from "lit-element"; import "@material/mwc-button"; -import "../../../components/dialog/ha-paper-dialog"; +import "../../../../components/dialog/ha-paper-dialog"; // This is not a duplicate import, one is for types, one is for element. // tslint:disable-next-line -import { HaPaperDialog } from "../../../components/dialog/ha-paper-dialog"; +import { HaPaperDialog } from "../../../../components/dialog/ha-paper-dialog"; -import { HomeAssistant } from "../../../types"; -import { haStyle } from "../../../resources/styles"; +import { HomeAssistant } from "../../../../types"; +import { haStyle } from "../../../../resources/styles"; import { CloudCertificateParams as CloudCertificateDialogParams } from "./show-dialog-cloud-certificate"; -import format_date_time from "../../../common/datetime/format_date_time"; +import format_date_time from "../../../../common/datetime/format_date_time"; @customElement("dialog-cloud-certificate") class DialogCloudCertificate extends LitElement { diff --git a/src/panels/config/cloud/show-dialog-cloud-certificate.ts b/src/panels/config/cloud/dialog-cloud-certificate/show-dialog-cloud-certificate.ts similarity index 78% rename from src/panels/config/cloud/show-dialog-cloud-certificate.ts rename to src/panels/config/cloud/dialog-cloud-certificate/show-dialog-cloud-certificate.ts index d1d085c4ca..2ccf43da15 100644 --- a/src/panels/config/cloud/show-dialog-cloud-certificate.ts +++ b/src/panels/config/cloud/dialog-cloud-certificate/show-dialog-cloud-certificate.ts @@ -1,5 +1,5 @@ -import { fireEvent } from "../../../common/dom/fire_event"; -import { CertificateInformation } from "../../../data/cloud"; +import { fireEvent } from "../../../../common/dom/fire_event"; +import { CertificateInformation } from "../../../../data/cloud"; export interface CloudCertificateParams { certificateInfo: CertificateInformation; diff --git a/src/panels/config/cloud/cloud-webhook-manage-dialog.ts b/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts similarity index 83% rename from src/panels/config/cloud/cloud-webhook-manage-dialog.ts rename to src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts index 03e8d1240e..e338e5927a 100644 --- a/src/panels/config/cloud/cloud-webhook-manage-dialog.ts +++ b/src/panels/config/cloud/dialog-manage-cloudhook/dialog-manage-cloudhook.ts @@ -9,20 +9,20 @@ import { import "@material/mwc-button"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; -import "../../../components/dialog/ha-paper-dialog"; +import "../../../../components/dialog/ha-paper-dialog"; // This is not a duplicate import, one is for types, one is for element. // tslint:disable-next-line -import { HaPaperDialog } from "../../../components/dialog/ha-paper-dialog"; +import { HaPaperDialog } from "../../../../components/dialog/ha-paper-dialog"; // tslint:disable-next-line import { PaperInputElement } from "@polymer/paper-input/paper-input"; -import { HomeAssistant } from "../../../types"; -import { haStyle } from "../../../resources/styles"; -import { WebhookDialogParams } from "./show-cloud-webhook-manage-dialog"; +import { HomeAssistant } from "../../../../types"; +import { haStyle } from "../../../../resources/styles"; +import { WebhookDialogParams } from "./show-dialog-manage-cloudhook"; const inputLabel = "Public URL – Click to copy to clipboard"; -export class CloudWebhookManageDialog extends LitElement { +export class DialogManageCloudhook extends LitElement { protected hass?: HomeAssistant; private _params?: WebhookDialogParams; @@ -75,9 +75,9 @@ export class CloudWebhookManageDialog extends LitElement { @@ -136,6 +136,9 @@ export class CloudWebhookManageDialog extends LitElement { button.link { color: var(--primary-color); } + .paper-dialog-buttons a { + text-decoration: none; + } `, ]; } @@ -143,8 +146,8 @@ export class CloudWebhookManageDialog extends LitElement { declare global { interface HTMLElementTagNameMap { - "cloud-webhook-manage-dialog": CloudWebhookManageDialog; + "dialog-manage-cloudhook": DialogManageCloudhook; } } -customElements.define("cloud-webhook-manage-dialog", CloudWebhookManageDialog); +customElements.define("dialog-manage-cloudhook", DialogManageCloudhook); diff --git a/src/panels/config/cloud/show-cloud-webhook-manage-dialog.ts b/src/panels/config/cloud/dialog-manage-cloudhook/show-dialog-manage-cloudhook.ts similarity index 62% rename from src/panels/config/cloud/show-cloud-webhook-manage-dialog.ts rename to src/panels/config/cloud/dialog-manage-cloudhook/show-dialog-manage-cloudhook.ts index c1c1389021..23d0c9a159 100644 --- a/src/panels/config/cloud/show-cloud-webhook-manage-dialog.ts +++ b/src/panels/config/cloud/dialog-manage-cloudhook/show-dialog-manage-cloudhook.ts @@ -1,6 +1,6 @@ -import { fireEvent } from "../../../common/dom/fire_event"; -import { Webhook } from "../../../data/webhook"; -import { CloudWebhook } from "../../../data/cloud"; +import { fireEvent } from "../../../../common/dom/fire_event"; +import { Webhook } from "../../../../data/webhook"; +import { CloudWebhook } from "../../../../data/cloud"; export interface WebhookDialogParams { webhook: Webhook; @@ -13,9 +13,9 @@ export const showManageCloudhookDialog = ( webhookDialogParams: WebhookDialogParams ): void => { fireEvent(element, "show-dialog", { - dialogTag: "cloud-webhook-manage-dialog", + dialogTag: "dialog-manage-cloudhook", dialogImport: () => - import(/* webpackChunkName: "cloud-webhook-manage-dialog" */ "./cloud-webhook-manage-dialog"), + import(/* webpackChunkName: "cloud-webhook-manage-dialog" */ "./dialog-manage-cloudhook"), dialogParams: webhookDialogParams, }); }; diff --git a/src/panels/config/cloud/ha-config-cloud-forgot-password.js b/src/panels/config/cloud/forgot-password/cloud-forgot-password.js similarity index 89% rename from src/panels/config/cloud/ha-config-cloud-forgot-password.js rename to src/panels/config/cloud/forgot-password/cloud-forgot-password.js index 0663a7a8f2..cab3221e59 100644 --- a/src/panels/config/cloud/ha-config-cloud-forgot-password.js +++ b/src/panels/config/cloud/forgot-password/cloud-forgot-password.js @@ -2,16 +2,16 @@ import "@polymer/paper-input/paper-input"; import { html } from "@polymer/polymer/lib/utils/html-tag"; import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "../../../components/ha-card"; -import "../../../components/buttons/ha-progress-button"; -import "../../../layouts/hass-subpage"; -import "../../../resources/ha-style"; -import { EventsMixin } from "../../../mixins/events-mixin"; +import "../../../../components/ha-card"; +import "../../../../components/buttons/ha-progress-button"; +import "../../../../layouts/hass-subpage"; +import "../../../../resources/ha-style"; +import { EventsMixin } from "../../../../mixins/events-mixin"; /* * @appliesMixin EventsMixin */ -class HaConfigCloudForgotPassword extends EventsMixin(PolymerElement) { +class CloudForgotPassword extends EventsMixin(PolymerElement) { static get template() { return html`