@zwave-js/cc 15.24.0 → 15.24.3

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.
Files changed (97) hide show
  1. package/build/cjs/cc/AssociationGroupInfoCC.js +1 -0
  2. package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
  3. package/build/cjs/cc/BarrierOperatorCC.js +1 -0
  4. package/build/cjs/cc/BarrierOperatorCC.js.map +2 -2
  5. package/build/cjs/cc/BinarySensorCC.js +1 -0
  6. package/build/cjs/cc/BinarySensorCC.js.map +2 -2
  7. package/build/cjs/cc/ColorSwitchCC.js +1 -0
  8. package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
  9. package/build/cjs/cc/LanguageCC.js +2 -0
  10. package/build/cjs/cc/LanguageCC.js.map +2 -2
  11. package/build/cjs/cc/MultiChannelAssociationCC.js +1 -1
  12. package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
  13. package/build/cjs/cc/NodeNamingCC.js +3 -20
  14. package/build/cjs/cc/NodeNamingCC.js.map +2 -2
  15. package/build/cjs/cc/NotificationCC.js +1 -0
  16. package/build/cjs/cc/NotificationCC.js.map +2 -2
  17. package/build/cjs/cc/ProtectionCC.d.ts +11 -5
  18. package/build/cjs/cc/ProtectionCC.js +63 -18
  19. package/build/cjs/cc/ProtectionCC.js.map +2 -2
  20. package/build/cjs/cc/ScheduleEntryLockCC.js +3 -0
  21. package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
  22. package/build/cjs/cc/TimeCC.js +1 -0
  23. package/build/cjs/cc/TimeCC.js.map +2 -2
  24. package/build/cjs/cc/TimeParametersCC.js +1 -0
  25. package/build/cjs/cc/TimeParametersCC.js.map +2 -2
  26. package/build/cjs/cc/UserCodeCC.d.ts +2 -1
  27. package/build/cjs/cc/UserCodeCC.js +35 -0
  28. package/build/cjs/cc/UserCodeCC.js.map +2 -2
  29. package/build/cjs/cc/UserCredentialCC.js +12 -0
  30. package/build/cjs/cc/UserCredentialCC.js.map +2 -2
  31. package/build/cjs/cc/VersionCC.js +5 -0
  32. package/build/cjs/cc/VersionCC.js.map +2 -2
  33. package/build/cjs/cc/WindowCoveringCC.js +2 -0
  34. package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
  35. package/build/cjs/cc/ZWaveProtocolCC.d.ts +2 -0
  36. package/build/cjs/cc/ZWaveProtocolCC.js +4 -0
  37. package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
  38. package/build/cjs/lib/serializers.js +1 -0
  39. package/build/cjs/lib/serializers.js.map +2 -2
  40. package/build/esm/cc/AssociationGroupInfoCC.d.ts.map +1 -1
  41. package/build/esm/cc/AssociationGroupInfoCC.js +2 -0
  42. package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
  43. package/build/esm/cc/BarrierOperatorCC.d.ts.map +1 -1
  44. package/build/esm/cc/BarrierOperatorCC.js +1 -0
  45. package/build/esm/cc/BarrierOperatorCC.js.map +1 -1
  46. package/build/esm/cc/BinarySensorCC.d.ts.map +1 -1
  47. package/build/esm/cc/BinarySensorCC.js +1 -0
  48. package/build/esm/cc/BinarySensorCC.js.map +1 -1
  49. package/build/esm/cc/ColorSwitchCC.d.ts.map +1 -1
  50. package/build/esm/cc/ColorSwitchCC.js +1 -0
  51. package/build/esm/cc/ColorSwitchCC.js.map +1 -1
  52. package/build/esm/cc/LanguageCC.d.ts.map +1 -1
  53. package/build/esm/cc/LanguageCC.js +4 -0
  54. package/build/esm/cc/LanguageCC.js.map +1 -1
  55. package/build/esm/cc/MultiChannelAssociationCC.d.ts.map +1 -1
  56. package/build/esm/cc/MultiChannelAssociationCC.js +3 -1
  57. package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
  58. package/build/esm/cc/NodeNamingCC.d.ts.map +1 -1
  59. package/build/esm/cc/NodeNamingCC.js +3 -22
  60. package/build/esm/cc/NodeNamingCC.js.map +1 -1
  61. package/build/esm/cc/NotificationCC.d.ts.map +1 -1
  62. package/build/esm/cc/NotificationCC.js +5 -0
  63. package/build/esm/cc/NotificationCC.js.map +1 -1
  64. package/build/esm/cc/ProtectionCC.d.ts +11 -5
  65. package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
  66. package/build/esm/cc/ProtectionCC.js +72 -42
  67. package/build/esm/cc/ProtectionCC.js.map +1 -1
  68. package/build/esm/cc/ScheduleEntryLockCC.d.ts.map +1 -1
  69. package/build/esm/cc/ScheduleEntryLockCC.js +5 -0
  70. package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
  71. package/build/esm/cc/TimeCC.d.ts.map +1 -1
  72. package/build/esm/cc/TimeCC.js +1 -0
  73. package/build/esm/cc/TimeCC.js.map +1 -1
  74. package/build/esm/cc/TimeParametersCC.d.ts.map +1 -1
  75. package/build/esm/cc/TimeParametersCC.js +1 -0
  76. package/build/esm/cc/TimeParametersCC.js.map +1 -1
  77. package/build/esm/cc/UserCodeCC.d.ts +2 -1
  78. package/build/esm/cc/UserCodeCC.d.ts.map +1 -1
  79. package/build/esm/cc/UserCodeCC.js +44 -0
  80. package/build/esm/cc/UserCodeCC.js.map +1 -1
  81. package/build/esm/cc/UserCredentialCC.d.ts.map +1 -1
  82. package/build/esm/cc/UserCredentialCC.js +20 -0
  83. package/build/esm/cc/UserCredentialCC.js.map +1 -1
  84. package/build/esm/cc/VersionCC.d.ts.map +1 -1
  85. package/build/esm/cc/VersionCC.js +9 -0
  86. package/build/esm/cc/VersionCC.js.map +1 -1
  87. package/build/esm/cc/WindowCoveringCC.d.ts.map +1 -1
  88. package/build/esm/cc/WindowCoveringCC.js +3 -1
  89. package/build/esm/cc/WindowCoveringCC.js.map +1 -1
  90. package/build/esm/cc/ZWaveProtocolCC.d.ts +2 -0
  91. package/build/esm/cc/ZWaveProtocolCC.d.ts.map +1 -1
  92. package/build/esm/cc/ZWaveProtocolCC.js +4 -0
  93. package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
  94. package/build/esm/lib/serializers.d.ts.map +1 -1
  95. package/build/esm/lib/serializers.js +3 -1
  96. package/build/esm/lib/serializers.js.map +1 -1
  97. package/package.json +7 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src_gen/cc/TimeParametersCC.ts"],
