matterbridge 3.3.6 → 3.3.7-dev-20251102-c85d574

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 (305) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/broadcastServer.js +1 -92
  3. package/dist/broadcastServerTypes.js +0 -24
  4. package/dist/cli.js +1 -97
  5. package/dist/cliEmitter.js +0 -37
  6. package/dist/cliHistory.js +0 -38
  7. package/dist/clusters/export.js +0 -2
  8. package/dist/defaultConfigSchema.js +0 -24
  9. package/dist/deviceManager.js +1 -124
  10. package/dist/devices/airConditioner.js +0 -57
  11. package/dist/devices/batteryStorage.js +1 -48
  12. package/dist/devices/cooktop.js +0 -55
  13. package/dist/devices/dishwasher.js +0 -57
  14. package/dist/devices/evse.js +10 -74
  15. package/dist/devices/export.js +0 -5
  16. package/dist/devices/extractorHood.js +0 -42
  17. package/dist/devices/heatPump.js +2 -50
  18. package/dist/devices/laundryDryer.js +3 -62
  19. package/dist/devices/laundryWasher.js +4 -70
  20. package/dist/devices/microwaveOven.js +5 -88
  21. package/dist/devices/oven.js +0 -85
  22. package/dist/devices/refrigerator.js +0 -102
  23. package/dist/devices/roboticVacuumCleaner.js +9 -100
  24. package/dist/devices/solarPower.js +0 -38
  25. package/dist/devices/speaker.js +0 -84
  26. package/dist/devices/temperatureControl.js +3 -24
  27. package/dist/devices/waterHeater.js +2 -82
  28. package/dist/dgram/coap.js +13 -126
  29. package/dist/dgram/dgram.js +2 -114
  30. package/dist/dgram/mb_coap.js +3 -41
  31. package/dist/dgram/mb_mdns.js +15 -80
  32. package/dist/dgram/mdns.js +137 -299
  33. package/dist/dgram/multicast.js +1 -62
  34. package/dist/dgram/unicast.js +0 -54
  35. package/dist/frontend.js +34 -431
  36. package/dist/frontendTypes.js +0 -45
  37. package/dist/helpers.js +0 -53
  38. package/dist/index.js +0 -25
  39. package/dist/logger/export.js +0 -1
  40. package/dist/matter/behaviors.js +0 -2
  41. package/dist/matter/clusters.js +0 -2
  42. package/dist/matter/devices.js +0 -2
  43. package/dist/matter/endpoints.js +0 -2
  44. package/dist/matter/export.js +0 -3
  45. package/dist/matter/types.js +0 -3
  46. package/dist/matterbridge.js +46 -828
  47. package/dist/matterbridgeAccessoryPlatform.js +0 -37
  48. package/dist/matterbridgeBehaviors.js +5 -68
  49. package/dist/matterbridgeDeviceTypes.js +17 -638
  50. package/dist/matterbridgeDynamicPlatform.js +0 -37
  51. package/dist/matterbridgeEndpoint.js +52 -1408
  52. package/dist/matterbridgeEndpointHelpers.js +19 -464
  53. package/dist/matterbridgePlatform.js +1 -341
  54. package/dist/matterbridgeTypes.js +0 -26
  55. package/dist/pluginManager.js +3 -319
  56. package/dist/shelly.js +7 -168
  57. package/dist/storage/export.js +0 -1
  58. package/dist/update.js +0 -69
  59. package/dist/utils/colorUtils.js +2 -97
  60. package/dist/utils/commandLine.js +0 -60
  61. package/dist/utils/copyDirectory.js +1 -38
  62. package/dist/utils/createDirectory.js +0 -33
  63. package/dist/utils/createZip.js +2 -47
  64. package/dist/utils/deepCopy.js +0 -39
  65. package/dist/utils/deepEqual.js +1 -72
  66. package/dist/utils/error.js +0 -41
  67. package/dist/utils/export.js +0 -1
  68. package/dist/utils/format.js +0 -49
  69. package/dist/utils/hex.js +0 -124
  70. package/dist/utils/inspector.js +1 -69
  71. package/dist/utils/isvalid.js +0 -101
  72. package/dist/utils/jestHelpers.js +3 -153
  73. package/dist/utils/network.js +5 -96
  74. package/dist/utils/spawn.js +0 -71
  75. package/dist/utils/tracker.js +1 -64
  76. package/dist/utils/wait.js +8 -60
  77. package/frontend/build/assets/index.js +4 -4
  78. package/frontend/package.json +1 -1
  79. package/npm-shrinkwrap.json +2 -2
  80. package/package.json +1 -2
  81. package/dist/broadcastServer.d.ts +0 -112
  82. package/dist/broadcastServer.d.ts.map +0 -1
  83. package/dist/broadcastServer.js.map +0 -1
  84. package/dist/broadcastServerTypes.d.ts +0 -803
  85. package/dist/broadcastServerTypes.d.ts.map +0 -1
  86. package/dist/broadcastServerTypes.js.map +0 -1
  87. package/dist/cli.d.ts +0 -30
  88. package/dist/cli.d.ts.map +0 -1
  89. package/dist/cli.js.map +0 -1
  90. package/dist/cliEmitter.d.ts +0 -50
  91. package/dist/cliEmitter.d.ts.map +0 -1
  92. package/dist/cliEmitter.js.map +0 -1
  93. package/dist/cliHistory.d.ts +0 -48
  94. package/dist/cliHistory.d.ts.map +0 -1
  95. package/dist/cliHistory.js.map +0 -1
  96. package/dist/clusters/export.d.ts +0 -2
  97. package/dist/clusters/export.d.ts.map +0 -1
  98. package/dist/clusters/export.js.map +0 -1
  99. package/dist/defaultConfigSchema.d.ts +0 -28
  100. package/dist/defaultConfigSchema.d.ts.map +0 -1
  101. package/dist/defaultConfigSchema.js.map +0 -1
  102. package/dist/deviceManager.d.ts +0 -117
  103. package/dist/deviceManager.d.ts.map +0 -1
  104. package/dist/deviceManager.js.map +0 -1
  105. package/dist/devices/airConditioner.d.ts +0 -98
  106. package/dist/devices/airConditioner.d.ts.map +0 -1
  107. package/dist/devices/airConditioner.js.map +0 -1
  108. package/dist/devices/batteryStorage.d.ts +0 -48
  109. package/dist/devices/batteryStorage.d.ts.map +0 -1
  110. package/dist/devices/batteryStorage.js.map +0 -1
  111. package/dist/devices/cooktop.d.ts +0 -60
  112. package/dist/devices/cooktop.d.ts.map +0 -1
  113. package/dist/devices/cooktop.js.map +0 -1
  114. package/dist/devices/dishwasher.d.ts +0 -71
  115. package/dist/devices/dishwasher.d.ts.map +0 -1
  116. package/dist/devices/dishwasher.js.map +0 -1
  117. package/dist/devices/evse.d.ts +0 -76
  118. package/dist/devices/evse.d.ts.map +0 -1
  119. package/dist/devices/evse.js.map +0 -1
  120. package/dist/devices/export.d.ts +0 -17
  121. package/dist/devices/export.d.ts.map +0 -1
  122. package/dist/devices/export.js.map +0 -1
  123. package/dist/devices/extractorHood.d.ts +0 -46
  124. package/dist/devices/extractorHood.d.ts.map +0 -1
  125. package/dist/devices/extractorHood.js.map +0 -1
  126. package/dist/devices/heatPump.d.ts +0 -47
  127. package/dist/devices/heatPump.d.ts.map +0 -1
  128. package/dist/devices/heatPump.js.map +0 -1
  129. package/dist/devices/laundryDryer.d.ts +0 -67
  130. package/dist/devices/laundryDryer.d.ts.map +0 -1
  131. package/dist/devices/laundryDryer.js.map +0 -1
  132. package/dist/devices/laundryWasher.d.ts +0 -81
  133. package/dist/devices/laundryWasher.d.ts.map +0 -1
  134. package/dist/devices/laundryWasher.js.map +0 -1
  135. package/dist/devices/microwaveOven.d.ts +0 -168
  136. package/dist/devices/microwaveOven.d.ts.map +0 -1
  137. package/dist/devices/microwaveOven.js.map +0 -1
  138. package/dist/devices/oven.d.ts +0 -105
  139. package/dist/devices/oven.d.ts.map +0 -1
  140. package/dist/devices/oven.js.map +0 -1
  141. package/dist/devices/refrigerator.d.ts +0 -118
  142. package/dist/devices/refrigerator.d.ts.map +0 -1
  143. package/dist/devices/refrigerator.js.map +0 -1
  144. package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
  145. package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
  146. package/dist/devices/roboticVacuumCleaner.js.map +0 -1
  147. package/dist/devices/solarPower.d.ts +0 -40
  148. package/dist/devices/solarPower.d.ts.map +0 -1
  149. package/dist/devices/solarPower.js.map +0 -1
  150. package/dist/devices/speaker.d.ts +0 -87
  151. package/dist/devices/speaker.d.ts.map +0 -1
  152. package/dist/devices/speaker.js.map +0 -1
  153. package/dist/devices/temperatureControl.d.ts +0 -166
  154. package/dist/devices/temperatureControl.d.ts.map +0 -1
  155. package/dist/devices/temperatureControl.js.map +0 -1
  156. package/dist/devices/waterHeater.d.ts +0 -111
  157. package/dist/devices/waterHeater.d.ts.map +0 -1
  158. package/dist/devices/waterHeater.js.map +0 -1
  159. package/dist/dgram/coap.d.ts +0 -205
  160. package/dist/dgram/coap.d.ts.map +0 -1
  161. package/dist/dgram/coap.js.map +0 -1
  162. package/dist/dgram/dgram.d.ts +0 -141
  163. package/dist/dgram/dgram.d.ts.map +0 -1
  164. package/dist/dgram/dgram.js.map +0 -1
  165. package/dist/dgram/mb_coap.d.ts +0 -24
  166. package/dist/dgram/mb_coap.d.ts.map +0 -1
  167. package/dist/dgram/mb_coap.js.map +0 -1
  168. package/dist/dgram/mb_mdns.d.ts +0 -24
  169. package/dist/dgram/mb_mdns.d.ts.map +0 -1
  170. package/dist/dgram/mb_mdns.js.map +0 -1
  171. package/dist/dgram/mdns.d.ts +0 -290
  172. package/dist/dgram/mdns.d.ts.map +0 -1
  173. package/dist/dgram/mdns.js.map +0 -1
  174. package/dist/dgram/multicast.d.ts +0 -67
  175. package/dist/dgram/multicast.d.ts.map +0 -1
  176. package/dist/dgram/multicast.js.map +0 -1
  177. package/dist/dgram/unicast.d.ts +0 -56
  178. package/dist/dgram/unicast.d.ts.map +0 -1
  179. package/dist/dgram/unicast.js.map +0 -1
  180. package/dist/frontend.d.ts +0 -236
  181. package/dist/frontend.d.ts.map +0 -1
  182. package/dist/frontend.js.map +0 -1
  183. package/dist/frontendTypes.d.ts +0 -529
  184. package/dist/frontendTypes.d.ts.map +0 -1
  185. package/dist/frontendTypes.js.map +0 -1
  186. package/dist/helpers.d.ts +0 -48
  187. package/dist/helpers.d.ts.map +0 -1
  188. package/dist/helpers.js.map +0 -1
  189. package/dist/index.d.ts +0 -33
  190. package/dist/index.d.ts.map +0 -1
  191. package/dist/index.js.map +0 -1
  192. package/dist/logger/export.d.ts +0 -2
  193. package/dist/logger/export.d.ts.map +0 -1
  194. package/dist/logger/export.js.map +0 -1
  195. package/dist/matter/behaviors.d.ts +0 -2
  196. package/dist/matter/behaviors.d.ts.map +0 -1
  197. package/dist/matter/behaviors.js.map +0 -1
  198. package/dist/matter/clusters.d.ts +0 -2
  199. package/dist/matter/clusters.d.ts.map +0 -1
  200. package/dist/matter/clusters.js.map +0 -1
  201. package/dist/matter/devices.d.ts +0 -2
  202. package/dist/matter/devices.d.ts.map +0 -1
  203. package/dist/matter/devices.js.map +0 -1
  204. package/dist/matter/endpoints.d.ts +0 -2
  205. package/dist/matter/endpoints.d.ts.map +0 -1
  206. package/dist/matter/endpoints.js.map +0 -1
  207. package/dist/matter/export.d.ts +0 -5
  208. package/dist/matter/export.d.ts.map +0 -1
  209. package/dist/matter/export.js.map +0 -1
  210. package/dist/matter/types.d.ts +0 -3
  211. package/dist/matter/types.d.ts.map +0 -1
  212. package/dist/matter/types.js.map +0 -1
  213. package/dist/matterbridge.d.ts +0 -476
  214. package/dist/matterbridge.d.ts.map +0 -1
  215. package/dist/matterbridge.js.map +0 -1
  216. package/dist/matterbridgeAccessoryPlatform.d.ts +0 -42
  217. package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
  218. package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
  219. package/dist/matterbridgeBehaviors.d.ts +0 -2404
  220. package/dist/matterbridgeBehaviors.d.ts.map +0 -1
  221. package/dist/matterbridgeBehaviors.js.map +0 -1
  222. package/dist/matterbridgeDeviceTypes.d.ts +0 -770
  223. package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
  224. package/dist/matterbridgeDeviceTypes.js.map +0 -1
  225. package/dist/matterbridgeDynamicPlatform.d.ts +0 -42
  226. package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
  227. package/dist/matterbridgeDynamicPlatform.js.map +0 -1
  228. package/dist/matterbridgeEndpoint.d.ts +0 -1556
  229. package/dist/matterbridgeEndpoint.d.ts.map +0 -1
  230. package/dist/matterbridgeEndpoint.js.map +0 -1
  231. package/dist/matterbridgeEndpointHelpers.d.ts +0 -758
  232. package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
  233. package/dist/matterbridgeEndpointHelpers.js.map +0 -1
  234. package/dist/matterbridgePlatform.d.ts +0 -402
  235. package/dist/matterbridgePlatform.d.ts.map +0 -1
  236. package/dist/matterbridgePlatform.js.map +0 -1
  237. package/dist/matterbridgeTypes.d.ts +0 -226
  238. package/dist/matterbridgeTypes.d.ts.map +0 -1
  239. package/dist/matterbridgeTypes.js.map +0 -1
  240. package/dist/pluginManager.d.ts +0 -347
  241. package/dist/pluginManager.d.ts.map +0 -1
  242. package/dist/pluginManager.js.map +0 -1
  243. package/dist/shelly.d.ts +0 -174
  244. package/dist/shelly.d.ts.map +0 -1
  245. package/dist/shelly.js.map +0 -1
  246. package/dist/storage/export.d.ts +0 -2
  247. package/dist/storage/export.d.ts.map +0 -1
  248. package/dist/storage/export.js.map +0 -1
  249. package/dist/update.d.ts +0 -75
  250. package/dist/update.d.ts.map +0 -1
  251. package/dist/update.js.map +0 -1
  252. package/dist/utils/colorUtils.d.ts +0 -101
  253. package/dist/utils/colorUtils.d.ts.map +0 -1
  254. package/dist/utils/colorUtils.js.map +0 -1
  255. package/dist/utils/commandLine.d.ts +0 -66
  256. package/dist/utils/commandLine.d.ts.map +0 -1
  257. package/dist/utils/commandLine.js.map +0 -1
  258. package/dist/utils/copyDirectory.d.ts +0 -33
  259. package/dist/utils/copyDirectory.d.ts.map +0 -1
  260. package/dist/utils/copyDirectory.js.map +0 -1
  261. package/dist/utils/createDirectory.d.ts +0 -34
  262. package/dist/utils/createDirectory.d.ts.map +0 -1
  263. package/dist/utils/createDirectory.js.map +0 -1
  264. package/dist/utils/createZip.d.ts +0 -39
  265. package/dist/utils/createZip.d.ts.map +0 -1
  266. package/dist/utils/createZip.js.map +0 -1
  267. package/dist/utils/deepCopy.d.ts +0 -32
  268. package/dist/utils/deepCopy.d.ts.map +0 -1
  269. package/dist/utils/deepCopy.js.map +0 -1
  270. package/dist/utils/deepEqual.d.ts +0 -54
  271. package/dist/utils/deepEqual.d.ts.map +0 -1
  272. package/dist/utils/deepEqual.js.map +0 -1
  273. package/dist/utils/error.d.ts +0 -44
  274. package/dist/utils/error.d.ts.map +0 -1
  275. package/dist/utils/error.js.map +0 -1
  276. package/dist/utils/export.d.ts +0 -13
  277. package/dist/utils/export.d.ts.map +0 -1
  278. package/dist/utils/export.js.map +0 -1
  279. package/dist/utils/format.d.ts +0 -53
  280. package/dist/utils/format.d.ts.map +0 -1
  281. package/dist/utils/format.js.map +0 -1
  282. package/dist/utils/hex.d.ts +0 -89
  283. package/dist/utils/hex.d.ts.map +0 -1
  284. package/dist/utils/hex.js.map +0 -1
  285. package/dist/utils/inspector.d.ts +0 -87
  286. package/dist/utils/inspector.d.ts.map +0 -1
  287. package/dist/utils/inspector.js.map +0 -1
  288. package/dist/utils/isvalid.d.ts +0 -103
  289. package/dist/utils/isvalid.d.ts.map +0 -1
  290. package/dist/utils/isvalid.js.map +0 -1
  291. package/dist/utils/jestHelpers.d.ts +0 -139
  292. package/dist/utils/jestHelpers.d.ts.map +0 -1
  293. package/dist/utils/jestHelpers.js.map +0 -1
  294. package/dist/utils/network.d.ts +0 -101
  295. package/dist/utils/network.d.ts.map +0 -1
  296. package/dist/utils/network.js.map +0 -1
  297. package/dist/utils/spawn.d.ts +0 -35
  298. package/dist/utils/spawn.d.ts.map +0 -1
  299. package/dist/utils/spawn.js.map +0 -1
  300. package/dist/utils/tracker.d.ts +0 -108
  301. package/dist/utils/tracker.d.ts.map +0 -1
  302. package/dist/utils/tracker.js.map +0 -1
  303. package/dist/utils/wait.d.ts +0 -54
  304. package/dist/utils/wait.d.ts.map +0 -1
  305. package/dist/utils/wait.js.map +0 -1
