matterbridge 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/CHANGELOG.md +53 -1
  2. package/README-DEV.md +0 -4
  3. package/README-NGINX.md +63 -0
  4. package/README.md +8 -0
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.js +18 -8
  7. package/dist/cli.js.map +1 -1
  8. package/dist/defaultConfigSchema.d.ts +1 -1
  9. package/dist/defaultConfigSchema.js +1 -1
  10. package/dist/deviceManager.d.ts +2 -2
  11. package/dist/deviceManager.d.ts.map +1 -1
  12. package/dist/deviceManager.js +2 -2
  13. package/dist/deviceManager.js.map +1 -1
  14. package/dist/index.d.ts +10 -10
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +24 -11
  17. package/dist/index.js.map +1 -1
  18. package/dist/matter/export.d.ts +5 -0
  19. package/dist/matter/export.d.ts.map +1 -0
  20. package/dist/matter/export.js +5 -0
  21. package/dist/matter/export.js.map +1 -0
  22. package/dist/matterbridge.d.ts +32 -16
  23. package/dist/matterbridge.d.ts.map +1 -1
  24. package/dist/matterbridge.js +254 -115
  25. package/dist/matterbridge.js.map +1 -1
  26. package/dist/matterbridgeAccessoryPlatform.d.ts +1 -1
  27. package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -1
  28. package/dist/matterbridgeAccessoryPlatform.js +1 -1
  29. package/dist/matterbridgeAccessoryPlatform.js.map +1 -1
  30. package/dist/matterbridgeBehaviors.d.ts +1123 -0
  31. package/dist/matterbridgeBehaviors.d.ts.map +1 -0
  32. package/dist/matterbridgeBehaviors.js +281 -0
  33. package/dist/matterbridgeBehaviors.js.map +1 -0
  34. package/dist/matterbridgeDevice.d.ts +2069 -1511
  35. package/dist/matterbridgeDevice.d.ts.map +1 -1
  36. package/dist/matterbridgeDevice.js +192 -196
  37. package/dist/matterbridgeDevice.js.map +1 -1
  38. package/dist/matterbridgeDeviceTypes.d.ts +58 -0
  39. package/dist/matterbridgeDeviceTypes.d.ts.map +1 -0
  40. package/dist/matterbridgeDeviceTypes.js +308 -0
  41. package/dist/matterbridgeDeviceTypes.js.map +1 -0
  42. package/dist/matterbridgeDynamicPlatform.d.ts +1 -1
  43. package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -1
  44. package/dist/matterbridgeDynamicPlatform.js +1 -1
  45. package/dist/matterbridgeDynamicPlatform.js.map +1 -1
  46. package/dist/matterbridgeEdge.d.ts +20 -21
  47. package/dist/matterbridgeEdge.d.ts.map +1 -1
  48. package/dist/matterbridgeEdge.js +506 -103
  49. package/dist/matterbridgeEdge.js.map +1 -1
  50. package/dist/matterbridgeEndpoint.d.ts +3545 -2336
  51. package/dist/matterbridgeEndpoint.d.ts.map +1 -1
  52. package/dist/matterbridgeEndpoint.js +672 -468
  53. package/dist/matterbridgeEndpoint.js.map +1 -1
  54. package/dist/matterbridgePlatform.d.ts +5 -4
  55. package/dist/matterbridgePlatform.d.ts.map +1 -1
  56. package/dist/matterbridgePlatform.js +11 -3
  57. package/dist/matterbridgePlatform.js.map +1 -1
  58. package/dist/matterbridgeTypes.d.ts +7 -8
  59. package/dist/matterbridgeTypes.d.ts.map +1 -1
  60. package/dist/matterbridgeTypes.js.map +1 -1
  61. package/dist/matterbridgeWebsocket.d.ts +1 -1
  62. package/dist/matterbridgeWebsocket.d.ts.map +1 -1
  63. package/dist/matterbridgeWebsocket.js +41 -3
  64. package/dist/matterbridgeWebsocket.js.map +1 -1
  65. package/dist/pluginManager.d.ts +1 -1
  66. package/dist/pluginManager.d.ts.map +1 -1
  67. package/dist/pluginManager.js +17 -8
  68. package/dist/pluginManager.js.map +1 -1
  69. package/dist/utils/colorUtils.d.ts +1 -1
  70. package/dist/utils/colorUtils.js +2 -2
  71. package/dist/utils/colorUtils.js.map +1 -1
  72. package/dist/utils/utils.d.ts +42 -1
  73. package/dist/utils/utils.d.ts.map +1 -1
  74. package/dist/utils/utils.js +105 -3
  75. package/dist/utils/utils.js.map +1 -1
  76. package/frontend/build/asset-manifest.json +62 -6
  77. package/frontend/build/index.html +1 -1
  78. package/frontend/build/static/css/main.823e08b6.css +2 -0
  79. package/frontend/build/static/css/main.823e08b6.css.map +1 -0
  80. package/frontend/build/static/js/main.a14c87e7.js +115 -0
  81. package/frontend/build/static/js/{main.045d08f7.js.LICENSE.txt → main.a14c87e7.js.LICENSE.txt} +3 -3
  82. package/frontend/build/static/js/main.a14c87e7.js.map +1 -0
  83. package/frontend/build/static/media/roboto-cyrillic-300-normal.1b79538ccd585c259996.woff2 +0 -0
  84. package/frontend/build/static/media/roboto-cyrillic-300-normal.5f077fd7b977d1715acf.woff +0 -0
  85. package/frontend/build/static/media/roboto-cyrillic-400-normal.5d2930082227d172f62c.woff +0 -0
  86. package/frontend/build/static/media/roboto-cyrillic-400-normal.a9e19870cf6c4b973427.woff2 +0 -0
  87. package/frontend/build/static/media/roboto-cyrillic-500-normal.0ae2428323939af5e1ad.woff2 +0 -0
  88. package/frontend/build/static/media/roboto-cyrillic-500-normal.dd7bc8a52c6c70c5a3f5.woff +0 -0
  89. package/frontend/build/static/media/roboto-cyrillic-700-normal.3f6e1548bd5175a8c342.woff +0 -0
  90. package/frontend/build/static/media/roboto-cyrillic-700-normal.4fdfc29a10e7d4b7c527.woff2 +0 -0
  91. package/frontend/build/static/media/roboto-cyrillic-ext-300-normal.795dbc8140e3fef82983.woff +0 -0
  92. package/frontend/build/static/media/roboto-cyrillic-ext-300-normal.80947a31d23c70204b47.woff2 +0 -0
  93. package/frontend/build/static/media/roboto-cyrillic-ext-400-normal.135d076fa32aa0b4d105.woff +0 -0
  94. package/frontend/build/static/media/roboto-cyrillic-ext-400-normal.5cec61a21cc20180fbe1.woff2 +0 -0
  95. package/frontend/build/static/media/roboto-cyrillic-ext-500-normal.6de16332fda843a3dc3d.woff2 +0 -0
  96. package/frontend/build/static/media/roboto-cyrillic-ext-500-normal.c0a0638f90b31d6454ba.woff +0 -0
  97. package/frontend/build/static/media/roboto-cyrillic-ext-700-normal.4750292c47fa2bc6ac1a.woff2 +0 -0
  98. package/frontend/build/static/media/roboto-cyrillic-ext-700-normal.ca247189fc12d00de361.woff +0 -0
  99. package/frontend/build/static/media/roboto-greek-300-normal.285f3e6261d8eb20417d.woff2 +0 -0
  100. package/frontend/build/static/media/roboto-greek-300-normal.889beddda1c9bd9f97df.woff +0 -0
  101. package/frontend/build/static/media/roboto-greek-400-normal.160a791a8e4f46bca3cc.woff +0 -0
  102. package/frontend/build/static/media/roboto-greek-400-normal.2c32b1315be61477013a.woff2 +0 -0
  103. package/frontend/build/static/media/roboto-greek-500-normal.60810e07c7b0273013aa.woff +0 -0
  104. package/frontend/build/static/media/roboto-greek-500-normal.f95e757c5483310f9c11.woff2 +0 -0
  105. package/frontend/build/static/media/roboto-greek-700-normal.77dd370f2001e184ba0d.woff2 +0 -0
  106. package/frontend/build/static/media/roboto-greek-700-normal.df87b053fae3d7ad5f7a.woff +0 -0
  107. package/frontend/build/static/media/roboto-greek-ext-300-normal.b590dbe5c639944366d1.woff +0 -0
  108. package/frontend/build/static/media/roboto-greek-ext-300-normal.d6049cb54aa6fbe14c42.woff2 +0 -0
  109. package/frontend/build/static/media/roboto-greek-ext-400-normal.16eb83b4a3b1ea994243.woff +0 -0
  110. package/frontend/build/static/media/roboto-greek-ext-400-normal.1df4abad55796d11a0c8.woff2 +0 -0
  111. package/frontend/build/static/media/roboto-greek-ext-500-normal.4a96ba31abcce0f5d52b.woff2 +0 -0
  112. package/frontend/build/static/media/roboto-greek-ext-500-normal.fd28d9c008bf3af1bed7.woff +0 -0
  113. package/frontend/build/static/media/roboto-greek-ext-700-normal.2dd6febad11502dec6a6.woff2 +0 -0
  114. package/frontend/build/static/media/roboto-greek-ext-700-normal.4abdc9fff4507f17d726.woff +0 -0
  115. package/frontend/build/static/media/roboto-latin-300-normal.b850f1ff581ea232fac9.woff2 +0 -0
  116. package/frontend/build/static/media/roboto-latin-300-normal.c4bc0593c9954d79cb3a.woff +0 -0
  117. package/frontend/build/static/media/roboto-latin-400-normal.047a7839f69b209db815.woff +0 -0
  118. package/frontend/build/static/media/roboto-latin-400-normal.297d48e1b5a10c0831a9.woff2 +0 -0
  119. package/frontend/build/static/media/roboto-latin-500-normal.68d40d6d01c6f85d24ba.woff +0 -0
  120. package/frontend/build/static/media/roboto-latin-500-normal.7077203b1982951ecf76.woff2 +0 -0
  121. package/frontend/build/static/media/roboto-latin-700-normal.4535474e1cf8598695ad.woff2 +0 -0
  122. package/frontend/build/static/media/roboto-latin-700-normal.9f6a16a7770c87b2042b.woff +0 -0
  123. package/frontend/build/static/media/roboto-latin-ext-300-normal.14982a9e4857a93b6dce.woff +0 -0
  124. package/frontend/build/static/media/roboto-latin-ext-300-normal.97cbc447d4a8d41a9543.woff2 +0 -0
  125. package/frontend/build/static/media/roboto-latin-ext-400-normal.27da5b36b6d3a16f53f4.woff +0 -0
  126. package/frontend/build/static/media/roboto-latin-ext-400-normal.2eeae187764baf05867d.woff2 +0 -0
  127. package/frontend/build/static/media/roboto-latin-ext-500-normal.06c30711d588145a4541.woff +0 -0
  128. package/frontend/build/static/media/roboto-latin-ext-500-normal.9a18d7bb9ff7a6af7b32.woff2 +0 -0
  129. package/frontend/build/static/media/roboto-latin-ext-700-normal.18841836e391d39e83a8.woff2 +0 -0
  130. package/frontend/build/static/media/roboto-latin-ext-700-normal.3c5bcdd0e69c4c3ffafe.woff +0 -0
  131. package/frontend/build/static/media/roboto-vietnamese-300-normal.c96b16e5c05c7b7c3e89.woff2 +0 -0
  132. package/frontend/build/static/media/roboto-vietnamese-300-normal.f5e7cea32756dfe7af40.woff +0 -0
  133. package/frontend/build/static/media/roboto-vietnamese-400-normal.0dc97c66f9b542d6fa17.woff +0 -0
  134. package/frontend/build/static/media/roboto-vietnamese-400-normal.d3f8e26d6c27de8102b6.woff2 +0 -0
  135. package/frontend/build/static/media/roboto-vietnamese-500-normal.090fabef926bdc0e9b9f.woff2 +0 -0
  136. package/frontend/build/static/media/roboto-vietnamese-500-normal.23b7b8a2524d2d4b637b.woff +0 -0
  137. package/frontend/build/static/media/roboto-vietnamese-700-normal.0a79a9fabfc32e33f360.woff2 +0 -0
  138. package/frontend/build/static/media/roboto-vietnamese-700-normal.35ed0597568ff6f19c16.woff +0 -0
  139. package/npm-shrinkwrap.json +120 -39
  140. package/package.json +8 -3
  141. package/dist/matterbridgeController.d.ts +0 -24
  142. package/dist/matterbridgeController.d.ts.map +0 -1
  143. package/dist/matterbridgeController.js +0 -386
  144. package/dist/matterbridgeController.js.map +0 -1
  145. package/frontend/build/static/css/main.1cf003ae.css +0 -2
  146. package/frontend/build/static/css/main.1cf003ae.css.map +0 -1
  147. package/frontend/build/static/js/main.045d08f7.js +0 -3
  148. package/frontend/build/static/js/main.045d08f7.js.map +0 -1
