@zwave-js/cc 15.19.0 → 15.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/build/cjs/cc/AssociationGroupInfoCC.js +1 -1
  2. package/build/cjs/cc/AssociationGroupInfoCC.js.map +2 -2
  3. package/build/cjs/cc/BatteryCC.js +2 -2
  4. package/build/cjs/cc/BatteryCC.js.map +2 -2
  5. package/build/cjs/cc/BinarySwitchCC.js +2 -2
  6. package/build/cjs/cc/BinarySwitchCC.js.map +2 -2
  7. package/build/cjs/cc/ClimateControlScheduleCC.js +1 -1
  8. package/build/cjs/cc/ClimateControlScheduleCC.js.map +2 -2
  9. package/build/cjs/cc/ColorSwitchCC.js +2 -2
  10. package/build/cjs/cc/ColorSwitchCC.js.map +2 -2
  11. package/build/cjs/cc/ConfigurationCC.js +2 -1
  12. package/build/cjs/cc/ConfigurationCC.js.map +2 -2
  13. package/build/cjs/cc/EnergyProductionCC.js +1 -1
  14. package/build/cjs/cc/EnergyProductionCC.js.map +2 -2
  15. package/build/cjs/cc/HumidityControlSetpointCC.js +1 -1
  16. package/build/cjs/cc/HumidityControlSetpointCC.js.map +2 -2
  17. package/build/cjs/cc/IndicatorCC.js +3 -3
  18. package/build/cjs/cc/IndicatorCC.js.map +2 -2
  19. package/build/cjs/cc/IrrigationCC.js +6 -6
  20. package/build/cjs/cc/IrrigationCC.js.map +2 -2
  21. package/build/cjs/cc/ManufacturerProprietaryCC.js +2 -2
  22. package/build/cjs/cc/ManufacturerProprietaryCC.js.map +2 -2
  23. package/build/cjs/cc/MeterCC.js +6 -6
  24. package/build/cjs/cc/MeterCC.js.map +2 -2
  25. package/build/cjs/cc/MultiChannelAssociationCC.js +4 -4
  26. package/build/cjs/cc/MultiChannelAssociationCC.js.map +2 -2
  27. package/build/cjs/cc/MultiChannelCC.js +6 -6
  28. package/build/cjs/cc/MultiChannelCC.js.map +2 -2
  29. package/build/cjs/cc/MultilevelSensorCC.js +2 -2
  30. package/build/cjs/cc/MultilevelSensorCC.js.map +2 -2
  31. package/build/cjs/cc/NotificationCC.js +3 -3
  32. package/build/cjs/cc/NotificationCC.js.map +2 -2
  33. package/build/cjs/cc/ScheduleEntryLockCC.js +4 -4
  34. package/build/cjs/cc/ScheduleEntryLockCC.js.map +2 -2
  35. package/build/cjs/cc/Security2CC.js +7 -7
  36. package/build/cjs/cc/Security2CC.js.map +2 -2
  37. package/build/cjs/cc/SecurityCC.js +5 -5
  38. package/build/cjs/cc/SecurityCC.js.map +2 -2
  39. package/build/cjs/cc/SoundSwitchCC.d.ts +11 -1
  40. package/build/cjs/cc/SoundSwitchCC.js +26 -1
  41. package/build/cjs/cc/SoundSwitchCC.js.map +2 -2
  42. package/build/cjs/cc/SupervisionCC.js +5 -5
  43. package/build/cjs/cc/SupervisionCC.js.map +2 -2
  44. package/build/cjs/cc/ThermostatModeCC.js +2 -2
  45. package/build/cjs/cc/ThermostatModeCC.js.map +2 -2
  46. package/build/cjs/cc/ThermostatSetpointCC.js +3 -3
  47. package/build/cjs/cc/ThermostatSetpointCC.js.map +2 -2
  48. package/build/cjs/cc/TimeCC.js +4 -4
  49. package/build/cjs/cc/TimeCC.js.map +2 -2
  50. package/build/cjs/cc/TransportServiceCC.js +2 -2
  51. package/build/cjs/cc/TransportServiceCC.js.map +2 -2
  52. package/build/cjs/cc/UserCodeCC.js +10 -10
  53. package/build/cjs/cc/UserCodeCC.js.map +2 -2
  54. package/build/cjs/cc/WindowCoveringCC.js +1 -1
  55. package/build/cjs/cc/WindowCoveringCC.js.map +2 -2
  56. package/build/cjs/cc/ZWaveProtocolCC.js +8 -8
  57. package/build/cjs/cc/ZWaveProtocolCC.js.map +2 -2
  58. package/build/cjs/cc/index.js.map +2 -2
  59. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js +1 -1
  60. package/build/cjs/cc/manufacturerProprietary/FibaroCC.js.map +2 -2
  61. package/build/cjs/lib/CommandClass.js +2 -2
  62. package/build/cjs/lib/CommandClass.js.map +2 -2
  63. package/build/cjs/lib/Security2/Extension.js +2 -2
  64. package/build/cjs/lib/Security2/Extension.js.map +2 -2
  65. package/build/cjs/lib/Values.js.map +1 -1
  66. package/build/cjs/lib/traits.d.ts +9 -0
  67. package/build/esm/cc/AssociationGroupInfoCC.js +1 -1
  68. package/build/esm/cc/AssociationGroupInfoCC.js.map +1 -1
  69. package/build/esm/cc/BatteryCC.js +2 -2
  70. package/build/esm/cc/BatteryCC.js.map +1 -1
  71. package/build/esm/cc/BinarySwitchCC.js +2 -2
  72. package/build/esm/cc/BinarySwitchCC.js.map +1 -1
  73. package/build/esm/cc/ClimateControlScheduleCC.js +1 -1
  74. package/build/esm/cc/ClimateControlScheduleCC.js.map +1 -1
  75. package/build/esm/cc/ColorSwitchCC.js +2 -2
  76. package/build/esm/cc/ColorSwitchCC.js.map +1 -1
  77. package/build/esm/cc/ConfigurationCC.d.ts.map +1 -1
  78. package/build/esm/cc/ConfigurationCC.js +2 -1
  79. package/build/esm/cc/ConfigurationCC.js.map +1 -1
  80. package/build/esm/cc/EnergyProductionCC.js +1 -1
  81. package/build/esm/cc/EnergyProductionCC.js.map +1 -1
  82. package/build/esm/cc/HumidityControlSetpointCC.js +1 -1
  83. package/build/esm/cc/HumidityControlSetpointCC.js.map +1 -1
  84. package/build/esm/cc/IndicatorCC.js +3 -3
  85. package/build/esm/cc/IndicatorCC.js.map +1 -1
  86. package/build/esm/cc/IrrigationCC.js +6 -6
  87. package/build/esm/cc/IrrigationCC.js.map +1 -1
  88. package/build/esm/cc/ManufacturerProprietaryCC.js +2 -2
  89. package/build/esm/cc/ManufacturerProprietaryCC.js.map +1 -1
  90. package/build/esm/cc/MeterCC.js +6 -6
  91. package/build/esm/cc/MeterCC.js.map +1 -1
  92. package/build/esm/cc/MultiChannelAssociationCC.js +4 -4
  93. package/build/esm/cc/MultiChannelAssociationCC.js.map +1 -1
  94. package/build/esm/cc/MultiChannelCC.js +6 -6
  95. package/build/esm/cc/MultiChannelCC.js.map +1 -1
  96. package/build/esm/cc/MultilevelSensorCC.js +2 -2
  97. package/build/esm/cc/MultilevelSensorCC.js.map +1 -1
  98. package/build/esm/cc/NotificationCC.js +3 -3
  99. package/build/esm/cc/NotificationCC.js.map +1 -1
  100. package/build/esm/cc/ScheduleEntryLockCC.js +4 -4
  101. package/build/esm/cc/ScheduleEntryLockCC.js.map +1 -1
  102. package/build/esm/cc/Security2CC.js +7 -7
  103. package/build/esm/cc/Security2CC.js.map +1 -1
  104. package/build/esm/cc/SecurityCC.js +5 -5
  105. package/build/esm/cc/SecurityCC.js.map +1 -1
  106. package/build/esm/cc/SoundSwitchCC.d.ts +11 -1
  107. package/build/esm/cc/SoundSwitchCC.d.ts.map +1 -1
  108. package/build/esm/cc/SoundSwitchCC.js +26 -1
  109. package/build/esm/cc/SoundSwitchCC.js.map +1 -1
  110. package/build/esm/cc/SupervisionCC.js +5 -5
  111. package/build/esm/cc/SupervisionCC.js.map +1 -1
  112. package/build/esm/cc/ThermostatModeCC.js +2 -2
  113. package/build/esm/cc/ThermostatModeCC.js.map +1 -1
  114. package/build/esm/cc/ThermostatSetpointCC.js +3 -3
  115. package/build/esm/cc/ThermostatSetpointCC.js.map +1 -1
  116. package/build/esm/cc/TimeCC.js +4 -4
  117. package/build/esm/cc/TimeCC.js.map +1 -1
  118. package/build/esm/cc/TransportServiceCC.js +2 -2
  119. package/build/esm/cc/TransportServiceCC.js.map +1 -1
  120. package/build/esm/cc/UserCodeCC.js +10 -10
  121. package/build/esm/cc/UserCodeCC.js.map +1 -1
  122. package/build/esm/cc/WindowCoveringCC.js +1 -1
  123. package/build/esm/cc/WindowCoveringCC.js.map +1 -1
  124. package/build/esm/cc/ZWaveProtocolCC.js +8 -8
  125. package/build/esm/cc/ZWaveProtocolCC.js.map +1 -1
  126. package/build/esm/cc/index.d.ts.map +1 -1
  127. package/build/esm/cc/index.js +0 -1
  128. package/build/esm/cc/index.js.map +1 -1
  129. package/build/esm/cc/manufacturerProprietary/FibaroCC.js +1 -1
  130. package/build/esm/cc/manufacturerProprietary/FibaroCC.js.map +1 -1
  131. package/build/esm/lib/CommandClass.js +2 -2
  132. package/build/esm/lib/CommandClass.js.map +1 -1
  133. package/build/esm/lib/Security2/Extension.js +2 -2
  134. package/build/esm/lib/Security2/Extension.js.map +1 -1
  135. package/build/esm/lib/Values.js +1 -1
  136. package/build/esm/lib/Values.js.map +1 -1
  137. package/build/esm/lib/traits.d.ts +9 -0
  138. package/build/esm/lib/traits.d.ts.map +1 -1
  139. package/package.json +5 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cc/SupervisionCC.ts"],