@@ -1,15 +1,6 @@
1
1
  import { TemperatureControl } from '@matter/types/clusters/temperature-control';
2
2
  import { TemperatureControlServer } from '@matter/node/behaviors/temperature-control';
3
3
  import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
4
- /**
5
- * Creates a TemperatureControl Cluster Server with feature TemperatureLevel.
6
- *
7
- * @param {MatterbridgeEndpoint} endpoint - The Matterbridge endpoint instance.
8
- * @param {number} selectedTemperatureLevel - The selected temperature level as an index of the supportedTemperatureLevels array. Defaults to 1 (which corresponds to 'Warm').
9
- * @param {string[]} supportedTemperatureLevels - The supported temperature levels. Defaults to ['Cold', 'Warm', 'Hot', '30°', '40°', '60°', '80°'].
10
- *
11
- * @returns {this} The current MatterbridgeEndpoint instance for chaining.
12
- */
13
4
  export function createLevelTemperatureControlClusterServer(endpoint, selectedTemperatureLevel = 1, supportedTemperatureLevels = ['Cold', 'Warm', 'Hot', '30°', '40°', '60°', '80°']) {
14
5
  endpoint.behaviors.require(MatterbridgeLevelTemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel), {
15
6
  selectedTemperatureLevel,
@@ -17,23 +8,12 @@ export function createLevelTemperatureControlClusterServer(endpoint, selectedTem
17
8
  });
18
9
  return endpoint;
19
10
  }