@@ -20,179 +20,19 @@
20
20
  * See the License for the specific language governing permissions and
21
21
  * limitations under the License. *
22
22
  */
23
- import { ActionsCluster, AirQuality, AirQualityCluster, BasicInformationCluster, BooleanState, BooleanStateCluster, BooleanStateConfiguration, BooleanStateConfigurationCluster, BridgedDeviceBasicInformation, BridgedDeviceBasicInformationCluster, CarbonDioxideConcentrationMeasurement, CarbonDioxideConcentrationMeasurementCluster, CarbonMonoxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurementCluster, ClusterServer, ColorControl, ColorControlCluster, ConcentrationMeasurement, DeviceEnergyManagement, DeviceEnergyManagementCluster, DeviceEnergyManagementMode, DeviceEnergyManagementModeCluster, DoorLock, DoorLockCluster, ElectricalEnergyMeasurement, ElectricalEnergyMeasurementCluster, ElectricalPowerMeasurement, ElectricalPowerMeasurementCluster, FanControl, FanControlCluster, FixedLabelCluster, FlowMeasurement, FlowMeasurementCluster, FormaldehydeConcentrationMeasurement, FormaldehydeConcentrationMeasurementCluster, Groups, GroupsCluster, GroupsClusterHandler, Identify, IdentifyCluster, IlluminanceMeasurement, IlluminanceMeasurementCluster, LevelControl, LevelControlCluster, MeasurementType, ModeSelectCluster, NitrogenDioxideConcentrationMeasurement, NitrogenDioxideConcentrationMeasurementCluster, OccupancySensing, OccupancySensingCluster, OnOff, OnOffCluster, OzoneConcentrationMeasurement, OzoneConcentrationMeasurementCluster, Pm10ConcentrationMeasurement, Pm10ConcentrationMeasurementCluster, Pm1ConcentrationMeasurement, Pm1ConcentrationMeasurementCluster, Pm25ConcentrationMeasurement, Pm25ConcentrationMeasurementCluster, PowerSource, PowerSourceCluster, PowerSourceConfigurationCluster, PowerTopology, PowerTopologyCluster, PressureMeasurement, PressureMeasurementCluster, RadonConcentrationMeasurement, RadonConcentrationMeasurementCluster, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, SmokeCoAlarm, SmokeCoAlarmCluster, Switch, SwitchCluster, TemperatureMeasurement, TemperatureMeasurementCluster, Thermostat, ThermostatCluster, ThreadNetworkDiagnostics, ThreadNetworkDiagnosticsCluster, TimeSynchronization, TimeSynchronizationCluster, TotalVolatileOrganicCompoundsConcentrationMeasurement, TotalVolatileOrganicCompoundsConcentrationMeasurementCluster, WindowCovering, WindowCoveringCluster, getClusterNameById, } from '@project-chip/matter-node.js/cluster';
24
- import { Specification } from '@project-chip/matter-node.js/model';
25
- import { EndpointNumber, VendorId } from '@project-chip/matter-node.js/datatype';
26
- import { Device, DeviceClasses, DeviceTypeDefinition, Endpoint } from '@project-chip/matter-node.js/device';
27
- import { extendPublicHandlerMethods } from '@project-chip/matter-node.js/util';
28
- import { AnsiLogger, CYAN, YELLOW, db, debugStringify, hk, or, zb } from 'node-ansi-logger';
23
+ // @matter
24
+ import { AirQuality, AirQualityCluster, BasicInformationCluster, BooleanState, BooleanStateCluster, BooleanStateConfiguration, BooleanStateConfigurationCluster, BridgedDeviceBasicInformationCluster, CarbonDioxideConcentrationMeasurement, CarbonDioxideConcentrationMeasurementCluster, CarbonMonoxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurementCluster, ColorControl, ColorControlCluster, ConcentrationMeasurement, Descriptor, DescriptorCluster, DeviceEnergyManagement, DeviceEnergyManagementCluster, DeviceEnergyManagementMode, DeviceEnergyManagementModeCluster, DoorLock, DoorLockCluster, ElectricalEnergyMeasurement, ElectricalEnergyMeasurementCluster, ElectricalPowerMeasurement, ElectricalPowerMeasurementCluster, FanControl, FanControlCluster, FlowMeasurement, FlowMeasurementCluster, FormaldehydeConcentrationMeasurement, FormaldehydeConcentrationMeasurementCluster, Groups, GroupsCluster, Identify, IdentifyCluster, IlluminanceMeasurement, IlluminanceMeasurementCluster, LevelControl, LevelControlCluster, ModeSelectCluster, NitrogenDioxideConcentrationMeasurement, NitrogenDioxideConcentrationMeasurementCluster, OccupancySensing, OccupancySensingCluster, OnOff, OnOffCluster, OzoneConcentrationMeasurement, OzoneConcentrationMeasurementCluster, Pm10ConcentrationMeasurement, Pm10ConcentrationMeasurementCluster, Pm1ConcentrationMeasurement, Pm1ConcentrationMeasurementCluster, Pm25ConcentrationMeasurement, Pm25ConcentrationMeasurementCluster, PowerSource, PowerSourceCluster, PowerSourceConfigurationCluster, PowerTopology, PowerTopologyCluster, PressureMeasurement, PressureMeasurementCluster, RadonConcentrationMeasurement, RadonConcentrationMeasurementCluster, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, SmokeCoAlarm, SmokeCoAlarmCluster, Switch, SwitchCluster, TemperatureMeasurement, TemperatureMeasurementCluster, Thermostat, ThermostatCluster, ThreadNetworkDiagnostics, ThreadNetworkDiagnosticsCluster, TimeSynchronization, TimeSynchronizationCluster, TotalVolatileOrganicCompoundsConcentrationMeasurement, TotalVolatileOrganicCompoundsConcentrationMeasurementCluster, WindowCovering, WindowCoveringCluster, } from '@matter/main/clusters';
25
+ import { Specification } from '@matter/main/model';
26
+ import { EndpointNumber, extendPublicHandlerMethods, VendorId } from '@matter/main';
27
+ import { MeasurementType, getClusterNameById } from '@matter/main/types';
28
+ // @project-chip
29
+ import { Device, Endpoint } from '@project-chip/matter.js/device';
30
+ import { GroupsClusterHandler, ClusterServer } from '@project-chip/matter.js/cluster';
31
+ // AnsiLogger module
32
+ import { AnsiLogger, CYAN, YELLOW, db, hk, or, zb, debugStringify } from 'node-ansi-logger';
33
+ // Node.js modules
29
34
  import { createHash } from 'crypto';
