@zwave-js/cc 15.18.0 → 15.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/cc/AssociationGroupInfoCC.js +1 -1
- package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
- package/build/cjs/cc/BatteryCC.js +2 -2
- package/build/cjs/cc/BatteryCC.js.map +2 -2
- package/build/cjs/cc/BinarySwitchCC.js +2 -2
- package/build/cjs/cc/BinarySwitchCC.js.map +2 -2
- package/build/cjs/cc/ClimateControlScheduleCC.js +1 -1
- package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
- package/build/cjs/cc/ColorSwitchCC.js +2 -2
- package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
- package/build/cjs/cc/ConfigurationCC.js +3 -2
- package/build/cjs/cc/ConfigurationCC.js.map +2 -2
- package/build/cjs/cc/EnergyProductionCC.js +1 -1
- package/build/cjs/cc/EnergyProductionCC.js.map +2 -2
- package/build/cjs/cc/HumidityControlSetpointCC.js +1 -1
- package/build/cjs/cc/HumidityControlSetpointCC.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 +6 -6
- package/build/cjs/cc/IrrigationCC.js.map +2 -2
- package/build/cjs/cc/ManufacturerProprietaryCC.js +2 -2
- package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
- package/build/cjs/cc/MeterCC.js +6 -6
- package/build/cjs/cc/MeterCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelAssociationCC.js +4 -4
- package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
- package/build/cjs/cc/MultiChannelCC.js +6 -6
- package/build/cjs/cc/MultiChannelCC.js.map +2 -2
- package/build/cjs/cc/MultilevelSensorCC.js +2 -2
- package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
- package/build/cjs/cc/NotificationCC.js +3 -3
- package/build/cjs/cc/NotificationCC.js.map +2 -2
- package/build/cjs/cc/ScheduleEntryLockCC.js +4 -4
- package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
- package/build/cjs/cc/Security2CC.js +7 -7
- package/build/cjs/cc/Security2CC.js.map +2 -2
- package/build/cjs/cc/SecurityCC.js +5 -5
- package/build/cjs/cc/SecurityCC.js.map +2 -2
- package/build/cjs/cc/SoundSwitchCC.d.ts +11 -1
- package/build/cjs/cc/SoundSwitchCC.js +34 -5
- package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
- package/build/cjs/cc/SupervisionCC.js +5 -5
- package/build/cjs/cc/SupervisionCC.js.map +2 -2
- package/build/cjs/cc/ThermostatModeCC.js +2 -2
- package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
- package/build/cjs/cc/ThermostatSetpointCC.js +3 -3
- package/build/cjs/cc/ThermostatSetpointCC.js.map +2 -2
- package/build/cjs/cc/TimeCC.js +4 -4
- package/build/cjs/cc/TimeCC.js.map +2 -2
- package/build/cjs/cc/TransportServiceCC.js +2 -2
- package/build/cjs/cc/TransportServiceCC.js.map +2 -2
- package/build/cjs/cc/UserCodeCC.js +54 -39
- package/build/cjs/cc/UserCodeCC.js.map +2 -2
- package/build/cjs/cc/WindowCoveringCC.js +1 -1
- package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
- package/build/cjs/cc/ZWaveProtocolCC.js +8 -8
- package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
- package/build/cjs/cc/index.js.map +2 -2
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.js +1 -1
- package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +2 -2
- package/build/cjs/lib/API.d.ts +2 -2
- package/build/cjs/lib/API.js.map +2 -2
- package/build/cjs/lib/CommandClass.js +2 -2
- package/build/cjs/lib/CommandClass.js.map +2 -2
- package/build/cjs/lib/Security2/Extension.js +2 -2
- package/build/cjs/lib/Security2/Extension.js.map +2 -2
- package/build/cjs/lib/Values.js.map +1 -1
- package/build/cjs/lib/traits.d.ts +9 -0
- package/build/cjs/lib/utils.d.ts +7 -1
- package/build/cjs/lib/utils.js +21 -17
- package/build/cjs/lib/utils.js.map +2 -2
- package/build/esm/cc/AssociationGroupInfoCC.js +1 -1
- package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
- package/build/esm/cc/BatteryCC.js +2 -2
- package/build/esm/cc/BatteryCC.js.map +1 -1
- package/build/esm/cc/BinarySwitchCC.js +2 -2
- package/build/esm/cc/BinarySwitchCC.js.map +1 -1
- package/build/esm/cc/ClimateControlScheduleCC.js +1 -1
- package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
- package/build/esm/cc/ColorSwitchCC.js +2 -2
- package/build/esm/cc/ColorSwitchCC.js.map +1 -1
- package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
- package/build/esm/cc/ConfigurationCC.js +3 -2
- package/build/esm/cc/ConfigurationCC.js.map +1 -1
- package/build/esm/cc/EnergyProductionCC.js +1 -1
- package/build/esm/cc/EnergyProductionCC.js.map +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.js +1 -1
- package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
- package/build/esm/cc/IndicatorCC.js +3 -3
- package/build/esm/cc/IndicatorCC.js.map +1 -1
- package/build/esm/cc/IrrigationCC.js +6 -6
- package/build/esm/cc/IrrigationCC.js.map +1 -1
- package/build/esm/cc/ManufacturerProprietaryCC.js +2 -2
- package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
- package/build/esm/cc/MeterCC.js +6 -6
- package/build/esm/cc/MeterCC.js.map +1 -1
- package/build/esm/cc/MultiChannelAssociationCC.js +4 -4
- package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
- package/build/esm/cc/MultiChannelCC.js +6 -6
- package/build/esm/cc/MultiChannelCC.js.map +1 -1
- package/build/esm/cc/MultilevelSensorCC.js +2 -2
- package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
- package/build/esm/cc/NotificationCC.js +3 -3
- package/build/esm/cc/NotificationCC.js.map +1 -1
- package/build/esm/cc/ScheduleEntryLockCC.js +4 -4
- package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
- package/build/esm/cc/Security2CC.js +7 -7
- package/build/esm/cc/Security2CC.js.map +1 -1
- package/build/esm/cc/SecurityCC.js +5 -5
- package/build/esm/cc/SecurityCC.js.map +1 -1
- package/build/esm/cc/SoundSwitchCC.d.ts +11 -1
- package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -1
- package/build/esm/cc/SoundSwitchCC.js +34 -5
- package/build/esm/cc/SoundSwitchCC.js.map +1 -1
- package/build/esm/cc/SupervisionCC.js +5 -5
- package/build/esm/cc/SupervisionCC.js.map +1 -1
- package/build/esm/cc/ThermostatModeCC.js +2 -2
- package/build/esm/cc/ThermostatModeCC.js.map +1 -1
- package/build/esm/cc/ThermostatSetpointCC.js +3 -3
- package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
- package/build/esm/cc/TimeCC.js +4 -4
- package/build/esm/cc/TimeCC.js.map +1 -1
- package/build/esm/cc/TransportServiceCC.js +2 -2
- package/build/esm/cc/TransportServiceCC.js.map +1 -1
- package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
- package/build/esm/cc/UserCodeCC.js +80 -43
- package/build/esm/cc/UserCodeCC.js.map +1 -1
- package/build/esm/cc/WindowCoveringCC.js +1 -1
- package/build/esm/cc/WindowCoveringCC.js.map +1 -1
- package/build/esm/cc/ZWaveProtocolCC.js +8 -8
- package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
- package/build/esm/cc/index.d.ts.map +1 -1
- package/build/esm/cc/index.js +0 -1
- package/build/esm/cc/index.js.map +1 -1
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js +1 -1
- package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
- package/build/esm/lib/API.d.ts +2 -2
- package/build/esm/lib/API.d.ts.map +1 -1
- package/build/esm/lib/API.js.map +1 -1
- package/build/esm/lib/CommandClass.js +2 -2
- package/build/esm/lib/CommandClass.js.map +1 -1
- package/build/esm/lib/Security2/Extension.js +2 -2
- package/build/esm/lib/Security2/Extension.js.map +1 -1
- package/build/esm/lib/Values.js +1 -1
- package/build/esm/lib/Values.js.map +1 -1
- package/build/esm/lib/traits.d.ts +9 -0
- package/build/esm/lib/traits.d.ts.map +1 -1
- package/build/esm/lib/utils.d.ts +7 -1
- package/build/esm/lib/utils.d.ts.map +1 -1
- package/build/esm/lib/utils.js +25 -21
- package/build/esm/lib/utils.js.map +1 -1
- package/package.json +8 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cc/IndicatorCC.ts"],
|
|
4
|
-
"sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\ttype EndpointId,\n\ttype GetValueDB,\n\tIndicator,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype SupervisionResult,\n\ttype ValueID,\n\tValueMetadata,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeBitMask,\n\tgetIndicatorProperty,\n\tparseBitMask,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, num2hex } from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { clamp, roundTo } from \"alcalzone-shared/math\";\nimport { isArray } from \"alcalzone-shared/typeguards\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { IndicatorCommand, type IndicatorTimeout } from \"../lib/_Types.js\";\n\nfunction isManufacturerDefinedIndicator(indicatorId: number): boolean {\n\treturn indicatorId >= 0x80 && indicatorId <= 0x9f;\n}\n\nconst timeoutStringRegex =\n\t/^(?:(?<hoursStr>\\d+)h)?(?:(?<minutesStr>\\d+)m)?(?:(?<secondsStr>\\d+(?:\\.\\d+)?)s)?$/i;\n\nconst MAX_INDICATOR_OBJECTS = 31;\n\nfunction parseIndicatorTimeoutString(\n\ttext: string,\n): IndicatorTimeout | undefined {\n\tif (!text.length) return undefined;\n\t// Try to parse the numeric parts from a timeout\n\tconst match = timeoutStringRegex.exec(text);\n\tif (!match) return undefined;\n\tconst { hoursStr, minutesStr, secondsStr } = match.groups!;\n\tif (!hoursStr && !minutesStr && !secondsStr) return undefined;\n\n\tconst ret: IndicatorTimeout = {};\n\tif (hoursStr) {\n\t\tret.hours = clamp(parseInt(hoursStr, 10), 0, 255);\n\t}\n\tif (minutesStr) {\n\t\tret.minutes = clamp(parseInt(minutesStr, 10), 0, 255);\n\t}\n\tif (secondsStr) {\n\t\tret.seconds = clamp(roundTo(parseFloat(secondsStr), 2), 0, 59.99);\n\t}\n\n\treturn ret;\n}\n\nfunction groupByIndicatorId(\n\tvalues: IndicatorObject[],\n): Map<number, IndicatorObject[]> {\n\tconst ret = new Map();\n\n\tfor (const value of values) {\n\t\tif (!ret.has(value.indicatorId)) {\n\t\t\tret.set(value.indicatorId, []);\n\t\t}\n\t\tret.get(value.indicatorId)!.push(value);\n\t}\n\n\treturn ret;\n}\n\nfunction indicatorObjectsToTimeout(\n\tvalues: IndicatorObject[],\n): IndicatorTimeout | undefined {\n\tconst timeoutValues = values.filter((v) =>\n\t\t[0x0a, 0x06, 0x07, 0x08].includes(v.propertyId)\n\t);\n\tif (!timeoutValues.length) return undefined;\n\n\tconst hours = (timeoutValues.find((v) => v.propertyId === 0x0a)?.value\n\t\t?? 0) as number;\n\tconst minutes = (timeoutValues.find((v) => v.propertyId === 0x06)?.value\n\t\t?? 0) as number;\n\tconst seconds = clamp(\n\t\t(timeoutValues.find((v) => v.propertyId === 0x07)\n\t\t\t?.value as number) ?? 0,\n\t\t0,\n\t\t59,\n\t)\n\t\t+ clamp(\n\t\t\t\t(timeoutValues.find((v) => v.propertyId === 0x08)\n\t\t\t\t\t?.value as number) ?? 0,\n\t\t\t\t0,\n\t\t\t\t99,\n\t\t\t)\n\t\t\t/ 100;\n\n\treturn {\n\t\thours,\n\t\tminutes,\n\t\tseconds,\n\t};\n}\n\nexport const IndicatorCCValues = V.defineCCValues(CommandClasses.Indicator, {\n\t...V.staticProperty(\"supportedIndicatorIds\", undefined, {\n\t\tinternal: true,\n\t}),\n\t...V.staticPropertyWithName(\n\t\t\"valueV1\",\n\t\t\"value\",\n\t\t{\n\t\t\t...ValueMetadata.UInt8,\n\t\t\tlabel: \"Indicator value\",\n\t\t\tccSpecific: {\n\t\t\t\tindicatorId: 0,\n\t\t\t},\n\t\t} as const,\n\t),\n\t...V.staticProperty(\n\t\t\"identify\",\n\t\t{\n\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\tlabel: \"Identify\",\n\t\t\tstates: {\n\t\t\t\ttrue: \"Identify\",\n\t\t\t},\n\t\t} as const,\n\t\t{ minVersion: 3 } as const,\n\t),\n\t...V.dynamicPropertyAndKeyWithName(\n\t\t\"supportedPropertyIDs\",\n\t\t\"supportedPropertyIDs\",\n\t\t(indicatorId: number) => indicatorId,\n\t\t({ property, propertyKey }) =>\n\t\t\tproperty === \"supportedPropertyIDs\"\n\t\t\t&& typeof propertyKey === \"number\",\n\t\tundefined,\n\t\t{ internal: true },\n\t),\n\t...V.dynamicPropertyAndKeyWithName(\n\t\t\"valueV2\",\n\t\t// oxlint-disable-next-line no-unused-vars\n\t\t(indicatorId: number, propertyId: number) => indicatorId,\n\t\t(indicatorId: number, propertyId: number) => propertyId,\n\t\t({ property, propertyKey }) =>\n\t\t\ttypeof property === \"number\" && typeof propertyKey === \"number\",\n\t\t// The metadata is highly dependent on the indicator and property\n\t\t// so this is just a baseline\n\t\t(indicatorId: number, propertyId: number) => ({\n\t\t\t...ValueMetadata.Any,\n\t\t\tccSpecific: {\n\t\t\t\tindicatorId,\n\t\t\t\tpropertyId,\n\t\t\t},\n\t\t}),\n\t\t{ minVersion: 2 } as const,\n\t),\n\t...V.dynamicPropertyAndKeyWithName(\n\t\t\"timeout\",\n\t\t(indicatorId: number) => indicatorId,\n\t\t// oxlint-disable-next-line no-unused-vars\n\t\t(indicatorId: number) => \"timeout\",\n\t\t({ property, propertyKey }) =>\n\t\t\ttypeof property === \"number\" && propertyKey === \"timeout\",\n\t\t(indicatorId: number) => ({\n\t\t\t...ValueMetadata.String,\n\t\t\tlabel: \"Timeout\",\n\t\t\tccSpecific: {\n\t\t\t\tindicatorId,\n\t\t\t},\n\t\t}),\n\t\t{ minVersion: 3 } as const,\n\t),\n\t...V.dynamicPropertyWithName(\n\t\t\"indicatorDescription\",\n\t\t(indicatorId: number) => indicatorId,\n\t\t({ property }) => typeof property === \"number\",\n\t\tundefined,\n\t\t{ internal: true, minVersion: 4 } as const,\n\t),\n});\n\n/**\n * Looks up the configured metadata for the given indicator and property\n */\nfunction getIndicatorMetadata(\n\tindicatorId: Indicator,\n\tpropertyId: number,\n\toverrideIndicatorLabel?: string,\n): ValueMetadata {\n\tconst label = getIndicatorLabel(\n\t\tindicatorId,\n\t\tpropertyId,\n\t\toverrideIndicatorLabel,\n\t);\n\tconst prop = getIndicatorProperty(propertyId);\n\tconst baseMetadata = IndicatorCCValues.valueV2(\n\t\tindicatorId,\n\t\tpropertyId,\n\t).meta;\n\n\tif (!prop) {\n\t\treturn {\n\t\t\t...baseMetadata,\n\t\t\t...ValueMetadata.UInt8,\n\t\t\tlabel,\n\t\t};\n\t} else {\n\t\tif (prop.type === \"boolean\") {\n\t\t\treturn {\n\t\t\t\t...baseMetadata,\n\t\t\t\t...ValueMetadata.Boolean,\n\t\t\t\tlabel,\n\t\t\t\tdescription: prop.description,\n\t\t\t\treadable: !prop.readonly,\n\t\t\t};\n\t\t} else {\n\t\t\t// UInt8\n\t\t\treturn {\n\t\t\t\t...baseMetadata,\n\t\t\t\t...ValueMetadata.UInt8,\n\t\t\t\tlabel,\n\t\t\t\tdescription: prop.description,\n\t\t\t\tmin: prop.min,\n\t\t\t\tmax: prop.max,\n\t\t\t\treadable: !prop.readonly,\n\t\t\t};\n\t\t}\n\t}\n}\n\nfunction getIndicatorName(\n\tindicatorId: number | undefined,\n): string {\n\tif (indicatorId) {\n\t\treturn getEnumMemberName(Indicator, indicatorId);\n\t} else {\n\t\treturn \"Default\";\n\t}\n}\n\n/** Returns a user-friendly label for an indicator */\nfunction getIndicatorLabel(\n\tindicatorId: number,\n\tpropertyId: number,\n\toverrideIndicatorLabel?: string,\n\toverridePropertyLabel?: string,\n): string {\n\tconst defaultName = overrideIndicatorLabel || getIndicatorName(indicatorId);\n\n\t// Without a defined property, we cannot suggest a better label\n\tconst prop = getIndicatorProperty(propertyId);\n\tif (!prop) return defaultName;\n\n\t// For indicators that correspond to an LCD or buttons,\n\t// the indicator enum names are enough\n\tif (\n\t\tindicatorId >= Indicator[\"LCD backlight\"]\n\t\t&& indicatorId <= Indicator[\"Button 12 indication\"]\n\t\t&& (propertyId === 0x01 /* Multilevel */\n\t\t\t|| propertyId === 0x02 /* Binary */\n\t\t\t|| overridePropertyLabel) // custom property label\n\t) {\n\t\tlet ret: string = (Indicator as any)[indicatorId];\n\t\t// Append the overridden property label if it exists\n\t\tif (overridePropertyLabel) {\n\t\t\tret += ` - ${overridePropertyLabel}`;\n\t\t}\n\t\treturn ret;\n\t}\n\n\t// Default to the current behavior of <indicator name> - <property label>\n\treturn `${defaultName} - ${overridePropertyLabel || prop.label}`;\n}\n\nexport function shouldExposeIndicatorValue(\n\tindicatorId: number,\n\tpropertyId: number,\n): boolean {\n\t// Many possible indicator values are not suitable to be exposed as CC values,\n\t// usually because they need to be set in groups.\n\n\t// Indicator properties that should be exposed are marked as such\n\tconst prop = getIndicatorProperty(propertyId);\n\tif (prop && !prop.exposeAsValue) {\n\t\treturn false;\n\t}\n\n\t// Unless we know better, expose anyways\n\treturn true;\n}\n\n@API(CommandClasses.Indicator)\nexport class IndicatorCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: IndicatorCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase IndicatorCommand.Get:\n\t\t\tcase IndicatorCommand.Report:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase IndicatorCommand.Set:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase IndicatorCommand.SupportedGet:\n\t\t\tcase IndicatorCommand.SupportedReport:\n\t\t\t\treturn this.version >= 2 && this.isSinglecast();\n\t\t\tcase IndicatorCommand.DescriptionGet:\n\t\t\tcase IndicatorCommand.DescriptionReport:\n\t\t\t\treturn this.version >= 4 && this.isSinglecast();\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: IndicatorCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t\tvalue,\n\t\t) {\n\t\t\tconst valueId: ValueID = {\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\tproperty,\n\t\t\t\tpropertyKey,\n\t\t\t};\n\n\t\t\tif (property === \"value\") {\n\t\t\t\t// V1 value\n\t\t\t\tif (typeof value !== \"number\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn this.set(value);\n\t\t\t} else if (IndicatorCCValues.valueV2.is(valueId)) {\n\t\t\t\tconst indicatorId = property as number;\n\t\t\t\tconst propertyId = propertyKey as number;\n\t\t\t\tconst expectedType = getIndicatorMetadata(\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId,\n\t\t\t\t).type as \"number\" | \"boolean\";\n\n\t\t\t\t// V2+ value\n\t\t\t\tif (typeof value !== expectedType) {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\texpectedType,\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn this.set([\n\t\t\t\t\t{\n\t\t\t\t\t\tindicatorId,\n\t\t\t\t\t\tpropertyId,\n\t\t\t\t\t\tvalue: value as any,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t} else if (IndicatorCCValues.timeout.is(valueId)) {\n\t\t\t\tconst indicatorId = property as number;\n\t\t\t\tif (typeof value !== \"string\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn this.setTimeout(indicatorId, value);\n\t\t\t} else if (IndicatorCCValues.identify.is(valueId)) {\n\t\t\t\tif (typeof value !== \"boolean\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"boolean\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn this.identify();\n\t\t\t} else {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: IndicatorCCAPI, { property }) {\n\t\t\tif (property === \"value\") return this.get();\n\t\t\tif (typeof property === \"number\") {\n\t\t\t\treturn this.get(property);\n\t\t\t}\n\n\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t};\n\t}\n\n\t@validateArgs()\n\tpublic async get(\n\t\tindicatorId?: number,\n\t): Promise<MaybeNotKnown<number | IndicatorObject[]>> {\n\t\tthis.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Get);\n\n\t\tconst cc = new IndicatorCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t});\n\t\tconst response = await this.host.sendCommand<IndicatorCCReport>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (!response) return;\n\t\tif (response.values) return response.values;\n\t\treturn response.indicator0Value!;\n\t}\n\n\t@validateArgs()\n\tpublic async set(\n\t\tvalue: number | IndicatorObject[],\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Set);\n\n\t\tif (this.version === 1 && typeof value !== \"number\") {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Node ${this.endpoint\n\t\t\t\t\t.nodeId as number} only supports IndicatorCC V1 which requires a single value to be set`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t} else if (\n\t\t\tthis.version >= 2\n\t\t\t&& isArray(value)\n\t\t\t&& value.length > MAX_INDICATOR_OBJECTS\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Only ${MAX_INDICATOR_OBJECTS} indicator values can be set at a time!`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\tconst cc = new IndicatorCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...(typeof value === \"number\" ? { value } : { values: value }),\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async sendReport(\n\t\toptions: IndicatorCCReportOptions,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.Report,\n\t\t);\n\n\t\tconst cc = new IndicatorCCReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async getSupported(indicatorId: number): Promise<\n\t\t| {\n\t\t\tindicatorId?: number;\n\t\t\tsupportedProperties: readonly number[];\n\t\t\tnextIndicatorId: number;\n\t\t}\n\t\t| undefined\n\t> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.SupportedGet,\n\t\t);\n\n\t\tconst cc = new IndicatorCCSupportedGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tIndicatorCCSupportedReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn {\n\t\t\t\t// Include the actual indicator ID if 0x00 was requested\n\t\t\t\t...(indicatorId === 0x00\n\t\t\t\t\t? { indicatorId: response.indicatorId }\n\t\t\t\t\t: undefined),\n\t\t\t\tsupportedProperties: response.supportedProperties,\n\t\t\t\tnextIndicatorId: response.nextIndicatorId,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async reportSupported(\n\t\tindicatorId: number,\n\t\tsupportedProperties: readonly number[],\n\t\tnextIndicatorId: number,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.SupportedReport,\n\t\t);\n\n\t\tconst cc = new IndicatorCCSupportedReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t\tsupportedProperties,\n\t\t\tnextIndicatorId,\n\t\t});\n\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async reportDescription(\n\t\tindicatorId: number,\n\t\tdescription: string,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.DescriptionReport,\n\t\t);\n\n\t\tconst cc = new IndicatorCCDescriptionReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t\tdescription,\n\t\t});\n\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t/**\n\t * Instructs the node to identify itself. Available starting with V3 of this CC.\n\t */\n\tpublic async identify(): Promise<SupervisionResult | undefined> {\n\t\tif (this.version < 3) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The identify command is only supported in Indicator CC version 3 and above`,\n\t\t\t\tZWaveErrorCodes.CC_NotSupported,\n\t\t\t);\n\t\t}\n\t\treturn this.set([\n\t\t\t{\n\t\t\t\tindicatorId: 0x50,\n\t\t\t\tpropertyId: 0x03,\n\t\t\t\tvalue: 0x08,\n\t\t\t},\n\t\t\t{\n\t\t\t\tindicatorId: 0x50,\n\t\t\t\tpropertyId: 0x04,\n\t\t\t\tvalue: 0x03,\n\t\t\t},\n\t\t\t{\n\t\t\t\tindicatorId: 0x50,\n\t\t\t\tpropertyId: 0x05,\n\t\t\t\tvalue: 0x06,\n\t\t\t},\n\t\t]);\n\t}\n\n\t/**\n\t * Set a timeout for a given indicator ID after which the indicator will be turned off.\n\t * @param timeout The timeout in one of the supported forms:\n\t * \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 * \t- an object specifying the timeout parts. An empty object will be treated like `undefined`.\n\t * \t- `undefined` to disable the timeout.\n\t */\n\t@validateArgs()\n\tpublic async setTimeout(\n\t\tindicatorId: number,\n\t\ttimeout: IndicatorTimeout | string | undefined,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertPhysicalEndpoint(this.endpoint);\n\n\t\tif (this.version < 3) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The setTimeout command is only supported in Indicator CC version 3 and above`,\n\t\t\t\tZWaveErrorCodes.CC_NotSupported,\n\t\t\t);\n\t\t}\n\n\t\tif (typeof timeout === \"string\") {\n\t\t\tif (timeout === \"\") {\n\t\t\t\ttimeout = undefined;\n\t\t\t} else {\n\t\t\t\tconst parsed = parseIndicatorTimeoutString(timeout);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The timeout string \"${timeout}\" is not valid`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttimeout = parsed;\n\t\t\t}\n\t\t}\n\n\t\tconst supportedPropertyIDs = IndicatorCC.getSupportedPropertyIDsCached(\n\t\t\tthis.host,\n\t\t\tthis.endpoint,\n\t\t\tindicatorId,\n\t\t);\n\n\t\tconst objects: IndicatorObject[] = [];\n\t\tif (timeout) {\n\t\t\tconst hours = timeout.hours ?? 0;\n\t\t\tconst minutes = timeout.minutes ?? 0;\n\t\t\tconst seconds = Math.floor(timeout.seconds ?? 0);\n\t\t\tconst hundredths = Math.round(((timeout.seconds ?? 0) % 1) * 100);\n\n\t\t\tif (hours) {\n\t\t\t\tif (!supportedPropertyIDs?.includes(0x0a)) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The indicator ${indicatorId} does not support setting the timeout in hours`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tobjects.push({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: 0x0a,\n\t\t\t\t\tvalue: hours,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (minutes) {\n\t\t\t\tif (!supportedPropertyIDs?.includes(0x06)) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The indicator ${indicatorId} does not support setting the timeout in minutes`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tobjects.push({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: 0x06,\n\t\t\t\t\tvalue: minutes,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (seconds) {\n\t\t\t\tif (!supportedPropertyIDs?.includes(0x07)) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The indicator ${indicatorId} does not support setting the timeout in seconds`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tobjects.push({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: 0x07,\n\t\t\t\t\tvalue: seconds,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (hundredths) {\n\t\t\t\tif (!supportedPropertyIDs?.includes(0x08)) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The indicator ${indicatorId} does not support setting the timeout in 1/100 seconds`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tobjects.push({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: 0x08,\n\t\t\t\t\tvalue: hundredths,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (!objects.length) {\n\t\t\tobjects.push(\n\t\t\t\t...(supportedPropertyIDs ?? []).map((p) => ({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: p,\n\t\t\t\t\tvalue: 0,\n\t\t\t\t})),\n\t\t\t);\n\t\t}\n\n\t\treturn this.set(objects);\n\t}\n\n\t/**\n\t * Returns the timeout after which the given indicator will be turned off.\n\t */\n\t@validateArgs()\n\tpublic async getTimeout(\n\t\tindicatorId: number,\n\t): Promise<MaybeNotKnown<IndicatorTimeout>> {\n\t\tconst values = await this.get(indicatorId);\n\t\tif (!isArray(values)) return;\n\n\t\treturn indicatorObjectsToTimeout(values);\n\t}\n\n\t@validateArgs()\n\tpublic async getDescription(\n\t\tindicatorId: number,\n\t): Promise<MaybeNotKnown<string>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.DescriptionGet,\n\t\t);\n\n\t\tconst cc = new IndicatorCCDescriptionGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tIndicatorCCDescriptionReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.description;\n\t}\n}\n\n@commandClass(CommandClasses.Indicator)\n@implementedVersion(4)\n@ccValues(IndicatorCCValues)\nexport class IndicatorCC extends CommandClass {\n\tdeclare ccCommand: IndicatorCommand;\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses.Indicator,\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tif (api.version > 1) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"scanning supported indicator IDs...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\t// Query ID 0 to get the first supported ID\n\t\t\tlet curId = 0x00;\n\t\t\tconst supportedIndicatorIds: number[] = [];\n\t\t\tdo {\n\t\t\t\tconst supportedResponse = await api.getSupported(curId);\n\t\t\t\tif (!supportedResponse) {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"Time out while scanning supported indicator IDs, skipping interview...\",\n\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (supportedResponse.supportedProperties.length > 0) {\n\t\t\t\t\tsupportedIndicatorIds.push(\n\t\t\t\t\t\tsupportedResponse.indicatorId ?? curId,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcurId = supportedResponse.nextIndicatorId;\n\t\t\t} while (curId !== 0x00);\n\n\t\t\t// The IDs are not stored by the report CCs so store them here once we have all of them\n\t\t\tthis.setValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.supportedIndicatorIds,\n\t\t\t\tsupportedIndicatorIds,\n\t\t\t);\n\t\t\tconst logMessage = `supported indicator IDs: ${\n\t\t\t\tsupportedIndicatorIds.join(\n\t\t\t\t\t\", \",\n\t\t\t\t)\n\t\t\t}`;\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: logMessage,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\n\t\t\tif (api.version >= 4) {\n\t\t\t\tconst manufacturerDefinedIndicatorIds = supportedIndicatorIds\n\t\t\t\t\t.filter((id) => isManufacturerDefinedIndicator(id));\n\t\t\t\tif (manufacturerDefinedIndicatorIds.length > 0) {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"retrieving description for manufacturer-defined indicator IDs...\",\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (const id of manufacturerDefinedIndicatorIds) {\n\t\t\t\t\t\tawait api.getDescription(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Query current values\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses.Indicator,\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tif (api.version === 1) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"requesting current indicator value...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tawait api.get();\n\t\t} else {\n\t\t\tconst supportedIndicatorIds: number[] = this.getValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.supportedIndicatorIds,\n\t\t\t) ?? [];\n\t\t\tfor (const indicatorId of supportedIndicatorIds) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `requesting current indicator value (id = ${\n\t\t\t\t\t\tnum2hex(\n\t\t\t\t\t\t\tindicatorId,\n\t\t\t\t\t\t)\n\t\t\t\t\t})...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tawait api.get(indicatorId);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic translatePropertyKey(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\tif (property === \"value\") {\n\t\t\t// CC version 1 only has a single value that doesn't need to be translated\n\t\t\treturn undefined;\n\t\t} else if (\n\t\t\ttypeof property === \"number\"\n\t\t\t&& typeof propertyKey === \"number\"\n\t\t) {\n\t\t\t// The indicator property is our property key\n\t\t\tconst prop = getIndicatorProperty(propertyKey);\n\t\t\tif (prop) return prop.label;\n\t\t} else if (\n\t\t\ttypeof property === \"number\"\n\t\t\t&& propertyKey === \"timeout\"\n\t\t) {\n\t\t\treturn \"Timeout\";\n\t\t}\n\t\treturn super.translatePropertyKey(ctx, property, propertyKey);\n\t}\n\n\tpublic translateProperty(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey?: string | number,\n\t): string {\n\t\tif (typeof property === \"number\") {\n\t\t\tif (typeof propertyKey === \"number\" || propertyKey === \"timeout\") {\n\t\t\t\t// The indicator corresponds to our property\n\t\t\t\tif (property in Indicator) return Indicator[property];\n\t\t\t}\n\t\t}\n\t\treturn super.translateProperty(ctx, property, propertyKey);\n\t}\n\n\tprotected supportsV2Indicators(ctx: GetValueDB): boolean {\n\t\t// First test if there are any indicator ids defined\n\t\tconst supportedIndicatorIds = this.getValue<number[]>(\n\t\t\tctx,\n\t\t\tIndicatorCCValues.supportedIndicatorIds,\n\t\t);\n\t\tif (!supportedIndicatorIds?.length) return false;\n\t\t// Then test if there are any property ids defined\n\t\treturn supportedIndicatorIds.some(\n\t\t\t(indicatorId) =>\n\t\t\t\t!!this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tIndicatorCCValues.supportedPropertyIDs(indicatorId),\n\t\t\t\t)?.length,\n\t\t);\n\t}\n\n\tprotected getManufacturerDefinedIndicatorLabel(\n\t\tctx: GetValueDB,\n\t\tindicatorId: number,\n\t): string | undefined {\n\t\tif (\n\t\t\tisManufacturerDefinedIndicator(\n\t\t\t\tindicatorId,\n\t\t\t)\n\t\t) {\n\t\t\treturn this.getValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.indicatorDescription(indicatorId),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic static getSupportedPropertyIDsCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t\tindicatorId: number,\n\t): MaybeNotKnown<number[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(\n\t\t\t\tIndicatorCCValues.supportedPropertyIDs(indicatorId).endpoint(\n\t\t\t\t\tendpoint.index,\n\t\t\t\t),\n\t\t\t);\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorObject {\n\tindicatorId: number;\n\tpropertyId: number;\n\tvalue: number | boolean;\n}\n\n// @publicAPI\nexport type IndicatorCCSetOptions =\n\t| {\n\t\tvalue: number;\n\t}\n\t| {\n\t\tvalues: IndicatorObject[];\n\t};\n\n@CCCommand(IndicatorCommand.Set)\n@useSupervision()\nexport class IndicatorCCSet extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tif (\"value\" in options) {\n\t\t\tthis.indicator0Value = options.value;\n\t\t} else {\n\t\t\tthis.values = options.values;\n\t\t}\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCSet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\n\t\tconst objCount = raw.payload.length >= 2\n\t\t\t? raw.payload[1] & 0b11111\n\t\t\t: 0;\n\n\t\tif (objCount === 0) {\n\t\t\tconst indicator0Value = raw.payload[0];\n\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tvalue: indicator0Value,\n\t\t\t});\n\t\t}\n\n\t\tvalidatePayload(raw.payload.length >= 2 + 3 * objCount);\n\n\t\tconst values: IndicatorObject[] = [];\n\t\tfor (let i = 0; i < objCount; i++) {\n\t\t\tconst offset = 2 + 3 * i;\n\t\t\tconst value: IndicatorObject = {\n\t\t\t\tindicatorId: raw.payload[offset],\n\t\t\t\tpropertyId: raw.payload[offset + 1],\n\t\t\t\tvalue: raw.payload[offset + 2],\n\t\t\t};\n\t\t\tvalues.push(value);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tvalues,\n\t\t});\n\t}\n\n\tpublic indicator0Value: number | undefined;\n\tpublic values: IndicatorObject[] | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tif (this.values != undefined) {\n\t\t\t// V2+\n\t\t\tthis.payload = Bytes.alloc(2 + 3 * this.values.length, 0);\n\t\t\t// Byte 0 is the legacy value\n\t\t\tconst objCount = this.values.length & MAX_INDICATOR_OBJECTS;\n\t\t\tthis.payload[1] = objCount;\n\t\t\tfor (let i = 0; i < objCount; i++) {\n\t\t\t\tconst offset = 2 + 3 * i;\n\t\t\t\tthis.payload[offset] = this.values[i].indicatorId;\n\t\t\t\tthis.payload[offset + 1] = this.values[i].propertyId;\n\t\t\t\tconst value = this.values[i].value;\n\t\t\t\tthis.payload[offset + 2] = value === true\n\t\t\t\t\t? 0xff\n\t\t\t\t\t: value === false\n\t\t\t\t\t? 0x00\n\t\t\t\t\t: value;\n\t\t\t}\n\t\t} else {\n\t\t\t// V1\n\t\t\tthis.payload = Bytes.from([this.indicator0Value ?? 0]);\n\t\t}\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {};\n\t\tif (this.indicator0Value != undefined) {\n\t\t\tmessage[\"indicator 0 value\"] = this.indicator0Value;\n\t\t}\n\t\tif (this.values != undefined) {\n\t\t\tmessage.values = this.values\n\t\t\t\t.map(\n\t\t\t\t\t(v) => `\n\u00B7 indicatorId: ${v.indicatorId}\n propertyId: ${v.propertyId}\n value: ${v.value}`,\n\t\t\t\t)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport type IndicatorCCReportOptions =\n\t| {\n\t\tvalue: number;\n\t}\n\t| {\n\t\tvalues: IndicatorObject[];\n\t};\n\n@CCCommand(IndicatorCommand.Report)\nexport class IndicatorCCReport extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tif (\"value\" in options) {\n\t\t\tthis.indicator0Value = options.value;\n\t\t} else if (\"values\" in options) {\n\t\t\tif (options.values.length > MAX_INDICATOR_OBJECTS) {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Only ${MAX_INDICATOR_OBJECTS} indicator values can be set at a time!`,\n\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.values = options.values;\n\t\t}\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\n\t\tconst objCount = raw.payload.length >= 2\n\t\t\t? raw.payload[1] & 0b11111\n\t\t\t: 0;\n\n\t\tif (objCount === 0) {\n\t\t\tconst indicator0Value = raw.payload[0];\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tvalue: indicator0Value,\n\t\t\t});\n\t\t}\n\n\t\tvalidatePayload(raw.payload.length >= 2 + 3 * objCount);\n\n\t\tconst values: IndicatorObject[] = [];\n\t\tfor (let i = 0; i < objCount; i++) {\n\t\t\tconst offset = 2 + 3 * i;\n\t\t\tconst value: IndicatorObject = {\n\t\t\t\tindicatorId: raw.payload[offset],\n\t\t\t\tpropertyId: raw.payload[offset + 1],\n\t\t\t\tvalue: raw.payload[offset + 2],\n\t\t\t};\n\t\t\tvalues.push(value);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tvalues,\n\t\t});\n\n\t\t// TODO: Think if we want this:\n\n\t\t// // If not all Property IDs are included in the command for the actual Indicator ID,\n\t\t// // a controlling node MUST assume non-specified Property IDs values to be 0x00.\n\t\t// const indicatorId = this.values[0].indicatorId;\n\t\t// const supportedIndicatorProperties =\n\t\t// \tvalueDB.getValue<number[]>(\n\t\t// \t\tgetSupportedPropertyIDsValueID(\n\t\t// \t\t\tthis.endpointIndex,\n\t\t// \t\t\tindicatorId,\n\t\t// \t\t),\n\t\t// \t) ?? [];\n\t\t// // Find out which ones are missing\n\t\t// const missingIndicatorProperties = supportedIndicatorProperties.filter(\n\t\t// \tprop =>\n\t\t// \t\t!this.values!.find(({ propertyId }) => prop === propertyId),\n\t\t// );\n\t\t// // And assume they are 0 (false)\n\t\t// for (const missing of missingIndicatorProperties) {\n\t\t// \tthis.setIndicatorValue({\n\t\t// \t\tindicatorId,\n\t\t// \t\tpropertyId: missing,\n\t\t// \t\tvalue: 0,\n\t\t// \t});\n\t\t// }\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tif (this.indicator0Value != undefined) {\n\t\t\tif (!this.supportsV2Indicators(ctx)) {\n\t\t\t\t// Publish the value\n\t\t\t\tconst valueV1 = IndicatorCCValues.valueV1;\n\t\t\t\tthis.setMetadata(ctx, valueV1);\n\t\t\t\tthis.setValue(ctx, valueV1, this.indicator0Value);\n\t\t\t} else {\n\t\t\t\tif (this.isSinglecast()) {\n\t\t\t\t\t// Don't!\n\t\t\t\t\tctx.logNode(this.nodeId, {\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`ignoring V1 indicator report because the node supports V2 indicators`,\n\t\t\t\t\t\tdirection: \"none\",\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.values) {\n\t\t\t// Store the simple values first\n\t\t\tfor (const value of this.values) {\n\t\t\t\tthis.setIndicatorValue(ctx, value);\n\t\t\t}\n\n\t\t\t// Then group values into the convenience properties\n\t\t\tconst groupedValues = groupByIndicatorId(this.values);\n\t\t\tfor (const [indicatorId, values] of groupedValues) {\n\t\t\t\t// Some devices report all properties it supports in every report,\n\t\t\t\t// even if it does not support all properties for the given indicator ID.\n\t\t\t\t// To avoid confusion, we need to filter out the unsupported properties\n\n\t\t\t\tconst supportedPropertyIDs = this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tIndicatorCCValues.supportedPropertyIDs(indicatorId),\n\t\t\t\t) ?? [];\n\t\t\t\tconst filteredValues = values.filter(\n\t\t\t\t\t(v) => supportedPropertyIDs.includes(v.propertyId),\n\t\t\t\t);\n\n\t\t\t\tconst overrideIndicatorLabel = this\n\t\t\t\t\t.getManufacturerDefinedIndicatorLabel(ctx, indicatorId);\n\n\t\t\t\t// ... timeout\n\t\t\t\tconst timeout = indicatorObjectsToTimeout(filteredValues);\n\t\t\t\tif (timeout) {\n\t\t\t\t\tlet timeoutString = \"\";\n\t\t\t\t\tif (timeout?.hours) timeoutString += `${timeout.hours}h`;\n\t\t\t\t\tif (timeout?.minutes) {\n\t\t\t\t\t\ttimeoutString += `${timeout.minutes}m`;\n\t\t\t\t\t}\n\t\t\t\t\tif (timeout?.seconds) {\n\t\t\t\t\t\ttimeoutString += `${timeout.seconds}s`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst timeoutValue = IndicatorCCValues.timeout(indicatorId);\n\n\t\t\t\t\tconst metadata: ValueMetadata = {\n\t\t\t\t\t\t...timeoutValue.meta,\n\t\t\t\t\t\tlabel: getIndicatorLabel(\n\t\t\t\t\t\t\tindicatorId,\n\t\t\t\t\t\t\t0x06, // This is actually ignored, but pass a valid ID for clarity\n\t\t\t\t\t\t\toverrideIndicatorLabel,\n\t\t\t\t\t\t\t\"Timeout\",\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.setMetadata(ctx, timeoutValue, metadata);\n\t\t\t\t\tthis.setValue(ctx, timeoutValue, timeoutString);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic readonly indicator0Value: number | undefined;\n\tpublic readonly values: IndicatorObject[] | undefined;\n\n\tprivate setIndicatorValue(\n\t\tctx: GetValueDB,\n\t\tvalue: IndicatorObject,\n\t): void {\n\t\t// Manufacturer-defined indicators may need a custom label\n\t\tconst overrideIndicatorLabel = this\n\t\t\t.getManufacturerDefinedIndicatorLabel(ctx, value.indicatorId);\n\n\t\tconst metadata = getIndicatorMetadata(\n\t\t\tvalue.indicatorId,\n\t\t\tvalue.propertyId,\n\t\t\toverrideIndicatorLabel,\n\t\t);\n\t\t// Some values need to be converted\n\t\tif (metadata.type === \"boolean\") {\n\t\t\tvalue.value = !!value.value;\n\t\t}\n\n\t\t// Only expose the value if it should be user-facing\n\t\tif (value.indicatorId === Indicator[\"Node Identify\"]) {\n\t\t\treturn;\n\t\t}\n\t\tconst prop = getIndicatorProperty(value.propertyId);\n\t\tif (!prop?.exposeAsValue) return;\n\n\t\t// And only if it is actually supported and not just reported by accident\n\t\tconst supportedPropertyIDs = this.getValue<number[]>(\n\t\t\tctx,\n\t\t\tIndicatorCCValues.supportedPropertyIDs(value.indicatorId),\n\t\t) ?? [];\n\t\tif (!supportedPropertyIDs.includes(value.propertyId)) return;\n\n\t\t// Publish the value\n\t\tconst valueV2 = IndicatorCCValues.valueV2(\n\t\t\tvalue.indicatorId,\n\t\t\tvalue.propertyId,\n\t\t);\n\t\tthis.setMetadata(ctx, valueV2, metadata);\n\t\tthis.setValue(ctx, valueV2, value.value);\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tif (this.values != undefined) {\n\t\t\t// V2+\n\t\t\tthis.payload = Bytes.alloc(2 + 3 * this.values.length, 0);\n\t\t\t// Byte 0 is the legacy value\n\t\t\tconst objCount = this.values.length & MAX_INDICATOR_OBJECTS;\n\t\t\tthis.payload[1] = objCount;\n\t\t\tfor (let i = 0; i < objCount; i++) {\n\t\t\t\tconst offset = 2 + 3 * i;\n\t\t\t\tthis.payload[offset] = this.values[i].indicatorId;\n\t\t\t\tthis.payload[offset + 1] = this.values[i].propertyId;\n\t\t\t\tconst value = this.values[i].value;\n\t\t\t\tthis.payload[offset + 2] = value === true\n\t\t\t\t\t? 0xff\n\t\t\t\t\t: value === false\n\t\t\t\t\t? 0x00\n\t\t\t\t\t: value;\n\t\t\t}\n\t\t} else {\n\t\t\t// V1\n\t\t\tthis.payload = Bytes.from([this.indicator0Value ?? 0]);\n\t\t}\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {};\n\t\tif (this.indicator0Value != undefined) {\n\t\t\tmessage[\"indicator 0 value\"] = this.indicator0Value;\n\t\t}\n\t\tif (this.values != undefined) {\n\t\t\tmessage.values = this.values\n\t\t\t\t.map(\n\t\t\t\t\t(v) => `\n\u00B7 indicatorId: ${v.indicatorId}\n propertyId: ${v.propertyId}\n value: ${v.value}`,\n\t\t\t\t)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCGetOptions {\n\tindicatorId?: number;\n}\n\n@CCCommand(IndicatorCommand.Get)\n@expectedCCResponse(IndicatorCCReport)\nexport class IndicatorCCGet extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.indicatorId = options.indicatorId;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCGet {\n\t\tlet indicatorId: number | undefined;\n\n\t\tif (raw.payload.length > 0) {\n\t\t\tindicatorId = raw.payload[0];\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t});\n\t}\n\n\tpublic indicatorId: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tif (this.indicatorId != undefined) {\n\t\t\tthis.payload = Bytes.from([this.indicatorId]);\n\t\t}\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tindicator: getIndicatorName(this.indicatorId),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCSupportedReportOptions {\n\tindicatorId: number;\n\tnextIndicatorId: number;\n\tsupportedProperties: readonly number[];\n}\n\n@CCCommand(IndicatorCommand.SupportedReport)\nexport class IndicatorCCSupportedReport extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.indicatorId = options.indicatorId;\n\t\tthis.nextIndicatorId = options.nextIndicatorId;\n\t\tthis.supportedProperties = options.supportedProperties;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): IndicatorCCSupportedReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst indicatorId = raw.payload[0];\n\t\tconst nextIndicatorId = raw.payload[1];\n\t\tconst bitMaskLength = raw.payload[2] & 0b11111;\n\t\tlet supportedProperties: readonly number[];\n\n\t\tif (bitMaskLength === 0) {\n\t\t\tsupportedProperties = [];\n\t\t} else {\n\t\t\tvalidatePayload(raw.payload.length >= 3 + bitMaskLength);\n\t\t\t// The bit mask starts at 0, but bit 0 is not used\n\t\t\tsupportedProperties = parseBitMask(\n\t\t\t\traw.payload.subarray(3, 3 + bitMaskLength),\n\t\t\t\t0,\n\t\t\t).filter((v) => v !== 0);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t\tnextIndicatorId,\n\t\t\tsupportedProperties,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tif (this.indicatorId !== 0x00) {\n\t\t\t// Remember which property IDs are supported\n\t\t\tthis.setValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.supportedPropertyIDs(this.indicatorId),\n\t\t\t\tthis.supportedProperties,\n\t\t\t);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic readonly indicatorId: number;\n\tpublic readonly nextIndicatorId: number;\n\tpublic readonly supportedProperties: readonly number[];\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst bitmask = this.supportedProperties.length > 0\n\t\t\t? encodeBitMask(this.supportedProperties, undefined, 0)\n\t\t\t: new Bytes();\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([\n\t\t\t\tthis.indicatorId,\n\t\t\t\tthis.nextIndicatorId,\n\t\t\t\tbitmask.length,\n\t\t\t]),\n\t\t\tbitmask,\n\t\t]);\n\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tindicator: getIndicatorName(this.indicatorId),\n\t\t\t\t\"supported properties\": this.supportedProperties\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(id) =>\n\t\t\t\t\t\t\tgetIndicatorProperty(id)?.label\n\t\t\t\t\t\t\t\t?? `Unknown (${num2hex(id)})`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\", \"),\n\t\t\t\t\"next indicator\": getIndicatorName(this.nextIndicatorId),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCSupportedGetOptions {\n\tindicatorId: number;\n}\n\nfunction testResponseForIndicatorSupportedGet(\n\tsent: IndicatorCCSupportedGet,\n\treceived: IndicatorCCSupportedReport,\n) {\n\treturn sent.indicatorId === 0 || received.indicatorId === sent.indicatorId;\n}\n\n@CCCommand(IndicatorCommand.SupportedGet)\n@expectedCCResponse(\n\tIndicatorCCSupportedReport,\n\ttestResponseForIndicatorSupportedGet,\n)\nexport class IndicatorCCSupportedGet extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCSupportedGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.indicatorId = options.indicatorId;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): IndicatorCCSupportedGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst indicatorId = raw.payload[0];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t});\n\t}\n\n\tpublic indicatorId: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.indicatorId]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tindicator: getIndicatorName(this.indicatorId),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCDescriptionReportOptions {\n\tindicatorId: number;\n\tdescription: string;\n}\n\n@CCCommand(IndicatorCommand.DescriptionReport)\nexport class IndicatorCCDescriptionReport extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCDescriptionReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.indicatorId = options.indicatorId;\n\t\tthis.description = options.description;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): IndicatorCCDescriptionReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst indicatorId = raw.payload[0];\n\t\tconst descrptionLength = raw.payload[1];\n\t\tvalidatePayload(raw.payload.length >= 2 + descrptionLength);\n\t\tconst description: string = raw.payload\n\t\t\t.subarray(2, 2 + descrptionLength)\n\t\t\t.toString(\"utf8\");\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t\tdescription,\n\t\t});\n\t}\n\n\tpublic indicatorId: number;\n\tpublic description: string;\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tif (this.description) {\n\t\t\tthis.setValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.indicatorDescription(this.indicatorId),\n\t\t\t\tthis.description,\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst description = Bytes.from(this.description, \"utf8\");\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.indicatorId, description.length]),\n\t\t\tdescription,\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"indicator ID\": this.indicatorId,\n\t\t\t\tdescription: this.description || \"(none)\",\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCDescriptionGetOptions {\n\tindicatorId: number;\n}\n\nfunction testResponseForIndicatorDescriptionGet(\n\tsent: IndicatorCCDescriptionGet,\n\treceived: IndicatorCCDescriptionReport,\n) {\n\treturn received.indicatorId === sent.indicatorId;\n}\n\n@CCCommand(IndicatorCommand.DescriptionGet)\n@expectedCCResponse(\n\tIndicatorCCDescriptionReport,\n\ttestResponseForIndicatorDescriptionGet,\n)\nexport class IndicatorCCDescriptionGet extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCDescriptionGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.indicatorId = options.indicatorId;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): IndicatorCCDescriptionGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst indicatorId = raw.payload[0];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t});\n\t}\n\n\tpublic indicatorId: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.indicatorId]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"indicator ID\": this.indicatorId,\n\t\t\t},\n\t\t};\n\t}\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\ttype EndpointId,\n\ttype GetValueDB,\n\tIndicator,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype SupervisionResult,\n\ttype ValueID,\n\tValueMetadata,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeBitMask,\n\tgetIndicatorProperty,\n\tparseBitMask,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, num2hex } from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { clamp, roundTo } from \"alcalzone-shared/math\";\nimport { isArray } from \"alcalzone-shared/typeguards\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { IndicatorCommand, type IndicatorTimeout } from \"../lib/_Types.js\";\n\nfunction isManufacturerDefinedIndicator(indicatorId: number): boolean {\n\treturn indicatorId >= 0x80 && indicatorId <= 0x9f;\n}\n\nconst timeoutStringRegex =\n\t/^(?:(?<hoursStr>\\d+)h)?(?:(?<minutesStr>\\d+)m)?(?:(?<secondsStr>\\d+(?:\\.\\d+)?)s)?$/i;\n\nconst MAX_INDICATOR_OBJECTS = 31;\n\nfunction parseIndicatorTimeoutString(\n\ttext: string,\n): IndicatorTimeout | undefined {\n\tif (!text.length) return undefined;\n\t// Try to parse the numeric parts from a timeout\n\tconst match = timeoutStringRegex.exec(text);\n\tif (!match) return undefined;\n\tconst { hoursStr, minutesStr, secondsStr } = match.groups!;\n\tif (!hoursStr && !minutesStr && !secondsStr) return undefined;\n\n\tconst ret: IndicatorTimeout = {};\n\tif (hoursStr) {\n\t\tret.hours = clamp(parseInt(hoursStr, 10), 0, 255);\n\t}\n\tif (minutesStr) {\n\t\tret.minutes = clamp(parseInt(minutesStr, 10), 0, 255);\n\t}\n\tif (secondsStr) {\n\t\tret.seconds = clamp(roundTo(parseFloat(secondsStr), 2), 0, 59.99);\n\t}\n\n\treturn ret;\n}\n\nfunction groupByIndicatorId(\n\tvalues: IndicatorObject[],\n): Map<number, IndicatorObject[]> {\n\tconst ret = new Map();\n\n\tfor (const value of values) {\n\t\tif (!ret.has(value.indicatorId)) {\n\t\t\tret.set(value.indicatorId, []);\n\t\t}\n\t\tret.get(value.indicatorId)!.push(value);\n\t}\n\n\treturn ret;\n}\n\nfunction indicatorObjectsToTimeout(\n\tvalues: IndicatorObject[],\n): IndicatorTimeout | undefined {\n\tconst timeoutValues = values.filter((v) =>\n\t\t[0x0a, 0x06, 0x07, 0x08].includes(v.propertyId)\n\t);\n\tif (!timeoutValues.length) return undefined;\n\n\tconst hours = (timeoutValues.find((v) => v.propertyId === 0x0a)?.value\n\t\t?? 0) as number;\n\tconst minutes = (timeoutValues.find((v) => v.propertyId === 0x06)?.value\n\t\t?? 0) as number;\n\tconst seconds = clamp(\n\t\t(timeoutValues.find((v) => v.propertyId === 0x07)\n\t\t\t?.value as number) ?? 0,\n\t\t0,\n\t\t59,\n\t)\n\t\t+ clamp(\n\t\t\t\t(timeoutValues.find((v) => v.propertyId === 0x08)\n\t\t\t\t\t?.value as number) ?? 0,\n\t\t\t\t0,\n\t\t\t\t99,\n\t\t\t)\n\t\t\t/ 100;\n\n\treturn {\n\t\thours,\n\t\tminutes,\n\t\tseconds,\n\t};\n}\n\nexport const IndicatorCCValues = V.defineCCValues(CommandClasses.Indicator, {\n\t...V.staticProperty(\"supportedIndicatorIds\", undefined, {\n\t\tinternal: true,\n\t}),\n\t...V.staticPropertyWithName(\n\t\t\"valueV1\",\n\t\t\"value\",\n\t\t{\n\t\t\t...ValueMetadata.UInt8,\n\t\t\tlabel: \"Indicator value\",\n\t\t\tccSpecific: {\n\t\t\t\tindicatorId: 0,\n\t\t\t},\n\t\t} as const,\n\t),\n\t...V.staticProperty(\n\t\t\"identify\",\n\t\t{\n\t\t\t...ValueMetadata.WriteOnlyBoolean,\n\t\t\tlabel: \"Identify\",\n\t\t\tstates: {\n\t\t\t\ttrue: \"Identify\",\n\t\t\t},\n\t\t} as const,\n\t\t{ minVersion: 3 } as const,\n\t),\n\t...V.dynamicPropertyAndKeyWithName(\n\t\t\"supportedPropertyIDs\",\n\t\t\"supportedPropertyIDs\",\n\t\t(indicatorId: number) => indicatorId,\n\t\t({ property, propertyKey }) =>\n\t\t\tproperty === \"supportedPropertyIDs\"\n\t\t\t&& typeof propertyKey === \"number\",\n\t\tundefined,\n\t\t{ internal: true },\n\t),\n\t...V.dynamicPropertyAndKeyWithName(\n\t\t\"valueV2\",\n\t\t// oxlint-disable-next-line no-unused-vars\n\t\t(indicatorId: number, propertyId: number) => indicatorId,\n\t\t(indicatorId: number, propertyId: number) => propertyId,\n\t\t({ property, propertyKey }) =>\n\t\t\ttypeof property === \"number\" && typeof propertyKey === \"number\",\n\t\t// The metadata is highly dependent on the indicator and property\n\t\t// so this is just a baseline\n\t\t(indicatorId: number, propertyId: number) => ({\n\t\t\t...ValueMetadata.Any,\n\t\t\tccSpecific: {\n\t\t\t\tindicatorId,\n\t\t\t\tpropertyId,\n\t\t\t},\n\t\t}),\n\t\t{ minVersion: 2 } as const,\n\t),\n\t...V.dynamicPropertyAndKeyWithName(\n\t\t\"timeout\",\n\t\t(indicatorId: number) => indicatorId,\n\t\t// oxlint-disable-next-line no-unused-vars\n\t\t(indicatorId: number) => \"timeout\",\n\t\t({ property, propertyKey }) =>\n\t\t\ttypeof property === \"number\" && propertyKey === \"timeout\",\n\t\t(indicatorId: number) => ({\n\t\t\t...ValueMetadata.String,\n\t\t\tlabel: \"Timeout\",\n\t\t\tccSpecific: {\n\t\t\t\tindicatorId,\n\t\t\t},\n\t\t}),\n\t\t{ minVersion: 3 } as const,\n\t),\n\t...V.dynamicPropertyWithName(\n\t\t\"indicatorDescription\",\n\t\t(indicatorId: number) => indicatorId,\n\t\t({ property }) => typeof property === \"number\",\n\t\tundefined,\n\t\t{ internal: true, minVersion: 4 } as const,\n\t),\n});\n\n/**\n * Looks up the configured metadata for the given indicator and property\n */\nfunction getIndicatorMetadata(\n\tindicatorId: Indicator,\n\tpropertyId: number,\n\toverrideIndicatorLabel?: string,\n): ValueMetadata {\n\tconst label = getIndicatorLabel(\n\t\tindicatorId,\n\t\tpropertyId,\n\t\toverrideIndicatorLabel,\n\t);\n\tconst prop = getIndicatorProperty(propertyId);\n\tconst baseMetadata = IndicatorCCValues.valueV2(\n\t\tindicatorId,\n\t\tpropertyId,\n\t).meta;\n\n\tif (!prop) {\n\t\treturn {\n\t\t\t...baseMetadata,\n\t\t\t...ValueMetadata.UInt8,\n\t\t\tlabel,\n\t\t};\n\t} else {\n\t\tif (prop.type === \"boolean\") {\n\t\t\treturn {\n\t\t\t\t...baseMetadata,\n\t\t\t\t...ValueMetadata.Boolean,\n\t\t\t\tlabel,\n\t\t\t\tdescription: prop.description,\n\t\t\t\treadable: !prop.readonly,\n\t\t\t};\n\t\t} else {\n\t\t\t// UInt8\n\t\t\treturn {\n\t\t\t\t...baseMetadata,\n\t\t\t\t...ValueMetadata.UInt8,\n\t\t\t\tlabel,\n\t\t\t\tdescription: prop.description,\n\t\t\t\tmin: prop.min,\n\t\t\t\tmax: prop.max,\n\t\t\t\treadable: !prop.readonly,\n\t\t\t};\n\t\t}\n\t}\n}\n\nfunction getIndicatorName(\n\tindicatorId: number | undefined,\n): string {\n\tif (indicatorId) {\n\t\treturn getEnumMemberName(Indicator, indicatorId);\n\t} else {\n\t\treturn \"Default\";\n\t}\n}\n\n/** Returns a user-friendly label for an indicator */\nfunction getIndicatorLabel(\n\tindicatorId: number,\n\tpropertyId: number,\n\toverrideIndicatorLabel?: string,\n\toverridePropertyLabel?: string,\n): string {\n\tconst defaultName = overrideIndicatorLabel || getIndicatorName(indicatorId);\n\n\t// Without a defined property, we cannot suggest a better label\n\tconst prop = getIndicatorProperty(propertyId);\n\tif (!prop) return defaultName;\n\n\t// For indicators that correspond to an LCD or buttons,\n\t// the indicator enum names are enough\n\tif (\n\t\tindicatorId >= Indicator[\"LCD backlight\"]\n\t\t&& indicatorId <= Indicator[\"Button 12 indication\"]\n\t\t&& (propertyId === 0x01 /* Multilevel */\n\t\t\t|| propertyId === 0x02 /* Binary */\n\t\t\t|| overridePropertyLabel) // custom property label\n\t) {\n\t\tlet ret: string = (Indicator as any)[indicatorId];\n\t\t// Append the overridden property label if it exists\n\t\tif (overridePropertyLabel) {\n\t\t\tret += ` - ${overridePropertyLabel}`;\n\t\t}\n\t\treturn ret;\n\t}\n\n\t// Default to the current behavior of <indicator name> - <property label>\n\treturn `${defaultName} - ${overridePropertyLabel || prop.label}`;\n}\n\nexport function shouldExposeIndicatorValue(\n\tindicatorId: number,\n\tpropertyId: number,\n): boolean {\n\t// Many possible indicator values are not suitable to be exposed as CC values,\n\t// usually because they need to be set in groups.\n\n\t// Indicator properties that should be exposed are marked as such\n\tconst prop = getIndicatorProperty(propertyId);\n\tif (prop && !prop.exposeAsValue) {\n\t\treturn false;\n\t}\n\n\t// Unless we know better, expose anyways\n\treturn true;\n}\n\n@API(CommandClasses.Indicator)\nexport class IndicatorCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: IndicatorCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase IndicatorCommand.Get:\n\t\t\tcase IndicatorCommand.Report:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase IndicatorCommand.Set:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase IndicatorCommand.SupportedGet:\n\t\t\tcase IndicatorCommand.SupportedReport:\n\t\t\t\treturn this.version >= 2 && this.isSinglecast();\n\t\t\tcase IndicatorCommand.DescriptionGet:\n\t\t\tcase IndicatorCommand.DescriptionReport:\n\t\t\t\treturn this.version >= 4 && this.isSinglecast();\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: IndicatorCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t\tvalue,\n\t\t) {\n\t\t\tconst valueId: ValueID = {\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tendpoint: this.endpoint.index,\n\t\t\t\tproperty,\n\t\t\t\tpropertyKey,\n\t\t\t};\n\n\t\t\tif (property === \"value\") {\n\t\t\t\t// V1 value\n\t\t\t\tif (typeof value !== \"number\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn this.set(value);\n\t\t\t} else if (IndicatorCCValues.valueV2.is(valueId)) {\n\t\t\t\tconst indicatorId = property as number;\n\t\t\t\tconst propertyId = propertyKey as number;\n\t\t\t\tconst expectedType = getIndicatorMetadata(\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId,\n\t\t\t\t).type as \"number\" | \"boolean\";\n\n\t\t\t\t// V2+ value\n\t\t\t\tif (typeof value !== expectedType) {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\texpectedType,\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn this.set([\n\t\t\t\t\t{\n\t\t\t\t\t\tindicatorId,\n\t\t\t\t\t\tpropertyId,\n\t\t\t\t\t\tvalue: value as any,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t} else if (IndicatorCCValues.timeout.is(valueId)) {\n\t\t\t\tconst indicatorId = property as number;\n\t\t\t\tif (typeof value !== \"string\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn this.setTimeout(indicatorId, value);\n\t\t\t} else if (IndicatorCCValues.identify.is(valueId)) {\n\t\t\t\tif (typeof value !== \"boolean\") {\n\t\t\t\t\tthrowWrongValueType(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"boolean\",\n\t\t\t\t\t\ttypeof value,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn this.identify();\n\t\t\t} else {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: IndicatorCCAPI, { property }) {\n\t\t\tif (property === \"value\") return this.get();\n\t\t\tif (typeof property === \"number\") {\n\t\t\t\treturn this.get(property);\n\t\t\t}\n\n\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t};\n\t}\n\n\t@validateArgs()\n\tpublic async get(\n\t\tindicatorId?: number,\n\t): Promise<MaybeNotKnown<number | IndicatorObject[]>> {\n\t\tthis.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Get);\n\n\t\tconst cc = new IndicatorCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t});\n\t\tconst response = await this.host.sendCommand<IndicatorCCReport>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (!response) return;\n\t\tif (response.values) return response.values;\n\t\treturn response.indicator0Value!;\n\t}\n\n\t@validateArgs()\n\tpublic async set(\n\t\tvalue: number | IndicatorObject[],\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(IndicatorCommand, IndicatorCommand.Set);\n\n\t\tif (this.version === 1 && typeof value !== \"number\") {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Node ${this.endpoint\n\t\t\t\t\t.nodeId as number} only supports IndicatorCC V1 which requires a single value to be set`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t} else if (\n\t\t\tthis.version >= 2\n\t\t\t&& isArray(value)\n\t\t\t&& value.length > MAX_INDICATOR_OBJECTS\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Only ${MAX_INDICATOR_OBJECTS} indicator values can be set at a time!`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\tconst cc = new IndicatorCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...(typeof value === \"number\" ? { value } : { values: value }),\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async sendReport(\n\t\toptions: IndicatorCCReportOptions,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.Report,\n\t\t);\n\n\t\tconst cc = new IndicatorCCReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...options,\n\t\t});\n\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async getSupported(indicatorId: number): Promise<\n\t\t| {\n\t\t\tindicatorId?: number;\n\t\t\tsupportedProperties: readonly number[];\n\t\t\tnextIndicatorId: number;\n\t\t}\n\t\t| undefined\n\t> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.SupportedGet,\n\t\t);\n\n\t\tconst cc = new IndicatorCCSupportedGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tIndicatorCCSupportedReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn {\n\t\t\t\t// Include the actual indicator ID if 0x00 was requested\n\t\t\t\t...(indicatorId === 0x00\n\t\t\t\t\t? { indicatorId: response.indicatorId }\n\t\t\t\t\t: undefined),\n\t\t\t\tsupportedProperties: response.supportedProperties,\n\t\t\t\tnextIndicatorId: response.nextIndicatorId,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async reportSupported(\n\t\tindicatorId: number,\n\t\tsupportedProperties: readonly number[],\n\t\tnextIndicatorId: number,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.SupportedReport,\n\t\t);\n\n\t\tconst cc = new IndicatorCCSupportedReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t\tsupportedProperties,\n\t\t\tnextIndicatorId,\n\t\t});\n\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async reportDescription(\n\t\tindicatorId: number,\n\t\tdescription: string,\n\t): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.DescriptionReport,\n\t\t);\n\n\t\tconst cc = new IndicatorCCDescriptionReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t\tdescription,\n\t\t});\n\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t/**\n\t * Instructs the node to identify itself. Available starting with V3 of this CC.\n\t */\n\tpublic async identify(): Promise<SupervisionResult | undefined> {\n\t\tif (this.version < 3) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The identify command is only supported in Indicator CC version 3 and above`,\n\t\t\t\tZWaveErrorCodes.CC_NotSupported,\n\t\t\t);\n\t\t}\n\t\treturn this.set([\n\t\t\t{\n\t\t\t\tindicatorId: 0x50,\n\t\t\t\tpropertyId: 0x03,\n\t\t\t\tvalue: 0x08,\n\t\t\t},\n\t\t\t{\n\t\t\t\tindicatorId: 0x50,\n\t\t\t\tpropertyId: 0x04,\n\t\t\t\tvalue: 0x03,\n\t\t\t},\n\t\t\t{\n\t\t\t\tindicatorId: 0x50,\n\t\t\t\tpropertyId: 0x05,\n\t\t\t\tvalue: 0x06,\n\t\t\t},\n\t\t]);\n\t}\n\n\t/**\n\t * Set a timeout for a given indicator ID after which the indicator will be turned off.\n\t * @param timeout The timeout in one of the supported forms:\n\t * \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 * \t- an object specifying the timeout parts. An empty object will be treated like `undefined`.\n\t * \t- `undefined` to disable the timeout.\n\t */\n\t@validateArgs()\n\tpublic async setTimeout(\n\t\tindicatorId: number,\n\t\ttimeout: IndicatorTimeout | string | undefined,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertPhysicalEndpoint(this.endpoint);\n\n\t\tif (this.version < 3) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`The setTimeout command is only supported in Indicator CC version 3 and above`,\n\t\t\t\tZWaveErrorCodes.CC_NotSupported,\n\t\t\t);\n\t\t}\n\n\t\tif (typeof timeout === \"string\") {\n\t\t\tif (timeout === \"\") {\n\t\t\t\ttimeout = undefined;\n\t\t\t} else {\n\t\t\t\tconst parsed = parseIndicatorTimeoutString(timeout);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The timeout string \"${timeout}\" is not valid`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\ttimeout = parsed;\n\t\t\t}\n\t\t}\n\n\t\tconst supportedPropertyIDs = IndicatorCC.getSupportedPropertyIDsCached(\n\t\t\tthis.host,\n\t\t\tthis.endpoint,\n\t\t\tindicatorId,\n\t\t);\n\n\t\tconst objects: IndicatorObject[] = [];\n\t\tif (timeout) {\n\t\t\tconst hours = timeout.hours ?? 0;\n\t\t\tconst minutes = timeout.minutes ?? 0;\n\t\t\tconst seconds = Math.floor(timeout.seconds ?? 0);\n\t\t\tconst hundredths = Math.round(((timeout.seconds ?? 0) % 1) * 100);\n\n\t\t\tif (hours) {\n\t\t\t\tif (!supportedPropertyIDs?.includes(0x0a)) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The indicator ${indicatorId} does not support setting the timeout in hours`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tobjects.push({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: 0x0a,\n\t\t\t\t\tvalue: hours,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (minutes) {\n\t\t\t\tif (!supportedPropertyIDs?.includes(0x06)) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The indicator ${indicatorId} does not support setting the timeout in minutes`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tobjects.push({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: 0x06,\n\t\t\t\t\tvalue: minutes,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (seconds) {\n\t\t\t\tif (!supportedPropertyIDs?.includes(0x07)) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The indicator ${indicatorId} does not support setting the timeout in seconds`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tobjects.push({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: 0x07,\n\t\t\t\t\tvalue: seconds,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (hundredths) {\n\t\t\t\tif (!supportedPropertyIDs?.includes(0x08)) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t`The indicator ${indicatorId} does not support setting the timeout in 1/100 seconds`,\n\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tobjects.push({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: 0x08,\n\t\t\t\t\tvalue: hundredths,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (!objects.length) {\n\t\t\tobjects.push(\n\t\t\t\t...(supportedPropertyIDs ?? []).map((p) => ({\n\t\t\t\t\tindicatorId,\n\t\t\t\t\tpropertyId: p,\n\t\t\t\t\tvalue: 0,\n\t\t\t\t})),\n\t\t\t);\n\t\t}\n\n\t\treturn this.set(objects);\n\t}\n\n\t/**\n\t * Returns the timeout after which the given indicator will be turned off.\n\t */\n\t@validateArgs()\n\tpublic async getTimeout(\n\t\tindicatorId: number,\n\t): Promise<MaybeNotKnown<IndicatorTimeout>> {\n\t\tconst values = await this.get(indicatorId);\n\t\tif (!isArray(values)) return;\n\n\t\treturn indicatorObjectsToTimeout(values);\n\t}\n\n\t@validateArgs()\n\tpublic async getDescription(\n\t\tindicatorId: number,\n\t): Promise<MaybeNotKnown<string>> {\n\t\tthis.assertSupportsCommand(\n\t\t\tIndicatorCommand,\n\t\t\tIndicatorCommand.DescriptionGet,\n\t\t);\n\n\t\tconst cc = new IndicatorCCDescriptionGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tindicatorId,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tIndicatorCCDescriptionReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.description;\n\t}\n}\n\n@commandClass(CommandClasses.Indicator)\n@implementedVersion(4)\n@ccValues(IndicatorCCValues)\nexport class IndicatorCC extends CommandClass {\n\tdeclare ccCommand: IndicatorCommand;\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses.Indicator,\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tif (api.version > 1) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"scanning supported indicator IDs...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\t// Query ID 0 to get the first supported ID\n\t\t\tlet curId = 0x00;\n\t\t\tconst supportedIndicatorIds: number[] = [];\n\t\t\tdo {\n\t\t\t\tconst supportedResponse = await api.getSupported(curId);\n\t\t\t\tif (!supportedResponse) {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"Time out while scanning supported indicator IDs, skipping interview...\",\n\t\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (supportedResponse.supportedProperties.length > 0) {\n\t\t\t\t\tsupportedIndicatorIds.push(\n\t\t\t\t\t\tsupportedResponse.indicatorId ?? curId,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcurId = supportedResponse.nextIndicatorId;\n\t\t\t} while (curId !== 0x00);\n\n\t\t\t// The IDs are not stored by the report CCs so store them here once we have all of them\n\t\t\tthis.setValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.supportedIndicatorIds,\n\t\t\t\tsupportedIndicatorIds,\n\t\t\t);\n\t\t\tconst logMessage = `supported indicator IDs: ${\n\t\t\t\tsupportedIndicatorIds.join(\n\t\t\t\t\t\", \",\n\t\t\t\t)\n\t\t\t}`;\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: logMessage,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\n\t\t\tif (api.version >= 4) {\n\t\t\t\tconst manufacturerDefinedIndicatorIds = supportedIndicatorIds\n\t\t\t\t\t.filter((id) => isManufacturerDefinedIndicator(id));\n\t\t\t\tif (manufacturerDefinedIndicatorIds.length > 0) {\n\t\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"retrieving description for manufacturer-defined indicator IDs...\",\n\t\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (const id of manufacturerDefinedIndicatorIds) {\n\t\t\t\t\t\tawait api.getDescription(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Query current values\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses.Indicator,\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tif (api.version === 1) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"requesting current indicator value...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tawait api.get();\n\t\t} else {\n\t\t\tconst supportedIndicatorIds: number[] = this.getValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.supportedIndicatorIds,\n\t\t\t) ?? [];\n\t\t\tfor (const indicatorId of supportedIndicatorIds) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: `requesting current indicator value (id = ${\n\t\t\t\t\t\tnum2hex(\n\t\t\t\t\t\t\tindicatorId,\n\t\t\t\t\t\t)\n\t\t\t\t\t})...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tawait api.get(indicatorId);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic translatePropertyKey(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\tif (property === \"value\") {\n\t\t\t// CC version 1 only has a single value that doesn't need to be translated\n\t\t\treturn undefined;\n\t\t} else if (\n\t\t\ttypeof property === \"number\"\n\t\t\t&& typeof propertyKey === \"number\"\n\t\t) {\n\t\t\t// The indicator property is our property key\n\t\t\tconst prop = getIndicatorProperty(propertyKey);\n\t\t\tif (prop) return prop.label;\n\t\t} else if (\n\t\t\ttypeof property === \"number\"\n\t\t\t&& propertyKey === \"timeout\"\n\t\t) {\n\t\t\treturn \"Timeout\";\n\t\t}\n\t\treturn super.translatePropertyKey(ctx, property, propertyKey);\n\t}\n\n\tpublic translateProperty(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey?: string | number,\n\t): string {\n\t\tif (typeof property === \"number\") {\n\t\t\tif (typeof propertyKey === \"number\" || propertyKey === \"timeout\") {\n\t\t\t\t// The indicator corresponds to our property\n\t\t\t\tif (property in Indicator) return Indicator[property];\n\t\t\t}\n\t\t}\n\t\treturn super.translateProperty(ctx, property, propertyKey);\n\t}\n\n\tprotected supportsV2Indicators(ctx: GetValueDB): boolean {\n\t\t// First test if there are any indicator ids defined\n\t\tconst supportedIndicatorIds = this.getValue<number[]>(\n\t\t\tctx,\n\t\t\tIndicatorCCValues.supportedIndicatorIds,\n\t\t);\n\t\tif (!supportedIndicatorIds?.length) return false;\n\t\t// Then test if there are any property ids defined\n\t\treturn supportedIndicatorIds.some(\n\t\t\t(indicatorId) =>\n\t\t\t\t!!this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tIndicatorCCValues.supportedPropertyIDs(indicatorId),\n\t\t\t\t)?.length,\n\t\t);\n\t}\n\n\tprotected getManufacturerDefinedIndicatorLabel(\n\t\tctx: GetValueDB,\n\t\tindicatorId: number,\n\t): string | undefined {\n\t\tif (\n\t\t\tisManufacturerDefinedIndicator(\n\t\t\t\tindicatorId,\n\t\t\t)\n\t\t) {\n\t\t\treturn this.getValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.indicatorDescription(indicatorId),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic static getSupportedPropertyIDsCached(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t\tindicatorId: number,\n\t): MaybeNotKnown<number[]> {\n\t\treturn ctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.getValue(\n\t\t\t\tIndicatorCCValues.supportedPropertyIDs(indicatorId).endpoint(\n\t\t\t\t\tendpoint.index,\n\t\t\t\t),\n\t\t\t);\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorObject {\n\tindicatorId: number;\n\tpropertyId: number;\n\tvalue: number | boolean;\n}\n\n// @publicAPI\nexport type IndicatorCCSetOptions =\n\t| {\n\t\tvalue: number;\n\t}\n\t| {\n\t\tvalues: IndicatorObject[];\n\t};\n\n@CCCommand(IndicatorCommand.Set)\n@useSupervision()\nexport class IndicatorCCSet extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tif (\"value\" in options) {\n\t\t\tthis.indicator0Value = options.value;\n\t\t} else {\n\t\t\tthis.values = options.values;\n\t\t}\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCSet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\n\t\tconst objCount = raw.payload.length >= 2\n\t\t\t? raw.payload[1] & 0b11111\n\t\t\t: 0;\n\n\t\tif (objCount === 0) {\n\t\t\tconst indicator0Value = raw.payload[0];\n\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tvalue: indicator0Value,\n\t\t\t});\n\t\t}\n\n\t\tvalidatePayload(raw.payload.length >= 2 + 3 * objCount);\n\n\t\tconst values: IndicatorObject[] = [];\n\t\tfor (let i = 0; i < objCount; i++) {\n\t\t\tconst offset = 2 + 3 * i;\n\t\t\tconst value: IndicatorObject = {\n\t\t\t\tindicatorId: raw.payload[offset],\n\t\t\t\tpropertyId: raw.payload[offset + 1],\n\t\t\t\tvalue: raw.payload[offset + 2],\n\t\t\t};\n\t\t\tvalues.push(value);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tvalues,\n\t\t});\n\t}\n\n\tpublic indicator0Value: number | undefined;\n\tpublic values: IndicatorObject[] | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tif (this.values != undefined) {\n\t\t\t// V2+\n\t\t\tthis.payload = Bytes.alloc(2 + 3 * this.values.length, 0);\n\t\t\t// Byte 0 is the legacy value\n\t\t\tconst objCount = this.values.length & MAX_INDICATOR_OBJECTS;\n\t\t\tthis.payload[1] = objCount;\n\t\t\tfor (let i = 0; i < objCount; i++) {\n\t\t\t\tconst offset = 2 + 3 * i;\n\t\t\t\tthis.payload[offset] = this.values[i].indicatorId;\n\t\t\t\tthis.payload[offset + 1] = this.values[i].propertyId;\n\t\t\t\tconst value = this.values[i].value;\n\t\t\t\tthis.payload[offset + 2] = value === true\n\t\t\t\t\t? 0xff\n\t\t\t\t\t: value === false\n\t\t\t\t\t? 0x00\n\t\t\t\t\t: value;\n\t\t\t}\n\t\t} else {\n\t\t\t// V1\n\t\t\tthis.payload = Bytes.from([this.indicator0Value ?? 0]);\n\t\t}\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {};\n\t\tif (this.indicator0Value != undefined) {\n\t\t\tmessage[\"indicator 0 value\"] = this.indicator0Value;\n\t\t}\n\t\tif (this.values != undefined) {\n\t\t\tmessage.values = this.values\n\t\t\t\t.map(\n\t\t\t\t\t(v) => `\n\u00B7 indicatorId: ${v.indicatorId}\n propertyId: ${v.propertyId}\n value: ${v.value}`,\n\t\t\t\t)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport type IndicatorCCReportOptions =\n\t| {\n\t\tvalue: number;\n\t}\n\t| {\n\t\tvalues: IndicatorObject[];\n\t};\n\n@CCCommand(IndicatorCommand.Report)\nexport class IndicatorCCReport extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tif (\"value\" in options) {\n\t\t\tthis.indicator0Value = options.value;\n\t\t} else if (\"values\" in options) {\n\t\t\tif (options.values.length > MAX_INDICATOR_OBJECTS) {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Only ${MAX_INDICATOR_OBJECTS} indicator values can be set at a time!`,\n\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.values = options.values;\n\t\t}\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\n\t\tconst objCount = raw.payload.length >= 2\n\t\t\t? raw.payload[1] & 0b11111\n\t\t\t: 0;\n\n\t\tif (objCount === 0) {\n\t\t\tconst indicator0Value = raw.payload[0];\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tvalue: indicator0Value,\n\t\t\t});\n\t\t}\n\n\t\tvalidatePayload(raw.payload.length >= 2 + 3 * objCount);\n\n\t\tconst values: IndicatorObject[] = [];\n\t\tfor (let i = 0; i < objCount; i++) {\n\t\t\tconst offset = 2 + 3 * i;\n\t\t\tconst value: IndicatorObject = {\n\t\t\t\tindicatorId: raw.payload[offset],\n\t\t\t\tpropertyId: raw.payload[offset + 1],\n\t\t\t\tvalue: raw.payload[offset + 2],\n\t\t\t};\n\t\t\tvalues.push(value);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tvalues,\n\t\t});\n\n\t\t// TODO: Think if we want this:\n\n\t\t// // If not all Property IDs are included in the command for the actual Indicator ID,\n\t\t// // a controlling node MUST assume non-specified Property IDs values to be 0x00.\n\t\t// const indicatorId = this.values[0].indicatorId;\n\t\t// const supportedIndicatorProperties =\n\t\t// \tvalueDB.getValue<number[]>(\n\t\t// \t\tgetSupportedPropertyIDsValueID(\n\t\t// \t\t\tthis.endpointIndex,\n\t\t// \t\t\tindicatorId,\n\t\t// \t\t),\n\t\t// \t) ?? [];\n\t\t// // Find out which ones are missing\n\t\t// const missingIndicatorProperties = supportedIndicatorProperties.filter(\n\t\t// \tprop =>\n\t\t// \t\t!this.values!.find(({ propertyId }) => prop === propertyId),\n\t\t// );\n\t\t// // And assume they are 0 (false)\n\t\t// for (const missing of missingIndicatorProperties) {\n\t\t// \tthis.setIndicatorValue({\n\t\t// \t\tindicatorId,\n\t\t// \t\tpropertyId: missing,\n\t\t// \t\tvalue: 0,\n\t\t// \t});\n\t\t// }\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tif (this.indicator0Value != undefined) {\n\t\t\tif (!this.supportsV2Indicators(ctx)) {\n\t\t\t\t// Publish the value\n\t\t\t\tconst valueV1 = IndicatorCCValues.valueV1;\n\t\t\t\tthis.setMetadata(ctx, valueV1);\n\t\t\t\tthis.setValue(ctx, valueV1, this.indicator0Value);\n\t\t\t} else {\n\t\t\t\tif (this.isSinglecast()) {\n\t\t\t\t\t// Don't!\n\t\t\t\t\tctx.logNode(this.nodeId, {\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t`ignoring V1 indicator report because the node supports V2 indicators`,\n\t\t\t\t\t\tdirection: \"none\",\n\t\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.values) {\n\t\t\t// Store the simple values first\n\t\t\tfor (const value of this.values) {\n\t\t\t\tthis.setIndicatorValue(ctx, value);\n\t\t\t}\n\n\t\t\t// Then group values into the convenience properties\n\t\t\tconst groupedValues = groupByIndicatorId(this.values);\n\t\t\tfor (const [indicatorId, values] of groupedValues) {\n\t\t\t\t// Some devices report all properties it supports in every report,\n\t\t\t\t// even if it does not support all properties for the given indicator ID.\n\t\t\t\t// To avoid confusion, we need to filter out the unsupported properties\n\n\t\t\t\tconst supportedPropertyIDs = this.getValue<number[]>(\n\t\t\t\t\tctx,\n\t\t\t\t\tIndicatorCCValues.supportedPropertyIDs(indicatorId),\n\t\t\t\t) ?? [];\n\t\t\t\tconst filteredValues = values.filter(\n\t\t\t\t\t(v) => supportedPropertyIDs.includes(v.propertyId),\n\t\t\t\t);\n\n\t\t\t\tconst overrideIndicatorLabel = this\n\t\t\t\t\t.getManufacturerDefinedIndicatorLabel(ctx, indicatorId);\n\n\t\t\t\t// ... timeout\n\t\t\t\tconst timeout = indicatorObjectsToTimeout(filteredValues);\n\t\t\t\tif (timeout) {\n\t\t\t\t\tlet timeoutString = \"\";\n\t\t\t\t\tif (timeout?.hours) timeoutString += `${timeout.hours}h`;\n\t\t\t\t\tif (timeout?.minutes) {\n\t\t\t\t\t\ttimeoutString += `${timeout.minutes}m`;\n\t\t\t\t\t}\n\t\t\t\t\tif (timeout?.seconds) {\n\t\t\t\t\t\ttimeoutString += `${timeout.seconds}s`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst timeoutValue = IndicatorCCValues.timeout(indicatorId);\n\n\t\t\t\t\tconst metadata: ValueMetadata = {\n\t\t\t\t\t\t...timeoutValue.meta,\n\t\t\t\t\t\tlabel: getIndicatorLabel(\n\t\t\t\t\t\t\tindicatorId,\n\t\t\t\t\t\t\t0x06, // This is actually ignored, but pass a valid ID for clarity\n\t\t\t\t\t\t\toverrideIndicatorLabel,\n\t\t\t\t\t\t\t\"Timeout\",\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.setMetadata(ctx, timeoutValue, metadata);\n\t\t\t\t\tthis.setValue(ctx, timeoutValue, timeoutString);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic readonly indicator0Value: number | undefined;\n\tpublic readonly values: IndicatorObject[] | undefined;\n\n\tprivate setIndicatorValue(\n\t\tctx: GetValueDB,\n\t\tvalue: IndicatorObject,\n\t): void {\n\t\t// Manufacturer-defined indicators may need a custom label\n\t\tconst overrideIndicatorLabel = this\n\t\t\t.getManufacturerDefinedIndicatorLabel(ctx, value.indicatorId);\n\n\t\tconst metadata = getIndicatorMetadata(\n\t\t\tvalue.indicatorId,\n\t\t\tvalue.propertyId,\n\t\t\toverrideIndicatorLabel,\n\t\t);\n\t\t// Some values need to be converted\n\t\tif (metadata.type === \"boolean\") {\n\t\t\tvalue.value = !!value.value;\n\t\t}\n\n\t\t// Only expose the value if it should be user-facing\n\t\tif (value.indicatorId === Indicator[\"Node Identify\"]) {\n\t\t\treturn;\n\t\t}\n\t\tconst prop = getIndicatorProperty(value.propertyId);\n\t\tif (!prop?.exposeAsValue) return;\n\n\t\t// And only if it is actually supported and not just reported by accident\n\t\tconst supportedPropertyIDs = this.getValue<number[]>(\n\t\t\tctx,\n\t\t\tIndicatorCCValues.supportedPropertyIDs(value.indicatorId),\n\t\t) ?? [];\n\t\tif (!supportedPropertyIDs.includes(value.propertyId)) return;\n\n\t\t// Publish the value\n\t\tconst valueV2 = IndicatorCCValues.valueV2(\n\t\t\tvalue.indicatorId,\n\t\t\tvalue.propertyId,\n\t\t);\n\t\tthis.setMetadata(ctx, valueV2, metadata);\n\t\tthis.setValue(ctx, valueV2, value.value);\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tif (this.values != undefined) {\n\t\t\t// V2+\n\t\t\tthis.payload = Bytes.alloc(2 + 3 * this.values.length, 0);\n\t\t\t// Byte 0 is the legacy value\n\t\t\tconst objCount = this.values.length & MAX_INDICATOR_OBJECTS;\n\t\t\tthis.payload[1] = objCount;\n\t\t\tfor (let i = 0; i < objCount; i++) {\n\t\t\t\tconst offset = 2 + 3 * i;\n\t\t\t\tthis.payload[offset] = this.values[i].indicatorId;\n\t\t\t\tthis.payload[offset + 1] = this.values[i].propertyId;\n\t\t\t\tconst value = this.values[i].value;\n\t\t\t\tthis.payload[offset + 2] = value === true\n\t\t\t\t\t? 0xff\n\t\t\t\t\t: value === false\n\t\t\t\t\t? 0x00\n\t\t\t\t\t: value;\n\t\t\t}\n\t\t} else {\n\t\t\t// V1\n\t\t\tthis.payload = Bytes.from([this.indicator0Value ?? 0]);\n\t\t}\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {};\n\t\tif (this.indicator0Value != undefined) {\n\t\t\tmessage[\"indicator 0 value\"] = this.indicator0Value;\n\t\t}\n\t\tif (this.values != undefined) {\n\t\t\tmessage.values = this.values\n\t\t\t\t.map(\n\t\t\t\t\t(v) => `\n\u00B7 indicatorId: ${v.indicatorId}\n propertyId: ${v.propertyId}\n value: ${v.value}`,\n\t\t\t\t)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCGetOptions {\n\tindicatorId?: number;\n}\n\n@CCCommand(IndicatorCommand.Get)\n@expectedCCResponse(IndicatorCCReport)\nexport class IndicatorCCGet extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.indicatorId = options.indicatorId;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): IndicatorCCGet {\n\t\tlet indicatorId: number | undefined;\n\n\t\tif (raw.payload.length > 0) {\n\t\t\tindicatorId = raw.payload[0];\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t});\n\t}\n\n\tpublic indicatorId: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tif (this.indicatorId != undefined) {\n\t\t\tthis.payload = Bytes.from([this.indicatorId]);\n\t\t}\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tindicator: getIndicatorName(this.indicatorId),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCSupportedReportOptions {\n\tindicatorId: number;\n\tnextIndicatorId: number;\n\tsupportedProperties: readonly number[];\n}\n\n@CCCommand(IndicatorCommand.SupportedReport)\nexport class IndicatorCCSupportedReport extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.indicatorId = options.indicatorId;\n\t\tthis.nextIndicatorId = options.nextIndicatorId;\n\t\tthis.supportedProperties = options.supportedProperties;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): IndicatorCCSupportedReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst indicatorId = raw.payload[0];\n\t\tconst nextIndicatorId = raw.payload[1];\n\t\tconst bitMaskLength = raw.payload[2] & 0b11111;\n\t\tlet supportedProperties: readonly number[];\n\n\t\tif (bitMaskLength === 0) {\n\t\t\tsupportedProperties = [];\n\t\t} else {\n\t\t\tvalidatePayload(raw.payload.length >= 3 + bitMaskLength);\n\t\t\t// The bit mask starts at 0, but bit 0 is not used\n\t\t\tsupportedProperties = parseBitMask(\n\t\t\t\traw.payload.subarray(3, 3 + bitMaskLength),\n\t\t\t\t0,\n\t\t\t).filter((v) => v !== 0);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t\tnextIndicatorId,\n\t\t\tsupportedProperties,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tif (this.indicatorId !== 0x00) {\n\t\t\t// Remember which property IDs are supported\n\t\t\tthis.setValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.supportedPropertyIDs(this.indicatorId),\n\t\t\t\tthis.supportedProperties,\n\t\t\t);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic readonly indicatorId: number;\n\tpublic readonly nextIndicatorId: number;\n\tpublic readonly supportedProperties: readonly number[];\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst bitmask = this.supportedProperties.length > 0\n\t\t\t? encodeBitMask(this.supportedProperties, undefined, 0)\n\t\t\t: new Bytes();\n\t\tthis.payload = Bytes.concat([\n\t\t\t[\n\t\t\t\tthis.indicatorId,\n\t\t\t\tthis.nextIndicatorId,\n\t\t\t\tbitmask.length,\n\t\t\t],\n\t\t\tbitmask,\n\t\t]);\n\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tindicator: getIndicatorName(this.indicatorId),\n\t\t\t\t\"supported properties\": this.supportedProperties\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(id) =>\n\t\t\t\t\t\t\tgetIndicatorProperty(id)?.label\n\t\t\t\t\t\t\t\t?? `Unknown (${num2hex(id)})`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\", \"),\n\t\t\t\t\"next indicator\": getIndicatorName(this.nextIndicatorId),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCSupportedGetOptions {\n\tindicatorId: number;\n}\n\nfunction testResponseForIndicatorSupportedGet(\n\tsent: IndicatorCCSupportedGet,\n\treceived: IndicatorCCSupportedReport,\n) {\n\treturn sent.indicatorId === 0 || received.indicatorId === sent.indicatorId;\n}\n\n@CCCommand(IndicatorCommand.SupportedGet)\n@expectedCCResponse(\n\tIndicatorCCSupportedReport,\n\ttestResponseForIndicatorSupportedGet,\n)\nexport class IndicatorCCSupportedGet extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCSupportedGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.indicatorId = options.indicatorId;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): IndicatorCCSupportedGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst indicatorId = raw.payload[0];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t});\n\t}\n\n\tpublic indicatorId: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.indicatorId]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\tindicator: getIndicatorName(this.indicatorId),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCDescriptionReportOptions {\n\tindicatorId: number;\n\tdescription: string;\n}\n\n@CCCommand(IndicatorCommand.DescriptionReport)\nexport class IndicatorCCDescriptionReport extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCDescriptionReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.indicatorId = options.indicatorId;\n\t\tthis.description = options.description;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): IndicatorCCDescriptionReport {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst indicatorId = raw.payload[0];\n\t\tconst descrptionLength = raw.payload[1];\n\t\tvalidatePayload(raw.payload.length >= 2 + descrptionLength);\n\t\tconst description: string = raw.payload\n\t\t\t.subarray(2, 2 + descrptionLength)\n\t\t\t.toString(\"utf8\");\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t\tdescription,\n\t\t});\n\t}\n\n\tpublic indicatorId: number;\n\tpublic description: string;\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tif (this.description) {\n\t\t\tthis.setValue(\n\t\t\t\tctx,\n\t\t\t\tIndicatorCCValues.indicatorDescription(this.indicatorId),\n\t\t\t\tthis.description,\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst description = Bytes.from(this.description, \"utf8\");\n\t\tthis.payload = Bytes.concat([\n\t\t\t[this.indicatorId, description.length],\n\t\t\tdescription,\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"indicator ID\": this.indicatorId,\n\t\t\t\tdescription: this.description || \"(none)\",\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface IndicatorCCDescriptionGetOptions {\n\tindicatorId: number;\n}\n\nfunction testResponseForIndicatorDescriptionGet(\n\tsent: IndicatorCCDescriptionGet,\n\treceived: IndicatorCCDescriptionReport,\n) {\n\treturn received.indicatorId === sent.indicatorId;\n}\n\n@CCCommand(IndicatorCommand.DescriptionGet)\n@expectedCCResponse(\n\tIndicatorCCDescriptionReport,\n\ttestResponseForIndicatorDescriptionGet,\n)\nexport class IndicatorCCDescriptionGet extends IndicatorCC {\n\tpublic constructor(\n\t\toptions: WithAddress<IndicatorCCDescriptionGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.indicatorId = options.indicatorId;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): IndicatorCCDescriptionGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst indicatorId = raw.payload[0];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tindicatorId,\n\t\t});\n\t}\n\n\tpublic indicatorId: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.indicatorId]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"indicator ID\": this.indicatorId,\n\t\t\t},\n\t\t};\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -955,7 +955,7 @@ let IrrigationCCSystemConfigSet = (() => {
|
|
|
955
955
|
polarity |= 128;
|
|
956
956
|
}
|
|
957
957
|
this.payload = import_shared.Bytes.concat([
|
|
958
|
-
|
|
958
|
+
[this.masterValveDelay],
|
|
959
959
|
(0, import_core.encodeFloatWithScale)(
|
|
960
960
|
this.highPressureThreshold,
|
|
961
961
|
0
|
|
@@ -966,7 +966,7 @@ let IrrigationCCSystemConfigSet = (() => {
|
|
|
966
966
|
0
|
|
967
967
|
/* kPa */
|
|
968
968
|
),
|
|
969
|
-
|
|
969
|
+
[polarity]
|
|
970
970
|
]);
|
|
971
971
|
return super.serialize(ctx);
|
|
972
972
|
}
|
|
@@ -1337,12 +1337,12 @@ let IrrigationCCValveConfigSet = (() => {
|
|
|
1337
1337
|
useMoistureSensor;
|
|
1338
1338
|
serialize(ctx) {
|
|
1339
1339
|
this.payload = import_shared.Bytes.concat([
|
|
1340
|
-
|
|
1340
|
+
[
|
|
1341
1341
|
this.valveId === "master" ? 1 : 0,
|
|
1342
1342
|
this.valveId === "master" ? 1 : this.valveId || 1,
|
|
1343
1343
|
Math.floor(this.nominalCurrentHighThreshold / 10),
|
|
1344
1344
|
Math.floor(this.nominalCurrentLowThreshold / 10)
|
|
1345
|
-
]
|
|
1345
|
+
],
|
|
1346
1346
|
(0, import_core.encodeFloatWithScale)(
|
|
1347
1347
|
this.maximumFlow,
|
|
1348
1348
|
0
|
|
@@ -1358,9 +1358,9 @@ let IrrigationCCValveConfigSet = (() => {
|
|
|
1358
1358
|
0
|
|
1359
1359
|
/* l/h */
|
|
1360
1360
|
),
|
|
1361
|
-
|
|
1361
|
+
[
|
|
1362
1362
|
(this.useRainSensor ? 1 : 0) | (this.useMoistureSensor ? 2 : 0)
|
|
1363
|
-
]
|
|
1363
|
+
]
|
|
1364
1364
|
]);
|
|
1365
1365
|
return super.serialize(ctx);
|
|
1366
1366
|
}
|