20
- /**
21
- * Creates a TemperatureControl Cluster Server with features TemperatureNumber and TemperatureStep.
22
- *
23
- * @param {MatterbridgeEndpoint} endpoint - The Matterbridge endpoint instance.
24
- * @param {number} temperatureSetpoint - The temperature setpoint * 100. Defaults to 40 * 100 (which corresponds to 40°C).
25
- * @param {number} minTemperature - The minimum temperature * 100. Defaults to 30 * 100 (which corresponds to 30°C). Fixed attribute.
26
- * @param {number} maxTemperature - The maximum temperature * 100. Defaults to 60 * 100 (which corresponds to 60°C). Fixed attribute.
27
- * @param {number} [step] - The step size for temperature changes. Defaults to 10 * 100 (which corresponds to 10°C). Fixed attribute.
28
- *
29
- * @returns {this} The current MatterbridgeEndpoint instance for chaining.
30
- */
31
11
  export function createNumberTemperatureControlClusterServer(endpoint, temperatureSetpoint = 40 * 100, minTemperature = 30 * 100, maxTemperature = 60 * 100, step = 10 * 100) {
32
12
  endpoint.behaviors.require(MatterbridgeNumberTemperatureControlServer.with(TemperatureControl.Feature.TemperatureNumber, TemperatureControl.Feature.TemperatureStep), {
33
13
  temperatureSetpoint,
34
- minTemperature, // Fixed attribute
35
- maxTemperature, // Fixed attribute
36
- step, // Fixed attribute
14
+ minTemperature,
15
+ maxTemperature,
16
+ step,
37
17
  });
38
18
  return endpoint;
39
19
  }