30
- // Matter 1.2 and 1.3 device types
31
- export const airQualitySensor = DeviceTypeDefinition({
32
- name: 'MA-airQualitySensor',
33
- code: 0x002c,
34
- deviceClass: DeviceClasses.Simple,
35
- revision: 1,
36
- requiredServerClusters: [Identify.Cluster.id, AirQuality.Cluster.id],
37
- optionalServerClusters: [
38
- TemperatureMeasurement.Cluster.id,
39
- RelativeHumidityMeasurement.Cluster.id,
40
- CarbonMonoxideConcentrationMeasurement.Cluster.id,
41
- CarbonDioxideConcentrationMeasurement.Cluster.id,
42
- NitrogenDioxideConcentrationMeasurement.Cluster.id,
43
- OzoneConcentrationMeasurement.Cluster.id,
44
- FormaldehydeConcentrationMeasurement.Cluster.id,
45
- Pm1ConcentrationMeasurement.Cluster.id,
46
- Pm25ConcentrationMeasurement.Cluster.id,
47
- Pm10ConcentrationMeasurement.Cluster.id,
48
- RadonConcentrationMeasurement.Cluster.id,
49
- TotalVolatileOrganicCompoundsConcentrationMeasurement.Cluster.id,
50
- ],
51
- });
52
- export const waterFreezeDetector = DeviceTypeDefinition({
53
- name: 'MA-waterFreezeDetector',
54
- code: 0x0041,
55
- deviceClass: DeviceClasses.Simple,
56
- revision: 1,
57
- requiredServerClusters: [Identify.Cluster.id, BooleanState.Cluster.id],
58
- optionalServerClusters: [BooleanStateConfiguration.Cluster.id],
59
- });
60
- export const waterLeakDetector = DeviceTypeDefinition({
61
- name: 'MA-waterLeakDetector',
62
- code: 0x0043,
63
- deviceClass: DeviceClasses.Simple,
64
- revision: 1,
65
- requiredServerClusters: [Identify.Cluster.id, BooleanState.Cluster.id],
66
- optionalServerClusters: [BooleanStateConfiguration.Cluster.id],
67
- });
68
- export const rainSensor = DeviceTypeDefinition({
69
- name: 'MA-rainSensor',
70
- code: 0x0044,
71
- deviceClass: DeviceClasses.Simple,
72
- revision: 1,
73
- requiredServerClusters: [Identify.Cluster.id, BooleanState.Cluster.id],
74
- optionalServerClusters: [BooleanStateConfiguration.Cluster.id],
75
- });
76
- export const smokeCoAlarm = DeviceTypeDefinition({
77
- name: 'MA-smokeCoAlarm',
78
- code: 0x0076,
79
- deviceClass: DeviceClasses.Simple,
80
- revision: 1,
81
- requiredServerClusters: [Identify.Cluster.id, SmokeCoAlarm.Cluster.id],
82
- optionalServerClusters: [Groups.Cluster.id, TemperatureMeasurement.Cluster.id, RelativeHumidityMeasurement.Cluster.id, CarbonMonoxideConcentrationMeasurement.Cluster.id],
83
- });
84
- export const electricalSensor = DeviceTypeDefinition({
85
- name: 'MA-electricalSensor',
86
- code: 0x0510,
87
- deviceClass: DeviceClasses.Utility,
88
- revision: 1,
89
- requiredServerClusters: [PowerTopology.Cluster.id],
90
- optionalServerClusters: [ElectricalPowerMeasurement.Cluster.id, ElectricalEnergyMeasurement.Cluster.id],
91
- });
92
- export const deviceEnergyManagement = DeviceTypeDefinition({
93
- name: 'MA-deviceEnergyManagement',
94
- code: 0x050d,
95
- deviceClass: DeviceClasses.Utility,
96
- revision: 1,
97
- requiredServerClusters: [DeviceEnergyManagement.Cluster.id, DeviceEnergyManagementMode.Cluster.id],
98
- optionalServerClusters: [],
99
- });
100
- export const bridge = DeviceTypeDefinition({
101
- name: 'MA-aggregator',
102
- code: 0x000e,
103
- deviceClass: DeviceClasses.Dynamic,
104
- revision: 1,
105
- optionalServerClusters: [ActionsCluster.id],
106
- });
107
- export const powerSource = DeviceTypeDefinition({
108
- name: 'MA-powerSource',
109
- code: 0x0011,
110
- deviceClass: DeviceClasses.Utility,
111
- revision: 1,
112
- requiredServerClusters: [PowerSource.Cluster.id],
113
- optionalServerClusters: [],
114
- });
115
- export const bridgedNode = DeviceTypeDefinition({
116
- name: 'MA-bridgedNode',
117
- code: 0x0013,
118
- deviceClass: DeviceClasses.Utility,
119
- revision: 2,
120
- requiredServerClusters: [BridgedDeviceBasicInformation.Cluster.id],
121
- optionalServerClusters: [PowerSource.Cluster.id],
122
- });
123
- export const genericSwitch = DeviceTypeDefinition({
124
- name: 'MA-genericswitch',
125
- code: 0x000f,
126
- deviceClass: DeviceClasses.Simple,
127
- revision: 1,
128
- requiredServerClusters: [IdentifyCluster.id, SwitchCluster.id],
129
- optionalServerClusters: [FixedLabelCluster.id],
130
- });
131
- export const onOffLight = DeviceTypeDefinition({
132
- name: 'MA-onofflight',
133
- code: 0x0100,
134
- deviceClass: DeviceClasses.Simple,
135
- revision: 2,
136
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, /* Scenes.Cluster.id,*/ OnOff.Cluster.id],
137
- optionalServerClusters: [LevelControl.Cluster.id, ColorControl.Cluster.id],
138
- });
139
- export const dimmableLight = DeviceTypeDefinition({
140
- name: 'MA-dimmablelight',
141
- code: 0x0101,
142
- deviceClass: DeviceClasses.Simple,
143
- revision: 2,
144
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, /* Scenes.Cluster.id,*/ OnOff.Cluster.id, LevelControl.Cluster.id],
145
- optionalServerClusters: [ColorControl.Cluster.id],
146
- });
147
- export const colorTemperatureLight = DeviceTypeDefinition({
148
- name: 'MA-colortemperaturelight',
149
- code: 0x010c,
150
- deviceClass: DeviceClasses.Simple,
151
- revision: 2,
152
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, /* Scenes.Cluster.id,*/ OnOff.Cluster.id, LevelControl.Cluster.id, ColorControl.Cluster.id],
153
- optionalServerClusters: [],
154
- });
155
- export const onOffOutlet = DeviceTypeDefinition({
156
- name: 'MA-onoffpluginunit',
157
- code: 0x010a,
158
- deviceClass: DeviceClasses.Simple,
159
- revision: 2,
160
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, /* Scenes.Cluster.id,*/ OnOff.Cluster.id],
161
- optionalServerClusters: [LevelControl.Cluster.id],
162
- });
163
- export const dimmableOutlet = DeviceTypeDefinition({
164
- name: 'MA-dimmablepluginunit',
165
- code: 0x010b,
166
- deviceClass: DeviceClasses.Simple,
167
- revision: 2,
168
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, /* Scenes.Cluster.id,*/ OnOff.Cluster.id, LevelControl.Cluster.id],
169
- optionalServerClusters: [],
170
- });
171
- // Custom device types: switch without ClientClusters
172
- export const onOffSwitch = DeviceTypeDefinition({
173
- name: 'MA-onoffswitch',
174
- code: 0x0103,
175
- deviceClass: DeviceClasses.Simple,
176
- revision: 2,
177
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, /* Scenes.Cluster.id,*/ OnOff.Cluster.id],
178
- optionalServerClusters: [LevelControl.Cluster.id, ColorControl.Cluster.id],
179
- });
180
- export const dimmableSwitch = DeviceTypeDefinition({
181
- name: 'MA-dimmableswitch',
182
- code: 0x0104,
183
- deviceClass: DeviceClasses.Simple,
184
- revision: 2,
185
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, /* Scenes.Cluster.id,*/ OnOff.Cluster.id, LevelControl.Cluster.id],
186
- optionalServerClusters: [ColorControl.Cluster.id],
187
- });
188
- export const colorTemperatureSwitch = DeviceTypeDefinition({
189
- name: 'MA-colortemperatureswitch',
190
- code: 0x0105,
191
- deviceClass: DeviceClasses.Simple,
192
- revision: 2,
193
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, /* Scenes.Cluster.id,*/ OnOff.Cluster.id, LevelControl.Cluster.id, ColorControl.Cluster.id],
194
- optionalServerClusters: [],
195
- });
35
+ import { bridgedNode } from './matterbridgeDeviceTypes.js';
196
36
  export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
