@zwave-js/cc 14.0.0 → 14.1.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.
Files changed (122) hide show
  1. package/build/cjs/cc/AssociationCC.js +1 -1
  2. package/build/cjs/cc/AssociationCC.js.map +1 -1
  3. package/build/cjs/cc/CentralSceneCC.js +2 -3
  4. package/build/cjs/cc/CentralSceneCC.js.map +2 -2
  5. package/build/cjs/cc/ClimateControlScheduleCC.js +5 -6
  6. package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
  7. package/build/cjs/cc/ClockCC.js +2 -3
  8. package/build/cjs/cc/ClockCC.js.map +2 -2
  9. package/build/cjs/cc/ColorSwitchCC.js +2 -2
  10. package/build/cjs/cc/ColorSwitchCC.js.map +1 -1
  11. package/build/cjs/cc/ConfigurationCC.js +4 -6
  12. package/build/cjs/cc/ConfigurationCC.js.map +2 -2
  13. package/build/cjs/cc/DoorLockCC.js +1 -1
  14. package/build/cjs/cc/DoorLockCC.js.map +1 -1
  15. package/build/cjs/cc/IndicatorCC.js +2 -2
  16. package/build/cjs/cc/IndicatorCC.js.map +1 -1
  17. package/build/cjs/cc/IrrigationCC.js +7 -8
  18. package/build/cjs/cc/IrrigationCC.js.map +2 -2
  19. package/build/cjs/cc/MultiChannelCC.js +1 -1
  20. package/build/cjs/cc/MultiChannelCC.js.map +1 -1
  21. package/build/cjs/cc/NotificationCC.js +1 -1
  22. package/build/cjs/cc/NotificationCC.js.map +1 -1
  23. package/build/cjs/cc/ProtectionCC.js +1 -2
  24. package/build/cjs/cc/ProtectionCC.js.map +2 -2
  25. package/build/cjs/cc/Security2CC.js +2 -2
  26. package/build/cjs/cc/Security2CC.js.map +1 -1
  27. package/build/cjs/cc/SecurityCC.js +1 -1
  28. package/build/cjs/cc/SecurityCC.js.map +1 -1
  29. package/build/cjs/cc/SoundSwitchCC.js +1 -1
  30. package/build/cjs/cc/SoundSwitchCC.js.map +1 -1
  31. package/build/cjs/cc/ThermostatSetbackCC.js +6 -8
  32. package/build/cjs/cc/ThermostatSetbackCC.js.map +2 -2
  33. package/build/cjs/cc/TimeCC.js +2 -3
  34. package/build/cjs/cc/TimeCC.js.map +2 -2
  35. package/build/cjs/cc/WakeUpCC.js +1 -1
  36. package/build/cjs/cc/WakeUpCC.js.map +1 -1
  37. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js +1 -1
  38. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
  39. package/build/cjs/index_browser.d.ts +8 -0
  40. package/build/cjs/index_browser.js +40 -0
  41. package/build/cjs/index_browser.js.map +7 -0
  42. package/build/cjs/lib/API.js +1 -1
  43. package/build/cjs/lib/API.js.map +1 -1
  44. package/build/cjs/lib/CommandClass.js +1 -1
  45. package/build/cjs/lib/CommandClass.js.map +1 -1
  46. package/build/cjs/lib/EncapsulatingCommandClass.js +1 -1
  47. package/build/cjs/lib/EncapsulatingCommandClass.js.map +1 -1
  48. package/build/cjs/lib/Values.d.ts +2 -2
  49. package/build/cjs/lib/Values.js +9 -9
  50. package/build/cjs/lib/Values.js.map +3 -3
  51. package/build/cjs/lib/serializers.d.ts +2 -2
  52. package/build/cjs/lib/serializers.js +19 -10
  53. package/build/cjs/lib/serializers.js.map +2 -2
  54. package/build/cjs/lib/utils.js +1 -1
  55. package/build/cjs/lib/utils.js.map +1 -1
  56. package/build/esm/cc/AssociationCC.js +1 -1
  57. package/build/esm/cc/AssociationCC.js.map +1 -1
  58. package/build/esm/cc/CentralSceneCC.d.ts.map +1 -1
  59. package/build/esm/cc/CentralSceneCC.js +2 -3
  60. package/build/esm/cc/CentralSceneCC.js.map +1 -1
  61. package/build/esm/cc/ClimateControlScheduleCC.d.ts.map +1 -1
  62. package/build/esm/cc/ClimateControlScheduleCC.js +7 -7
  63. package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
  64. package/build/esm/cc/ClockCC.d.ts.map +1 -1
  65. package/build/esm/cc/ClockCC.js +2 -3
  66. package/build/esm/cc/ClockCC.js.map +1 -1
  67. package/build/esm/cc/ColorSwitchCC.js +2 -2
  68. package/build/esm/cc/ColorSwitchCC.js.map +1 -1
  69. package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
  70. package/build/esm/cc/ConfigurationCC.js +4 -6
  71. package/build/esm/cc/ConfigurationCC.js.map +1 -1
  72. package/build/esm/cc/DoorLockCC.js +1 -1
  73. package/build/esm/cc/DoorLockCC.js.map +1 -1
  74. package/build/esm/cc/IndicatorCC.js +2 -2
  75. package/build/esm/cc/IndicatorCC.js.map +1 -1
  76. package/build/esm/cc/IrrigationCC.d.ts.map +1 -1
  77. package/build/esm/cc/IrrigationCC.js +7 -8
  78. package/build/esm/cc/IrrigationCC.js.map +1 -1
  79. package/build/esm/cc/MultiChannelCC.js +1 -1
  80. package/build/esm/cc/MultiChannelCC.js.map +1 -1
  81. package/build/esm/cc/NotificationCC.js +1 -1
  82. package/build/esm/cc/NotificationCC.js.map +1 -1
  83. package/build/esm/cc/ProtectionCC.d.ts.map +1 -1
  84. package/build/esm/cc/ProtectionCC.js +1 -2
  85. package/build/esm/cc/ProtectionCC.js.map +1 -1
  86. package/build/esm/cc/Security2CC.js +2 -2
  87. package/build/esm/cc/Security2CC.js.map +1 -1
  88. package/build/esm/cc/SecurityCC.js +1 -1
  89. package/build/esm/cc/SecurityCC.js.map +1 -1
  90. package/build/esm/cc/SoundSwitchCC.js +1 -1
  91. package/build/esm/cc/SoundSwitchCC.js.map +1 -1
  92. package/build/esm/cc/ThermostatSetbackCC.d.ts.map +1 -1
  93. package/build/esm/cc/ThermostatSetbackCC.js +10 -12
  94. package/build/esm/cc/ThermostatSetbackCC.js.map +1 -1
  95. package/build/esm/cc/TimeCC.d.ts.map +1 -1
  96. package/build/esm/cc/TimeCC.js +2 -3
  97. package/build/esm/cc/TimeCC.js.map +1 -1
  98. package/build/esm/cc/WakeUpCC.js +1 -1
  99. package/build/esm/cc/WakeUpCC.js.map +1 -1
  100. package/build/esm/cc/manufacturerProprietary/FibaroCC.js +1 -1
  101. package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
  102. package/build/esm/index_browser.d.ts +8 -0
  103. package/build/esm/index_browser.d.ts.map +1 -0
  104. package/build/esm/index_browser.js +8 -0
  105. package/build/esm/index_browser.js.map +1 -0
  106. package/build/esm/lib/API.js +1 -1
  107. package/build/esm/lib/API.js.map +1 -1
  108. package/build/esm/lib/CommandClass.js +1 -1
  109. package/build/esm/lib/CommandClass.js.map +1 -1
  110. package/build/esm/lib/EncapsulatingCommandClass.js +1 -1
  111. package/build/esm/lib/EncapsulatingCommandClass.js.map +1 -1
  112. package/build/esm/lib/Values.d.ts +2 -2
  113. package/build/esm/lib/Values.d.ts.map +1 -1
  114. package/build/esm/lib/Values.js +1 -1
  115. package/build/esm/lib/Values.js.map +1 -1
  116. package/build/esm/lib/serializers.d.ts +2 -2
  117. package/build/esm/lib/serializers.d.ts.map +1 -1
  118. package/build/esm/lib/serializers.js +20 -10
  119. package/build/esm/lib/serializers.js.map +1 -1
  120. package/build/esm/lib/utils.js +1 -1
  121. package/build/esm/lib/utils.js.map +1 -1
  122. package/package.json +8 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cc/TimeCC.ts"],