@@ -75,4 +55,3 @@ export class MatterbridgeNumberTemperatureControlServer extends TemperatureContr
75
55
  }
76
56
  }
77
57
  }
78
- //# sourceMappingURL=temperatureControl.js.map
@@ -1,26 +1,3 @@
1
- /**
2
- * @description This file contains the WaterHeater class.
3
- * @file src/devices/waterHeater.ts
4
- * @author Luca Liguori
5
- * @contributor Ludovic BOUÉ
6
- * @created 2025-05-18
7
- * @version 1.1.0
8
- * @license Apache-2.0
9
- *
10
- * Copyright 2025, 2026, 2027 Luca Liguori.
11
- *
12
- * Licensed under the Apache License, Version 2.0 (the "License");
13
- * you may not use this file except in compliance with the License.
14
- * You may obtain a copy of the License at
15
- *
16
- * http://www.apache.org/licenses/LICENSE-2.0
17
- *
18
- * Unless required by applicable law or agreed to in writing, software
19
- * distributed under the License is distributed on an "AS IS" BASIS,
20
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
- * See the License for the specific language governing permissions and
22
- * limitations under the License.
23
- */
24
1
  import { ModeBase } from '@matter/types/clusters/mode-base';
25
2
  import { WaterHeaterManagement } from '@matter/types/clusters/water-heater-management';
26
3
  import { WaterHeaterMode } from '@matter/types/clusters/water-heater-mode';
@@ -31,29 +8,6 @@ import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
31
8
  import { electricalSensor, powerSource, waterHeater } from '../matterbridgeDeviceTypes.js';
