diff --git a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts index ce17f60db5..f98695425d 100644 --- a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts +++ b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts @@ -116,10 +116,8 @@ class DialogZWaveJSAddNode extends LitElement { if (params.dsk) { this._status = "validate_dsk_enter_pin"; this._dsk = params.dsk; - this._startInclusion(undefined, params.dsk); - } else { - this._startInclusion(); } + this._startInclusion(); } @query("#pin-input") private _pinInput?: HaTextField; diff --git a/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-config-dashboard.ts b/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-config-dashboard.ts index 2ddef810e7..bcd16badd0 100644 --- a/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-config-dashboard.ts +++ b/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-config-dashboard.ts @@ -78,6 +78,8 @@ class ZWaveJSConfigDashboard extends SubscribeMixin(LitElement) { private _dialogOpen = false; + private _s2InclusionUnsubscribe?: Promise; + protected async firstUpdated() { if (this.hass) { await this._fetchData(); @@ -105,19 +107,7 @@ class ZWaveJSConfigDashboard extends SubscribeMixin(LitElement) { this._statistics = message; } ), - subscribeS2Inclusion(this.hass, this.configEntryId, (message) => { - if (!this._dialogOpen) { - showZWaveJSAddNodeDialog(this, { - entry_id: this.configEntryId, - dsk: message.dsk, - onStop: () => { - setTimeout(() => this._fetchData(), 100); - this._dialogOpen = false; - }, - }); - this._dialogOpen = true; - } - }), + this._subscribeS2Inclusion(), ]; } @@ -578,17 +568,7 @@ class ZWaveJSConfigDashboard extends SubscribeMixin(LitElement) { } private async _addNodeClicked() { - if (!this._dialogOpen) { - showZWaveJSAddNodeDialog(this, { - entry_id: this.configEntryId!, - // refresh the data after the dialog is closed. add a small delay for the inclusion state to update - onStop: () => { - setTimeout(() => this._fetchData(), 100); - this._dialogOpen = false; - }, - }); - this._dialogOpen = true; - } + this._openInclusionDialog(); } private async _removeNodeClicked() { @@ -627,6 +607,41 @@ class ZWaveJSConfigDashboard extends SubscribeMixin(LitElement) { showOptionsFlowDialog(this, configEntry!); } + private _openInclusionDialog(dsk?: string) { + if (!this._dialogOpen) { + // Unsubscribe from S2 inclusion before opening dialog + if (this._s2InclusionUnsubscribe) { + this._s2InclusionUnsubscribe.then((unsubscribe) => unsubscribe()); + this._s2InclusionUnsubscribe = undefined; + } + + showZWaveJSAddNodeDialog(this, { + entry_id: this.configEntryId!, + dsk, + onStop: this._handleInclusionDialogClosed, + }); + this._dialogOpen = true; + } + } + + private _handleInclusionDialogClosed = () => { + // refresh the data after the dialog is closed. add a small delay for the inclusion state to update + setTimeout(() => this._fetchData(), 100); + this._dialogOpen = false; + this._subscribeS2Inclusion(); + }; + + private _subscribeS2Inclusion() { + this._s2InclusionUnsubscribe = subscribeS2Inclusion( + this.hass, + this.configEntryId, + (message) => { + this._openInclusionDialog(message.dsk); + } + ); + return this._s2InclusionUnsubscribe; + } + static get styles(): CSSResultGroup { return [ haStyle,