@zwave-js/cc 15.31.1 → 15.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/cc/AlarmSensorCC.js +2 -3
- package/build/cjs/cc/AlarmSensorCC.js.map +2 -2
- package/build/cjs/cc/AssociationGroupInfoCC.js +5 -2
- package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
- package/build/cjs/cc/BarrierOperatorCC.js +5 -8
- package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
- package/build/cjs/cc/BinarySensorCC.js +1 -2
- package/build/cjs/cc/BinarySensorCC.js.map +2 -2
- package/build/cjs/cc/ColorSwitchCC.js +3 -5
- package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
- package/build/cjs/cc/ConfigurationCC.d.ts +7 -0
- package/build/cjs/cc/ConfigurationCC.js +28 -8
- package/build/cjs/cc/ConfigurationCC.js.map +2 -2
- package/build/cjs/cc/EntryControlCC.js +3 -2
- package/build/cjs/cc/EntryControlCC.js.map +2 -2
- package/build/cjs/cc/IndicatorCC.js +3 -3
- package/build/cjs/cc/IndicatorCC.js.map +2 -2
- package/build/cjs/cc/IrrigationCC.js.map +1 -1
- package/build/cjs/cc/LanguageCC.js +6 -2
- package/build/cjs/cc/LanguageCC.js.map +2 -2
- package/build/cjs/cc/ManufacturerSpecificCC.js +1 -1
- package/build/cjs/cc/ManufacturerSpecificCC.js.map +2 -2
- package/build/cjs/cc/MeterCC.js +25 -4
- package/build/cjs/cc/MeterCC.js.map +2 -2
- package/build/cjs/cc/NodeNamingCC.js +2 -2
- package/build/cjs/cc/NodeNamingCC.js.map +2 -2
- package/build/cjs/cc/NotificationCC.js +10 -11
- package/build/cjs/cc/NotificationCC.js.map +2 -2
- package/build/cjs/cc/PowerlevelCC.js +1 -1
- package/build/cjs/cc/PowerlevelCC.js.map +2 -2
- package/build/cjs/cc/Security2CC.js +11 -6
- package/build/cjs/cc/Security2CC.js.map +2 -2
- package/build/cjs/cc/SecurityCC.js +2 -1
- package/build/cjs/cc/SecurityCC.js.map +2 -2
- package/build/cjs/cc/SoundSwitchCC.js +1 -1
- package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
- package/build/cjs/cc/ThermostatSetpointCC.js +2 -1
- package/build/cjs/cc/ThermostatSetpointCC.js.map +2 -2
- package/build/cjs/cc/UserCredentialCC.d.ts +6 -0
- package/build/cjs/cc/UserCredentialCC.js +81 -6
- package/build/cjs/cc/UserCredentialCC.js.map +2 -2
- package/build/cjs/cc/WindowCoveringCC.js +1 -2
- package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
- package/build/cjs/cc/_CCValues.generated.d.ts +2 -2
- package/build/cjs/lib/Security2/Extension.js +2 -1
- package/build/cjs/lib/Security2/Extension.js.map +2 -2
- package/build/cjs/lib/securityLogging.d.ts +6 -0
- package/build/cjs/lib/securityLogging.js +34 -0
- package/build/cjs/lib/securityLogging.js.map +7 -0
- package/build/cjs/lib/serializers.js +3 -0
- package/build/cjs/lib/serializers.js.map +2 -2
- package/build/esm/cc/AlarmSensorCC.d.ts.map +1 -1
- package/build/esm/cc/AlarmSensorCC.js +5 -3
- package/build/esm/cc/AlarmSensorCC.js.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.js +10 -6
- package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
- package/build/esm/cc/BarrierOperatorCC.js +6 -9
- package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
- package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
- package/build/esm/cc/BinarySensorCC.js +2 -3
- package/build/esm/cc/BinarySensorCC.js.map +1 -1
- package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/ColorSwitchCC.js +4 -7
- package/build/esm/cc/ColorSwitchCC.js.map +1 -1
- package/build/esm/cc/ConfigurationCC.d.ts +7 -0
- package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/ConfigurationCC.js +34 -13
- package/build/esm/cc/ConfigurationCC.js.map +1 -1
- package/build/esm/cc/EntryControlCC.d.ts.map +1 -1
- package/build/esm/cc/EntryControlCC.js +4 -3
- package/build/esm/cc/EntryControlCC.js.map +1 -1
- package/build/esm/cc/IndicatorCC.d.ts.map +1 -1
- package/build/esm/cc/IndicatorCC.js +4 -6
- package/build/esm/cc/IndicatorCC.js.map +1 -1
- package/build/esm/cc/IrrigationCC.js.map +1 -1
- package/build/esm/cc/LanguageCC.d.ts.map +1 -1
- package/build/esm/cc/LanguageCC.js +8 -3
- package/build/esm/cc/LanguageCC.js.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.d.ts.map +1 -1
- package/build/esm/cc/ManufacturerSpecificCC.js +2 -2
- package/build/esm/cc/ManufacturerSpecificCC.js.map +1 -1
- package/build/esm/cc/MeterCC.d.ts.map +1 -1
- package/build/esm/cc/MeterCC.js +27 -5
- package/build/esm/cc/MeterCC.js.map +1 -1
- package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
- package/build/esm/cc/NodeNamingCC.js +3 -3
- package/build/esm/cc/NodeNamingCC.js.map +1 -1
- package/build/esm/cc/NotificationCC.d.ts.map +1 -1
- package/build/esm/cc/NotificationCC.js +22 -24
- package/build/esm/cc/NotificationCC.js.map +1 -1
- package/build/esm/cc/PowerlevelCC.d.ts.map +1 -1
- package/build/esm/cc/PowerlevelCC.js +2 -2
- package/build/esm/cc/PowerlevelCC.js.map +1 -1
- package/build/esm/cc/Security2CC.d.ts.map +1 -1
- package/build/esm/cc/Security2CC.js +21 -10
- package/build/esm/cc/Security2CC.js.map +1 -1
- package/build/esm/cc/SecurityCC.d.ts.map +1 -1
- package/build/esm/cc/SecurityCC.js +4 -4
- package/build/esm/cc/SecurityCC.js.map +1 -1
- package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/SoundSwitchCC.js +2 -2
- package/build/esm/cc/SoundSwitchCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.d.ts.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.js +5 -1
- package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
- package/build/esm/cc/UserCredentialCC.d.ts +6 -0
- package/build/esm/cc/UserCredentialCC.d.ts.map +1 -1
- package/build/esm/cc/UserCredentialCC.js +103 -13
- package/build/esm/cc/UserCredentialCC.js.map +1 -1
- package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
- package/build/esm/cc/WindowCoveringCC.js +3 -4
- package/build/esm/cc/WindowCoveringCC.js.map +1 -1
- package/build/esm/cc/_CCValues.generated.d.ts +2 -2
- package/build/esm/cc/_CCValues.generated.d.ts.map +1 -1
- package/build/esm/lib/Security2/Extension.d.ts.map +1 -1
- package/build/esm/lib/Security2/Extension.js +3 -3
- package/build/esm/lib/Security2/Extension.js.map +1 -1
- package/build/esm/lib/securityLogging.d.ts +6 -0
- package/build/esm/lib/securityLogging.d.ts.map +1 -0
- package/build/esm/lib/securityLogging.js +10 -0
- package/build/esm/lib/securityLogging.js.map +1 -0
- package/build/esm/lib/serializers.d.ts.map +1 -1
- package/build/esm/lib/serializers.js +4 -0
- package/build/esm/lib/serializers.js.map +1 -1
- package/package.json +11 -11
|
@@ -305,9 +305,8 @@ let BinarySensorCCReport = (() => {
|
|
|
305
305
|
const value = raw.payload[0] === 255;
|
|
306
306
|
let type = import_Types.BinarySensorType.Any;
|
|
307
307
|
if (raw.payload.length >= 2) {
|
|
308
|
-
type = raw.payload[1];
|
|
308
|
+
type = (0, import_core.parseEnumValue)(import_Types.BinarySensorType, raw.payload[1]);
|
|
309
309
|
}
|
|
310
|
-
(0, import_core.validatePayload)((0, import_shared.isEnumMember)(import_Types.BinarySensorType, type));
|
|
311
310
|
return new this({
|
|
312
311
|
nodeId: ctx.sourceNodeId,
|
|
313
312
|
value,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src_gen/cc/BinarySensorCC.ts"],
|
|
4
|
-
"sourcesContent": ["import * as __validateArgs from \"./BinarySensorCC._validateArgs.js\";\nconst { validateArgs_BinarySensorCCAPI_get, validateArgs_BinarySensorCCAPI_sendReport, validateArgs_BinarySensorCCAPI_reportSupportedSensorTypes } = __validateArgs;\nimport { CommandClasses, type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type SupervisionResult, ValueMetadata, type WithAddress, encodeBitMask, logList, logText, parseBitMask, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, isEnumMember } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, PhysicalCCAPI, type PollValueImplementation, throwUnsupportedProperty, } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, getEffectiveCCVersion, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { BinarySensorCommand, BinarySensorType } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { BinarySensorCCValues } from \"./_CCValues.generated.js\";\nexport { BinarySensorCCValues };\n// @noSetValueAPI This CC is read-only\n@API(CommandClasses[\"Binary Sensor\"])\nexport class BinarySensorCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: BinarySensorCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case BinarySensorCommand.Get:\n case BinarySensorCommand.Report:\n return true; // This is mandatory\n case BinarySensorCommand.SupportedGet:\n case BinarySensorCommand.SupportedReport:\n return this.version >= 2;\n }\n return super.supportsCommand(cmd);\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: BinarySensorCCAPI, { property }) {\n if (typeof property === \"string\") {\n const sensorType = (BinarySensorType as any)[property] as BinarySensorType | undefined;\n if (sensorType)\n return this.get(sensorType);\n }\n throwUnsupportedProperty(this.ccId, property);\n };\n }\n /**\n * Retrieves the current value from this sensor\n * @param sensorType The (optional) sensor type to retrieve the value for\n */\n @validateArgs_BinarySensorCCAPI_get()\n public async get(sensorType?: BinarySensorType): Promise<MaybeNotKnown<boolean>> {\n this.assertSupportsCommand(BinarySensorCommand, BinarySensorCommand.Get);\n const cc = new BinarySensorCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n sensorType,\n });\n const response = await this.host.sendCommand<BinarySensorCCReport>(cc, this.commandOptions);\n // We don't want to repeat the sensor type\n return response?.value;\n }\n @validateArgs_BinarySensorCCAPI_sendReport()\n public async sendReport(value: boolean, sensorType?: BinarySensorType): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(BinarySensorCommand, BinarySensorCommand.Report);\n const cc = new BinarySensorCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n value,\n type: sensorType,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n public async getSupportedSensorTypes(): Promise<readonly BinarySensorType[] | undefined> {\n this.assertSupportsCommand(BinarySensorCommand, BinarySensorCommand.SupportedGet);\n const cc = new BinarySensorCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<BinarySensorCCSupportedReport>(cc, this.commandOptions);\n // We don't want to repeat the sensor type\n return response?.supportedSensorTypes;\n }\n @validateArgs_BinarySensorCCAPI_reportSupportedSensorTypes()\n public async reportSupportedSensorTypes(supported: BinarySensorType[]): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(BinarySensorCommand, BinarySensorCommand.SupportedReport);\n const cc = new BinarySensorCCSupportedReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n supportedSensorTypes: supported,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n}\n@commandClass(CommandClasses[\"Binary Sensor\"])\n@implementedVersion(2)\n@ccValues(BinarySensorCCValues)\nexport class BinarySensorCC extends CommandClass {\n declare ccCommand: BinarySensorCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Binary Sensor\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Find out which sensor types this sensor supports\n if (api.version >= 2) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying supported sensor types...\",\n direction: \"outbound\",\n });\n const supportedSensorTypes = await api.getSupportedSensorTypes();\n if (supportedSensorTypes) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(\"received supported sensor types:\", {\n nested: logList(supportedSensorTypes.map((type) => getEnumMemberName(BinarySensorType, type))),\n }),\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported sensor types timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n }\n await this.refreshValues(ctx, { tag: \"interview\" });\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Binary Sensor\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n // Query (all of) the sensor's current value(s)\n if (api.version === 1) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying current value...\",\n direction: \"outbound\",\n });\n const currentValue = await api.get();\n if (currentValue != undefined) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received current value: ${currentValue}`,\n direction: \"inbound\",\n });\n }\n }\n else {\n const supportedSensorTypes: readonly BinarySensorType[] = this.getValue(ctx, BinarySensorCCValues.supportedSensorTypes)\n ?? [];\n for (const type of supportedSensorTypes) {\n // Some devices report invalid sensor types, but the CC API checks\n // for valid values and throws otherwise.\n if (!isEnumMember(BinarySensorType, type))\n continue;\n const sensorName = getEnumMemberName(BinarySensorType, type);\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying current value for ${sensorName}...`,\n direction: \"outbound\",\n });\n const currentValue = await api.get(type);\n if (currentValue != undefined) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received current value for ${sensorName}: ${currentValue}`,\n direction: \"inbound\",\n });\n }\n }\n }\n }\n /**\n * Returns which sensor types are supported.\n * This only works AFTER the interview process\n */\n public static getSupportedSensorTypesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<BinarySensorType[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(BinarySensorCCValues.supportedSensorTypes.endpoint(endpoint.index));\n }\n public setMappedBasicValue(ctx: GetValueDB, value: number): boolean {\n // Prefer setting an existing value to avoid creating a spurious \"Any\" sensor type.\n // Check for the Any type first (backwards compat), then the first one that\n // already exists in the value DB. Fall back to Any if none exist.\n const valueDB = this.getValueDB(ctx);\n const anyValueId = BinarySensorCCValues.state(BinarySensorType.Any).endpoint(this.endpointIndex);\n let sensorType: BinarySensorType;\n if (valueDB.hasMetadata(anyValueId)) {\n sensorType = BinarySensorType.Any;\n }\n else {\n const existingSensorTypes = valueDB\n .getAllMetadata(CommandClasses[\"Binary Sensor\"])\n .filter((v) => v.endpoint === this.endpointIndex\n && BinarySensorCCValues.state.is(v))\n .map((v) => (v.metadata as {\n ccSpecific?: {\n sensorType?: BinarySensorType;\n };\n })?.ccSpecific?.sensorType)\n .filter((t): t is BinarySensorType => t != undefined)\n .toSorted((a, b) => a - b);\n sensorType = existingSensorTypes[0] ?? BinarySensorType.Any;\n }\n const binarySensorValue = BinarySensorCCValues.state(sensorType);\n this.setValue(ctx, binarySensorValue, value > 0);\n return true;\n }\n}\n// @publicAPI\nexport interface BinarySensorCCReportOptions {\n type?: BinarySensorType;\n value: boolean;\n}\n@CCCommand(BinarySensorCommand.Report)\nexport class BinarySensorCCReport extends BinarySensorCC {\n public constructor(options: WithAddress<BinarySensorCCReportOptions>) {\n super(options);\n this.type = options.type ?? BinarySensorType.Any;\n this.value = options.value;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): BinarySensorCCReport {\n validatePayload(raw.payload.length >= 1);\n const value = raw.payload[0] === 0xff;\n let type: BinarySensorType = BinarySensorType.Any;\n if (raw.payload.length >= 2) {\n type = raw.payload[1];\n }\n validatePayload(isEnumMember(BinarySensorType, type));\n return new this({\n nodeId: ctx.sourceNodeId,\n value,\n type,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // The sensor type field only exists in V2+ reports.\n // Ignore it if the device advertises version 1.\n const ccVersion = getEffectiveCCVersion(ctx, this);\n // Workaround for devices reporting with sensor type Any -> find first supported sensor type and use that\n let sensorType = BinarySensorType.Any;\n if (ccVersion >= 2) {\n sensorType = this.type;\n }\n if (sensorType === BinarySensorType.Any) {\n const supportedSensorTypes = this.getValue<BinarySensorType[]>(ctx, BinarySensorCCValues.supportedSensorTypes);\n if (supportedSensorTypes?.length) {\n sensorType = supportedSensorTypes[0];\n }\n }\n const binarySensorValue = BinarySensorCCValues.state(sensorType);\n this.setMetadata(ctx, binarySensorValue, binarySensorValue.meta);\n this.setValue(ctx, binarySensorValue, this.value);\n return true;\n }\n public type: BinarySensorType;\n public value: boolean;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.value ? 0xff : 0x00, this.type]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n type: getEnumMemberName(BinarySensorType, this.type),\n value: this.value,\n },\n };\n }\n}\nfunction testResponseForBinarySensorGet(sent: BinarySensorCCGet, received: BinarySensorCCReport) {\n // We expect a Binary Sensor Report that matches the requested sensor type (if a type was requested)\n return (sent.sensorType == undefined\n || sent.sensorType === BinarySensorType.Any\n || received.type === sent.sensorType\n // This is technically not correct, but some devices do this anyways\n || received.type === BinarySensorType.Any);\n}\n// @publicAPI\nexport interface BinarySensorCCGetOptions {\n sensorType?: BinarySensorType;\n}\n@CCCommand(BinarySensorCommand.Get)\n@expectedCCResponse(BinarySensorCCReport, testResponseForBinarySensorGet)\nexport class BinarySensorCCGet extends BinarySensorCC {\n public constructor(options: WithAddress<BinarySensorCCGetOptions>) {\n super(options);\n this.sensorType = options.sensorType;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): BinarySensorCCGet {\n let sensorType: BinarySensorType | undefined;\n if (raw.payload.length >= 1) {\n sensorType = raw.payload[0];\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n sensorType,\n });\n }\n public sensorType: BinarySensorType | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.sensorType ?? BinarySensorType.Any]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n type: getEnumMemberName(BinarySensorType, this.sensorType ?? BinarySensorType.Any),\n },\n };\n }\n}\n// @publicAPI\nexport interface BinarySensorCCSupportedReportOptions {\n supportedSensorTypes: BinarySensorType[];\n}\n@CCCommand(BinarySensorCommand.SupportedReport)\n@ccValueProperty(\"supportedSensorTypes\", BinarySensorCCValues.supportedSensorTypes)\nexport class BinarySensorCCSupportedReport extends BinarySensorCC {\n public constructor(options: WithAddress<BinarySensorCCSupportedReportOptions>) {\n super(options);\n this.supportedSensorTypes = options.supportedSensorTypes;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): BinarySensorCCSupportedReport {\n validatePayload(raw.payload.length >= 1);\n // The enumeration starts at 1, but the first (reserved) bit is included\n // in the report\n const supportedSensorTypes: BinarySensorType[] = parseBitMask(raw.payload, 0).filter((t) => t !== 0);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedSensorTypes,\n });\n }\n public supportedSensorTypes: BinarySensorType[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = encodeBitMask(this.supportedSensorTypes.filter((t) => t !== BinarySensorType.Any), undefined, 0);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported types\": this.supportedSensorTypes\n .map((type) => getEnumMemberName(BinarySensorType, type))\n .join(\", \"),\n },\n };\n }\n}\n@CCCommand(BinarySensorCommand.SupportedGet)\n@expectedCCResponse(BinarySensorCCSupportedReport)\nexport class BinarySensorCCSupportedGet extends BinarySensorCC {\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qBAAgC;AAEhC,
|
|
4
|
+
"sourcesContent": ["import * as __validateArgs from \"./BinarySensorCC._validateArgs.js\";\nconst { validateArgs_BinarySensorCCAPI_get, validateArgs_BinarySensorCCAPI_sendReport, validateArgs_BinarySensorCCAPI_reportSupportedSensorTypes } = __validateArgs;\nimport { CommandClasses, type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type SupervisionResult, ValueMetadata, type WithAddress, encodeBitMask, logList, logText, parseBitMask, parseEnumValue, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, isEnumMember } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, PhysicalCCAPI, type PollValueImplementation, throwUnsupportedProperty, } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, getEffectiveCCVersion, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { BinarySensorCommand, BinarySensorType } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { BinarySensorCCValues } from \"./_CCValues.generated.js\";\nexport { BinarySensorCCValues };\n// @noSetValueAPI This CC is read-only\n@API(CommandClasses[\"Binary Sensor\"])\nexport class BinarySensorCCAPI extends PhysicalCCAPI {\n public supportsCommand(cmd: BinarySensorCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case BinarySensorCommand.Get:\n case BinarySensorCommand.Report:\n return true; // This is mandatory\n case BinarySensorCommand.SupportedGet:\n case BinarySensorCommand.SupportedReport:\n return this.version >= 2;\n }\n return super.supportsCommand(cmd);\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: BinarySensorCCAPI, { property }) {\n if (typeof property === \"string\") {\n const sensorType = (BinarySensorType as any)[property] as BinarySensorType | undefined;\n if (sensorType)\n return this.get(sensorType);\n }\n throwUnsupportedProperty(this.ccId, property);\n };\n }\n /**\n * Retrieves the current value from this sensor\n * @param sensorType The (optional) sensor type to retrieve the value for\n */\n @validateArgs_BinarySensorCCAPI_get()\n public async get(sensorType?: BinarySensorType): Promise<MaybeNotKnown<boolean>> {\n this.assertSupportsCommand(BinarySensorCommand, BinarySensorCommand.Get);\n const cc = new BinarySensorCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n sensorType,\n });\n const response = await this.host.sendCommand<BinarySensorCCReport>(cc, this.commandOptions);\n // We don't want to repeat the sensor type\n return response?.value;\n }\n @validateArgs_BinarySensorCCAPI_sendReport()\n public async sendReport(value: boolean, sensorType?: BinarySensorType): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(BinarySensorCommand, BinarySensorCommand.Report);\n const cc = new BinarySensorCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n value,\n type: sensorType,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n public async getSupportedSensorTypes(): Promise<readonly BinarySensorType[] | undefined> {\n this.assertSupportsCommand(BinarySensorCommand, BinarySensorCommand.SupportedGet);\n const cc = new BinarySensorCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<BinarySensorCCSupportedReport>(cc, this.commandOptions);\n // We don't want to repeat the sensor type\n return response?.supportedSensorTypes;\n }\n @validateArgs_BinarySensorCCAPI_reportSupportedSensorTypes()\n public async reportSupportedSensorTypes(supported: BinarySensorType[]): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(BinarySensorCommand, BinarySensorCommand.SupportedReport);\n const cc = new BinarySensorCCSupportedReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n supportedSensorTypes: supported,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n}\n@commandClass(CommandClasses[\"Binary Sensor\"])\n@implementedVersion(2)\n@ccValues(BinarySensorCCValues)\nexport class BinarySensorCC extends CommandClass {\n declare ccCommand: BinarySensorCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Binary Sensor\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Find out which sensor types this sensor supports\n if (api.version >= 2) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying supported sensor types...\",\n direction: \"outbound\",\n });\n const supportedSensorTypes = await api.getSupportedSensorTypes();\n if (supportedSensorTypes) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(\"received supported sensor types:\", {\n nested: logList(supportedSensorTypes.map((type) => getEnumMemberName(BinarySensorType, type))),\n }),\n direction: \"inbound\",\n });\n }\n else {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported sensor types timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n }\n await this.refreshValues(ctx, { tag: \"interview\" });\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Binary Sensor\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n // Query (all of) the sensor's current value(s)\n if (api.version === 1) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying current value...\",\n direction: \"outbound\",\n });\n const currentValue = await api.get();\n if (currentValue != undefined) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received current value: ${currentValue}`,\n direction: \"inbound\",\n });\n }\n }\n else {\n const supportedSensorTypes: readonly BinarySensorType[] = this.getValue(ctx, BinarySensorCCValues.supportedSensorTypes)\n ?? [];\n for (const type of supportedSensorTypes) {\n // Some devices report invalid sensor types, but the CC API checks\n // for valid values and throws otherwise.\n if (!isEnumMember(BinarySensorType, type))\n continue;\n const sensorName = getEnumMemberName(BinarySensorType, type);\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying current value for ${sensorName}...`,\n direction: \"outbound\",\n });\n const currentValue = await api.get(type);\n if (currentValue != undefined) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received current value for ${sensorName}: ${currentValue}`,\n direction: \"inbound\",\n });\n }\n }\n }\n }\n /**\n * Returns which sensor types are supported.\n * This only works AFTER the interview process\n */\n public static getSupportedSensorTypesCached(ctx: GetValueDB, endpoint: EndpointId): MaybeNotKnown<BinarySensorType[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(BinarySensorCCValues.supportedSensorTypes.endpoint(endpoint.index));\n }\n public setMappedBasicValue(ctx: GetValueDB, value: number): boolean {\n // Prefer setting an existing value to avoid creating a spurious \"Any\" sensor type.\n // Check for the Any type first (backwards compat), then the first one that\n // already exists in the value DB. Fall back to Any if none exist.\n const valueDB = this.getValueDB(ctx);\n const anyValueId = BinarySensorCCValues.state(BinarySensorType.Any).endpoint(this.endpointIndex);\n let sensorType: BinarySensorType;\n if (valueDB.hasMetadata(anyValueId)) {\n sensorType = BinarySensorType.Any;\n }\n else {\n const existingSensorTypes = valueDB\n .getAllMetadata(CommandClasses[\"Binary Sensor\"])\n .filter((v) => v.endpoint === this.endpointIndex\n && BinarySensorCCValues.state.is(v))\n .map((v) => (v.metadata as {\n ccSpecific?: {\n sensorType?: BinarySensorType;\n };\n })?.ccSpecific?.sensorType)\n .filter((t): t is BinarySensorType => t != undefined)\n .toSorted((a, b) => a - b);\n sensorType = existingSensorTypes[0] ?? BinarySensorType.Any;\n }\n const binarySensorValue = BinarySensorCCValues.state(sensorType);\n this.setValue(ctx, binarySensorValue, value > 0);\n return true;\n }\n}\n// @publicAPI\nexport interface BinarySensorCCReportOptions {\n type?: BinarySensorType;\n value: boolean;\n}\n@CCCommand(BinarySensorCommand.Report)\nexport class BinarySensorCCReport extends BinarySensorCC {\n public constructor(options: WithAddress<BinarySensorCCReportOptions>) {\n super(options);\n this.type = options.type ?? BinarySensorType.Any;\n this.value = options.value;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): BinarySensorCCReport {\n validatePayload(raw.payload.length >= 1);\n const value = raw.payload[0] === 0xff;\n let type: BinarySensorType = BinarySensorType.Any;\n if (raw.payload.length >= 2) {\n type = parseEnumValue(BinarySensorType, raw.payload[1]);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n value,\n type,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // The sensor type field only exists in V2+ reports.\n // Ignore it if the device advertises version 1.\n const ccVersion = getEffectiveCCVersion(ctx, this);\n // Workaround for devices reporting with sensor type Any -> find first supported sensor type and use that\n let sensorType = BinarySensorType.Any;\n if (ccVersion >= 2) {\n sensorType = this.type;\n }\n if (sensorType === BinarySensorType.Any) {\n const supportedSensorTypes = this.getValue<BinarySensorType[]>(ctx, BinarySensorCCValues.supportedSensorTypes);\n if (supportedSensorTypes?.length) {\n sensorType = supportedSensorTypes[0];\n }\n }\n const binarySensorValue = BinarySensorCCValues.state(sensorType);\n this.setMetadata(ctx, binarySensorValue, binarySensorValue.meta);\n this.setValue(ctx, binarySensorValue, this.value);\n return true;\n }\n public type: BinarySensorType;\n public value: boolean;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.value ? 0xff : 0x00, this.type]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n type: getEnumMemberName(BinarySensorType, this.type),\n value: this.value,\n },\n };\n }\n}\nfunction testResponseForBinarySensorGet(sent: BinarySensorCCGet, received: BinarySensorCCReport) {\n // We expect a Binary Sensor Report that matches the requested sensor type (if a type was requested)\n return (sent.sensorType == undefined\n || sent.sensorType === BinarySensorType.Any\n || received.type === sent.sensorType\n // This is technically not correct, but some devices do this anyways\n || received.type === BinarySensorType.Any);\n}\n// @publicAPI\nexport interface BinarySensorCCGetOptions {\n sensorType?: BinarySensorType;\n}\n@CCCommand(BinarySensorCommand.Get)\n@expectedCCResponse(BinarySensorCCReport, testResponseForBinarySensorGet)\nexport class BinarySensorCCGet extends BinarySensorCC {\n public constructor(options: WithAddress<BinarySensorCCGetOptions>) {\n super(options);\n this.sensorType = options.sensorType;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): BinarySensorCCGet {\n let sensorType: BinarySensorType | undefined;\n if (raw.payload.length >= 1) {\n sensorType = raw.payload[0];\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n sensorType,\n });\n }\n public sensorType: BinarySensorType | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.sensorType ?? BinarySensorType.Any]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n type: getEnumMemberName(BinarySensorType, this.sensorType ?? BinarySensorType.Any),\n },\n };\n }\n}\n// @publicAPI\nexport interface BinarySensorCCSupportedReportOptions {\n supportedSensorTypes: BinarySensorType[];\n}\n@CCCommand(BinarySensorCommand.SupportedReport)\n@ccValueProperty(\"supportedSensorTypes\", BinarySensorCCValues.supportedSensorTypes)\nexport class BinarySensorCCSupportedReport extends BinarySensorCC {\n public constructor(options: WithAddress<BinarySensorCCSupportedReportOptions>) {\n super(options);\n this.supportedSensorTypes = options.supportedSensorTypes;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): BinarySensorCCSupportedReport {\n validatePayload(raw.payload.length >= 1);\n // The enumeration starts at 1, but the first (reserved) bit is included\n // in the report\n const supportedSensorTypes: BinarySensorType[] = parseBitMask(raw.payload, 0).filter((t) => t !== 0);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedSensorTypes,\n });\n }\n public supportedSensorTypes: BinarySensorType[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = encodeBitMask(this.supportedSensorTypes.filter((t) => t !== BinarySensorType.Any), undefined, 0);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported types\": this.supportedSensorTypes\n .map((type) => getEnumMemberName(BinarySensorType, type))\n .join(\", \"),\n },\n };\n }\n}\n@CCCommand(BinarySensorCommand.SupportedGet)\n@expectedCCResponse(BinarySensorCCSupportedReport)\nexport class BinarySensorCCSupportedGet extends BinarySensorCC {\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -507,8 +507,7 @@ let ColorSwitchCCReport = (() => {
|
|
|
507
507
|
}
|
|
508
508
|
static from(raw, ctx) {
|
|
509
509
|
(0, import_core.validatePayload)(raw.payload.length >= 2);
|
|
510
|
-
const colorComponent = raw.payload[0];
|
|
511
|
-
(0, import_core.validatePayload)((0, import_shared.isEnumMember)(import_Types.ColorComponent, colorComponent));
|
|
510
|
+
const colorComponent = (0, import_core.parseEnumValue)(import_Types.ColorComponent, raw.payload[0]);
|
|
512
511
|
const currentValue = raw.payload[1];
|
|
513
512
|
let targetValue;
|
|
514
513
|
let duration;
|
|
@@ -696,9 +695,8 @@ let ColorSwitchCCSet = (() => {
|
|
|
696
695
|
const component = raw.payload[offset];
|
|
697
696
|
const value = raw.payload[offset + 1];
|
|
698
697
|
const key = colorComponentToTableKey(component);
|
|
699
|
-
if (key)
|
|
700
|
-
|
|
701
|
-
}
|
|
698
|
+
if (key)
|
|
699
|
+
colorTable[key] = value;
|
|
702
700
|
offset += 2;
|
|
703
701
|
}
|
|
704
702
|
let duration;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src_gen/cc/ColorSwitchCC.ts"],
|
|
4
|
-
"sourcesContent": ["import * as __validateArgs from \"./ColorSwitchCC._validateArgs.js\";\nconst { validateArgs_ColorSwitchCCAPI_get, validateArgs_ColorSwitchCCAPI_set, validateArgs_ColorSwitchCCAPI_startLevelChange, validateArgs_ColorSwitchCCAPI_stopLevelChange } = __validateArgs;\nimport { CommandClasses, Duration, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, type ValueDB, type ValueID, ValueMetadata, type WithAddress, ZWaveError, ZWaveErrorCodes, encodeBitMask, isUnsupervisedOrSucceeded, logList, logText, parseBitMask, supervisedCommandSucceeded, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, isEnumMember, keysOf, pick, } from \"@zwave-js/shared\";\nimport { clamp } from \"alcalzone-shared/math\";\nimport { isObject } from \"alcalzone-shared/typeguards\";\nimport { CCAPI, POLL_VALUE, type PollValueImplementation, SET_VALUE, type SetValueImplementation, throwMissingPropertyKey, throwUnsupportedProperty, throwUnsupportedPropertyKey, throwWrongValueType, } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, getEffectiveCCVersion, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { ColorComponent, ColorComponentMap, type ColorKey, ColorSwitchCommand, type ColorTable, LevelChangeDirection, } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nconst hexColorRegex = /^#?(?<red>[0-9a-f]{2})(?<green>[0-9a-f]{2})(?<blue>[0-9a-f]{2})$/i;\nconst colorTableKeys = [\n ...keysOf(ColorComponent),\n ...keysOf(ColorComponentMap),\n];\nfunction colorTableKeyToComponent(key: string): ColorComponent {\n if (/^\\d+$/.test(key)) {\n return parseInt(key, 10);\n }\n else if (key in ColorComponentMap) {\n return (ColorComponentMap as any)[key];\n }\n else if (key in ColorComponent) {\n return (ColorComponent as any)[key];\n }\n throw new ZWaveError(`Invalid color key ${key}!`, ZWaveErrorCodes.Argument_Invalid);\n}\nfunction colorComponentToTableKey(component: ColorComponent): ColorKey | undefined {\n for (const [key, comp] of Object.entries(ColorComponentMap)) {\n if (comp === component)\n return key as any;\n }\n}\nimport { ColorSwitchCCValues } from \"./_CCValues.generated.js\";\nexport { ColorSwitchCCValues };\n@API(CommandClasses[\"Color Switch\"])\nexport class ColorSwitchCCAPI extends CCAPI {\n public supportsCommand(cmd: ColorSwitchCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case ColorSwitchCommand.SupportedGet:\n case ColorSwitchCommand.Get:\n return this.isSinglecast();\n case ColorSwitchCommand.Set:\n case ColorSwitchCommand.StartLevelChange:\n case ColorSwitchCommand.StopLevelChange:\n return true; // These are mandatory\n }\n return super.supportsCommand(cmd);\n }\n public async getSupported(): Promise<MaybeNotKnown<readonly ColorComponent[]>> {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.SupportedGet);\n const cc = new ColorSwitchCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<ColorSwitchCCSupportedReport>(cc, this.commandOptions);\n return response?.supportedColorComponents;\n }\n @validateArgs_ColorSwitchCCAPI_get()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async get(component: ColorComponent) {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.Get);\n const cc = new ColorSwitchCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n colorComponent: component,\n });\n const response = await this.host.sendCommand<ColorSwitchCCReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\"currentValue\", \"targetValue\", \"duration\"]);\n }\n }\n @validateArgs_ColorSwitchCCAPI_set()\n public async set(options: ColorSwitchCCSetOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.Set);\n const cc = new ColorSwitchCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n const result = await this.host.sendCommand(cc, this.commandOptions);\n if (isUnsupervisedOrSucceeded(result)) {\n // If the command did not fail, assume that it succeeded and update the values accordingly\n // TODO: The API methods should not modify the value DB directly, but to do so\n // this requires a nicer way of synchronizing hexColor with the others\n if (this.isSinglecast()) {\n // Update each color component separately and record the changes to the compound value\n this.updateCurrentColor(this.getValueDB(), cc.colorTable);\n }\n else if (this.isMulticast()) {\n // Figure out which nodes were affected by this command\n const affectedNodes = this.endpoint.node.physicalNodes.filter((node) => node\n .getEndpoint(this.endpoint.index)\n ?.supportsCC(this.ccId));\n // and optimistically update the currentColor\n for (const node of affectedNodes) {\n const valueDB = this.host.tryGetValueDB(node.id);\n if (valueDB) {\n this.updateCurrentColor(valueDB, cc.colorTable);\n }\n }\n }\n }\n return result;\n }\n /** Updates the current color for a given node by merging in the given changes */\n private updateCurrentColor(valueDB: ValueDB, colorTable: ColorTable) {\n let updatedRGB = false;\n const currentColorValueId = ColorSwitchCCValues.currentColor.endpoint(this.endpoint.index);\n const targetColorValueId = ColorSwitchCCValues.targetColor.endpoint(this.endpoint.index);\n const currentCompoundColor = valueDB.getValue<Partial<Record<ColorKey, number>>>(currentColorValueId) ?? {};\n const targetCompoundColor = valueDB.getValue<Partial<Record<ColorKey, number>>>(targetColorValueId) ?? {};\n for (const [key, value] of Object.entries(colorTable)) {\n const component = colorTableKeyToComponent(key);\n if (component === ColorComponent.Red\n || component === ColorComponent.Green\n || component === ColorComponent.Blue) {\n updatedRGB = true;\n }\n valueDB.setValue(ColorSwitchCCValues.currentColorChannel(component).endpoint(this.endpoint.index), value);\n // Update the compound value\n if (key in ColorComponentMap) {\n currentCompoundColor[key as ColorKey] = value;\n targetCompoundColor[key as ColorKey] = value;\n }\n }\n // And store the updated compound values\n valueDB.setValue(currentColorValueId, currentCompoundColor);\n valueDB.setValue(targetColorValueId, targetCompoundColor);\n // and hex color if necessary\n const supportsHex = valueDB.getValue<boolean>(ColorSwitchCCValues.supportsHexColor.endpoint(this.endpoint.index));\n if (supportsHex && updatedRGB) {\n const hexValueId = ColorSwitchCCValues.hexColor.endpoint(this.endpoint.index);\n const [r, g, b] = [\n ColorComponent.Red,\n ColorComponent.Green,\n ColorComponent.Blue,\n ].map((c) => valueDB.getValue<number>(ColorSwitchCCValues.currentColorChannel(c).endpoint(this.endpoint.index)) ?? 0);\n const hexValue = (r << 16) | (g << 8) | b;\n valueDB.setValue(hexValueId, hexValue.toString(16).padStart(6, \"0\"));\n }\n }\n @validateArgs_ColorSwitchCCAPI_startLevelChange()\n public async startLevelChange(options: ColorSwitchCCStartLevelChangeOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.StartLevelChange);\n const cc = new ColorSwitchCCStartLevelChange({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_ColorSwitchCCAPI_stopLevelChange()\n public async stopLevelChange(colorComponent: ColorComponent): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.StopLevelChange);\n const cc = new ColorSwitchCCStopLevelChange({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n colorComponent,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: ColorSwitchCCAPI, { property, propertyKey }, value, options) {\n if (property === \"targetColor\") {\n const duration = Duration.from(options?.transitionDuration);\n if (propertyKey != undefined) {\n // Single color component, only accepts numbers\n if (typeof propertyKey !== \"number\") {\n throwUnsupportedPropertyKey(this.ccId, property, propertyKey);\n }\n else if (typeof value !== \"number\") {\n throwWrongValueType(this.ccId, property, \"number\", typeof value);\n }\n const result = await this.set({\n [propertyKey]: value,\n duration,\n });\n if (this.isSinglecast()\n && !supervisedCommandSucceeded(result)) {\n // Verify the current value after a (short) delay, unless the command was supervised and successful\n this.schedulePoll({ property, propertyKey }, value, {\n duration,\n transition: \"fast\",\n });\n }\n return result;\n }\n else {\n // Set the compound color object\n // Ensure the value is an object with only valid keys\n if (!isObject(value)\n || !Object.keys(value).every((key) => key in ColorComponentMap)) {\n throw new ZWaveError(`${CommandClasses[this.ccId]}: \"${property}\" must be set to an object which specifies each color channel`, ZWaveErrorCodes.Argument_Invalid);\n }\n // Ensure that each property is numeric\n for (const [key, val] of Object.entries(value)) {\n if (typeof val !== \"number\") {\n throwWrongValueType(this.ccId, `${property}.${key}`, \"number\", typeof val);\n }\n }\n // GH#2527: strip unsupported color components, because some devices don't react otherwise\n if (this.isSinglecast()) {\n const supportedColors = this.tryGetValueDB()?.getValue<readonly ColorComponent[]>(ColorSwitchCCValues.supportedColorComponents.endpoint(this.endpoint.index));\n if (supportedColors) {\n value = pick(value, supportedColors\n .map((c) => colorComponentToTableKey(c))\n .filter((c) => !!c));\n }\n }\n // Avoid sending empty commands\n if (Object.keys(value as any).length === 0)\n return;\n return this.set({ ...(value as ColorTable), duration });\n // We're not going to poll each color component separately\n }\n }\n else if (property === \"hexColor\") {\n // No property key, this is the hex color #rrggbb\n if (typeof value !== \"string\") {\n throwWrongValueType(this.ccId, property, \"string\", typeof value);\n }\n const duration = Duration.from(options?.transitionDuration);\n return this.set({ hexColor: value, duration });\n }\n else {\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n public isSetValueOptimistic(_valueId: ValueID): boolean {\n return false; // Color Switch CC handles updating the value DB itself\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: ColorSwitchCCAPI, { property, propertyKey }) {\n if (propertyKey == undefined) {\n throwMissingPropertyKey(this.ccId, property);\n }\n else if (typeof propertyKey !== \"number\") {\n throwUnsupportedPropertyKey(this.ccId, property, propertyKey);\n }\n switch (property) {\n case \"currentColor\":\n return (await this.get(propertyKey))?.currentValue;\n case \"targetColor\":\n return (await this.get(propertyKey))?.targetValue;\n case \"duration\":\n return (await this.get(propertyKey))?.duration;\n default:\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n}\n@commandClass(CommandClasses[\"Color Switch\"])\n@implementedVersion(3)\n@ccValues(ColorSwitchCCValues)\nexport class ColorSwitchCC extends CommandClass {\n declare ccCommand: ColorSwitchCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Color Switch\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying supported colors...\",\n direction: \"outbound\",\n });\n const supportedColors = await api.getSupported();\n if (!supportedColors) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported colors timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(\"received supported colors:\", {\n nested: logList(supportedColors.map((c) => getEnumMemberName(ColorComponent, c))),\n }),\n direction: \"outbound\",\n });\n // Create metadata for the separate color channels\n for (const color of supportedColors) {\n const currentColorChannelValue = ColorSwitchCCValues.currentColorChannel(color);\n this.setMetadata(ctx, currentColorChannelValue);\n const targetColorChannelValue = ColorSwitchCCValues.targetColorChannel(color);\n this.setMetadata(ctx, targetColorChannelValue);\n }\n // And the compound one\n const currentColorValue = ColorSwitchCCValues.currentColor;\n this.setMetadata(ctx, currentColorValue);\n const targetColorValue = ColorSwitchCCValues.targetColor;\n this.setMetadata(ctx, targetColorValue);\n // Create the collective HEX color values\n const supportsHex = [\n ColorComponent.Red,\n ColorComponent.Green,\n ColorComponent.Blue,\n ].every((c) => supportedColors.includes(c));\n this.setValue(ctx, ColorSwitchCCValues.supportsHexColor, supportsHex);\n if (supportsHex) {\n const hexColorValue = ColorSwitchCCValues.hexColor;\n this.setMetadata(ctx, hexColorValue);\n }\n // Query all color components\n await this.refreshValues(ctx, {\n tag: \"interview\",\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Color Switch\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const supportedColors: readonly ColorComponent[] = this.getValue(ctx, ColorSwitchCCValues.supportedColorComponents)\n ?? [];\n for (const [i, color] of supportedColors.entries()) {\n // Some devices report invalid colors, but the CC API checks\n // for valid values and throws otherwise.\n if (!isEnumMember(ColorComponent, color))\n continue;\n const colorName = getEnumMemberName(ColorComponent, color);\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying current color state (${colorName})`,\n direction: \"outbound\",\n });\n await api.get(color);\n options?.onProgress?.(i + 1, supportedColors.length);\n }\n }\n public translatePropertyKey(ctx: GetValueDB, property: string | number, propertyKey: string | number): string | undefined {\n if ((property === \"currentColor\" || property === \"targetColor\")\n && typeof propertyKey === \"number\") {\n const translated = ColorComponent[propertyKey];\n if (translated)\n return translated;\n }\n return super.translatePropertyKey(ctx, property, propertyKey);\n }\n}\n// @publicAPI\nexport interface ColorSwitchCCSupportedReportOptions {\n supportedColorComponents: readonly ColorComponent[];\n}\n@CCCommand(ColorSwitchCommand.SupportedReport)\n@ccValueProperty(\"supportedColorComponents\", ColorSwitchCCValues.supportedColorComponents)\nexport class ColorSwitchCCSupportedReport extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCSupportedReportOptions>) {\n super(options);\n this.supportedColorComponents = options.supportedColorComponents;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCSupportedReport {\n // Docs say 'variable length', but the table shows 2 bytes.\n validatePayload(raw.payload.length >= 2);\n const supportedColorComponents: ColorComponent[] = parseBitMask(raw.payload.subarray(0, 2), ColorComponent[\"Warm White\"]);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedColorComponents,\n });\n }\n public readonly supportedColorComponents: readonly ColorComponent[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = encodeBitMask(this.supportedColorComponents, 15, // fixed 2 bytes\n ColorComponent[\"Warm White\"]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported color components\": logList(this.supportedColorComponents.map((c) => getEnumMemberName(ColorComponent, c))),\n },\n };\n }\n}\n@CCCommand(ColorSwitchCommand.SupportedGet)\n@expectedCCResponse(ColorSwitchCCSupportedReport)\nexport class ColorSwitchCCSupportedGet extends ColorSwitchCC {\n}\n// @publicAPI\nexport interface ColorSwitchCCReportOptions {\n colorComponent: ColorComponent;\n currentValue: number;\n targetValue?: number;\n duration?: Duration | string;\n}\n@CCCommand(ColorSwitchCommand.Report)\n@ccValueProperty(\"currentValue\", ColorSwitchCCValues.currentColorChannel, (self) => [self.colorComponent])\n@ccValueProperty(\"targetValue\", ColorSwitchCCValues.targetColorChannel, (self) => [self.colorComponent])\n@ccValueProperty(\"duration\", ColorSwitchCCValues.duration)\nexport class ColorSwitchCCReport extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCReportOptions>) {\n super(options);\n this.colorComponent = options.colorComponent;\n this.currentValue = options.currentValue;\n this.targetValue = options.targetValue;\n this.duration = Duration.from(options.duration);\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCReport {\n validatePayload(raw.payload.length >= 2);\n const colorComponent: ColorComponent = raw.payload[0];\n validatePayload(isEnumMember(ColorComponent, colorComponent));\n const currentValue = raw.payload[1];\n let targetValue: number | undefined;\n let duration: Duration | undefined;\n if (raw.payload.length >= 4) {\n targetValue = raw.payload[2];\n duration = Duration.parseReport(raw.payload[3]);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n colorComponent,\n currentValue,\n targetValue,\n duration,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n // Duration is stored globally instead of per component\n if (!super.persistValues(ctx))\n return false;\n // Update compound current value\n const colorTableKey = colorComponentToTableKey(this.colorComponent);\n if (colorTableKey) {\n const compoundCurrentColorValue = ColorSwitchCCValues.currentColor;\n const compoundCurrentColor: Partial<Record<ColorKey, number>> = this.getValue(ctx, compoundCurrentColorValue) ?? {};\n compoundCurrentColor[colorTableKey] = this.currentValue;\n this.setValue(ctx, compoundCurrentColorValue, compoundCurrentColor);\n // and target value\n if (this.targetValue != undefined) {\n const compoundTargetColorValue = ColorSwitchCCValues.targetColor;\n const compoundTargetColor: Partial<Record<ColorKey, number>> = this.getValue(ctx, compoundTargetColorValue) ?? {};\n compoundTargetColor[colorTableKey] = this.targetValue;\n this.setValue(ctx, compoundTargetColorValue, compoundTargetColor);\n }\n }\n // Update collective hex value if required\n const supportsHex = !!this.getValue(ctx, ColorSwitchCCValues.supportsHexColor);\n if (supportsHex\n && (this.colorComponent === ColorComponent.Red\n || this.colorComponent === ColorComponent.Green\n || this.colorComponent === ColorComponent.Blue)) {\n const hexColorValue = ColorSwitchCCValues.hexColor;\n const hexValue: string = this.getValue(ctx, hexColorValue) ?? \"000000\";\n const byteOffset = ColorComponent.Blue - this.colorComponent;\n const byteMask = 0xff << (byteOffset * 8);\n let hexValueNumeric = parseInt(hexValue, 16);\n hexValueNumeric =\n (hexValueNumeric & ~byteMask)\n | (this.currentValue << (byteOffset * 8));\n this.setValue(ctx, hexColorValue, hexValueNumeric.toString(16).padStart(6, \"0\"));\n }\n return true;\n }\n public readonly colorComponent: ColorComponent;\n public readonly currentValue: number;\n public readonly targetValue: number | undefined;\n public readonly duration: Duration | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.colorComponent, this.currentValue]);\n if (this.targetValue != undefined && this.duration != undefined) {\n this.payload = Bytes.concat([\n this.payload,\n [\n this.targetValue ?? 0xfe,\n (this.duration ?? Duration.default()).serializeReport(),\n ],\n ]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"color component\": getEnumMemberName(ColorComponent, this.colorComponent),\n \"current value\": this.currentValue,\n };\n if (this.targetValue != undefined) {\n message[\"target value\"] = this.targetValue;\n }\n if (this.duration != undefined) {\n message.duration = this.duration.toString();\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface ColorSwitchCCGetOptions {\n colorComponent: ColorComponent;\n}\nfunction testResponseForColorSwitchGet(sent: ColorSwitchCCGet, received: ColorSwitchCCReport) {\n return sent.colorComponent === received.colorComponent;\n}\n@CCCommand(ColorSwitchCommand.Get)\n@expectedCCResponse(ColorSwitchCCReport, testResponseForColorSwitchGet)\nexport class ColorSwitchCCGet extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCGetOptions>) {\n super(options);\n this._colorComponent = options.colorComponent;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCGet {\n validatePayload(raw.payload.length >= 1);\n const colorComponent: ColorComponent = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n colorComponent,\n });\n }\n private _colorComponent: ColorComponent;\n public get colorComponent(): ColorComponent {\n return this._colorComponent;\n }\n public set colorComponent(value: ColorComponent) {\n if (!ColorComponent[value]) {\n throw new ZWaveError(\"colorComponent must be a valid color component index.\", ZWaveErrorCodes.Argument_Invalid);\n }\n this._colorComponent = value;\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this._colorComponent]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"color component\": getEnumMemberName(ColorComponent, this.colorComponent),\n },\n };\n }\n}\n// @publicAPI\nexport type ColorSwitchCCSetOptions = (ColorTable | {\n hexColor: string;\n}) & {\n duration?: Duration | string;\n};\n@CCCommand(ColorSwitchCommand.Set)\n@useSupervision()\nexport class ColorSwitchCCSet extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCSetOptions>) {\n super(options);\n // Populate properties from options object\n if (\"hexColor\" in options) {\n const match = hexColorRegex.exec(options.hexColor);\n if (!match) {\n throw new ZWaveError(`${options.hexColor} is not a valid HEX color string`, ZWaveErrorCodes.Argument_Invalid);\n }\n this.colorTable = {\n red: parseInt(match.groups!.red, 16),\n green: parseInt(match.groups!.green, 16),\n blue: parseInt(match.groups!.blue, 16),\n };\n }\n else {\n this.colorTable = pick(options, colorTableKeys as any[]);\n }\n this.duration = Duration.from(options.duration);\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCSet {\n validatePayload(raw.payload.length >= 1);\n const populatedColorCount = raw.payload[0] & 0b11111;\n validatePayload(raw.payload.length >= 1 + populatedColorCount * 2);\n const colorTable: ColorTable = {};\n let offset = 1;\n for (let color = 0; color < populatedColorCount; color++) {\n const component = raw.payload[offset];\n const value = raw.payload[offset + 1];\n const key = colorComponentToTableKey(component);\n if (key) {\n // @ts-expect-error\n this.colorTable[key] = value;\n }\n offset += 2;\n }\n let duration: Duration | undefined;\n if (raw.payload.length > offset) {\n duration = Duration.parseSet(raw.payload[offset]);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n ...colorTable,\n duration,\n });\n }\n public colorTable: ColorTable;\n public duration: Duration | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const populatedColorCount = Object.keys(this.colorTable).length;\n this.payload = new Bytes(1 + populatedColorCount * 2 + 1);\n this.payload[0] = populatedColorCount & 0b11111;\n let i = 1;\n for (const [key, value] of Object.entries(this.colorTable)) {\n const component = colorTableKeyToComponent(key);\n this.payload[i] = component;\n this.payload[i + 1] = clamp(value, 0, 0xff);\n i += 2;\n }\n this.payload[i] = (this.duration ?? Duration.default()).serializeSet();\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (ccVersion < 2\n && ctx.getDeviceConfig?.(this.nodeId as number)?.compat\n ?.encodeCCsUsingTargetVersion) {\n // When forcing CC version 1, omit the duration byte\n this.payload = this.payload.subarray(0, -1);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n for (const [key, value] of Object.entries(this.colorTable)) {\n const realKey: string = key in ColorComponentMap\n ? (ColorComponent as any)[(ColorComponentMap as any)[key]]\n : (ColorComponent as any)[key];\n message[realKey] = value;\n }\n if (this.duration != undefined) {\n message.duration = this.duration.toString();\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport type ColorSwitchCCStartLevelChangeOptions = {\n colorComponent: ColorComponent;\n direction: keyof typeof LevelChangeDirection;\n} & ({\n ignoreStartLevel: true;\n startLevel?: number;\n} | {\n ignoreStartLevel: false;\n startLevel: number;\n}) & {\n // Version >= 3:\n duration?: Duration | string;\n};\n@CCCommand(ColorSwitchCommand.StartLevelChange)\n@useSupervision()\nexport class ColorSwitchCCStartLevelChange extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCStartLevelChangeOptions>) {\n super(options);\n this.duration = Duration.from(options.duration);\n this.ignoreStartLevel = options.ignoreStartLevel;\n this.startLevel = options.startLevel ?? 0;\n this.direction = options.direction;\n this.colorComponent = options.colorComponent;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCStartLevelChange {\n validatePayload(raw.payload.length >= 3);\n const ignoreStartLevel = !!((raw.payload[0] & 32) >>> 5);\n const direction = (raw.payload[0] & 64) >>> 6 ? \"down\" : \"up\";\n const colorComponent: ColorComponent = raw.payload[1];\n const startLevel = raw.payload[2];\n let duration: Duration | undefined;\n if (raw.payload.length >= 4) {\n duration = Duration.parseSet(raw.payload[3]);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n ignoreStartLevel,\n direction,\n colorComponent,\n startLevel,\n duration,\n });\n }\n public duration: Duration | undefined;\n public startLevel: number;\n public ignoreStartLevel: boolean;\n public direction: keyof typeof LevelChangeDirection;\n public colorComponent: ColorComponent;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const controlByte = (LevelChangeDirection[this.direction] << 6)\n | (this.ignoreStartLevel ? 32 : 0);\n this.payload = Bytes.from([\n controlByte,\n this.colorComponent,\n this.startLevel,\n (this.duration ?? Duration.default()).serializeSet(),\n ]);\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (ccVersion < 3\n && ctx.getDeviceConfig?.(this.nodeId as number)?.compat\n ?.encodeCCsUsingTargetVersion) {\n // When forcing CC version 1 or 2, omit the duration byte\n this.payload = this.payload.subarray(0, -1);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"color component\": getEnumMemberName(ColorComponent, this.colorComponent),\n \"start level\": `${this.startLevel}${this.ignoreStartLevel ? \" (ignored)\" : \"\"}`,\n direction: this.direction,\n };\n if (this.duration != undefined) {\n message.duration = this.duration.toString();\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface ColorSwitchCCStopLevelChangeOptions {\n colorComponent: ColorComponent;\n}\n@CCCommand(ColorSwitchCommand.StopLevelChange)\n@useSupervision()\nexport class ColorSwitchCCStopLevelChange extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCStopLevelChangeOptions>) {\n super(options);\n this.colorComponent = options.colorComponent;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCStopLevelChange {\n validatePayload(raw.payload.length >= 1);\n const colorComponent: ColorComponent = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n colorComponent,\n });\n }\n public readonly colorComponent: ColorComponent;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.colorComponent]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"color component\": getEnumMemberName(ColorComponent, this.colorComponent),\n },\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import * as __validateArgs from \"./ColorSwitchCC._validateArgs.js\";\nconst { validateArgs_ColorSwitchCCAPI_get, validateArgs_ColorSwitchCCAPI_set, validateArgs_ColorSwitchCCAPI_startLevelChange, validateArgs_ColorSwitchCCAPI_stopLevelChange } = __validateArgs;\nimport { CommandClasses, Duration, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, type ValueDB, type ValueID, ValueMetadata, type WithAddress, ZWaveError, ZWaveErrorCodes, encodeBitMask, isUnsupervisedOrSucceeded, logList, logText, parseBitMask, supervisedCommandSucceeded, parseEnumValue, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, isEnumMember, keysOf, pick, } from \"@zwave-js/shared\";\nimport { clamp } from \"alcalzone-shared/math\";\nimport { isObject } from \"alcalzone-shared/typeguards\";\nimport { CCAPI, POLL_VALUE, type PollValueImplementation, SET_VALUE, type SetValueImplementation, throwMissingPropertyKey, throwUnsupportedProperty, throwUnsupportedPropertyKey, throwWrongValueType, } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, getEffectiveCCVersion, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { ColorComponent, ColorComponentMap, type ColorKey, ColorSwitchCommand, type ColorTable, LevelChangeDirection, } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nconst hexColorRegex = /^#?(?<red>[0-9a-f]{2})(?<green>[0-9a-f]{2})(?<blue>[0-9a-f]{2})$/i;\nconst colorTableKeys = [\n ...keysOf(ColorComponent),\n ...keysOf(ColorComponentMap),\n];\nfunction colorTableKeyToComponent(key: string): ColorComponent {\n if (/^\\d+$/.test(key)) {\n return parseInt(key, 10);\n }\n else if (key in ColorComponentMap) {\n return (ColorComponentMap as any)[key];\n }\n else if (key in ColorComponent) {\n return (ColorComponent as any)[key];\n }\n throw new ZWaveError(`Invalid color key ${key}!`, ZWaveErrorCodes.Argument_Invalid);\n}\nfunction colorComponentToTableKey(component: ColorComponent): ColorKey | undefined {\n for (const [key, comp] of Object.entries(ColorComponentMap)) {\n if (comp === component)\n return key as any;\n }\n}\nimport { ColorSwitchCCValues } from \"./_CCValues.generated.js\";\nexport { ColorSwitchCCValues };\n@API(CommandClasses[\"Color Switch\"])\nexport class ColorSwitchCCAPI extends CCAPI {\n public supportsCommand(cmd: ColorSwitchCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case ColorSwitchCommand.SupportedGet:\n case ColorSwitchCommand.Get:\n return this.isSinglecast();\n case ColorSwitchCommand.Set:\n case ColorSwitchCommand.StartLevelChange:\n case ColorSwitchCommand.StopLevelChange:\n return true; // These are mandatory\n }\n return super.supportsCommand(cmd);\n }\n public async getSupported(): Promise<MaybeNotKnown<readonly ColorComponent[]>> {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.SupportedGet);\n const cc = new ColorSwitchCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<ColorSwitchCCSupportedReport>(cc, this.commandOptions);\n return response?.supportedColorComponents;\n }\n @validateArgs_ColorSwitchCCAPI_get()\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async get(component: ColorComponent) {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.Get);\n const cc = new ColorSwitchCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n colorComponent: component,\n });\n const response = await this.host.sendCommand<ColorSwitchCCReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\"currentValue\", \"targetValue\", \"duration\"]);\n }\n }\n @validateArgs_ColorSwitchCCAPI_set()\n public async set(options: ColorSwitchCCSetOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.Set);\n const cc = new ColorSwitchCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n const result = await this.host.sendCommand(cc, this.commandOptions);\n if (isUnsupervisedOrSucceeded(result)) {\n // If the command did not fail, assume that it succeeded and update the values accordingly\n // TODO: The API methods should not modify the value DB directly, but to do so\n // this requires a nicer way of synchronizing hexColor with the others\n if (this.isSinglecast()) {\n // Update each color component separately and record the changes to the compound value\n this.updateCurrentColor(this.getValueDB(), cc.colorTable);\n }\n else if (this.isMulticast()) {\n // Figure out which nodes were affected by this command\n const affectedNodes = this.endpoint.node.physicalNodes.filter((node) => node\n .getEndpoint(this.endpoint.index)\n ?.supportsCC(this.ccId));\n // and optimistically update the currentColor\n for (const node of affectedNodes) {\n const valueDB = this.host.tryGetValueDB(node.id);\n if (valueDB) {\n this.updateCurrentColor(valueDB, cc.colorTable);\n }\n }\n }\n }\n return result;\n }\n /** Updates the current color for a given node by merging in the given changes */\n private updateCurrentColor(valueDB: ValueDB, colorTable: ColorTable) {\n let updatedRGB = false;\n const currentColorValueId = ColorSwitchCCValues.currentColor.endpoint(this.endpoint.index);\n const targetColorValueId = ColorSwitchCCValues.targetColor.endpoint(this.endpoint.index);\n const currentCompoundColor = valueDB.getValue<Partial<Record<ColorKey, number>>>(currentColorValueId) ?? {};\n const targetCompoundColor = valueDB.getValue<Partial<Record<ColorKey, number>>>(targetColorValueId) ?? {};\n for (const [key, value] of Object.entries(colorTable)) {\n const component = colorTableKeyToComponent(key);\n if (component === ColorComponent.Red\n || component === ColorComponent.Green\n || component === ColorComponent.Blue) {\n updatedRGB = true;\n }\n valueDB.setValue(ColorSwitchCCValues.currentColorChannel(component).endpoint(this.endpoint.index), value);\n // Update the compound value\n if (key in ColorComponentMap) {\n currentCompoundColor[key as ColorKey] = value;\n targetCompoundColor[key as ColorKey] = value;\n }\n }\n // And store the updated compound values\n valueDB.setValue(currentColorValueId, currentCompoundColor);\n valueDB.setValue(targetColorValueId, targetCompoundColor);\n // and hex color if necessary\n const supportsHex = valueDB.getValue<boolean>(ColorSwitchCCValues.supportsHexColor.endpoint(this.endpoint.index));\n if (supportsHex && updatedRGB) {\n const hexValueId = ColorSwitchCCValues.hexColor.endpoint(this.endpoint.index);\n const [r, g, b] = [\n ColorComponent.Red,\n ColorComponent.Green,\n ColorComponent.Blue,\n ].map((c) => valueDB.getValue<number>(ColorSwitchCCValues.currentColorChannel(c).endpoint(this.endpoint.index)) ?? 0);\n const hexValue = (r << 16) | (g << 8) | b;\n valueDB.setValue(hexValueId, hexValue.toString(16).padStart(6, \"0\"));\n }\n }\n @validateArgs_ColorSwitchCCAPI_startLevelChange()\n public async startLevelChange(options: ColorSwitchCCStartLevelChangeOptions): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.StartLevelChange);\n const cc = new ColorSwitchCCStartLevelChange({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_ColorSwitchCCAPI_stopLevelChange()\n public async stopLevelChange(colorComponent: ColorComponent): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(ColorSwitchCommand, ColorSwitchCommand.StopLevelChange);\n const cc = new ColorSwitchCCStopLevelChange({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n colorComponent,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: ColorSwitchCCAPI, { property, propertyKey }, value, options) {\n if (property === \"targetColor\") {\n const duration = Duration.from(options?.transitionDuration);\n if (propertyKey != undefined) {\n // Single color component, only accepts numbers\n if (typeof propertyKey !== \"number\") {\n throwUnsupportedPropertyKey(this.ccId, property, propertyKey);\n }\n else if (typeof value !== \"number\") {\n throwWrongValueType(this.ccId, property, \"number\", typeof value);\n }\n const result = await this.set({\n [propertyKey]: value,\n duration,\n });\n if (this.isSinglecast()\n && !supervisedCommandSucceeded(result)) {\n // Verify the current value after a (short) delay, unless the command was supervised and successful\n this.schedulePoll({ property, propertyKey }, value, {\n duration,\n transition: \"fast\",\n });\n }\n return result;\n }\n else {\n // Set the compound color object\n // Ensure the value is an object with only valid keys\n if (!isObject(value)\n || !Object.keys(value).every((key) => key in ColorComponentMap)) {\n throw new ZWaveError(`${CommandClasses[this.ccId]}: \"${property}\" must be set to an object which specifies each color channel`, ZWaveErrorCodes.Argument_Invalid);\n }\n // Ensure that each property is numeric\n for (const [key, val] of Object.entries(value)) {\n if (typeof val !== \"number\") {\n throwWrongValueType(this.ccId, `${property}.${key}`, \"number\", typeof val);\n }\n }\n // GH#2527: strip unsupported color components, because some devices don't react otherwise\n if (this.isSinglecast()) {\n const supportedColors = this.tryGetValueDB()?.getValue<readonly ColorComponent[]>(ColorSwitchCCValues.supportedColorComponents.endpoint(this.endpoint.index));\n if (supportedColors) {\n value = pick(value, supportedColors\n .map((c) => colorComponentToTableKey(c))\n .filter((c) => !!c));\n }\n }\n // Avoid sending empty commands\n if (Object.keys(value as any).length === 0)\n return;\n return this.set({ ...(value as ColorTable), duration });\n // We're not going to poll each color component separately\n }\n }\n else if (property === \"hexColor\") {\n // No property key, this is the hex color #rrggbb\n if (typeof value !== \"string\") {\n throwWrongValueType(this.ccId, property, \"string\", typeof value);\n }\n const duration = Duration.from(options?.transitionDuration);\n return this.set({ hexColor: value, duration });\n }\n else {\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n public isSetValueOptimistic(_valueId: ValueID): boolean {\n return false; // Color Switch CC handles updating the value DB itself\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: ColorSwitchCCAPI, { property, propertyKey }) {\n if (propertyKey == undefined) {\n throwMissingPropertyKey(this.ccId, property);\n }\n else if (typeof propertyKey !== \"number\") {\n throwUnsupportedPropertyKey(this.ccId, property, propertyKey);\n }\n switch (property) {\n case \"currentColor\":\n return (await this.get(propertyKey))?.currentValue;\n case \"targetColor\":\n return (await this.get(propertyKey))?.targetValue;\n case \"duration\":\n return (await this.get(propertyKey))?.duration;\n default:\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n}\n@commandClass(CommandClasses[\"Color Switch\"])\n@implementedVersion(3)\n@ccValues(ColorSwitchCCValues)\nexport class ColorSwitchCC extends CommandClass {\n declare ccCommand: ColorSwitchCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Color Switch\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n tag: \"interview\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"querying supported colors...\",\n direction: \"outbound\",\n });\n const supportedColors = await api.getSupported();\n if (!supportedColors) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Querying supported colors timed out, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logText(\"received supported colors:\", {\n nested: logList(supportedColors.map((c) => getEnumMemberName(ColorComponent, c))),\n }),\n direction: \"outbound\",\n });\n // Create metadata for the separate color channels\n for (const color of supportedColors) {\n const currentColorChannelValue = ColorSwitchCCValues.currentColorChannel(color);\n this.setMetadata(ctx, currentColorChannelValue);\n const targetColorChannelValue = ColorSwitchCCValues.targetColorChannel(color);\n this.setMetadata(ctx, targetColorChannelValue);\n }\n // And the compound one\n const currentColorValue = ColorSwitchCCValues.currentColor;\n this.setMetadata(ctx, currentColorValue);\n const targetColorValue = ColorSwitchCCValues.targetColor;\n this.setMetadata(ctx, targetColorValue);\n // Create the collective HEX color values\n const supportsHex = [\n ColorComponent.Red,\n ColorComponent.Green,\n ColorComponent.Blue,\n ].every((c) => supportedColors.includes(c));\n this.setValue(ctx, ColorSwitchCCValues.supportsHexColor, supportsHex);\n if (supportsHex) {\n const hexColorValue = ColorSwitchCCValues.hexColor;\n this.setMetadata(ctx, hexColorValue);\n }\n // Query all color components\n await this.refreshValues(ctx, {\n tag: \"interview\",\n onProgress: (completed, total) => node.reportInterviewProgress(completed, total),\n });\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n public async refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Color Switch\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n const supportedColors: readonly ColorComponent[] = this.getValue(ctx, ColorSwitchCCValues.supportedColorComponents)\n ?? [];\n for (const [i, color] of supportedColors.entries()) {\n // Some devices report invalid colors, but the CC API checks\n // for valid values and throws otherwise.\n if (!isEnumMember(ColorComponent, color))\n continue;\n const colorName = getEnumMemberName(ColorComponent, color);\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `querying current color state (${colorName})`,\n direction: \"outbound\",\n });\n await api.get(color);\n options?.onProgress?.(i + 1, supportedColors.length);\n }\n }\n public translatePropertyKey(ctx: GetValueDB, property: string | number, propertyKey: string | number): string | undefined {\n if ((property === \"currentColor\" || property === \"targetColor\")\n && typeof propertyKey === \"number\") {\n const translated = ColorComponent[propertyKey];\n if (translated)\n return translated;\n }\n return super.translatePropertyKey(ctx, property, propertyKey);\n }\n}\n// @publicAPI\nexport interface ColorSwitchCCSupportedReportOptions {\n supportedColorComponents: readonly ColorComponent[];\n}\n@CCCommand(ColorSwitchCommand.SupportedReport)\n@ccValueProperty(\"supportedColorComponents\", ColorSwitchCCValues.supportedColorComponents)\nexport class ColorSwitchCCSupportedReport extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCSupportedReportOptions>) {\n super(options);\n this.supportedColorComponents = options.supportedColorComponents;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCSupportedReport {\n // Docs say 'variable length', but the table shows 2 bytes.\n validatePayload(raw.payload.length >= 2);\n const supportedColorComponents: ColorComponent[] = parseBitMask(raw.payload.subarray(0, 2), ColorComponent[\"Warm White\"]);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedColorComponents,\n });\n }\n public readonly supportedColorComponents: readonly ColorComponent[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = encodeBitMask(this.supportedColorComponents, 15, // fixed 2 bytes\n ColorComponent[\"Warm White\"]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported color components\": logList(this.supportedColorComponents.map((c) => getEnumMemberName(ColorComponent, c))),\n },\n };\n }\n}\n@CCCommand(ColorSwitchCommand.SupportedGet)\n@expectedCCResponse(ColorSwitchCCSupportedReport)\nexport class ColorSwitchCCSupportedGet extends ColorSwitchCC {\n}\n// @publicAPI\nexport interface ColorSwitchCCReportOptions {\n colorComponent: ColorComponent;\n currentValue: number;\n targetValue?: number;\n duration?: Duration | string;\n}\n@CCCommand(ColorSwitchCommand.Report)\n@ccValueProperty(\"currentValue\", ColorSwitchCCValues.currentColorChannel, (self) => [self.colorComponent])\n@ccValueProperty(\"targetValue\", ColorSwitchCCValues.targetColorChannel, (self) => [self.colorComponent])\n@ccValueProperty(\"duration\", ColorSwitchCCValues.duration)\nexport class ColorSwitchCCReport extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCReportOptions>) {\n super(options);\n this.colorComponent = options.colorComponent;\n this.currentValue = options.currentValue;\n this.targetValue = options.targetValue;\n this.duration = Duration.from(options.duration);\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCReport {\n validatePayload(raw.payload.length >= 2);\n const colorComponent = parseEnumValue(ColorComponent, raw.payload[0]);\n const currentValue = raw.payload[1];\n let targetValue: number | undefined;\n let duration: Duration | undefined;\n if (raw.payload.length >= 4) {\n targetValue = raw.payload[2];\n duration = Duration.parseReport(raw.payload[3]);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n colorComponent,\n currentValue,\n targetValue,\n duration,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n // Duration is stored globally instead of per component\n if (!super.persistValues(ctx))\n return false;\n // Update compound current value\n const colorTableKey = colorComponentToTableKey(this.colorComponent);\n if (colorTableKey) {\n const compoundCurrentColorValue = ColorSwitchCCValues.currentColor;\n const compoundCurrentColor: Partial<Record<ColorKey, number>> = this.getValue(ctx, compoundCurrentColorValue) ?? {};\n compoundCurrentColor[colorTableKey] = this.currentValue;\n this.setValue(ctx, compoundCurrentColorValue, compoundCurrentColor);\n // and target value\n if (this.targetValue != undefined) {\n const compoundTargetColorValue = ColorSwitchCCValues.targetColor;\n const compoundTargetColor: Partial<Record<ColorKey, number>> = this.getValue(ctx, compoundTargetColorValue) ?? {};\n compoundTargetColor[colorTableKey] = this.targetValue;\n this.setValue(ctx, compoundTargetColorValue, compoundTargetColor);\n }\n }\n // Update collective hex value if required\n const supportsHex = !!this.getValue(ctx, ColorSwitchCCValues.supportsHexColor);\n if (supportsHex\n && (this.colorComponent === ColorComponent.Red\n || this.colorComponent === ColorComponent.Green\n || this.colorComponent === ColorComponent.Blue)) {\n const hexColorValue = ColorSwitchCCValues.hexColor;\n const hexValue: string = this.getValue(ctx, hexColorValue) ?? \"000000\";\n const byteOffset = ColorComponent.Blue - this.colorComponent;\n const byteMask = 0xff << (byteOffset * 8);\n let hexValueNumeric = parseInt(hexValue, 16);\n hexValueNumeric =\n (hexValueNumeric & ~byteMask)\n | (this.currentValue << (byteOffset * 8));\n this.setValue(ctx, hexColorValue, hexValueNumeric.toString(16).padStart(6, \"0\"));\n }\n return true;\n }\n public readonly colorComponent: ColorComponent;\n public readonly currentValue: number;\n public readonly targetValue: number | undefined;\n public readonly duration: Duration | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.colorComponent, this.currentValue]);\n if (this.targetValue != undefined && this.duration != undefined) {\n this.payload = Bytes.concat([\n this.payload,\n [\n this.targetValue ?? 0xfe,\n (this.duration ?? Duration.default()).serializeReport(),\n ],\n ]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"color component\": getEnumMemberName(ColorComponent, this.colorComponent),\n \"current value\": this.currentValue,\n };\n if (this.targetValue != undefined) {\n message[\"target value\"] = this.targetValue;\n }\n if (this.duration != undefined) {\n message.duration = this.duration.toString();\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface ColorSwitchCCGetOptions {\n colorComponent: ColorComponent;\n}\nfunction testResponseForColorSwitchGet(sent: ColorSwitchCCGet, received: ColorSwitchCCReport) {\n return sent.colorComponent === received.colorComponent;\n}\n@CCCommand(ColorSwitchCommand.Get)\n@expectedCCResponse(ColorSwitchCCReport, testResponseForColorSwitchGet)\nexport class ColorSwitchCCGet extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCGetOptions>) {\n super(options);\n this._colorComponent = options.colorComponent;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCGet {\n validatePayload(raw.payload.length >= 1);\n const colorComponent: ColorComponent = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n colorComponent,\n });\n }\n private _colorComponent: ColorComponent;\n public get colorComponent(): ColorComponent {\n return this._colorComponent;\n }\n public set colorComponent(value: ColorComponent) {\n if (!ColorComponent[value]) {\n throw new ZWaveError(\"colorComponent must be a valid color component index.\", ZWaveErrorCodes.Argument_Invalid);\n }\n this._colorComponent = value;\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this._colorComponent]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"color component\": getEnumMemberName(ColorComponent, this.colorComponent),\n },\n };\n }\n}\n// @publicAPI\nexport type ColorSwitchCCSetOptions = (ColorTable | {\n hexColor: string;\n}) & {\n duration?: Duration | string;\n};\n@CCCommand(ColorSwitchCommand.Set)\n@useSupervision()\nexport class ColorSwitchCCSet extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCSetOptions>) {\n super(options);\n // Populate properties from options object\n if (\"hexColor\" in options) {\n const match = hexColorRegex.exec(options.hexColor);\n if (!match) {\n throw new ZWaveError(`${options.hexColor} is not a valid HEX color string`, ZWaveErrorCodes.Argument_Invalid);\n }\n this.colorTable = {\n red: parseInt(match.groups!.red, 16),\n green: parseInt(match.groups!.green, 16),\n blue: parseInt(match.groups!.blue, 16),\n };\n }\n else {\n this.colorTable = pick(options, colorTableKeys as any[]);\n }\n this.duration = Duration.from(options.duration);\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCSet {\n validatePayload(raw.payload.length >= 1);\n const populatedColorCount = raw.payload[0] & 0b11111;\n validatePayload(raw.payload.length >= 1 + populatedColorCount * 2);\n const colorTable: Partial<Record<ColorKey, number>> = {};\n let offset = 1;\n for (let color = 0; color < populatedColorCount; color++) {\n const component = raw.payload[offset];\n const value = raw.payload[offset + 1];\n const key = colorComponentToTableKey(component);\n if (key)\n colorTable[key] = value;\n offset += 2;\n }\n let duration: Duration | undefined;\n if (raw.payload.length > offset) {\n duration = Duration.parseSet(raw.payload[offset]);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n ...colorTable,\n duration,\n });\n }\n public colorTable: ColorTable;\n public duration: Duration | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const populatedColorCount = Object.keys(this.colorTable).length;\n this.payload = new Bytes(1 + populatedColorCount * 2 + 1);\n this.payload[0] = populatedColorCount & 0b11111;\n let i = 1;\n for (const [key, value] of Object.entries(this.colorTable)) {\n const component = colorTableKeyToComponent(key);\n this.payload[i] = component;\n this.payload[i + 1] = clamp(value, 0, 0xff);\n i += 2;\n }\n this.payload[i] = (this.duration ?? Duration.default()).serializeSet();\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (ccVersion < 2\n && ctx.getDeviceConfig?.(this.nodeId as number)?.compat\n ?.encodeCCsUsingTargetVersion) {\n // When forcing CC version 1, omit the duration byte\n this.payload = this.payload.subarray(0, -1);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n for (const [key, value] of Object.entries(this.colorTable)) {\n const realKey: string = key in ColorComponentMap\n ? (ColorComponent as any)[(ColorComponentMap as any)[key]]\n : (ColorComponent as any)[key];\n message[realKey] = value;\n }\n if (this.duration != undefined) {\n message.duration = this.duration.toString();\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport type ColorSwitchCCStartLevelChangeOptions = {\n colorComponent: ColorComponent;\n direction: keyof typeof LevelChangeDirection;\n} & ({\n ignoreStartLevel: true;\n startLevel?: number;\n} | {\n ignoreStartLevel: false;\n startLevel: number;\n}) & {\n // Version >= 3:\n duration?: Duration | string;\n};\n@CCCommand(ColorSwitchCommand.StartLevelChange)\n@useSupervision()\nexport class ColorSwitchCCStartLevelChange extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCStartLevelChangeOptions>) {\n super(options);\n this.duration = Duration.from(options.duration);\n this.ignoreStartLevel = options.ignoreStartLevel;\n this.startLevel = options.startLevel ?? 0;\n this.direction = options.direction;\n this.colorComponent = options.colorComponent;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCStartLevelChange {\n validatePayload(raw.payload.length >= 3);\n const ignoreStartLevel = !!((raw.payload[0] & 32) >>> 5);\n const direction = (raw.payload[0] & 64) >>> 6 ? \"down\" : \"up\";\n const colorComponent: ColorComponent = raw.payload[1];\n const startLevel = raw.payload[2];\n let duration: Duration | undefined;\n if (raw.payload.length >= 4) {\n duration = Duration.parseSet(raw.payload[3]);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n ignoreStartLevel,\n direction,\n colorComponent,\n startLevel,\n duration,\n });\n }\n public duration: Duration | undefined;\n public startLevel: number;\n public ignoreStartLevel: boolean;\n public direction: keyof typeof LevelChangeDirection;\n public colorComponent: ColorComponent;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const controlByte = (LevelChangeDirection[this.direction] << 6)\n | (this.ignoreStartLevel ? 32 : 0);\n this.payload = Bytes.from([\n controlByte,\n this.colorComponent,\n this.startLevel,\n (this.duration ?? Duration.default()).serializeSet(),\n ]);\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (ccVersion < 3\n && ctx.getDeviceConfig?.(this.nodeId as number)?.compat\n ?.encodeCCsUsingTargetVersion) {\n // When forcing CC version 1 or 2, omit the duration byte\n this.payload = this.payload.subarray(0, -1);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"color component\": getEnumMemberName(ColorComponent, this.colorComponent),\n \"start level\": `${this.startLevel}${this.ignoreStartLevel ? \" (ignored)\" : \"\"}`,\n direction: this.direction,\n };\n if (this.duration != undefined) {\n message.duration = this.duration.toString();\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface ColorSwitchCCStopLevelChangeOptions {\n colorComponent: ColorComponent;\n}\n@CCCommand(ColorSwitchCommand.StopLevelChange)\n@useSupervision()\nexport class ColorSwitchCCStopLevelChange extends ColorSwitchCC {\n public constructor(options: WithAddress<ColorSwitchCCStopLevelChangeOptions>) {\n super(options);\n this.colorComponent = options.colorComponent;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): ColorSwitchCCStopLevelChange {\n validatePayload(raw.payload.length >= 1);\n const colorComponent: ColorComponent = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n colorComponent,\n });\n }\n public readonly colorComponent: ColorComponent;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.colorComponent]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"color component\": getEnumMemberName(ColorComponent, this.colorComponent),\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -113,6 +113,11 @@ export declare class ConfigurationCCAPI extends CCAPI {
|
|
|
113
113
|
export declare class ConfigurationCC extends CommandClass {
|
|
114
114
|
ccCommand: ConfigurationCommand;
|
|
115
115
|
interview(ctx: InterviewContext): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* Applies all recommended values from the device config to this node
|
|
118
|
+
* Applies only if the current value is still the default value and
|
|
119
|
+
* the recommended value is different
|
|
120
|
+
*/
|
|
116
121
|
private applyRecommendedValues;
|
|
117
122
|
refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void>;
|
|
118
123
|
/**
|
|
@@ -277,6 +282,7 @@ export declare class ConfigurationCCNameReport extends ConfigurationCC {
|
|
|
277
282
|
static from(raw: CCRaw, ctx: CCParsingContext): ConfigurationCCNameReport;
|
|
278
283
|
readonly parameter: number;
|
|
279
284
|
name: string;
|
|
285
|
+
private rawName;
|
|
280
286
|
readonly reportsToFollow: number;
|
|
281
287
|
persistValues(ctx: PersistValuesContext): boolean;
|
|
282
288
|
serialize(ctx: CCEncodingContext): Promise<Bytes>;
|
|
@@ -303,6 +309,7 @@ export declare class ConfigurationCCInfoReport extends ConfigurationCC {
|
|
|
303
309
|
static from(raw: CCRaw, ctx: CCParsingContext): ConfigurationCCInfoReport;
|
|
304
310
|
readonly parameter: number;
|
|
305
311
|
info: string;
|
|
312
|
+
private rawInfo;
|
|
306
313
|
readonly reportsToFollow: number;
|
|
307
314
|
persistValues(ctx: PersistValuesContext): boolean;
|
|
308
315
|
serialize(ctx: CCEncodingContext): Promise<Bytes>;
|
|
@@ -1526,6 +1526,9 @@ let ConfigurationCCBulkReport = (() => {
|
|
|
1526
1526
|
const defaultValues = !!(raw.payload[4] & 128);
|
|
1527
1527
|
const isHandshakeResponse = !!(raw.payload[4] & 64);
|
|
1528
1528
|
const valueSize = raw.payload[4] & 7;
|
|
1529
|
+
if (numParams !== 0 && !isValidValueSize(valueSize)) {
|
|
1530
|
+
import_core.validatePayload.fail(`Invalid value size ${valueSize}`);
|
|
1531
|
+
}
|
|
1529
1532
|
(0, import_core.validatePayload)(raw.payload.length >= 5 + numParams * valueSize);
|
|
1530
1533
|
const values = {};
|
|
1531
1534
|
for (let i = 0; i < numParams; i++) {
|
|
@@ -1714,16 +1717,21 @@ let ConfigurationCCNameReport = (() => {
|
|
|
1714
1717
|
if (reportsToFollow > 0) {
|
|
1715
1718
|
(0, import_core.validatePayload)(raw.payload.length >= 4);
|
|
1716
1719
|
}
|
|
1717
|
-
const
|
|
1718
|
-
|
|
1720
|
+
const rawName = raw.payload.subarray(3).toString("utf8");
|
|
1721
|
+
const ret = new this({
|
|
1719
1722
|
nodeId: ctx.sourceNodeId,
|
|
1720
1723
|
parameter,
|
|
1721
1724
|
reportsToFollow,
|
|
1722
|
-
name
|
|
1725
|
+
name: (0, import_shared.stripControlCharacters)(rawName)
|
|
1723
1726
|
});
|
|
1727
|
+
ret.rawName = rawName;
|
|
1728
|
+
return ret;
|
|
1724
1729
|
}
|
|
1725
1730
|
parameter;
|
|
1726
1731
|
name;
|
|
1732
|
+
// Line breaks and NUL terminators may be split across reports, so the
|
|
1733
|
+
// merged text must be sanitized as a whole
|
|
1734
|
+
rawName;
|
|
1727
1735
|
reportsToFollow;
|
|
1728
1736
|
persistValues(ctx) {
|
|
1729
1737
|
if (!super.persistValues(ctx))
|
|
@@ -1764,7 +1772,7 @@ let ConfigurationCCNameReport = (() => {
|
|
|
1764
1772
|
return this.reportsToFollow;
|
|
1765
1773
|
}
|
|
1766
1774
|
mergePartialCCs(partials, _ctx) {
|
|
1767
|
-
this.name = [...partials, this].map((report) => report.name).
|
|
1775
|
+
this.name = (0, import_shared.stripControlCharacters)([...partials, this].map((report) => report.rawName ?? report.name).join(""));
|
|
1768
1776
|
return Promise.resolve();
|
|
1769
1777
|
}
|
|
1770
1778
|
toLogEntry(ctx) {
|
|
@@ -1860,16 +1868,21 @@ let ConfigurationCCInfoReport = (() => {
|
|
|
1860
1868
|
if (reportsToFollow > 0) {
|
|
1861
1869
|
(0, import_core.validatePayload)(raw.payload.length >= 4);
|
|
1862
1870
|
}
|
|
1863
|
-
const
|
|
1864
|
-
|
|
1871
|
+
const rawInfo = raw.payload.subarray(3).toString("utf8");
|
|
1872
|
+
const ret = new this({
|
|
1865
1873
|
nodeId: ctx.sourceNodeId,
|
|
1866
1874
|
parameter,
|
|
1867
1875
|
reportsToFollow,
|
|
1868
|
-
info
|
|
1876
|
+
info: (0, import_shared.stripControlCharacters)(rawInfo, { keepNewlines: true })
|
|
1869
1877
|
});
|
|
1878
|
+
ret.rawInfo = rawInfo;
|
|
1879
|
+
return ret;
|
|
1870
1880
|
}
|
|
1871
1881
|
parameter;
|
|
1872
1882
|
info;
|
|
1883
|
+
// Line breaks and NUL terminators may be split across reports, so the
|
|
1884
|
+
// merged text must be sanitized as a whole
|
|
1885
|
+
rawInfo;
|
|
1873
1886
|
reportsToFollow;
|
|
1874
1887
|
persistValues(ctx) {
|
|
1875
1888
|
if (!super.persistValues(ctx))
|
|
@@ -1910,7 +1923,7 @@ let ConfigurationCCInfoReport = (() => {
|
|
|
1910
1923
|
return this.reportsToFollow;
|
|
1911
1924
|
}
|
|
1912
1925
|
mergePartialCCs(partials, _ctx) {
|
|
1913
|
-
this.info = [...partials, this].map((report) => report.info).
|
|
1926
|
+
this.info = (0, import_shared.stripControlCharacters)([...partials, this].map((report) => report.rawInfo ?? report.info).join(""), { keepNewlines: true });
|
|
1914
1927
|
return Promise.resolve();
|
|
1915
1928
|
}
|
|
1916
1929
|
toLogEntry(ctx) {
|
|
@@ -2021,6 +2034,9 @@ let ConfigurationCCPropertiesReport = (() => {
|
|
|
2021
2034
|
const parameter = raw.payload.readUInt16BE(0);
|
|
2022
2035
|
const valueFormat = (raw.payload[2] & 56) >>> 3;
|
|
2023
2036
|
const valueSize = raw.payload[2] & 7;
|
|
2037
|
+
if (valueSize !== 0 && !isValidValueSize(valueSize)) {
|
|
2038
|
+
import_core.validatePayload.fail(`Invalid value size ${valueSize}`);
|
|
2039
|
+
}
|
|
2024
2040
|
let nextParameter;
|
|
2025
2041
|
if (valueSize === 0 && raw.payload.length < 5) {
|
|
2026
2042
|
nextParameter = 0;
|
|
@@ -2301,6 +2317,10 @@ function parseValue(raw, size, format) {
|
|
|
2301
2317
|
}
|
|
2302
2318
|
}
|
|
2303
2319
|
__name(parseValue, "parseValue");
|
|
2320
|
+
function isValidValueSize(valueSize) {
|
|
2321
|
+
return valueSize === 1 || valueSize === 2 || valueSize === 4;
|
|
2322
|
+
}
|
|
2323
|
+
__name(isValidValueSize, "isValidValueSize");
|
|
2304
2324
|
function throwInvalidValueError(value, parameter, valueSize, valueFormat) {
|
|
2305
2325
|
throw new import_core.ZWaveError(`The value ${value} is invalid for configuration parameter ${parameter} (size = ${valueSize}, format = ${(0, import_shared.getEnumMemberName)(import_core.ConfigValueFormat, valueFormat)})!`, import_core.ZWaveErrorCodes.Argument_Invalid);
|
|
2306
2326
|
}
|