From b586210ff1706b388c5c083dc12f50ea03bc40e4 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Wed, 31 May 2023 06:11:26 -0400 Subject: [PATCH] Support zwave config parameters not on endpoint 0 (#16597) Co-authored-by: Bram Kragten --- src/data/zwave_js.ts | 5 ++ .../zwave_js/zwave_js-node-config.ts | 73 ++++++++++++++----- src/translations/en.json | 4 +- 3 files changed, 64 insertions(+), 18 deletions(-) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index 3cfbd367fc..bb93308fd0 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -234,6 +234,8 @@ export interface ZWaveJSNodeComment { export interface ZWaveJSNodeConfigParam { property: number; + property_key: number | null; + endpoint: number; value: any; configuration_value_type: string; metadata: ZWaveJSNodeConfigParamMetadata; @@ -255,6 +257,7 @@ export interface ZWaveJSSetConfigParamData { type: string; device_id: string; property: number; + endpoint: number; property_key?: number; value: string | number; } @@ -622,6 +625,7 @@ export const setZwaveNodeConfigParameter = ( hass: HomeAssistant, device_id: string, property: number, + endpoint: number, value: number, property_key?: number ): Promise => { @@ -629,6 +633,7 @@ export const setZwaveNodeConfigParameter = ( type: "zwave_js/set_config_parameter", device_id, property, + endpoint, value, property_key, }; diff --git a/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-node-config.ts b/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-node-config.ts index 0de6edb5a4..5fc4637007 100644 --- a/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-node-config.ts +++ b/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-node-config.ts @@ -12,6 +12,7 @@ import { CSSResultGroup, html, LitElement, + nothing, PropertyValues, TemplateResult, } from "lit"; @@ -26,6 +27,7 @@ import "../../../../../components/ha-settings-row"; import "../../../../../components/ha-svg-icon"; import "../../../../../components/ha-switch"; import "../../../../../components/ha-textfield"; +import { groupBy } from "../../../../../common/util/group-by"; import { computeDeviceName, DeviceRegistryEntry, @@ -35,6 +37,7 @@ import { fetchZwaveNodeConfigParameters, fetchZwaveNodeMetadata, setZwaveNodeConfigParameter, + ZWaveJSNodeConfigParam, ZWaveJSNodeConfigParams, ZwaveJSNodeMetadata, ZWaveJSSetConfigParamResult, @@ -171,29 +174,61 @@ class ZWaveJSNodeConfig extends SubscribeMixin(LitElement) {

- - ${Object.entries(this._config).map( - ([id, item]) => html` - ${this._generateConfigBox(id, item)} - ` - )} - + ${Object.entries( + groupBy(Object.entries(this._config), ([_, item]) => + item.endpoint.toString() + ) + ).map( + ([endpoint, configParamEntries]) => html`
+

+ ${this.hass.localize( + "ui.panel.config.zwave_js.node_config.endpoint", + "endpoint", + endpoint + )} +

+ + ${configParamEntries + .sort(([_, paramA], [__, paramB]) => + paramA.property !== paramB.property + ? paramA.property - paramB.property + : paramA.property_key! - paramB.property_key! + ) + .map( + ([id, item]) => html` + ${this._generateConfigBox(id, item)} + ` + )} + +
` + )} `; } - private _generateConfigBox(id, item): TemplateResult { + private _generateConfigBox( + id: string, + item: ZWaveJSNodeConfigParam + ): TemplateResult { const result = this._results[id]; const labelAndDescription = html` ${this.hass.localize("ui.panel.config.zwave_js.node_config.parameter")}
${item.property} + ${item.property_key !== null + ? html`
+ ${this.hass.localize( + "ui.panel.config.zwave_js.node_config.bitmask" + )} +
+ ${item.property_key.toString(16)}` + : nothing}
${item.metadata.label} @@ -202,14 +237,14 @@ class ZWaveJSNodeConfig extends SubscribeMixin(LitElement) { ${item.metadata.description || item.metadata.label} ${item.metadata.description !== null && !item.metadata.writeable ? html`
` - : ""} + : nothing} ${!item.metadata.writeable ? html` ${this.hass.localize( "ui.panel.config.zwave_js.node_config.parameter_is_read_only" )} ` - : ""} + : nothing} ${result?.status ? html`

${result.error} ` - : ""} + : nothing}

` - : ""} + : nothing}
`; @@ -244,6 +279,7 @@ class ZWaveJSNodeConfig extends SubscribeMixin(LitElement) {
@@ -295,7 +333,7 @@ class ZWaveJSNodeConfig extends SubscribeMixin(LitElement) {

${item.value}

`; } - private _isEnumeratedBool(item): boolean { + private _isEnumeratedBool(item: ZWaveJSNodeConfigParam): boolean { // Some Z-Wave config values use a states list with two options where index 0 = Disabled and 1 = Enabled // We want those to be considered boolean and show a toggle switch const disabledStates = ["disable", "disabled"]; @@ -357,6 +395,7 @@ class ZWaveJSNodeConfig extends SubscribeMixin(LitElement) { this.hass, this._device!.id, target.property, + target.endpoint, value, target.propertyKey ? target.propertyKey : undefined ); diff --git a/src/translations/en.json b/src/translations/en.json index a39cecf4cc..769a10dd3f 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3778,6 +3778,7 @@ "header": "Z-Wave Device Configuration", "introduction": "Manage and adjust device specific configuration parameters for the selected device", "attribution": "Device configuration parameters and descriptions are provided by the {device_database}", + "endpoint": "Endpoint {endpoint}", "zwave_js_device_database": "Z-Wave JS Device Database", "battery_device_notice": "Battery devices must be awake to update their config. Please refer to your device manual for instructions on how to wake the device.", "parameter_is_read_only": "This parameter is read-only.", @@ -3785,7 +3786,8 @@ "set_param_accepted": "The parameter has been updated.", "set_param_queued": "The parameter change has been queued, and will be updated when the device wakes up.", "set_param_error": "An error occurred.", - "parameter": "Parameter" + "parameter": "Parameter", + "bitmask": "Bitmask" }, "node_status": { "unknown": "Unknown",