4
- "sourcesContent": ["import * as __validateArgs from \"./TimeParametersCC._validateArgs.js\";\nconst { validateArgs_TimeParametersCCAPI_set } = __validateArgs;\nimport type { GetDeviceConfig } from \"@zwave-js/config\";\nimport { CommandClasses, type ControlsCC, type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type SupervisionResult, type SupportsCC, ValueMetadata, type WithAddress, formatDate, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, type PollValueImplementation, SET_VALUE, type SetValueImplementation, throwUnsupportedProperty, throwWrongValueType, } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { TimeParametersCommand } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { TimeParametersCCValues } from \"./_CCValues.generated.js\";\nexport { TimeParametersCCValues };\n/**\n * Determines if the node expects local time instead of UTC.\n */\nfunction shouldUseLocalTime(ctx: GetDeviceConfig, endpoint: EndpointId & SupportsCC & ControlsCC): boolean {\n // GH#311 Some nodes have no way to determine the time zone offset,\n // so they need to interpret the set time as local time instead of UTC.\n //\n // This is the case when they both\n // 1. DON'T control TimeCC V1, so they cannot request the local time\n // 2. DON'T support TimeCC V2, so the controller cannot specify the timezone offset\n // Incidentally, this is also true when they don't support TimeCC at all\n // Use UTC though when the device config file explicitly requests it\n const forceUTC = !!ctx.getDeviceConfig?.(endpoint.nodeId)?.compat\n ?.useUTCInTimeParametersCC;\n if (forceUTC)\n return false;\n const ccVersion = endpoint.getCCVersion(CommandClasses.Time);\n if (ccVersion >= 1 && endpoint.controlsCC(CommandClasses.Time)) {\n return false;\n }\n if (ccVersion >= 2 && endpoint.supportsCC(CommandClasses.Time)) {\n return false;\n }\n return true;\n}\ninterface DateSegments {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n second: number;\n}\nfunction segmentsToDate(segments: DateSegments, local: boolean): Date {\n if (local) {\n return new Date(segments.year, segments.month - 1, segments.day, segments.hour, segments.minute, segments.second);\n }\n else {\n return new Date(Date.UTC(segments.year, segments.month - 1, segments.day, segments.hour, segments.minute, segments.second));\n }\n}\nfunction dateToSegments(date: Date, local: boolean): DateSegments {\n return {\n year: (date as any)[`get${local ? \"\" : \"UTC\"}FullYear`]() as number,\n month: ((date as any)[`get${local ? \"\" : \"UTC\"}Month`]() as number) + 1,\n day: (date as any)[`get${local ? \"\" : \"UTC\"}Date`]() as number,\n hour: (date as any)[`get${local ? \"\" : \"UTC\"}Hours`]() as number,\n minute: (date as any)[`get${local ? \"\" : \"UTC\"}Minutes`]() as number,\n second: (date as any)[`get${local ? \"\" : \"UTC\"}Seconds`]() as number,\n };\n}\n@API(CommandClasses[\"Time Parameters\"])\nexport class TimeParametersCCAPI extends CCAPI {\n public supportsCommand(cmd: TimeParametersCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case TimeParametersCommand.Get:\n return this.isSinglecast();\n case TimeParametersCommand.Set:\n return true; // This is mandatory\n }\n return super.supportsCommand(cmd);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: TimeParametersCCAPI, { property }, value) {\n if (property !== \"dateAndTime\") {\n throwUnsupportedProperty(this.ccId, property);\n }\n if (!(value instanceof Date)) {\n throwWrongValueType(this.ccId, property, \"date\", typeof value);\n }\n return this.set(value);\n };\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: TimeParametersCCAPI, { property }) {\n switch (property) {\n case \"dateAndTime\":\n return this.get();\n default:\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n public async get(): Promise<MaybeNotKnown<Date>> {\n this.assertSupportsCommand(TimeParametersCommand, TimeParametersCommand.Get);\n const cc = new TimeParametersCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<TimeParametersCCReport>(cc, this.commandOptions);\n return response?.dateAndTime;\n }\n @validateArgs_TimeParametersCCAPI_set()\n public async set(dateAndTime: Date): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(TimeParametersCommand, TimeParametersCommand.Set);\n const endpointToCheck = this.endpoint.virtual\n ? this.endpoint.node.physicalNodes[0].getEndpoint(this.endpoint.index)!\n : this.endpoint;\n const useLocalTime = shouldUseLocalTime(this.host, endpointToCheck);\n const cc = new TimeParametersCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n dateAndTime,\n useLocalTime,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n}\n@commandClass(CommandClasses[\"Time Parameters\"])\n@implementedVersion(1)\n@ccValues(TimeParametersCCValues)\nexport class TimeParametersCC extends CommandClass {\n declare ccCommand: TimeParametersCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Time Parameters\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Synchronize the node's time\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"setting current time...\",\n direction: \"outbound\",\n });\n await api.set(new Date());\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n}\n// @publicAPI\nexport interface TimeParametersCCReportOptions {\n dateAndTime: Date;\n}\n@CCCommand(TimeParametersCommand.Report)\n@ccValueProperty(\"dateAndTime\", TimeParametersCCValues.dateAndTime)\nexport class TimeParametersCCReport extends TimeParametersCC {\n public constructor(options: WithAddress<TimeParametersCCReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.dateAndTime = options.dateAndTime;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TimeParametersCCReport {\n validatePayload(raw.payload.length >= 7);\n const dateSegments = {\n year: raw.payload.readUInt16BE(0),\n month: raw.payload[2],\n day: raw.payload[3],\n hour: raw.payload[4],\n minute: raw.payload[5],\n second: raw.payload[6],\n };\n const dateAndTime: Date = segmentsToDate(dateSegments, \n // Assume we can use UTC and correct this assumption in persistValues\n false);\n return new this({\n nodeId: ctx.sourceNodeId,\n dateAndTime,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n // If necessary, fix the date and time before persisting it\n const local = shouldUseLocalTime(ctx, this.getEndpoint(ctx)!);\n if (local) {\n // The initial assumption was incorrect, re-interpret the time\n const segments = dateToSegments(this.dateAndTime, false);\n this.dateAndTime = segmentsToDate(segments, local);\n }\n return super.persistValues(ctx);\n }\n public dateAndTime: Date;\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"date and time\": formatDate(this.dateAndTime, \"YYYY-MM-DD HH:mm:ss\"),\n },\n };\n }\n}\n@CCCommand(TimeParametersCommand.Get)\n@expectedCCResponse(TimeParametersCCReport)\nexport class TimeParametersCCGet extends TimeParametersCC {\n}\n// @publicAPI\nexport interface TimeParametersCCSetOptions {\n dateAndTime: Date;\n useLocalTime?: boolean;\n}\n@CCCommand(TimeParametersCommand.Set)\n@useSupervision()\nexport class TimeParametersCCSet extends TimeParametersCC {\n public constructor(options: WithAddress<TimeParametersCCSetOptions>) {\n super(options);\n this.dateAndTime = options.dateAndTime;\n this.useLocalTime = options.useLocalTime;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TimeParametersCCSet {\n validatePayload(raw.payload.length >= 7);\n const dateSegments = {\n year: raw.payload.readUInt16BE(0),\n month: raw.payload[2],\n day: raw.payload[3],\n hour: raw.payload[4],\n minute: raw.payload[5],\n second: raw.payload[6],\n };\n validatePayload(dateSegments.month >= 1 && dateSegments.month <= 12, dateSegments.day >= 1 && dateSegments.day <= 31, dateSegments.hour >= 0 && dateSegments.hour <= 23, dateSegments.minute >= 0 && dateSegments.minute <= 59, dateSegments.second >= 0 && dateSegments.second <= 59);\n const dateAndTime = segmentsToDate(dateSegments, \n // Assume we can use UTC and correct this assumption in persistValues\n false);\n return new this({\n nodeId: ctx.sourceNodeId,\n dateAndTime,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n // We do not actually persist anything here, but we need access to the node\n // in order to interpret the date segments correctly\n const local = shouldUseLocalTime(ctx, this.getEndpoint(ctx)!);\n if (local) {\n // The initial assumption was incorrect, re-interpret the time\n const segments = dateToSegments(this.dateAndTime, false);\n this.dateAndTime = segmentsToDate(segments, local);\n }\n return super.persistValues(ctx);\n }\n public dateAndTime: Date;\n private useLocalTime?: boolean;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const dateSegments = dateToSegments(this.dateAndTime, !!this.useLocalTime);\n this.payload = Bytes.from([\n // 2 bytes placeholder for year\n 0,\n 0,\n dateSegments.month,\n dateSegments.day,\n dateSegments.hour,\n dateSegments.minute,\n dateSegments.second,\n ]);\n this.payload.writeUInt16BE(dateSegments.year, 0);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"date and time\": formatDate(this.dateAndTime, \"YYYY-MM-DD HH:mm:ss\"),\n },\n };\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as __validateArgs from \"./TimeParametersCC._validateArgs.js\";\nconst { validateArgs_TimeParametersCCAPI_set } = __validateArgs;\nimport type { GetDeviceConfig } from \"@zwave-js/config\";\nimport { CommandClasses, type ControlsCC, type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, MessagePriority, type SupervisionResult, type SupportsCC, ValueMetadata, type WithAddress, formatDate, validatePayload, } from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { CCAPI, POLL_VALUE, type PollValueImplementation, SET_VALUE, type SetValueImplementation, throwUnsupportedProperty, throwWrongValueType, } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, } from \"../lib/CommandClass.js\";\nimport { API, CCCommand, ccValueProperty, ccValues, commandClass, expectedCCResponse, implementedVersion, useSupervision, } from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { TimeParametersCommand } from \"../lib/_Types.js\";\nimport type { CCEncodingContext, CCParsingContext } from \"../lib/traits.js\";\nimport { TimeParametersCCValues } from \"./_CCValues.generated.js\";\nexport { TimeParametersCCValues };\n/**\n * Determines if the node expects local time instead of UTC.\n */\nfunction shouldUseLocalTime(ctx: GetDeviceConfig, endpoint: EndpointId & SupportsCC & ControlsCC): boolean {\n // GH#311 Some nodes have no way to determine the time zone offset,\n // so they need to interpret the set time as local time instead of UTC.\n //\n // This is the case when they both\n // 1. DON'T control TimeCC V1, so they cannot request the local time\n // 2. DON'T support TimeCC V2, so the controller cannot specify the timezone offset\n // Incidentally, this is also true when they don't support TimeCC at all\n // Use UTC though when the device config file explicitly requests it\n const forceUTC = !!ctx.getDeviceConfig?.(endpoint.nodeId)?.compat\n ?.useUTCInTimeParametersCC;\n if (forceUTC)\n return false;\n const ccVersion = endpoint.getCCVersion(CommandClasses.Time);\n if (ccVersion >= 1 && endpoint.controlsCC(CommandClasses.Time)) {\n return false;\n }\n if (ccVersion >= 2 && endpoint.supportsCC(CommandClasses.Time)) {\n return false;\n }\n return true;\n}\ninterface DateSegments {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n second: number;\n}\nfunction segmentsToDate(segments: DateSegments, local: boolean): Date {\n if (local) {\n return new Date(segments.year, segments.month - 1, segments.day, segments.hour, segments.minute, segments.second);\n }\n else {\n return new Date(Date.UTC(segments.year, segments.month - 1, segments.day, segments.hour, segments.minute, segments.second));\n }\n}\nfunction dateToSegments(date: Date, local: boolean): DateSegments {\n return {\n year: (date as any)[`get${local ? \"\" : \"UTC\"}FullYear`]() as number,\n month: ((date as any)[`get${local ? \"\" : \"UTC\"}Month`]() as number) + 1,\n day: (date as any)[`get${local ? \"\" : \"UTC\"}Date`]() as number,\n hour: (date as any)[`get${local ? \"\" : \"UTC\"}Hours`]() as number,\n minute: (date as any)[`get${local ? \"\" : \"UTC\"}Minutes`]() as number,\n second: (date as any)[`get${local ? \"\" : \"UTC\"}Seconds`]() as number,\n };\n}\n@API(CommandClasses[\"Time Parameters\"])\nexport class TimeParametersCCAPI extends CCAPI {\n public supportsCommand(cmd: TimeParametersCommand): MaybeNotKnown<boolean> {\n switch (cmd) {\n case TimeParametersCommand.Get:\n return this.isSinglecast();\n case TimeParametersCommand.Set:\n return true; // This is mandatory\n }\n return super.supportsCommand(cmd);\n }\n protected override get [SET_VALUE](): SetValueImplementation {\n return async function (this: TimeParametersCCAPI, { property }, value) {\n if (property !== \"dateAndTime\") {\n throwUnsupportedProperty(this.ccId, property);\n }\n if (!(value instanceof Date)) {\n throwWrongValueType(this.ccId, property, \"date\", typeof value);\n }\n return this.set(value);\n };\n }\n protected get [POLL_VALUE](): PollValueImplementation {\n return async function (this: TimeParametersCCAPI, { property }) {\n switch (property) {\n case \"dateAndTime\":\n return this.get();\n default:\n throwUnsupportedProperty(this.ccId, property);\n }\n };\n }\n public async get(): Promise<MaybeNotKnown<Date>> {\n this.assertSupportsCommand(TimeParametersCommand, TimeParametersCommand.Get);\n const cc = new TimeParametersCCGet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n });\n const response = await this.host.sendCommand<TimeParametersCCReport>(cc, this.commandOptions);\n return response?.dateAndTime;\n }\n @validateArgs_TimeParametersCCAPI_set()\n public async set(dateAndTime: Date): Promise<SupervisionResult | undefined> {\n this.assertSupportsCommand(TimeParametersCommand, TimeParametersCommand.Set);\n const endpointToCheck = this.endpoint.virtual\n ? this.endpoint.node.physicalNodes[0].getEndpoint(this.endpoint.index)!\n : this.endpoint;\n const useLocalTime = shouldUseLocalTime(this.host, endpointToCheck);\n const cc = new TimeParametersCCSet({\n nodeId: this.endpoint.nodeId,\n endpointIndex: this.endpoint.index,\n dateAndTime,\n useLocalTime,\n });\n return this.host.sendCommand(cc, this.commandOptions);\n }\n}\n@commandClass(CommandClasses[\"Time Parameters\"])\n@implementedVersion(1)\n@ccValues(TimeParametersCCValues)\nexport class TimeParametersCC extends CommandClass {\n declare ccCommand: TimeParametersCommand;\n public async interview(ctx: InterviewContext): Promise<void> {\n const node = this.getNode(ctx)!;\n const endpoint = this.getEndpoint(ctx)!;\n const api = CCAPI.create(CommandClasses[\"Time Parameters\"], ctx, endpoint).withOptions({\n priority: MessagePriority.NodeQuery,\n });\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: `Interviewing ${this.ccName}...`,\n direction: \"none\",\n });\n // Synchronize the node's time\n ctx.logNode(node.id, {\n endpoint: this.endpointIndex,\n message: \"setting current time...\",\n direction: \"outbound\",\n });\n await api.set(new Date());\n // Remember that the interview is complete\n this.setInterviewComplete(ctx, true);\n }\n}\n// @publicAPI\nexport interface TimeParametersCCReportOptions {\n dateAndTime: Date;\n}\n@CCCommand(TimeParametersCommand.Report)\n@ccValueProperty(\"dateAndTime\", TimeParametersCCValues.dateAndTime)\nexport class TimeParametersCCReport extends TimeParametersCC {\n public constructor(options: WithAddress<TimeParametersCCReportOptions>) {\n super(options);\n // TODO: Check implementation:\n this.dateAndTime = options.dateAndTime;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TimeParametersCCReport {\n validatePayload(raw.payload.length >= 7);\n const dateSegments = {\n year: raw.payload.readUInt16BE(0),\n month: raw.payload[2],\n day: raw.payload[3],\n hour: raw.payload[4],\n minute: raw.payload[5],\n second: raw.payload[6],\n };\n validatePayload(dateSegments.month >= 1 && dateSegments.month <= 12, dateSegments.day >= 1 && dateSegments.day <= 31, dateSegments.hour >= 0 && dateSegments.hour <= 23, dateSegments.minute >= 0 && dateSegments.minute <= 59, dateSegments.second >= 0 && dateSegments.second <= 59);\n const dateAndTime: Date = segmentsToDate(dateSegments, \n // Assume we can use UTC and correct this assumption in persistValues\n false);\n return new this({\n nodeId: ctx.sourceNodeId,\n dateAndTime,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n // If necessary, fix the date and time before persisting it\n const local = shouldUseLocalTime(ctx, this.getEndpoint(ctx)!);\n if (local) {\n // The initial assumption was incorrect, re-interpret the time\n const segments = dateToSegments(this.dateAndTime, false);\n this.dateAndTime = segmentsToDate(segments, local);\n }\n return super.persistValues(ctx);\n }\n public dateAndTime: Date;\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"date and time\": formatDate(this.dateAndTime, \"YYYY-MM-DD HH:mm:ss\"),\n },\n };\n }\n}\n@CCCommand(TimeParametersCommand.Get)\n@expectedCCResponse(TimeParametersCCReport)\nexport class TimeParametersCCGet extends TimeParametersCC {\n}\n// @publicAPI\nexport interface TimeParametersCCSetOptions {\n dateAndTime: Date;\n useLocalTime?: boolean;\n}\n@CCCommand(TimeParametersCommand.Set)\n@useSupervision()\nexport class TimeParametersCCSet extends TimeParametersCC {\n public constructor(options: WithAddress<TimeParametersCCSetOptions>) {\n super(options);\n this.dateAndTime = options.dateAndTime;\n this.useLocalTime = options.useLocalTime;\n }\n public static from(raw: CCRaw, ctx: CCParsingContext): TimeParametersCCSet {\n validatePayload(raw.payload.length >= 7);\n const dateSegments = {\n year: raw.payload.readUInt16BE(0),\n month: raw.payload[2],\n day: raw.payload[3],\n hour: raw.payload[4],\n minute: raw.payload[5],\n second: raw.payload[6],\n };\n validatePayload(dateSegments.month >= 1 && dateSegments.month <= 12, dateSegments.day >= 1 && dateSegments.day <= 31, dateSegments.hour >= 0 && dateSegments.hour <= 23, dateSegments.minute >= 0 && dateSegments.minute <= 59, dateSegments.second >= 0 && dateSegments.second <= 59);\n const dateAndTime = segmentsToDate(dateSegments, \n // Assume we can use UTC and correct this assumption in persistValues\n false);\n return new this({\n nodeId: ctx.sourceNodeId,\n dateAndTime,\n });\n }\n public persistValues(ctx: PersistValuesContext): boolean {\n // We do not actually persist anything here, but we need access to the node\n // in order to interpret the date segments correctly\n const local = shouldUseLocalTime(ctx, this.getEndpoint(ctx)!);\n if (local) {\n // The initial assumption was incorrect, re-interpret the time\n const segments = dateToSegments(this.dateAndTime, false);\n this.dateAndTime = segmentsToDate(segments, local);\n }\n return super.persistValues(ctx);\n }\n public dateAndTime: Date;\n private useLocalTime?: boolean;\n public serialize(ctx: CCEncodingContext): Promise<Bytes> {\n const dateSegments = dateToSegments(this.dateAndTime, !!this.useLocalTime);\n this.payload = Bytes.from([\n // 2 bytes placeholder for year\n 0,\n 0,\n dateSegments.month,\n dateSegments.day,\n dateSegments.hour,\n dateSegments.minute,\n dateSegments.second,\n ]);\n this.payload.writeUInt16BE(dateSegments.year, 0);\n return super.serialize(ctx);\n }\n public toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n return {\n ...super.toLogEntry(ctx),\n message: {\n \"date and time\": formatDate(this.dateAndTime, \"YYYY-MM-DD HH:mm:ss\"),\n },\n };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- import { type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, type SupervisionResult, type ValueID, type WithAddress } from "@zwave-js/core";
1
+ import { CommandClasses, type EndpointId, type GetValueDB, type MaybeNotKnown, type MessageOrCCLogEntry, type SupervisionResult, type ValueID, type WithAddress } from "@zwave-js/core";
2
2
  import { Bytes, type BytesView } from "@zwave-js/shared";
3
3
  import { POLL_VALUE, PhysicalCCAPI, type PollValueImplementation, SET_VALUE, SET_VALUE_HOOKS, type SetValueImplementation, type SetValueImplementationHooksFactory } from "../lib/API.js";
4
4
  import { type CCRaw, CommandClass, type InterviewContext, type PersistValuesContext, type RefreshValuesContext, type RefreshValuesOptions } from "../lib/CommandClass.js";
@@ -39,6 +39,7 @@ export declare class UserCodeCCAPI extends PhysicalCCAPI {
39
39
  }
40
40
  export declare class UserCodeCC extends CommandClass {
41
41
  ccCommand: UserCodeCommand;
42
+ determineRequiredCCInterviews(): readonly CommandClasses[];
42
43
  interview(ctx: InterviewContext): Promise<void>;
43
44
  refreshValues(ctx: RefreshValuesContext, options?: RefreshValuesOptions): Promise<void>;
44
45
  /**
@@ -61,6 +61,7 @@ var import_API = require("../lib/API.js");
61
61
  var import_CommandClass = require("../lib/CommandClass.js");
62
62
  var import_CommandClassDecorators = require("../lib/CommandClassDecorators.js");
63
63
  var import_Types = require("../lib/_Types.js");
64
+ var import_UserCredentialCC = require("./UserCredentialCC.js");
64
65
  var import_CCValues_generated = require("./_CCValues.generated.js");
65
66
  const { validateArgs_UserCodeCCAPI_get, validateArgs_UserCodeCCAPI_set, validateArgs_UserCodeCCAPI_setMany, validateArgs_UserCodeCCAPI_clear, validateArgs_UserCodeCCAPI_setKeypadMode, validateArgs_UserCodeCCAPI_setAdminCode } = __validateArgs;
66
67
  function parseExtendedUserCode(payload) {
@@ -542,9 +543,40 @@ let UserCodeCC = (() => {
542
543
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
543
544
  (0, import_tslib.__runInitializers)(_classThis, _classExtraInitializers);
544
545
  }
546
+ determineRequiredCCInterviews() {
547
+ return [
548
+ ...super.determineRequiredCCInterviews(),
549
+ // CL:0083.01.21.00.2 ff: The controlling node MUST only use ONE of
550
+ // the User Management Command Classes to control a supporting node,
551
+ // and cache which User Management CC is used for each node.
552
+ //
553
+ // We determine this by interviewing U3C first, and then optionally
554
+ // User Code CC.
555
+ import_core.CommandClasses["User Credential"]
556
+ ];
557
+ }
545
558
  async interview(ctx) {
546
559
  const node = this.getNode(ctx);
547
560
  const endpoint = this.getEndpoint(ctx);
561
+ if (endpoint.supportsCC(import_core.CommandClasses["User Credential"])) {
562
+ const u3cUsers = import_UserCredentialCC.UserCredentialCC.getSupportedUsersCached(ctx, endpoint);
563
+ if (u3cUsers == void 0) {
564
+ ctx.logNode(node.id, {
565
+ endpoint: this.endpointIndex,
566
+ message: "Cannot determine if the node uses User Credential CC for user management, skipping User Code CC interview...",
567
+ level: "warn"
568
+ });
569
+ return;
570
+ } else if (u3cUsers > 0) {
571
+ ctx.logNode(node.id, {
572
+ endpoint: this.endpointIndex,
573
+ message: "Node uses User Credential CC for user management, skipping User Code CC interview...",
574
+ direction: "none"
575
+ });
576
+ this.setInterviewComplete(ctx, true);
577
+ return;
578
+ }
579
+ }
548
580
  const api = import_API.CCAPI.create(import_core.CommandClasses["User Code"], ctx, endpoint).withOptions({
549
581
  priority: import_core.MessagePriority.NodeQuery
550
582
  });
@@ -592,6 +624,9 @@ let UserCodeCC = (() => {
592
624
  async refreshValues(ctx, options) {
593
625
  const node = this.getNode(ctx);
594
626
  const endpoint = this.getEndpoint(ctx);
627
+ if (endpoint.supportsCC(import_core.CommandClasses["User Credential"]) && import_UserCredentialCC.UserCredentialCC.getSupportedUsersCached(ctx, endpoint) !== 0) {
628
+ return;
629
+ }
595
630
  const api = import_API.CCAPI.create(import_core.CommandClasses["User Code"], ctx, endpoint).withOptions({
596
631
  priority: options?.priority ?? import_core.MessagePriority.NodeQuery
597
632
  });