From 529e27992e7928567b1c452db529e4aa2b6738bf Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Sun, 19 Jun 2022 15:22:02 -0400 Subject: [PATCH] Subscribe to zwave_js node status updates in device panel (#12916) Co-authored-by: Paulus Schoutsen --- src/data/zwave_js.ts | 19 ++++++++++++++++++ .../zwave_js/ha-device-info-zwave_js.ts | 20 ++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index 292cbf8402..b79590c6bd 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -275,6 +275,12 @@ export interface ZWaveJSRouteStatistics { route_failed_between: [string, string] | null; } +export interface ZWaveJSNodeStatusUpdatedMessage { + event: "ready" | "wake up" | "sleep" | "dead" | "alive"; + ready: boolean; + status: NodeStatus; +} + export interface ZWaveJSRemovedNode { node_id: number; manufacturer: string; @@ -473,6 +479,19 @@ export const fetchZwaveNodeStatus = ( device_id, }); +export const subscribeZwaveNodeStatus = ( + hass: HomeAssistant, + device_id: string, + callbackFunction: (message: ZWaveJSNodeStatusUpdatedMessage) => void +): Promise => + hass.connection.subscribeMessage( + (message: any) => callbackFunction(message), + { + type: "zwave_js/subscribe_node_status", + device_id, + } + ); + export const fetchZwaveNodeMetadata = ( hass: HomeAssistant, device_id: string diff --git a/src/panels/config/devices/device-detail/integration-elements/zwave_js/ha-device-info-zwave_js.ts b/src/panels/config/devices/device-detail/integration-elements/zwave_js/ha-device-info-zwave_js.ts index eae6b47a1b..637b895d62 100644 --- a/src/panels/config/devices/device-detail/integration-elements/zwave_js/ha-device-info-zwave_js.ts +++ b/src/panels/config/devices/device-detail/integration-elements/zwave_js/ha-device-info-zwave_js.ts @@ -8,6 +8,7 @@ import { } from "lit"; import { customElement, property, state } from "lit/decorators"; import "../../../../../../components/ha-expansion-panel"; +import { UnsubscribeFunc } from "home-assistant-js-websocket"; import { ConfigEntry, getConfigEntries, @@ -17,13 +18,15 @@ import { fetchZwaveNodeStatus, nodeStatus, SecurityClass, + subscribeZwaveNodeStatus, ZWaveJSNodeStatus, } from "../../../../../../data/zwave_js"; import { haStyle } from "../../../../../../resources/styles"; import { HomeAssistant } from "../../../../../../types"; +import { SubscribeMixin } from "../../../../../../mixins/subscribe-mixin"; @customElement("ha-device-info-zwave_js") -export class HaDeviceInfoZWaveJS extends LitElement { +export class HaDeviceInfoZWaveJS extends SubscribeMixin(LitElement) { @property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public device!: DeviceRegistryEntry; @@ -41,6 +44,21 @@ export class HaDeviceInfoZWaveJS extends LitElement { } } + public hassSubscribe(): Array> { + return [ + subscribeZwaveNodeStatus(this.hass, this.device!.id, (message) => { + if (!this._node) { + return; + } + this._node = { + ...this._node, + status: message.status, + ready: message.ready, + }; + }), + ]; + } + protected async _fetchNodeDetails() { if (!this.device) { return;