diff --git a/src/data/cloud.ts b/src/data/cloud.ts
index c732b2a65f..5db22590c4 100644
--- a/src/data/cloud.ts
+++ b/src/data/cloud.ts
@@ -148,6 +148,11 @@ export const updateCloudPref = (
...prefs,
});
+export const removeCloudData = (hass: HomeAssistant) =>
+ hass.callWS({
+ type: "cloud/remove_data",
+ });
+
export const updateCloudGoogleEntityConfig = (
hass: HomeAssistant,
entity_id: string,
diff --git a/src/panels/config/cloud/account/cloud-account.ts b/src/panels/config/cloud/account/cloud-account.ts
index 8c81013cd2..8f11c1b8d2 100644
--- a/src/panels/config/cloud/account/cloud-account.ts
+++ b/src/panels/config/cloud/account/cloud-account.ts
@@ -1,6 +1,7 @@
import "@material/mwc-button";
import { css, html, LitElement } from "lit";
import { customElement, property, state } from "lit/decorators";
+import { mdiDeleteForever, mdiDotsVertical } from "@mdi/js";
import { formatDateTime } from "../../../../common/datetime/format_date_time";
import { fireEvent } from "../../../../common/dom/fire_event";
import { debounce } from "../../../../common/util/debounce";
@@ -12,9 +13,13 @@ import {
cloudLogout,
CloudStatusLoggedIn,
fetchCloudSubscriptionInfo,
+ removeCloudData,
SubscriptionInfo,
} from "../../../../data/cloud";
-import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box";
+import {
+ showAlertDialog,
+ showConfirmationDialog,
+} from "../../../../dialogs/generic/show-dialog-box";
import "../../../../layouts/hass-subpage";
import { SubscribeMixin } from "../../../../mixins/subscribe-mixin";
import { haStyle } from "../../../../resources/styles";
@@ -43,6 +48,20 @@ export class CloudAccount extends SubscribeMixin(LitElement) {
.narrow=${this.narrow}
header="Home Assistant Cloud"
>
+
+
+
+
+ ${this.hass.localize(
+ "ui.panel.config.cloud.account.reset_cloud_data"
+ )}
+
+
+
Home Assistant Cloud
@@ -257,6 +276,36 @@ export class CloudAccount extends SubscribeMixin(LitElement) {
fireEvent(this, "ha-refresh-cloud-status");
}
+ private async _deleteCloudData() {
+ const confirm = await showConfirmationDialog(this, {
+ title: this.hass.localize(
+ "ui.panel.config.cloud.account.reset_data_confirm_title"
+ ),
+ text: this.hass.localize(
+ "ui.panel.config.cloud.account.reset_data_confirm_text"
+ ),
+ confirmText: this.hass.localize("ui.panel.config.cloud.account.reset"),
+ destructive: true,
+ });
+ if (!confirm) {
+ return;
+ }
+ try {
+ await cloudLogout(this.hass);
+ await removeCloudData(this.hass);
+ } catch (err: any) {
+ showAlertDialog(this, {
+ title: this.hass.localize(
+ "ui.panel.config.cloud.account.reset_data_failed"
+ ),
+ text: err?.message,
+ });
+ return;
+ } finally {
+ fireEvent(this, "ha-refresh-cloud-status");
+ }
+ }
+
static get styles() {
return [
haStyle,
diff --git a/src/panels/config/cloud/login/cloud-login.ts b/src/panels/config/cloud/login/cloud-login.ts
index 57bb65b235..50571b07a1 100644
--- a/src/panels/config/cloud/login/cloud-login.ts
+++ b/src/panels/config/cloud/login/cloud-login.ts
@@ -2,6 +2,7 @@ import "@material/mwc-button";
import "@material/mwc-list/mwc-list";
import { css, html, LitElement, TemplateResult } from "lit";
import { customElement, property, query, state } from "lit/decorators";
+import { mdiDeleteForever, mdiDotsVertical } from "@mdi/js";
import { fireEvent } from "../../../../common/dom/fire_event";
import { navigate } from "../../../../common/navigate";
import "../../../../components/buttons/ha-progress-button";
@@ -11,7 +12,7 @@ import "../../../../components/ha-icon-next";
import "../../../../components/ha-list-item";
import type { HaTextField } from "../../../../components/ha-textfield";
import "../../../../components/ha-textfield";
-import { cloudLogin } from "../../../../data/cloud";
+import { cloudLogin, removeCloudData } from "../../../../data/cloud";
import {
showAlertDialog,
showConfirmationDialog,
@@ -51,6 +52,20 @@ export class CloudLogin extends LitElement {
.narrow=${this.narrow}
header="Home Assistant Cloud"
>
+
+
+
+
+ ${this.hass.localize(
+ "ui.panel.config.cloud.account.reset_cloud_data"
+ )}
+
+
+
Home Assistant Cloud
@@ -280,6 +295,35 @@ export class CloudLogin extends LitElement {
fireEvent(this, "flash-message-changed", { value: "" });
}
+ private async _deleteCloudData() {
+ const confirm = await showConfirmationDialog(this, {
+ title: this.hass.localize(
+ "ui.panel.config.cloud.account.reset_data_confirm_title"
+ ),
+ text: this.hass.localize(
+ "ui.panel.config.cloud.account.reset_data_confirm_text"
+ ),
+ confirmText: this.hass.localize("ui.panel.config.cloud.account.reset"),
+ destructive: true,
+ });
+ if (!confirm) {
+ return;
+ }
+ try {
+ await removeCloudData(this.hass);
+ } catch (err: any) {
+ showAlertDialog(this, {
+ title: this.hass.localize(
+ "ui.panel.config.cloud.account.reset_data_failed"
+ ),
+ text: err?.message,
+ });
+ return;
+ } finally {
+ fireEvent(this, "ha-refresh-cloud-status");
+ }
+ }
+
static get styles() {
return [
haStyle,
diff --git a/src/translations/en.json b/src/translations/en.json
index c016bba08a..1fa1aa6875 100644
--- a/src/translations/en.json
+++ b/src/translations/en.json
@@ -3500,6 +3500,11 @@
"account_created": "Account created! Check your email for instructions on how to activate your account."
},
"account": {
+ "reset_cloud_data": "Reset cloud data",
+ "reset_data_confirm_title": "Reset cloud data?",
+ "reset_data_confirm_text": "This will reset all your cloud settings. This includes your remote connection, Google Assistant and Amazon Alexa integrations. This action cannot be undone.",
+ "reset": "Reset",
+ "reset_data_failed": "Failed to reset cloud data",
"thank_you_note": "Thank you for being part of Home Assistant Cloud. It's because of people like you that we are able to make a great home automation experience for everyone. Thank you!",
"nabu_casa_account": "Nabu Casa Account",
"connection_status": "Cloud connection status",