197
37
  static bridgeMode = '';
198
38
  static logLevel = "info" /* LogLevel.INFO */;
@@ -201,6 +41,14 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
201
41
  serialNumber = undefined;
202
42
  deviceName = undefined;
203
43
  uniqueId = undefined;
44
+ vendorId = undefined;
45
+ vendorName = undefined;
46
+ productId = undefined;
47
+ productName = undefined;
48
+ softwareVersion = undefined;
49
+ softwareVersionString = undefined;
50
+ hardwareVersion = undefined;
51
+ hardwareVersionString = undefined;
204
52
  /**
205
53
  * Create a Matterbridge device.
206
54
  * @constructor
@@ -282,10 +130,13 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
282
130
  *
283
131
  * @param {string} endpointName - The name of the new enpoint to add.
284
132
  * @param {AtLeastOne<DeviceTypeDefinition>} deviceTypes - The device types to add.
285
- * @param {ClusterId[]} includeServerList - The list of cluster IDs to include.
133
+ * @param {ClusterId[]} [includeServerList=[]] - The list of cluster IDs to include.
134
+ * @param {EndpointOptions} [options={}] - The options for the device.
135
+ * @param {boolean} [debug=false] - Whether to enable debug logging.
286
136
  * @returns {Endpoint} - The child endpoint that was found or added.
287
137
  */