4
- "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\tDuration,\n\tEncapsulationFlags,\n\ttype EndpointId,\n\ttype GetEndpoint,\n\ttype GetNode,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype NodeId,\n\ttype SinglecastCC,\n\ttype SupervisionResult,\n\tSupervisionStatus,\n\ttype SupportsCC,\n\tTransmitOptions,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tisTransmissionError,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName } from \"@zwave-js/shared\";\nimport { PhysicalCCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass } from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tshouldUseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { SupervisionCommand } from \"../lib/_Types.js\";\n\nexport const SupervisionCCValues = V.defineCCValues(\n\tCommandClasses.Supervision,\n\t{\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"ccSupported\",\n\t\t\t\"ccSupported\",\n\t\t\t(ccId: CommandClasses) => ccId,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"commandSupported\"\n\t\t\t\t&& typeof propertyKey === \"number\",\n\t\t\tundefined,\n\t\t\t{ internal: true, supportsEndpoints: false },\n\t\t),\n\t},\n);\n\n// @noSetValueAPI - This CC has no values to set\n// @noInterview - This CC is only used for encapsulation\n\n// Encapsulation CCs are used internally and too frequently that we\n// want to pay the cost of validating each call\n/* eslint-disable @zwave-js/ccapi-validate-args */\n\n@API(CommandClasses.Supervision)\nexport class SupervisionCCAPI extends PhysicalCCAPI {\n\tpublic supportsCommand(cmd: SupervisionCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase SupervisionCommand.Get:\n\t\t\tcase SupervisionCommand.Report:\n\t\t\t\treturn true; // This is mandatory\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tpublic async sendReport(\n\t\toptions: SupervisionCCReportOptions & {\n\t\t\tencapsulationFlags?: EncapsulationFlags;\n\t\t\tlowPriority?: boolean;\n\t\t},\n\t): Promise<void> {\n\t\t// Here we don't assert support - some devices only half-support Supervision, so we treat them\n\t\t// as if they don't support it. We still need to be able to respond to the Get command though.\n\n\t\tconst {\n\t\t\tencapsulationFlags = EncapsulationFlags.None,\n\t\t\tlowPriority = false,\n\t\t\t...cmdOptions\n\t\t} = options;\n\t\tconst cc = new SupervisionCCReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...cmdOptions,\n\t\t});\n\n\t\t// The report must be sent back with the same encapsulation order\n\t\tcc.encapsulationFlags = encapsulationFlags;\n\n\t\ttry {\n\t\t\tawait this.host.sendCommand(cc, {\n\t\t\t\t...this.commandOptions,\n\t\t\t\t// Supervision Reports must be prioritized over normal messages\n\t\t\t\tpriority: lowPriority\n\t\t\t\t\t? MessagePriority.ImmediateLow\n\t\t\t\t\t: MessagePriority.Immediate,\n\t\t\t\t// But we don't want to wait for an ACK because this can lock up the network for seconds\n\t\t\t\t// if the target node is asleep or unreachable\n\t\t\t\ttransmitOptions: TransmitOptions.DEFAULT_NOACK,\n\t\t\t\t// Only try sending the report once. If it fails, the node will ask again\n\t\t\t\tmaxSendAttempts: 1,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (isTransmissionError(e)) {\n\t\t\t\t// Swallow errors related to transmission failures\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\t// Pass other errors through\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t}\n}\n\n@commandClass(CommandClasses.Supervision)\n@implementedVersion(2)\nexport class SupervisionCC extends CommandClass {\n\tdeclare ccCommand: SupervisionCommand;\n\t// Force singlecast for the supervision CC\n\tdeclare nodeId: number;\n\n\t/** Tests if a command should be supervised and thus requires encapsulation */\n\tpublic static requiresEncapsulation(cc: CommandClass): boolean {\n\t\treturn (\n\t\t\t!!(cc.encapsulationFlags & EncapsulationFlags.Supervision)\n\t\t\t&& !(cc instanceof SupervisionCCGet)\n\t\t\t&& !(cc instanceof SupervisionCCReport)\n\t\t);\n\t}\n\n\t/** Encapsulates a command that targets a specific endpoint */\n\tpublic static encapsulate(\n\t\tcc: CommandClass,\n\t\tsessionId: number,\n\t\trequestStatusUpdates: boolean = true,\n\t): SupervisionCCGet {\n\t\tif (!cc.isSinglecast()) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Supervision is only possible for singlecast commands!`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\tconst ret = new SupervisionCCGet({\n\t\t\tnodeId: cc.nodeId,\n\t\t\t// Supervision CC is wrapped inside MultiChannel CCs, so the endpoint must be copied\n\t\t\tendpointIndex: cc.endpointIndex,\n\t\t\tencapsulated: cc,\n\t\t\tsessionId,\n\t\t\trequestStatusUpdates,\n\t\t});\n\n\t\t// Copy the encapsulation flags from the encapsulated command\n\t\t// but omit Supervision, since we're doing that right now\n\t\tret.encapsulationFlags = cc.encapsulationFlags\n\t\t\t& ~EncapsulationFlags.Supervision;\n\n\t\treturn ret;\n\t}\n\n\t/**\n\t * Given a CC instance, this returns the Supervision session ID which is used for this command.\n\t * Returns `undefined` when there is no session ID or the command was sent as multicast.\n\t */\n\tpublic static getSessionId(command: CommandClass): number | undefined {\n\t\tif (\n\t\t\tcommand.isEncapsulatedWith(\n\t\t\t\tCommandClasses.Supervision,\n\t\t\t\tSupervisionCommand.Get,\n\t\t\t)\n\t\t) {\n\t\t\tconst supervisionEncapsulation = command.getEncapsulatingCC(\n\t\t\t\tCommandClasses.Supervision,\n\t\t\t\tSupervisionCommand.Get,\n\t\t\t) as SupervisionCCGet;\n\t\t\tif (\n\t\t\t\tsupervisionEncapsulation.frameType !== \"broadcast\"\n\t\t\t\t&& supervisionEncapsulation.frameType !== \"multicast\"\n\t\t\t) {\n\t\t\t\treturn supervisionEncapsulation.sessionId;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns whether a node supports the given CC with Supervision encapsulation.\n\t */\n\tpublic static getCCSupportedWithSupervision(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t\tccId: CommandClasses,\n\t): boolean {\n\t\t// By default assume supervision is supported for all CCs, unless we've remembered one not to be\n\t\treturn (\n\t\t\tctx\n\t\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t\t.getValue(\n\t\t\t\t\tSupervisionCCValues.ccSupported(ccId).endpoint(\n\t\t\t\t\t\tendpoint.index,\n\t\t\t\t\t),\n\t\t\t\t) ?? true\n\t\t);\n\t}\n\n\t/**\n\t * Remembers whether a node supports the given CC with Supervision encapsulation.\n\t */\n\tpublic static setCCSupportedWithSupervision(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t\tccId: CommandClasses,\n\t\tsupported: boolean,\n\t): void {\n\t\tctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.setValue(\n\t\t\t\tSupervisionCCValues.ccSupported(ccId).endpoint(endpoint.index),\n\t\t\t\tsupported,\n\t\t\t);\n\t}\n\n\t/** Returns whether this is a valid command to send supervised */\n\tpublic static mayUseSupervision<T extends CommandClass>(\n\t\tctx:\n\t\t\t& GetValueDB\n\t\t\t& GetNode<\n\t\t\t\tNodeId & SupportsCC & GetEndpoint<EndpointId>\n\t\t\t>,\n\t\tcommand: T,\n\t): command is SinglecastCC<T> {\n\t\t// Supervision may only be used for singlecast CCs that expect no response\n\t\t// The specs mention that Supervision CAN be used for S2 multicast, but conveniently fail to explain how to respond to that.\n\t\tif (!command.isSinglecast()) return false;\n\t\tif (command.expectsCCResponse(ctx)) return false;\n\n\t\t// with a valid node and endpoint\n\t\tconst node = command.getNode(ctx);\n\t\tif (!node) return false;\n\t\tconst endpoint = command.getEndpoint(ctx);\n\t\tif (!endpoint) return false;\n\n\t\t// and only if ...\n\t\treturn (\n\t\t\t// ... the node supports it\n\t\t\tnode.supportsCC(CommandClasses.Supervision)\n\t\t\t// ... the command is marked as \"should use supervision\"\n\t\t\t&& shouldUseSupervision(command)\n\t\t\t// ... and we haven't previously determined that the node doesn't properly support it\n\t\t\t&& SupervisionCC.getCCSupportedWithSupervision(\n\t\t\t\tctx,\n\t\t\t\tendpoint,\n\t\t\t\tcommand.ccId,\n\t\t\t)\n\t\t);\n\t}\n}\n\n// @publicAPI\nexport type SupervisionCCReportOptions =\n\t& {\n\t\tmoreUpdatesFollow: boolean;\n\t\trequestWakeUpOnDemand?: boolean;\n\t\tsessionId: number;\n\t}\n\t& (\n\t\t| {\n\t\t\tstatus: SupervisionStatus.Working;\n\t\t\tduration: Duration;\n\t\t}\n\t\t| {\n\t\t\tstatus:\n\t\t\t\t| SupervisionStatus.NoSupport\n\t\t\t\t| SupervisionStatus.Fail\n\t\t\t\t| SupervisionStatus.Success;\n\t\t}\n\t);\n\n@CCCommand(SupervisionCommand.Report)\nexport class SupervisionCCReport extends SupervisionCC {\n\tpublic constructor(\n\t\toptions: WithAddress<SupervisionCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.moreUpdatesFollow = options.moreUpdatesFollow;\n\t\tthis.requestWakeUpOnDemand = !!options.requestWakeUpOnDemand;\n\t\tthis.sessionId = options.sessionId;\n\t\tthis.status = options.status;\n\t\tif (options.status === SupervisionStatus.Working) {\n\t\t\tthis.duration = options.duration;\n\t\t} else {\n\t\t\tthis.duration = new Duration(0, \"seconds\");\n\t\t}\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): SupervisionCCReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst moreUpdatesFollow = !!(raw.payload[0] & 0b1_0_000000);\n\t\tconst requestWakeUpOnDemand = !!(raw.payload[0] & 0b0_1_000000);\n\t\tconst sessionId = raw.payload[0] & 0b111111;\n\t\tconst status: SupervisionStatus = raw.payload[1];\n\n\t\tif (status === SupervisionStatus.Working) {\n\t\t\tconst duration = Duration.parseReport(raw.payload[2])\n\t\t\t\t?? new Duration(0, \"seconds\");\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tmoreUpdatesFollow,\n\t\t\t\trequestWakeUpOnDemand,\n\t\t\t\tsessionId,\n\t\t\t\tstatus,\n\t\t\t\tduration,\n\t\t\t});\n\t\t} else {\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tmoreUpdatesFollow,\n\t\t\t\trequestWakeUpOnDemand,\n\t\t\t\tsessionId,\n\t\t\t\tstatus,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic readonly moreUpdatesFollow: boolean;\n\tpublic readonly requestWakeUpOnDemand: boolean;\n\tpublic readonly sessionId: number;\n\tpublic readonly status: SupervisionStatus;\n\tpublic readonly duration: Duration | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([\n\t\t\t\t(this.moreUpdatesFollow ? 0b1_0_000000 : 0)\n\t\t\t\t| (this.requestWakeUpOnDemand ? 0b0_1_000000 : 0)\n\t\t\t\t| (this.sessionId & 0b111111),\n\t\t\t\tthis.status,\n\t\t\t]),\n\t\t]);\n\n\t\tif (this.duration) {\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.payload,\n\t\t\t\tBytes.from([this.duration.serializeReport()]),\n\t\t\t]);\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\t\t\"session id\": this.sessionId,\n\t\t\t\"more updates follow\": this.moreUpdatesFollow,\n\t\t\tstatus: getEnumMemberName(SupervisionStatus, this.status),\n\t\t};\n\t\tif (this.duration) {\n\t\t\tmessage.duration = this.duration.toString();\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n\n\tpublic toSupervisionResult(): SupervisionResult {\n\t\tif (this.status === SupervisionStatus.Working) {\n\t\t\treturn {\n\t\t\t\tstatus: this.status,\n\t\t\t\tremainingDuration: this.duration!,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tstatus: this.status,\n\t\t\t};\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport interface SupervisionCCGetOptions {\n\trequestStatusUpdates: boolean;\n\tencapsulated: CommandClass;\n\tsessionId: number;\n}\n\nfunction testResponseForSupervisionCCGet(\n\tsent: SupervisionCCGet,\n\treceived: SupervisionCCReport,\n) {\n\treturn received.sessionId === sent.sessionId;\n}\n\n@CCCommand(SupervisionCommand.Get)\n@expectedCCResponse(SupervisionCCReport, testResponseForSupervisionCCGet)\nexport class SupervisionCCGet extends SupervisionCC {\n\tpublic constructor(\n\t\toptions: WithAddress<SupervisionCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.sessionId = options.sessionId;\n\t\tthis.requestStatusUpdates = options.requestStatusUpdates;\n\t\tthis.encapsulated = options.encapsulated;\n\t\t// Supervision is inside MultiChannel CCs, so the endpoint must be copied\n\t\tthis.encapsulated.endpointIndex = this.endpointIndex;\n\t\tthis.encapsulated.encapsulatingCC = this as any;\n\t}\n\n\tpublic static async from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): Promise<SupervisionCCGet> {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst requestStatusUpdates = !!(raw.payload[0] & 0b1_0_000000);\n\t\tconst sessionId = raw.payload[0] & 0b111111;\n\n\t\tconst encapsulated = await CommandClass.parse(\n\t\t\traw.payload.subarray(2),\n\t\t\tctx,\n\t\t);\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\trequestStatusUpdates,\n\t\t\tsessionId,\n\t\t\tencapsulated,\n\t\t});\n\t}\n\n\tpublic requestStatusUpdates: boolean;\n\tpublic sessionId: number;\n\tpublic encapsulated: CommandClass;\n\n\tpublic async serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst encapCC = await this.encapsulated.serialize(ctx);\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([\n\t\t\t\t(this.requestStatusUpdates ? 0b10_000000 : 0)\n\t\t\t\t| (this.sessionId & 0b111111),\n\t\t\t\tencapCC.length,\n\t\t\t]),\n\t\t\tencapCC,\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tprotected computeEncapsulationOverhead(): number {\n\t\t// Supervision CC adds two bytes (control byte + cc length)\n\t\treturn super.computeEncapsulationOverhead() + 2;\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\"session id\": this.sessionId,\n\t\t\t\t\"request updates\": this.requestStatusUpdates,\n\t\t\t},\n\t\t};\n\t}\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\tDuration,\n\tEncapsulationFlags,\n\ttype EndpointId,\n\ttype GetEndpoint,\n\ttype GetNode,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype NodeId,\n\ttype SinglecastCC,\n\ttype SupervisionResult,\n\tSupervisionStatus,\n\ttype SupportsCC,\n\tTransmitOptions,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tisTransmissionError,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName } from \"@zwave-js/shared\";\nimport { PhysicalCCAPI } from \"../lib/API.js\";\nimport { type CCRaw, CommandClass } from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tshouldUseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { SupervisionCommand } from \"../lib/_Types.js\";\n\nexport const SupervisionCCValues = V.defineCCValues(\n\tCommandClasses.Supervision,\n\t{\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"ccSupported\",\n\t\t\t\"ccSupported\",\n\t\t\t(ccId: CommandClasses) => ccId,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"commandSupported\"\n\t\t\t\t&& typeof propertyKey === \"number\",\n\t\t\tundefined,\n\t\t\t{ internal: true, supportsEndpoints: false },\n\t\t),\n\t},\n);\n\n// @noSetValueAPI - This CC has no values to set\n// @noInterview - This CC is only used for encapsulation\n\n// Encapsulation CCs are used internally and too frequently that we\n// want to pay the cost of validating each call\n/* eslint-disable @zwave-js/ccapi-validate-args */\n\n@API(CommandClasses.Supervision)\nexport class SupervisionCCAPI extends PhysicalCCAPI {\n\tpublic supportsCommand(cmd: SupervisionCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase SupervisionCommand.Get:\n\t\t\tcase SupervisionCommand.Report:\n\t\t\t\treturn true; // This is mandatory\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tpublic async sendReport(\n\t\toptions: SupervisionCCReportOptions & {\n\t\t\tencapsulationFlags?: EncapsulationFlags;\n\t\t\tlowPriority?: boolean;\n\t\t},\n\t): Promise<void> {\n\t\t// Here we don't assert support - some devices only half-support Supervision, so we treat them\n\t\t// as if they don't support it. We still need to be able to respond to the Get command though.\n\n\t\tconst {\n\t\t\tencapsulationFlags = EncapsulationFlags.None,\n\t\t\tlowPriority = false,\n\t\t\t...cmdOptions\n\t\t} = options;\n\t\tconst cc = new SupervisionCCReport({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\t...cmdOptions,\n\t\t});\n\n\t\t// The report must be sent back with the same encapsulation order\n\t\tcc.encapsulationFlags = encapsulationFlags;\n\n\t\ttry {\n\t\t\tawait this.host.sendCommand(cc, {\n\t\t\t\t...this.commandOptions,\n\t\t\t\t// Supervision Reports must be prioritized over normal messages\n\t\t\t\tpriority: lowPriority\n\t\t\t\t\t? MessagePriority.ImmediateLow\n\t\t\t\t\t: MessagePriority.Immediate,\n\t\t\t\t// But we don't want to wait for an ACK because this can lock up the network for seconds\n\t\t\t\t// if the target node is asleep or unreachable\n\t\t\t\ttransmitOptions: TransmitOptions.DEFAULT_NOACK,\n\t\t\t\t// Only try sending the report once. If it fails, the node will ask again\n\t\t\t\tmaxSendAttempts: 1,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (isTransmissionError(e)) {\n\t\t\t\t// Swallow errors related to transmission failures\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\t// Pass other errors through\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t}\n}\n\n@commandClass(CommandClasses.Supervision)\n@implementedVersion(2)\nexport class SupervisionCC extends CommandClass {\n\tdeclare ccCommand: SupervisionCommand;\n\t// Force singlecast for the supervision CC\n\tdeclare nodeId: number;\n\n\t/** Tests if a command should be supervised and thus requires encapsulation */\n\tpublic static requiresEncapsulation(cc: CommandClass): boolean {\n\t\treturn (\n\t\t\t!!(cc.encapsulationFlags & EncapsulationFlags.Supervision)\n\t\t\t&& !(cc instanceof SupervisionCCGet)\n\t\t\t&& !(cc instanceof SupervisionCCReport)\n\t\t);\n\t}\n\n\t/** Encapsulates a command that targets a specific endpoint */\n\tpublic static encapsulate(\n\t\tcc: CommandClass,\n\t\tsessionId: number,\n\t\trequestStatusUpdates: boolean = true,\n\t): SupervisionCCGet {\n\t\tif (!cc.isSinglecast()) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Supervision is only possible for singlecast commands!`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\tconst ret = new SupervisionCCGet({\n\t\t\tnodeId: cc.nodeId,\n\t\t\t// Supervision CC is wrapped inside MultiChannel CCs, so the endpoint must be copied\n\t\t\tendpointIndex: cc.endpointIndex,\n\t\t\tencapsulated: cc,\n\t\t\tsessionId,\n\t\t\trequestStatusUpdates,\n\t\t});\n\n\t\t// Copy the encapsulation flags from the encapsulated command\n\t\t// but omit Supervision, since we're doing that right now\n\t\tret.encapsulationFlags = cc.encapsulationFlags\n\t\t\t& ~EncapsulationFlags.Supervision;\n\n\t\treturn ret;\n\t}\n\n\t/**\n\t * Given a CC instance, this returns the Supervision session ID which is used for this command.\n\t * Returns `undefined` when there is no session ID or the command was sent as multicast.\n\t */\n\tpublic static getSessionId(command: CommandClass): number | undefined {\n\t\tif (\n\t\t\tcommand.isEncapsulatedWith(\n\t\t\t\tCommandClasses.Supervision,\n\t\t\t\tSupervisionCommand.Get,\n\t\t\t)\n\t\t) {\n\t\t\tconst supervisionEncapsulation = command.getEncapsulatingCC(\n\t\t\t\tCommandClasses.Supervision,\n\t\t\t\tSupervisionCommand.Get,\n\t\t\t) as SupervisionCCGet;\n\t\t\tif (\n\t\t\t\tsupervisionEncapsulation.frameType !== \"broadcast\"\n\t\t\t\t&& supervisionEncapsulation.frameType !== \"multicast\"\n\t\t\t) {\n\t\t\t\treturn supervisionEncapsulation.sessionId;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns whether a node supports the given CC with Supervision encapsulation.\n\t */\n\tpublic static getCCSupportedWithSupervision(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t\tccId: CommandClasses,\n\t): boolean {\n\t\t// By default assume supervision is supported for all CCs, unless we've remembered one not to be\n\t\treturn (\n\t\t\tctx\n\t\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t\t.getValue(\n\t\t\t\t\tSupervisionCCValues.ccSupported(ccId).endpoint(\n\t\t\t\t\t\tendpoint.index,\n\t\t\t\t\t),\n\t\t\t\t) ?? true\n\t\t);\n\t}\n\n\t/**\n\t * Remembers whether a node supports the given CC with Supervision encapsulation.\n\t */\n\tpublic static setCCSupportedWithSupervision(\n\t\tctx: GetValueDB,\n\t\tendpoint: EndpointId,\n\t\tccId: CommandClasses,\n\t\tsupported: boolean,\n\t): void {\n\t\tctx\n\t\t\t.getValueDB(endpoint.nodeId)\n\t\t\t.setValue(\n\t\t\t\tSupervisionCCValues.ccSupported(ccId).endpoint(endpoint.index),\n\t\t\t\tsupported,\n\t\t\t);\n\t}\n\n\t/** Returns whether this is a valid command to send supervised */\n\tpublic static mayUseSupervision<T extends CommandClass>(\n\t\tctx:\n\t\t\t& GetValueDB\n\t\t\t& GetNode<\n\t\t\t\tNodeId & SupportsCC & GetEndpoint<EndpointId>\n\t\t\t>,\n\t\tcommand: T,\n\t): command is SinglecastCC<T> {\n\t\t// Supervision may only be used for singlecast CCs that expect no response\n\t\t// The specs mention that Supervision CAN be used for S2 multicast, but conveniently fail to explain how to respond to that.\n\t\tif (!command.isSinglecast()) return false;\n\t\tif (command.expectsCCResponse(ctx)) return false;\n\n\t\t// with a valid node and endpoint\n\t\tconst node = command.getNode(ctx);\n\t\tif (!node) return false;\n\t\tconst endpoint = command.getEndpoint(ctx);\n\t\tif (!endpoint) return false;\n\n\t\t// and only if ...\n\t\treturn (\n\t\t\t// ... the node supports it\n\t\t\tnode.supportsCC(CommandClasses.Supervision)\n\t\t\t// ... the command is marked as \"should use supervision\"\n\t\t\t&& shouldUseSupervision(command)\n\t\t\t// ... and we haven't previously determined that the node doesn't properly support it\n\t\t\t&& SupervisionCC.getCCSupportedWithSupervision(\n\t\t\t\tctx,\n\t\t\t\tendpoint,\n\t\t\t\tcommand.ccId,\n\t\t\t)\n\t\t);\n\t}\n}\n\n// @publicAPI\nexport type SupervisionCCReportOptions =\n\t& {\n\t\tmoreUpdatesFollow: boolean;\n\t\trequestWakeUpOnDemand?: boolean;\n\t\tsessionId: number;\n\t}\n\t& (\n\t\t| {\n\t\t\tstatus: SupervisionStatus.Working;\n\t\t\tduration: Duration;\n\t\t}\n\t\t| {\n\t\t\tstatus:\n\t\t\t\t| SupervisionStatus.NoSupport\n\t\t\t\t| SupervisionStatus.Fail\n\t\t\t\t| SupervisionStatus.Success;\n\t\t}\n\t);\n\n@CCCommand(SupervisionCommand.Report)\nexport class SupervisionCCReport extends SupervisionCC {\n\tpublic constructor(\n\t\toptions: WithAddress<SupervisionCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.moreUpdatesFollow = options.moreUpdatesFollow;\n\t\tthis.requestWakeUpOnDemand = !!options.requestWakeUpOnDemand;\n\t\tthis.sessionId = options.sessionId;\n\t\tthis.status = options.status;\n\t\tif (options.status === SupervisionStatus.Working) {\n\t\t\tthis.duration = options.duration;\n\t\t} else {\n\t\t\tthis.duration = new Duration(0, \"seconds\");\n\t\t}\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): SupervisionCCReport {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst moreUpdatesFollow = !!(raw.payload[0] & 0b1_0_000000);\n\t\tconst requestWakeUpOnDemand = !!(raw.payload[0] & 0b0_1_000000);\n\t\tconst sessionId = raw.payload[0] & 0b111111;\n\t\tconst status: SupervisionStatus = raw.payload[1];\n\n\t\tif (status === SupervisionStatus.Working) {\n\t\t\tconst duration = Duration.parseReport(raw.payload[2])\n\t\t\t\t?? new Duration(0, \"seconds\");\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tmoreUpdatesFollow,\n\t\t\t\trequestWakeUpOnDemand,\n\t\t\t\tsessionId,\n\t\t\t\tstatus,\n\t\t\t\tduration,\n\t\t\t});\n\t\t} else {\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tmoreUpdatesFollow,\n\t\t\t\trequestWakeUpOnDemand,\n\t\t\t\tsessionId,\n\t\t\t\tstatus,\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic readonly moreUpdatesFollow: boolean;\n\tpublic readonly requestWakeUpOnDemand: boolean;\n\tpublic readonly sessionId: number;\n\tpublic readonly status: SupervisionStatus;\n\tpublic readonly duration: Duration | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.concat([\n\t\t\t[\n\t\t\t\t(this.moreUpdatesFollow ? 0b1_0_000000 : 0)\n\t\t\t\t| (this.requestWakeUpOnDemand ? 0b0_1_000000 : 0)\n\t\t\t\t| (this.sessionId & 0b111111),\n\t\t\t\tthis.status,\n\t\t\t],\n\t\t]);\n\n\t\tif (this.duration) {\n\t\t\tthis.payload = Bytes.concat([\n\t\t\t\tthis.payload,\n\t\t\t\t[this.duration.serializeReport()],\n\t\t\t]);\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\t\t\"session id\": this.sessionId,\n\t\t\t\"more updates follow\": this.moreUpdatesFollow,\n\t\t\tstatus: getEnumMemberName(SupervisionStatus, this.status),\n\t\t};\n\t\tif (this.duration) {\n\t\t\tmessage.duration = this.duration.toString();\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n\n\tpublic toSupervisionResult(): SupervisionResult {\n\t\tif (this.status === SupervisionStatus.Working) {\n\t\t\treturn {\n\t\t\t\tstatus: this.status,\n\t\t\t\tremainingDuration: this.duration!,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tstatus: this.status,\n\t\t\t};\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport interface SupervisionCCGetOptions {\n\trequestStatusUpdates: boolean;\n\tencapsulated: CommandClass;\n\tsessionId: number;\n}\n\nfunction testResponseForSupervisionCCGet(\n\tsent: SupervisionCCGet,\n\treceived: SupervisionCCReport,\n) {\n\treturn received.sessionId === sent.sessionId;\n}\n\n@CCCommand(SupervisionCommand.Get)\n@expectedCCResponse(SupervisionCCReport, testResponseForSupervisionCCGet)\nexport class SupervisionCCGet extends SupervisionCC {\n\tpublic constructor(\n\t\toptions: WithAddress<SupervisionCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.sessionId = options.sessionId;\n\t\tthis.requestStatusUpdates = options.requestStatusUpdates;\n\t\tthis.encapsulated = options.encapsulated;\n\t\t// Supervision is inside MultiChannel CCs, so the endpoint must be copied\n\t\tthis.encapsulated.endpointIndex = this.endpointIndex;\n\t\tthis.encapsulated.encapsulatingCC = this as any;\n\t}\n\n\tpublic static async from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): Promise<SupervisionCCGet> {\n\t\tvalidatePayload(raw.payload.length >= 3);\n\t\tconst requestStatusUpdates = !!(raw.payload[0] & 0b1_0_000000);\n\t\tconst sessionId = raw.payload[0] & 0b111111;\n\n\t\tconst encapsulated = await CommandClass.parse(\n\t\t\traw.payload.subarray(2),\n\t\t\tctx,\n\t\t);\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\trequestStatusUpdates,\n\t\t\tsessionId,\n\t\t\tencapsulated,\n\t\t});\n\t}\n\n\tpublic requestStatusUpdates: boolean;\n\tpublic sessionId: number;\n\tpublic encapsulated: CommandClass;\n\n\tpublic async serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst encapCC = await this.encapsulated.serialize(ctx);\n\t\tthis.payload = Bytes.concat([\n\t\t\t[\n\t\t\t\t(this.requestStatusUpdates ? 0b10_000000 : 0)\n\t\t\t\t| (this.sessionId & 0b111111),\n\t\t\t\tencapCC.length,\n\t\t\t],\n\t\t\tencapCC,\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tprotected computeEncapsulationOverhead(): number {\n\t\t// Supervision CC adds two bytes (control byte + cc length)\n\t\treturn super.computeEncapsulationOverhead() + 2;\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\"session id\": this.sessionId,\n\t\t\t\t\"request updates\": this.requestStatusUpdates,\n\t\t\t},\n\t\t};\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["SupervisionCC"]
7
7
  }