4
- "sourcesContent": ["import {\n\tCommandClasses,\n\ttype DSTInfo,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype SupervisionResult,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tformatDate,\n\tgetDSTInfo,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { type MaybeNotKnown } from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetValueDB,\n} from \"@zwave-js/host/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { pick } from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { padStart } from \"alcalzone-shared/strings/index.js\";\nimport { CCAPI } from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { TimeCommand } from \"../lib/_Types.js\";\nimport { encodeTimezone, parseTimezone } from \"../lib/serializers.js\";\n\n// @noSetValueAPI\n// Only the timezone information can be set and that accepts a non-primitive value\n\n@API(CommandClasses.Time)\nexport class TimeCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: TimeCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase TimeCommand.TimeGet:\n\t\t\tcase TimeCommand.TimeReport:\n\t\t\tcase TimeCommand.DateGet:\n\t\t\tcase TimeCommand.DateReport:\n\t\t\t\treturn this.isSinglecast(); // \"mandatory\"\n\t\t\tcase TimeCommand.TimeOffsetGet:\n\t\t\tcase TimeCommand.TimeOffsetReport:\n\t\t\t\treturn this.version >= 2 && this.isSinglecast();\n\t\t\tcase TimeCommand.TimeOffsetSet:\n\t\t\t\treturn this.version >= 2;\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getTime() {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeGet);\n\n\t\tconst cc = new TimeCCTimeGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<TimeCCTimeReport>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"hour\", \"minute\", \"second\"]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async reportTime(\n\t\thour: number,\n\t\tminute: number,\n\t\tsecond: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeReport);\n\n\t\tconst cc = new TimeCCTimeReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\thour,\n\t\t\tminute,\n\t\t\tsecond,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getDate() {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.DateGet);\n\n\t\tconst cc = new TimeCCDateGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<TimeCCDateReport>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"day\", \"month\", \"year\"]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async reportDate(\n\t\tyear: number,\n\t\tmonth: number,\n\t\tday: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.DateReport);\n\n\t\tconst cc = new TimeCCDateReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tyear,\n\t\t\tmonth,\n\t\t\tday,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async setTimezone(\n\t\ttimezone: DSTInfo,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeOffsetSet);\n\n\t\tconst cc = new TimeCCTimeOffsetSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tstandardOffset: timezone.standardOffset,\n\t\t\tdstOffset: timezone.dstOffset,\n\t\t\tdstStart: timezone.startDate,\n\t\t\tdstEnd: timezone.endDate,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async getTimezone(): Promise<MaybeNotKnown<DSTInfo>> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeOffsetGet);\n\n\t\tconst cc = new TimeCCTimeOffsetGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tTimeCCTimeOffsetReport\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\tstandardOffset: response.standardOffset,\n\t\t\t\tdstOffset: response.dstOffset,\n\t\t\t\tstartDate: response.dstStartDate,\n\t\t\t\tendDate: response.dstEndDate,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async reportTimezone(\n\t\ttimezone: DSTInfo,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeOffsetReport);\n\n\t\tconst cc = new TimeCCTimeOffsetReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tstandardOffset: timezone.standardOffset,\n\t\t\tdstOffset: timezone.dstOffset,\n\t\t\tdstStart: timezone.startDate,\n\t\t\tdstEnd: timezone.endDate,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n}\n\n@commandClass(CommandClasses.Time)\n@implementedVersion(2)\nexport class TimeCC extends CommandClass {\n\tdeclare ccCommand: TimeCommand;\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.Time,\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\t// Synchronize the slave's time\n\t\tif (api.version >= 2) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"setting timezone information...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\t// Set the correct timezone on this node\n\t\t\tconst timezone = getDSTInfo();\n\t\t\tawait api.setTimezone(timezone);\n\t\t}\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n}\n\n// @publicAPI\nexport interface TimeCCTimeReportOptions {\n\thour: number;\n\tminute: number;\n\tsecond: number;\n}\n\n@CCCommand(TimeCommand.TimeReport)\nexport class TimeCCTimeReport extends TimeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<TimeCCTimeReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.hour = options.hour;\n\t\tthis.minute = options.minute;\n\t\tthis.second = options.second;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): TimeCCTimeReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst hour = raw.payload[0] & 0b11111;\n\t\tconst minute = raw.payload[1];\n\t\tconst second = raw.payload[2];\n\n\t\tvalidatePayload(\n\t\t\thour >= 0,\n\t\t\thour <= 23,\n\t\t\tminute >= 0,\n\t\t\tminute <= 59,\n\t\t\tsecond >= 0,\n\t\t\tsecond <= 59,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\thour,\n\t\t\tminute,\n\t\t\tsecond,\n\t\t});\n\t}\n\n\tpublic hour: number;\n\tpublic minute: number;\n\tpublic second: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([\n\t\t\tthis.hour & 0b11111,\n\t\t\tthis.minute,\n\t\t\tthis.second,\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\ttime: `${padStart(this.hour.toString(), 2, \"0\")}:${\n\t\t\t\t\tpadStart(\n\t\t\t\t\t\tthis.minute.toString(),\n\t\t\t\t\t\t2,\n\t\t\t\t\t\t\"0\",\n\t\t\t\t\t)\n\t\t\t\t}:${padStart(this.second.toString(), 2, \"0\")}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(TimeCommand.TimeGet)\n@expectedCCResponse(TimeCCTimeReport)\nexport class TimeCCTimeGet extends TimeCC {}\n\n// @publicAPI\nexport interface TimeCCDateReportOptions {\n\tyear: number;\n\tmonth: number;\n\tday: number;\n}\n\n@CCCommand(TimeCommand.DateReport)\nexport class TimeCCDateReport extends TimeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<TimeCCDateReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.year = options.year;\n\t\tthis.month = options.month;\n\t\tthis.day = options.day;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): TimeCCDateReport {\n\t\tvalidatePayload(raw.payload.length >= 4);\n\t\tconst year = raw.payload.readUInt16BE(0);\n\t\tconst month = raw.payload[2];\n\t\tconst day = raw.payload[3];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tyear,\n\t\t\tmonth,\n\t\t\tday,\n\t\t});\n\t}\n\n\tpublic year: number;\n\tpublic month: number;\n\tpublic day: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([\n\t\t\t// 2 bytes placeholder for year\n\t\t\t0,\n\t\t\t0,\n\t\t\tthis.month,\n\t\t\tthis.day,\n\t\t]);\n\t\tthis.payload.writeUInt16BE(this.year, 0);\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\tdate: `${padStart(this.year.toString(), 4, \"0\")}-${\n\t\t\t\t\tpadStart(\n\t\t\t\t\t\tthis.month.toString(),\n\t\t\t\t\t\t2,\n\t\t\t\t\t\t\"0\",\n\t\t\t\t\t)\n\t\t\t\t}-${padStart(this.day.toString(), 2, \"0\")}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(TimeCommand.DateGet)\n@expectedCCResponse(TimeCCDateReport)\nexport class TimeCCDateGet extends TimeCC {}\n\n// @publicAPI\nexport interface TimeCCTimeOffsetSetOptions {\n\tstandardOffset: number;\n\tdstOffset: number;\n\tdstStart: Date;\n\tdstEnd: Date;\n}\n\n@CCCommand(TimeCommand.TimeOffsetSet)\n@useSupervision()\nexport class TimeCCTimeOffsetSet extends TimeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<TimeCCTimeOffsetSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.standardOffset = options.standardOffset;\n\t\tthis.dstOffset = options.dstOffset;\n\t\tthis.dstStartDate = options.dstStart;\n\t\tthis.dstEndDate = options.dstEnd;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): TimeCCTimeOffsetSet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new TimeCCTimeOffsetSet({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic standardOffset: number;\n\tpublic dstOffset: number;\n\tpublic dstStartDate: Date;\n\tpublic dstEndDate: Date;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tencodeTimezone({\n\t\t\t\tstandardOffset: this.standardOffset,\n\t\t\t\tdstOffset: this.dstOffset,\n\t\t\t}),\n\t\t\tBytes.from([\n\t\t\t\tthis.dstStartDate.getUTCMonth() + 1,\n\t\t\t\tthis.dstStartDate.getUTCDate(),\n\t\t\t\tthis.dstStartDate.getUTCHours(),\n\t\t\t\tthis.dstEndDate.getUTCMonth() + 1,\n\t\t\t\tthis.dstEndDate.getUTCDate(),\n\t\t\t\tthis.dstEndDate.getUTCHours(),\n\t\t\t]),\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\"standard time offset\": `${this.standardOffset} minutes`,\n\t\t\t\t\"DST offset\": `${this.dstOffset} minutes`,\n\t\t\t\t\"DST start date\": formatDate(this.dstStartDate, \"YYYY-MM-DD\"),\n\t\t\t\t\"DST end date\": formatDate(this.dstEndDate, \"YYYY-MM-DD\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface TimeCCTimeOffsetReportOptions {\n\tstandardOffset: number;\n\tdstOffset: number;\n\tdstStart: Date;\n\tdstEnd: Date;\n}\n\n@CCCommand(TimeCommand.TimeOffsetReport)\nexport class TimeCCTimeOffsetReport extends TimeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<TimeCCTimeOffsetReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.standardOffset = options.standardOffset;\n\t\tthis.dstOffset = options.dstOffset;\n\t\tthis.dstStartDate = options.dstStart;\n\t\tthis.dstEndDate = options.dstEnd;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): TimeCCTimeOffsetReport {\n\t\tvalidatePayload(raw.payload.length >= 9);\n\t\tconst { standardOffset, dstOffset } = parseTimezone(raw.payload);\n\t\tconst currentYear = new Date().getUTCFullYear();\n\t\tconst dstStartDate: Date = new Date(\n\t\t\tDate.UTC(\n\t\t\t\tcurrentYear,\n\t\t\t\traw.payload[3] - 1,\n\t\t\t\traw.payload[4],\n\t\t\t\traw.payload[5],\n\t\t\t),\n\t\t);\n\t\tconst dstEndDate: Date = new Date(\n\t\t\tDate.UTC(\n\t\t\t\tcurrentYear,\n\t\t\t\traw.payload[6] - 1,\n\t\t\t\traw.payload[7],\n\t\t\t\traw.payload[8],\n\t\t\t),\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tstandardOffset,\n\t\t\tdstOffset,\n\t\t\tdstStart: dstStartDate,\n\t\t\tdstEnd: dstEndDate,\n\t\t});\n\t}\n\n\tpublic standardOffset: number;\n\tpublic dstOffset: number;\n\tpublic dstStartDate: Date;\n\tpublic dstEndDate: Date;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tencodeTimezone({\n\t\t\t\tstandardOffset: this.standardOffset,\n\t\t\t\tdstOffset: this.dstOffset,\n\t\t\t}),\n\t\t\tBytes.from([\n\t\t\t\tthis.dstStartDate.getUTCMonth() + 1,\n\t\t\t\tthis.dstStartDate.getUTCDate(),\n\t\t\t\tthis.dstStartDate.getUTCHours(),\n\t\t\t\tthis.dstEndDate.getUTCMonth() + 1,\n\t\t\t\tthis.dstEndDate.getUTCDate(),\n\t\t\t\tthis.dstEndDate.getUTCHours(),\n\t\t\t]),\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\"standard time offset\": `${this.standardOffset} minutes`,\n\t\t\t\t\"DST offset\": `${this.dstOffset} minutes`,\n\t\t\t\t\"DST start date\": formatDate(this.dstStartDate, \"YYYY-MM-DD\"),\n\t\t\t\t\"DST end date\": formatDate(this.dstEndDate, \"YYYY-MM-DD\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(TimeCommand.TimeOffsetGet)\n@expectedCCResponse(TimeCCTimeOffsetReport)\nexport class TimeCCTimeOffsetGet extends TimeCC {}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n\tCommandClasses,\n\ttype DSTInfo,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype SupervisionResult,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tformatDate,\n\tgetDSTInfo,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { type MaybeNotKnown } from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetValueDB,\n} from \"@zwave-js/host/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { pick } from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { CCAPI } from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { TimeCommand } from \"../lib/_Types.js\";\nimport { encodeTimezone, parseTimezone } from \"../lib/serializers.js\";\n\n// @noSetValueAPI\n// Only the timezone information can be set and that accepts a non-primitive value\n\n@API(CommandClasses.Time)\nexport class TimeCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: TimeCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase TimeCommand.TimeGet:\n\t\t\tcase TimeCommand.TimeReport:\n\t\t\tcase TimeCommand.DateGet:\n\t\t\tcase TimeCommand.DateReport:\n\t\t\t\treturn this.isSinglecast(); // \"mandatory\"\n\t\t\tcase TimeCommand.TimeOffsetGet:\n\t\t\tcase TimeCommand.TimeOffsetReport:\n\t\t\t\treturn this.version >= 2 && this.isSinglecast();\n\t\t\tcase TimeCommand.TimeOffsetSet:\n\t\t\t\treturn this.version >= 2;\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getTime() {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeGet);\n\n\t\tconst cc = new TimeCCTimeGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<TimeCCTimeReport>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"hour\", \"minute\", \"second\"]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async reportTime(\n\t\thour: number,\n\t\tminute: number,\n\t\tsecond: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeReport);\n\n\t\tconst cc = new TimeCCTimeReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\thour,\n\t\t\tminute,\n\t\t\tsecond,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getDate() {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.DateGet);\n\n\t\tconst cc = new TimeCCDateGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<TimeCCDateReport>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"day\", \"month\", \"year\"]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async reportDate(\n\t\tyear: number,\n\t\tmonth: number,\n\t\tday: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.DateReport);\n\n\t\tconst cc = new TimeCCDateReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tyear,\n\t\t\tmonth,\n\t\t\tday,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async setTimezone(\n\t\ttimezone: DSTInfo,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeOffsetSet);\n\n\t\tconst cc = new TimeCCTimeOffsetSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tstandardOffset: timezone.standardOffset,\n\t\t\tdstOffset: timezone.dstOffset,\n\t\t\tdstStart: timezone.startDate,\n\t\t\tdstEnd: timezone.endDate,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async getTimezone(): Promise<MaybeNotKnown<DSTInfo>> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeOffsetGet);\n\n\t\tconst cc = new TimeCCTimeOffsetGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tTimeCCTimeOffsetReport\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\tstandardOffset: response.standardOffset,\n\t\t\t\tdstOffset: response.dstOffset,\n\t\t\t\tstartDate: response.dstStartDate,\n\t\t\t\tendDate: response.dstEndDate,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async reportTimezone(\n\t\ttimezone: DSTInfo,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(TimeCommand, TimeCommand.TimeOffsetReport);\n\n\t\tconst cc = new TimeCCTimeOffsetReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tstandardOffset: timezone.standardOffset,\n\t\t\tdstOffset: timezone.dstOffset,\n\t\t\tdstStart: timezone.startDate,\n\t\t\tdstEnd: timezone.endDate,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n}\n\n@commandClass(CommandClasses.Time)\n@implementedVersion(2)\nexport class TimeCC extends CommandClass {\n\tdeclare ccCommand: TimeCommand;\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.Time,\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\t// Synchronize the slave's time\n\t\tif (api.version >= 2) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"setting timezone information...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\t// Set the correct timezone on this node\n\t\t\tconst timezone = getDSTInfo();\n\t\t\tawait api.setTimezone(timezone);\n\t\t}\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n}\n\n// @publicAPI\nexport interface TimeCCTimeReportOptions {\n\thour: number;\n\tminute: number;\n\tsecond: number;\n}\n\n@CCCommand(TimeCommand.TimeReport)\nexport class TimeCCTimeReport extends TimeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<TimeCCTimeReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.hour = options.hour;\n\t\tthis.minute = options.minute;\n\t\tthis.second = options.second;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): TimeCCTimeReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst hour = raw.payload[0] & 0b11111;\n\t\tconst minute = raw.payload[1];\n\t\tconst second = raw.payload[2];\n\n\t\tvalidatePayload(\n\t\t\thour >= 0,\n\t\t\thour <= 23,\n\t\t\tminute >= 0,\n\t\t\tminute <= 59,\n\t\t\tsecond >= 0,\n\t\t\tsecond <= 59,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\thour,\n\t\t\tminute,\n\t\t\tsecond,\n\t\t});\n\t}\n\n\tpublic hour: number;\n\tpublic minute: number;\n\tpublic second: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([\n\t\t\tthis.hour & 0b11111,\n\t\t\tthis.minute,\n\t\t\tthis.second,\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\ttime: `${this.hour.toString().padStart(2, \"0\")}:${\n\t\t\t\t\tthis.minute.toString().padStart(2, \"0\")\n\t\t\t\t}:${this.second.toString().padStart(2, \"0\")}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(TimeCommand.TimeGet)\n@expectedCCResponse(TimeCCTimeReport)\nexport class TimeCCTimeGet extends TimeCC {}\n\n// @publicAPI\nexport interface TimeCCDateReportOptions {\n\tyear: number;\n\tmonth: number;\n\tday: number;\n}\n\n@CCCommand(TimeCommand.DateReport)\nexport class TimeCCDateReport extends TimeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<TimeCCDateReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.year = options.year;\n\t\tthis.month = options.month;\n\t\tthis.day = options.day;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): TimeCCDateReport {\n\t\tvalidatePayload(raw.payload.length >= 4);\n\t\tconst year = raw.payload.readUInt16BE(0);\n\t\tconst month = raw.payload[2];\n\t\tconst day = raw.payload[3];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tyear,\n\t\t\tmonth,\n\t\t\tday,\n\t\t});\n\t}\n\n\tpublic year: number;\n\tpublic month: number;\n\tpublic day: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([\n\t\t\t// 2 bytes placeholder for year\n\t\t\t0,\n\t\t\t0,\n\t\t\tthis.month,\n\t\t\tthis.day,\n\t\t]);\n\t\tthis.payload.writeUInt16BE(this.year, 0);\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\tdate: `${this.year.toString().padStart(4, \"0\")}-${\n\t\t\t\t\tthis.month.toString().padStart(2, \"0\")\n\t\t\t\t}-${this.day.toString().padStart(2, \"0\")}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(TimeCommand.DateGet)\n@expectedCCResponse(TimeCCDateReport)\nexport class TimeCCDateGet extends TimeCC {}\n\n// @publicAPI\nexport interface TimeCCTimeOffsetSetOptions {\n\tstandardOffset: number;\n\tdstOffset: number;\n\tdstStart: Date;\n\tdstEnd: Date;\n}\n\n@CCCommand(TimeCommand.TimeOffsetSet)\n@useSupervision()\nexport class TimeCCTimeOffsetSet extends TimeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<TimeCCTimeOffsetSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.standardOffset = options.standardOffset;\n\t\tthis.dstOffset = options.dstOffset;\n\t\tthis.dstStartDate = options.dstStart;\n\t\tthis.dstEndDate = options.dstEnd;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): TimeCCTimeOffsetSet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\n\t\t// return new TimeCCTimeOffsetSet({\n\t\t// \tnodeId: ctx.sourceNodeId,\n\t\t// });\n\t}\n\n\tpublic standardOffset: number;\n\tpublic dstOffset: number;\n\tpublic dstStartDate: Date;\n\tpublic dstEndDate: Date;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tencodeTimezone({\n\t\t\t\tstandardOffset: this.standardOffset,\n\t\t\t\tdstOffset: this.dstOffset,\n\t\t\t}),\n\t\t\tBytes.from([\n\t\t\t\tthis.dstStartDate.getUTCMonth() + 1,\n\t\t\t\tthis.dstStartDate.getUTCDate(),\n\t\t\t\tthis.dstStartDate.getUTCHours(),\n\t\t\t\tthis.dstEndDate.getUTCMonth() + 1,\n\t\t\t\tthis.dstEndDate.getUTCDate(),\n\t\t\t\tthis.dstEndDate.getUTCHours(),\n\t\t\t]),\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\"standard time offset\": `${this.standardOffset} minutes`,\n\t\t\t\t\"DST offset\": `${this.dstOffset} minutes`,\n\t\t\t\t\"DST start date\": formatDate(this.dstStartDate, \"YYYY-MM-DD\"),\n\t\t\t\t\"DST end date\": formatDate(this.dstEndDate, \"YYYY-MM-DD\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface TimeCCTimeOffsetReportOptions {\n\tstandardOffset: number;\n\tdstOffset: number;\n\tdstStart: Date;\n\tdstEnd: Date;\n}\n\n@CCCommand(TimeCommand.TimeOffsetReport)\nexport class TimeCCTimeOffsetReport extends TimeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<TimeCCTimeOffsetReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.standardOffset = options.standardOffset;\n\t\tthis.dstOffset = options.dstOffset;\n\t\tthis.dstStartDate = options.dstStart;\n\t\tthis.dstEndDate = options.dstEnd;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): TimeCCTimeOffsetReport {\n\t\tvalidatePayload(raw.payload.length >= 9);\n\t\tconst { standardOffset, dstOffset } = parseTimezone(raw.payload);\n\t\tconst currentYear = new Date().getUTCFullYear();\n\t\tconst dstStartDate: Date = new Date(\n\t\t\tDate.UTC(\n\t\t\t\tcurrentYear,\n\t\t\t\traw.payload[3] - 1,\n\t\t\t\traw.payload[4],\n\t\t\t\traw.payload[5],\n\t\t\t),\n\t\t);\n\t\tconst dstEndDate: Date = new Date(\n\t\t\tDate.UTC(\n\t\t\t\tcurrentYear,\n\t\t\t\traw.payload[6] - 1,\n\t\t\t\traw.payload[7],\n\t\t\t\traw.payload[8],\n\t\t\t),\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tstandardOffset,\n\t\t\tdstOffset,\n\t\t\tdstStart: dstStartDate,\n\t\t\tdstEnd: dstEndDate,\n\t\t});\n\t}\n\n\tpublic standardOffset: number;\n\tpublic dstOffset: number;\n\tpublic dstStartDate: Date;\n\tpublic dstEndDate: Date;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.concat([\n\t\t\tencodeTimezone({\n\t\t\t\tstandardOffset: this.standardOffset,\n\t\t\t\tdstOffset: this.dstOffset,\n\t\t\t}),\n\t\t\tBytes.from([\n\t\t\t\tthis.dstStartDate.getUTCMonth() + 1,\n\t\t\t\tthis.dstStartDate.getUTCDate(),\n\t\t\t\tthis.dstStartDate.getUTCHours(),\n\t\t\t\tthis.dstEndDate.getUTCMonth() + 1,\n\t\t\t\tthis.dstEndDate.getUTCDate(),\n\t\t\t\tthis.dstEndDate.getUTCHours(),\n\t\t\t]),\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\"standard time offset\": `${this.standardOffset} minutes`,\n\t\t\t\t\"DST offset\": `${this.dstOffset} minutes`,\n\t\t\t\t\"DST start date\": formatDate(this.dstStartDate, \"YYYY-MM-DD\"),\n\t\t\t\t\"DST end date\": formatDate(this.dstEndDate, \"YYYY-MM-DD\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(TimeCommand.TimeOffsetGet)\n@expectedCCResponse(TimeCCTimeOffsetReport)\nexport class TimeCCTimeOffsetGet extends TimeCC {}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_safe"]
7
7
  }
