diff --git a/hassio/src/supervisor-base-element.ts b/hassio/src/supervisor-base-element.ts index fbcfb57831..9402728160 100644 --- a/hassio/src/supervisor-base-element.ts +++ b/hassio/src/supervisor-base-element.ts @@ -23,6 +23,7 @@ import { SupervisorObject, supervisorCollection, SupervisorKeys, + cleanupSupervisorCollection, } from "../../src/data/supervisor/supervisor"; import { ProvideHassLitMixin } from "../../src/mixins/provide-hass-lit-mixin"; import { urlSyncMixin } from "../../src/state/url-sync-mixin"; @@ -67,6 +68,10 @@ export class SupervisorBaseElement extends urlSyncMixin( this._unsubs[unsub](); delete this._unsubs[unsub]; }); + Object.keys(this._collections).forEach((collection) => { + cleanupSupervisorCollection(this.hass.connection, collection); + }); + this._collections = {}; this.removeEventListener( "supervisor-collection-refresh", this._handleSupervisorStoreRefreshEvent @@ -114,7 +119,9 @@ export class SupervisorBaseElement extends urlSyncMixin( private async _handleSupervisorStoreRefreshEvent(ev) { const collection = ev.detail.collection; if (atLeastVersion(this.hass.config.version, 2021, 2, 4)) { - this._collections[collection].refresh(); + if (collection in this._collections) { + this._collections[collection].refresh(); + } return; } @@ -129,11 +136,17 @@ export class SupervisorBaseElement extends urlSyncMixin( if (this._unsubs[collection]) { this._unsubs[collection](); } - this._unsubs[collection] = this._collections[collection].subscribe((data) => - this._updateSupervisor({ - [collection]: data, - }) - ); + try { + this._unsubs[collection] = this._collections[collection].subscribe( + (data) => + this._updateSupervisor({ + [collection]: data, + }) + ); + } catch (e) { + // eslint-disable-next-line no-console + console.error(e); + } } private async _initSupervisor(): Promise { diff --git a/src/data/supervisor/supervisor.ts b/src/data/supervisor/supervisor.ts index cc721e5b61..fd0f19685f 100644 --- a/src/data/supervisor/supervisor.ts +++ b/src/data/supervisor/supervisor.ts @@ -132,3 +132,6 @@ export const getSupervisorEventCollection = ( subscribeSupervisorEventUpdates(connection, store, key), { unsubGrace: false } ); + +export const cleanupSupervisorCollection = (conn: Connection, key: string) => + delete conn[`_supervisor${key}Event`];