@@ -322,9 +322,9 @@ let ThermostatModeCCSet = (() => {
322
322
  const manufacturerData = this.mode === import_Types.ThermostatMode["Manufacturer specific"] && this.manufacturerData ? this.manufacturerData : new Uint8Array();
323
323
  const manufacturerDataLength = manufacturerData.length;
324
324
  this.payload = import_shared.Bytes.concat([
325
- import_shared.Bytes.from([
325
+ [
326
326
  ((manufacturerDataLength & 7) << 5) + (this.mode & 31)
327
- ]),
327
+ ],
328
328
  manufacturerData
329
329
  ]);
330
330
  return super.serialize(ctx);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cc/ThermostatModeCC.ts"],
4
- "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype SupervisionResult,\n\tValueMetadata,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeBitMask,\n\tenumValuesToMetadataStates,\n\tparseBitMask,\n\tsupervisedCommandSucceeded,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport {\n\tBytes,\n\ttype BytesView,\n\tbuffer2hex,\n\tgetEnumMemberName,\n\tpick,\n} from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { ThermostatMode, ThermostatModeCommand } from \"../lib/_Types.js\";\n\nexport const ThermostatModeCCValues = V.defineCCValues(\n\tCommandClasses[\"Thermostat Mode\"],\n\t{\n\t\t...V.staticPropertyWithName(\n\t\t\t\"thermostatMode\",\n\t\t\t\"mode\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.UInt8,\n\t\t\t\tstates: enumValuesToMetadataStates(ThermostatMode),\n\t\t\t\tlabel: \"Thermostat mode\",\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"manufacturerData\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnlyBuffer,\n\t\t\t\tlabel: \"Manufacturer data\",\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\"supportedModes\", undefined, { internal: true }),\n\t},\n);\n\n@API(CommandClasses[\"Thermostat Mode\"])\nexport class ThermostatModeCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: ThermostatModeCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase ThermostatModeCommand.Get:\n\t\t\tcase ThermostatModeCommand.SupportedGet:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase ThermostatModeCommand.Set:\n\t\t\t\treturn true; // This is mandatory\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: ThermostatModeCCAPI, { property }, value) {\n\t\t\tif (property !== \"mode\") {\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.set(value);\n\n\t\t\t// Verify the current value after a delay, unless the command was supervised and successful\n\t\t\tif (this.isSinglecast() && !supervisedCommandSucceeded(result)) {\n\t\t\t\t// TODO: Ideally this would be a short delay, but some thermostats like Remotec ZXT-600\n\t\t\t\t// aren't able to handle the GET this quickly.\n\t\t\t\tthis.schedulePoll({ property }, value);\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: ThermostatModeCCAPI, { property }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"mode\":\n\t\t\t\t\treturn (await this.get())?.[property];\n\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// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic async get() {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatModeCommand,\n\t\t\tThermostatModeCommand.Get,\n\t\t);\n\n\t\tconst cc = new ThermostatModeCCGet({\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\tThermostatModeCCReport\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, [\"mode\", \"manufacturerData\"]);\n\t\t}\n\t}\n\n\tpublic async set(\n\t\tmode: Exclude<\n\t\t\tThermostatMode,\n\t\t\t(typeof ThermostatMode)[\"Manufacturer specific\"]\n\t\t>,\n\t): Promise<SupervisionResult | undefined>;\n\tpublic async set(\n\t\tmode: (typeof ThermostatMode)[\"Manufacturer specific\"],\n\t\tmanufacturerData: BytesView | string,\n\t): Promise<SupervisionResult | undefined>;\n\n\t@validateArgs({ strictEnums: true })\n\tpublic async set(\n\t\tmode: ThermostatMode,\n\t\tmanufacturerData?: BytesView | string,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatModeCommand,\n\t\t\tThermostatModeCommand.Set,\n\t\t);\n\n\t\tif (typeof manufacturerData === \"string\") {\n\t\t\t// We accept the manufacturer data as a hex string. Make sure it's valid\n\t\t\tif (\n\t\t\t\tmanufacturerData.length % 2 !== 0\n\t\t\t\t|| !/^[0-9a-f]+$/i.test(manufacturerData)\n\t\t\t) {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Manufacturer data must be represented as hexadecimal when passed as a string!`,\n\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t);\n\t\t\t}\n\t\t\tmanufacturerData = Bytes.from(manufacturerData, \"hex\");\n\t\t}\n\n\t\tconst cc = new ThermostatModeCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tmode,\n\t\t\tmanufacturerData: manufacturerData as any,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async getSupportedModes(): Promise<\n\t\tMaybeNotKnown<readonly ThermostatMode[]>\n\t> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatModeCommand,\n\t\t\tThermostatModeCommand.SupportedGet,\n\t\t);\n\n\t\tconst cc = new ThermostatModeCCSupportedGet({\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\tThermostatModeCCSupportedReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.supportedModes;\n\t}\n}\n\n@commandClass(CommandClasses[\"Thermostat Mode\"])\n@implementedVersion(3)\n@ccValues(ThermostatModeCCValues)\nexport class ThermostatModeCC extends CommandClass {\n\tdeclare ccCommand: ThermostatModeCommand;\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[\"Thermostat Mode\"],\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// First query the possible modes to set the metadata\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: \"querying supported thermostat modes...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\n\t\tconst supportedModes = await api.getSupportedModes();\n\t\tif (supportedModes) {\n\t\t\tconst logMessage = `received supported thermostat modes:${\n\t\t\t\tsupportedModes\n\t\t\t\t\t.map((mode) =>\n\t\t\t\t\t\t`\\n\u00B7 ${getEnumMemberName(ThermostatMode, mode)}`\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\")\n\t\t\t}`;\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: logMessage,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t} else {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t\"Querying supported thermostat modes timed out, skipping interview...\",\n\t\t\t\tlevel: \"warn\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Thermostat Mode\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\t// Query the current status\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: \"querying current thermostat mode...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst currentStatus = await api.get();\n\t\tif (currentStatus) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"received current thermostat mode: \"\n\t\t\t\t\t+ getEnumMemberName(ThermostatMode, currentStatus.mode),\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport type ThermostatModeCCSetOptions =\n\t| {\n\t\tmode: Exclude<\n\t\t\tThermostatMode,\n\t\t\t(typeof ThermostatMode)[\"Manufacturer specific\"]\n\t\t>;\n\t}\n\t| {\n\t\tmode: (typeof ThermostatMode)[\"Manufacturer specific\"];\n\t\tmanufacturerData: BytesView;\n\t};\n\n@CCCommand(ThermostatModeCommand.Set)\n@useSupervision()\nexport class ThermostatModeCCSet extends ThermostatModeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatModeCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.mode = options.mode;\n\t\tif (\"manufacturerData\" in options) {\n\t\t\tthis.manufacturerData = options.manufacturerData;\n\t\t}\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): ThermostatModeCCSet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst mode: ThermostatMode = raw.payload[0] & 0b11111;\n\t\tif (mode !== ThermostatMode[\"Manufacturer specific\"]) {\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tmode,\n\t\t\t});\n\t\t}\n\n\t\tconst manufacturerDataLength = (raw.payload[0] >>> 5) & 0b111;\n\t\tvalidatePayload(\n\t\t\traw.payload.length >= 1 + manufacturerDataLength,\n\t\t);\n\t\tconst manufacturerData = raw.payload.subarray(\n\t\t\t1,\n\t\t\t1 + manufacturerDataLength,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tmode,\n\t\t\tmanufacturerData,\n\t\t});\n\t}\n\n\tpublic mode: ThermostatMode;\n\tpublic manufacturerData?: BytesView;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst manufacturerData =\n\t\t\tthis.mode === ThermostatMode[\"Manufacturer specific\"]\n\t\t\t\t&& this.manufacturerData\n\t\t\t\t? this.manufacturerData\n\t\t\t\t: new Uint8Array();\n\t\tconst manufacturerDataLength = manufacturerData.length;\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([\n\t\t\t\t((manufacturerDataLength & 0b111) << 5) + (this.mode & 0b11111),\n\t\t\t]),\n\t\t\tmanufacturerData,\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\t\tmode: getEnumMemberName(ThermostatMode, this.mode),\n\t\t};\n\t\tif (this.manufacturerData != undefined) {\n\t\t\tmessage[\"manufacturer data\"] = buffer2hex(this.manufacturerData);\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport type ThermostatModeCCReportOptions =\n\t| {\n\t\tmode: Exclude<\n\t\t\tThermostatMode,\n\t\t\t(typeof ThermostatMode)[\"Manufacturer specific\"]\n\t\t>;\n\t\tmanufacturerData?: undefined;\n\t}\n\t| {\n\t\tmode: (typeof ThermostatMode)[\"Manufacturer specific\"];\n\t\tmanufacturerData?: BytesView;\n\t};\n\n@CCCommand(ThermostatModeCommand.Report)\n@ccValueProperty(\"mode\", ThermostatModeCCValues.thermostatMode)\n@ccValueProperty(\"manufacturerData\", ThermostatModeCCValues.manufacturerData)\nexport class ThermostatModeCCReport extends ThermostatModeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatModeCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.mode = options.mode;\n\t\tthis.manufacturerData = options.manufacturerData;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatModeCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst mode: ThermostatMode = raw.payload[0] & 0b11111;\n\n\t\tif (mode !== ThermostatMode[\"Manufacturer specific\"]) {\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tmode,\n\t\t\t});\n\t\t}\n\n\t\t// V3+\n\t\tconst manufacturerDataLength = raw.payload[0] >>> 5;\n\t\tvalidatePayload(\n\t\t\traw.payload.length >= 1 + manufacturerDataLength,\n\t\t);\n\t\tconst manufacturerData = raw.payload.subarray(\n\t\t\t1,\n\t\t\t1 + manufacturerDataLength,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tmode,\n\t\t\tmanufacturerData,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\t// Update the supported modes if a mode is used that wasn't previously\n\t\t// reported to be supported. This shouldn't happen, but well... it does anyways\n\t\tconst thermostatModeValue = ThermostatModeCCValues.thermostatMode;\n\t\tconst supportedModesValue = ThermostatModeCCValues.supportedModes;\n\n\t\tconst supportedModes = this.getValue<ThermostatMode[]>(\n\t\t\tctx,\n\t\t\tsupportedModesValue,\n\t\t);\n\n\t\tif (\n\t\t\tsupportedModes\n\t\t\t&& this.mode in ThermostatMode\n\t\t\t&& !supportedModes.includes(this.mode)\n\t\t) {\n\t\t\tsupportedModes.push(this.mode);\n\t\t\tsupportedModes.sort((a, b) => a - b);\n\n\t\t\tthis.setMetadata(ctx, thermostatModeValue, {\n\t\t\t\t...thermostatModeValue.meta,\n\t\t\t\tstates: enumValuesToMetadataStates(\n\t\t\t\t\tThermostatMode,\n\t\t\t\t\tsupportedModes,\n\t\t\t\t),\n\t\t\t});\n\t\t\tthis.setValue(ctx, supportedModesValue, supportedModes);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic readonly mode: ThermostatMode;\n\n\tpublic readonly manufacturerData: BytesView | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst manufacturerDataLength =\n\t\t\tthis.mode === ThermostatMode[\"Manufacturer specific\"]\n\t\t\t\t&& this.manufacturerData\n\t\t\t\t? Math.min(0b111, this.manufacturerData.length)\n\t\t\t\t: 0;\n\t\tthis.payload = new Bytes(1 + manufacturerDataLength);\n\t\tthis.payload[0] = (manufacturerDataLength << 5) + (this.mode & 0b11111);\n\t\tif (manufacturerDataLength && this.manufacturerData) {\n\t\t\tthis.payload.set(\n\t\t\t\tthis.manufacturerData.subarray(0, manufacturerDataLength),\n\t\t\t\t1,\n\t\t\t);\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\t\tmode: getEnumMemberName(ThermostatMode, this.mode),\n\t\t};\n\t\tif (this.manufacturerData != undefined) {\n\t\t\tmessage[\"manufacturer data\"] = buffer2hex(this.manufacturerData);\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@CCCommand(ThermostatModeCommand.Get)\n@expectedCCResponse(ThermostatModeCCReport)\nexport class ThermostatModeCCGet extends ThermostatModeCC {}\n\n// @publicAPI\nexport interface ThermostatModeCCSupportedReportOptions {\n\tsupportedModes: ThermostatMode[];\n}\n\n@CCCommand(ThermostatModeCommand.SupportedReport)\n@ccValueProperty(\"supportedModes\", ThermostatModeCCValues.supportedModes)\nexport class ThermostatModeCCSupportedReport extends ThermostatModeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatModeCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.supportedModes = options.supportedModes;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatModeCCSupportedReport {\n\t\tconst supportedModes: ThermostatMode[] = parseBitMask(\n\t\t\traw.payload,\n\t\t\tThermostatMode.Off,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsupportedModes,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\t// Use this information to create the metadata for the mode property\n\t\tconst thermostatModeValue = ThermostatModeCCValues.thermostatMode;\n\t\tthis.setMetadata(ctx, thermostatModeValue, {\n\t\t\t...thermostatModeValue.meta,\n\t\t\tstates: enumValuesToMetadataStates(\n\t\t\t\tThermostatMode,\n\t\t\t\tthis.supportedModes,\n\t\t\t),\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tpublic readonly supportedModes: ThermostatMode[];\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = encodeBitMask(\n\t\t\tthis.supportedModes,\n\t\t\tThermostatMode[\"Manufacturer specific\"],\n\t\t\tThermostatMode.Off,\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\"supported modes\": this.supportedModes\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(mode) =>\n\t\t\t\t\t\t\t`\\n\u00B7 ${getEnumMemberName(ThermostatMode, mode)}`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(ThermostatModeCommand.SupportedGet)\n@expectedCCResponse(ThermostatModeCCSupportedReport)\nexport class ThermostatModeCCSupportedGet extends ThermostatModeCC {}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype MessageRecord,\n\ttype SupervisionResult,\n\tValueMetadata,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeBitMask,\n\tenumValuesToMetadataStates,\n\tparseBitMask,\n\tsupervisedCommandSucceeded,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport {\n\tBytes,\n\ttype BytesView,\n\tbuffer2hex,\n\tgetEnumMemberName,\n\tpick,\n} from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport { ThermostatMode, ThermostatModeCommand } from \"../lib/_Types.js\";\n\nexport const ThermostatModeCCValues = V.defineCCValues(\n\tCommandClasses[\"Thermostat Mode\"],\n\t{\n\t\t...V.staticPropertyWithName(\n\t\t\t\"thermostatMode\",\n\t\t\t\"mode\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.UInt8,\n\t\t\t\tstates: enumValuesToMetadataStates(ThermostatMode),\n\t\t\t\tlabel: \"Thermostat mode\",\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\n\t\t\t\"manufacturerData\",\n\t\t\t{\n\t\t\t\t...ValueMetadata.ReadOnlyBuffer,\n\t\t\t\tlabel: \"Manufacturer data\",\n\t\t\t} as const,\n\t\t),\n\t\t...V.staticProperty(\"supportedModes\", undefined, { internal: true }),\n\t},\n);\n\n@API(CommandClasses[\"Thermostat Mode\"])\nexport class ThermostatModeCCAPI extends CCAPI {\n\tpublic supportsCommand(cmd: ThermostatModeCommand): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase ThermostatModeCommand.Get:\n\t\t\tcase ThermostatModeCommand.SupportedGet:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase ThermostatModeCommand.Set:\n\t\t\t\treturn true; // This is mandatory\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: ThermostatModeCCAPI, { property }, value) {\n\t\t\tif (property !== \"mode\") {\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.set(value);\n\n\t\t\t// Verify the current value after a delay, unless the command was supervised and successful\n\t\t\tif (this.isSinglecast() && !supervisedCommandSucceeded(result)) {\n\t\t\t\t// TODO: Ideally this would be a short delay, but some thermostats like Remotec ZXT-600\n\t\t\t\t// aren't able to handle the GET this quickly.\n\t\t\t\tthis.schedulePoll({ property }, value);\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: ThermostatModeCCAPI, { property }) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"mode\":\n\t\t\t\t\treturn (await this.get())?.[property];\n\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// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic async get() {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatModeCommand,\n\t\t\tThermostatModeCommand.Get,\n\t\t);\n\n\t\tconst cc = new ThermostatModeCCGet({\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\tThermostatModeCCReport\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, [\"mode\", \"manufacturerData\"]);\n\t\t}\n\t}\n\n\tpublic async set(\n\t\tmode: Exclude<\n\t\t\tThermostatMode,\n\t\t\t(typeof ThermostatMode)[\"Manufacturer specific\"]\n\t\t>,\n\t): Promise<SupervisionResult | undefined>;\n\tpublic async set(\n\t\tmode: (typeof ThermostatMode)[\"Manufacturer specific\"],\n\t\tmanufacturerData: BytesView | string,\n\t): Promise<SupervisionResult | undefined>;\n\n\t@validateArgs({ strictEnums: true })\n\tpublic async set(\n\t\tmode: ThermostatMode,\n\t\tmanufacturerData?: BytesView | string,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatModeCommand,\n\t\t\tThermostatModeCommand.Set,\n\t\t);\n\n\t\tif (typeof manufacturerData === \"string\") {\n\t\t\t// We accept the manufacturer data as a hex string. Make sure it's valid\n\t\t\tif (\n\t\t\t\tmanufacturerData.length % 2 !== 0\n\t\t\t\t|| !/^[0-9a-f]+$/i.test(manufacturerData)\n\t\t\t) {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`Manufacturer data must be represented as hexadecimal when passed as a string!`,\n\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t);\n\t\t\t}\n\t\t\tmanufacturerData = Bytes.from(manufacturerData, \"hex\");\n\t\t}\n\n\t\tconst cc = new ThermostatModeCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tmode,\n\t\t\tmanufacturerData: manufacturerData as any,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\tpublic async getSupportedModes(): Promise<\n\t\tMaybeNotKnown<readonly ThermostatMode[]>\n\t> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatModeCommand,\n\t\t\tThermostatModeCommand.SupportedGet,\n\t\t);\n\n\t\tconst cc = new ThermostatModeCCSupportedGet({\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\tThermostatModeCCSupportedReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.supportedModes;\n\t}\n}\n\n@commandClass(CommandClasses[\"Thermostat Mode\"])\n@implementedVersion(3)\n@ccValues(ThermostatModeCCValues)\nexport class ThermostatModeCC extends CommandClass {\n\tdeclare ccCommand: ThermostatModeCommand;\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[\"Thermostat Mode\"],\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// First query the possible modes to set the metadata\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: \"querying supported thermostat modes...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\n\t\tconst supportedModes = await api.getSupportedModes();\n\t\tif (supportedModes) {\n\t\t\tconst logMessage = `received supported thermostat modes:${\n\t\t\t\tsupportedModes\n\t\t\t\t\t.map((mode) =>\n\t\t\t\t\t\t`\\n\u00B7 ${getEnumMemberName(ThermostatMode, mode)}`\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\")\n\t\t\t}`;\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: logMessage,\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t} else {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t\"Querying supported thermostat modes timed out, skipping interview...\",\n\t\t\t\tlevel: \"warn\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.refreshValues(ctx);\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Thermostat Mode\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\t// Query the current status\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: \"querying current thermostat mode...\",\n\t\t\tdirection: \"outbound\",\n\t\t});\n\t\tconst currentStatus = await api.get();\n\t\tif (currentStatus) {\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"received current thermostat mode: \"\n\t\t\t\t\t+ getEnumMemberName(ThermostatMode, currentStatus.mode),\n\t\t\t\tdirection: \"inbound\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport type ThermostatModeCCSetOptions =\n\t| {\n\t\tmode: Exclude<\n\t\t\tThermostatMode,\n\t\t\t(typeof ThermostatMode)[\"Manufacturer specific\"]\n\t\t>;\n\t}\n\t| {\n\t\tmode: (typeof ThermostatMode)[\"Manufacturer specific\"];\n\t\tmanufacturerData: BytesView;\n\t};\n\n@CCCommand(ThermostatModeCommand.Set)\n@useSupervision()\nexport class ThermostatModeCCSet extends ThermostatModeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatModeCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.mode = options.mode;\n\t\tif (\"manufacturerData\" in options) {\n\t\t\tthis.manufacturerData = options.manufacturerData;\n\t\t}\n\t}\n\n\tpublic static from(raw: CCRaw, ctx: CCParsingContext): ThermostatModeCCSet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst mode: ThermostatMode = raw.payload[0] & 0b11111;\n\t\tif (mode !== ThermostatMode[\"Manufacturer specific\"]) {\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tmode,\n\t\t\t});\n\t\t}\n\n\t\tconst manufacturerDataLength = (raw.payload[0] >>> 5) & 0b111;\n\t\tvalidatePayload(\n\t\t\traw.payload.length >= 1 + manufacturerDataLength,\n\t\t);\n\t\tconst manufacturerData = raw.payload.subarray(\n\t\t\t1,\n\t\t\t1 + manufacturerDataLength,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tmode,\n\t\t\tmanufacturerData,\n\t\t});\n\t}\n\n\tpublic mode: ThermostatMode;\n\tpublic manufacturerData?: BytesView;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst manufacturerData =\n\t\t\tthis.mode === ThermostatMode[\"Manufacturer specific\"]\n\t\t\t\t&& this.manufacturerData\n\t\t\t\t? this.manufacturerData\n\t\t\t\t: new Uint8Array();\n\t\tconst manufacturerDataLength = manufacturerData.length;\n\t\tthis.payload = Bytes.concat([\n\t\t\t[\n\t\t\t\t((manufacturerDataLength & 0b111) << 5) + (this.mode & 0b11111),\n\t\t\t],\n\t\t\tmanufacturerData,\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\t\tmode: getEnumMemberName(ThermostatMode, this.mode),\n\t\t};\n\t\tif (this.manufacturerData != undefined) {\n\t\t\tmessage[\"manufacturer data\"] = buffer2hex(this.manufacturerData);\n\t\t}\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage,\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport type ThermostatModeCCReportOptions =\n\t| {\n\t\tmode: Exclude<\n\t\t\tThermostatMode,\n\t\t\t(typeof ThermostatMode)[\"Manufacturer specific\"]\n\t\t>;\n\t\tmanufacturerData?: undefined;\n\t}\n\t| {\n\t\tmode: (typeof ThermostatMode)[\"Manufacturer specific\"];\n\t\tmanufacturerData?: BytesView;\n\t};\n\n@CCCommand(ThermostatModeCommand.Report)\n@ccValueProperty(\"mode\", ThermostatModeCCValues.thermostatMode)\n@ccValueProperty(\"manufacturerData\", ThermostatModeCCValues.manufacturerData)\nexport class ThermostatModeCCReport extends ThermostatModeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatModeCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.mode = options.mode;\n\t\tthis.manufacturerData = options.manufacturerData;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatModeCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst mode: ThermostatMode = raw.payload[0] & 0b11111;\n\n\t\tif (mode !== ThermostatMode[\"Manufacturer specific\"]) {\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\tmode,\n\t\t\t});\n\t\t}\n\n\t\t// V3+\n\t\tconst manufacturerDataLength = raw.payload[0] >>> 5;\n\t\tvalidatePayload(\n\t\t\traw.payload.length >= 1 + manufacturerDataLength,\n\t\t);\n\t\tconst manufacturerData = raw.payload.subarray(\n\t\t\t1,\n\t\t\t1 + manufacturerDataLength,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tmode,\n\t\t\tmanufacturerData,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\t// Update the supported modes if a mode is used that wasn't previously\n\t\t// reported to be supported. This shouldn't happen, but well... it does anyways\n\t\tconst thermostatModeValue = ThermostatModeCCValues.thermostatMode;\n\t\tconst supportedModesValue = ThermostatModeCCValues.supportedModes;\n\n\t\tconst supportedModes = this.getValue<ThermostatMode[]>(\n\t\t\tctx,\n\t\t\tsupportedModesValue,\n\t\t);\n\n\t\tif (\n\t\t\tsupportedModes\n\t\t\t&& this.mode in ThermostatMode\n\t\t\t&& !supportedModes.includes(this.mode)\n\t\t) {\n\t\t\tsupportedModes.push(this.mode);\n\t\t\tsupportedModes.sort((a, b) => a - b);\n\n\t\t\tthis.setMetadata(ctx, thermostatModeValue, {\n\t\t\t\t...thermostatModeValue.meta,\n\t\t\t\tstates: enumValuesToMetadataStates(\n\t\t\t\t\tThermostatMode,\n\t\t\t\t\tsupportedModes,\n\t\t\t\t),\n\t\t\t});\n\t\t\tthis.setValue(ctx, supportedModesValue, supportedModes);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic readonly mode: ThermostatMode;\n\n\tpublic readonly manufacturerData: BytesView | undefined;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst manufacturerDataLength =\n\t\t\tthis.mode === ThermostatMode[\"Manufacturer specific\"]\n\t\t\t\t&& this.manufacturerData\n\t\t\t\t? Math.min(0b111, this.manufacturerData.length)\n\t\t\t\t: 0;\n\t\tthis.payload = new Bytes(1 + manufacturerDataLength);\n\t\tthis.payload[0] = (manufacturerDataLength << 5) + (this.mode & 0b11111);\n\t\tif (manufacturerDataLength && this.manufacturerData) {\n\t\t\tthis.payload.set(\n\t\t\t\tthis.manufacturerData.subarray(0, manufacturerDataLength),\n\t\t\t\t1,\n\t\t\t);\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\t\tmode: getEnumMemberName(ThermostatMode, this.mode),\n\t\t};\n\t\tif (this.manufacturerData != undefined) {\n\t\t\tmessage[\"manufacturer data\"] = buffer2hex(this.manufacturerData);\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@CCCommand(ThermostatModeCommand.Get)\n@expectedCCResponse(ThermostatModeCCReport)\nexport class ThermostatModeCCGet extends ThermostatModeCC {}\n\n// @publicAPI\nexport interface ThermostatModeCCSupportedReportOptions {\n\tsupportedModes: ThermostatMode[];\n}\n\n@CCCommand(ThermostatModeCommand.SupportedReport)\n@ccValueProperty(\"supportedModes\", ThermostatModeCCValues.supportedModes)\nexport class ThermostatModeCCSupportedReport extends ThermostatModeCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatModeCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.supportedModes = options.supportedModes;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatModeCCSupportedReport {\n\t\tconst supportedModes: ThermostatMode[] = parseBitMask(\n\t\t\traw.payload,\n\t\t\tThermostatMode.Off,\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsupportedModes,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\t// Use this information to create the metadata for the mode property\n\t\tconst thermostatModeValue = ThermostatModeCCValues.thermostatMode;\n\t\tthis.setMetadata(ctx, thermostatModeValue, {\n\t\t\t...thermostatModeValue.meta,\n\t\t\tstates: enumValuesToMetadataStates(\n\t\t\t\tThermostatMode,\n\t\t\t\tthis.supportedModes,\n\t\t\t),\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tpublic readonly supportedModes: ThermostatMode[];\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = encodeBitMask(\n\t\t\tthis.supportedModes,\n\t\t\tThermostatMode[\"Manufacturer specific\"],\n\t\t\tThermostatMode.Off,\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\"supported modes\": this.supportedModes\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(mode) =>\n\t\t\t\t\t\t\t`\\n\u00B7 ${getEnumMemberName(ThermostatMode, mode)}`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(ThermostatModeCommand.SupportedGet)\n@expectedCCResponse(ThermostatModeCCSupportedReport)\nexport class ThermostatModeCCSupportedGet extends ThermostatModeCC {}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -438,7 +438,7 @@ let ThermostatSetpointCCSet = (() => {
438
438
  serialize(ctx) {
439
439
  const override = ctx.getDeviceConfig?.(this.nodeId)?.compat?.overrideFloatEncoding;
440
440
  this.payload = import_shared.Bytes.concat([
441
- import_shared.Bytes.from([this.setpointType & 15]),
441
+ [this.setpointType & 15],
442
442
  (0, import_core.encodeFloatWithScale)(this.value, this.scale, override)
443
443
  ]);
444
444
  return super.serialize(ctx);
@@ -522,7 +522,7 @@ let ThermostatSetpointCCReport = (() => {
522
522
  value;
523
523
  serialize(ctx) {
524
524
  this.payload = import_shared.Bytes.concat([
525
- import_shared.Bytes.from([this.type & 15]),
525
+ [this.type & 15],
526
526
  (0, import_core.encodeFloatWithScale)(this.value, this.scale)
527
527
  ]);
528
528
  return super.serialize(ctx);
@@ -654,7 +654,7 @@ let ThermostatSetpointCCCapabilitiesReport = (() => {
654
654
  serialize(ctx) {
655
655
  const min = (0, import_core.encodeFloatWithScale)(this.minValue, this.minValueScale);
656
656
  const max = (0, import_core.encodeFloatWithScale)(this.maxValue, this.maxValueScale);
657
- this.payload = import_shared.Bytes.concat([import_shared.Bytes.from([this.type]), min, max]);
657
+ this.payload = import_shared.Bytes.concat([[this.type], min, max]);
658
658
  return super.serialize(ctx);
659
659
  }
660
660
  toLogEntry(ctx) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cc/ThermostatSetpointCC.ts"],
4
- "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype Scale,\n\ttype SupervisionResult,\n\tValueMetadata,\n\ttype ValueMetadataNumeric,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeBitMask,\n\tencodeFloatWithScale,\n\tgetNamedScale,\n\tgetUnknownScale,\n\tparseBitMask,\n\tparseFloatWithScale,\n\tsupervisedCommandSucceeded,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, pick } from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport {\n\tThermostatSetpointCommand,\n\tThermostatSetpointType,\n} from \"../lib/_Types.js\";\n\n// This array is used to map the advertised supported types (interpretation A)\n// to the actual enum values\nconst thermostatSetpointTypeMap = [\n\t0x00,\n\t0x01,\n\t0x02,\n\t0x07,\n\t0x08,\n\t0x09,\n\t0x0a,\n\t0x0b,\n\t0x0c,\n\t0x0d,\n\t0x0e,\n\t0x0f,\n];\n\nfunction getScale(scale: number): Scale {\n\treturn getNamedScale(\"temperature\", scale as any)\n\t\t?? getUnknownScale(scale);\n}\nfunction getSetpointUnit(scale: number): string {\n\treturn getScale(scale).unit ?? \"\";\n}\n\nexport const ThermostatSetpointCCValues = V.defineCCValues(\n\tCommandClasses[\"Thermostat Setpoint\"],\n\t{\n\t\t...V.staticProperty(\"supportedSetpointTypes\", undefined, {\n\t\t\tinternal: true,\n\t\t}),\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"setpoint\",\n\t\t\t\"setpoint\",\n\t\t\t(setpointType: ThermostatSetpointType) => setpointType,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"setpoint\" && typeof propertyKey === \"number\",\n\t\t\t(setpointType: ThermostatSetpointType) => ({\n\t\t\t\t...ValueMetadata.Number,\n\t\t\t\tlabel: `Setpoint (${\n\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\t\tsetpointType,\n\t\t\t\t\t)\n\t\t\t\t})`,\n\t\t\t\tccSpecific: { setpointType },\n\t\t\t} as const),\n\t\t),\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"setpointScale\",\n\t\t\t\"setpointScale\",\n\t\t\t(setpointType: ThermostatSetpointType) => setpointType,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"setpointScale\" && typeof propertyKey === \"number\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\t},\n);\n\n@API(CommandClasses[\"Thermostat Setpoint\"])\nexport class ThermostatSetpointCCAPI extends CCAPI {\n\tpublic supportsCommand(\n\t\tcmd: ThermostatSetpointCommand,\n\t): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase ThermostatSetpointCommand.Get:\n\t\t\tcase ThermostatSetpointCommand.SupportedGet:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase ThermostatSetpointCommand.Set:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase ThermostatSetpointCommand.CapabilitiesGet:\n\t\t\t\treturn this.version >= 3 && this.isSinglecast();\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: ThermostatSetpointCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t\tvalue,\n\t\t) {\n\t\t\tif (property !== \"setpoint\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t\tif (typeof propertyKey !== \"number\") {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`${\n\t\t\t\t\t\tCommandClasses[this.ccId]\n\t\t\t\t\t}: \"${property}\" must be further specified by a numeric property key`,\n\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t);\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\n\t\t\t// SDS14223: The Scale field value MUST be identical to the value received in the Thermostat Setpoint Report for the\n\t\t\t// actual Setpoint Type during the node interview. Fall back to the first scale if none is known\n\t\t\tconst preferredScale = this.tryGetValueDB()?.getValue<number>(\n\t\t\t\tThermostatSetpointCCValues.setpointScale(propertyKey).endpoint(\n\t\t\t\t\tthis.endpoint.index,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst result = await this.set(\n\t\t\t\tpropertyKey,\n\t\t\t\tvalue,\n\t\t\t\tpreferredScale ?? 0,\n\t\t\t);\n\n\t\t\t// Verify the current value after a delay, unless the command was supervised and successful\n\t\t\tif (this.isSinglecast() && !supervisedCommandSucceeded(result)) {\n\t\t\t\t// TODO: Ideally this would be a short delay, but some thermostats like Remotec ZXT-600\n\t\t\t\t// aren't able to handle the GET this quickly.\n\t\t\t\tthis.schedulePoll({ property, propertyKey }, value);\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(\n\t\t\tthis: ThermostatSetpointCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"setpoint\":\n\t\t\t\t\tif (typeof propertyKey !== \"number\") {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`${\n\t\t\t\t\t\t\t\tCommandClasses[this.ccId]\n\t\t\t\t\t\t\t}: \"${property}\" must be further specified by a numeric property key`,\n\t\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (await this.get(propertyKey))?.value;\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@validateArgs()\n\tpublic async get(\n\t\tsetpointType: ThermostatSetpointType,\n\t): Promise<{ value: number; scale: Scale } | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatSetpointCommand,\n\t\t\tThermostatSetpointCommand.Get,\n\t\t);\n\n\t\tconst cc = new ThermostatSetpointCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsetpointType,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tThermostatSetpointCCReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (!response) return;\n\t\tif (response.type !== ThermostatSetpointType[\"N/A\"]) {\n\t\t\t// This is a supported setpoint\n\t\t\tconst scale = getScale(response.scale);\n\t\t\treturn {\n\t\t\t\tvalue: response.value,\n\t\t\t\tscale,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async set(\n\t\tsetpointType: ThermostatSetpointType,\n\t\tvalue: number,\n\t\tscale: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatSetpointCommand,\n\t\t\tThermostatSetpointCommand.Set,\n\t\t);\n\n\t\tconst cc = new ThermostatSetpointCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsetpointType,\n\t\t\tvalue,\n\t\t\tscale,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic async getCapabilities(setpointType: ThermostatSetpointType) {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatSetpointCommand,\n\t\t\tThermostatSetpointCommand.CapabilitiesGet,\n\t\t);\n\n\t\tconst cc = new ThermostatSetpointCCCapabilitiesGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsetpointType,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tThermostatSetpointCCCapabilitiesReport\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\"minValue\",\n\t\t\t\t\"maxValue\",\n\t\t\t\t\"minValueScale\",\n\t\t\t\t\"maxValueScale\",\n\t\t\t]);\n\t\t}\n\t}\n\n\t/**\n\t * Requests the supported setpoint types from the node. Due to inconsistencies it is NOT recommended\n\t * to use this method on nodes with CC versions 1 and 2. Instead rely on the information determined\n\t * during node interview.\n\t */\n\tpublic async getSupportedSetpointTypes(): Promise<\n\t\tMaybeNotKnown<readonly ThermostatSetpointType[]>\n\t> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatSetpointCommand,\n\t\t\tThermostatSetpointCommand.SupportedGet,\n\t\t);\n\n\t\tconst cc = new ThermostatSetpointCCSupportedGet({\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\tThermostatSetpointCCSupportedReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.supportedSetpointTypes;\n\t}\n}\n\n@commandClass(CommandClasses[\"Thermostat Setpoint\"])\n@implementedVersion(3)\n@ccValues(ThermostatSetpointCCValues)\nexport class ThermostatSetpointCC extends CommandClass {\n\tdeclare ccCommand: ThermostatSetpointCommand;\n\n\tpublic translatePropertyKey(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\tif (property === \"setpoint\") {\n\t\t\treturn getEnumMemberName(\n\t\t\t\tThermostatSetpointType,\n\t\t\t\tpropertyKey as any,\n\t\t\t);\n\t\t} else {\n\t\t\treturn super.translatePropertyKey(ctx, property, propertyKey);\n\t\t}\n\t}\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[\"Thermostat Setpoint\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tif (api.version <= 2) {\n\t\t\t// It has been found that early implementations of this Command Class applied two non-interoperable\n\t\t\t// interpretations of the bit mask advertising the support for specific Setpoint Types in the Thermostat\n\t\t\t// Setpoint Supported Report Command.\n\t\t\t// A controlling node SHOULD determine the supported Setpoint Types of a version 1 and version 2\n\t\t\t// supporting node by sending one Thermostat Setpoint Get Command at a time while incrementing\n\t\t\t// the requested Setpoint Type.\n\t\t\t// If the same Setpoint Type is advertised in the returned Thermostat Setpoint Report Command, the\n\t\t\t// controlling node MUST conclude that the actual Setpoint Type is supported.\n\t\t\t// If the Setpoint Type 0x00 (type N/A) is advertised in the returned Thermostat Setpoint Report\n\t\t\t// Command, the controlling node MUST conclude that the actual Setpoint Type is not supported.\n\n\t\t\t// The specs require us to query the list of supported setpoint types anyways, even if the response is ignored\n\t\t\tawait api.getSupportedSetpointTypes();\n\n\t\t\t// Now scan all endpoints. Each type we received a value for gets marked as supported\n\t\t\tconst supportedSetpointTypes: ThermostatSetpointType[] = [];\n\t\t\tfor (\n\t\t\t\tlet type: ThermostatSetpointType =\n\t\t\t\t\tThermostatSetpointType.Heating;\n\t\t\t\ttype <= ThermostatSetpointType[\"Full Power\"];\n\t\t\t\ttype++\n\t\t\t) {\n\t\t\t\tconst setpointName = getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\ttype,\n\t\t\t\t);\n\t\t\t\t// Every time, query the current value\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`querying current value of setpoint ${setpointName}...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\n\t\t\t\tconst setpoint = await api.get(type);\n\t\t\t\t// If the node did not respond, assume the setpoint type is not supported\n\n\t\t\t\tlet logMessage: string;\n\t\t\t\tif (setpoint) {\n\t\t\t\t\t// Setpoint supported, remember the type\n\t\t\t\t\tsupportedSetpointTypes.push(type);\n\t\t\t\t\tlogMessage =\n\t\t\t\t\t\t`received current value of setpoint ${setpointName}: ${setpoint.value} ${\n\t\t\t\t\t\t\tsetpoint.scale.unit ?? \"\"\n\t\t\t\t\t\t}`;\n\t\t\t\t} else {\n\t\t\t\t\t// We're sure about the interpretation - this should not happen\n\t\t\t\t\tlogMessage = `setpoint ${setpointName} is not supported`;\n\t\t\t\t}\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\t\t\t}\n\n\t\t\t// Remember which setpoint types are actually supported\n\t\t\tthis.setValue(\n\t\t\t\tctx,\n\t\t\t\tThermostatSetpointCCValues.supportedSetpointTypes,\n\t\t\t\tsupportedSetpointTypes,\n\t\t\t);\n\t\t} else {\n\t\t\t// Versions >= 3 adhere to bitmap interpretation A, so we can rely on getSupportedSetpointTypes\n\n\t\t\t// Query the supported setpoint types\n\t\t\tlet setpointTypes: ThermostatSetpointType[] = [];\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"retrieving supported setpoint types...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst resp = await api.getSupportedSetpointTypes();\n\t\t\tif (resp) {\n\t\t\t\tsetpointTypes = [...resp];\n\t\t\t\tconst logMessage = \"received supported setpoint types:\\n\"\n\t\t\t\t\t+ setpointTypes\n\t\t\t\t\t\t.map((type) =>\n\t\t\t\t\t\t\tgetEnumMemberName(ThermostatSetpointType, type)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((name) => `\u00B7 ${name}`)\n\t\t\t\t\t\t.join(\"\\n\");\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\t\t\t} else {\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\"Querying supported setpoint types timed out, skipping interview...\",\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (const type of setpointTypes) {\n\t\t\t\tconst setpointName = getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\ttype,\n\t\t\t\t);\n\t\t\t\t// Find out the capabilities of this setpoint\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 capabilities for setpoint ${setpointName}...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tconst setpointCaps = await api.getCapabilities(type);\n\t\t\t\tif (setpointCaps) {\n\t\t\t\t\tconst minValueUnit = getSetpointUnit(\n\t\t\t\t\t\tsetpointCaps.minValueScale,\n\t\t\t\t\t);\n\t\t\t\t\tconst maxValueUnit = getSetpointUnit(\n\t\t\t\t\t\tsetpointCaps.maxValueScale,\n\t\t\t\t\t);\n\t\t\t\t\tconst logMessage =\n\t\t\t\t\t\t`received capabilities for setpoint ${setpointName}:\nminimum value: ${setpointCaps.minValue} ${minValueUnit}\nmaximum value: ${setpointCaps.maxValue} ${maxValueUnit}`;\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}\n\t\t\t}\n\n\t\t\t// Query the current value for all setpoint types\n\t\t\tawait this.refreshValues(ctx);\n\t\t}\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Thermostat Setpoint\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tconst setpointTypes: ThermostatSetpointType[] = this.getValue(\n\t\t\tctx,\n\t\t\tThermostatSetpointCCValues.supportedSetpointTypes,\n\t\t) ?? [];\n\n\t\t// Query each setpoint's current value\n\t\tfor (const type of setpointTypes) {\n\t\t\tconst setpointName = getEnumMemberName(\n\t\t\t\tThermostatSetpointType,\n\t\t\t\ttype,\n\t\t\t);\n\t\t\t// Every time, query the current value\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`querying current value of setpoint ${setpointName}...`,\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst setpoint = await api.get(type);\n\t\t\tif (setpoint) {\n\t\t\t\tconst logMessage =\n\t\t\t\t\t`received current value of setpoint ${setpointName}: ${setpoint.value} ${\n\t\t\t\t\t\tsetpoint.scale.unit ?? \"\"\n\t\t\t\t\t}`;\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\t\t\t}\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCSetOptions {\n\tsetpointType: ThermostatSetpointType;\n\tvalue: number;\n\tscale: number;\n}\n\n@CCCommand(ThermostatSetpointCommand.Set)\n@useSupervision()\nexport class ThermostatSetpointCCSet extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.setpointType = options.setpointType;\n\t\tthis.value = options.value;\n\t\tthis.scale = options.scale;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCSet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst setpointType: ThermostatSetpointType = raw.payload[0] & 0b1111;\n\n\t\t// parseFloatWithScale does its own validation\n\t\tconst { value, scale } = parseFloatWithScale(\n\t\t\traw.payload.subarray(1),\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsetpointType,\n\t\t\tvalue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic setpointType: ThermostatSetpointType;\n\tpublic value: number;\n\tpublic scale: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\t// If a config file overwrites how the float should be encoded, use that information\n\t\tconst override = ctx.getDeviceConfig?.(this.nodeId as number)\n\t\t\t?.compat?.overrideFloatEncoding;\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.setpointType & 0b1111]),\n\t\t\tencodeFloatWithScale(this.value, this.scale, override),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst scale = getScale(this.scale);\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.setpointType,\n\t\t\t\t),\n\t\t\t\tvalue: `${this.value} ${scale.unit}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCReportOptions {\n\ttype: ThermostatSetpointType;\n\tvalue: number;\n\tscale: number;\n}\n\n@CCCommand(ThermostatSetpointCommand.Report)\nexport class ThermostatSetpointCCReport extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.value = options.value;\n\t\tthis.scale = options.scale;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst type: ThermostatSetpointType = raw.payload[0] & 0b1111;\n\n\t\tif (type === 0) {\n\t\t\t// Not supported\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\ttype,\n\t\t\t\tvalue: 0,\n\t\t\t\tscale: 0,\n\t\t\t});\n\t\t}\n\n\t\t// parseFloatWithScale does its own validation\n\t\tconst { value, scale } = parseFloatWithScale(\n\t\t\traw.payload.subarray(1),\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\tvalue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tconst scale = getScale(this.scale);\n\n\t\tconst setpointValue = ThermostatSetpointCCValues.setpoint(this.type);\n\t\tconst existingMetadata = this.getMetadata<ValueMetadataNumeric>(\n\t\t\tctx,\n\t\t\tsetpointValue,\n\t\t);\n\n\t\t// Update the metadata when it is missing or the unit has changed\n\t\tif (existingMetadata?.unit !== scale.unit) {\n\t\t\tthis.setMetadata(ctx, setpointValue, {\n\t\t\t\t...(existingMetadata ?? setpointValue.meta),\n\t\t\t\tunit: scale.unit,\n\t\t\t});\n\t\t}\n\t\tthis.setValue(ctx, setpointValue, this.value);\n\n\t\t// Remember the device-preferred setpoint scale so it can be used in SET commands\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tThermostatSetpointCCValues.setpointScale(this.type),\n\t\t\tscale.key,\n\t\t);\n\t\treturn true;\n\t}\n\n\tpublic type: ThermostatSetpointType;\n\tpublic scale: number;\n\tpublic value: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.concat([\n\t\t\tBytes.from([this.type & 0b1111]),\n\t\t\tencodeFloatWithScale(this.value, this.scale),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst scale = getScale(this.scale);\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.type,\n\t\t\t\t),\n\t\t\t\tvalue: `${this.value} ${scale.unit}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction testResponseForThermostatSetpointGet(\n\tsent: ThermostatSetpointCCGet,\n\treceived: ThermostatSetpointCCReport,\n) {\n\t// We expect a Thermostat Setpoint Report that matches the requested setpoint type\n\treturn received.type === sent.setpointType;\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCGetOptions {\n\tsetpointType: ThermostatSetpointType;\n}\n\n@CCCommand(ThermostatSetpointCommand.Get)\n@expectedCCResponse(\n\tThermostatSetpointCCReport,\n\ttestResponseForThermostatSetpointGet,\n)\nexport class ThermostatSetpointCCGet extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.setpointType = options.setpointType;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst setpointType: ThermostatSetpointType = raw.payload[0] & 0b1111;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsetpointType,\n\t\t});\n\t}\n\n\tpublic setpointType: ThermostatSetpointType;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.setpointType & 0b1111]);\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\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.setpointType,\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCCapabilitiesReportOptions {\n\ttype: ThermostatSetpointType;\n\tminValue: number;\n\tminValueScale: number;\n\tmaxValue: number;\n\tmaxValueScale: number;\n}\n\n@CCCommand(ThermostatSetpointCommand.CapabilitiesReport)\nexport class ThermostatSetpointCCCapabilitiesReport\n\textends ThermostatSetpointCC\n{\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCCapabilitiesReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.minValue = options.minValue;\n\t\tthis.minValueScale = options.minValueScale;\n\t\tthis.maxValue = options.maxValue;\n\t\tthis.maxValueScale = options.maxValueScale;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCCapabilitiesReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst type: ThermostatSetpointType = raw.payload[0];\n\t\t// parseFloatWithScale does its own validation\n\t\tconst {\n\t\t\tvalue: minValue,\n\t\t\tscale: minValueScale,\n\t\t\tbytesRead,\n\t\t} = parseFloatWithScale(raw.payload.subarray(1));\n\t\tconst { value: maxValue, scale: maxValueScale } = parseFloatWithScale(\n\t\t\traw.payload.subarray(1 + bytesRead),\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\tminValue,\n\t\t\tminValueScale,\n\t\t\tmaxValue,\n\t\t\tmaxValueScale,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\t// Predefine the metadata\n\t\tconst setpointValue = ThermostatSetpointCCValues.setpoint(this.type);\n\t\tthis.setMetadata(ctx, setpointValue, {\n\t\t\t...setpointValue.meta,\n\t\t\tmin: this.minValue,\n\t\t\tmax: this.maxValue,\n\t\t\tunit: getSetpointUnit(this.minValueScale)\n\t\t\t\t|| getSetpointUnit(this.maxValueScale),\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tpublic type: ThermostatSetpointType;\n\tpublic minValue: number;\n\tpublic maxValue: number;\n\tpublic minValueScale: number;\n\tpublic maxValueScale: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst min = encodeFloatWithScale(this.minValue, this.minValueScale);\n\t\tconst max = encodeFloatWithScale(this.maxValue, this.maxValueScale);\n\t\tthis.payload = Bytes.concat([Bytes.from([this.type]), min, max]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst minValueScale = getScale(this.minValueScale);\n\t\tconst maxValueScale = getScale(this.maxValueScale);\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.type,\n\t\t\t\t),\n\t\t\t\t\"min value\": `${this.minValue} ${minValueScale.unit}`,\n\t\t\t\t\"max value\": `${this.maxValue} ${maxValueScale.unit}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCCapabilitiesGetOptions {\n\tsetpointType: ThermostatSetpointType;\n}\n\n@CCCommand(ThermostatSetpointCommand.CapabilitiesGet)\n@expectedCCResponse(ThermostatSetpointCCCapabilitiesReport)\nexport class ThermostatSetpointCCCapabilitiesGet extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCCapabilitiesGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.setpointType = options.setpointType;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCCapabilitiesGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst setpointType: ThermostatSetpointType = raw.payload[0] & 0b1111;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsetpointType,\n\t\t});\n\t}\n\n\tpublic setpointType: ThermostatSetpointType;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.setpointType & 0b1111]);\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\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.setpointType,\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCSupportedReportOptions {\n\tsupportedSetpointTypes: ThermostatSetpointType[];\n}\n\n@CCCommand(ThermostatSetpointCommand.SupportedReport)\n@ccValueProperty(\n\t\"supportedSetpointTypes\",\n\tThermostatSetpointCCValues.supportedSetpointTypes,\n)\nexport class ThermostatSetpointCCSupportedReport extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tif (options.supportedSetpointTypes.length === 0) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`At least one setpoint type must be supported`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\t\tthis.supportedSetpointTypes = options.supportedSetpointTypes;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCSupportedReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst bitMask = raw.payload;\n\t\tconst supported = parseBitMask(\n\t\t\tbitMask,\n\t\t\tThermostatSetpointType[\"N/A\"],\n\t\t);\n\t\t// We use this command only when we are sure that bitmask interpretation A is used\n\t\t// FIXME: Figure out if we can do this without the CC version\n\t\tconst supportedSetpointTypes: ThermostatSetpointType[] = supported.map(\n\t\t\t(i) => thermostatSetpointTypeMap[i],\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsupportedSetpointTypes,\n\t\t});\n\t}\n\n\tpublic readonly supportedSetpointTypes: readonly ThermostatSetpointType[];\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = encodeBitMask(\n\t\t\t// Encode as interpretation A\n\t\t\tthis.supportedSetpointTypes\n\t\t\t\t.map((t) => thermostatSetpointTypeMap.indexOf(t))\n\t\t\t\t.filter((t) => t !== -1),\n\t\t\tundefined,\n\t\t\tThermostatSetpointType[\"N/A\"],\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\"supported setpoint types\": this.supportedSetpointTypes\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(t) =>\n\t\t\t\t\t\t\t`\\n\u00B7 ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\t\t\t\t\tt,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(ThermostatSetpointCommand.SupportedGet)\n@expectedCCResponse(ThermostatSetpointCCSupportedReport)\n/**\n * Issues a SupportedGet command to the node. Due to inconsistencies in interpretation,\n * this command should not be used for nodes with CC versions 1 or 2\n */\nexport class ThermostatSetpointCCSupportedGet extends ThermostatSetpointCC {}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { CCEncodingContext, CCParsingContext } from \"@zwave-js/cc\";\nimport {\n\tCommandClasses,\n\ttype GetValueDB,\n\ttype MaybeNotKnown,\n\ttype MessageOrCCLogEntry,\n\tMessagePriority,\n\ttype Scale,\n\ttype SupervisionResult,\n\tValueMetadata,\n\ttype ValueMetadataNumeric,\n\ttype WithAddress,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeBitMask,\n\tencodeFloatWithScale,\n\tgetNamedScale,\n\tgetUnknownScale,\n\tparseBitMask,\n\tparseFloatWithScale,\n\tsupervisedCommandSucceeded,\n\tvalidatePayload,\n} from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, pick } from \"@zwave-js/shared\";\nimport { validateArgs } from \"@zwave-js/transformers\";\nimport {\n\tCCAPI,\n\tPOLL_VALUE,\n\ttype PollValueImplementation,\n\tSET_VALUE,\n\ttype SetValueImplementation,\n\tthrowUnsupportedProperty,\n\tthrowWrongValueType,\n} from \"../lib/API.js\";\nimport {\n\ttype CCRaw,\n\tCommandClass,\n\ttype InterviewContext,\n\ttype PersistValuesContext,\n\ttype RefreshValuesContext,\n} from \"../lib/CommandClass.js\";\nimport {\n\tAPI,\n\tCCCommand,\n\tccValueProperty,\n\tccValues,\n\tcommandClass,\n\texpectedCCResponse,\n\timplementedVersion,\n\tuseSupervision,\n} from \"../lib/CommandClassDecorators.js\";\nimport { V } from \"../lib/Values.js\";\nimport {\n\tThermostatSetpointCommand,\n\tThermostatSetpointType,\n} from \"../lib/_Types.js\";\n\n// This array is used to map the advertised supported types (interpretation A)\n// to the actual enum values\nconst thermostatSetpointTypeMap = [\n\t0x00,\n\t0x01,\n\t0x02,\n\t0x07,\n\t0x08,\n\t0x09,\n\t0x0a,\n\t0x0b,\n\t0x0c,\n\t0x0d,\n\t0x0e,\n\t0x0f,\n];\n\nfunction getScale(scale: number): Scale {\n\treturn getNamedScale(\"temperature\", scale as any)\n\t\t?? getUnknownScale(scale);\n}\nfunction getSetpointUnit(scale: number): string {\n\treturn getScale(scale).unit ?? \"\";\n}\n\nexport const ThermostatSetpointCCValues = V.defineCCValues(\n\tCommandClasses[\"Thermostat Setpoint\"],\n\t{\n\t\t...V.staticProperty(\"supportedSetpointTypes\", undefined, {\n\t\t\tinternal: true,\n\t\t}),\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"setpoint\",\n\t\t\t\"setpoint\",\n\t\t\t(setpointType: ThermostatSetpointType) => setpointType,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"setpoint\" && typeof propertyKey === \"number\",\n\t\t\t(setpointType: ThermostatSetpointType) => ({\n\t\t\t\t...ValueMetadata.Number,\n\t\t\t\tlabel: `Setpoint (${\n\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\t\tsetpointType,\n\t\t\t\t\t)\n\t\t\t\t})`,\n\t\t\t\tccSpecific: { setpointType },\n\t\t\t} as const),\n\t\t),\n\t\t...V.dynamicPropertyAndKeyWithName(\n\t\t\t\"setpointScale\",\n\t\t\t\"setpointScale\",\n\t\t\t(setpointType: ThermostatSetpointType) => setpointType,\n\t\t\t({ property, propertyKey }) =>\n\t\t\t\tproperty === \"setpointScale\" && typeof propertyKey === \"number\",\n\t\t\tundefined,\n\t\t\t{ internal: true },\n\t\t),\n\t},\n);\n\n@API(CommandClasses[\"Thermostat Setpoint\"])\nexport class ThermostatSetpointCCAPI extends CCAPI {\n\tpublic supportsCommand(\n\t\tcmd: ThermostatSetpointCommand,\n\t): MaybeNotKnown<boolean> {\n\t\tswitch (cmd) {\n\t\t\tcase ThermostatSetpointCommand.Get:\n\t\t\tcase ThermostatSetpointCommand.SupportedGet:\n\t\t\t\treturn this.isSinglecast();\n\t\t\tcase ThermostatSetpointCommand.Set:\n\t\t\t\treturn true; // This is mandatory\n\t\t\tcase ThermostatSetpointCommand.CapabilitiesGet:\n\t\t\t\treturn this.version >= 3 && this.isSinglecast();\n\t\t}\n\t\treturn super.supportsCommand(cmd);\n\t}\n\n\tprotected override get [SET_VALUE](): SetValueImplementation {\n\t\treturn async function(\n\t\t\tthis: ThermostatSetpointCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t\tvalue,\n\t\t) {\n\t\t\tif (property !== \"setpoint\") {\n\t\t\t\tthrowUnsupportedProperty(this.ccId, property);\n\t\t\t}\n\t\t\tif (typeof propertyKey !== \"number\") {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`${\n\t\t\t\t\t\tCommandClasses[this.ccId]\n\t\t\t\t\t}: \"${property}\" must be further specified by a numeric property key`,\n\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t);\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\n\t\t\t// SDS14223: The Scale field value MUST be identical to the value received in the Thermostat Setpoint Report for the\n\t\t\t// actual Setpoint Type during the node interview. Fall back to the first scale if none is known\n\t\t\tconst preferredScale = this.tryGetValueDB()?.getValue<number>(\n\t\t\t\tThermostatSetpointCCValues.setpointScale(propertyKey).endpoint(\n\t\t\t\t\tthis.endpoint.index,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst result = await this.set(\n\t\t\t\tpropertyKey,\n\t\t\t\tvalue,\n\t\t\t\tpreferredScale ?? 0,\n\t\t\t);\n\n\t\t\t// Verify the current value after a delay, unless the command was supervised and successful\n\t\t\tif (this.isSinglecast() && !supervisedCommandSucceeded(result)) {\n\t\t\t\t// TODO: Ideally this would be a short delay, but some thermostats like Remotec ZXT-600\n\t\t\t\t// aren't able to handle the GET this quickly.\n\t\t\t\tthis.schedulePoll({ property, propertyKey }, value);\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(\n\t\t\tthis: ThermostatSetpointCCAPI,\n\t\t\t{ property, propertyKey },\n\t\t) {\n\t\t\tswitch (property) {\n\t\t\t\tcase \"setpoint\":\n\t\t\t\t\tif (typeof propertyKey !== \"number\") {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t`${\n\t\t\t\t\t\t\t\tCommandClasses[this.ccId]\n\t\t\t\t\t\t\t}: \"${property}\" must be further specified by a numeric property key`,\n\t\t\t\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (await this.get(propertyKey))?.value;\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@validateArgs()\n\tpublic async get(\n\t\tsetpointType: ThermostatSetpointType,\n\t): Promise<{ value: number; scale: Scale } | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatSetpointCommand,\n\t\t\tThermostatSetpointCommand.Get,\n\t\t);\n\n\t\tconst cc = new ThermostatSetpointCCGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsetpointType,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tThermostatSetpointCCReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\tif (!response) return;\n\t\tif (response.type !== ThermostatSetpointType[\"N/A\"]) {\n\t\t\t// This is a supported setpoint\n\t\t\tconst scale = getScale(response.scale);\n\t\t\treturn {\n\t\t\t\tvalue: response.value,\n\t\t\t\tscale,\n\t\t\t};\n\t\t}\n\t}\n\n\t@validateArgs()\n\tpublic async set(\n\t\tsetpointType: ThermostatSetpointType,\n\t\tvalue: number,\n\t\tscale: number,\n\t): Promise<SupervisionResult | undefined> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatSetpointCommand,\n\t\t\tThermostatSetpointCommand.Set,\n\t\t);\n\n\t\tconst cc = new ThermostatSetpointCCSet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsetpointType,\n\t\t\tvalue,\n\t\t\tscale,\n\t\t});\n\t\treturn this.host.sendCommand(cc, this.commandOptions);\n\t}\n\n\t@validateArgs()\n\t// oxlint-disable-next-line typescript/explicit-module-boundary-types\n\tpublic async getCapabilities(setpointType: ThermostatSetpointType) {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatSetpointCommand,\n\t\t\tThermostatSetpointCommand.CapabilitiesGet,\n\t\t);\n\n\t\tconst cc = new ThermostatSetpointCCCapabilitiesGet({\n\t\t\tnodeId: this.endpoint.nodeId,\n\t\t\tendpointIndex: this.endpoint.index,\n\t\t\tsetpointType,\n\t\t});\n\t\tconst response = await this.host.sendCommand<\n\t\t\tThermostatSetpointCCCapabilitiesReport\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\"minValue\",\n\t\t\t\t\"maxValue\",\n\t\t\t\t\"minValueScale\",\n\t\t\t\t\"maxValueScale\",\n\t\t\t]);\n\t\t}\n\t}\n\n\t/**\n\t * Requests the supported setpoint types from the node. Due to inconsistencies it is NOT recommended\n\t * to use this method on nodes with CC versions 1 and 2. Instead rely on the information determined\n\t * during node interview.\n\t */\n\tpublic async getSupportedSetpointTypes(): Promise<\n\t\tMaybeNotKnown<readonly ThermostatSetpointType[]>\n\t> {\n\t\tthis.assertSupportsCommand(\n\t\t\tThermostatSetpointCommand,\n\t\t\tThermostatSetpointCommand.SupportedGet,\n\t\t);\n\n\t\tconst cc = new ThermostatSetpointCCSupportedGet({\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\tThermostatSetpointCCSupportedReport\n\t\t>(\n\t\t\tcc,\n\t\t\tthis.commandOptions,\n\t\t);\n\t\treturn response?.supportedSetpointTypes;\n\t}\n}\n\n@commandClass(CommandClasses[\"Thermostat Setpoint\"])\n@implementedVersion(3)\n@ccValues(ThermostatSetpointCCValues)\nexport class ThermostatSetpointCC extends CommandClass {\n\tdeclare ccCommand: ThermostatSetpointCommand;\n\n\tpublic translatePropertyKey(\n\t\tctx: GetValueDB,\n\t\tproperty: string | number,\n\t\tpropertyKey: string | number,\n\t): string | undefined {\n\t\tif (property === \"setpoint\") {\n\t\t\treturn getEnumMemberName(\n\t\t\t\tThermostatSetpointType,\n\t\t\t\tpropertyKey as any,\n\t\t\t);\n\t\t} else {\n\t\t\treturn super.translatePropertyKey(ctx, property, propertyKey);\n\t\t}\n\t}\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[\"Thermostat Setpoint\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tctx.logNode(node.id, {\n\t\t\tendpoint: this.endpointIndex,\n\t\t\tmessage: `Interviewing ${this.ccName}...`,\n\t\t\tdirection: \"none\",\n\t\t});\n\n\t\tif (api.version <= 2) {\n\t\t\t// It has been found that early implementations of this Command Class applied two non-interoperable\n\t\t\t// interpretations of the bit mask advertising the support for specific Setpoint Types in the Thermostat\n\t\t\t// Setpoint Supported Report Command.\n\t\t\t// A controlling node SHOULD determine the supported Setpoint Types of a version 1 and version 2\n\t\t\t// supporting node by sending one Thermostat Setpoint Get Command at a time while incrementing\n\t\t\t// the requested Setpoint Type.\n\t\t\t// If the same Setpoint Type is advertised in the returned Thermostat Setpoint Report Command, the\n\t\t\t// controlling node MUST conclude that the actual Setpoint Type is supported.\n\t\t\t// If the Setpoint Type 0x00 (type N/A) is advertised in the returned Thermostat Setpoint Report\n\t\t\t// Command, the controlling node MUST conclude that the actual Setpoint Type is not supported.\n\n\t\t\t// The specs require us to query the list of supported setpoint types anyways, even if the response is ignored\n\t\t\tawait api.getSupportedSetpointTypes();\n\n\t\t\t// Now scan all endpoints. Each type we received a value for gets marked as supported\n\t\t\tconst supportedSetpointTypes: ThermostatSetpointType[] = [];\n\t\t\tfor (\n\t\t\t\tlet type: ThermostatSetpointType =\n\t\t\t\t\tThermostatSetpointType.Heating;\n\t\t\t\ttype <= ThermostatSetpointType[\"Full Power\"];\n\t\t\t\ttype++\n\t\t\t) {\n\t\t\t\tconst setpointName = getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\ttype,\n\t\t\t\t);\n\t\t\t\t// Every time, query the current value\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`querying current value of setpoint ${setpointName}...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\n\t\t\t\tconst setpoint = await api.get(type);\n\t\t\t\t// If the node did not respond, assume the setpoint type is not supported\n\n\t\t\t\tlet logMessage: string;\n\t\t\t\tif (setpoint) {\n\t\t\t\t\t// Setpoint supported, remember the type\n\t\t\t\t\tsupportedSetpointTypes.push(type);\n\t\t\t\t\tlogMessage =\n\t\t\t\t\t\t`received current value of setpoint ${setpointName}: ${setpoint.value} ${\n\t\t\t\t\t\t\tsetpoint.scale.unit ?? \"\"\n\t\t\t\t\t\t}`;\n\t\t\t\t} else {\n\t\t\t\t\t// We're sure about the interpretation - this should not happen\n\t\t\t\t\tlogMessage = `setpoint ${setpointName} is not supported`;\n\t\t\t\t}\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\t\t\t}\n\n\t\t\t// Remember which setpoint types are actually supported\n\t\t\tthis.setValue(\n\t\t\t\tctx,\n\t\t\t\tThermostatSetpointCCValues.supportedSetpointTypes,\n\t\t\t\tsupportedSetpointTypes,\n\t\t\t);\n\t\t} else {\n\t\t\t// Versions >= 3 adhere to bitmap interpretation A, so we can rely on getSupportedSetpointTypes\n\n\t\t\t// Query the supported setpoint types\n\t\t\tlet setpointTypes: ThermostatSetpointType[] = [];\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage: \"retrieving supported setpoint types...\",\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst resp = await api.getSupportedSetpointTypes();\n\t\t\tif (resp) {\n\t\t\t\tsetpointTypes = [...resp];\n\t\t\t\tconst logMessage = \"received supported setpoint types:\\n\"\n\t\t\t\t\t+ setpointTypes\n\t\t\t\t\t\t.map((type) =>\n\t\t\t\t\t\t\tgetEnumMemberName(ThermostatSetpointType, type)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((name) => `\u00B7 ${name}`)\n\t\t\t\t\t\t.join(\"\\n\");\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\t\t\t} else {\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\"Querying supported setpoint types timed out, skipping interview...\",\n\t\t\t\t\tlevel: \"warn\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (const type of setpointTypes) {\n\t\t\t\tconst setpointName = getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\ttype,\n\t\t\t\t);\n\t\t\t\t// Find out the capabilities of this setpoint\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 capabilities for setpoint ${setpointName}...`,\n\t\t\t\t\tdirection: \"outbound\",\n\t\t\t\t});\n\t\t\t\tconst setpointCaps = await api.getCapabilities(type);\n\t\t\t\tif (setpointCaps) {\n\t\t\t\t\tconst minValueUnit = getSetpointUnit(\n\t\t\t\t\t\tsetpointCaps.minValueScale,\n\t\t\t\t\t);\n\t\t\t\t\tconst maxValueUnit = getSetpointUnit(\n\t\t\t\t\t\tsetpointCaps.maxValueScale,\n\t\t\t\t\t);\n\t\t\t\t\tconst logMessage =\n\t\t\t\t\t\t`received capabilities for setpoint ${setpointName}:\nminimum value: ${setpointCaps.minValue} ${minValueUnit}\nmaximum value: ${setpointCaps.maxValue} ${maxValueUnit}`;\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}\n\t\t\t}\n\n\t\t\t// Query the current value for all setpoint types\n\t\t\tawait this.refreshValues(ctx);\n\t\t}\n\n\t\t// Remember that the interview is complete\n\t\tthis.setInterviewComplete(ctx, true);\n\t}\n\n\tpublic async refreshValues(\n\t\tctx: RefreshValuesContext,\n\t): Promise<void> {\n\t\tconst node = this.getNode(ctx)!;\n\t\tconst endpoint = this.getEndpoint(ctx)!;\n\t\tconst api = CCAPI.create(\n\t\t\tCommandClasses[\"Thermostat Setpoint\"],\n\t\t\tctx,\n\t\t\tendpoint,\n\t\t).withOptions({\n\t\t\tpriority: MessagePriority.NodeQuery,\n\t\t});\n\n\t\tconst setpointTypes: ThermostatSetpointType[] = this.getValue(\n\t\t\tctx,\n\t\t\tThermostatSetpointCCValues.supportedSetpointTypes,\n\t\t) ?? [];\n\n\t\t// Query each setpoint's current value\n\t\tfor (const type of setpointTypes) {\n\t\t\tconst setpointName = getEnumMemberName(\n\t\t\t\tThermostatSetpointType,\n\t\t\t\ttype,\n\t\t\t);\n\t\t\t// Every time, query the current value\n\t\t\tctx.logNode(node.id, {\n\t\t\t\tendpoint: this.endpointIndex,\n\t\t\t\tmessage:\n\t\t\t\t\t`querying current value of setpoint ${setpointName}...`,\n\t\t\t\tdirection: \"outbound\",\n\t\t\t});\n\t\t\tconst setpoint = await api.get(type);\n\t\t\tif (setpoint) {\n\t\t\t\tconst logMessage =\n\t\t\t\t\t`received current value of setpoint ${setpointName}: ${setpoint.value} ${\n\t\t\t\t\t\tsetpoint.scale.unit ?? \"\"\n\t\t\t\t\t}`;\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\t\t\t}\n\t\t}\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCSetOptions {\n\tsetpointType: ThermostatSetpointType;\n\tvalue: number;\n\tscale: number;\n}\n\n@CCCommand(ThermostatSetpointCommand.Set)\n@useSupervision()\nexport class ThermostatSetpointCCSet extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCSetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.setpointType = options.setpointType;\n\t\tthis.value = options.value;\n\t\tthis.scale = options.scale;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCSet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst setpointType: ThermostatSetpointType = raw.payload[0] & 0b1111;\n\n\t\t// parseFloatWithScale does its own validation\n\t\tconst { value, scale } = parseFloatWithScale(\n\t\t\traw.payload.subarray(1),\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsetpointType,\n\t\t\tvalue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic setpointType: ThermostatSetpointType;\n\tpublic value: number;\n\tpublic scale: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\t// If a config file overwrites how the float should be encoded, use that information\n\t\tconst override = ctx.getDeviceConfig?.(this.nodeId as number)\n\t\t\t?.compat?.overrideFloatEncoding;\n\t\tthis.payload = Bytes.concat([\n\t\t\t[this.setpointType & 0b1111],\n\t\t\tencodeFloatWithScale(this.value, this.scale, override),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst scale = getScale(this.scale);\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.setpointType,\n\t\t\t\t),\n\t\t\t\tvalue: `${this.value} ${scale.unit}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCReportOptions {\n\ttype: ThermostatSetpointType;\n\tvalue: number;\n\tscale: number;\n}\n\n@CCCommand(ThermostatSetpointCommand.Report)\nexport class ThermostatSetpointCCReport extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.value = options.value;\n\t\tthis.scale = options.scale;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst type: ThermostatSetpointType = raw.payload[0] & 0b1111;\n\n\t\tif (type === 0) {\n\t\t\t// Not supported\n\t\t\treturn new this({\n\t\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\t\ttype,\n\t\t\t\tvalue: 0,\n\t\t\t\tscale: 0,\n\t\t\t});\n\t\t}\n\n\t\t// parseFloatWithScale does its own validation\n\t\tconst { value, scale } = parseFloatWithScale(\n\t\t\traw.payload.subarray(1),\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\tvalue,\n\t\t\tscale,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\tconst scale = getScale(this.scale);\n\n\t\tconst setpointValue = ThermostatSetpointCCValues.setpoint(this.type);\n\t\tconst existingMetadata = this.getMetadata<ValueMetadataNumeric>(\n\t\t\tctx,\n\t\t\tsetpointValue,\n\t\t);\n\n\t\t// Update the metadata when it is missing or the unit has changed\n\t\tif (existingMetadata?.unit !== scale.unit) {\n\t\t\tthis.setMetadata(ctx, setpointValue, {\n\t\t\t\t...(existingMetadata ?? setpointValue.meta),\n\t\t\t\tunit: scale.unit,\n\t\t\t});\n\t\t}\n\t\tthis.setValue(ctx, setpointValue, this.value);\n\n\t\t// Remember the device-preferred setpoint scale so it can be used in SET commands\n\t\tthis.setValue(\n\t\t\tctx,\n\t\t\tThermostatSetpointCCValues.setpointScale(this.type),\n\t\t\tscale.key,\n\t\t);\n\t\treturn true;\n\t}\n\n\tpublic type: ThermostatSetpointType;\n\tpublic scale: number;\n\tpublic value: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.concat([\n\t\t\t[this.type & 0b1111],\n\t\t\tencodeFloatWithScale(this.value, this.scale),\n\t\t]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst scale = getScale(this.scale);\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.type,\n\t\t\t\t),\n\t\t\t\tvalue: `${this.value} ${scale.unit}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\nfunction testResponseForThermostatSetpointGet(\n\tsent: ThermostatSetpointCCGet,\n\treceived: ThermostatSetpointCCReport,\n) {\n\t// We expect a Thermostat Setpoint Report that matches the requested setpoint type\n\treturn received.type === sent.setpointType;\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCGetOptions {\n\tsetpointType: ThermostatSetpointType;\n}\n\n@CCCommand(ThermostatSetpointCommand.Get)\n@expectedCCResponse(\n\tThermostatSetpointCCReport,\n\ttestResponseForThermostatSetpointGet,\n)\nexport class ThermostatSetpointCCGet extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.setpointType = options.setpointType;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst setpointType: ThermostatSetpointType = raw.payload[0] & 0b1111;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsetpointType,\n\t\t});\n\t}\n\n\tpublic setpointType: ThermostatSetpointType;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.setpointType & 0b1111]);\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\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.setpointType,\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCCapabilitiesReportOptions {\n\ttype: ThermostatSetpointType;\n\tminValue: number;\n\tminValueScale: number;\n\tmaxValue: number;\n\tmaxValueScale: number;\n}\n\n@CCCommand(ThermostatSetpointCommand.CapabilitiesReport)\nexport class ThermostatSetpointCCCapabilitiesReport\n\textends ThermostatSetpointCC\n{\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCCapabilitiesReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tthis.type = options.type;\n\t\tthis.minValue = options.minValue;\n\t\tthis.minValueScale = options.minValueScale;\n\t\tthis.maxValue = options.maxValue;\n\t\tthis.maxValueScale = options.maxValueScale;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCCapabilitiesReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst type: ThermostatSetpointType = raw.payload[0];\n\t\t// parseFloatWithScale does its own validation\n\t\tconst {\n\t\t\tvalue: minValue,\n\t\t\tscale: minValueScale,\n\t\t\tbytesRead,\n\t\t} = parseFloatWithScale(raw.payload.subarray(1));\n\t\tconst { value: maxValue, scale: maxValueScale } = parseFloatWithScale(\n\t\t\traw.payload.subarray(1 + bytesRead),\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\ttype,\n\t\t\tminValue,\n\t\t\tminValueScale,\n\t\t\tmaxValue,\n\t\t\tmaxValueScale,\n\t\t});\n\t}\n\n\tpublic persistValues(ctx: PersistValuesContext): boolean {\n\t\tif (!super.persistValues(ctx)) return false;\n\n\t\t// Predefine the metadata\n\t\tconst setpointValue = ThermostatSetpointCCValues.setpoint(this.type);\n\t\tthis.setMetadata(ctx, setpointValue, {\n\t\t\t...setpointValue.meta,\n\t\t\tmin: this.minValue,\n\t\t\tmax: this.maxValue,\n\t\t\tunit: getSetpointUnit(this.minValueScale)\n\t\t\t\t|| getSetpointUnit(this.maxValueScale),\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tpublic type: ThermostatSetpointType;\n\tpublic minValue: number;\n\tpublic maxValue: number;\n\tpublic minValueScale: number;\n\tpublic maxValueScale: number;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tconst min = encodeFloatWithScale(this.minValue, this.minValueScale);\n\t\tconst max = encodeFloatWithScale(this.maxValue, this.maxValueScale);\n\t\tthis.payload = Bytes.concat([[this.type], min, max]);\n\t\treturn super.serialize(ctx);\n\t}\n\n\tpublic toLogEntry(ctx?: GetValueDB): MessageOrCCLogEntry {\n\t\tconst minValueScale = getScale(this.minValueScale);\n\t\tconst maxValueScale = getScale(this.maxValueScale);\n\t\treturn {\n\t\t\t...super.toLogEntry(ctx),\n\t\t\tmessage: {\n\t\t\t\t\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.type,\n\t\t\t\t),\n\t\t\t\t\"min value\": `${this.minValue} ${minValueScale.unit}`,\n\t\t\t\t\"max value\": `${this.maxValue} ${maxValueScale.unit}`,\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCCapabilitiesGetOptions {\n\tsetpointType: ThermostatSetpointType;\n}\n\n@CCCommand(ThermostatSetpointCommand.CapabilitiesGet)\n@expectedCCResponse(ThermostatSetpointCCCapabilitiesReport)\nexport class ThermostatSetpointCCCapabilitiesGet extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCCapabilitiesGetOptions>,\n\t) {\n\t\tsuper(options);\n\t\tthis.setpointType = options.setpointType;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCCapabilitiesGet {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst setpointType: ThermostatSetpointType = raw.payload[0] & 0b1111;\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsetpointType,\n\t\t});\n\t}\n\n\tpublic setpointType: ThermostatSetpointType;\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = Bytes.from([this.setpointType & 0b1111]);\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\"setpoint type\": getEnumMemberName(\n\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\tthis.setpointType,\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\t}\n}\n\n// @publicAPI\nexport interface ThermostatSetpointCCSupportedReportOptions {\n\tsupportedSetpointTypes: ThermostatSetpointType[];\n}\n\n@CCCommand(ThermostatSetpointCommand.SupportedReport)\n@ccValueProperty(\n\t\"supportedSetpointTypes\",\n\tThermostatSetpointCCValues.supportedSetpointTypes,\n)\nexport class ThermostatSetpointCCSupportedReport extends ThermostatSetpointCC {\n\tpublic constructor(\n\t\toptions: WithAddress<ThermostatSetpointCCSupportedReportOptions>,\n\t) {\n\t\tsuper(options);\n\n\t\tif (options.supportedSetpointTypes.length === 0) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`At least one setpoint type must be supported`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\t\tthis.supportedSetpointTypes = options.supportedSetpointTypes;\n\t}\n\n\tpublic static from(\n\t\traw: CCRaw,\n\t\tctx: CCParsingContext,\n\t): ThermostatSetpointCCSupportedReport {\n\t\tvalidatePayload(raw.payload.length >= 1);\n\t\tconst bitMask = raw.payload;\n\t\tconst supported = parseBitMask(\n\t\t\tbitMask,\n\t\t\tThermostatSetpointType[\"N/A\"],\n\t\t);\n\t\t// We use this command only when we are sure that bitmask interpretation A is used\n\t\t// FIXME: Figure out if we can do this without the CC version\n\t\tconst supportedSetpointTypes: ThermostatSetpointType[] = supported.map(\n\t\t\t(i) => thermostatSetpointTypeMap[i],\n\t\t);\n\n\t\treturn new this({\n\t\t\tnodeId: ctx.sourceNodeId,\n\t\t\tsupportedSetpointTypes,\n\t\t});\n\t}\n\n\tpublic readonly supportedSetpointTypes: readonly ThermostatSetpointType[];\n\n\tpublic serialize(ctx: CCEncodingContext): Promise<Bytes> {\n\t\tthis.payload = encodeBitMask(\n\t\t\t// Encode as interpretation A\n\t\t\tthis.supportedSetpointTypes\n\t\t\t\t.map((t) => thermostatSetpointTypeMap.indexOf(t))\n\t\t\t\t.filter((t) => t !== -1),\n\t\t\tundefined,\n\t\t\tThermostatSetpointType[\"N/A\"],\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\"supported setpoint types\": this.supportedSetpointTypes\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(t) =>\n\t\t\t\t\t\t\t`\\n\u00B7 ${\n\t\t\t\t\t\t\t\tgetEnumMemberName(\n\t\t\t\t\t\t\t\t\tThermostatSetpointType,\n\t\t\t\t\t\t\t\t\tt,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"\"),\n\t\t\t},\n\t\t};\n\t}\n}\n\n@CCCommand(ThermostatSetpointCommand.SupportedGet)\n@expectedCCResponse(ThermostatSetpointCCSupportedReport)\n/**\n * Issues a SupportedGet command to the node. Due to inconsistencies in interpretation,\n * this command should not be used for nodes with CC versions 1 or 2\n */\nexport class ThermostatSetpointCCSupportedGet extends ThermostatSetpointCC {}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -486,14 +486,14 @@ let TimeCCTimeOffsetSet = (() => {
486
486
  standardOffset: this.standardOffset,
487
487
  dstOffset: this.dstOffset
488
488
  }),
489
- import_shared.Bytes.from([
489
+ [
490
490
  this.dstStartDate.getUTCMonth() + 1,
491
491
  this.dstStartDate.getUTCDate(),
492
492
  this.dstStartDate.getUTCHours(),
493
493
  this.dstEndDate.getUTCMonth() + 1,
494
494
  this.dstEndDate.getUTCDate(),
495
495
  this.dstEndDate.getUTCHours()
496
- ])
496
+ ]
497
497
  ]);
498
498
  return super.serialize(ctx);
499
499
  }
@@ -562,14 +562,14 @@ let TimeCCTimeOffsetReport = (() => {
562
562
  standardOffset: this.standardOffset,
563
563
  dstOffset: this.dstOffset
564
564
  }),
565
- import_shared.Bytes.from([
565
+ [
566
566
  this.dstStartDate.getUTCMonth() + 1,
567
567
  this.dstStartDate.getUTCDate(),
568
568
  this.dstStartDate.getUTCHours(),
569
569
  this.dstEndDate.getUTCMonth() + 1,
570
570
  this.dstEndDate.getUTCDate(),
571
571
  this.dstEndDate.getUTCHours()
572
- ])
572
+ ]
573
573
  ]);
574
574
  return super.serialize(ctx);
575
575
  }