From c3e88af65831d1c810646000e30f31262681a663 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Thu, 10 Oct 2024 14:38:54 +0200 Subject: [PATCH 1/4] feat: implement Multilevel Switch mocks, add default Binary Switch state --- packages/cc/src/cc/MultilevelSwitchCC.ts | 27 +++- .../testing/src/CCSpecificCapabilities.ts | 13 ++ .../src/lib/node/MockNodeBehaviors.ts | 2 + .../lib/node/mockCCBehaviors/BinarySwitch.ts | 24 +++- .../node/mockCCBehaviors/MultilevelSwitch.ts | 127 ++++++++++++++++++ 5 files changed, 184 insertions(+), 9 deletions(-) create mode 100644 packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts diff --git a/packages/cc/src/cc/MultilevelSwitchCC.ts b/packages/cc/src/cc/MultilevelSwitchCC.ts index ecbcf05f6aba..29e9b99c40e0 100644 --- a/packages/cc/src/cc/MultilevelSwitchCC.ts +++ b/packages/cc/src/cc/MultilevelSwitchCC.ts @@ -677,8 +677,8 @@ export class MultilevelSwitchCCSet extends MultilevelSwitchCC { // @publicAPI export interface MultilevelSwitchCCReportOptions extends CCCommandOptions { - currentValue: number; - targetValue: number; + currentValue: MaybeUnknown; + targetValue: MaybeUnknown; duration?: Duration | string; } @@ -844,17 +844,27 @@ export class MultilevelSwitchCCStartLevelChange extends MultilevelSwitchCC { @useSupervision() export class MultilevelSwitchCCStopLevelChange extends MultilevelSwitchCC {} +export interface MultilevelSwitchCCSupportedReportOptions { + switchType: SwitchType; +} + @CCCommand(MultilevelSwitchCommand.SupportedReport) export class MultilevelSwitchCCSupportedReport extends MultilevelSwitchCC { public constructor( host: ZWaveHost, - options: CommandClassDeserializationOptions, + options: + | CommandClassDeserializationOptions + | (CCCommandOptions & MultilevelSwitchCCSupportedReportOptions), ) { super(host, options); - validatePayload(this.payload.length >= 1); - this.switchType = this.payload[0] & 0b11111; - // We do not support the deprecated secondary switch type + if (gotDeserializationOptions(options)) { + validatePayload(this.payload.length >= 1); + this.switchType = this.payload[0] & 0b11111; + // We do not support the deprecated secondary switch type + } else { + this.switchType = options.switchType; + } } // This is the primary switch type. We're not supporting secondary switch types @@ -867,6 +877,11 @@ export class MultilevelSwitchCCSupportedReport extends MultilevelSwitchCC { return true; } + public serialize(): Buffer { + this.payload = Buffer.from([this.switchType & 0b11111]); + return super.serialize(); + } + public toLogEntry(host?: ZWaveValueHost): MessageOrCCLogEntry { return { ...super.toLogEntry(host), diff --git a/packages/testing/src/CCSpecificCapabilities.ts b/packages/testing/src/CCSpecificCapabilities.ts index 974ebd55b7cf..cb22f0c0db65 100644 --- a/packages/testing/src/CCSpecificCapabilities.ts +++ b/packages/testing/src/CCSpecificCapabilities.ts @@ -1,6 +1,7 @@ import type { ColorComponent, KeypadMode, + SwitchType, ThermostatMode, ThermostatSetpointType, UserIDStatus, @@ -10,6 +11,7 @@ import type { CommandClasses, ConfigValue, ConfigValueFormat, + MaybeUnknown, } from "@zwave-js/core"; export interface BinarySensorCCCapabilities { @@ -17,6 +19,10 @@ export interface BinarySensorCCCapabilities { getValue?: (sensorType: number | undefined) => boolean | undefined; } +export interface BinarySwitchCCCapabilities { + defaultValue?: MaybeUnknown; +} + export interface ConfigurationCCCapabilities { // We don't have bulk support implemented in the mocks bulkSupport?: false; @@ -78,6 +84,11 @@ export interface MultilevelSensorCCCapabilities { ) => number | undefined; } +export interface MultilevelSwitchCCCapabilities { + defaultValue: MaybeUnknown; + primarySwitchType: SwitchType; +} + export interface SoundSwitchCCCapabilities { defaultToneId: number; defaultVolume: number; @@ -153,7 +164,9 @@ export type CCSpecificCapabilities = { [CommandClasses.Configuration]: ConfigurationCCCapabilities; [CommandClasses.Notification]: NotificationCCCapabilities; [48 /* Binary Sensor */]: BinarySensorCCCapabilities; + [0x25 /* Binary Switch */]: BinarySwitchCCCapabilities; [49 /* Multilevel Sensor */]: MultilevelSensorCCCapabilities; + [0x26 /* Multilevel Switch */]: MultilevelSwitchCCCapabilities; [51 /* Color Switch */]: ColorSwitchCCCapabilities; [121 /* Sound Switch */]: SoundSwitchCCCapabilities; [106 /* Window Covering */]: WindowCoveringCCCapabilities; diff --git a/packages/zwave-js/src/lib/node/MockNodeBehaviors.ts b/packages/zwave-js/src/lib/node/MockNodeBehaviors.ts index 327e3afeebb4..2ae2ecc0735d 100644 --- a/packages/zwave-js/src/lib/node/MockNodeBehaviors.ts +++ b/packages/zwave-js/src/lib/node/MockNodeBehaviors.ts @@ -30,6 +30,7 @@ import { MultiChannelCCHooks, } from "./mockCCBehaviors/MultiChannel"; import { MultilevelSensorCCBehaviors } from "./mockCCBehaviors/MultilevelSensor"; +import { MultilevelSwitchCCBehaviors } from "./mockCCBehaviors/MultilevelSwitch"; import { NotificationCCBehaviors } from "./mockCCBehaviors/Notification"; import { ScheduleEntryLockCCBehaviors } from "./mockCCBehaviors/ScheduleEntryLock"; import { SoundSwitchCCBehaviors } from "./mockCCBehaviors/SoundSwitch"; @@ -186,6 +187,7 @@ export function createDefaultBehaviors(): MockNodeBehavior[] { ...ManufacturerSpecificCCBehaviors, ...MeterCCBehaviors, ...MultilevelSensorCCBehaviors, + ...MultilevelSwitchCCBehaviors, ...NotificationCCBehaviors, ...ScheduleEntryLockCCBehaviors, ...SoundSwitchCCBehaviors, diff --git a/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts b/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts index 412beb3c0d0e..0460de9ebe23 100644 --- a/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts +++ b/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts @@ -3,8 +3,19 @@ import { BinarySwitchCCReport, BinarySwitchCCSet, } from "@zwave-js/cc/BinarySwitchCC"; -import { type MaybeUnknown, UNKNOWN_STATE } from "@zwave-js/core"; -import { type MockNodeBehavior } from "@zwave-js/testing"; +import { + CommandClasses, + type MaybeUnknown, + UNKNOWN_STATE, +} from "@zwave-js/core"; +import { + BinarySwitchCCCapabilities, + type MockNodeBehavior, +} from "@zwave-js/testing"; + +const defaultCapabilities: BinarySwitchCCCapabilities = { + defaultValue: false, +}; const STATE_KEY_PREFIX = "BinarySwitch_"; const StateKeys = { @@ -14,10 +25,17 @@ const StateKeys = { const respondToBinarySwitchGet: MockNodeBehavior = { handleCC(controller, self, receivedCC) { if (receivedCC instanceof BinarySwitchCCGet) { + const capabilities = { + ...defaultCapabilities, + ...self.getCCCapabilities( + CommandClasses["Binary Switch"], + receivedCC.endpointIndex, + ), + }; const cc = new BinarySwitchCCReport(self.host, { nodeId: controller.host.ownNodeId, currentValue: (self.state.get(StateKeys.currentValue) - ?? UNKNOWN_STATE) as MaybeUnknown, + ?? capabilities.defaultValue) as MaybeUnknown, }); return { action: "sendCC", cc }; } diff --git a/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts b/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts new file mode 100644 index 000000000000..026ad071e92b --- /dev/null +++ b/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts @@ -0,0 +1,127 @@ +import { SwitchType } from "@zwave-js/cc"; +import { + MultilevelSwitchCCGet, + MultilevelSwitchCCReport, + MultilevelSwitchCCSet, + MultilevelSwitchCCStartLevelChange, + MultilevelSwitchCCStopLevelChange, + MultilevelSwitchCCSupportedGet, + MultilevelSwitchCCSupportedReport, +} from "@zwave-js/cc/MultilevelSwitchCC"; +import { + CommandClasses, + type MaybeUnknown, + UNKNOWN_STATE, +} from "@zwave-js/core"; +import { + type MockNodeBehavior, + MultilevelSwitchCCCapabilities, +} from "@zwave-js/testing"; + +const defaultCapabilities: MultilevelSwitchCCCapabilities = { + defaultValue: 0, + primarySwitchType: SwitchType["Down/Up"], +}; + +const STATE_KEY_PREFIX = "MultilevelSwitch_"; +const StateKeys = { + currentValue: `${STATE_KEY_PREFIX}currentValue`, +} as const; + +const respondToMultilevelSwitchGet: MockNodeBehavior = { + handleCC(controller, self, receivedCC) { + if (receivedCC instanceof MultilevelSwitchCCGet) { + const capabilities = { + ...defaultCapabilities, + ...self.getCCCapabilities( + CommandClasses["Multilevel Switch"], + receivedCC.endpointIndex, + ), + }; + const currentValue = (self.state.get(StateKeys.currentValue) + ?? capabilities.defaultValue + ?? UNKNOWN_STATE) as MaybeUnknown; + const cc = new MultilevelSwitchCCReport(self.host, { + nodeId: controller.host.ownNodeId, + currentValue, + // We don't support transitioning yet + targetValue: currentValue, + }); + return { action: "sendCC", cc }; + } + }, +}; + +const respondToMultilevelSwitchSet: MockNodeBehavior = { + handleCC(controller, self, receivedCC) { + if (receivedCC instanceof MultilevelSwitchCCSet) { + self.state.set(StateKeys.currentValue, receivedCC.targetValue); + return { action: "ok" }; + } + }, +}; + +const respondToMultilevelSwitchSupportedGet: MockNodeBehavior = { + handleCC(controller, self, receivedCC) { + if (receivedCC instanceof MultilevelSwitchCCSupportedGet) { + const capabilities = { + ...defaultCapabilities, + ...self.getCCCapabilities( + CommandClasses["Multilevel Switch"], + receivedCC.endpointIndex, + ), + }; + const cc = new MultilevelSwitchCCSupportedReport(self.host, { + nodeId: controller.host.ownNodeId, + switchType: capabilities.primarySwitchType, + }); + return { action: "sendCC", cc }; + } + }, +}; + +const respondToMultilevelSwitchStartLevelChange: MockNodeBehavior = { + handleCC(controller, self, receivedCC) { + if (receivedCC instanceof MultilevelSwitchCCStartLevelChange) { + const capabilities = { + ...defaultCapabilities, + ...self.getCCCapabilities( + CommandClasses["Color Switch"], + receivedCC.endpointIndex, + ), + }; + + // TODO: A proper simulation should gradually transition the value. We just set it to the target value. + self.state.set( + StateKeys.currentValue, + receivedCC.direction === "up" ? 99 : 0, + ); + + return { action: "ok" }; + } + }, +}; + +const respondToMultilevelSwitchStopLevelChange: MockNodeBehavior = { + handleCC(controller, self, receivedCC) { + if (receivedCC instanceof MultilevelSwitchCCStopLevelChange) { + const capabilities = { + ...defaultCapabilities, + ...self.getCCCapabilities( + CommandClasses["Color Switch"], + receivedCC.endpointIndex, + ), + }; + + return { action: "ok" }; + } + }, +}; + +export const MultilevelSwitchCCBehaviors = [ + respondToMultilevelSwitchGet, + respondToMultilevelSwitchSet, + respondToMultilevelSwitchSupportedGet, + respondToMultilevelSwitchStartLevelChange, + respondToMultilevelSwitchStopLevelChange, +]; From 8a7414466cc7f7176931a41c1627a63e8cc82695 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Thu, 10 Oct 2024 14:48:29 +0200 Subject: [PATCH 2/4] fix: lint --- packages/cc/src/cc/MultilevelSwitchCC.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cc/src/cc/MultilevelSwitchCC.ts b/packages/cc/src/cc/MultilevelSwitchCC.ts index 29e9b99c40e0..cda49dc18438 100644 --- a/packages/cc/src/cc/MultilevelSwitchCC.ts +++ b/packages/cc/src/cc/MultilevelSwitchCC.ts @@ -844,6 +844,7 @@ export class MultilevelSwitchCCStartLevelChange extends MultilevelSwitchCC { @useSupervision() export class MultilevelSwitchCCStopLevelChange extends MultilevelSwitchCC {} +// @publicAPI export interface MultilevelSwitchCCSupportedReportOptions { switchType: SwitchType; } From d0490eb605807a13ff05a0e70825401860748b18 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Thu, 10 Oct 2024 14:51:29 +0200 Subject: [PATCH 3/4] fix: lint --- .../lib/node/mockCCBehaviors/BinarySwitch.ts | 8 ++------ .../node/mockCCBehaviors/MultilevelSwitch.ts | 18 +----------------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts b/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts index 0460de9ebe23..a6f815d184f3 100644 --- a/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts +++ b/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts @@ -3,13 +3,9 @@ import { BinarySwitchCCReport, BinarySwitchCCSet, } from "@zwave-js/cc/BinarySwitchCC"; +import { CommandClasses, type MaybeUnknown } from "@zwave-js/core"; import { - CommandClasses, - type MaybeUnknown, - UNKNOWN_STATE, -} from "@zwave-js/core"; -import { - BinarySwitchCCCapabilities, + type BinarySwitchCCCapabilities, type MockNodeBehavior, } from "@zwave-js/testing"; diff --git a/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts b/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts index 026ad071e92b..f42d06c85e50 100644 --- a/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts +++ b/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts @@ -15,7 +15,7 @@ import { } from "@zwave-js/core"; import { type MockNodeBehavior, - MultilevelSwitchCCCapabilities, + type MultilevelSwitchCCCapabilities, } from "@zwave-js/testing"; const defaultCapabilities: MultilevelSwitchCCCapabilities = { @@ -83,14 +83,6 @@ const respondToMultilevelSwitchSupportedGet: MockNodeBehavior = { const respondToMultilevelSwitchStartLevelChange: MockNodeBehavior = { handleCC(controller, self, receivedCC) { if (receivedCC instanceof MultilevelSwitchCCStartLevelChange) { - const capabilities = { - ...defaultCapabilities, - ...self.getCCCapabilities( - CommandClasses["Color Switch"], - receivedCC.endpointIndex, - ), - }; - // TODO: A proper simulation should gradually transition the value. We just set it to the target value. self.state.set( StateKeys.currentValue, @@ -105,14 +97,6 @@ const respondToMultilevelSwitchStartLevelChange: MockNodeBehavior = { const respondToMultilevelSwitchStopLevelChange: MockNodeBehavior = { handleCC(controller, self, receivedCC) { if (receivedCC instanceof MultilevelSwitchCCStopLevelChange) { - const capabilities = { - ...defaultCapabilities, - ...self.getCCCapabilities( - CommandClasses["Color Switch"], - receivedCC.endpointIndex, - ), - }; - return { action: "ok" }; } }, From 7690c86d14a75d8551506b833828de21a7c14b9e Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Thu, 10 Oct 2024 19:42:37 +0200 Subject: [PATCH 4/4] fix: broken test assumptions --- .../lib/node/mockCCBehaviors/BinarySwitch.ts | 13 +++++++--- .../node/mockCCBehaviors/MultilevelSwitch.ts | 8 ++++--- .../multicastOptimisticValueUpdate.test.ts | 18 +++++++++++--- .../driver/setValueSupervisionWorking.test.ts | 24 ++++++++++++++----- .../src/lib/test/driver/unknownValues.test.ts | 20 ++++++++++++---- 5 files changed, 64 insertions(+), 19 deletions(-) diff --git a/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts b/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts index a6f815d184f3..416dc35a2e09 100644 --- a/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts +++ b/packages/zwave-js/src/lib/node/mockCCBehaviors/BinarySwitch.ts @@ -3,7 +3,11 @@ import { BinarySwitchCCReport, BinarySwitchCCSet, } from "@zwave-js/cc/BinarySwitchCC"; -import { CommandClasses, type MaybeUnknown } from "@zwave-js/core"; +import { + CommandClasses, + type MaybeUnknown, + UNKNOWN_STATE, +} from "@zwave-js/core"; import { type BinarySwitchCCCapabilities, type MockNodeBehavior, @@ -30,8 +34,11 @@ const respondToBinarySwitchGet: MockNodeBehavior = { }; const cc = new BinarySwitchCCReport(self.host, { nodeId: controller.host.ownNodeId, - currentValue: (self.state.get(StateKeys.currentValue) - ?? capabilities.defaultValue) as MaybeUnknown, + currentValue: ( + self.state.get(StateKeys.currentValue) + ?? capabilities.defaultValue + ?? UNKNOWN_STATE + ) as MaybeUnknown, }); return { action: "sendCC", cc }; } diff --git a/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts b/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts index f42d06c85e50..09bbc13d794a 100644 --- a/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts +++ b/packages/zwave-js/src/lib/node/mockCCBehaviors/MultilevelSwitch.ts @@ -38,9 +38,11 @@ const respondToMultilevelSwitchGet: MockNodeBehavior = { receivedCC.endpointIndex, ), }; - const currentValue = (self.state.get(StateKeys.currentValue) - ?? capabilities.defaultValue - ?? UNKNOWN_STATE) as MaybeUnknown; + const currentValue = ( + self.state.get(StateKeys.currentValue) + ?? capabilities.defaultValue + ?? UNKNOWN_STATE + ) as MaybeUnknown; const cc = new MultilevelSwitchCCReport(self.host, { nodeId: controller.host.ownNodeId, currentValue, diff --git a/packages/zwave-js/src/lib/test/driver/multicastOptimisticValueUpdate.test.ts b/packages/zwave-js/src/lib/test/driver/multicastOptimisticValueUpdate.test.ts index d69cc4abffaa..eee056f29c39 100644 --- a/packages/zwave-js/src/lib/test/driver/multicastOptimisticValueUpdate.test.ts +++ b/packages/zwave-js/src/lib/test/driver/multicastOptimisticValueUpdate.test.ts @@ -1,6 +1,6 @@ import { BinarySwitchCCSet, BinarySwitchCCValues } from "@zwave-js/cc"; import { CommandClasses, NOT_KNOWN, UNKNOWN_STATE } from "@zwave-js/core"; -import { MockZWaveFrameType } from "@zwave-js/testing"; +import { MockZWaveFrameType, ccCaps } from "@zwave-js/testing"; import { wait } from "alcalzone-shared/async"; import { integrationTest } from "../integrationTestSuiteMulti"; @@ -17,13 +17,25 @@ integrationTest("multicast setValue: do optimistic value update after ACK", { { id: 2, capabilities: { - commandClasses: [CommandClasses["Binary Switch"]], + commandClasses: [ + ccCaps({ + ccId: CommandClasses["Binary Switch"], + isSupported: true, + defaultValue: NOT_KNOWN, + }), + ], }, }, { id: 3, capabilities: { - commandClasses: [CommandClasses["Binary Switch"]], + commandClasses: [ + ccCaps({ + ccId: CommandClasses["Binary Switch"], + isSupported: true, + defaultValue: NOT_KNOWN, + }), + ], }, }, ], diff --git a/packages/zwave-js/src/lib/test/driver/setValueSupervisionWorking.test.ts b/packages/zwave-js/src/lib/test/driver/setValueSupervisionWorking.test.ts index 43a916321b24..927a6d01ced7 100644 --- a/packages/zwave-js/src/lib/test/driver/setValueSupervisionWorking.test.ts +++ b/packages/zwave-js/src/lib/test/driver/setValueSupervisionWorking.test.ts @@ -3,9 +3,15 @@ import { SupervisionCCGet, SupervisionCCReport, } from "@zwave-js/cc"; -import { CommandClasses, Duration, SupervisionStatus } from "@zwave-js/core"; +import { + CommandClasses, + Duration, + SupervisionStatus, + UNKNOWN_STATE, +} from "@zwave-js/core"; import { type MockNodeBehavior, + ccCaps, createMockZWaveRequestFrame, } from "@zwave-js/testing"; import { wait } from "alcalzone-shared/async"; @@ -22,7 +28,12 @@ integrationTest( nodeCapabilities: { commandClasses: [ - CommandClasses["Multilevel Switch"], + ccCaps({ + ccId: CommandClasses["Multilevel Switch"], + isSupported: true, + version: 4, + defaultValue: UNKNOWN_STATE, + }), CommandClasses.Supervision, ], }, @@ -65,22 +76,23 @@ integrationTest( }; mockNode.defineBehavior(respondToSupervisionGet); }, + testBody: async (t, driver, node, _mockController, _mockNode) => { const targetValueId = MultilevelSwitchCCValues.targetValue.id; const currentValueId = MultilevelSwitchCCValues.currentValue.id; - t.is(node.getValue(targetValueId), undefined); - t.is(node.getValue(currentValueId), undefined); + t.is(node.getValue(targetValueId), UNKNOWN_STATE); + t.is(node.getValue(currentValueId), UNKNOWN_STATE); await node.setValue(targetValueId, 55); t.is(node.getValue(targetValueId), 55); - t.is(node.getValue(currentValueId), undefined); + t.is(node.getValue(currentValueId), UNKNOWN_STATE); // Unchanged after 0.5s await wait(500); t.is(node.getValue(targetValueId), 55); - t.is(node.getValue(currentValueId), undefined); + t.is(node.getValue(currentValueId), UNKNOWN_STATE); // Updated after 2.5s await wait(2000); diff --git a/packages/zwave-js/src/lib/test/driver/unknownValues.test.ts b/packages/zwave-js/src/lib/test/driver/unknownValues.test.ts index 2709f85dcc79..4273ae3c9483 100644 --- a/packages/zwave-js/src/lib/test/driver/unknownValues.test.ts +++ b/packages/zwave-js/src/lib/test/driver/unknownValues.test.ts @@ -15,6 +15,7 @@ import { } from "@zwave-js/core"; import { type MockNodeBehavior, + ccCaps, createMockZWaveRequestFrame, } from "@zwave-js/testing"; import { wait } from "alcalzone-shared/async"; @@ -95,7 +96,12 @@ integrationTest( // ), nodeCapabilities: { - commandClasses: [CommandClasses["Multilevel Switch"]], + commandClasses: [ccCaps({ + ccId: CommandClasses["Multilevel Switch"], + isSupported: true, + version: 4, + defaultValue: UNKNOWN_STATE, + })], }, testBody: async (t, driver, node, mockController, mockNode) => { @@ -103,8 +109,8 @@ integrationTest( const currentValueId = MultilevelSwitchCCValues.currentValue.id; // At the start, values are not known yet - t.is(node.getValue(targetValueId), NOT_KNOWN); - t.is(node.getValue(currentValueId), NOT_KNOWN); + t.is(node.getValue(targetValueId), UNKNOWN_STATE); + t.is(node.getValue(currentValueId), UNKNOWN_STATE); // Send an initial state let cc = new MultilevelSwitchCCReport(mockNode.host, { @@ -155,7 +161,13 @@ integrationTest( // ), nodeCapabilities: { - commandClasses: [CommandClasses["Binary Switch"]], + commandClasses: [ + ccCaps({ + ccId: CommandClasses["Binary Switch"], + isSupported: true, + defaultValue: NOT_KNOWN, + }), + ], }, additionalDriverOptions: {