@zwave-js/cc 15.31.2 → 15.32.2
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/CentralSceneCC.d.ts +5 -0
- package/build/cjs/cc/CentralSceneCC.js +28 -2
- package/build/cjs/cc/CentralSceneCC.js.map +2 -2
- package/build/cjs/cc/ColorSwitchCC.js +2 -3
- package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
- package/build/cjs/cc/ConfigurationCC.d.ts +2 -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/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/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/CentralSceneCC.d.ts +5 -0
- package/build/esm/cc/CentralSceneCC.d.ts.map +1 -1
- package/build/esm/cc/CentralSceneCC.js +29 -0
- package/build/esm/cc/CentralSceneCC.js.map +1 -1
- package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/ColorSwitchCC.js +2 -4
- package/build/esm/cc/ColorSwitchCC.js.map +1 -1
- package/build/esm/cc/ConfigurationCC.d.ts +2 -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/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/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 +7 -7
|
@@ -341,10 +341,11 @@ let EntryControlCCNotification = (() => {
|
|
|
341
341
|
while (paddingStart > 0 && eventData[paddingStart - 1] === 255) {
|
|
342
342
|
paddingStart--;
|
|
343
343
|
}
|
|
344
|
-
|
|
344
|
+
const asciiData = eventData.subarray(0, paddingStart).toString("ascii");
|
|
345
345
|
if (!noStrictValidation) {
|
|
346
|
-
(0, import_core.validatePayload)(/^[\u0000-\u007f]+$/.test(
|
|
346
|
+
(0, import_core.validatePayload)(/^[\u0000-\u007f]+$/.test(asciiData));
|
|
347
347
|
}
|
|
348
|
+
eventData = (0, import_shared.stripControlCharacters)(asciiData);
|
|
348
349
|
break;
|
|
349
350
|
case import_Types.EntryControlDataTypes.MD5:
|
|
350
351
|
if (!noStrictValidation) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src_gen/cc/EntryControlCC.ts"],
|
|
4
|
-
"sourcesContent": ["import * as __validateArgs from \"./EntryControlCC._validateArgs.js\";\nconst { validateArgs_EntryControlCCAPI_setConfiguration } = __validateArgs;\nimport { CommandClasses, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, ValueMetadata, type WithAddress, ZWaveError, ZWaveErrorCodes, getCCName, encodeBitMask, parseBitMask, supervisedCommandSucceeded, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, type BytesView, buffer2hex, pick } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, type PollValueImplementation, SET_VALUE, type SetValueImplementation, throwUnsupportedProperty, throwWrongValueType, } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { EntryControlCommand, EntryControlDataTypes, EntryControlEventTypes, } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport * as ccUtils from \"../lib/utils.js\";\nimport { EntryControlCCValues } from \"./_CCValues.generated.js\";\nexport { EntryControlCCValues };\n@API(CommandClasses[\"Entry Control\"])\nexport class EntryControlCCAPI extends CCAPI {\n public supportsCommand(cmd: EntryControlCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case EntryControlCommand.KeySupportedGet:\n case EntryControlCommand.EventSupportedGet:\n case EntryControlCommand.ConfigurationGet:\n return this.isSinglecast();\n case EntryControlCommand.ConfigurationSet:\n return true;\n }\n return super.supportsCommand(cmd);\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getSupportedKeys() {\n this.assertSupportsCommand(EntryControlCommand, EntryControlCommand.KeySupportedGet);\n const cc = new EntryControlCCKeySupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<EntryControlCCKeySupportedReport>(cc, this.commandOptions);\n return response?.supportedKeys;\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getEventCapabilities() {\n this.assertSupportsCommand(EntryControlCommand, EntryControlCommand.EventSupportedGet);\n const cc = new EntryControlCCEventSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<EntryControlCCEventSupportedReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\n \"supportedDataTypes\",\n \"supportedEventTypes\",\n \"minKeyCacheSize\",\n \"maxKeyCacheSize\",\n \"minKeyCacheTimeout\",\n \"maxKeyCacheTimeout\",\n ]);\n }\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getConfiguration() {\n this.assertSupportsCommand(EntryControlCommand, EntryControlCommand.ConfigurationGet);\n const cc = new EntryControlCCConfigurationGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<EntryControlCCConfigurationReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\"keyCacheSize\", \"keyCacheTimeout\"]);\n }\n }\n @validateArgs_EntryControlCCAPI_setConfiguration()\n public async setConfiguration(keyCacheSize: number, keyCacheTimeout: number): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(EntryControlCommand, EntryControlCommand.ConfigurationGet);\n const cc = new EntryControlCCConfigurationSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n keyCacheSize,\n keyCacheTimeout,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: EntryControlCCAPI, { property }, value) {\n if (property !== \"keyCacheSize\" && property !== \"keyCacheTimeout\") {\n throwUnsupportedProperty(this.ccId, property);\n }\n if (typeof value !== \"number\") {\n throwWrongValueType(this.ccId, property, \"number\", typeof value);\n }\n let keyCacheSize = value;\n let keyCacheTimeout = 2;\n if (property === \"keyCacheTimeout\") {\n keyCacheTimeout = value;\n const oldKeyCacheSize = this.tryGetValueDB()?.getValue<number>(EntryControlCCValues.keyCacheSize.endpoint(this.endpoint.index));\n if (oldKeyCacheSize == undefined) {\n throw new ZWaveError(`The \"keyCacheTimeout\" property cannot be changed before the key cache size is known!`, ZWaveErrorCodes.Argument_Invalid);\n }\n keyCacheSize = oldKeyCacheSize;\n }\n const result = await this.setConfiguration(keyCacheSize, keyCacheTimeout);\n // Verify the change after a short delay, unless the command was supervised and successful\n if (this.isSinglecast() && !supervisedCommandSucceeded(result)) {\n this.schedulePoll({ property }, value, { transition: \"fast\" });\n }\n return result;\n };\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: EntryControlCCAPI, { property }) {\n switch (property) {\n case \"keyCacheSize\":\n case \"keyCacheTimeout\":\n return (await this.getConfiguration())?.[property];\n }\n throwUnsupportedProperty(this.ccId, property);\n };\n }\n}\n@commandClass(CommandClasses[\"Entry Control\"])\n@implementedVersion(1)\n@ccValues(EntryControlCCValues)\nexport class EntryControlCC extends CommandClass {\n declare ccCommand: EntryControlCommand;\n public determineRequiredCCInterviews(): readonly CommandClasses[] {\n return [\n ...super.determineRequiredCCInterviews(),\n CommandClasses.Association,\n CommandClasses[\"Multi Channel Association\"],\n CommandClasses[\"Association Group Information\"],\n ];\n }\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[\"Entry Control\"], 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 // If one Association group issues Entry Control notifications,\n // we must associate ourselves with that channel\n try {\n await ccUtils.assignLifelineIssueingCommand(ctx, endpoint, this.ccId, EntryControlCommand.Notification);\n }\n catch {\n ctx.logNode(node.id, {\n endpoint: endpoint.index,\n message: `Configuring associations to receive ${getCCName(this.ccId)} commands failed!`,\n level: \"warn\",\n });\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"requesting entry control supported keys...\",\n direction: \"outbound\",\n });\n const supportedKeys = await api.getSupportedKeys();\n if (supportedKeys) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received entry control supported keys: ${supportedKeys.toString()}`,\n direction: \"inbound\",\n });\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"requesting entry control supported events...\",\n direction: \"outbound\",\n });\n const eventCapabilities = await api.getEventCapabilities();\n if (eventCapabilities) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received entry control supported keys:\ndata types: ${eventCapabilities.supportedDataTypes\n .map((e) => EntryControlDataTypes[e])\n .toString()}\nevent types: ${eventCapabilities.supportedEventTypes\n .map((e) => EntryControlEventTypes[e])\n .toString()}\nmin key cache size: ${eventCapabilities.minKeyCacheSize}\nmax key cache size: ${eventCapabilities.maxKeyCacheSize}\nmin key cache timeout: ${eventCapabilities.minKeyCacheTimeout} seconds\nmax key cache timeout: ${eventCapabilities.maxKeyCacheTimeout} seconds`,\n direction: \"inbound\",\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[\"Entry Control\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"requesting entry control configuration...\",\n direction: \"outbound\",\n });\n const conf = await api.getConfiguration();\n if (conf) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received entry control configuration:\nkey cache size: ${conf.keyCacheSize}\nkey cache timeout: ${conf.keyCacheTimeout} seconds`,\n direction: \"inbound\",\n });\n }\n }\n}\n// @publicAPI\nexport interface EntryControlCCNotificationOptions {\n sequenceNumber: number;\n dataType: EntryControlDataTypes;\n eventType: EntryControlEventTypes;\n eventData?: string | Bytes;\n}\n@CCCommand(EntryControlCommand.Notification)\nexport class EntryControlCCNotification extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCNotificationOptions>) {\n super(options);\n // TODO: Check implementation:\n this.sequenceNumber = options.sequenceNumber;\n this.dataType = options.dataType;\n this.eventType = options.eventType;\n this.eventData = options.eventData;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCNotification {\n validatePayload(raw.payload.length >= 4);\n const sequenceNumber = raw.payload[0];\n let dataType: EntryControlDataTypes = raw.payload[1] & 0b11;\n const eventType: EntryControlEventTypes = raw.payload[2];\n const eventDataLength = raw.payload[3];\n validatePayload(eventDataLength >= 0 && eventDataLength <= 32);\n const offset = 4;\n validatePayload(raw.payload.length >= offset + eventDataLength);\n let eventData: string | Bytes | undefined;\n if (eventDataLength > 0) {\n // We shouldn't need to check this, since the specs are pretty clear which format to expect.\n // But as always - manufacturers don't care and send ASCII data with 0 bytes...\n // We also need to disable the strict validation for some devices to make them work\n const noStrictValidation = !!ctx.getDeviceConfig?.(ctx.sourceNodeId)\n ?.compat?.disableStrictEntryControlDataValidation;\n eventData = Bytes.from(raw.payload.subarray(offset, offset + eventDataLength));\n switch (dataType) {\n case EntryControlDataTypes.Raw:\n // RAW 1 to 32 bytes of arbitrary binary data\n if (!noStrictValidation) {\n validatePayload(eventDataLength >= 1 && eventDataLength <= 32);\n }\n break;\n case EntryControlDataTypes.ASCII:\n // ASCII 1 to 32 ASCII encoded characters. ASCII codes MUST be in the value range 0x00-0xF7.\n // The string MUST be padded with the value 0xFF to fit 16 byte blocks when sent in a notification.\n // However, some devices do not follow this requirement, so we accept unpadded strings as well.\n // Trim 0xff padding bytes\n let paddingStart = eventDataLength;\n while (paddingStart > 0\n && eventData[paddingStart - 1] === 0xff) {\n paddingStart--;\n }\n eventData = eventData\n .subarray(0, paddingStart)\n .toString(\"ascii\");\n if (!noStrictValidation) {\n validatePayload(/^[\\u0000-\\u007f]+$/.test(eventData));\n }\n break;\n case EntryControlDataTypes.MD5:\n // MD5 16 byte binary data encoded as a MD5 hash value.\n if (!noStrictValidation) {\n validatePayload(eventDataLength === 16);\n }\n break;\n }\n }\n else {\n dataType = EntryControlDataTypes.None;\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n sequenceNumber,\n dataType,\n eventType,\n eventData,\n });\n }\n public readonly sequenceNumber: number;\n public readonly dataType: EntryControlDataTypes;\n public readonly eventType: EntryControlEventTypes;\n public readonly eventData?: BytesView | string;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n let data = typeof this.eventData === \"string\"\n ? Bytes.from(this.eventData, \"ascii\")\n : Bytes.from(this.eventData ?? []);\n // RAW and ASCII: 1 to 32 bytes; MD5: exactly 16 bytes\n if (data.length > 32\n || (this.dataType === EntryControlDataTypes.MD5\n && data.length !== 16)) {\n throw new ZWaveError(\"Invalid event data length\", ZWaveErrorCodes.Argument_Invalid);\n }\n // ASCII data MUST be padded with 0xFF to fit 16 byte blocks\n if (this.dataType === EntryControlDataTypes.ASCII && data.length > 0) {\n const padded = new Bytes(Math.ceil(data.length / 16) * 16).fill(0xff);\n padded.set(data);\n data = padded;\n }\n this.payload = Bytes.concat([\n [\n this.sequenceNumber,\n this.dataType & 0b11,\n this.eventType,\n data.length,\n ],\n data,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"sequence number\": this.sequenceNumber,\n \"data type\": this.dataType,\n \"event type\": this.eventType,\n };\n if (this.eventData) {\n switch (this.eventType) {\n case EntryControlEventTypes.CachedKeys:\n case EntryControlEventTypes.Enter:\n // The event data is likely the user's PIN code, hide it from logs\n message[\"event data\"] = \"*\".repeat(this.eventData.length);\n break;\n default:\n message[\"event data\"] =\n typeof this.eventData === \"string\"\n ? this.eventData\n : buffer2hex(this.eventData);\n }\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface EntryControlCCKeySupportedReportOptions {\n supportedKeys: number[];\n}\n@CCCommand(EntryControlCommand.KeySupportedReport)\n@ccValueProperty(\"supportedKeys\", EntryControlCCValues.supportedKeys)\nexport class EntryControlCCKeySupportedReport extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCKeySupportedReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.supportedKeys = options.supportedKeys;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCKeySupportedReport {\n validatePayload(raw.payload.length >= 1);\n const length = raw.payload[0];\n validatePayload(raw.payload.length >= 1 + length);\n const supportedKeys = parseBitMask(raw.payload.subarray(1, 1 + length), 0);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedKeys,\n });\n }\n public readonly supportedKeys: readonly number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const mask = encodeBitMask(this.supportedKeys, undefined, 0);\n this.payload = Bytes.concat([[mask.length], mask]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"supported keys\": this.supportedKeys.toString() },\n };\n }\n}\n@CCCommand(EntryControlCommand.KeySupportedGet)\n@expectedCCResponse(EntryControlCCKeySupportedReport)\nexport class EntryControlCCKeySupportedGet extends EntryControlCC {\n}\n// @publicAPI\nexport interface EntryControlCCEventSupportedReportOptions {\n supportedDataTypes: EntryControlDataTypes[];\n supportedEventTypes: EntryControlEventTypes[];\n minKeyCacheSize: number;\n maxKeyCacheSize: number;\n minKeyCacheTimeout: number;\n maxKeyCacheTimeout: number;\n}\n@CCCommand(EntryControlCommand.EventSupportedReport)\n@ccValueProperty(\"supportedDataTypes\", EntryControlCCValues.supportedDataTypes)\n@ccValueProperty(\"supportedEventTypes\", EntryControlCCValues.supportedEventTypes)\nexport class EntryControlCCEventSupportedReport extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCEventSupportedReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.supportedDataTypes = options.supportedDataTypes;\n this.supportedEventTypes = options.supportedEventTypes;\n this.minKeyCacheSize = options.minKeyCacheSize;\n this.maxKeyCacheSize = options.maxKeyCacheSize;\n this.minKeyCacheTimeout = options.minKeyCacheTimeout;\n this.maxKeyCacheTimeout = options.maxKeyCacheTimeout;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCEventSupportedReport {\n validatePayload(raw.payload.length >= 1);\n const dataTypeLength = raw.payload[0] & 0b11;\n let offset = 1;\n validatePayload(raw.payload.length >= offset + dataTypeLength);\n const supportedDataTypes: EntryControlDataTypes[] = parseBitMask(raw.payload.subarray(offset, offset + dataTypeLength), EntryControlDataTypes.None);\n offset += dataTypeLength;\n validatePayload(raw.payload.length >= offset + 1);\n const eventTypeLength = raw.payload[offset] & 0b11111;\n offset += 1;\n validatePayload(raw.payload.length >= offset + eventTypeLength);\n const supportedEventTypes: EntryControlEventTypes[] = parseBitMask(raw.payload.subarray(offset, offset + eventTypeLength), EntryControlEventTypes.Caching);\n offset += eventTypeLength;\n validatePayload(raw.payload.length >= offset + 4);\n const minKeyCacheSize = raw.payload[offset];\n validatePayload(minKeyCacheSize >= 1 && minKeyCacheSize <= 32);\n const maxKeyCacheSize = raw.payload[offset + 1];\n validatePayload(maxKeyCacheSize >= minKeyCacheSize && maxKeyCacheSize <= 32);\n const minKeyCacheTimeout = raw.payload[offset + 2];\n const maxKeyCacheTimeout = raw.payload[offset + 3];\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedDataTypes,\n supportedEventTypes,\n minKeyCacheSize,\n maxKeyCacheSize,\n minKeyCacheTimeout,\n maxKeyCacheTimeout,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // Store min/max cache size and timeout as metadata\n const keyCacheSizeValue = EntryControlCCValues.keyCacheSize;\n this.setMetadata(ctx, keyCacheSizeValue, {\n ...keyCacheSizeValue.meta,\n min: this.minKeyCacheSize,\n max: this.maxKeyCacheSize,\n });\n const keyCacheTimeoutValue = EntryControlCCValues.keyCacheTimeout;\n this.setMetadata(ctx, keyCacheTimeoutValue, {\n ...keyCacheTimeoutValue.meta,\n min: this.minKeyCacheTimeout,\n max: this.maxKeyCacheTimeout,\n });\n return true;\n }\n public readonly supportedDataTypes: readonly EntryControlDataTypes[];\n public readonly supportedEventTypes: readonly EntryControlEventTypes[];\n public readonly minKeyCacheSize: number;\n public readonly maxKeyCacheSize: number;\n public readonly minKeyCacheTimeout: number;\n public readonly maxKeyCacheTimeout: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const dataTypes = encodeBitMask(this.supportedDataTypes, undefined, EntryControlDataTypes.None);\n const eventTypes = encodeBitMask(this.supportedEventTypes, undefined, EntryControlEventTypes.Caching);\n this.payload = Bytes.concat([\n [dataTypes.length],\n dataTypes,\n [eventTypes.length],\n eventTypes,\n [\n this.minKeyCacheSize,\n this.maxKeyCacheSize,\n this.minKeyCacheTimeout,\n this.maxKeyCacheTimeout,\n ],\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported data types\": this.supportedDataTypes\n .map((dt) => EntryControlDataTypes[dt])\n .toString(),\n \"supported event types\": this.supportedEventTypes\n .map((et) => EntryControlEventTypes[et])\n .toString(),\n \"min key cache size\": this.minKeyCacheSize,\n \"max key cache size\": this.maxKeyCacheSize,\n \"min key cache timeout\": this.minKeyCacheTimeout,\n \"max key cache timeout\": this.maxKeyCacheTimeout,\n },\n };\n }\n}\n@CCCommand(EntryControlCommand.EventSupportedGet)\n@expectedCCResponse(EntryControlCCEventSupportedReport)\nexport class EntryControlCCEventSupportedGet extends EntryControlCC {\n}\n// @publicAPI\nexport interface EntryControlCCConfigurationReportOptions {\n keyCacheSize: number;\n keyCacheTimeout: number;\n}\n@CCCommand(EntryControlCommand.ConfigurationReport)\n@ccValueProperty(\"keyCacheSize\", EntryControlCCValues.keyCacheSize)\n@ccValueProperty(\"keyCacheTimeout\", EntryControlCCValues.keyCacheTimeout)\nexport class EntryControlCCConfigurationReport extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCConfigurationReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.keyCacheSize = options.keyCacheSize;\n this.keyCacheTimeout = options.keyCacheTimeout;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCConfigurationReport {\n validatePayload(raw.payload.length >= 2);\n const keyCacheSize = raw.payload[0];\n validatePayload(keyCacheSize >= 1 && keyCacheSize <= 32);\n const keyCacheTimeout = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n keyCacheSize,\n keyCacheTimeout,\n });\n }\n public readonly keyCacheSize: number;\n public readonly keyCacheTimeout: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.keyCacheSize, this.keyCacheTimeout]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"key cache size\": this.keyCacheSize,\n \"key cache timeout\": this.keyCacheTimeout,\n },\n };\n }\n}\n@CCCommand(EntryControlCommand.ConfigurationGet)\n@expectedCCResponse(EntryControlCCConfigurationReport)\nexport class EntryControlCCConfigurationGet extends EntryControlCC {\n}\n// @publicAPI\nexport interface EntryControlCCConfigurationSetOptions {\n keyCacheSize: number;\n keyCacheTimeout: number;\n}\n@CCCommand(EntryControlCommand.ConfigurationSet)\n@useSupervision()\nexport class EntryControlCCConfigurationSet extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCConfigurationSetOptions>) {\n super(options);\n this.keyCacheSize = options.keyCacheSize;\n this.keyCacheTimeout = options.keyCacheTimeout;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCConfigurationSet {\n validatePayload(raw.payload.length >= 2);\n const keyCacheSize = raw.payload[0];\n validatePayload(keyCacheSize >= 1 && keyCacheSize <= 32);\n const keyCacheTimeout = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n keyCacheSize,\n keyCacheTimeout,\n });\n }\n public readonly keyCacheSize: number;\n public readonly keyCacheTimeout: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.keyCacheSize, this.keyCacheTimeout]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"key cache size\": this.keyCacheSize,\n \"key cache timeout\": this.keyCacheTimeout,\n },\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import * as __validateArgs from \"./EntryControlCC._validateArgs.js\";\nconst { validateArgs_EntryControlCCAPI_setConfiguration } = __validateArgs;\nimport { CommandClasses, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, ValueMetadata, type WithAddress, ZWaveError, ZWaveErrorCodes, getCCName, encodeBitMask, parseBitMask, supervisedCommandSucceeded, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, type BytesView, buffer2hex, stripControlCharacters, pick, } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, type PollValueImplementation, SET_VALUE, type SetValueImplementation, throwUnsupportedProperty, throwWrongValueType, } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { EntryControlCommand, EntryControlDataTypes, EntryControlEventTypes, } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport * as ccUtils from \"../lib/utils.js\";\nimport { EntryControlCCValues } from \"./_CCValues.generated.js\";\nexport { EntryControlCCValues };\n@API(CommandClasses[\"Entry Control\"])\nexport class EntryControlCCAPI extends CCAPI {\n public supportsCommand(cmd: EntryControlCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case EntryControlCommand.KeySupportedGet:\n case EntryControlCommand.EventSupportedGet:\n case EntryControlCommand.ConfigurationGet:\n return this.isSinglecast();\n case EntryControlCommand.ConfigurationSet:\n return true;\n }\n return super.supportsCommand(cmd);\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getSupportedKeys() {\n this.assertSupportsCommand(EntryControlCommand, EntryControlCommand.KeySupportedGet);\n const cc = new EntryControlCCKeySupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<EntryControlCCKeySupportedReport>(cc, this.commandOptions);\n return response?.supportedKeys;\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getEventCapabilities() {\n this.assertSupportsCommand(EntryControlCommand, EntryControlCommand.EventSupportedGet);\n const cc = new EntryControlCCEventSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<EntryControlCCEventSupportedReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\n \"supportedDataTypes\",\n \"supportedEventTypes\",\n \"minKeyCacheSize\",\n \"maxKeyCacheSize\",\n \"minKeyCacheTimeout\",\n \"maxKeyCacheTimeout\",\n ]);\n }\n }\n // oxlint-disable-next-line typescript/explicit-module-boundary-types\n public async getConfiguration() {\n this.assertSupportsCommand(EntryControlCommand, EntryControlCommand.ConfigurationGet);\n const cc = new EntryControlCCConfigurationGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<EntryControlCCConfigurationReport>(cc, this.commandOptions);\n if (response) {\n return pick(response, [\"keyCacheSize\", \"keyCacheTimeout\"]);\n }\n }\n @validateArgs_EntryControlCCAPI_setConfiguration()\n public async setConfiguration(keyCacheSize: number, keyCacheTimeout: number): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(EntryControlCommand, EntryControlCommand.ConfigurationGet);\n const cc = new EntryControlCCConfigurationSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n keyCacheSize,\n keyCacheTimeout,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: EntryControlCCAPI, { property }, value) {\n if (property !== \"keyCacheSize\" && property !== \"keyCacheTimeout\") {\n throwUnsupportedProperty(this.ccId, property);\n }\n if (typeof value !== \"number\") {\n throwWrongValueType(this.ccId, property, \"number\", typeof value);\n }\n let keyCacheSize = value;\n let keyCacheTimeout = 2;\n if (property === \"keyCacheTimeout\") {\n keyCacheTimeout = value;\n const oldKeyCacheSize = this.tryGetValueDB()?.getValue<number>(EntryControlCCValues.keyCacheSize.endpoint(this.endpoint.index));\n if (oldKeyCacheSize == undefined) {\n throw new ZWaveError(`The \"keyCacheTimeout\" property cannot be changed before the key cache size is known!`, ZWaveErrorCodes.Argument_Invalid);\n }\n keyCacheSize = oldKeyCacheSize;\n }\n const result = await this.setConfiguration(keyCacheSize, keyCacheTimeout);\n // Verify the change after a short delay, unless the command was supervised and successful\n if (this.isSinglecast() && !supervisedCommandSucceeded(result)) {\n this.schedulePoll({ property }, value, { transition: \"fast\" });\n }\n return result;\n };\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: EntryControlCCAPI, { property }) {\n switch (property) {\n case \"keyCacheSize\":\n case \"keyCacheTimeout\":\n return (await this.getConfiguration())?.[property];\n }\n throwUnsupportedProperty(this.ccId, property);\n };\n }\n}\n@commandClass(CommandClasses[\"Entry Control\"])\n@implementedVersion(1)\n@ccValues(EntryControlCCValues)\nexport class EntryControlCC extends CommandClass {\n declare ccCommand: EntryControlCommand;\n public determineRequiredCCInterviews(): readonly CommandClasses[] {\n return [\n ...super.determineRequiredCCInterviews(),\n CommandClasses.Association,\n CommandClasses[\"Multi Channel Association\"],\n CommandClasses[\"Association Group Information\"],\n ];\n }\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[\"Entry Control\"], 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 // If one Association group issues Entry Control notifications,\n // we must associate ourselves with that channel\n try {\n await ccUtils.assignLifelineIssueingCommand(ctx, endpoint, this.ccId, EntryControlCommand.Notification);\n }\n catch {\n ctx.logNode(node.id, {\n endpoint: endpoint.index,\n message: `Configuring associations to receive ${getCCName(this.ccId)} commands failed!`,\n level: \"warn\",\n });\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"requesting entry control supported keys...\",\n direction: \"outbound\",\n });\n const supportedKeys = await api.getSupportedKeys();\n if (supportedKeys) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received entry control supported keys: ${supportedKeys.toString()}`,\n direction: \"inbound\",\n });\n }\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"requesting entry control supported events...\",\n direction: \"outbound\",\n });\n const eventCapabilities = await api.getEventCapabilities();\n if (eventCapabilities) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received entry control supported keys:\ndata types: ${eventCapabilities.supportedDataTypes\n .map((e) => EntryControlDataTypes[e])\n .toString()}\nevent types: ${eventCapabilities.supportedEventTypes\n .map((e) => EntryControlEventTypes[e])\n .toString()}\nmin key cache size: ${eventCapabilities.minKeyCacheSize}\nmax key cache size: ${eventCapabilities.maxKeyCacheSize}\nmin key cache timeout: ${eventCapabilities.minKeyCacheTimeout} seconds\nmax key cache timeout: ${eventCapabilities.maxKeyCacheTimeout} seconds`,\n direction: \"inbound\",\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[\"Entry Control\"], ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"requesting entry control configuration...\",\n direction: \"outbound\",\n });\n const conf = await api.getConfiguration();\n if (conf) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `received entry control configuration:\nkey cache size: ${conf.keyCacheSize}\nkey cache timeout: ${conf.keyCacheTimeout} seconds`,\n direction: \"inbound\",\n });\n }\n }\n}\n// @publicAPI\nexport interface EntryControlCCNotificationOptions {\n sequenceNumber: number;\n dataType: EntryControlDataTypes;\n eventType: EntryControlEventTypes;\n eventData?: string | Bytes;\n}\n@CCCommand(EntryControlCommand.Notification)\nexport class EntryControlCCNotification extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCNotificationOptions>) {\n super(options);\n // TODO: Check implementation:\n this.sequenceNumber = options.sequenceNumber;\n this.dataType = options.dataType;\n this.eventType = options.eventType;\n this.eventData = options.eventData;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCNotification {\n validatePayload(raw.payload.length >= 4);\n const sequenceNumber = raw.payload[0];\n let dataType: EntryControlDataTypes = raw.payload[1] & 0b11;\n const eventType: EntryControlEventTypes = raw.payload[2];\n const eventDataLength = raw.payload[3];\n validatePayload(eventDataLength >= 0 && eventDataLength <= 32);\n const offset = 4;\n validatePayload(raw.payload.length >= offset + eventDataLength);\n let eventData: string | Bytes | undefined;\n if (eventDataLength > 0) {\n // We shouldn't need to check this, since the specs are pretty clear which format to expect.\n // But as always - manufacturers don't care and send ASCII data with 0 bytes...\n // We also need to disable the strict validation for some devices to make them work\n const noStrictValidation = !!ctx.getDeviceConfig?.(ctx.sourceNodeId)\n ?.compat?.disableStrictEntryControlDataValidation;\n eventData = Bytes.from(raw.payload.subarray(offset, offset + eventDataLength));\n switch (dataType) {\n case EntryControlDataTypes.Raw:\n // RAW 1 to 32 bytes of arbitrary binary data\n if (!noStrictValidation) {\n validatePayload(eventDataLength >= 1 && eventDataLength <= 32);\n }\n break;\n case EntryControlDataTypes.ASCII:\n // ASCII 1 to 32 ASCII encoded characters. ASCII codes MUST be in the value range 0x00-0xF7.\n // The string MUST be padded with the value 0xFF to fit 16 byte blocks when sent in a notification.\n // However, some devices do not follow this requirement, so we accept unpadded strings as well.\n // Trim 0xff padding bytes\n let paddingStart = eventDataLength;\n while (paddingStart > 0\n && eventData[paddingStart - 1] === 0xff) {\n paddingStart--;\n }\n const asciiData = eventData\n .subarray(0, paddingStart)\n .toString(\"ascii\");\n if (!noStrictValidation) {\n validatePayload(/^[\\u0000-\\u007f]+$/.test(asciiData));\n }\n eventData = stripControlCharacters(asciiData);\n break;\n case EntryControlDataTypes.MD5:\n // MD5 16 byte binary data encoded as a MD5 hash value.\n if (!noStrictValidation) {\n validatePayload(eventDataLength === 16);\n }\n break;\n }\n }\n else {\n dataType = EntryControlDataTypes.None;\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n sequenceNumber,\n dataType,\n eventType,\n eventData,\n });\n }\n public readonly sequenceNumber: number;\n public readonly dataType: EntryControlDataTypes;\n public readonly eventType: EntryControlEventTypes;\n public readonly eventData?: BytesView | string;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n let data = typeof this.eventData === \"string\"\n ? Bytes.from(this.eventData, \"ascii\")\n : Bytes.from(this.eventData ?? []);\n // RAW and ASCII: 1 to 32 bytes; MD5: exactly 16 bytes\n if (data.length > 32\n || (this.dataType === EntryControlDataTypes.MD5\n && data.length !== 16)) {\n throw new ZWaveError(\"Invalid event data length\", ZWaveErrorCodes.Argument_Invalid);\n }\n // ASCII data MUST be padded with 0xFF to fit 16 byte blocks\n if (this.dataType === EntryControlDataTypes.ASCII && data.length > 0) {\n const padded = new Bytes(Math.ceil(data.length / 16) * 16).fill(0xff);\n padded.set(data);\n data = padded;\n }\n this.payload = Bytes.concat([\n [\n this.sequenceNumber,\n this.dataType & 0b11,\n this.eventType,\n data.length,\n ],\n data,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {\n \"sequence number\": this.sequenceNumber,\n \"data type\": this.dataType,\n \"event type\": this.eventType,\n };\n if (this.eventData) {\n switch (this.eventType) {\n case EntryControlEventTypes.CachedKeys:\n case EntryControlEventTypes.Enter:\n // The event data is likely the user's PIN code, hide it from logs\n message[\"event data\"] = \"*\".repeat(this.eventData.length);\n break;\n default:\n message[\"event data\"] =\n typeof this.eventData === \"string\"\n ? this.eventData\n : buffer2hex(this.eventData);\n }\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface EntryControlCCKeySupportedReportOptions {\n supportedKeys: number[];\n}\n@CCCommand(EntryControlCommand.KeySupportedReport)\n@ccValueProperty(\"supportedKeys\", EntryControlCCValues.supportedKeys)\nexport class EntryControlCCKeySupportedReport extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCKeySupportedReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.supportedKeys = options.supportedKeys;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCKeySupportedReport {\n validatePayload(raw.payload.length >= 1);\n const length = raw.payload[0];\n validatePayload(raw.payload.length >= 1 + length);\n const supportedKeys = parseBitMask(raw.payload.subarray(1, 1 + length), 0);\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedKeys,\n });\n }\n public readonly supportedKeys: readonly number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const mask = encodeBitMask(this.supportedKeys, undefined, 0);\n this.payload = Bytes.concat([[mask.length], mask]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: { \"supported keys\": this.supportedKeys.toString() },\n };\n }\n}\n@CCCommand(EntryControlCommand.KeySupportedGet)\n@expectedCCResponse(EntryControlCCKeySupportedReport)\nexport class EntryControlCCKeySupportedGet extends EntryControlCC {\n}\n// @publicAPI\nexport interface EntryControlCCEventSupportedReportOptions {\n supportedDataTypes: EntryControlDataTypes[];\n supportedEventTypes: EntryControlEventTypes[];\n minKeyCacheSize: number;\n maxKeyCacheSize: number;\n minKeyCacheTimeout: number;\n maxKeyCacheTimeout: number;\n}\n@CCCommand(EntryControlCommand.EventSupportedReport)\n@ccValueProperty(\"supportedDataTypes\", EntryControlCCValues.supportedDataTypes)\n@ccValueProperty(\"supportedEventTypes\", EntryControlCCValues.supportedEventTypes)\nexport class EntryControlCCEventSupportedReport extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCEventSupportedReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.supportedDataTypes = options.supportedDataTypes;\n this.supportedEventTypes = options.supportedEventTypes;\n this.minKeyCacheSize = options.minKeyCacheSize;\n this.maxKeyCacheSize = options.maxKeyCacheSize;\n this.minKeyCacheTimeout = options.minKeyCacheTimeout;\n this.maxKeyCacheTimeout = options.maxKeyCacheTimeout;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCEventSupportedReport {\n validatePayload(raw.payload.length >= 1);\n const dataTypeLength = raw.payload[0] & 0b11;\n let offset = 1;\n validatePayload(raw.payload.length >= offset + dataTypeLength);\n const supportedDataTypes: EntryControlDataTypes[] = parseBitMask(raw.payload.subarray(offset, offset + dataTypeLength), EntryControlDataTypes.None);\n offset += dataTypeLength;\n validatePayload(raw.payload.length >= offset + 1);\n const eventTypeLength = raw.payload[offset] & 0b11111;\n offset += 1;\n validatePayload(raw.payload.length >= offset + eventTypeLength);\n const supportedEventTypes: EntryControlEventTypes[] = parseBitMask(raw.payload.subarray(offset, offset + eventTypeLength), EntryControlEventTypes.Caching);\n offset += eventTypeLength;\n validatePayload(raw.payload.length >= offset + 4);\n const minKeyCacheSize = raw.payload[offset];\n validatePayload(minKeyCacheSize >= 1 && minKeyCacheSize <= 32);\n const maxKeyCacheSize = raw.payload[offset + 1];\n validatePayload(maxKeyCacheSize >= minKeyCacheSize && maxKeyCacheSize <= 32);\n const minKeyCacheTimeout = raw.payload[offset + 2];\n const maxKeyCacheTimeout = raw.payload[offset + 3];\n return new this({\n nodeId: ctx.sourceNodeId,\n supportedDataTypes,\n supportedEventTypes,\n minKeyCacheSize,\n maxKeyCacheSize,\n minKeyCacheTimeout,\n maxKeyCacheTimeout,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // Store min/max cache size and timeout as metadata\n const keyCacheSizeValue = EntryControlCCValues.keyCacheSize;\n this.setMetadata(ctx, keyCacheSizeValue, {\n ...keyCacheSizeValue.meta,\n min: this.minKeyCacheSize,\n max: this.maxKeyCacheSize,\n });\n const keyCacheTimeoutValue = EntryControlCCValues.keyCacheTimeout;\n this.setMetadata(ctx, keyCacheTimeoutValue, {\n ...keyCacheTimeoutValue.meta,\n min: this.minKeyCacheTimeout,\n max: this.maxKeyCacheTimeout,\n });\n return true;\n }\n public readonly supportedDataTypes: readonly EntryControlDataTypes[];\n public readonly supportedEventTypes: readonly EntryControlEventTypes[];\n public readonly minKeyCacheSize: number;\n public readonly maxKeyCacheSize: number;\n public readonly minKeyCacheTimeout: number;\n public readonly maxKeyCacheTimeout: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const dataTypes = encodeBitMask(this.supportedDataTypes, undefined, EntryControlDataTypes.None);\n const eventTypes = encodeBitMask(this.supportedEventTypes, undefined, EntryControlEventTypes.Caching);\n this.payload = Bytes.concat([\n [dataTypes.length],\n dataTypes,\n [eventTypes.length],\n eventTypes,\n [\n this.minKeyCacheSize,\n this.maxKeyCacheSize,\n this.minKeyCacheTimeout,\n this.maxKeyCacheTimeout,\n ],\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"supported data types\": this.supportedDataTypes\n .map((dt) => EntryControlDataTypes[dt])\n .toString(),\n \"supported event types\": this.supportedEventTypes\n .map((et) => EntryControlEventTypes[et])\n .toString(),\n \"min key cache size\": this.minKeyCacheSize,\n \"max key cache size\": this.maxKeyCacheSize,\n \"min key cache timeout\": this.minKeyCacheTimeout,\n \"max key cache timeout\": this.maxKeyCacheTimeout,\n },\n };\n }\n}\n@CCCommand(EntryControlCommand.EventSupportedGet)\n@expectedCCResponse(EntryControlCCEventSupportedReport)\nexport class EntryControlCCEventSupportedGet extends EntryControlCC {\n}\n// @publicAPI\nexport interface EntryControlCCConfigurationReportOptions {\n keyCacheSize: number;\n keyCacheTimeout: number;\n}\n@CCCommand(EntryControlCommand.ConfigurationReport)\n@ccValueProperty(\"keyCacheSize\", EntryControlCCValues.keyCacheSize)\n@ccValueProperty(\"keyCacheTimeout\", EntryControlCCValues.keyCacheTimeout)\nexport class EntryControlCCConfigurationReport extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCConfigurationReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.keyCacheSize = options.keyCacheSize;\n this.keyCacheTimeout = options.keyCacheTimeout;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCConfigurationReport {\n validatePayload(raw.payload.length >= 2);\n const keyCacheSize = raw.payload[0];\n validatePayload(keyCacheSize >= 1 && keyCacheSize <= 32);\n const keyCacheTimeout = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n keyCacheSize,\n keyCacheTimeout,\n });\n }\n public readonly keyCacheSize: number;\n public readonly keyCacheTimeout: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.keyCacheSize, this.keyCacheTimeout]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"key cache size\": this.keyCacheSize,\n \"key cache timeout\": this.keyCacheTimeout,\n },\n };\n }\n}\n@CCCommand(EntryControlCommand.ConfigurationGet)\n@expectedCCResponse(EntryControlCCConfigurationReport)\nexport class EntryControlCCConfigurationGet extends EntryControlCC {\n}\n// @publicAPI\nexport interface EntryControlCCConfigurationSetOptions {\n keyCacheSize: number;\n keyCacheTimeout: number;\n}\n@CCCommand(EntryControlCommand.ConfigurationSet)\n@useSupervision()\nexport class EntryControlCCConfigurationSet extends EntryControlCC {\n public constructor(options: WithAddress<EntryControlCCConfigurationSetOptions>) {\n super(options);\n this.keyCacheSize = options.keyCacheSize;\n this.keyCacheTimeout = options.keyCacheTimeout;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): EntryControlCCConfigurationSet {\n validatePayload(raw.payload.length >= 2);\n const keyCacheSize = raw.payload[0];\n validatePayload(keyCacheSize >= 1 && keyCacheSize <= 32);\n const keyCacheTimeout = raw.payload[1];\n return new this({\n nodeId: ctx.sourceNodeId,\n keyCacheSize,\n keyCacheTimeout,\n });\n }\n public readonly keyCacheSize: number;\n public readonly keyCacheTimeout: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.keyCacheSize, this.keyCacheTimeout]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"key cache size\": this.keyCacheSize,\n \"key cache timeout\": this.keyCacheTimeout,\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1114,9 +1114,9 @@ let IndicatorCCDescriptionReport = (() => {
|
|
|
1114
1114
|
static from(raw, ctx) {
|
|
1115
1115
|
(0, import_core.validatePayload)(raw.payload.length >= 2);
|
|
1116
1116
|
const indicatorId = raw.payload[0];
|
|
1117
|
-
const
|
|
1118
|
-
(0, import_core.validatePayload)(raw.payload.length >= 2 +
|
|
1119
|
-
const description = raw.payload.subarray(2, 2 +
|
|
1117
|
+
const descriptionLength = raw.payload[1];
|
|
1118
|
+
(0, import_core.validatePayload)(raw.payload.length >= 2 + descriptionLength);
|
|
1119
|
+
const description = (0, import_shared.stripControlCharacters)(raw.payload.subarray(2, 2 + descriptionLength).toString("utf8"), { keepNewlines: true });
|
|
1120
1120
|
return new this({
|
|
1121
1121
|
nodeId: ctx.sourceNodeId,
|
|
1122
1122
|
indicatorId,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src_gen/cc/IndicatorCC.ts"],
|
|
4
|
-
"sourcesContent": ["import * as __validateArgs from \"./IndicatorCC._validateArgs.js\";\nconst { validateArgs_IndicatorCCAPI_get, validateArgs_IndicatorCCAPI_set, validateArgs_IndicatorCCAPI_sendReport, validateArgs_IndicatorCCAPI_getSupported, validateArgs_IndicatorCCAPI_reportSupported, validateArgs_IndicatorCCAPI_reportDescription, validateArgs_IndicatorCCAPI_setTimeout, validateArgs_IndicatorCCAPI_getTimeout, validateArgs_IndicatorCCAPI_getDescription } = __validateArgs;\nimport { CommandClasses, type EndpointId, type GetValueDB, Indicator, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, type ValueID, ValueMetadata, type WithAddress, ZWaveError, ZWaveErrorCodes, encodeBitMask, getIndicatorProperty, parseBitMask, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, num2hex } from \"@zwave-js/shared\";\nimport { clamp, roundTo } from \"alcalzone-shared/math\";\nimport { isArray } from \"alcalzone-shared/typeguards\";\nimport { CCAPI, POLL_VALUE, type PollValueImplementation, SET_VALUE, type SetValueImplementation, throwUnsupportedProperty, 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, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { IndicatorCommand, type IndicatorTimeout } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nfunction isManufacturerDefinedIndicator(indicatorId: number): boolean {\n return indicatorId >= 0x80 && indicatorId <= 0x9f;\n}\nconst timeoutStringRegex = /^(?:(?<hoursStr>\\d+)h)?(?:(?<minutesStr>\\d+)m)?(?:(?<secondsStr>\\d+(?:\\.\\d+)?)s)?$/i;\nconst MAX_INDICATOR_OBJECTS = 31;\nfunction parseIndicatorTimeoutString(text: string): IndicatorTimeout | undefined {\n if (!text.length)\n return undefined;\n // Try to parse the numeric parts from a timeout\n const match = timeoutStringRegex.exec(text);\n if (!match)\n return undefined;\n const { hoursStr, minutesStr, secondsStr } = match.groups!;\n if (!hoursStr && !minutesStr && !secondsStr)\n return undefined;\n const ret: IndicatorTimeout = {};\n if (hoursStr) {\n ret.hours = clamp(parseInt(hoursStr, 10), 0, 255);\n }\n if (minutesStr) {\n ret.minutes = clamp(parseInt(minutesStr, 10), 0, 255);\n }\n if (secondsStr) {\n ret.seconds = clamp(roundTo(parseFloat(secondsStr), 2), 0, 59.99);\n }\n return ret;\n}\nfunction groupByIndicatorId(values: IndicatorObject[]): Map<number, IndicatorObject[]> {\n const ret = new Map();\n for (const value of values) {\n if (!ret.has(value.indicatorId)) {\n ret.set(value.indicatorId, []);\n }\n ret.get(value.indicatorId)!.push(value);\n }\n return ret;\n}\nfunction indicatorObjectsToTimeout(values: IndicatorObject[]): IndicatorTimeout | undefined {\n const timeoutValues = values.filter((v) => [0x0a, 0x06, 0x07, 0x08].includes(v.propertyId));\n if (!timeoutValues.length)\n return undefined;\n const hours = (timeoutValues.find((v) => v.propertyId === 0x0a)?.value\n ?? 0) as number;\n const minutes = (timeoutValues.find((v) => v.propertyId === 0x06)?.value\n ?? 0) as number;\n const seconds = clamp((timeoutValues.find((v) => v.propertyId === 0x07)?.value as number)\n ?? 0, 0, 59)\n + clamp((timeoutValues.find((v) => v.propertyId === 0x08)?.value as number)\n ?? 0, 0, 99)\n / 100;\n return {\n hours,\n minutes,\n seconds,\n };\n}\nimport { IndicatorCCValues } from \"./_CCValues.generated.js\";\nexport { IndicatorCCValues };\n/**\n * Looks up the configured metadata for the given indicator and property\n */\nfunction getIndicatorMetadata(indicatorId: Indicator, propertyId: number, overrideIndicatorLabel?: string): ValueMetadata {\n const label = getIndicatorLabel(indicatorId, propertyId, overrideIndicatorLabel);\n const prop = getIndicatorProperty(propertyId);\n const baseMetadata = IndicatorCCValues.valueV2(indicatorId, propertyId).meta;\n if (!prop) {\n return {\n ...baseMetadata,\n ...ValueMetadata.UInt8,\n label,\n };\n }\n else {\n if (prop.type === \"boolean\") {\n return {\n ...baseMetadata,\n ...ValueMetadata.Boolean,\n label,\n description: prop.description,\n readable: !prop.readonly,\n };\n }\n else {\n // UInt8\n return {\n ...baseMetadata,\n ...ValueMetadata.UInt8,\n label,\n description: prop.description,\n min: prop.min,\n max: prop.max,\n readable: !prop.readonly,\n };\n }\n }\n}\nfunction getIndicatorName(indicatorId: number | undefined): string {\n if (indicatorId) {\n return getEnumMemberName(Indicator, indicatorId);\n }\n else {\n return \"Default\";\n }\n}\n/** Returns a user-friendly label for an indicator */\nfunction getIndicatorLabel(indicatorId: number, propertyId: number, overrideIndicatorLabel?: string, overridePropertyLabel?: string): string {\n const defaultName = overrideIndicatorLabel || getIndicatorName(indicatorId);\n // Without a defined property, we cannot suggest a better label\n const prop = getIndicatorProperty(propertyId);\n if (!prop)\n return defaultName;\n // For indicators that correspond to an LCD or buttons,\n // the indicator enum names are enough\n if (indicatorId >= Indicator[\"LCD backlight\"]\n && indicatorId <= Indicator[\"Button 12 indication\"]\n && (propertyId === 0x01 /* Multilevel */\n || propertyId === 0x02 /* Binary */\n || overridePropertyLabel) // custom property label\n ) {\n let ret: string = (Indicator as any)[indicatorId];\n // Append the overridden property label if it exists\n if (overridePropertyLabel) {\n ret += ` - ${overridePropertyLabel}`;\n }\n return ret;\n }\n // Default to the current behavior of <indicator name> - <property label>\n return `${defaultName} - ${overridePropertyLabel || prop.label}`;\n}\nexport function shouldExposeIndicatorValue(indicatorId: number, propertyId: number): boolean {\n // Many possible indicator values are not suitable to be exposed as CC values,\n // usually because they need to be set in groups.\n // Indicator properties that should be exposed are marked as such\n const prop = getIndicatorProperty(propertyId);\n if (prop && !prop.exposeAsValue) {\n return false;\n }\n // Unless we know better, expose anyways\n return true;\n}\n@API(CommandClasses.Indicator)\nexport class IndicatorCCAPI extends CCAPI {\n public supportsCommand(cmd: IndicatorCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case IndicatorCommand.Get:\n case IndicatorCommand.Report:\n return this.isSinglecast();\n case IndicatorCommand.Set:\n return true; // This is mandatory\n case IndicatorCommand.SupportedGet:\n case IndicatorCommand.SupportedReport:\n return this.version >= 2 && this.isSinglecast();\n case IndicatorCommand.DescriptionGet:\n case IndicatorCommand.DescriptionReport:\n return this.version >= 4 && this.isSinglecast();\n }\n return super.supportsCommand(cmd);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: IndicatorCCAPI, { property, propertyKey }, value) {\n const valueId: ValueID = {\n commandClass: this.ccId,\n endpoint: this.endpoint.index,\n property,\n propertyKey,\n };\n if (property === \"value\") {\n // V1 value\n if (typeof value !== \"number\") {\n throwWrongValueType(this.ccId, property, \"number\", typeof value);\n }\n return this.set(value);\n }\n else if (IndicatorCCValues.valueV2.is(valueId)) {\n const indicatorId = property as number;\n const propertyId = propertyKey as number;\n const expectedType = getIndicatorMetadata(indicatorId, propertyId).type as \"number\" | \"boolean\";\n // V2+ value\n if (typeof value !== expectedType) {\n throwWrongValueType(this.ccId, property, expectedType, typeof value);\n }\n return this.set([\n {\n indicatorId,\n propertyId,\n value: value as any,\n },\n ]);\n }\n else if (IndicatorCCValues.timeout.is(valueId)) {\n const indicatorId = property as number;\n if (typeof value !== \"string\") {\n throwWrongValueType(this.ccId, property, \"string\", typeof value);\n }\n return this.setTimeout(indicatorId, value);\n }\n else if (IndicatorCCValues.identify.is(valueId)) {\n if (typeof value !== \"boolean\") {\n throwWrongValueType(this.ccId, property, \"boolean\", typeof value);\n }\n return this.identify();\n }\n else {\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: IndicatorCCAPI, { property }) {\n if (property === \"value\")\n return this.get();\n if (typeof property === \"number\") {\n return this.get(property);\n }\n throwUnsupportedProperty(this.ccId, property);\n };\n }\n @validateArgs_IndicatorCCAPI_get()\n public async get(indicatorId?: number): Promise<MaybeNotKnown<number | IndicatorObject[]>> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Get);\n const cc = new IndicatorCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n });\n const response = await this.host.sendCommand<IndicatorCCReport>(cc, this.commandOptions);\n if (!response)\n return;\n if (response.values)\n return response.values;\n return response.indicator0Value!;\n }\n @validateArgs_IndicatorCCAPI_set()\n public async set(value: number | IndicatorObject[]): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Set);\n if (this.version === 1 && typeof value !== \"number\") {\n throw new ZWaveError(`Node ${this.endpoint.nodeId as number} only supports IndicatorCC V1 which requires a single value to be set`, ZWaveErrorCodes.Argument_Invalid);\n }\n else if (this.version >= 2\n && isArray(value)\n && value.length > MAX_INDICATOR_OBJECTS) {\n throw new ZWaveError(`Only ${MAX_INDICATOR_OBJECTS} indicator values can be set at a time!`, ZWaveErrorCodes.Argument_Invalid);\n }\n const cc = new IndicatorCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...(typeof value === \"number\" ? { value } : { values: value }),\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_IndicatorCCAPI_sendReport()\n public async sendReport(options: IndicatorCCReportOptions): Promise<void> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Report);\n const cc = new IndicatorCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_IndicatorCCAPI_getSupported()\n public async getSupported(indicatorId: number): Promise<{\n indicatorId?: number;\n supportedProperties: readonly number[];\n nextIndicatorId: number;\n } | undefined> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.SupportedGet);\n const cc = new IndicatorCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n });\n const response = await this.host.sendCommand<IndicatorCCSupportedReport>(cc, this.commandOptions);\n if (response) {\n return {\n // Include the actual indicator ID if 0x00 was requested\n ...(indicatorId === 0x00\n ? { indicatorId: response.indicatorId }\n : undefined),\n supportedProperties: response.supportedProperties,\n nextIndicatorId: response.nextIndicatorId,\n };\n }\n }\n @validateArgs_IndicatorCCAPI_reportSupported()\n public async reportSupported(indicatorId: number, supportedProperties: readonly number[], nextIndicatorId: number): Promise<void> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.SupportedReport);\n const cc = new IndicatorCCSupportedReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n supportedProperties,\n nextIndicatorId,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_IndicatorCCAPI_reportDescription()\n public async reportDescription(indicatorId: number, description: string): Promise<void> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.DescriptionReport);\n const cc = new IndicatorCCDescriptionReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n description,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Instructs the node to identify itself. Available starting with V3 of this CC.\n */\n public async identify(): Promise<SupervisionResult | undefined> {\n if (this.version < 3) {\n throw new ZWaveError(`The identify command is only supported in Indicator CC version 3 and above`, ZWaveErrorCodes.CC_NotSupported);\n }\n return this.set([\n {\n indicatorId: 0x50,\n propertyId: 0x03,\n value: 0x08,\n },\n {\n indicatorId: 0x50,\n propertyId: 0x04,\n value: 0x03,\n },\n {\n indicatorId: 0x50,\n propertyId: 0x05,\n value: 0x06,\n },\n ]);\n }\n /**\n * Set a timeout for a given indicator ID after which the indicator will be turned off.\n * @param timeout The timeout in one of the supported forms:\n * \t- a timeout string in the form `12h18m17.59s`. All parts (hours, minutes, seconds, hundredths) are optional, but must be specified in this order. An empty string will be treated like `undefined`.\n * \t- an object specifying the timeout parts. An empty object will be treated like `undefined`.\n * \t- `undefined` to disable the timeout.\n */\n @validateArgs_IndicatorCCAPI_setTimeout()\n public async setTimeout(indicatorId: number, timeout: IndicatorTimeout | string | undefined): Promise<SupervisionResult | undefined> {\n this.assertPhysicalEndpoint(this.endpoint);\n if (this.version < 3) {\n throw new ZWaveError(`The setTimeout command is only supported in Indicator CC version 3 and above`, ZWaveErrorCodes.CC_NotSupported);\n }\n if (typeof timeout === \"string\") {\n if (timeout === \"\") {\n timeout = undefined;\n }\n else {\n const parsed = parseIndicatorTimeoutString(timeout);\n if (!parsed) {\n throw new ZWaveError(`The timeout string \"${timeout}\" is not valid`, ZWaveErrorCodes.Argument_Invalid);\n }\n timeout = parsed;\n }\n }\n const supportedPropertyIDs = IndicatorCC.getSupportedPropertyIDsCached(this.host, this.endpoint, indicatorId);\n const objects: IndicatorObject[] = [];\n if (timeout) {\n const hours = timeout.hours ?? 0;\n const minutes = timeout.minutes ?? 0;\n const seconds = Math.floor(timeout.seconds ?? 0);\n const hundredths = Math.round(((timeout.seconds ?? 0) % 1) * 100);\n if (hours) {\n if (!supportedPropertyIDs?.includes(0x0a)) {\n throw new ZWaveError(`The indicator ${indicatorId} does not support setting the timeout in hours`, ZWaveErrorCodes.Argument_Invalid);\n }\n objects.push({\n indicatorId,\n propertyId: 0x0a,\n value: hours,\n });\n }\n if (minutes) {\n if (!supportedPropertyIDs?.includes(0x06)) {\n throw new ZWaveError(`The indicator ${indicatorId} does not support setting the timeout in minutes`, ZWaveErrorCodes.Argument_Invalid);\n }\n objects.push({\n indicatorId,\n propertyId: 0x06,\n value: minutes,\n });\n }\n if (seconds) {\n if (!supportedPropertyIDs?.includes(0x07)) {\n throw new ZWaveError(`The indicator ${indicatorId} does not support setting the timeout in seconds`, ZWaveErrorCodes.Argument_Invalid);\n }\n objects.push({\n indicatorId,\n propertyId: 0x07,\n value: seconds,\n });\n }\n if (hundredths) {\n if (!supportedPropertyIDs?.includes(0x08)) {\n throw new ZWaveError(`The indicator ${indicatorId} does not support setting the timeout in 1/100 seconds`, ZWaveErrorCodes.Argument_Invalid);\n }\n objects.push({\n indicatorId,\n propertyId: 0x08,\n value: hundredths,\n });\n }\n }\n if (!objects.length) {\n objects.push(...(supportedPropertyIDs ?? []).map((p) => ({\n indicatorId,\n propertyId: p,\n value: 0,\n })));\n }\n return this.set(objects);\n }\n /**\n * Returns the timeout after which the given indicator will be turned off.\n */\n @validateArgs_IndicatorCCAPI_getTimeout()\n public async getTimeout(indicatorId: number): Promise<MaybeNotKnown<IndicatorTimeout>> {\n const values = await this.get(indicatorId);\n if (!isArray(values))\n return;\n return indicatorObjectsToTimeout(values);\n }\n @validateArgs_IndicatorCCAPI_getDescription()\n public async getDescription(indicatorId: number): Promise<MaybeNotKnown<string>> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.DescriptionGet);\n const cc = new IndicatorCCDescriptionGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n });\n const response = await this.host.sendCommand<IndicatorCCDescriptionReport>(cc, this.commandOptions);\n return response?.description;\n }\n}\n@commandClass(CommandClasses.Indicator)\n@implementedVersion(4)\n@ccValues(IndicatorCCValues)\nexport class IndicatorCC extends CommandClass {\n declare ccCommand: IndicatorCommand;\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.Indicator, 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 if (api.version > 1) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"scanning supported indicator IDs...\",\n direction: \"outbound\",\n });\n // Query ID 0 to get the first supported ID\n let curId = 0x00;\n const supportedIndicatorIds: number[] = [];\n do {\n const supportedResponse = await api.getSupported(curId);\n if (!supportedResponse) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Time out while scanning supported indicator IDs, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n if (supportedResponse.supportedProperties.length > 0) {\n supportedIndicatorIds.push(supportedResponse.indicatorId ?? curId);\n }\n curId = supportedResponse.nextIndicatorId;\n } while (curId !== 0x00);\n // The IDs are not stored by the report CCs so store them here once we have all of them\n this.setValue(ctx, IndicatorCCValues.supportedIndicatorIds, supportedIndicatorIds);\n const logMessage = `supported indicator IDs: ${supportedIndicatorIds.join(\", \")}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n if (api.version >= 4) {\n const manufacturerDefinedIndicatorIds = supportedIndicatorIds.filter((id) => isManufacturerDefinedIndicator(id));\n if (manufacturerDefinedIndicatorIds.length > 0) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"retrieving description for manufacturer-defined indicator IDs...\",\n direction: \"outbound\",\n });\n for (const [i, id,] of manufacturerDefinedIndicatorIds.entries()) {\n await api.getDescription(id);\n node.reportInterviewProgress(i + 1, manufacturerDefinedIndicatorIds.length);\n }\n }\n }\n }\n // Query current values\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.Indicator, ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n if (api.version === 1) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"requesting current indicator value...\",\n direction: \"outbound\",\n });\n await api.get();\n }\n else {\n const supportedIndicatorIds: number[] = this.getValue(ctx, IndicatorCCValues.supportedIndicatorIds)\n ?? [];\n for (const [i, indicatorId] of supportedIndicatorIds.entries()) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `requesting current indicator value (id = ${num2hex(indicatorId)})...`,\n direction: \"outbound\",\n });\n await api.get(indicatorId);\n options?.onProgress?.(i + 1, supportedIndicatorIds.length);\n }\n }\n }\n public translatePropertyKey(ctx: GetValueDB, property: string | number, propertyKey: string | number): string | undefined {\n if (property === \"value\") {\n // CC version 1 only has a single value that doesn't need to be translated\n return undefined;\n }\n else if (typeof property === \"number\"\n && typeof propertyKey === \"number\") {\n // The indicator property is our property key\n const prop = getIndicatorProperty(propertyKey);\n if (prop)\n return prop.label;\n }\n else if (typeof property === \"number\" && propertyKey === \"timeout\") {\n return \"Timeout\";\n }\n return super.translatePropertyKey(ctx, property, propertyKey);\n }\n public translateProperty(ctx: GetValueDB, property: string | number, propertyKey?: string | number): string {\n if (typeof property === \"number\") {\n if (typeof propertyKey === \"number\" || propertyKey === \"timeout\") {\n // The indicator corresponds to our property\n if (property in Indicator)\n return Indicator[property];\n }\n }\n return super.translateProperty(ctx, property, propertyKey);\n }\n protected supportsV2Indicators(ctx: GetValueDB): boolean {\n // First test if there are any indicator ids defined\n const supportedIndicatorIds = this.getValue<number[]>(ctx, IndicatorCCValues.supportedIndicatorIds);\n if (!supportedIndicatorIds?.length)\n return false;\n // Then test if there are any property ids defined\n return supportedIndicatorIds.some((indicatorId) => !!this.getValue<number[]>(ctx, IndicatorCCValues.supportedPropertyIDs(indicatorId))?.length);\n }\n protected getManufacturerDefinedIndicatorLabel(ctx: GetValueDB, indicatorId: number): string | undefined {\n if (isManufacturerDefinedIndicator(indicatorId)) {\n return this.getValue(ctx, IndicatorCCValues.indicatorDescription(indicatorId));\n }\n }\n public static getSupportedPropertyIDsCached(ctx: GetValueDB, endpoint: EndpointId, indicatorId: number): MaybeNotKnown<number[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(IndicatorCCValues.supportedPropertyIDs(indicatorId).endpoint(endpoint.index));\n }\n}\n// @publicAPI\nexport interface IndicatorObject {\n indicatorId: number;\n propertyId: number;\n value: number | boolean;\n}\n// @publicAPI\nexport type IndicatorCCSetOptions = {\n value: number;\n} | {\n values: IndicatorObject[];\n};\n@CCCommand(IndicatorCommand.Set)\n@useSupervision()\nexport class IndicatorCCSet extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCSetOptions>) {\n super(options);\n if (\"value\" in options) {\n this.indicator0Value = options.value;\n }\n else {\n this.values = options.values;\n }\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCSet {\n validatePayload(raw.payload.length >= 1);\n const objCount = raw.payload.length >= 2 ? raw.payload[1] & 0b11111 : 0;\n if (objCount === 0) {\n const indicator0Value = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n value: indicator0Value,\n });\n }\n validatePayload(raw.payload.length >= 2 + 3 * objCount);\n const values: IndicatorObject[] = [];\n for (let i = 0; i < objCount; i++) {\n const offset = 2 + 3 * i;\n const value: IndicatorObject = {\n indicatorId: raw.payload[offset],\n propertyId: raw.payload[offset + 1],\n value: raw.payload[offset + 2],\n };\n values.push(value);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n values,\n });\n }\n public indicator0Value: number | undefined;\n public values: IndicatorObject[] | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.values != undefined) {\n // V2+\n this.payload = Bytes.alloc(2 + 3 * this.values.length, 0);\n // Byte 0 is the legacy value\n const objCount = this.values.length & MAX_INDICATOR_OBJECTS;\n this.payload[1] = objCount;\n for (let i = 0; i < objCount; i++) {\n const offset = 2 + 3 * i;\n this.payload[offset] = this.values[i].indicatorId;\n this.payload[offset + 1] = this.values[i].propertyId;\n const value = this.values[i].value;\n this.payload[offset + 2] =\n value === true ? 0xff : value === false ? 0x00 : value;\n }\n }\n else {\n // V1\n this.payload = Bytes.from([this.indicator0Value ?? 0]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n if (this.indicator0Value != undefined) {\n message[\"indicator 0 value\"] = this.indicator0Value;\n }\n if (this.values != undefined) {\n message.values = this.values\n .map((v) => `\n\u00B7 indicatorId: ${v.indicatorId}\n propertyId: ${v.propertyId}\n value: ${v.value}`)\n .join(\"\");\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport type IndicatorCCReportOptions = {\n value: number;\n} | {\n values: IndicatorObject[];\n};\n@CCCommand(IndicatorCommand.Report)\nexport class IndicatorCCReport extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCReportOptions>) {\n super(options);\n if (\"value\" in options) {\n this.indicator0Value = options.value;\n }\n else if (\"values\" in options) {\n if (options.values.length > MAX_INDICATOR_OBJECTS) {\n throw new ZWaveError(`Only ${MAX_INDICATOR_OBJECTS} indicator values can be set at a time!`, ZWaveErrorCodes.Argument_Invalid);\n }\n this.values = options.values;\n }\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCReport {\n validatePayload(raw.payload.length >= 1);\n const objCount = raw.payload.length >= 2 ? raw.payload[1] & 0b11111 : 0;\n if (objCount === 0) {\n const indicator0Value = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n value: indicator0Value,\n });\n }\n validatePayload(raw.payload.length >= 2 + 3 * objCount);\n const values: IndicatorObject[] = [];\n for (let i = 0; i < objCount; i++) {\n const offset = 2 + 3 * i;\n const value: IndicatorObject = {\n indicatorId: raw.payload[offset],\n propertyId: raw.payload[offset + 1],\n value: raw.payload[offset + 2],\n };\n values.push(value);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n values,\n });\n // TODO: Think if we want this:\n // // If not all Property IDs are included in the command for the actual Indicator ID,\n // // a controlling node MUST assume non-specified Property IDs values to be 0x00.\n // const indicatorId = this.values[0].indicatorId;\n // const supportedIndicatorProperties =\n // \tvalueDB.getValue<number[]>(\n // \t\tgetSupportedPropertyIDsValueID(\n // \t\t\tthis.endpointIndex,\n // \t\t\tindicatorId,\n // \t\t),\n // \t) ?? [];\n // // Find out which ones are missing\n // const missingIndicatorProperties = supportedIndicatorProperties.filter(\n // \tprop =>\n // \t\t!this.values!.find(({ propertyId }) => prop === propertyId),\n // );\n // // And assume they are 0 (false)\n // for (const missing of missingIndicatorProperties) {\n // \tthis.setIndicatorValue({\n // \t\tindicatorId,\n // \t\tpropertyId: missing,\n // \t\tvalue: 0,\n // \t});\n // }\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // Indicator objects only exist in V2+ reports, the timeout properties in V3+.\n // Ignore them if the device advertises a lower version.\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (this.indicator0Value != undefined) {\n if (!this.supportsV2Indicators(ctx)) {\n // Publish the value\n const valueV1 = IndicatorCCValues.valueV1;\n this.setMetadata(ctx, valueV1);\n this.setValue(ctx, valueV1, this.indicator0Value);\n }\n else {\n if (this.isSinglecast()) {\n // Don't!\n ctx.logNode(this.nodeId, {\n message: `ignoring V1 indicator report because the node supports V2 indicators`,\n direction: \"none\",\n endpoint: this.endpointIndex,\n });\n }\n }\n }\n else if (this.values && ccVersion >= 2) {\n // Store the simple values first\n for (const value of this.values) {\n this.setIndicatorValue(ctx, value);\n }\n // Then group values into the convenience properties\n const groupedValues = groupByIndicatorId(this.values);\n for (const [indicatorId, values] of groupedValues) {\n // Some devices report all properties it supports in every report,\n // even if it does not support all properties for the given indicator ID.\n // To avoid confusion, we need to filter out the unsupported properties\n const supportedPropertyIDs = this.getValue<number[]>(ctx, IndicatorCCValues.supportedPropertyIDs(indicatorId)) ?? [];\n const filteredValues = values.filter((v) => supportedPropertyIDs.includes(v.propertyId));\n const overrideIndicatorLabel = this.getManufacturerDefinedIndicatorLabel(ctx, indicatorId);\n // ... timeout\n const timeout = indicatorObjectsToTimeout(filteredValues);\n if (timeout && ccVersion >= 3) {\n let timeoutString = \"\";\n if (timeout?.hours)\n timeoutString += `${timeout.hours}h`;\n if (timeout?.minutes) {\n timeoutString += `${timeout.minutes}m`;\n }\n if (timeout?.seconds) {\n timeoutString += `${timeout.seconds}s`;\n }\n const timeoutValue = IndicatorCCValues.timeout(indicatorId);\n const metadata: ValueMetadata = {\n ...timeoutValue.meta,\n label: getIndicatorLabel(indicatorId, 0x06, // This is actually ignored, but pass a valid ID for clarity\n overrideIndicatorLabel, \"Timeout\"),\n };\n this.setMetadata(ctx, timeoutValue, metadata);\n this.setValue(ctx, timeoutValue, timeoutString);\n }\n }\n }\n return true;\n }\n public readonly indicator0Value: number | undefined;\n public readonly values: IndicatorObject[] | undefined;\n private setIndicatorValue(ctx: GetValueDB, value: IndicatorObject): void {\n // Manufacturer-defined indicators may need a custom label\n const overrideIndicatorLabel = this.getManufacturerDefinedIndicatorLabel(ctx, value.indicatorId);\n const metadata = getIndicatorMetadata(value.indicatorId, value.propertyId, overrideIndicatorLabel);\n // Some values need to be converted\n if (metadata.type === \"boolean\") {\n value.value = !!value.value;\n }\n // Only expose the value if it should be user-facing\n if (value.indicatorId === Indicator[\"Node Identify\"]) {\n return;\n }\n const prop = getIndicatorProperty(value.propertyId);\n if (!prop?.exposeAsValue)\n return;\n // And only if it is actually supported and not just reported by accident\n const supportedPropertyIDs = this.getValue<number[]>(ctx, IndicatorCCValues.supportedPropertyIDs(value.indicatorId)) ?? [];\n if (!supportedPropertyIDs.includes(value.propertyId))\n return;\n // Publish the value\n const valueV2 = IndicatorCCValues.valueV2(value.indicatorId, value.propertyId);\n this.setMetadata(ctx, valueV2, metadata);\n this.setValue(ctx, valueV2, value.value);\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.values != undefined) {\n // V2+\n this.payload = Bytes.alloc(2 + 3 * this.values.length, 0);\n // Byte 0 is the legacy value\n const objCount = this.values.length & MAX_INDICATOR_OBJECTS;\n this.payload[1] = objCount;\n for (let i = 0; i < objCount; i++) {\n const offset = 2 + 3 * i;\n this.payload[offset] = this.values[i].indicatorId;\n this.payload[offset + 1] = this.values[i].propertyId;\n const value = this.values[i].value;\n this.payload[offset + 2] =\n value === true ? 0xff : value === false ? 0x00 : value;\n }\n }\n else {\n // V1\n this.payload = Bytes.from([this.indicator0Value ?? 0]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n if (this.indicator0Value != undefined) {\n message[\"indicator 0 value\"] = this.indicator0Value;\n }\n if (this.values != undefined) {\n message.values = this.values\n .map((v) => `\n\u00B7 indicatorId: ${v.indicatorId}\n propertyId: ${v.propertyId}\n value: ${v.value}`)\n .join(\"\");\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCGetOptions {\n indicatorId?: number;\n}\n@CCCommand(IndicatorCommand.Get)\n@expectedCCResponse(IndicatorCCReport)\nexport class IndicatorCCGet extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCGetOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCGet {\n let indicatorId: number | undefined;\n if (raw.payload.length > 0) {\n indicatorId = raw.payload[0];\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n });\n }\n public indicatorId: number | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.indicatorId != undefined) {\n this.payload = Bytes.from([this.indicatorId]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n indicator: getIndicatorName(this.indicatorId),\n },\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCSupportedReportOptions {\n indicatorId: number;\n nextIndicatorId: number;\n supportedProperties: readonly number[];\n}\n@CCCommand(IndicatorCommand.SupportedReport)\nexport class IndicatorCCSupportedReport extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCSupportedReportOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n this.nextIndicatorId = options.nextIndicatorId;\n this.supportedProperties = options.supportedProperties;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCSupportedReport {\n validatePayload(raw.payload.length >= 3);\n const indicatorId = raw.payload[0];\n const nextIndicatorId = raw.payload[1];\n const bitMaskLength = raw.payload[2] & 0b11111;\n let supportedProperties: readonly number[];\n if (bitMaskLength === 0) {\n supportedProperties = [];\n }\n else {\n validatePayload(raw.payload.length >= 3 + bitMaskLength);\n // The bit mask starts at 0, but bit 0 is not used\n supportedProperties = parseBitMask(raw.payload.subarray(3, 3 + bitMaskLength), 0).filter((v) => v !== 0);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n nextIndicatorId,\n supportedProperties,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n if (this.indicatorId !== 0x00) {\n // Remember which property IDs are supported\n this.setValue(ctx, IndicatorCCValues.supportedPropertyIDs(this.indicatorId), this.supportedProperties);\n }\n return true;\n }\n public readonly indicatorId: number;\n public readonly nextIndicatorId: number;\n public readonly supportedProperties: readonly number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const bitmask = this.supportedProperties.length > 0\n ? encodeBitMask(this.supportedProperties, undefined, 0)\n : new Bytes();\n this.payload = Bytes.concat([\n [this.indicatorId, this.nextIndicatorId, bitmask.length],\n bitmask,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n indicator: getIndicatorName(this.indicatorId),\n \"supported properties\": this.supportedProperties\n .map((id) => getIndicatorProperty(id)?.label\n ?? `Unknown (${num2hex(id)})`)\n .join(\", \"),\n \"next indicator\": getIndicatorName(this.nextIndicatorId),\n },\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCSupportedGetOptions {\n indicatorId: number;\n}\nfunction testResponseForIndicatorSupportedGet(sent: IndicatorCCSupportedGet, received: IndicatorCCSupportedReport) {\n return sent.indicatorId === 0 || received.indicatorId === sent.indicatorId;\n}\n@CCCommand(IndicatorCommand.SupportedGet)\n@expectedCCResponse(IndicatorCCSupportedReport, testResponseForIndicatorSupportedGet)\nexport class IndicatorCCSupportedGet extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCSupportedGetOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCSupportedGet {\n validatePayload(raw.payload.length >= 1);\n const indicatorId = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n });\n }\n public indicatorId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.indicatorId]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n indicator: getIndicatorName(this.indicatorId),\n },\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCDescriptionReportOptions {\n indicatorId: number;\n description: string;\n}\n@CCCommand(IndicatorCommand.DescriptionReport)\nexport class IndicatorCCDescriptionReport extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCDescriptionReportOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n this.description = options.description;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCDescriptionReport {\n validatePayload(raw.payload.length >= 2);\n const indicatorId = raw.payload[0];\n const descrptionLength = raw.payload[1];\n validatePayload(raw.payload.length >= 2 + descrptionLength);\n const description: string = raw.payload\n .subarray(2, 2 + descrptionLength)\n .toString(\"utf8\");\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n description,\n });\n }\n public indicatorId: number;\n public description: string;\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // This command only exists in V4. Ignore it if the device advertises a lower version.\n if (this.description && getEffectiveCCVersion(ctx, this) >= 4) {\n this.setValue(ctx, IndicatorCCValues.indicatorDescription(this.indicatorId), this.description);\n }\n return true;\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const description = Bytes.from(this.description, \"utf8\");\n this.payload = Bytes.concat([\n [this.indicatorId, description.length],\n description,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"indicator ID\": this.indicatorId,\n description: this.description || \"(none)\",\n },\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCDescriptionGetOptions {\n indicatorId: number;\n}\nfunction testResponseForIndicatorDescriptionGet(sent: IndicatorCCDescriptionGet, received: IndicatorCCDescriptionReport) {\n return received.indicatorId === sent.indicatorId;\n}\n@CCCommand(IndicatorCommand.DescriptionGet)\n@expectedCCResponse(IndicatorCCDescriptionReport, testResponseForIndicatorDescriptionGet)\nexport class IndicatorCCDescriptionGet extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCDescriptionGetOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCDescriptionGet {\n validatePayload(raw.payload.length >= 1);\n const indicatorId = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n });\n }\n public indicatorId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.indicatorId]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"indicator ID\": this.indicatorId,\n },\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import * as __validateArgs from \"./IndicatorCC._validateArgs.js\";\nconst { validateArgs_IndicatorCCAPI_get, validateArgs_IndicatorCCAPI_set, validateArgs_IndicatorCCAPI_sendReport, validateArgs_IndicatorCCAPI_getSupported, validateArgs_IndicatorCCAPI_reportSupported, validateArgs_IndicatorCCAPI_reportDescription, validateArgs_IndicatorCCAPI_setTimeout, validateArgs_IndicatorCCAPI_getTimeout, validateArgs_IndicatorCCAPI_getDescription } = __validateArgs;\nimport { CommandClasses, type EndpointId, type GetValueDB, Indicator, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type MessageRecord, type SupervisionResult, type ValueID, ValueMetadata, type WithAddress, ZWaveError, ZWaveErrorCodes, encodeBitMask, getIndicatorProperty, parseBitMask, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes, stripControlCharacters, getEnumMemberName, num2hex, } from \"@zwave-js/shared\";\nimport { clamp, roundTo } from \"alcalzone-shared/math\";\nimport { isArray } from \"alcalzone-shared/typeguards\";\nimport { CCAPI, POLL_VALUE, type PollValueImplementation, SET_VALUE, type SetValueImplementation, throwUnsupportedProperty, 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, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { IndicatorCommand, type IndicatorTimeout } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nfunction isManufacturerDefinedIndicator(indicatorId: number): boolean {\n return indicatorId >= 0x80 && indicatorId <= 0x9f;\n}\nconst timeoutStringRegex = /^(?:(?<hoursStr>\\d+)h)?(?:(?<minutesStr>\\d+)m)?(?:(?<secondsStr>\\d+(?:\\.\\d+)?)s)?$/i;\nconst MAX_INDICATOR_OBJECTS = 31;\nfunction parseIndicatorTimeoutString(text: string): IndicatorTimeout | undefined {\n if (!text.length)\n return undefined;\n // Try to parse the numeric parts from a timeout\n const match = timeoutStringRegex.exec(text);\n if (!match)\n return undefined;\n const { hoursStr, minutesStr, secondsStr } = match.groups!;\n if (!hoursStr && !minutesStr && !secondsStr)\n return undefined;\n const ret: IndicatorTimeout = {};\n if (hoursStr) {\n ret.hours = clamp(parseInt(hoursStr, 10), 0, 255);\n }\n if (minutesStr) {\n ret.minutes = clamp(parseInt(minutesStr, 10), 0, 255);\n }\n if (secondsStr) {\n ret.seconds = clamp(roundTo(parseFloat(secondsStr), 2), 0, 59.99);\n }\n return ret;\n}\nfunction groupByIndicatorId(values: IndicatorObject[]): Map<number, IndicatorObject[]> {\n const ret = new Map();\n for (const value of values) {\n if (!ret.has(value.indicatorId)) {\n ret.set(value.indicatorId, []);\n }\n ret.get(value.indicatorId)!.push(value);\n }\n return ret;\n}\nfunction indicatorObjectsToTimeout(values: IndicatorObject[]): IndicatorTimeout | undefined {\n const timeoutValues = values.filter((v) => [0x0a, 0x06, 0x07, 0x08].includes(v.propertyId));\n if (!timeoutValues.length)\n return undefined;\n const hours = (timeoutValues.find((v) => v.propertyId === 0x0a)?.value\n ?? 0) as number;\n const minutes = (timeoutValues.find((v) => v.propertyId === 0x06)?.value\n ?? 0) as number;\n const seconds = clamp((timeoutValues.find((v) => v.propertyId === 0x07)?.value as number)\n ?? 0, 0, 59)\n + clamp((timeoutValues.find((v) => v.propertyId === 0x08)?.value as number)\n ?? 0, 0, 99)\n / 100;\n return {\n hours,\n minutes,\n seconds,\n };\n}\nimport { IndicatorCCValues } from \"./_CCValues.generated.js\";\nexport { IndicatorCCValues };\n/**\n * Looks up the configured metadata for the given indicator and property\n */\nfunction getIndicatorMetadata(indicatorId: Indicator, propertyId: number, overrideIndicatorLabel?: string): ValueMetadata {\n const label = getIndicatorLabel(indicatorId, propertyId, overrideIndicatorLabel);\n const prop = getIndicatorProperty(propertyId);\n const baseMetadata = IndicatorCCValues.valueV2(indicatorId, propertyId).meta;\n if (!prop) {\n return {\n ...baseMetadata,\n ...ValueMetadata.UInt8,\n label,\n };\n }\n else {\n if (prop.type === \"boolean\") {\n return {\n ...baseMetadata,\n ...ValueMetadata.Boolean,\n label,\n description: prop.description,\n readable: !prop.readonly,\n };\n }\n else {\n // UInt8\n return {\n ...baseMetadata,\n ...ValueMetadata.UInt8,\n label,\n description: prop.description,\n min: prop.min,\n max: prop.max,\n readable: !prop.readonly,\n };\n }\n }\n}\nfunction getIndicatorName(indicatorId: number | undefined): string {\n if (indicatorId) {\n return getEnumMemberName(Indicator, indicatorId);\n }\n else {\n return \"Default\";\n }\n}\n/** Returns a user-friendly label for an indicator */\nfunction getIndicatorLabel(indicatorId: number, propertyId: number, overrideIndicatorLabel?: string, overridePropertyLabel?: string): string {\n const defaultName = overrideIndicatorLabel || getIndicatorName(indicatorId);\n // Without a defined property, we cannot suggest a better label\n const prop = getIndicatorProperty(propertyId);\n if (!prop)\n return defaultName;\n // For indicators that correspond to an LCD or buttons,\n // the indicator enum names are enough\n if (indicatorId >= Indicator[\"LCD backlight\"]\n && indicatorId <= Indicator[\"Button 12 indication\"]\n && (propertyId === 0x01 /* Multilevel */\n || propertyId === 0x02 /* Binary */\n || overridePropertyLabel) // custom property label\n ) {\n let ret: string = (Indicator as any)[indicatorId];\n // Append the overridden property label if it exists\n if (overridePropertyLabel) {\n ret += ` - ${overridePropertyLabel}`;\n }\n return ret;\n }\n // Default to the current behavior of <indicator name> - <property label>\n return `${defaultName} - ${overridePropertyLabel || prop.label}`;\n}\nexport function shouldExposeIndicatorValue(indicatorId: number, propertyId: number): boolean {\n // Many possible indicator values are not suitable to be exposed as CC values,\n // usually because they need to be set in groups.\n // Indicator properties that should be exposed are marked as such\n const prop = getIndicatorProperty(propertyId);\n if (prop && !prop.exposeAsValue) {\n return false;\n }\n // Unless we know better, expose anyways\n return true;\n}\n@API(CommandClasses.Indicator)\nexport class IndicatorCCAPI extends CCAPI {\n public supportsCommand(cmd: IndicatorCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case IndicatorCommand.Get:\n case IndicatorCommand.Report:\n return this.isSinglecast();\n case IndicatorCommand.Set:\n return true; // This is mandatory\n case IndicatorCommand.SupportedGet:\n case IndicatorCommand.SupportedReport:\n return this.version >= 2 && this.isSinglecast();\n case IndicatorCommand.DescriptionGet:\n case IndicatorCommand.DescriptionReport:\n return this.version >= 4 && this.isSinglecast();\n }\n return super.supportsCommand(cmd);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: IndicatorCCAPI, { property, propertyKey }, value) {\n const valueId: ValueID = {\n commandClass: this.ccId,\n endpoint: this.endpoint.index,\n property,\n propertyKey,\n };\n if (property === \"value\") {\n // V1 value\n if (typeof value !== \"number\") {\n throwWrongValueType(this.ccId, property, \"number\", typeof value);\n }\n return this.set(value);\n }\n else if (IndicatorCCValues.valueV2.is(valueId)) {\n const indicatorId = property as number;\n const propertyId = propertyKey as number;\n const expectedType = getIndicatorMetadata(indicatorId, propertyId).type as \"number\" | \"boolean\";\n // V2+ value\n if (typeof value !== expectedType) {\n throwWrongValueType(this.ccId, property, expectedType, typeof value);\n }\n return this.set([\n {\n indicatorId,\n propertyId,\n value: value as any,\n },\n ]);\n }\n else if (IndicatorCCValues.timeout.is(valueId)) {\n const indicatorId = property as number;\n if (typeof value !== \"string\") {\n throwWrongValueType(this.ccId, property, \"string\", typeof value);\n }\n return this.setTimeout(indicatorId, value);\n }\n else if (IndicatorCCValues.identify.is(valueId)) {\n if (typeof value !== \"boolean\") {\n throwWrongValueType(this.ccId, property, \"boolean\", typeof value);\n }\n return this.identify();\n }\n else {\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: IndicatorCCAPI, { property }) {\n if (property === \"value\")\n return this.get();\n if (typeof property === \"number\") {\n return this.get(property);\n }\n throwUnsupportedProperty(this.ccId, property);\n };\n }\n @validateArgs_IndicatorCCAPI_get()\n public async get(indicatorId?: number): Promise<MaybeNotKnown<number | IndicatorObject[]>> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Get);\n const cc = new IndicatorCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n });\n const response = await this.host.sendCommand<IndicatorCCReport>(cc, this.commandOptions);\n if (!response)\n return;\n if (response.values)\n return response.values;\n return response.indicator0Value!;\n }\n @validateArgs_IndicatorCCAPI_set()\n public async set(value: number | IndicatorObject[]): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Set);\n if (this.version === 1 && typeof value !== \"number\") {\n throw new ZWaveError(`Node ${this.endpoint.nodeId as number} only supports IndicatorCC V1 which requires a single value to be set`, ZWaveErrorCodes.Argument_Invalid);\n }\n else if (this.version >= 2\n && isArray(value)\n && value.length > MAX_INDICATOR_OBJECTS) {\n throw new ZWaveError(`Only ${MAX_INDICATOR_OBJECTS} indicator values can be set at a time!`, ZWaveErrorCodes.Argument_Invalid);\n }\n const cc = new IndicatorCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...(typeof value === \"number\" ? { value } : { values: value }),\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_IndicatorCCAPI_sendReport()\n public async sendReport(options: IndicatorCCReportOptions): Promise<void> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Report);\n const cc = new IndicatorCCReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n ...options,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_IndicatorCCAPI_getSupported()\n public async getSupported(indicatorId: number): Promise<{\n indicatorId?: number;\n supportedProperties: readonly number[];\n nextIndicatorId: number;\n } | undefined> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.SupportedGet);\n const cc = new IndicatorCCSupportedGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n });\n const response = await this.host.sendCommand<IndicatorCCSupportedReport>(cc, this.commandOptions);\n if (response) {\n return {\n // Include the actual indicator ID if 0x00 was requested\n ...(indicatorId === 0x00\n ? { indicatorId: response.indicatorId }\n : undefined),\n supportedProperties: response.supportedProperties,\n nextIndicatorId: response.nextIndicatorId,\n };\n }\n }\n @validateArgs_IndicatorCCAPI_reportSupported()\n public async reportSupported(indicatorId: number, supportedProperties: readonly number[], nextIndicatorId: number): Promise<void> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.SupportedReport);\n const cc = new IndicatorCCSupportedReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n supportedProperties,\n nextIndicatorId,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n @validateArgs_IndicatorCCAPI_reportDescription()\n public async reportDescription(indicatorId: number, description: string): Promise<void> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.DescriptionReport);\n const cc = new IndicatorCCDescriptionReport({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n description,\n });\n await this.host.sendCommand(cc, this.commandOptions);\n }\n /**\n * Instructs the node to identify itself. Available starting with V3 of this CC.\n */\n public async identify(): Promise<SupervisionResult | undefined> {\n if (this.version < 3) {\n throw new ZWaveError(`The identify command is only supported in Indicator CC version 3 and above`, ZWaveErrorCodes.CC_NotSupported);\n }\n return this.set([\n {\n indicatorId: 0x50,\n propertyId: 0x03,\n value: 0x08,\n },\n {\n indicatorId: 0x50,\n propertyId: 0x04,\n value: 0x03,\n },\n {\n indicatorId: 0x50,\n propertyId: 0x05,\n value: 0x06,\n },\n ]);\n }\n /**\n * Set a timeout for a given indicator ID after which the indicator will be turned off.\n * @param timeout The timeout in one of the supported forms:\n * \t- a timeout string in the form `12h18m17.59s`. All parts (hours, minutes, seconds, hundredths) are optional, but must be specified in this order. An empty string will be treated like `undefined`.\n * \t- an object specifying the timeout parts. An empty object will be treated like `undefined`.\n * \t- `undefined` to disable the timeout.\n */\n @validateArgs_IndicatorCCAPI_setTimeout()\n public async setTimeout(indicatorId: number, timeout: IndicatorTimeout | string | undefined): Promise<SupervisionResult | undefined> {\n this.assertPhysicalEndpoint(this.endpoint);\n if (this.version < 3) {\n throw new ZWaveError(`The setTimeout command is only supported in Indicator CC version 3 and above`, ZWaveErrorCodes.CC_NotSupported);\n }\n if (typeof timeout === \"string\") {\n if (timeout === \"\") {\n timeout = undefined;\n }\n else {\n const parsed = parseIndicatorTimeoutString(timeout);\n if (!parsed) {\n throw new ZWaveError(`The timeout string \"${timeout}\" is not valid`, ZWaveErrorCodes.Argument_Invalid);\n }\n timeout = parsed;\n }\n }\n const supportedPropertyIDs = IndicatorCC.getSupportedPropertyIDsCached(this.host, this.endpoint, indicatorId);\n const objects: IndicatorObject[] = [];\n if (timeout) {\n const hours = timeout.hours ?? 0;\n const minutes = timeout.minutes ?? 0;\n const seconds = Math.floor(timeout.seconds ?? 0);\n const hundredths = Math.round(((timeout.seconds ?? 0) % 1) * 100);\n if (hours) {\n if (!supportedPropertyIDs?.includes(0x0a)) {\n throw new ZWaveError(`The indicator ${indicatorId} does not support setting the timeout in hours`, ZWaveErrorCodes.Argument_Invalid);\n }\n objects.push({\n indicatorId,\n propertyId: 0x0a,\n value: hours,\n });\n }\n if (minutes) {\n if (!supportedPropertyIDs?.includes(0x06)) {\n throw new ZWaveError(`The indicator ${indicatorId} does not support setting the timeout in minutes`, ZWaveErrorCodes.Argument_Invalid);\n }\n objects.push({\n indicatorId,\n propertyId: 0x06,\n value: minutes,\n });\n }\n if (seconds) {\n if (!supportedPropertyIDs?.includes(0x07)) {\n throw new ZWaveError(`The indicator ${indicatorId} does not support setting the timeout in seconds`, ZWaveErrorCodes.Argument_Invalid);\n }\n objects.push({\n indicatorId,\n propertyId: 0x07,\n value: seconds,\n });\n }\n if (hundredths) {\n if (!supportedPropertyIDs?.includes(0x08)) {\n throw new ZWaveError(`The indicator ${indicatorId} does not support setting the timeout in 1/100 seconds`, ZWaveErrorCodes.Argument_Invalid);\n }\n objects.push({\n indicatorId,\n propertyId: 0x08,\n value: hundredths,\n });\n }\n }\n if (!objects.length) {\n objects.push(...(supportedPropertyIDs ?? []).map((p) => ({\n indicatorId,\n propertyId: p,\n value: 0,\n })));\n }\n return this.set(objects);\n }\n /**\n * Returns the timeout after which the given indicator will be turned off.\n */\n @validateArgs_IndicatorCCAPI_getTimeout()\n public async getTimeout(indicatorId: number): Promise<MaybeNotKnown<IndicatorTimeout>> {\n const values = await this.get(indicatorId);\n if (!isArray(values))\n return;\n return indicatorObjectsToTimeout(values);\n }\n @validateArgs_IndicatorCCAPI_getDescription()\n public async getDescription(indicatorId: number): Promise<MaybeNotKnown<string>> {\n this.assertSupportsCommand(IndicatorCommand, IndicatorCommand.DescriptionGet);\n const cc = new IndicatorCCDescriptionGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n indicatorId,\n });\n const response = await this.host.sendCommand<IndicatorCCDescriptionReport>(cc, this.commandOptions);\n return response?.description;\n }\n}\n@commandClass(CommandClasses.Indicator)\n@implementedVersion(4)\n@ccValues(IndicatorCCValues)\nexport class IndicatorCC extends CommandClass {\n declare ccCommand: IndicatorCommand;\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.Indicator, 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 if (api.version > 1) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"scanning supported indicator IDs...\",\n direction: \"outbound\",\n });\n // Query ID 0 to get the first supported ID\n let curId = 0x00;\n const supportedIndicatorIds: number[] = [];\n do {\n const supportedResponse = await api.getSupported(curId);\n if (!supportedResponse) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"Time out while scanning supported indicator IDs, skipping interview...\",\n level: \"warn\",\n });\n return;\n }\n if (supportedResponse.supportedProperties.length > 0) {\n supportedIndicatorIds.push(supportedResponse.indicatorId ?? curId);\n }\n curId = supportedResponse.nextIndicatorId;\n } while (curId !== 0x00);\n // The IDs are not stored by the report CCs so store them here once we have all of them\n this.setValue(ctx, IndicatorCCValues.supportedIndicatorIds, supportedIndicatorIds);\n const logMessage = `supported indicator IDs: ${supportedIndicatorIds.join(\", \")}`;\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: logMessage,\n direction: \"inbound\",\n });\n if (api.version >= 4) {\n const manufacturerDefinedIndicatorIds = supportedIndicatorIds.filter((id) => isManufacturerDefinedIndicator(id));\n if (manufacturerDefinedIndicatorIds.length > 0) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"retrieving description for manufacturer-defined indicator IDs...\",\n direction: \"outbound\",\n });\n for (const [i, id,] of manufacturerDefinedIndicatorIds.entries()) {\n await api.getDescription(id);\n node.reportInterviewProgress(i + 1, manufacturerDefinedIndicatorIds.length);\n }\n }\n }\n }\n // Query current values\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.Indicator, ctx, endpoint).withOptions({\n priority: options?.priority ?? MessagePriority.NodeQuery,\n tag: options?.tag,\n });\n if (api.version === 1) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"requesting current indicator value...\",\n direction: \"outbound\",\n });\n await api.get();\n }\n else {\n const supportedIndicatorIds: number[] = this.getValue(ctx, IndicatorCCValues.supportedIndicatorIds)\n ?? [];\n for (const [i, indicatorId] of supportedIndicatorIds.entries()) {\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `requesting current indicator value (id = ${num2hex(indicatorId)})...`,\n direction: \"outbound\",\n });\n await api.get(indicatorId);\n options?.onProgress?.(i + 1, supportedIndicatorIds.length);\n }\n }\n }\n public translatePropertyKey(ctx: GetValueDB, property: string | number, propertyKey: string | number): string | undefined {\n if (property === \"value\") {\n // CC version 1 only has a single value that doesn't need to be translated\n return undefined;\n }\n else if (typeof property === \"number\"\n && typeof propertyKey === \"number\") {\n // The indicator property is our property key\n const prop = getIndicatorProperty(propertyKey);\n if (prop)\n return prop.label;\n }\n else if (typeof property === \"number\" && propertyKey === \"timeout\") {\n return \"Timeout\";\n }\n return super.translatePropertyKey(ctx, property, propertyKey);\n }\n public translateProperty(ctx: GetValueDB, property: string | number, propertyKey?: string | number): string {\n if (typeof property === \"number\") {\n if (typeof propertyKey === \"number\" || propertyKey === \"timeout\") {\n // The indicator corresponds to our property\n if (property in Indicator)\n return Indicator[property];\n }\n }\n return super.translateProperty(ctx, property, propertyKey);\n }\n protected supportsV2Indicators(ctx: GetValueDB): boolean {\n // First test if there are any indicator ids defined\n const supportedIndicatorIds = this.getValue<number[]>(ctx, IndicatorCCValues.supportedIndicatorIds);\n if (!supportedIndicatorIds?.length)\n return false;\n // Then test if there are any property ids defined\n return supportedIndicatorIds.some((indicatorId) => !!this.getValue<number[]>(ctx, IndicatorCCValues.supportedPropertyIDs(indicatorId))?.length);\n }\n protected getManufacturerDefinedIndicatorLabel(ctx: GetValueDB, indicatorId: number): string | undefined {\n if (isManufacturerDefinedIndicator(indicatorId)) {\n return this.getValue(ctx, IndicatorCCValues.indicatorDescription(indicatorId));\n }\n }\n public static getSupportedPropertyIDsCached(ctx: GetValueDB, endpoint: EndpointId, indicatorId: number): MaybeNotKnown<number[]> {\n return ctx\n .getValueDB(endpoint.nodeId)\n .getValue(IndicatorCCValues.supportedPropertyIDs(indicatorId).endpoint(endpoint.index));\n }\n}\n// @publicAPI\nexport interface IndicatorObject {\n indicatorId: number;\n propertyId: number;\n value: number | boolean;\n}\n// @publicAPI\nexport type IndicatorCCSetOptions = {\n value: number;\n} | {\n values: IndicatorObject[];\n};\n@CCCommand(IndicatorCommand.Set)\n@useSupervision()\nexport class IndicatorCCSet extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCSetOptions>) {\n super(options);\n if (\"value\" in options) {\n this.indicator0Value = options.value;\n }\n else {\n this.values = options.values;\n }\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCSet {\n validatePayload(raw.payload.length >= 1);\n const objCount = raw.payload.length >= 2 ? raw.payload[1] & 0b11111 : 0;\n if (objCount === 0) {\n const indicator0Value = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n value: indicator0Value,\n });\n }\n validatePayload(raw.payload.length >= 2 + 3 * objCount);\n const values: IndicatorObject[] = [];\n for (let i = 0; i < objCount; i++) {\n const offset = 2 + 3 * i;\n const value: IndicatorObject = {\n indicatorId: raw.payload[offset],\n propertyId: raw.payload[offset + 1],\n value: raw.payload[offset + 2],\n };\n values.push(value);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n values,\n });\n }\n public indicator0Value: number | undefined;\n public values: IndicatorObject[] | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.values != undefined) {\n // V2+\n this.payload = Bytes.alloc(2 + 3 * this.values.length, 0);\n // Byte 0 is the legacy value\n const objCount = this.values.length & MAX_INDICATOR_OBJECTS;\n this.payload[1] = objCount;\n for (let i = 0; i < objCount; i++) {\n const offset = 2 + 3 * i;\n this.payload[offset] = this.values[i].indicatorId;\n this.payload[offset + 1] = this.values[i].propertyId;\n const value = this.values[i].value;\n this.payload[offset + 2] =\n value === true ? 0xff : value === false ? 0x00 : value;\n }\n }\n else {\n // V1\n this.payload = Bytes.from([this.indicator0Value ?? 0]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n if (this.indicator0Value != undefined) {\n message[\"indicator 0 value\"] = this.indicator0Value;\n }\n if (this.values != undefined) {\n message.values = this.values\n .map((v) => `\n\u00B7 indicatorId: ${v.indicatorId}\n propertyId: ${v.propertyId}\n value: ${v.value}`)\n .join(\"\");\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport type IndicatorCCReportOptions = {\n value: number;\n} | {\n values: IndicatorObject[];\n};\n@CCCommand(IndicatorCommand.Report)\nexport class IndicatorCCReport extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCReportOptions>) {\n super(options);\n if (\"value\" in options) {\n this.indicator0Value = options.value;\n }\n else if (\"values\" in options) {\n if (options.values.length > MAX_INDICATOR_OBJECTS) {\n throw new ZWaveError(`Only ${MAX_INDICATOR_OBJECTS} indicator values can be set at a time!`, ZWaveErrorCodes.Argument_Invalid);\n }\n this.values = options.values;\n }\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCReport {\n validatePayload(raw.payload.length >= 1);\n const objCount = raw.payload.length >= 2 ? raw.payload[1] & 0b11111 : 0;\n if (objCount === 0) {\n const indicator0Value = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n value: indicator0Value,\n });\n }\n validatePayload(raw.payload.length >= 2 + 3 * objCount);\n const values: IndicatorObject[] = [];\n for (let i = 0; i < objCount; i++) {\n const offset = 2 + 3 * i;\n const value: IndicatorObject = {\n indicatorId: raw.payload[offset],\n propertyId: raw.payload[offset + 1],\n value: raw.payload[offset + 2],\n };\n values.push(value);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n values,\n });\n // TODO: Think if we want this:\n // // If not all Property IDs are included in the command for the actual Indicator ID,\n // // a controlling node MUST assume non-specified Property IDs values to be 0x00.\n // const indicatorId = this.values[0].indicatorId;\n // const supportedIndicatorProperties =\n // \tvalueDB.getValue<number[]>(\n // \t\tgetSupportedPropertyIDsValueID(\n // \t\t\tthis.endpointIndex,\n // \t\t\tindicatorId,\n // \t\t),\n // \t) ?? [];\n // // Find out which ones are missing\n // const missingIndicatorProperties = supportedIndicatorProperties.filter(\n // \tprop =>\n // \t\t!this.values!.find(({ propertyId }) => prop === propertyId),\n // );\n // // And assume they are 0 (false)\n // for (const missing of missingIndicatorProperties) {\n // \tthis.setIndicatorValue({\n // \t\tindicatorId,\n // \t\tpropertyId: missing,\n // \t\tvalue: 0,\n // \t});\n // }\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // Indicator objects only exist in V2+ reports, the timeout properties in V3+.\n // Ignore them if the device advertises a lower version.\n const ccVersion = getEffectiveCCVersion(ctx, this);\n if (this.indicator0Value != undefined) {\n if (!this.supportsV2Indicators(ctx)) {\n // Publish the value\n const valueV1 = IndicatorCCValues.valueV1;\n this.setMetadata(ctx, valueV1);\n this.setValue(ctx, valueV1, this.indicator0Value);\n }\n else {\n if (this.isSinglecast()) {\n // Don't!\n ctx.logNode(this.nodeId, {\n message: `ignoring V1 indicator report because the node supports V2 indicators`,\n direction: \"none\",\n endpoint: this.endpointIndex,\n });\n }\n }\n }\n else if (this.values && ccVersion >= 2) {\n // Store the simple values first\n for (const value of this.values) {\n this.setIndicatorValue(ctx, value);\n }\n // Then group values into the convenience properties\n const groupedValues = groupByIndicatorId(this.values);\n for (const [indicatorId, values] of groupedValues) {\n // Some devices report all properties it supports in every report,\n // even if it does not support all properties for the given indicator ID.\n // To avoid confusion, we need to filter out the unsupported properties\n const supportedPropertyIDs = this.getValue<number[]>(ctx, IndicatorCCValues.supportedPropertyIDs(indicatorId)) ?? [];\n const filteredValues = values.filter((v) => supportedPropertyIDs.includes(v.propertyId));\n const overrideIndicatorLabel = this.getManufacturerDefinedIndicatorLabel(ctx, indicatorId);\n // ... timeout\n const timeout = indicatorObjectsToTimeout(filteredValues);\n if (timeout && ccVersion >= 3) {\n let timeoutString = \"\";\n if (timeout?.hours)\n timeoutString += `${timeout.hours}h`;\n if (timeout?.minutes) {\n timeoutString += `${timeout.minutes}m`;\n }\n if (timeout?.seconds) {\n timeoutString += `${timeout.seconds}s`;\n }\n const timeoutValue = IndicatorCCValues.timeout(indicatorId);\n const metadata: ValueMetadata = {\n ...timeoutValue.meta,\n label: getIndicatorLabel(indicatorId, 0x06, // This is actually ignored, but pass a valid ID for clarity\n overrideIndicatorLabel, \"Timeout\"),\n };\n this.setMetadata(ctx, timeoutValue, metadata);\n this.setValue(ctx, timeoutValue, timeoutString);\n }\n }\n }\n return true;\n }\n public readonly indicator0Value: number | undefined;\n public readonly values: IndicatorObject[] | undefined;\n private setIndicatorValue(ctx: GetValueDB, value: IndicatorObject): void {\n // Manufacturer-defined indicators may need a custom label\n const overrideIndicatorLabel = this.getManufacturerDefinedIndicatorLabel(ctx, value.indicatorId);\n const metadata = getIndicatorMetadata(value.indicatorId, value.propertyId, overrideIndicatorLabel);\n // Some values need to be converted\n if (metadata.type === \"boolean\") {\n value.value = !!value.value;\n }\n // Only expose the value if it should be user-facing\n if (value.indicatorId === Indicator[\"Node Identify\"]) {\n return;\n }\n const prop = getIndicatorProperty(value.propertyId);\n if (!prop?.exposeAsValue)\n return;\n // And only if it is actually supported and not just reported by accident\n const supportedPropertyIDs = this.getValue<number[]>(ctx, IndicatorCCValues.supportedPropertyIDs(value.indicatorId)) ?? [];\n if (!supportedPropertyIDs.includes(value.propertyId))\n return;\n // Publish the value\n const valueV2 = IndicatorCCValues.valueV2(value.indicatorId, value.propertyId);\n this.setMetadata(ctx, valueV2, metadata);\n this.setValue(ctx, valueV2, value.value);\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.values != undefined) {\n // V2+\n this.payload = Bytes.alloc(2 + 3 * this.values.length, 0);\n // Byte 0 is the legacy value\n const objCount = this.values.length & MAX_INDICATOR_OBJECTS;\n this.payload[1] = objCount;\n for (let i = 0; i < objCount; i++) {\n const offset = 2 + 3 * i;\n this.payload[offset] = this.values[i].indicatorId;\n this.payload[offset + 1] = this.values[i].propertyId;\n const value = this.values[i].value;\n this.payload[offset + 2] =\n value === true ? 0xff : value === false ? 0x00 : value;\n }\n }\n else {\n // V1\n this.payload = Bytes.from([this.indicator0Value ?? 0]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n const message: MessageRecord = {};\n if (this.indicator0Value != undefined) {\n message[\"indicator 0 value\"] = this.indicator0Value;\n }\n if (this.values != undefined) {\n message.values = this.values\n .map((v) => `\n\u00B7 indicatorId: ${v.indicatorId}\n propertyId: ${v.propertyId}\n value: ${v.value}`)\n .join(\"\");\n }\n return {\n ...super.toLogEntry(ctx),\n message,\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCGetOptions {\n indicatorId?: number;\n}\n@CCCommand(IndicatorCommand.Get)\n@expectedCCResponse(IndicatorCCReport)\nexport class IndicatorCCGet extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCGetOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCGet {\n let indicatorId: number | undefined;\n if (raw.payload.length > 0) {\n indicatorId = raw.payload[0];\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n });\n }\n public indicatorId: number | undefined;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n if (this.indicatorId != undefined) {\n this.payload = Bytes.from([this.indicatorId]);\n }\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n indicator: getIndicatorName(this.indicatorId),\n },\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCSupportedReportOptions {\n indicatorId: number;\n nextIndicatorId: number;\n supportedProperties: readonly number[];\n}\n@CCCommand(IndicatorCommand.SupportedReport)\nexport class IndicatorCCSupportedReport extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCSupportedReportOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n this.nextIndicatorId = options.nextIndicatorId;\n this.supportedProperties = options.supportedProperties;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCSupportedReport {\n validatePayload(raw.payload.length >= 3);\n const indicatorId = raw.payload[0];\n const nextIndicatorId = raw.payload[1];\n const bitMaskLength = raw.payload[2] & 0b11111;\n let supportedProperties: readonly number[];\n if (bitMaskLength === 0) {\n supportedProperties = [];\n }\n else {\n validatePayload(raw.payload.length >= 3 + bitMaskLength);\n // The bit mask starts at 0, but bit 0 is not used\n supportedProperties = parseBitMask(raw.payload.subarray(3, 3 + bitMaskLength), 0).filter((v) => v !== 0);\n }\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n nextIndicatorId,\n supportedProperties,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n if (this.indicatorId !== 0x00) {\n // Remember which property IDs are supported\n this.setValue(ctx, IndicatorCCValues.supportedPropertyIDs(this.indicatorId), this.supportedProperties);\n }\n return true;\n }\n public readonly indicatorId: number;\n public readonly nextIndicatorId: number;\n public readonly supportedProperties: readonly number[];\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const bitmask = this.supportedProperties.length > 0\n ? encodeBitMask(this.supportedProperties, undefined, 0)\n : new Bytes();\n this.payload = Bytes.concat([\n [this.indicatorId, this.nextIndicatorId, bitmask.length],\n bitmask,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n indicator: getIndicatorName(this.indicatorId),\n \"supported properties\": this.supportedProperties\n .map((id) => getIndicatorProperty(id)?.label\n ?? `Unknown (${num2hex(id)})`)\n .join(\", \"),\n \"next indicator\": getIndicatorName(this.nextIndicatorId),\n },\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCSupportedGetOptions {\n indicatorId: number;\n}\nfunction testResponseForIndicatorSupportedGet(sent: IndicatorCCSupportedGet, received: IndicatorCCSupportedReport) {\n return sent.indicatorId === 0 || received.indicatorId === sent.indicatorId;\n}\n@CCCommand(IndicatorCommand.SupportedGet)\n@expectedCCResponse(IndicatorCCSupportedReport, testResponseForIndicatorSupportedGet)\nexport class IndicatorCCSupportedGet extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCSupportedGetOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCSupportedGet {\n validatePayload(raw.payload.length >= 1);\n const indicatorId = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n });\n }\n public indicatorId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.indicatorId]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n indicator: getIndicatorName(this.indicatorId),\n },\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCDescriptionReportOptions {\n indicatorId: number;\n description: string;\n}\n@CCCommand(IndicatorCommand.DescriptionReport)\nexport class IndicatorCCDescriptionReport extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCDescriptionReportOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n this.description = options.description;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCDescriptionReport {\n validatePayload(raw.payload.length >= 2);\n const indicatorId = raw.payload[0];\n const descriptionLength = raw.payload[1];\n validatePayload(raw.payload.length >= 2 + descriptionLength);\n const description: string = stripControlCharacters(raw.payload.subarray(2, 2 + descriptionLength).toString(\"utf8\"), { keepNewlines: true });\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n description,\n });\n }\n public indicatorId: number;\n public description: string;\n public persistValues(ctx: PersistValuesContext): boolean {\n if (!super.persistValues(ctx))\n return false;\n // This command only exists in V4. Ignore it if the device advertises a lower version.\n if (this.description && getEffectiveCCVersion(ctx, this) >= 4) {\n this.setValue(ctx, IndicatorCCValues.indicatorDescription(this.indicatorId), this.description);\n }\n return true;\n }\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const description = Bytes.from(this.description, \"utf8\");\n this.payload = Bytes.concat([\n [this.indicatorId, description.length],\n description,\n ]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"indicator ID\": this.indicatorId,\n description: this.description || \"(none)\",\n },\n };\n }\n}\n// @publicAPI\nexport interface IndicatorCCDescriptionGetOptions {\n indicatorId: number;\n}\nfunction testResponseForIndicatorDescriptionGet(sent: IndicatorCCDescriptionGet, received: IndicatorCCDescriptionReport) {\n return received.indicatorId === sent.indicatorId;\n}\n@CCCommand(IndicatorCommand.DescriptionGet)\n@expectedCCResponse(IndicatorCCDescriptionReport, testResponseForIndicatorDescriptionGet)\nexport class IndicatorCCDescriptionGet extends IndicatorCC {\n public constructor(options: WithAddress<IndicatorCCDescriptionGetOptions>) {\n super(options);\n this.indicatorId = options.indicatorId;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCDescriptionGet {\n validatePayload(raw.payload.length >= 1);\n const indicatorId = raw.payload[0];\n return new this({\n nodeId: ctx.sourceNodeId,\n indicatorId,\n });\n }\n public indicatorId: number;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n this.payload = Bytes.from([this.indicatorId]);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"indicator ID\": this.indicatorId,\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|