288
- addChildDeviceTypeWithClusterServer(endpointName, deviceTypes, includeServerList = []) {
138
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
139
+ addChildDeviceTypeWithClusterServer(endpointName, deviceTypes, includeServerList = [], options = {}, debug = false) {
289
140
  this.log.debug(`addChildDeviceTypeWithClusterServer: ${CYAN}${endpointName}${db}`);
290
141
  let child = this.getChildEndpoints().find((endpoint) => endpoint.uniqueStorageKey === endpointName);
291
142
  if (!child) {
@@ -570,6 +421,47 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
570
421
  log?.info(`${db}Subscribe endpoint ${or}${endpoint.name}:${endpoint.number}${db} attribute ${hk}${clusterServer.name}.${capitalizedAttributeName}${db}`);
571
422
  return true;
572
423
  }
424
+ /**
425
+ * Adds a tag to the tag list of the specified endpoint.
426
+ *
427
+ * @param {Endpoint} endpoint - The endpoint to add the tag to.
428
+ * @param {VendorId | null} mfgCode - The manufacturer code.
429
+ * @param {number} namespaceId - The namespace ID of the tag.
430
+ * @param {number} tag - The tag number.
431
+ * @param {string | null} [label=null] - The label for the tag.
432
+ *
433
+ * @remarks
434
+ * This method is used to add a tag to the tag list of a given endpoint.
435
+ * If the tag list already exists, the new tag is added to the existing list. Otherwise, a new tag list is created with the provided tag.
436
+ *
437
+ * Example usage:
438
+ * ```typescript
439
+ * this.addTagList(endpoint, null, NumberTag.One.namespaceId, NumberTag.One.tag, 'Label');
440
+ * this.addTagList(endpoint, null, SwitchesTag.Custom.namespaceId, SwitchesTag.Custom.tag, 'Label');
441
+ * ```
442
+ */
443
+ addTagList(endpoint, mfgCode, namespaceId, tag, label) {
444
+ const descriptor = endpoint.getClusterServer(DescriptorCluster.with(Descriptor.Feature.TagList));
445
+ if (!descriptor) {
446
+ this.log.error(`addTagList: descriptor cluster not found on endpoint ${endpoint.name}:${endpoint.number}`);
447
+ return;
448
+ }
449
+ // tagList: { mfgCode: VendorId | null; namespaceId: number; tag: number; label?: string | null }[] = [];
450
+ if (descriptor.attributes.tagList) {
451
+ this.log.debug(`addTagList: adding ${CYAN}tagList${db} mfCode: ${mfgCode}, namespaceId: ${namespaceId}, tag: ${tag}, label: ${label} on endpoint $${endpoint.name}:${endpoint.number}`);
452
+ const tagList = descriptor.attributes.tagList.getLocal();
453
+ tagList.push({ mfgCode, namespaceId, tag, label });
454
+ return;
455
+ }
456
+ this.log.debug(`addTagList: creating ${CYAN}tagList${db} mfCode: ${mfgCode}, namespaceId: ${namespaceId}, tag: ${tag}, label: ${label} on endpoint $${endpoint.name}:${endpoint.number}`);
457
+ endpoint.addClusterServer(ClusterServer(DescriptorCluster.with(Descriptor.Feature.TagList), {
458
+ tagList: [{ mfgCode, namespaceId, tag, label }],
459
+ deviceTypeList: [...descriptor.attributes.deviceTypeList.getLocal()],
460
+ serverList: [...descriptor.attributes.serverList.getLocal()],
461
+ clientList: [...descriptor.attributes.clientList.getLocal()],
462
+ partsList: [...descriptor.attributes.partsList.getLocal()],
463
+ }, {}, {}));
464
+ }
573
465
  /**
574
466
  * Serializes the Matterbridge device into a serialized object.
575
467
  *
@@ -721,6 +613,18 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
721
613
  * @param hardwareVersionString - The hardware version string of the device. Default is 'v.1.0.0'.
722
614
  */
723
615
  getDefaultBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productId, productName, softwareVersion = 1, softwareVersionString = '1.0.0', hardwareVersion = 1, hardwareVersionString = '1.0.0') {
616
+ this.log.logName = deviceName;
617
+ this.deviceName = deviceName;
618
+ this.serialNumber = serialNumber;
619
+ this.uniqueId = this.createUniqueId(deviceName, serialNumber, vendorName, productName);
620
+ this.productId = productId;
621
+ this.productName = productName;
622
+ this.vendorId = vendorId;
623
+ this.vendorName = vendorName;
624
+ this.softwareVersion = softwareVersion;
625
+ this.softwareVersionString = softwareVersionString;
626
+ this.hardwareVersion = hardwareVersion;
627
+ this.hardwareVersionString = hardwareVersionString;
724
628
  return ClusterServer(BasicInformationCluster, {
725
629
  dataModelRevision: 1,
726
630
  location: 'XX',
@@ -762,10 +666,8 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
762
666
  * @param hardwareVersionString - The hardware version string of the device. Default is 'v.1.0.0'.
763
667
  */
764
668
  createDefaultBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productId, productName, softwareVersion = 1, softwareVersionString = '1.0.0', hardwareVersion = 1, hardwareVersionString = '1.0.0') {
765
- this.deviceName = deviceName;
766
- this.serialNumber = serialNumber;
767
- this.uniqueId = this.createUniqueId(deviceName, serialNumber, vendorName, productName);
768
669
  if (MatterbridgeDevice.bridgeMode === 'bridge') {
670
+ this.addDeviceType(bridgedNode);
769
671
  this.createDefaultBridgedDeviceBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productName, softwareVersion, softwareVersionString, hardwareVersion, hardwareVersionString);
770
672
  return;
771
673
  }
@@ -785,6 +687,18 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
785
687
  * @param hardwareVersionString - The hardware version string of the device. Default is 'v.1.0.0'.
786
688
  */
787
689
  getDefaultBridgedDeviceBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productName, softwareVersion = 1, softwareVersionString = '1.0.0', hardwareVersion = 1, hardwareVersionString = '1.0.0') {
690
+ this.log.logName = deviceName;
691
+ this.deviceName = deviceName;
692
+ this.serialNumber = serialNumber;
693
+ this.uniqueId = this.createUniqueId(deviceName, serialNumber, vendorName, productName);
694
+ this.productId = undefined;
695
+ this.productName = productName;
696
+ this.vendorId = vendorId;
697
+ this.vendorName = vendorName;
698
+ this.softwareVersion = softwareVersion;
699
+ this.softwareVersionString = softwareVersionString;
700
+ this.hardwareVersion = hardwareVersion;
701
+ this.hardwareVersionString = hardwareVersionString;
788
702
  return ClusterServer(BridgedDeviceBasicInformationCluster, {
789
703
  vendorId: vendorId !== undefined ? VendorId(vendorId) : undefined, // 4874
790
704
  vendorName: vendorName.slice(0, 32),
@@ -819,9 +733,6 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
819
733
  * @param hardwareVersionString - The hardware version string of the device. Default is 'v.1.0.0'.
820
734
  */
821
735
  createDefaultBridgedDeviceBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productName, softwareVersion = 1, softwareVersionString = '1.0.0', hardwareVersion = 1, hardwareVersionString = '1.0.0') {
822
- this.deviceName = deviceName;
823
- this.serialNumber = serialNumber;
824
- this.uniqueId = this.createUniqueId(deviceName, serialNumber, vendorName, productName);
825
736
  this.addClusterServer(this.getDefaultBridgedDeviceBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productName, softwareVersion, softwareVersionString, hardwareVersion, hardwareVersionString));
826
737
  }
827
738
  /**
@@ -866,7 +777,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
866
777
  getDefaultElectricalPowerMeasurementClusterServer(voltage = null, current = null, power = null, frequency = null) {
867
778
  return ClusterServer(ElectricalPowerMeasurementCluster.with(ElectricalPowerMeasurement.Feature.AlternatingCurrent), {
868
779
  powerMode: ElectricalPowerMeasurement.PowerMode.Ac,
869
- numberOfMeasurementTypes: 3,
780
+ numberOfMeasurementTypes: 4,
870
781
  accuracy: [
871
782
  {
872
783
  measurementType: MeasurementType.Voltage,
@@ -973,12 +884,17 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
973
884
  /**
974
885
  * Get a default level control cluster server.
975
886
  *
976
- * @param currentLevel - The current level (default: 0).
887
+ * @param currentLevel - The current level (default: 254).
888
+ * @param minLevel - The minimum level (default: 1).
889
+ * @param maxLevel - The maximum level (default: 254).
890
+ * @param onLevel - The on level (default: null).
977
891
  */
978
- getDefaultLevelControlClusterServer(currentLevel = 0) {
892
+ getDefaultLevelControlClusterServer(currentLevel = 254, minLevel = 1, maxLevel = 254, onLevel = null) {
979
893
  return ClusterServer(LevelControlCluster.with(LevelControl.Feature.OnOff), {
980
894
  currentLevel,
981
- onLevel: 0,
895
+ minLevel,
896
+ maxLevel,
897
+ onLevel,
982
898
  options: {
983
899
  executeIfOff: false,
984
900
  coupleColorTempToLevel: false,
@@ -1015,10 +931,13 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1015
931
  /**
1016
932
  * Creates a default level control cluster server.
1017
933
  *
1018
- * @param currentLevel - The current level (default: 0).
934
+ * @param currentLevel - The current level (default: 254).
935
+ * @param minLevel - The minimum level (default: 1).
936
+ * @param maxLevel - The maximum level (default: 254).
937
+ * @param onLevel - The on level (default: null).
1019
938
  */
1020
- createDefaultLevelControlClusterServer(currentLevel = 0) {
1021
- this.addClusterServer(this.getDefaultLevelControlClusterServer(currentLevel));
939
+ createDefaultLevelControlClusterServer(currentLevel = 254, minLevel = 1, maxLevel = 254, onLevel = null) {
940
+ this.addClusterServer(this.getDefaultLevelControlClusterServer(currentLevel, minLevel, maxLevel, onLevel));
1022
941
  }
1023
942
  /**
1024
943
  * Get a default color control cluster server.
@@ -1538,7 +1457,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1538
1457
  /**
1539
1458
  * Get a default flow measurement cluster server.
1540
1459
  *
1541
- * @param measuredValue - The measured value of the temperature.
1460
+ * @param measuredValue - The measured value of the flow in 10 x m/h.
1542
1461
  */
1543
1462
  getDefaultFlowMeasurementClusterServer(measuredValue = 0) {
1544
1463
  return ClusterServer(FlowMeasurementCluster, {
@@ -1551,7 +1470,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1551
1470
  /**
1552
1471
  * Creates a default flow measurement cluster server.
1553
1472
  *
1554
- * @param measuredValue - The measured value of the temperature.
1473
+ * @param measuredValue - The measured value of the of the flow in 10 x m/h.
1555
1474
  */
1556
1475
  createDefaultFlowMeasurementClusterServer(measuredValue = 0) {
1557
1476
  this.addClusterServer(this.getDefaultFlowMeasurementClusterServer(measuredValue));
@@ -1559,7 +1478,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1559
1478
  /**
1560
1479
  * Get a default temperature measurement cluster server.
1561
1480
  *
1562
- * @param measuredValue - The measured value of the temperature.
1481
+ * @param measuredValue - The measured value of the temperature x 100.
1563
1482
  */
1564
1483
  getDefaultTemperatureMeasurementClusterServer(measuredValue = 0) {
1565
1484
  return ClusterServer(TemperatureMeasurementCluster, {
@@ -1572,7 +1491,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1572
1491
  /**
1573
1492
  * Creates a default temperature measurement cluster server.
1574
1493
  *
1575
- * @param measuredValue - The measured value of the temperature.
1494
+ * @param measuredValue - The measured value of the temperature x 100.
1576
1495
  */
1577
1496
  createDefaultTemperatureMeasurementClusterServer(measuredValue = 0) {
1578
1497
  this.addClusterServer(this.getDefaultTemperatureMeasurementClusterServer(measuredValue));
@@ -1580,7 +1499,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1580
1499
  /**
1581
1500
  * Get a default RelativeHumidityMeasurementCluster server.
1582
1501
  *
1583
- * @param measuredValue - The measured value of the relative humidity.
1502
+ * @param measuredValue - The measured value of the relative humidity x 100.
1584
1503
  */
1585
1504
  getDefaultRelativeHumidityMeasurementClusterServer(measuredValue = 0) {
1586
1505
  return ClusterServer(RelativeHumidityMeasurementCluster, {
@@ -1593,7 +1512,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1593
1512
  /**
1594
1513
  * Creates a default RelativeHumidityMeasurementCluster server.
1595
1514
  *
1596
- * @param measuredValue - The measured value of the relative humidity.
1515
+ * @param measuredValue - The measured value of the relative humidity x 100.
1597
1516
  */
1598
1517
  createDefaultRelativeHumidityMeasurementClusterServer(measuredValue = 0) {
1599
1518
  this.addClusterServer(this.getDefaultRelativeHumidityMeasurementClusterServer(measuredValue));
@@ -1814,6 +1733,80 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1814
1733
  createDefaultTvocMeasurementClusterServer(measuredValue = 0, measurementUnit = ConcentrationMeasurement.MeasurementUnit.Ppm, measurementMedium = ConcentrationMeasurement.MeasurementMedium.Air) {
1815
1734
  this.addClusterServer(this.getDefaultTvocMeasurementClusterServer(measuredValue, measurementUnit, measurementMedium));
1816
1735
  }
1736
+ /**
1737
+ * Get a default heating thermostat cluster server with the specified parameters.
1738
+ * @param {number} [localTemperature] - The local temperature value in degrees Celsius. Defaults to 23°.
1739
+ * @param {number} [occupiedHeatingSetpoint] - The occupied heating setpoint value in degrees Celsius. Defaults to 21°.
1740
+ * @param {number} [minHeatSetpointLimit] - The minimum heat setpoint limit value. Defaults to 0°.
1741
+ * @param {number} [maxHeatSetpointLimit] - The maximum heat setpoint limit value. Defaults to 50°.
1742
+ * @returns {ThermostatClusterServer} A default thermostat cluster server configured with the specified parameters.
1743
+ */
1744
+ getDefaultHeatingThermostatClusterServer(localTemperature = 23, occupiedHeatingSetpoint = 21, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50) {
1745
+ return ClusterServer(ThermostatCluster.with(Thermostat.Feature.Heating), {
1746
+ localTemperature: localTemperature * 100,
1747
+ systemMode: Thermostat.SystemMode.Heat,
1748
+ controlSequenceOfOperation: Thermostat.ControlSequenceOfOperation.HeatingOnly,
1749
+ // Thermostat.Feature.Heating
1750
+ occupiedHeatingSetpoint: occupiedHeatingSetpoint * 100,
1751
+ minHeatSetpointLimit: minHeatSetpointLimit * 100,
1752
+ maxHeatSetpointLimit: maxHeatSetpointLimit * 100,
1753
+ absMinHeatSetpointLimit: minHeatSetpointLimit * 100,
1754
+ absMaxHeatSetpointLimit: maxHeatSetpointLimit * 100,
1755
+ }, {
1756
+ setpointRaiseLower: async ({ request, attributes }) => {
1757
+ this.log.debug('Matter command: setpointRaiseLower', request);
1758
+ await this.commandHandler.executeHandler('setpointRaiseLower', { request, attributes });
1759
+ },
1760
+ }, {});
1761
+ }
1762
+ /**
1763
+ * Creates and adds a default heating thermostat cluster server to the device.
1764
+ *
1765
+ * @param {number} [localTemperature] - The local temperature value in degrees Celsius. Defaults to 23°.
1766
+ * @param {number} [occupiedHeatingSetpoint] - The occupied heating setpoint value in degrees Celsius. Defaults to 21°.
1767
+ * @param {number} [minHeatSetpointLimit] - The minimum heat setpoint limit value. Defaults to 0°.
1768
+ * @param {number} [maxHeatSetpointLimit] - The maximum heat setpoint limit value. Defaults to 50°.
1769
+ */
1770
+ createDefaultHeatingThermostatClusterServer(localTemperature = 23, occupiedHeatingSetpoint = 25, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50) {
1771
+ this.addClusterServer(this.getDefaultHeatingThermostatClusterServer(localTemperature, occupiedHeatingSetpoint, minHeatSetpointLimit, maxHeatSetpointLimit));
1772
+ }
1773
+ /**
1774
+ * Get a default cooling thermostat cluster server with the specified parameters.
1775
+ * @param {number} [localTemperature] - The local temperature value in degrees Celsius. Defaults to 23°.
1776
+ * @param {number} [occupiedCoolingSetpoint] - The occupied cooling setpoint value in degrees Celsius. Defaults to 25°.
1777
+ * @param {number} [minCoolSetpointLimit] - The minimum cool setpoint limit value. Defaults to 0°.
1778
+ * @param {number} [maxCoolSetpointLimit] - The maximum cool setpoint limit value. Defaults to 50°.
1779
+ * @returns {ThermostatClusterServer} A default thermostat cluster server configured with the specified parameters.
1780
+ */
1781
+ getDefaultCoolingThermostatClusterServer(localTemperature = 23, occupiedCoolingSetpoint = 25, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50) {
1782
+ return ClusterServer(ThermostatCluster.with(Thermostat.Feature.Cooling), {
1783
+ localTemperature: localTemperature * 100,
1784
+ systemMode: Thermostat.SystemMode.Cool,
1785
+ controlSequenceOfOperation: Thermostat.ControlSequenceOfOperation.CoolingOnly,
1786
+ // Thermostat.Feature.Cooling
1787
+ occupiedCoolingSetpoint: occupiedCoolingSetpoint * 100,
1788
+ minCoolSetpointLimit: minCoolSetpointLimit * 100,
1789
+ maxCoolSetpointLimit: maxCoolSetpointLimit * 100,
1790
+ absMinCoolSetpointLimit: minCoolSetpointLimit * 100,
1791
+ absMaxCoolSetpointLimit: maxCoolSetpointLimit * 100,
1792
+ }, {
1793
+ setpointRaiseLower: async ({ request, attributes }) => {
1794
+ this.log.debug('Matter command: setpointRaiseLower', request);
1795
+ await this.commandHandler.executeHandler('setpointRaiseLower', { request, attributes });
1796
+ },
1797
+ }, {});
1798
+ }
1799
+ /**
1800
+ * Creates and adds a default cooling thermostat cluster server to the device.
1801
+ *
1802
+ * @param {number} [localTemperature] - The local temperature value in degrees Celsius. Defaults to 23°.
1803
+ * @param {number} [occupiedCoolingSetpoint] - The occupied cooling setpoint value in degrees Celsius. Defaults to 25°.
1804
+ * @param {number} [minCoolSetpointLimit] - The minimum cool setpoint limit value. Defaults to 0°.
1805
+ * @param {number} [maxCoolSetpointLimit] - The maximum cool setpoint limit value. Defaults to 50°.
1806
+ */
1807
+ createDefaultCoolingThermostatClusterServer(localTemperature = 23, occupiedCoolingSetpoint = 25, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50) {
1808
+ this.addClusterServer(this.getDefaultCoolingThermostatClusterServer(localTemperature, occupiedCoolingSetpoint, minCoolSetpointLimit, maxCoolSetpointLimit));
1809
+ }
1817
1810
  /**
1818
1811
  * Get a default thermostat cluster server with the specified parameters.
1819
1812
  *
@@ -1830,19 +1823,22 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1830
1823
  getDefaultThermostatClusterServer(localTemperature = 23, occupiedHeatingSetpoint = 21, occupiedCoolingSetpoint = 25, minSetpointDeadBand = 1, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50) {
1831
1824
  return ClusterServer(ThermostatCluster.with(Thermostat.Feature.Heating, Thermostat.Feature.Cooling, Thermostat.Feature.AutoMode), {
1832
1825
  localTemperature: localTemperature * 100,
1826
+ systemMode: Thermostat.SystemMode.Auto,
1827
+ controlSequenceOfOperation: Thermostat.ControlSequenceOfOperation.CoolingAndHeating,
1828
+ // Thermostat.Feature.Heating
1833
1829
  occupiedHeatingSetpoint: occupiedHeatingSetpoint * 100,
1834
- occupiedCoolingSetpoint: occupiedCoolingSetpoint * 100,
1835
1830
  minHeatSetpointLimit: minHeatSetpointLimit * 100,
1836
1831
  maxHeatSetpointLimit: maxHeatSetpointLimit * 100,
1837
1832
  absMinHeatSetpointLimit: minHeatSetpointLimit * 100,
1838
1833
  absMaxHeatSetpointLimit: maxHeatSetpointLimit * 100,
1834
+ // Thermostat.Feature.Cooling
1835
+ occupiedCoolingSetpoint: occupiedCoolingSetpoint * 100,
1839
1836
  minCoolSetpointLimit: minCoolSetpointLimit * 100,
1840
1837
  maxCoolSetpointLimit: maxCoolSetpointLimit * 100,
1841
1838
  absMinCoolSetpointLimit: minCoolSetpointLimit * 100,
1842
1839
  absMaxCoolSetpointLimit: maxCoolSetpointLimit * 100,
1840
+ // Thermostat.Feature.AutoMode
1843
1841
  minSetpointDeadBand: minSetpointDeadBand * 100,
1844
- systemMode: Thermostat.SystemMode.Off,
1845
- controlSequenceOfOperation: Thermostat.ControlSequenceOfOperation.CoolingAndHeating,
1846
1842
  thermostatRunningMode: Thermostat.ThermostatRunningMode.Off,
1847
1843
  }, {
1848
1844
  setpointRaiseLower: async ({ request, attributes }) => {