32
9
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
33
10
  export class WaterHeater extends MatterbridgeEndpoint {
34
- /**
35
- * Creates an instance of the WaterHeater class.
36
- *
37
- * @param {string} name - The name of the water heater.
38
- * @param {string} serial - The serial number of the water heater.
39
- * @param {number} [waterTemperature] - The current water temperature. Defaults to 50.
40
- * @param {number} [targetWaterTemperature] - The target water temperature. Defaults to 55.
41
- * @param {number} [minHeatSetpointLimit] - The minimum heat setpoint limit. Defaults to 20.
42
- * @param {number} [maxHeatSetpointLimit] - The maximum heat setpoint limit. Defaults to 80.
43
- * @param {{ immersionElement1?: boolean; immersionElement2?: boolean; heatPump?: boolean; boiler?: boolean; other?: boolean }} [heaterTypes] - Indicates the heat sources that the water heater can call on for heating. Defaults to { immersionElement1: true }.
44
- * @param {boolean} heaterTypes.immersionElement1 - Indicates if the water heater has an immersion element 1. Defaults to true.
45
- * @param {boolean} heaterTypes.immersionElement2 - Indicates if the water heater has an immersion element 2.
46
- * @param {boolean} heaterTypes.heatPump - Indicates if the water heater has a heat pump.
47
- * @param {boolean} heaterTypes.boiler - Indicates if the water heater has a boiler.
48
- * @param {boolean} heaterTypes.other - Indicates if the water heater has other types of heating sources.
49
- * @param {number} [tankPercentage] - The current tank percentage of the WaterHeaterManagement cluster. Defaults to 90.
50
- * @param {number} [voltage] - The voltage value in millivolts. Defaults to null if not provided.
51
- * @param {number} [current] - The current value in milliamperes. Defaults to null if not provided.
52
- * @param {number} [power] - The power value in milliwatts. Defaults to null if not provided.
53
- * @param {number} [energy] - The total consumption value in mW/h. Defaults to null if not provided.
54
- * @param {number} [absMinPower] - Indicate the minimum electrical power in mw that the ESA can consume when switched on. Defaults to `0` if not provided.
55
- * @param {number} [absMaxPower] - Indicate the maximum electrical power in mw that the ESA can consume when switched on. Defaults to `0` if not provided.
56
- */
57
11
  constructor(name, serial, waterTemperature = 50, targetWaterTemperature = 55, minHeatSetpointLimit = 20, maxHeatSetpointLimit = 80, heaterTypes = { immersionElement1: true }, tankPercentage = 90, voltage = null, current = null, power = null, energy = null, absMinPower = 0, absMaxPower = 0) {
58
12
  super([waterHeater, powerSource, electricalSensor], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
59
13
  this.createDefaultIdentifyClusterServer()
@@ -68,42 +22,15 @@ export class WaterHeater extends MatterbridgeEndpoint {
68
22
  .createDefaultDeviceEnergyManagementClusterServer(DeviceEnergyManagement.EsaType.WaterHeating, true, DeviceEnergyManagement.EsaState.Online, absMinPower, absMaxPower)
69
23
  .createDefaultDeviceEnergyManagementModeClusterServer();
70
24
  }
71
- /**
72
- * Creates a default WaterHeaterManagement Cluster Server.
73
- *
74
- * @param {{ immersionElement1?: boolean; immersionElement2?: boolean; heatPump?: boolean; boiler?: boolean; other?: boolean }} [heaterTypes] - Indicates the heat sources that the water heater can call on for heating. Defaults to { immersionElement1: true }.
75
- * @param {boolean} heaterTypes.immersionElement1 - Indicates if the water heater has an immersion element 1. Defaults to true.
76
- * @param {boolean} heaterTypes.immersionElement2 - Indicates if the water heater has an immersion element 2.
77
- * @param {boolean} heaterTypes.heatPump - Indicates if the water heater has a heat pump.
78
- * @param {boolean} heaterTypes.boiler - Indicates if the water heater has a boiler.
79
- * @param {boolean} heaterTypes.other - Indicates if the water heater has other types of heating sources.
80
- * @param {{ immersionElement1?: boolean; immersionElement2?: boolean; heatPump?: boolean; boiler?: boolean; other?: boolean }} [heatDemand] - Indicates if the water heater is heating water. Defaults to all heat sources unset.
81
- * @param {boolean} heatDemand.immersionElement1 - Indicates if the water heater is heating water with immersion element 1. Defaults to false.
82
- * @param {boolean} heatDemand.immersionElement2 - Indicates if the water heater is heating water with immersion element 2.
83
- * @param {boolean} heatDemand.heatPump - Indicates if the water heater is heating water with a heat pump.
84
- * @param {boolean} heatDemand.boiler - Indicates if the water heater is heating water with a boiler.
85
- * @param {boolean} heatDemand.other - Indicates if the water heater is heating water with other types of heating sources.
86
- * @param {number} [tankPercentage] - The current tank percentage of the WaterHeaterManagement cluster. Defaults to 100.
87
- * @param {WaterHeaterManagement.BoostState} [boostState] - The current boost state of the WaterHeaterManagement cluster. Defaults to Inactive.
88
- * @returns {this} The current MatterbridgeEndpoint instance for chaining.
89
- */
90
25
  createDefaultWaterHeaterManagementClusterServer(heaterTypes, heatDemand, tankPercentage, boostState) {
91
26
  this.behaviors.require(MatterbridgeWaterHeaterManagementServer.with(WaterHeaterManagement.Feature.TankPercent), {
92
- heaterTypes: heaterTypes ?? { immersionElement1: true }, // Fixed attribute
27
+ heaterTypes: heaterTypes ?? { immersionElement1: true },
93
28
  heatDemand: heatDemand ?? {},
94
29
  tankPercentage: tankPercentage ?? 100,
95
30
  boostState: boostState ?? WaterHeaterManagement.BoostState.Inactive,
96
31
  });
97
32
  return this;
98
33
  }
99
- /**
100
- * Creates a default WaterHeaterMode Cluster Server.
101
- *
102
- * @param {number} [currentMode] - The current mode of the WaterHeaterMode cluster. Defaults to mode 1 (WaterHeaterMode.ModeTag.Auto).
103
- * @param {WaterHeaterMode.ModeOption[]} [supportedModes] - The supported modes for the WaterHeaterMode cluster. Defaults all cluster modes.
104
- *
105
- * @returns {this} The current MatterbridgeEndpoint instance for chaining.
106
- */
107
34
  createDefaultWaterHeaterModeClusterServer(currentMode, supportedModes) {
108
35
  this.behaviors.require(MatterbridgeWaterHeaterModeServer, {
109
36
  supportedModes: supportedModes ?? [
@@ -120,7 +47,7 @@ export class WaterHeater extends MatterbridgeEndpoint {
120
47
  { label: 'Off', mode: 11, modeTags: [{ value: WaterHeaterMode.ModeTag.Off }] },
121
48
  { label: 'Manual', mode: 12, modeTags: [{ value: WaterHeaterMode.ModeTag.Manual }] },
122
49
  { label: 'Timed', mode: 13, modeTags: [{ value: WaterHeaterMode.ModeTag.Timed }] },
123
- ], // Fixed attribute
50
+ ],
124
51
  currentMode: currentMode ?? 1,
125
52
  });
126
53
  return this;
@@ -133,9 +60,6 @@ export class MatterbridgeWaterHeaterManagementServer extends WaterHeaterManageme
133
60
  device.commandHandler.executeHandler('boost', { request, cluster: WaterHeaterManagementServer.id, attributes: this.state, endpoint: this.endpoint });
134
61
  device.log.debug(`MatterbridgeWaterHeaterManagementServer boost called with: ${JSON.stringify(request)}`);
135
62
  this.state.boostState = WaterHeaterManagement.BoostState.Active;
136
- // The implementation is responsible for setting the device accordingly with the boostInfo of the boost command
137
- // super.boost({ boostInfo });
138
- // boost is not implemented in matter.js
139
63
  }
140
64
  cancelBoost() {
141
65
  const device = this.endpoint.stateOf(MatterbridgeServer);
@@ -143,9 +67,6 @@ export class MatterbridgeWaterHeaterManagementServer extends WaterHeaterManageme
143
67
  device.commandHandler.executeHandler('cancelBoost', { request: {}, cluster: WaterHeaterManagementServer.id, attributes: this.state, endpoint: this.endpoint });
144
68
  device.log.debug(`MatterbridgeWaterHeaterManagementServer cancelBoost called`);
145
69
  this.state.boostState = WaterHeaterManagement.BoostState.Inactive;
146
- // The implementation is responsible for setting the device accordingly with the cancelBoost command
147
- // super.cancelBoost();
148
- // cancelBoost is not implemented in matter.js
149
70
  }
150
71
  }
151
72
  export class MatterbridgeWaterHeaterModeServer extends WaterHeaterModeServer {
@@ -163,4 +84,3 @@ export class MatterbridgeWaterHeaterModeServer extends WaterHeaterModeServer {
163
84
  return { status: ModeBase.ModeChangeStatus.Success, statusText: 'Success' };
164
85
  }
165
86
  }
166
- //# sourceMappingURL=waterHeater.js.map
@@ -1,28 +1,4 @@
1
- /**
2
- * @description This file contains the class Coap.
3
- * @file src/dgram/coap.ts
4
- * @author Luca Liguori
5
- * @created 2025-03-22
6
- * @version 1.0.0
7
- * @license Apache-2.0
8
- *
9
- * Copyright 2025, 2026, 2027 Luca Liguori.
10
- *
11
- * Licensed under the Apache License, Version 2.0 (the "License");
12
- * you may not use this file except in compliance with the License.
13
- * You may obtain a copy of the License at
14
- *
15
- * http://www.apache.org/licenses/LICENSE-2.0
16
- *
17
- * Unless required by applicable law or agreed to in writing, software
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
- * See the License for the specific language governing permissions and
21
- * limitations under the License.
22
- */
23
- // AnsiLogger imports
24
1
  import { BLUE, db, GREEN, MAGENTA, nf } from 'node-ansi-logger';
25
- // Net imports
26
2
  import { COAP_MULTICAST_IPV4_ADDRESS, COAP_MULTICAST_PORT, Multicast } from './multicast.js';
27
3
  export const COAP_OPTION_URI_PATH = 11;
28
4
  export const COIOT_OPTION_DEVID = 3332;
@@ -48,26 +24,16 @@ export class Coap extends Multicast {
48
24
  this.log.error(`Error decoding CoAP message: ${error instanceof Error ? error.message : error}`);
49
25
  }
50
26
  }
51
- /**
52
- * Decodes a CoAP message from a Buffer.
53
- *
54
- * @param {Buffer} msg - The Buffer containing the raw CoAP message.
55
- * @returns {CoapMessage} A parsed CoAP message object.
56
- * @throws {Error} if the message is malformed.
57
- */
58
27
  decodeCoapMessage(msg) {
59
- // A valid CoAP message must have at least 4 bytes for the header.
60
28
  if (msg.length < 4) {
61
29
  throw new Error('Message too short to be a valid CoAP message');
62
30
  }
63
- // Parse the 4-byte fixed header.
64
- const version = (msg[0] & 0xc0) >> 6; // Bits 7-6: Version
65
- const type = (msg[0] & 0x30) >> 4; // Bits 5-4: Type
66
- const tokenLength = msg[0] & 0x0f; // Bits 3-0: Token Length
67
- const code = msg[1]; // 8-bit Code
68
- const messageId = msg.readUInt16BE(2); // 16-bit Message ID
31
+ const version = (msg[0] & 0xc0) >> 6;
32
+ const type = (msg[0] & 0x30) >> 4;
33
+ const tokenLength = msg[0] & 0x0f;
34
+ const code = msg[1];
35
+ const messageId = msg.readUInt16BE(2);
69
36
  let offset = 4;
70
- // Parse token if present.
71
37
  let token = Buffer.alloc(0);
72
38
  if (tokenLength > 0) {
73
39
  if (msg.length < offset + tokenLength) {
@@ -76,20 +42,16 @@ export class Coap extends Multicast {
76
42
  token = msg.slice(offset, offset + tokenLength);
77
43
  offset += tokenLength;
78
44
  }
79
- // Parse options.
80
45
  const options = [];
81
46
  let currentOptionNumber = 0;
82
47
  while (offset < msg.length) {
83
- // Payload marker: 0xFF indicates the beginning of the payload.
84
48
  if (msg[offset] === 0xff) {
85
- offset++; // Skip the marker.
49
+ offset++;
86
50
  break;
87
51
  }
88
- // Read the option header byte.
89
52
  const optionHeader = msg[offset++];
90
- let delta = (optionHeader & 0xf0) >> 4; // High nibble: option delta.
91
- let length = optionHeader & 0x0f; // Low nibble: option length.
92
- // Extended delta handling.
53
+ let delta = (optionHeader & 0xf0) >> 4;
54
+ let length = optionHeader & 0x0f;
93
55
  if (delta === 13) {
94
56
  if (offset >= msg.length) {
95
57
  throw new Error('Invalid extended option delta');
@@ -106,7 +68,6 @@ export class Coap extends Multicast {
106
68
  else if (delta === 15) {
107
69
  throw new Error('Reserved option delta value encountered');
108
70
  }
109
- // Extended length handling.
110
71
  if (length === 13) {
111
72
  if (offset >= msg.length) {
112
73
  throw new Error('Invalid extended option length');
@@ -123,9 +84,7 @@ export class Coap extends Multicast {
123
84
  else if (length === 15) {
124
85
  throw new Error('Reserved option length value encountered');
125
86
  }
126
- // Calculate the actual option number.
127
87
  currentOptionNumber += delta;
128
- // Ensure that the option's value fits in the remaining message.
129
88
  if (offset + length > msg.length) {
130
89
  throw new Error('Option length exceeds message length');
131
90
  }
@@ -136,7 +95,6 @@ export class Coap extends Multicast {
136
95
  value: optionValue,
137
96
  });
138
97
  }
139
- // Parse payload if any remains.
140
98
  const payload = offset < msg.length ? msg.slice(offset) : undefined;
141
99
  return {
142
100
  version,
@@ -149,38 +107,23 @@ export class Coap extends Multicast {
149
107
  payload,
150
108
  };
151
109
  }
152
- /**
153
- * Encodes a CoAP message into a Buffer.
154
- *
155
- * @param {CoapMessage} msg - The CoAP message to encode.
156
- * @returns {Buffer} A Buffer representing the encoded CoAP message.
157
- * @throws {Error} if the message is malformed.
158
- */
159
110
  encodeCoapMessage(msg) {
160
111
  const parts = [];
161
- // Determine token length (ensure it's consistent with msg.token)
162
112
  const token = msg.token || Buffer.alloc(0);
163
113
  const tokenLength = token.length;
164
114
  if (tokenLength > 8) {
165
115
  throw new Error('Token length cannot exceed 8 bytes');
166
116
  }
167
- // Create header (4 bytes):
168
- // Byte 0: Version (2 bits), Type (2 bits), Token Length (4 bits)
169
- // Byte 1: Code (8 bits)
170
- // Bytes 2-3: Message ID (16 bits)
171
117
  const header = Buffer.alloc(4);
172
118
  header[0] = ((msg.version & 0x03) << 6) | ((msg.type & 0x03) << 4) | (tokenLength & 0x0f);
173
119
  header[1] = msg.code;
174
120
  header.writeUInt16BE(msg.messageId, 2);
175
121
  parts.push(header);
176
- // Append token if present.
177
122
  if (tokenLength > 0) {
178
123
  parts.push(token);
179
124
  }
180
- // Sort options by option number in ascending order.
181
125
  const sortedOptions = msg.options.slice().sort((a, b) => a.number - b.number);
182
126
  let previousOptionNumber = 0;
183
- // Encode each option.
184
127
  for (const option of sortedOptions) {
185
128
  const optionDelta = option.number - previousOptionNumber;
186
129
  const optionValueLength = option.value.length;
@@ -188,7 +131,6 @@ export class Coap extends Multicast {
188
131
  let deltaExtended = null;
189
132
  let lengthNibble;
190
133
  let lengthExtended = null;
191
- // Determine option delta nibble and extended delta field.
192
134
  if (optionDelta < 13) {
193
135
  deltaNibble = optionDelta;
194
136
  }
@@ -201,7 +143,6 @@ export class Coap extends Multicast {
201
143
  deltaExtended = Buffer.alloc(2);
202
144
  deltaExtended.writeUInt16BE(optionDelta - 269, 0);
203
145
  }
204
- // Determine option length nibble and extended length field.
205
146
  if (optionValueLength < 13) {
206
147
  lengthNibble = optionValueLength;
207
148
  }
@@ -214,42 +155,24 @@ export class Coap extends Multicast {
214
155
  lengthExtended = Buffer.alloc(2);
215
156
  lengthExtended.writeUInt16BE(optionValueLength - 269, 0);
216
157
  }
217
- // Option header byte: high nibble is delta, low nibble is length.
218
158
  const optionHeader = Buffer.alloc(1);
219
159
  optionHeader[0] = (deltaNibble << 4) | (lengthNibble & 0x0f);
220
160
  parts.push(optionHeader);
221
- // Append extended delta if needed.
222
161
  if (deltaExtended) {
223
162
  parts.push(deltaExtended);
224
163
  }
225
- // Append extended length if needed.
226
164
  if (lengthExtended) {
227
165
  parts.push(lengthExtended);
228
166
  }
229
- // Append the option value.
230
167
  parts.push(option.value);
231
- // Update previous option number.
232
168
  previousOptionNumber = option.number;
233
169
  }
234
- // If a payload is present, add the payload marker (0xFF) followed by the payload.
235
170
  if (msg.payload && msg.payload.length > 0) {
236
- parts.push(Buffer.from([0xff])); // Payload marker.
171
+ parts.push(Buffer.from([0xff]));
237
172
  parts.push(msg.payload);
238
173
  }
239
174
  return Buffer.concat(parts);
240
175
  }
241
- /**
242
- * Converts a CoAP message type numeric value to its string representation.
243
- *
244
- * CoAP message types are:
245
- * - 0: Confirmable (CON)
246
- * - 1: Non-confirmable (NON)
247
- * - 2: Acknowledgement (ACK)
248
- * - 3: Reset (RST)
249
- *
250
- * @param {number} type - The numeric CoAP message type.
251
- * @returns {string} The string representation of the message type.
252
- */
253
176
  coapTypeToString(type) {
254
177
  switch (type) {
255
178
  case 0:
@@ -264,37 +187,18 @@ export class Coap extends Multicast {
264
187
  return `Unknown Type (${type})`;
265
188
  }
266
189
  }
267
- /**
268
- * Converts a CoAP code numeric value to its string representation.
269
- *
270
- * The CoAP code is split into a 3-bit class and a 5-bit detail.
271
- * For example:
272
- * - 0.01: GET
273
- * - 0.02: POST
274
- * - 0.03: PUT
275
- * - 0.04: DELETE
276
- * - 2.05: Content (success response)
277
- * - 4.04: Not Found (client error)
278
- * - 5.00: Internal Server Error (server error)
279
- *
280
- * @param {number} code - The numeric CoAP code.
281
- * @returns {string} The string representation of the code.
282
- */
283
190
  coapCodeToString(code) {
284
- // Split the code: the upper 3 bits form the class and the lower 5 bits form the detail.
285
191
  const cls = code >> 5;
286
192
  const detail = code & 0x1f;
287
193
  const codeStr = `${cls}.${detail.toString().padStart(2, '0')}`;
288
194
  return codeStr;
289
195
  }
290
- sendRequest(messageId, options,
291
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
292
- payload, token, address, port) {
196
+ sendRequest(messageId, options, payload, token, address, port) {
293
197
  const coapMessage = {
294
198
  version: 1,
295
- type: 1, // e.g., Confirmable
199
+ type: 1,
296
200
  tokenLength: token ? Buffer.from(token).length : 0,
297
- code: 1, // e.g., GET
201
+ code: 1,
298
202
  messageId,
299
203
  token: token ? Buffer.from(token) : Buffer.alloc(0),
300
204
  options,
@@ -313,10 +217,6 @@ export class Coap extends Multicast {
313
217
  this.log.info(`Option: COAP_OPTION_URI_PATH => ${GREEN}${option.value}${nf}`);
314
218
  }
315
219
  else if (option.number === COIOT_OPTION_DEVID) {
316
- /*
317
- * First defined option is COIOT_OPTION_GLOBAL_DEVID. This is a global option and must be present in all CoIoT packages with request or payload.
318
- * Its value is a string in format <devtype>#<devid>#<version> for example SHSEN-1#4B3F9E#1 The whole option should be less than 50 bytes.
319
- */
320
220
  const parts = option.value.toString().split('#');
321
221
  const deviceModel = parts[0];
322
222
  const deviceMac = parts[1];
@@ -324,22 +224,10 @@ export class Coap extends Multicast {
324
224
  this.log.info(`Option: COIOT_OPTION_DEVID => ${option.value} => Model: ${GREEN}${deviceModel}${nf}, MAC: ${GREEN}${deviceMac}${nf}, Protocol: ${GREEN}${protocolRevision}${nf}`);
325
225
  }
326
226
  else if (option.number === COIOT_OPTION_SERIAL) {
327
- /*
328
- * This option is mandatory in status response and publishes. It is a uint16_t in network byte order which indicates a change in the status report.
329
- * When a new status report is handled, all payload processing can be skipped if the serial number does not change from the last processed payload.
330
- * The value 0 is reserved and should not be sent. This allows easy initialization in the receiving devices.
331
- */
332
227
  const serial = option.value.readUInt16BE(0);
333
228
  this.log.info(`Option: COIOT_OPTION_SERIAL => 0x${option.value.toString('hex')} => serial: ${GREEN}${serial}${nf}`);
334
229
  }
335
230
  else if (option.number === COIOT_OPTION_VALIDITY) {
336
- /*
337
- * COIOT_OPTION_STATUS_VALIDITY is a uint16_t in network byte order (big endian) that states the maximal time between this and the next status publish.
338
- * This way a device can state its report interval. If a report is not received from this device after the interval has passed the device should be considered offline.
339
- * The LS bit of this option controls how the value is scaled:
340
- * - If the LS bit is 0, the value is number of 1/10 of seconds in the validity period, so 2 is 0.2 seconds, 10 is a second, 600 is a minute, 65534 is 109 minutes and 13 seconds.
341
- * - If the LS bit is 1, the value is number of 4 seconds interval in the whole interval. So 3 is 12 seconds, 11 is 44 seconds and 65535 is more than 3 days.
342
- */
343
231
  const validity = option.value.readUInt16BE(0);
344
232
  let validFor = 0;
345
233
  if ((validity & 0x1) === 0) {
@@ -354,7 +242,7 @@ export class Coap extends Multicast {
354
242
  this.log.info(`Option: ${option.number} - ${option.value
355
243
  .toString('hex')
356
244
  .match(/.{1,2}/g)
357
- ?.join(' ')}`); // Split into pairs of hex characters
245
+ ?.join(' ')}`);
358
246
  });
359
247
  if (msg.payload && msg.payload.length > 0)
360
248
  this.log.info(`Payload:`, JSON.parse(msg.payload.toString()), '\n');
@@ -362,4 +250,3 @@ export class Coap extends Multicast {
362
250
  this.log.info(`No payload`, '\n');
363
251
  }
364
252
  }
365
- //# sourceMappingURL=coap.js.map