@@ -33,7 +33,7 @@ module.exports = __toCommonJS(WakeUpCC_exports);
33
33
  var import_safe = require("@zwave-js/core/safe");
34
34
  var import_safe2 = require("@zwave-js/shared/safe");
35
35
  var import_safe3 = require("@zwave-js/shared/safe");
36
- var import_math = require("alcalzone-shared/math/index.js");
36
+ var import_math = require("alcalzone-shared/math");
37
37
  var import_API = require("../lib/API.js");
38
38
  var import_CommandClass = require("../lib/CommandClass.js");
39
39
  var import_CommandClassDecorators = require("../lib/CommandClassDecorators.js");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cc/WakeUpCC.ts"],
4
- "sourcesContent": ["import {\n\tCommandClasses,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype SupervisionResult,\n\tTransmitOptions,\n\tValueMetadata,\n\ttype WithAddress,\n\tsupervisedCommandSucceeded,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetValueDB,\n} from \"@zwave-js/host/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { pick } from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { clamp } from \"alcalzone-shared/math/index.js\";\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} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { WakeUpCommand } from \"../lib/_Types.js\";\n\nexport const WakeUpCCValues = Object.freeze({\n\t...V.defineStaticCCValues(CommandClasses[\"Wake Up\"], {\n\t\t...V.staticProperty(\n\t\t\t\"controllerNodeId\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnly,\n\t\t\t\tlabel: \"Node ID of the controller\",\n\t\t\t} as const,\n\t\t\t{\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticProperty(\n\t\t\t\"wakeUpInterval\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.UInt24,\n\t\t\t\tlabel: \"Wake Up interval\",\n\t\t\t} as const,\n\t\t\t{\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticProperty(\"wakeUpOnDemandSupported\", undefined, {\n\t\t\tinternal: true,\n\t\t\tsupportsEndpoints: false,\n\t\t\tminVersion: 3,\n\t\t}),\n\t}),\n});\n\n@API(CommandClasses[\"Wake Up\"])\nexport class WakeUpCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: WakeUpCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase WakeUpCommand.IntervalGet:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase WakeUpCommand.IntervalSet:\n\t\t\tcase WakeUpCommand.NoMoreInformation:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase WakeUpCommand.IntervalCapabilitiesGet:\n\t\t\t\treturn this.version >= 2 && 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(this: WakeUpCCAPI, { property }, value) {\n\t\t\tif (property !== \"wakeUpInterval\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t\tif (typeof value !== \"number\") {\n\t\t\t\tthrowWrongValueType(\n\t\t\t\t\tthis.ccId,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"number\",\n\t\t\t\t\ttypeof value,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst result = await this.setInterval(\n\t\t\t\tvalue,\n\t\t\t\tthis.host.ownNodeId ?? 1,\n\t\t\t);\n\n\t\t\t// Verify the change after a short delay, unless the command was supervised and successful\n\t\t\tif (this.isSinglecast() && !supervisedCommandSucceeded(result)) {\n\t\t\t\tthis.schedulePoll({ property }, value, { transition: \"fast\" });\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: WakeUpCCAPI, { property }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"wakeUpInterval\":\n\t\t\t\t\treturn (await this.getInterval())?.[property];\n\t\t\t\tdefault:\n\t\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getInterval() {\n\t\tthis.assertSupportsCommand(WakeUpCommand, WakeUpCommand.IntervalGet);\n\n\t\tconst cc = new WakeUpCCIntervalGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tWakeUpCCIntervalReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"wakeUpInterval\", \"controllerNodeId\"]);\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getIntervalCapabilities() {\n\t\tthis.assertSupportsCommand(\n\t\t\tWakeUpCommand,\n\t\t\tWakeUpCommand.IntervalCapabilitiesGet,\n\t\t);\n\n\t\tconst cc = new WakeUpCCIntervalCapabilitiesGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tWakeUpCCIntervalCapabilitiesReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\n\t\t\t\t\"defaultWakeUpInterval\",\n\t\t\t\t\"minWakeUpInterval\",\n\t\t\t\t\"maxWakeUpInterval\",\n\t\t\t\t\"wakeUpIntervalSteps\",\n\t\t\t\t\"wakeUpOnDemandSupported\",\n\t\t\t]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async setInterval(\n\t\twakeUpInterval: number,\n\t\tcontrollerNodeId: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(WakeUpCommand, WakeUpCommand.IntervalSet);\n\n\t\tconst cc = new WakeUpCCIntervalSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\twakeUpInterval,\n\t\t\tcontrollerNodeId,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async sendNoMoreInformation(): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tWakeUpCommand,\n\t\t\tWakeUpCommand.NoMoreInformation,\n\t\t);\n\n\t\tconst cc = new WakeUpCCNoMoreInformation({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tawait this.host.sendCommand(cc, {\n\t\t\t...this.commandOptions,\n\t\t\t// This command must be sent as part of the wake up queue\n\t\t\tpriority: MessagePriority.WakeUp,\n\t\t\t// Don't try to resend this - if we get no response, the node is most likely asleep\n\t\t\tmaxSendAttempts: 1,\n\t\t\t// Also we don't want to wait for an ACK because this can lock up the network for seconds\n\t\t\t// if the target node is asleep and doesn't respond to the command\n\t\t\ttransmitOptions: TransmitOptions.DEFAULT_NOACK,\n\t\t});\n\t}\n}\n\n@commandClass(CommandClasses[\"Wake Up\"])\n@implementedVersion(3)\n@ccValues(WakeUpCCValues)\nexport class WakeUpCC extends CommandClass {\n\tdeclare ccCommand: WakeUpCommand;\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[\"Wake Up\"],\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 (node.id === ctx.ownNodeId) {\n\t\t\tctx.logNode(\n\t\t\t\tnode.id,\n\t\t\t\t`skipping wakeup configuration for the controller`,\n\t\t\t);\n\t\t} else if (node.isFrequentListening) {\n\t\t\tctx.logNode(\n\t\t\t\tnode.id,\n\t\t\t\t`skipping wakeup configuration for frequent listening device`,\n\t\t\t);\n\t\t} else {\n\t\t\tlet desiredInterval: number;\n\t\t\tlet currentControllerNodeId: number;\n\t\t\tlet minInterval: number | undefined;\n\t\t\tlet maxInterval: number | undefined;\n\n\t\t\t// Retrieve the allowed wake up intervals and wake on demand support if possible\n\t\t\tif (api.version >= 2) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"retrieving wakeup capabilities from the device...\",\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tconst wakeupCaps = await api.getIntervalCapabilities();\n\t\t\t\tif (wakeupCaps) {\n\t\t\t\t\tconst logMessage = `received wakeup capabilities:\ndefault wakeup interval: ${wakeupCaps.defaultWakeUpInterval} seconds\nminimum wakeup interval: ${wakeupCaps.minWakeUpInterval} seconds\nmaximum wakeup interval: ${wakeupCaps.maxWakeUpInterval} seconds\nwakeup interval steps: ${wakeupCaps.wakeUpIntervalSteps} seconds\nwakeup on demand supported: ${wakeupCaps.wakeUpOnDemandSupported}`;\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: logMessage,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t\tminInterval = wakeupCaps.minWakeUpInterval;\n\t\t\t\t\tmaxInterval = wakeupCaps.maxWakeUpInterval;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// SDS14223 prescribes a IntervalSet followed by a check\n\t\t\t// We have no intention of changing the interval (maybe some time in the future)\n\t\t\t// So for now get the current interval and just set the controller ID\n\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"retrieving wakeup interval from the device...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst wakeupResp = await api.getInterval();\n\n\t\t\tif (wakeupResp) {\n\t\t\t\tconst logMessage = `received wakeup configuration:\nwakeup interval: ${wakeupResp.wakeUpInterval} seconds\ncontroller node: ${wakeupResp.controllerNodeId}`;\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\n\t\t\t\tdesiredInterval = wakeupResp.wakeUpInterval;\n\t\t\t\tcurrentControllerNodeId = wakeupResp.controllerNodeId;\n\t\t\t} else {\n\t\t\t\t// Just guess, I guess\n\t\t\t\tdesiredInterval = 3600 * 6; // 6 hours\n\t\t\t\tcurrentControllerNodeId = 0; // assume not set\n\t\t\t}\n\n\t\t\tconst ownNodeId = ctx.ownNodeId;\n\t\t\t// Only change the destination if necessary\n\t\t\tif (currentControllerNodeId !== ownNodeId) {\n\t\t\t\t// Spec compliance: Limit the interval to the allowed range, but...\n\t\t\t\t// ...try and preserve a \"never wake up\" configuration (#6367)\n\t\t\t\tif (\n\t\t\t\t\tdesiredInterval !== 0\n\t\t\t\t\t&& minInterval != undefined\n\t\t\t\t\t&& maxInterval != undefined\n\t\t\t\t) {\n\t\t\t\t\tdesiredInterval = clamp(\n\t\t\t\t\t\tdesiredInterval,\n\t\t\t\t\t\tminInterval,\n\t\t\t\t\t\tmaxInterval,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: \"configuring wakeup destination node\",\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tawait api.setInterval(desiredInterval, ownNodeId);\n\t\t\t\tthis.setValue(\n\t\t\t\t\tctx,\n\t\t\t\t\tWakeUpCCValues.controllerNodeId,\n\t\t\t\t\townNodeId,\n\t\t\t\t);\n\t\t\t\tctx.logNode(\n\t\t\t\t\tnode.id,\n\t\t\t\t\t\"wakeup destination node changed!\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n}\n\n// @publicAPI\nexport interface WakeUpCCIntervalSetOptions {\n\twakeUpInterval: number;\n\tcontrollerNodeId: number;\n}\n\n@CCCommand(WakeUpCommand.IntervalSet)\n@useSupervision()\nexport class WakeUpCCIntervalSet extends WakeUpCC {\n\tpublic constructor(\n\t\toptions: WithAddress<WakeUpCCIntervalSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.wakeUpInterval = options.wakeUpInterval;\n\t\tthis.controllerNodeId = options.controllerNodeId;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): WakeUpCCIntervalSet {\n\t\tvalidatePayload(raw.payload.length >= 4);\n\t\tconst wakeUpInterval = raw.payload.readUIntBE(0, 3);\n\t\tconst controllerNodeId = raw.payload[3];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\twakeUpInterval,\n\t\t\tcontrollerNodeId,\n\t\t});\n\t}\n\n\tpublic wakeUpInterval: number;\n\tpublic controllerNodeId: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([\n\t\t\t0,\n\t\t\t0,\n\t\t\t0, // placeholder\n\t\t\tthis.controllerNodeId,\n\t\t]);\n\t\tthis.payload.writeUIntBE(this.wakeUpInterval, 0, 3);\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\"wake-up interval\": `${this.wakeUpInterval} seconds`,\n\t\t\t\t\"controller node id\": this.controllerNodeId,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface WakeUpCCIntervalReportOptions {\n\twakeUpInterval: number;\n\tcontrollerNodeId: number;\n}\n\n@CCCommand(WakeUpCommand.IntervalReport)\n@ccValueProperty(\"wakeUpInterval\", WakeUpCCValues.wakeUpInterval)\n@ccValueProperty(\"controllerNodeId\", WakeUpCCValues.controllerNodeId)\nexport class WakeUpCCIntervalReport extends WakeUpCC {\n\tpublic constructor(\n\t\toptions: WithAddress<WakeUpCCIntervalReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\t// TODO: Check implementation:\n\t\tthis.wakeUpInterval = options.wakeUpInterval;\n\t\tthis.controllerNodeId = options.controllerNodeId;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): WakeUpCCIntervalReport {\n\t\tvalidatePayload(raw.payload.length >= 4);\n\t\tconst wakeUpInterval = raw.payload.readUIntBE(0, 3);\n\t\tconst controllerNodeId = raw.payload[3];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\twakeUpInterval,\n\t\t\tcontrollerNodeId,\n\t\t});\n\t}\n\n\tpublic readonly wakeUpInterval: number;\n\n\tpublic readonly controllerNodeId: number;\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\"wake-up interval\": `${this.wakeUpInterval} seconds`,\n\t\t\t\t\"controller node id\": this.controllerNodeId,\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(WakeUpCommand.IntervalGet)\n@expectedCCResponse(WakeUpCCIntervalReport)\nexport class WakeUpCCIntervalGet extends WakeUpCC {}\n\n@CCCommand(WakeUpCommand.WakeUpNotification)\nexport class WakeUpCCWakeUpNotification extends WakeUpCC {}\n\n@CCCommand(WakeUpCommand.NoMoreInformation)\nexport class WakeUpCCNoMoreInformation extends WakeUpCC {}\n\n// @publicAPI\nexport interface WakeUpCCIntervalCapabilitiesReportOptions {\n\tminWakeUpInterval: number;\n\tmaxWakeUpInterval: number;\n\tdefaultWakeUpInterval: number;\n\twakeUpIntervalSteps: number;\n\twakeUpOnDemandSupported: boolean;\n}\n\n@CCCommand(WakeUpCommand.IntervalCapabilitiesReport)\n@ccValueProperty(\n\t\"wakeUpOnDemandSupported\",\n\tWakeUpCCValues.wakeUpOnDemandSupported,\n)\nexport class WakeUpCCIntervalCapabilitiesReport extends WakeUpCC {\n\tpublic constructor(\n\t\toptions: WithAddress<WakeUpCCIntervalCapabilitiesReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\t// TODO: Check implementation:\n\t\tthis.minWakeUpInterval = options.minWakeUpInterval;\n\t\tthis.maxWakeUpInterval = options.maxWakeUpInterval;\n\t\tthis.defaultWakeUpInterval = options.defaultWakeUpInterval;\n\t\tthis.wakeUpIntervalSteps = options.wakeUpIntervalSteps;\n\t\tthis.wakeUpOnDemandSupported = options.wakeUpOnDemandSupported;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): WakeUpCCIntervalCapabilitiesReport {\n\t\tvalidatePayload(raw.payload.length >= 12);\n\t\tconst minWakeUpInterval = raw.payload.readUIntBE(0, 3);\n\t\tconst maxWakeUpInterval = raw.payload.readUIntBE(3, 3);\n\t\tconst defaultWakeUpInterval = raw.payload.readUIntBE(6, 3);\n\t\tconst wakeUpIntervalSteps = raw.payload.readUIntBE(9, 3);\n\t\tlet wakeUpOnDemandSupported = false;\n\t\tif (raw.payload.length >= 13) {\n\t\t\t// V3+\n\t\t\twakeUpOnDemandSupported = !!(raw.payload[12] & 0b1);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tminWakeUpInterval,\n\t\t\tmaxWakeUpInterval,\n\t\t\tdefaultWakeUpInterval,\n\t\t\twakeUpIntervalSteps,\n\t\t\twakeUpOnDemandSupported,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\t// Store the received information as metadata for the wake up interval\n\t\tvalueDB.setMetadata(\n\t\t\t{\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tproperty: \"wakeUpInterval\",\n\t\t\t},\n\t\t\t{\n\t\t\t\t...ValueMetadata.WriteOnlyUInt24,\n\t\t\t\tmin: this.minWakeUpInterval,\n\t\t\t\tmax: this.maxWakeUpInterval,\n\t\t\t\tsteps: this.wakeUpIntervalSteps,\n\t\t\t\tdefault: this.defaultWakeUpInterval,\n\t\t\t},\n\t\t);\n\n\t\t// Store wakeUpOnDemandSupported in valueDB\n\n\t\treturn true;\n\t}\n\n\tpublic readonly minWakeUpInterval: number;\n\tpublic readonly maxWakeUpInterval: number;\n\tpublic readonly defaultWakeUpInterval: number;\n\tpublic readonly wakeUpIntervalSteps: number;\n\n\tpublic readonly wakeUpOnDemandSupported: boolean;\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\"default interval\": `${this.defaultWakeUpInterval} seconds`,\n\t\t\t\t\"minimum interval\": `${this.minWakeUpInterval} seconds`,\n\t\t\t\t\"maximum interval\": `${this.maxWakeUpInterval} seconds`,\n\t\t\t\t\"interval steps\": `${this.wakeUpIntervalSteps} seconds`,\n\t\t\t\t\"wake up on demand supported\":\n\t\t\t\t\t`${this.wakeUpOnDemandSupported}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(WakeUpCommand.IntervalCapabilitiesGet)\n@expectedCCResponse(WakeUpCCIntervalCapabilitiesReport)\nexport class WakeUpCCIntervalCapabilitiesGet extends WakeUpCC {}\n"],
4
+ "sourcesContent": ["import {\n\tCommandClasses,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype SupervisionResult,\n\tTransmitOptions,\n\tValueMetadata,\n\ttype WithAddress,\n\tsupervisedCommandSucceeded,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetValueDB,\n} from \"@zwave-js/host/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { pick } from \"@zwave-js/shared/safe\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { clamp } from \"alcalzone-shared/math\";\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} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { WakeUpCommand } from \"../lib/_Types.js\";\n\nexport const WakeUpCCValues = Object.freeze({\n\t...V.defineStaticCCValues(CommandClasses[\"Wake Up\"], {\n\t\t...V.staticProperty(\n\t\t\t\"controllerNodeId\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnly,\n\t\t\t\tlabel: \"Node ID of the controller\",\n\t\t\t} as const,\n\t\t\t{\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticProperty(\n\t\t\t\"wakeUpInterval\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.UInt24,\n\t\t\t\tlabel: \"Wake Up interval\",\n\t\t\t} as const,\n\t\t\t{\n\t\t\t\tsupportsEndpoints: false,\n\t\t\t},\n\t\t),\n\n\t\t...V.staticProperty(\"wakeUpOnDemandSupported\", undefined, {\n\t\t\tinternal: true,\n\t\t\tsupportsEndpoints: false,\n\t\t\tminVersion: 3,\n\t\t}),\n\t}),\n});\n\n@API(CommandClasses[\"Wake Up\"])\nexport class WakeUpCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: WakeUpCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase WakeUpCommand.IntervalGet:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase WakeUpCommand.IntervalSet:\n\t\t\tcase WakeUpCommand.NoMoreInformation:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase WakeUpCommand.IntervalCapabilitiesGet:\n\t\t\t\treturn this.version >= 2 && 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(this: WakeUpCCAPI, { property }, value) {\n\t\t\tif (property !== \"wakeUpInterval\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t\tif (typeof value !== \"number\") {\n\t\t\t\tthrowWrongValueType(\n\t\t\t\t\tthis.ccId,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"number\",\n\t\t\t\t\ttypeof value,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst result = await this.setInterval(\n\t\t\t\tvalue,\n\t\t\t\tthis.host.ownNodeId ?? 1,\n\t\t\t);\n\n\t\t\t// Verify the change after a short delay, unless the command was supervised and successful\n\t\t\tif (this.isSinglecast() && !supervisedCommandSucceeded(result)) {\n\t\t\t\tthis.schedulePoll({ property }, value, { transition: \"fast\" });\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: WakeUpCCAPI, { property }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"wakeUpInterval\":\n\t\t\t\t\treturn (await this.getInterval())?.[property];\n\t\t\t\tdefault:\n\t\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t};\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getInterval() {\n\t\tthis.assertSupportsCommand(WakeUpCommand, WakeUpCommand.IntervalGet);\n\n\t\tconst cc = new WakeUpCCIntervalGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tWakeUpCCIntervalReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"wakeUpInterval\", \"controllerNodeId\"]);\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async getIntervalCapabilities() {\n\t\tthis.assertSupportsCommand(\n\t\t\tWakeUpCommand,\n\t\t\tWakeUpCommand.IntervalCapabilitiesGet,\n\t\t);\n\n\t\tconst cc = new WakeUpCCIntervalCapabilitiesGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tWakeUpCCIntervalCapabilitiesReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\n\t\t\t\t\"defaultWakeUpInterval\",\n\t\t\t\t\"minWakeUpInterval\",\n\t\t\t\t\"maxWakeUpInterval\",\n\t\t\t\t\"wakeUpIntervalSteps\",\n\t\t\t\t\"wakeUpOnDemandSupported\",\n\t\t\t]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async setInterval(\n\t\twakeUpInterval: number,\n\t\tcontrollerNodeId: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(WakeUpCommand, WakeUpCommand.IntervalSet);\n\n\t\tconst cc = new WakeUpCCIntervalSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\twakeUpInterval,\n\t\t\tcontrollerNodeId,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async sendNoMoreInformation(): Promise<void> {\n\t\tthis.assertSupportsCommand(\n\t\t\tWakeUpCommand,\n\t\t\tWakeUpCommand.NoMoreInformation,\n\t\t);\n\n\t\tconst cc = new WakeUpCCNoMoreInformation({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tawait this.host.sendCommand(cc, {\n\t\t\t...this.commandOptions,\n\t\t\t// This command must be sent as part of the wake up queue\n\t\t\tpriority: MessagePriority.WakeUp,\n\t\t\t// Don't try to resend this - if we get no response, the node is most likely asleep\n\t\t\tmaxSendAttempts: 1,\n\t\t\t// Also we don't want to wait for an ACK because this can lock up the network for seconds\n\t\t\t// if the target node is asleep and doesn't respond to the command\n\t\t\ttransmitOptions: TransmitOptions.DEFAULT_NOACK,\n\t\t});\n\t}\n}\n\n@commandClass(CommandClasses[\"Wake Up\"])\n@implementedVersion(3)\n@ccValues(WakeUpCCValues)\nexport class WakeUpCC extends CommandClass {\n\tdeclare ccCommand: WakeUpCommand;\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[\"Wake Up\"],\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 (node.id === ctx.ownNodeId) {\n\t\t\tctx.logNode(\n\t\t\t\tnode.id,\n\t\t\t\t`skipping wakeup configuration for the controller`,\n\t\t\t);\n\t\t} else if (node.isFrequentListening) {\n\t\t\tctx.logNode(\n\t\t\t\tnode.id,\n\t\t\t\t`skipping wakeup configuration for frequent listening device`,\n\t\t\t);\n\t\t} else {\n\t\t\tlet desiredInterval: number;\n\t\t\tlet currentControllerNodeId: number;\n\t\t\tlet minInterval: number | undefined;\n\t\t\tlet maxInterval: number | undefined;\n\n\t\t\t// Retrieve the allowed wake up intervals and wake on demand support if possible\n\t\t\tif (api.version >= 2) {\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"retrieving wakeup capabilities from the device...\",\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tconst wakeupCaps = await api.getIntervalCapabilities();\n\t\t\t\tif (wakeupCaps) {\n\t\t\t\t\tconst logMessage = `received wakeup capabilities:\ndefault wakeup interval: ${wakeupCaps.defaultWakeUpInterval} seconds\nminimum wakeup interval: ${wakeupCaps.minWakeUpInterval} seconds\nmaximum wakeup interval: ${wakeupCaps.maxWakeUpInterval} seconds\nwakeup interval steps: ${wakeupCaps.wakeUpIntervalSteps} seconds\nwakeup on demand supported: ${wakeupCaps.wakeUpOnDemandSupported}`;\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: logMessage,\n\t\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t\t});\n\t\t\t\t\tminInterval = wakeupCaps.minWakeUpInterval;\n\t\t\t\t\tmaxInterval = wakeupCaps.maxWakeUpInterval;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// SDS14223 prescribes a IntervalSet followed by a check\n\t\t\t// We have no intention of changing the interval (maybe some time in the future)\n\t\t\t// So for now get the current interval and just set the controller ID\n\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"retrieving wakeup interval from the device...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst wakeupResp = await api.getInterval();\n\n\t\t\tif (wakeupResp) {\n\t\t\t\tconst logMessage = `received wakeup configuration:\nwakeup interval: ${wakeupResp.wakeUpInterval} seconds\ncontroller node: ${wakeupResp.controllerNodeId}`;\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: logMessage,\n\t\t\t\t\tdirection: \"inbound\",\n\t\t\t\t});\n\n\t\t\t\tdesiredInterval = wakeupResp.wakeUpInterval;\n\t\t\t\tcurrentControllerNodeId = wakeupResp.controllerNodeId;\n\t\t\t} else {\n\t\t\t\t// Just guess, I guess\n\t\t\t\tdesiredInterval = 3600 * 6; // 6 hours\n\t\t\t\tcurrentControllerNodeId = 0; // assume not set\n\t\t\t}\n\n\t\t\tconst ownNodeId = ctx.ownNodeId;\n\t\t\t// Only change the destination if necessary\n\t\t\tif (currentControllerNodeId !== ownNodeId) {\n\t\t\t\t// Spec compliance: Limit the interval to the allowed range, but...\n\t\t\t\t// ...try and preserve a \"never wake up\" configuration (#6367)\n\t\t\t\tif (\n\t\t\t\t\tdesiredInterval !== 0\n\t\t\t\t\t&& minInterval != undefined\n\t\t\t\t\t&& maxInterval != undefined\n\t\t\t\t) {\n\t\t\t\t\tdesiredInterval = clamp(\n\t\t\t\t\t\tdesiredInterval,\n\t\t\t\t\t\tminInterval,\n\t\t\t\t\t\tmaxInterval,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tctx.logNode(node.id, {\n\t\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\t\tmessage: \"configuring wakeup destination node\",\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tawait api.setInterval(desiredInterval, ownNodeId);\n\t\t\t\tthis.setValue(\n\t\t\t\t\tctx,\n\t\t\t\t\tWakeUpCCValues.controllerNodeId,\n\t\t\t\t\townNodeId,\n\t\t\t\t);\n\t\t\t\tctx.logNode(\n\t\t\t\t\tnode.id,\n\t\t\t\t\t\"wakeup destination node changed!\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n}\n\n// @publicAPI\nexport interface WakeUpCCIntervalSetOptions {\n\twakeUpInterval: number;\n\tcontrollerNodeId: number;\n}\n\n@CCCommand(WakeUpCommand.IntervalSet)\n@useSupervision()\nexport class WakeUpCCIntervalSet extends WakeUpCC {\n\tpublic constructor(\n\t\toptions: WithAddress<WakeUpCCIntervalSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.wakeUpInterval = options.wakeUpInterval;\n\t\tthis.controllerNodeId = options.controllerNodeId;\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): WakeUpCCIntervalSet {\n\t\tvalidatePayload(raw.payload.length >= 4);\n\t\tconst wakeUpInterval = raw.payload.readUIntBE(0, 3);\n\t\tconst controllerNodeId = raw.payload[3];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\twakeUpInterval,\n\t\t\tcontrollerNodeId,\n\t\t});\n\t}\n\n\tpublic wakeUpInterval: number;\n\tpublic controllerNodeId: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tthis.payload = Bytes.from([\n\t\t\t0,\n\t\t\t0,\n\t\t\t0, // placeholder\n\t\t\tthis.controllerNodeId,\n\t\t]);\n\t\tthis.payload.writeUIntBE(this.wakeUpInterval, 0, 3);\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\"wake-up interval\": `${this.wakeUpInterval} seconds`,\n\t\t\t\t\"controller node id\": this.controllerNodeId,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface WakeUpCCIntervalReportOptions {\n\twakeUpInterval: number;\n\tcontrollerNodeId: number;\n}\n\n@CCCommand(WakeUpCommand.IntervalReport)\n@ccValueProperty(\"wakeUpInterval\", WakeUpCCValues.wakeUpInterval)\n@ccValueProperty(\"controllerNodeId\", WakeUpCCValues.controllerNodeId)\nexport class WakeUpCCIntervalReport extends WakeUpCC {\n\tpublic constructor(\n\t\toptions: WithAddress<WakeUpCCIntervalReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\t// TODO: Check implementation:\n\t\tthis.wakeUpInterval = options.wakeUpInterval;\n\t\tthis.controllerNodeId = options.controllerNodeId;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): WakeUpCCIntervalReport {\n\t\tvalidatePayload(raw.payload.length >= 4);\n\t\tconst wakeUpInterval = raw.payload.readUIntBE(0, 3);\n\t\tconst controllerNodeId = raw.payload[3];\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\twakeUpInterval,\n\t\t\tcontrollerNodeId,\n\t\t});\n\t}\n\n\tpublic readonly wakeUpInterval: number;\n\n\tpublic readonly controllerNodeId: number;\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\"wake-up interval\": `${this.wakeUpInterval} seconds`,\n\t\t\t\t\"controller node id\": this.controllerNodeId,\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(WakeUpCommand.IntervalGet)\n@expectedCCResponse(WakeUpCCIntervalReport)\nexport class WakeUpCCIntervalGet extends WakeUpCC {}\n\n@CCCommand(WakeUpCommand.WakeUpNotification)\nexport class WakeUpCCWakeUpNotification extends WakeUpCC {}\n\n@CCCommand(WakeUpCommand.NoMoreInformation)\nexport class WakeUpCCNoMoreInformation extends WakeUpCC {}\n\n// @publicAPI\nexport interface WakeUpCCIntervalCapabilitiesReportOptions {\n\tminWakeUpInterval: number;\n\tmaxWakeUpInterval: number;\n\tdefaultWakeUpInterval: number;\n\twakeUpIntervalSteps: number;\n\twakeUpOnDemandSupported: boolean;\n}\n\n@CCCommand(WakeUpCommand.IntervalCapabilitiesReport)\n@ccValueProperty(\n\t\"wakeUpOnDemandSupported\",\n\tWakeUpCCValues.wakeUpOnDemandSupported,\n)\nexport class WakeUpCCIntervalCapabilitiesReport extends WakeUpCC {\n\tpublic constructor(\n\t\toptions: WithAddress<WakeUpCCIntervalCapabilitiesReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\t// TODO: Check implementation:\n\t\tthis.minWakeUpInterval = options.minWakeUpInterval;\n\t\tthis.maxWakeUpInterval = options.maxWakeUpInterval;\n\t\tthis.defaultWakeUpInterval = options.defaultWakeUpInterval;\n\t\tthis.wakeUpIntervalSteps = options.wakeUpIntervalSteps;\n\t\tthis.wakeUpOnDemandSupported = options.wakeUpOnDemandSupported;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): WakeUpCCIntervalCapabilitiesReport {\n\t\tvalidatePayload(raw.payload.length >= 12);\n\t\tconst minWakeUpInterval = raw.payload.readUIntBE(0, 3);\n\t\tconst maxWakeUpInterval = raw.payload.readUIntBE(3, 3);\n\t\tconst defaultWakeUpInterval = raw.payload.readUIntBE(6, 3);\n\t\tconst wakeUpIntervalSteps = raw.payload.readUIntBE(9, 3);\n\t\tlet wakeUpOnDemandSupported = false;\n\t\tif (raw.payload.length >= 13) {\n\t\t\t// V3+\n\t\t\twakeUpOnDemandSupported = !!(raw.payload[12] & 0b1);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tminWakeUpInterval,\n\t\t\tmaxWakeUpInterval,\n\t\t\tdefaultWakeUpInterval,\n\t\t\twakeUpIntervalSteps,\n\t\t\twakeUpOnDemandSupported,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\t// Store the received information as metadata for the wake up interval\n\t\tvalueDB.setMetadata(\n\t\t\t{\n\t\t\t\tcommandClass: this.ccId,\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tproperty: \"wakeUpInterval\",\n\t\t\t},\n\t\t\t{\n\t\t\t\t...ValueMetadata.WriteOnlyUInt24,\n\t\t\t\tmin: this.minWakeUpInterval,\n\t\t\t\tmax: this.maxWakeUpInterval,\n\t\t\t\tsteps: this.wakeUpIntervalSteps,\n\t\t\t\tdefault: this.defaultWakeUpInterval,\n\t\t\t},\n\t\t);\n\n\t\t// Store wakeUpOnDemandSupported in valueDB\n\n\t\treturn true;\n\t}\n\n\tpublic readonly minWakeUpInterval: number;\n\tpublic readonly maxWakeUpInterval: number;\n\tpublic readonly defaultWakeUpInterval: number;\n\tpublic readonly wakeUpIntervalSteps: number;\n\n\tpublic readonly wakeUpOnDemandSupported: boolean;\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\"default interval\": `${this.defaultWakeUpInterval} seconds`,\n\t\t\t\t\"minimum interval\": `${this.minWakeUpInterval} seconds`,\n\t\t\t\t\"maximum interval\": `${this.maxWakeUpInterval} seconds`,\n\t\t\t\t\"interval steps\": `${this.wakeUpIntervalSteps} seconds`,\n\t\t\t\t\"wake up on demand supported\":\n\t\t\t\t\t`${this.wakeUpOnDemandSupported}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(WakeUpCommand.IntervalCapabilitiesGet)\n@expectedCCResponse(WakeUpCCIntervalCapabilitiesReport)\nexport class WakeUpCCIntervalCapabilitiesGet extends WakeUpCC {}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["import_safe"]
7
7
  }
@@ -35,7 +35,7 @@ __export(FibaroCC_exports, {
35
35
  module.exports = __toCommonJS(FibaroCC_exports);
36
36
  var import_safe = require("@zwave-js/core/safe");
37
37
  var import_shared = require("@zwave-js/shared");
38
- var import_typeguards = require("alcalzone-shared/typeguards/index.js");
38
+ var import_typeguards = require("alcalzone-shared/typeguards");
39
39
  var import_API = require("../../lib/API.js");
40
40
  var import_CommandClassDecorators = require("../../lib/CommandClassDecorators.js");
41
41
  var import_ManufacturerProprietaryCC = require("../ManufacturerProprietaryCC.js");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cc/manufacturerProprietary/FibaroCC.ts"],
4
- "sourcesContent": ["import {\n\tCommandClasses,\n\ttype MaybeUnknown,\n\ttype MessageOrCCLogEntry,\n\ttype MessageRecord,\n\ttype ValueID,\n\tValueMetadata,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tparseMaybeNumber,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetDeviceConfig,\n\tGetValueDB,\n} from \"@zwave-js/host/safe\";\nimport { Bytes, pick } from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { isArray } from \"alcalzone-shared/typeguards/index.js\";\nimport {\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowMissingPropertyKey,\n\tthrowUnsupportedProperty,\n\tthrowUnsupportedPropertyKey,\n\tthrowWrongValueType,\n} from \"../../lib/API.js\";\nimport {\n\ttype CCRaw,\n\ttype CommandClassOptions,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n} from \"../../lib/CommandClass.js\";\nimport { expectedCCResponse } from \"../../lib/CommandClassDecorators.js\";\nimport {\n\tManufacturerProprietaryCC,\n\tManufacturerProprietaryCCAPI,\n} from \"../ManufacturerProprietaryCC.js\";\nimport {\n\tfibaroCC,\n\tfibaroCCCommand,\n\tgetFibaroCCCommand,\n\tgetFibaroCCCommandConstructor,\n\tgetFibaroCCConstructor,\n\tgetFibaroCCId,\n\tmanufacturerId,\n\tmanufacturerProprietaryAPI,\n} from \"./Decorators.js\";\n\nexport const MANUFACTURERID_FIBARO = 0x10f;\n\n/** Returns the ValueID used to store the current venetian blind position */\nexport function getFibaroVenetianBlindPositionValueId(\n\tendpoint: number,\n): ValueID {\n\treturn {\n\t\tcommandClass: CommandClasses[\"Manufacturer Proprietary\"],\n\t\tendpoint,\n\t\tproperty: \"fibaro\",\n\t\tpropertyKey: \"venetianBlindsPosition\",\n\t};\n}\n\n/** Returns the value metadata for venetian blind position */\nexport function getFibaroVenetianBlindPositionMetadata(): ValueMetadata {\n\treturn {\n\t\t...ValueMetadata.Level,\n\t\tlabel: \"Venetian blinds position\",\n\t};\n}\n\n/** Returns the ValueID used to store the current venetian blind tilt */\nexport function getFibaroVenetianBlindTiltValueId(endpoint: number): ValueID {\n\treturn {\n\t\tcommandClass: CommandClasses[\"Manufacturer Proprietary\"],\n\t\tendpoint,\n\t\tproperty: \"fibaro\",\n\t\tpropertyKey: \"venetianBlindsTilt\",\n\t};\n}\n\n/** Returns the value metadata for venetian blind tilt */\nexport function getFibaroVenetianBlindTiltMetadata(): ValueMetadata {\n\treturn {\n\t\t...ValueMetadata.Level,\n\t\tlabel: \"Venetian blinds tilt\",\n\t};\n}\n\nfunction getSupportedFibaroCCIDs(\n\tctx: GetDeviceConfig,\n\tnodeId: number,\n): FibaroCCIDs[] {\n\tconst proprietaryConfig = ctx.getDeviceConfig?.(\n\t\tnodeId,\n\t)?.proprietary;\n\tif (proprietaryConfig && isArray(proprietaryConfig.fibaroCCs)) {\n\t\treturn proprietaryConfig.fibaroCCs as FibaroCCIDs[];\n\t}\n\n\treturn [];\n}\n\nexport enum FibaroCCIDs {\n\tVenetianBlind = 0x26,\n}\n\n@manufacturerProprietaryAPI(MANUFACTURERID_FIBARO)\nexport class FibaroCCAPI extends ManufacturerProprietaryCCAPI {\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async fibaroVenetianBlindsGet() {\n\t\tconst cc = new FibaroVenetianBlindCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tFibaroVenetianBlindCCReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"position\", \"tilt\"]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async fibaroVenetianBlindsSetPosition(value: number): Promise<void> {\n\t\tconst cc = new FibaroVenetianBlindCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tposition: value,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async fibaroVenetianBlindsSetTilt(value: number): Promise<void> {\n\t\tconst cc = new FibaroVenetianBlindCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\ttilt: value,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: FibaroCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t\tvalue,\n\t\t) {\n\t\t\tif (property !== \"fibaro\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\n\t\t\tif (propertyKey === \"venetianBlindsPosition\") {\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\tawait this.fibaroVenetianBlindsSetPosition(value);\n\t\t\t} else if (propertyKey === \"venetianBlindsTilt\") {\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\tawait this.fibaroVenetianBlindsSetTilt(value);\n\t\t\t} else {\n\t\t\t\t// unsupported property key, ignore...\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Verify the current value after a delay\n\t\t\tthis.schedulePoll({ property, propertyKey }, value);\n\n\t\t\treturn undefined;\n\t\t};\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: FibaroCCAPI, { property, propertyKey }) {\n\t\t\tif (property !== \"fibaro\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t} else if (propertyKey == undefined) {\n\t\t\t\tthrowMissingPropertyKey(this.ccId, property);\n\t\t\t}\n\n\t\t\tswitch (propertyKey) {\n\t\t\t\tcase \"venetianBlindsPosition\":\n\t\t\t\t\treturn (await this.fibaroVenetianBlindsGet())?.position;\n\t\t\t\tcase \"venetianBlindsTilt\":\n\t\t\t\t\treturn (await this.fibaroVenetianBlindsGet())?.tilt;\n\t\t\t\tdefault:\n\t\t\t\t\tthrowUnsupportedPropertyKey(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\tpropertyKey,\n\t\t\t\t\t);\n\t\t\t}\n\t\t};\n\t}\n}\n\n@manufacturerId(MANUFACTURERID_FIBARO)\nexport class FibaroCC extends ManufacturerProprietaryCC {\n\tpublic constructor(\n\t\toptions: CommandClassOptions,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.fibaroCCId = getFibaroCCId(this);\n\t\tthis.fibaroCCCommand = getFibaroCCCommand(this);\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): FibaroCC {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst fibaroCCId = raw.payload[0];\n\t\tconst fibaroCCCommand = raw.payload[1];\n\n\t\tconst FibaroConstructor = getFibaroCCCommandConstructor(\n\t\t\tfibaroCCId,\n\t\t\tfibaroCCCommand,\n\t\t);\n\t\tif (FibaroConstructor) {\n\t\t\treturn FibaroConstructor.from(\n\t\t\t\traw.withPayload(raw.payload.subarray(2)),\n\t\t\t\tctx,\n\t\t\t);\n\t\t}\n\n\t\treturn new FibaroCC({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t});\n\t}\n\n\tpublic fibaroCCId?: number;\n\tpublic fibaroCCCommand?: number;\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\t// Iterate through all supported Fibaro CCs and interview them\n\t\tconst supportedFibaroCCIDs = getSupportedFibaroCCIDs(ctx, node.id);\n\t\tfor (const ccId of supportedFibaroCCIDs) {\n\t\t\tconst SubConstructor = getFibaroCCConstructor(ccId);\n\t\t\tif (SubConstructor) {\n\t\t\t\tconst instance = new SubConstructor({ nodeId: node.id });\n\t\t\t\tawait instance.interview(ctx);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\t// Iterate through all supported Fibaro CCs and let them refresh their values\n\t\tconst supportedFibaroCCIDs = getSupportedFibaroCCIDs(ctx, node.id);\n\t\tfor (const ccId of supportedFibaroCCIDs) {\n\t\t\tconst SubConstructor = getFibaroCCConstructor(ccId);\n\t\t\tif (SubConstructor) {\n\t\t\t\tconst instance = new SubConstructor({ nodeId: node.id });\n\t\t\t\tawait instance.refreshValues(ctx);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tif (this.fibaroCCId == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot serialize a Fibaro CC without a Fibaro CC ID\",\n\t\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t\t);\n\t\t} else if (this.fibaroCCCommand == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot serialize a Fibaro CC without a Fibaro CC Command\",\n\t\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t\t);\n\t\t}\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.fibaroCCId, this.fibaroCCCommand]),\n\t\t\tthis.payload,\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n}\n\nexport enum FibaroVenetianBlindCCCommand {\n\tSet = 0x01,\n\tGet = 0x02,\n\tReport = 0x03,\n}\n\n@fibaroCC(FibaroCCIDs.VenetianBlind)\nexport class FibaroVenetianBlindCC extends FibaroCC {\n\tdeclare fibaroCCId: FibaroCCIDs.VenetianBlind;\n\tdeclare fibaroCCCommand: FibaroVenetianBlindCCCommand;\n\n\tpublic constructor(\n\t\toptions: CommandClassOptions,\n\t) {\n\t\tsuper(options);\n\t\tthis.fibaroCCId = FibaroCCIDs.VenetianBlind;\n\t}\n\n\tpublic async interview(ctx: InterviewContext): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing Fibaro Venetian Blind CC...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\t// Nothing special, just get the values\n\t\tawait this.refreshValues(ctx);\n\t}\n\n\tpublic async refreshValues(ctx: RefreshValuesContext): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\tctx.logNode(node.id, {\n\t\t\tmessage: \"Requesting venetian blind position and tilt...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst resp = await ctx.sendCommand<FibaroVenetianBlindCCReport>(\n\t\t\tnew FibaroVenetianBlindCCGet({\n\t\t\t\tnodeId: this.nodeId,\n\t\t\t\tendpointIndex: this.endpointIndex,\n\t\t\t}),\n\t\t);\n\t\tif (resp) {\n\t\t\tconst logMessage = `received venetian blind state:\nposition: ${resp.position}\ntilt: ${resp.tilt}`;\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tmessage: logMessage,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport type FibaroVenetianBlindCCSetOptions =\n\t| {\n\t\tposition: number;\n\t}\n\t| {\n\t\ttilt: number;\n\t}\n\t| {\n\t\tposition: number;\n\t\ttilt: number;\n\t};\n\n@fibaroCCCommand(FibaroVenetianBlindCCCommand.Set)\nexport class FibaroVenetianBlindCCSet extends FibaroVenetianBlindCC {\n\tpublic constructor(\n\t\toptions: WithAddress<FibaroVenetianBlindCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.fibaroCCCommand = FibaroVenetianBlindCCCommand.Set;\n\n\t\tif (\"position\" in options) this.position = options.position;\n\t\tif (\"tilt\" in options) this.tilt = options.tilt;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): FibaroVenetianBlindCCSet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\t}\n\n\tpublic position: number | undefined;\n\tpublic tilt: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tconst controlByte = (this.position != undefined ? 0b10 : 0)\n\t\t\t| (this.tilt != undefined ? 0b01 : 0);\n\t\tthis.payload = Bytes.from([\n\t\t\tcontrolByte,\n\t\t\tthis.position ?? 0,\n\t\t\tthis.tilt ?? 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.position != undefined) {\n\t\t\tmessage.position = this.position;\n\t\t}\n\t\tif (this.tilt != undefined) {\n\t\t\tmessage.tilt = this.tilt;\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 FibaroVenetianBlindCCReportOptions {\n\tposition?: MaybeUnknown<number>;\n\ttilt?: MaybeUnknown<number>;\n}\n\n@fibaroCCCommand(FibaroVenetianBlindCCCommand.Report)\nexport class FibaroVenetianBlindCCReport extends FibaroVenetianBlindCC {\n\tpublic constructor(\n\t\toptions: WithAddress<FibaroVenetianBlindCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.fibaroCCCommand = FibaroVenetianBlindCCCommand.Report;\n\n\t\t// TODO: Check implementation:\n\t\tthis.position = options.position;\n\t\tthis.tilt = options.tilt;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): FibaroVenetianBlindCCReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\t// When the node sends a report, payload[0] === 0b11. This is probably a\n\t\t// bit mask for position and tilt\n\t\tlet position: MaybeUnknown<number> | undefined;\n\t\tif (!!(raw.payload[0] & 0b10)) {\n\t\t\tposition = parseMaybeNumber(raw.payload[1]);\n\t\t}\n\n\t\tlet tilt: MaybeUnknown<number> | undefined;\n\t\tif (!!(raw.payload[0] & 0b01)) {\n\t\t\ttilt = parseMaybeNumber(raw.payload[2]);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tposition,\n\t\t\ttilt,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\tif (this.position != undefined) {\n\t\t\tconst positionValueId = getFibaroVenetianBlindPositionValueId(\n\t\t\t\tthis.endpointIndex,\n\t\t\t);\n\t\t\tvalueDB.setMetadata(positionValueId, {\n\t\t\t\t...ValueMetadata.Level,\n\t\t\t\tlabel: \"Venetian blinds position\",\n\t\t\t});\n\t\t\tvalueDB.setValue(positionValueId, this.position);\n\t\t}\n\t\tif (this.tilt != undefined) {\n\t\t\tconst tiltValueId = getFibaroVenetianBlindTiltValueId(\n\t\t\t\tthis.endpointIndex,\n\t\t\t);\n\t\t\tvalueDB.setMetadata(tiltValueId, {\n\t\t\t\t...ValueMetadata.Level,\n\t\t\t\tlabel: \"Venetian blinds tilt\",\n\t\t\t});\n\t\t\tvalueDB.setValue(tiltValueId, this.tilt);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic position: MaybeUnknown<number> | undefined;\n\tpublic tilt: MaybeUnknown<number> | undefined;\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {};\n\t\tif (this.position != undefined) {\n\t\t\tmessage.position = this.position;\n\t\t}\n\t\tif (this.tilt != undefined) {\n\t\t\tmessage.tilt = this.tilt;\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@fibaroCCCommand(FibaroVenetianBlindCCCommand.Get)\n@expectedCCResponse(FibaroVenetianBlindCCReport)\nexport class FibaroVenetianBlindCCGet extends FibaroVenetianBlindCC {\n\tpublic constructor(\n\t\toptions: CommandClassOptions,\n\t) {\n\t\tsuper(options);\n\t\tthis.fibaroCCCommand = FibaroVenetianBlindCCCommand.Get;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): FibaroVenetianBlindCCGet {\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t});\n\t}\n}\n"],
4
+ "sourcesContent": ["import {\n\tCommandClasses,\n\ttype MaybeUnknown,\n\ttype MessageOrCCLogEntry,\n\ttype MessageRecord,\n\ttype ValueID,\n\tValueMetadata,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tparseMaybeNumber,\n\tvalidatePayload,\n} from \"@zwave-js/core/safe\";\nimport type {\n\tCCEncodingContext,\n\tCCParsingContext,\n\tGetDeviceConfig,\n\tGetValueDB,\n} from \"@zwave-js/host/safe\";\nimport { Bytes, pick } from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport { isArray } from \"alcalzone-shared/typeguards\";\nimport {\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowMissingPropertyKey,\n\tthrowUnsupportedProperty,\n\tthrowUnsupportedPropertyKey,\n\tthrowWrongValueType,\n} from \"../../lib/API.js\";\nimport {\n\ttype CCRaw,\n\ttype CommandClassOptions,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n} from \"../../lib/CommandClass.js\";\nimport { expectedCCResponse } from \"../../lib/CommandClassDecorators.js\";\nimport {\n\tManufacturerProprietaryCC,\n\tManufacturerProprietaryCCAPI,\n} from \"../ManufacturerProprietaryCC.js\";\nimport {\n\tfibaroCC,\n\tfibaroCCCommand,\n\tgetFibaroCCCommand,\n\tgetFibaroCCCommandConstructor,\n\tgetFibaroCCConstructor,\n\tgetFibaroCCId,\n\tmanufacturerId,\n\tmanufacturerProprietaryAPI,\n} from \"./Decorators.js\";\n\nexport const MANUFACTURERID_FIBARO = 0x10f;\n\n/** Returns the ValueID used to store the current venetian blind position */\nexport function getFibaroVenetianBlindPositionValueId(\n\tendpoint: number,\n): ValueID {\n\treturn {\n\t\tcommandClass: CommandClasses[\"Manufacturer Proprietary\"],\n\t\tendpoint,\n\t\tproperty: \"fibaro\",\n\t\tpropertyKey: \"venetianBlindsPosition\",\n\t};\n}\n\n/** Returns the value metadata for venetian blind position */\nexport function getFibaroVenetianBlindPositionMetadata(): ValueMetadata {\n\treturn {\n\t\t...ValueMetadata.Level,\n\t\tlabel: \"Venetian blinds position\",\n\t};\n}\n\n/** Returns the ValueID used to store the current venetian blind tilt */\nexport function getFibaroVenetianBlindTiltValueId(endpoint: number): ValueID {\n\treturn {\n\t\tcommandClass: CommandClasses[\"Manufacturer Proprietary\"],\n\t\tendpoint,\n\t\tproperty: \"fibaro\",\n\t\tpropertyKey: \"venetianBlindsTilt\",\n\t};\n}\n\n/** Returns the value metadata for venetian blind tilt */\nexport function getFibaroVenetianBlindTiltMetadata(): ValueMetadata {\n\treturn {\n\t\t...ValueMetadata.Level,\n\t\tlabel: \"Venetian blinds tilt\",\n\t};\n}\n\nfunction getSupportedFibaroCCIDs(\n\tctx: GetDeviceConfig,\n\tnodeId: number,\n): FibaroCCIDs[] {\n\tconst proprietaryConfig = ctx.getDeviceConfig?.(\n\t\tnodeId,\n\t)?.proprietary;\n\tif (proprietaryConfig && isArray(proprietaryConfig.fibaroCCs)) {\n\t\treturn proprietaryConfig.fibaroCCs as FibaroCCIDs[];\n\t}\n\n\treturn [];\n}\n\nexport enum FibaroCCIDs {\n\tVenetianBlind = 0x26,\n}\n\n@manufacturerProprietaryAPI(MANUFACTURERID_FIBARO)\nexport class FibaroCCAPI extends ManufacturerProprietaryCCAPI {\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic async fibaroVenetianBlindsGet() {\n\t\tconst cc = new FibaroVenetianBlindCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tFibaroVenetianBlindCCReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (response) {\n\t\t\treturn pick(response, [\"position\", \"tilt\"]);\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async fibaroVenetianBlindsSetPosition(value: number): Promise<void> {\n\t\tconst cc = new FibaroVenetianBlindCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tposition: value,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\tpublic async fibaroVenetianBlindsSetTilt(value: number): Promise<void> {\n\t\tconst cc = new FibaroVenetianBlindCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\ttilt: value,\n\t\t});\n\t\tawait this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: FibaroCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t\tvalue,\n\t\t) {\n\t\t\tif (property !== \"fibaro\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\n\t\t\tif (propertyKey === \"venetianBlindsPosition\") {\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\tawait this.fibaroVenetianBlindsSetPosition(value);\n\t\t\t} else if (propertyKey === \"venetianBlindsTilt\") {\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\tawait this.fibaroVenetianBlindsSetTilt(value);\n\t\t\t} else {\n\t\t\t\t// unsupported property key, ignore...\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Verify the current value after a delay\n\t\t\tthis.schedulePoll({ property, propertyKey }, value);\n\n\t\t\treturn undefined;\n\t\t};\n\t}\n\n\tprotected get [POLL_VALUE](): PollValueImplementation {\n\t\treturn async function(this: FibaroCCAPI, { property, propertyKey }) {\n\t\t\tif (property !== \"fibaro\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t} else if (propertyKey == undefined) {\n\t\t\t\tthrowMissingPropertyKey(this.ccId, property);\n\t\t\t}\n\n\t\t\tswitch (propertyKey) {\n\t\t\t\tcase \"venetianBlindsPosition\":\n\t\t\t\t\treturn (await this.fibaroVenetianBlindsGet())?.position;\n\t\t\t\tcase \"venetianBlindsTilt\":\n\t\t\t\t\treturn (await this.fibaroVenetianBlindsGet())?.tilt;\n\t\t\t\tdefault:\n\t\t\t\t\tthrowUnsupportedPropertyKey(\n\t\t\t\t\t\tthis.ccId,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\tpropertyKey,\n\t\t\t\t\t);\n\t\t\t}\n\t\t};\n\t}\n}\n\n@manufacturerId(MANUFACTURERID_FIBARO)\nexport class FibaroCC extends ManufacturerProprietaryCC {\n\tpublic constructor(\n\t\toptions: CommandClassOptions,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.fibaroCCId = getFibaroCCId(this);\n\t\tthis.fibaroCCCommand = getFibaroCCCommand(this);\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): FibaroCC {\n\t\tvalidatePayload(raw.payload.length >= 2);\n\t\tconst fibaroCCId = raw.payload[0];\n\t\tconst fibaroCCCommand = raw.payload[1];\n\n\t\tconst FibaroConstructor = getFibaroCCCommandConstructor(\n\t\t\tfibaroCCId,\n\t\t\tfibaroCCCommand,\n\t\t);\n\t\tif (FibaroConstructor) {\n\t\t\treturn FibaroConstructor.from(\n\t\t\t\traw.withPayload(raw.payload.subarray(2)),\n\t\t\t\tctx,\n\t\t\t);\n\t\t}\n\n\t\treturn new FibaroCC({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t});\n\t}\n\n\tpublic fibaroCCId?: number;\n\tpublic fibaroCCCommand?: number;\n\n\tpublic async interview(\n\t\tctx: InterviewContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\t// Iterate through all supported Fibaro CCs and interview them\n\t\tconst supportedFibaroCCIDs = getSupportedFibaroCCIDs(ctx, node.id);\n\t\tfor (const ccId of supportedFibaroCCIDs) {\n\t\t\tconst SubConstructor = getFibaroCCConstructor(ccId);\n\t\t\tif (SubConstructor) {\n\t\t\t\tconst instance = new SubConstructor({ nodeId: node.id });\n\t\t\t\tawait instance.interview(ctx);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\t// Iterate through all supported Fibaro CCs and let them refresh their values\n\t\tconst supportedFibaroCCIDs = getSupportedFibaroCCIDs(ctx, node.id);\n\t\tfor (const ccId of supportedFibaroCCIDs) {\n\t\t\tconst SubConstructor = getFibaroCCConstructor(ccId);\n\t\t\tif (SubConstructor) {\n\t\t\t\tconst instance = new SubConstructor({ nodeId: node.id });\n\t\t\t\tawait instance.refreshValues(ctx);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tif (this.fibaroCCId == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot serialize a Fibaro CC without a Fibaro CC ID\",\n\t\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t\t);\n\t\t} else if (this.fibaroCCCommand == undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot serialize a Fibaro CC without a Fibaro CC Command\",\n\t\t\t\tZWaveErrorCodes.CC_Invalid,\n\t\t\t);\n\t\t}\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.fibaroCCId, this.fibaroCCCommand]),\n\t\t\tthis.payload,\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n}\n\nexport enum FibaroVenetianBlindCCCommand {\n\tSet = 0x01,\n\tGet = 0x02,\n\tReport = 0x03,\n}\n\n@fibaroCC(FibaroCCIDs.VenetianBlind)\nexport class FibaroVenetianBlindCC extends FibaroCC {\n\tdeclare fibaroCCId: FibaroCCIDs.VenetianBlind;\n\tdeclare fibaroCCCommand: FibaroVenetianBlindCCCommand;\n\n\tpublic constructor(\n\t\toptions: CommandClassOptions,\n\t) {\n\t\tsuper(options);\n\t\tthis.fibaroCCId = FibaroCCIDs.VenetianBlind;\n\t}\n\n\tpublic async interview(ctx: InterviewContext): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing Fibaro Venetian Blind CC...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\t// Nothing special, just get the values\n\t\tawait this.refreshValues(ctx);\n\t}\n\n\tpublic async refreshValues(ctx: RefreshValuesContext): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\n\t\tctx.logNode(node.id, {\n\t\t\tmessage: \"Requesting venetian blind position and tilt...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst resp = await ctx.sendCommand<FibaroVenetianBlindCCReport>(\n\t\t\tnew FibaroVenetianBlindCCGet({\n\t\t\t\tnodeId: this.nodeId,\n\t\t\t\tendpointIndex: this.endpointIndex,\n\t\t\t}),\n\t\t);\n\t\tif (resp) {\n\t\t\tconst logMessage = `received venetian blind state:\nposition: ${resp.position}\ntilt: ${resp.tilt}`;\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tmessage: logMessage,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport type FibaroVenetianBlindCCSetOptions =\n\t| {\n\t\tposition: number;\n\t}\n\t| {\n\t\ttilt: number;\n\t}\n\t| {\n\t\tposition: number;\n\t\ttilt: number;\n\t};\n\n@fibaroCCCommand(FibaroVenetianBlindCCCommand.Set)\nexport class FibaroVenetianBlindCCSet extends FibaroVenetianBlindCC {\n\tpublic constructor(\n\t\toptions: WithAddress<FibaroVenetianBlindCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.fibaroCCCommand = FibaroVenetianBlindCCCommand.Set;\n\n\t\tif (\"position\" in options) this.position = options.position;\n\t\tif (\"tilt\" in options) this.tilt = options.tilt;\n\t}\n\n\tpublic static from(\n\t\t_raw: CCRaw,\n\t\t_ctx: CCParsingContext,\n\t): FibaroVenetianBlindCCSet {\n\t\t// TODO: Deserialize payload\n\t\tthrow new ZWaveError(\n\t\t\t`${this.name}: deserialization not implemented`,\n\t\t\tZWaveErrorCodes.Deserialization_NotImplemented,\n\t\t);\n\t}\n\n\tpublic position: number | undefined;\n\tpublic tilt: number | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Bytes {\n\t\tconst controlByte = (this.position != undefined ? 0b10 : 0)\n\t\t\t| (this.tilt != undefined ? 0b01 : 0);\n\t\tthis.payload = Bytes.from([\n\t\t\tcontrolByte,\n\t\t\tthis.position ?? 0,\n\t\t\tthis.tilt ?? 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.position != undefined) {\n\t\t\tmessage.position = this.position;\n\t\t}\n\t\tif (this.tilt != undefined) {\n\t\t\tmessage.tilt = this.tilt;\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 FibaroVenetianBlindCCReportOptions {\n\tposition?: MaybeUnknown<number>;\n\ttilt?: MaybeUnknown<number>;\n}\n\n@fibaroCCCommand(FibaroVenetianBlindCCCommand.Report)\nexport class FibaroVenetianBlindCCReport extends FibaroVenetianBlindCC {\n\tpublic constructor(\n\t\toptions: WithAddress<FibaroVenetianBlindCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.fibaroCCCommand = FibaroVenetianBlindCCCommand.Report;\n\n\t\t// TODO: Check implementation:\n\t\tthis.position = options.position;\n\t\tthis.tilt = options.tilt;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): FibaroVenetianBlindCCReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\t// When the node sends a report, payload[0] === 0b11. This is probably a\n\t\t// bit mask for position and tilt\n\t\tlet position: MaybeUnknown<number> | undefined;\n\t\tif (!!(raw.payload[0] & 0b10)) {\n\t\t\tposition = parseMaybeNumber(raw.payload[1]);\n\t\t}\n\n\t\tlet tilt: MaybeUnknown<number> | undefined;\n\t\tif (!!(raw.payload[0] & 0b01)) {\n\t\t\ttilt = parseMaybeNumber(raw.payload[2]);\n\t\t}\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tposition,\n\t\t\ttilt,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\t\tconst valueDB = this.getValueDB(ctx);\n\n\t\tif (this.position != undefined) {\n\t\t\tconst positionValueId = getFibaroVenetianBlindPositionValueId(\n\t\t\t\tthis.endpointIndex,\n\t\t\t);\n\t\t\tvalueDB.setMetadata(positionValueId, {\n\t\t\t\t...ValueMetadata.Level,\n\t\t\t\tlabel: \"Venetian blinds position\",\n\t\t\t});\n\t\t\tvalueDB.setValue(positionValueId, this.position);\n\t\t}\n\t\tif (this.tilt != undefined) {\n\t\t\tconst tiltValueId = getFibaroVenetianBlindTiltValueId(\n\t\t\t\tthis.endpointIndex,\n\t\t\t);\n\t\t\tvalueDB.setMetadata(tiltValueId, {\n\t\t\t\t...ValueMetadata.Level,\n\t\t\t\tlabel: \"Venetian blinds tilt\",\n\t\t\t});\n\t\t\tvalueDB.setValue(tiltValueId, this.tilt);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic position: MaybeUnknown<number> | undefined;\n\tpublic tilt: MaybeUnknown<number> | undefined;\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst message: MessageRecord = {};\n\t\tif (this.position != undefined) {\n\t\t\tmessage.position = this.position;\n\t\t}\n\t\tif (this.tilt != undefined) {\n\t\t\tmessage.tilt = this.tilt;\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@fibaroCCCommand(FibaroVenetianBlindCCCommand.Get)\n@expectedCCResponse(FibaroVenetianBlindCCReport)\nexport class FibaroVenetianBlindCCGet extends FibaroVenetianBlindCC {\n\tpublic constructor(\n\t\toptions: CommandClassOptions,\n\t) {\n\t\tsuper(options);\n\t\tthis.fibaroCCCommand = FibaroVenetianBlindCCCommand.Get;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): FibaroVenetianBlindCCGet {\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t});\n\t}\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["FibaroCCIDs", "fibaroCCCommand", "FibaroCC", "FibaroVenetianBlindCCCommand"]
7
7
  }
@@ -0,0 +1,8 @@
1
+ export * from "./lib/Security2/shared.js";
2
+ export * from "./lib/SetValueResult.js";
3
+ export * from "./lib/SetValueResult.js";
4
+ export { defaultCCValueOptions } from "./lib/Values.js";
5
+ export type { CCValueOptions, CCValuePredicate, PartialCCValuePredicate, } from "./lib/Values.js";
6
+ export * from "./lib/_Types.js";
7
+ export * from "./lib/_Types.js";
8
+ //# sourceMappingURL=index_browser.d.ts.map
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var index_browser_exports = {};
21
+ __export(index_browser_exports, {
22
+ defaultCCValueOptions: () => import_Values.defaultCCValueOptions
23
+ });
24
+ module.exports = __toCommonJS(index_browser_exports);
25
+ __reExport(index_browser_exports, require("./lib/Security2/shared.js"), module.exports);
26
+ __reExport(index_browser_exports, require("./lib/SetValueResult.js"), module.exports);
27
+ __reExport(index_browser_exports, require("./lib/SetValueResult.js"), module.exports);
28
+ var import_Values = require("./lib/Values.js");
29
+ __reExport(index_browser_exports, require("./lib/_Types.js"), module.exports);
30
+ __reExport(index_browser_exports, require("./lib/_Types.js"), module.exports);
31
+ // Annotate the CommonJS export names for ESM import in node:
32
+ 0 && (module.exports = {
33
+ defaultCCValueOptions,
34
+ ...require("./lib/Security2/shared.js"),
35
+ ...require("./lib/SetValueResult.js"),
36
+ ...require("./lib/SetValueResult.js"),
37
+ ...require("./lib/_Types.js"),
38
+ ...require("./lib/_Types.js")
39
+ });
40
+ //# sourceMappingURL=index_browser.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index_browser.ts"],
4
+ "sourcesContent": ["/* @forbiddenImports external */\n\nexport * from \"./lib/Security2/shared.js\";\nexport * from \"./lib/SetValueResult.js\";\nexport * from \"./lib/SetValueResult.js\";\nexport { defaultCCValueOptions } from \"./lib/Values.js\";\nexport type {\n\tCCValueOptions,\n\tCCValuePredicate,\n\tPartialCCValuePredicate,\n} from \"./lib/Values.js\";\nexport * from \"./lib/_Types.js\";\nexport * from \"./lib/_Types.js\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;AAEA,kCAAc,sCAFd;AAGA,kCAAc,oCAHd;AAIA,kCAAc,oCAJd;AAKA,oBAAsC;AAMtC,kCAAc,4BAXd;AAYA,kCAAc,4BAZd;",
6
+ "names": []
7
+ }
@@ -32,7 +32,7 @@ __export(API_exports, {
32
32
  module.exports = __toCommonJS(API_exports);
33
33
  var import_core = require("@zwave-js/core");
34
34
  var import_shared = require("@zwave-js/shared");
35
- var import_typeguards = require("alcalzone-shared/typeguards/index.js");
35
+ var import_typeguards = require("alcalzone-shared/typeguards");
36
36
  var import_CommandClassDecorators = require("./CommandClassDecorators.js");
37
37
  const SET_VALUE = Symbol.for("CCAPI_SET_VALUE");
38
38
  const SET_VALUE_HOOKS = Symbol.for("CCAPI_SET_VALUE_HOOKS");