matterbridge 3.4.4 → 3.4.5-dev-20251223-f84f73d

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 (326) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README-DEV.md +23 -3
  3. package/README.md +17 -2
  4. package/dist/broadcastServer.js +0 -117
  5. package/dist/broadcastServerTypes.js +0 -24
  6. package/dist/cli.js +1 -97
  7. package/dist/cliEmitter.js +0 -37
  8. package/dist/cliHistory.js +0 -38
  9. package/dist/clusters/export.js +0 -2
  10. package/dist/deviceManager.js +1 -113
  11. package/dist/devices/airConditioner.js +0 -57
  12. package/dist/devices/batteryStorage.js +1 -48
  13. package/dist/devices/cooktop.js +0 -56
  14. package/dist/devices/dishwasher.js +0 -57
  15. package/dist/devices/evse.js +10 -74
  16. package/dist/devices/export.js +0 -5
  17. package/dist/devices/extractorHood.js +0 -43
  18. package/dist/devices/heatPump.js +2 -50
  19. package/dist/devices/laundryDryer.js +3 -62
  20. package/dist/devices/laundryWasher.js +4 -70
  21. package/dist/devices/microwaveOven.js +5 -88
  22. package/dist/devices/oven.js +0 -85
  23. package/dist/devices/refrigerator.js +0 -102
  24. package/dist/devices/roboticVacuumCleaner.js +9 -100
  25. package/dist/devices/solarPower.js +0 -38
  26. package/dist/devices/speaker.js +0 -84
  27. package/dist/devices/temperatureControl.js +3 -24
  28. package/dist/devices/waterHeater.js +2 -82
  29. package/dist/dgram/coap.js +13 -126
  30. package/dist/dgram/dgram.js +2 -114
  31. package/dist/dgram/mb_coap.js +3 -41
  32. package/dist/dgram/mb_mdns.js +15 -80
  33. package/dist/dgram/mdns.js +137 -299
  34. package/dist/dgram/multicast.js +1 -62
  35. package/dist/dgram/unicast.js +0 -54
  36. package/dist/frontend.js +38 -485
  37. package/dist/frontendTypes.js +0 -45
  38. package/dist/helpers.js +0 -53
  39. package/dist/index.js +0 -25
  40. package/dist/jestutils/export.js +0 -1
  41. package/dist/jestutils/jestHelpers.js +14 -371
  42. package/dist/logger/export.js +0 -1
  43. package/dist/matter/behaviors.js +0 -2
  44. package/dist/matter/clusters.js +0 -2
  45. package/dist/matter/devices.js +0 -2
  46. package/dist/matter/endpoints.js +0 -2
  47. package/dist/matter/export.js +0 -3
  48. package/dist/matter/types.js +0 -3
  49. package/dist/matterNode.js +8 -369
  50. package/dist/matterbridge.js +46 -824
  51. package/dist/matterbridgeAccessoryPlatform.js +0 -38
  52. package/dist/matterbridgeBehaviors.js +5 -68
  53. package/dist/matterbridgeDeviceTypes.js +14 -635
  54. package/dist/matterbridgeDynamicPlatform.js +0 -38
  55. package/dist/matterbridgeEndpoint.js +53 -1457
  56. package/dist/matterbridgeEndpointHelpers.js +20 -483
  57. package/dist/matterbridgeEndpointTypes.js +0 -25
  58. package/dist/matterbridgePlatform.js +1 -451
  59. package/dist/matterbridgeTypes.js +0 -26
  60. package/dist/pluginManager.js +5 -341
  61. package/dist/shelly.js +7 -178
  62. package/dist/storage/export.js +0 -1
  63. package/dist/update.js +1 -93
  64. package/dist/utils/colorUtils.js +2 -97
  65. package/dist/utils/commandLine.js +0 -60
  66. package/dist/utils/copyDirectory.js +0 -37
  67. package/dist/utils/createDirectory.js +0 -33
  68. package/dist/utils/createZip.js +2 -47
  69. package/dist/utils/deepCopy.js +0 -39
  70. package/dist/utils/deepEqual.js +1 -72
  71. package/dist/utils/error.js +0 -42
  72. package/dist/utils/export.js +0 -1
  73. package/dist/utils/format.js +0 -49
  74. package/dist/utils/hex.js +0 -124
  75. package/dist/utils/inspector.js +1 -69
  76. package/dist/utils/isvalid.js +0 -101
  77. package/dist/utils/network.js +5 -96
  78. package/dist/utils/spawn.js +1 -71
  79. package/dist/utils/tracker.js +1 -64
  80. package/dist/utils/wait.js +8 -60
  81. package/dist/workerGlobalPrefix.js +5 -37
  82. package/dist/workerTypes.js +0 -24
  83. package/dist/workers.js +4 -68
  84. package/npm-shrinkwrap.json +2 -2
  85. package/package.json +1 -2
  86. package/dist/broadcastServer.d.ts +0 -144
  87. package/dist/broadcastServer.d.ts.map +0 -1
  88. package/dist/broadcastServer.js.map +0 -1
  89. package/dist/broadcastServerTypes.d.ts +0 -841
  90. package/dist/broadcastServerTypes.d.ts.map +0 -1
  91. package/dist/broadcastServerTypes.js.map +0 -1
  92. package/dist/cli.d.ts +0 -30
  93. package/dist/cli.d.ts.map +0 -1
  94. package/dist/cli.js.map +0 -1
  95. package/dist/cliEmitter.d.ts +0 -50
  96. package/dist/cliEmitter.d.ts.map +0 -1
  97. package/dist/cliEmitter.js.map +0 -1
  98. package/dist/cliHistory.d.ts +0 -48
  99. package/dist/cliHistory.d.ts.map +0 -1
  100. package/dist/cliHistory.js.map +0 -1
  101. package/dist/clusters/export.d.ts +0 -2
  102. package/dist/clusters/export.d.ts.map +0 -1
  103. package/dist/clusters/export.js.map +0 -1
  104. package/dist/deviceManager.d.ts +0 -135
  105. package/dist/deviceManager.d.ts.map +0 -1
  106. package/dist/deviceManager.js.map +0 -1
  107. package/dist/devices/airConditioner.d.ts +0 -98
  108. package/dist/devices/airConditioner.d.ts.map +0 -1
  109. package/dist/devices/airConditioner.js.map +0 -1
  110. package/dist/devices/batteryStorage.d.ts +0 -48
  111. package/dist/devices/batteryStorage.d.ts.map +0 -1
  112. package/dist/devices/batteryStorage.js.map +0 -1
  113. package/dist/devices/cooktop.d.ts +0 -61
  114. package/dist/devices/cooktop.d.ts.map +0 -1
  115. package/dist/devices/cooktop.js.map +0 -1
  116. package/dist/devices/dishwasher.d.ts +0 -71
  117. package/dist/devices/dishwasher.d.ts.map +0 -1
  118. package/dist/devices/dishwasher.js.map +0 -1
  119. package/dist/devices/evse.d.ts +0 -76
  120. package/dist/devices/evse.d.ts.map +0 -1
  121. package/dist/devices/evse.js.map +0 -1
  122. package/dist/devices/export.d.ts +0 -17
  123. package/dist/devices/export.d.ts.map +0 -1
  124. package/dist/devices/export.js.map +0 -1
  125. package/dist/devices/extractorHood.d.ts +0 -46
  126. package/dist/devices/extractorHood.d.ts.map +0 -1
  127. package/dist/devices/extractorHood.js.map +0 -1
  128. package/dist/devices/heatPump.d.ts +0 -47
  129. package/dist/devices/heatPump.d.ts.map +0 -1
  130. package/dist/devices/heatPump.js.map +0 -1
  131. package/dist/devices/laundryDryer.d.ts +0 -67
  132. package/dist/devices/laundryDryer.d.ts.map +0 -1
  133. package/dist/devices/laundryDryer.js.map +0 -1
  134. package/dist/devices/laundryWasher.d.ts +0 -81
  135. package/dist/devices/laundryWasher.d.ts.map +0 -1
  136. package/dist/devices/laundryWasher.js.map +0 -1
  137. package/dist/devices/microwaveOven.d.ts +0 -168
  138. package/dist/devices/microwaveOven.d.ts.map +0 -1
  139. package/dist/devices/microwaveOven.js.map +0 -1
  140. package/dist/devices/oven.d.ts +0 -105
  141. package/dist/devices/oven.d.ts.map +0 -1
  142. package/dist/devices/oven.js.map +0 -1
  143. package/dist/devices/refrigerator.d.ts +0 -118
  144. package/dist/devices/refrigerator.d.ts.map +0 -1
  145. package/dist/devices/refrigerator.js.map +0 -1
  146. package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
  147. package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
  148. package/dist/devices/roboticVacuumCleaner.js.map +0 -1
  149. package/dist/devices/solarPower.d.ts +0 -40
  150. package/dist/devices/solarPower.d.ts.map +0 -1
  151. package/dist/devices/solarPower.js.map +0 -1
  152. package/dist/devices/speaker.d.ts +0 -87
  153. package/dist/devices/speaker.d.ts.map +0 -1
  154. package/dist/devices/speaker.js.map +0 -1
  155. package/dist/devices/temperatureControl.d.ts +0 -166
  156. package/dist/devices/temperatureControl.d.ts.map +0 -1
  157. package/dist/devices/temperatureControl.js.map +0 -1
  158. package/dist/devices/waterHeater.d.ts +0 -111
  159. package/dist/devices/waterHeater.d.ts.map +0 -1
  160. package/dist/devices/waterHeater.js.map +0 -1
  161. package/dist/dgram/coap.d.ts +0 -205
  162. package/dist/dgram/coap.d.ts.map +0 -1
  163. package/dist/dgram/coap.js.map +0 -1
  164. package/dist/dgram/dgram.d.ts +0 -141
  165. package/dist/dgram/dgram.d.ts.map +0 -1
  166. package/dist/dgram/dgram.js.map +0 -1
  167. package/dist/dgram/mb_coap.d.ts +0 -24
  168. package/dist/dgram/mb_coap.d.ts.map +0 -1
  169. package/dist/dgram/mb_coap.js.map +0 -1
  170. package/dist/dgram/mb_mdns.d.ts +0 -24
  171. package/dist/dgram/mb_mdns.d.ts.map +0 -1
  172. package/dist/dgram/mb_mdns.js.map +0 -1
  173. package/dist/dgram/mdns.d.ts +0 -290
  174. package/dist/dgram/mdns.d.ts.map +0 -1
  175. package/dist/dgram/mdns.js.map +0 -1
  176. package/dist/dgram/multicast.d.ts +0 -67
  177. package/dist/dgram/multicast.d.ts.map +0 -1
  178. package/dist/dgram/multicast.js.map +0 -1
  179. package/dist/dgram/unicast.d.ts +0 -56
  180. package/dist/dgram/unicast.d.ts.map +0 -1
  181. package/dist/dgram/unicast.js.map +0 -1
  182. package/dist/frontend.d.ts +0 -245
  183. package/dist/frontend.d.ts.map +0 -1
  184. package/dist/frontend.js.map +0 -1
  185. package/dist/frontendTypes.d.ts +0 -529
  186. package/dist/frontendTypes.d.ts.map +0 -1
  187. package/dist/frontendTypes.js.map +0 -1
  188. package/dist/helpers.d.ts +0 -48
  189. package/dist/helpers.d.ts.map +0 -1
  190. package/dist/helpers.js.map +0 -1
  191. package/dist/index.d.ts +0 -34
  192. package/dist/index.d.ts.map +0 -1
  193. package/dist/index.js.map +0 -1
  194. package/dist/jestutils/export.d.ts +0 -2
  195. package/dist/jestutils/export.d.ts.map +0 -1
  196. package/dist/jestutils/export.js.map +0 -1
  197. package/dist/jestutils/jestHelpers.d.ts +0 -345
  198. package/dist/jestutils/jestHelpers.d.ts.map +0 -1
  199. package/dist/jestutils/jestHelpers.js.map +0 -1
  200. package/dist/logger/export.d.ts +0 -2
  201. package/dist/logger/export.d.ts.map +0 -1
  202. package/dist/logger/export.js.map +0 -1
  203. package/dist/matter/behaviors.d.ts +0 -2
  204. package/dist/matter/behaviors.d.ts.map +0 -1
  205. package/dist/matter/behaviors.js.map +0 -1
  206. package/dist/matter/clusters.d.ts +0 -2
  207. package/dist/matter/clusters.d.ts.map +0 -1
  208. package/dist/matter/clusters.js.map +0 -1
  209. package/dist/matter/devices.d.ts +0 -2
  210. package/dist/matter/devices.d.ts.map +0 -1
  211. package/dist/matter/devices.js.map +0 -1
  212. package/dist/matter/endpoints.d.ts +0 -2
  213. package/dist/matter/endpoints.d.ts.map +0 -1
  214. package/dist/matter/endpoints.js.map +0 -1
  215. package/dist/matter/export.d.ts +0 -5
  216. package/dist/matter/export.d.ts.map +0 -1
  217. package/dist/matter/export.js.map +0 -1
  218. package/dist/matter/types.d.ts +0 -3
  219. package/dist/matter/types.d.ts.map +0 -1
  220. package/dist/matter/types.js.map +0 -1
  221. package/dist/matterNode.d.ts +0 -342
  222. package/dist/matterNode.d.ts.map +0 -1
  223. package/dist/matterNode.js.map +0 -1
  224. package/dist/matterbridge.d.ts +0 -505
  225. package/dist/matterbridge.d.ts.map +0 -1
  226. package/dist/matterbridge.js.map +0 -1
  227. package/dist/matterbridgeAccessoryPlatform.d.ts +0 -41
  228. package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
  229. package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
  230. package/dist/matterbridgeBehaviors.d.ts +0 -2404
  231. package/dist/matterbridgeBehaviors.d.ts.map +0 -1
  232. package/dist/matterbridgeBehaviors.js.map +0 -1
  233. package/dist/matterbridgeDeviceTypes.d.ts +0 -698
  234. package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
  235. package/dist/matterbridgeDeviceTypes.js.map +0 -1
  236. package/dist/matterbridgeDynamicPlatform.d.ts +0 -41
  237. package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
  238. package/dist/matterbridgeDynamicPlatform.js.map +0 -1
  239. package/dist/matterbridgeEndpoint.d.ts +0 -1507
  240. package/dist/matterbridgeEndpoint.d.ts.map +0 -1
  241. package/dist/matterbridgeEndpoint.js.map +0 -1
  242. package/dist/matterbridgeEndpointHelpers.d.ts +0 -787
  243. package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
  244. package/dist/matterbridgeEndpointHelpers.js.map +0 -1
  245. package/dist/matterbridgeEndpointTypes.d.ts +0 -166
  246. package/dist/matterbridgeEndpointTypes.d.ts.map +0 -1
  247. package/dist/matterbridgeEndpointTypes.js.map +0 -1
  248. package/dist/matterbridgePlatform.d.ts +0 -539
  249. package/dist/matterbridgePlatform.d.ts.map +0 -1
  250. package/dist/matterbridgePlatform.js.map +0 -1
  251. package/dist/matterbridgeTypes.d.ts +0 -252
  252. package/dist/matterbridgeTypes.d.ts.map +0 -1
  253. package/dist/matterbridgeTypes.js.map +0 -1
  254. package/dist/pluginManager.d.ts +0 -372
  255. package/dist/pluginManager.d.ts.map +0 -1
  256. package/dist/pluginManager.js.map +0 -1
  257. package/dist/shelly.d.ts +0 -181
  258. package/dist/shelly.d.ts.map +0 -1
  259. package/dist/shelly.js.map +0 -1
  260. package/dist/storage/export.d.ts +0 -2
  261. package/dist/storage/export.d.ts.map +0 -1
  262. package/dist/storage/export.js.map +0 -1
  263. package/dist/update.d.ts +0 -84
  264. package/dist/update.d.ts.map +0 -1
  265. package/dist/update.js.map +0 -1
  266. package/dist/utils/colorUtils.d.ts +0 -101
  267. package/dist/utils/colorUtils.d.ts.map +0 -1
  268. package/dist/utils/colorUtils.js.map +0 -1
  269. package/dist/utils/commandLine.d.ts +0 -66
  270. package/dist/utils/commandLine.d.ts.map +0 -1
  271. package/dist/utils/commandLine.js.map +0 -1
  272. package/dist/utils/copyDirectory.d.ts +0 -35
  273. package/dist/utils/copyDirectory.d.ts.map +0 -1
  274. package/dist/utils/copyDirectory.js.map +0 -1
  275. package/dist/utils/createDirectory.d.ts +0 -34
  276. package/dist/utils/createDirectory.d.ts.map +0 -1
  277. package/dist/utils/createDirectory.js.map +0 -1
  278. package/dist/utils/createZip.d.ts +0 -39
  279. package/dist/utils/createZip.d.ts.map +0 -1
  280. package/dist/utils/createZip.js.map +0 -1
  281. package/dist/utils/deepCopy.d.ts +0 -32
  282. package/dist/utils/deepCopy.d.ts.map +0 -1
  283. package/dist/utils/deepCopy.js.map +0 -1
  284. package/dist/utils/deepEqual.d.ts +0 -54
  285. package/dist/utils/deepEqual.d.ts.map +0 -1
  286. package/dist/utils/deepEqual.js.map +0 -1
  287. package/dist/utils/error.d.ts +0 -45
  288. package/dist/utils/error.d.ts.map +0 -1
  289. package/dist/utils/error.js.map +0 -1
  290. package/dist/utils/export.d.ts +0 -13
  291. package/dist/utils/export.d.ts.map +0 -1
  292. package/dist/utils/export.js.map +0 -1
  293. package/dist/utils/format.d.ts +0 -53
  294. package/dist/utils/format.d.ts.map +0 -1
  295. package/dist/utils/format.js.map +0 -1
  296. package/dist/utils/hex.d.ts +0 -89
  297. package/dist/utils/hex.d.ts.map +0 -1
  298. package/dist/utils/hex.js.map +0 -1
  299. package/dist/utils/inspector.d.ts +0 -87
  300. package/dist/utils/inspector.d.ts.map +0 -1
  301. package/dist/utils/inspector.js.map +0 -1
  302. package/dist/utils/isvalid.d.ts +0 -103
  303. package/dist/utils/isvalid.d.ts.map +0 -1
  304. package/dist/utils/isvalid.js.map +0 -1
  305. package/dist/utils/network.d.ts +0 -111
  306. package/dist/utils/network.d.ts.map +0 -1
  307. package/dist/utils/network.js.map +0 -1
  308. package/dist/utils/spawn.d.ts +0 -33
  309. package/dist/utils/spawn.d.ts.map +0 -1
  310. package/dist/utils/spawn.js.map +0 -1
  311. package/dist/utils/tracker.d.ts +0 -108
  312. package/dist/utils/tracker.d.ts.map +0 -1
  313. package/dist/utils/tracker.js.map +0 -1
  314. package/dist/utils/wait.d.ts +0 -54
  315. package/dist/utils/wait.d.ts.map +0 -1
  316. package/dist/utils/wait.js.map +0 -1
  317. package/dist/workerGlobalPrefix.d.ts +0 -25
  318. package/dist/workerGlobalPrefix.d.ts.map +0 -1
  319. package/dist/workerGlobalPrefix.js.map +0 -1
  320. package/dist/workerTypes.d.ts +0 -52
  321. package/dist/workerTypes.d.ts.map +0 -1
  322. package/dist/workerTypes.js.map +0 -1
  323. package/dist/workers.d.ts +0 -69
  324. package/dist/workers.d.ts.map +0 -1
  325. package/dist/workers.js.map +0 -1
  326. package/marked.ps1 +0 -25
package/CHANGELOG.md CHANGED
@@ -28,6 +28,21 @@ Advantages:
28
28
  - individual plugin isolation in childbridge mode;
29
29
  - ability to update the plugin in childbridge mode without restarting matterbridge;
30
30
 
31
+ ## [3.4.5] - Dev branch
32
+
33
+ ### Added
34
+
35
+ - [DevContainer]: Refactored Dev Container setup. The Matterbridge instance can now be paired on native Linux hosts or WSL 2 with Docker engine CLI integration. On Docker Desktop on Windows or macOS is not possible cause Docker Desktop runs inside a VM and not directly on the host so mDNS is not supported.
36
+ - [DevContainer]: Since is now possible to pair from Dev Container, named volumes have been added to persist storage and plugins across rebuilds.
37
+
38
+ ### Changed
39
+
40
+ - [package]: Updated dependencies.
41
+
42
+ ### Fixed
43
+
44
+ <a href="https://www.buymeacoffee.com/luligugithub"><img src="https://matterbridge.io/bmc-button.svg" alt="Buy me a coffee" width="80"></a>
45
+
31
46
  ## [3.4.4] - 2025-12-19
32
47
 
33
48
  ### Added
package/README-DEV.md CHANGED
@@ -52,12 +52,32 @@ To start the Dev Container, simply open the project folder in [Visual Studio Cod
52
52
 
53
53
  > **Note:** The first time you use the Dev Container, it may take a while to download all the required Docker images and set up the environment. Subsequent starts will be as fast as from the local folder.
54
54
 
55
- Since Dev Container doesn't run in network mode 'host', it is not possible to pair Mattebridge running inside the Dev Container.
55
+ ## Dev containers networking limitations
56
+
57
+ Dev containers have networking limitations depending on the host OS and Docker setup.
58
+
59
+ • Docker Desktop on Windows or macOS:
60
+
61
+ - Runs inside a VM
62
+ - Host networking mode is NOT available
63
+ - Matterbridge and plugins can run but:
64
+ ❌ Pairing with Matter controllers will NOT work cause of missing mDNS support
65
+ ✅ Remote and local network access (cloud services, internet APIs) works normally
66
+ ✅ Matterbridge frontend works normally
67
+
68
+ • Native Linux or WSL 2 with Docker Engine CLI integration:
69
+
70
+ - Host networking IS available
71
+ - Full local network access is supported with mDNS
72
+ - Matterbridge and plugins work correctly, including pairing
73
+ - Matterbridge frontend works normally
74
+
75
+ ## How to pair the plugin
56
76
 
57
- When you want to test your plugin with a paired controller, you have several options:
77
+ When you want to test your plugin with a paired controller and you cannot use native Linux or WSL 2 with Docker Engine, you have several other options:
58
78
 
59
79
  - create a tgz (npm run npmPack) and upload it to a running instance of matterbridge.
60
- - publish it with tag dev and install it (matterbridge-yourplugin@dev in Install plugins) in a running instance of matterbridge.
80
+ - publish the plugin with tag dev and install it (matterbridge-yourplugin@dev in Install plugins) in a running instance of matterbridge.
61
81
  - use a local instance of matterbridge running outside the dev container and install (../matterbridge-yourplugin in Install plugins) or add (../matterbridge-yourplugin in Install plugins) your plugin to it (easiest way). Adjust the path if matterbridge dir and your plugin dir are not in the same parent directory.
62
82
 
63
83
  ## Guidelines on imports/exports
package/README.md CHANGED
@@ -533,6 +533,17 @@ Examples:
533
533
  /error|warning/ -> match either "error" OR "warning" (double search)
534
534
  ```
535
535
 
536
+ ## Window Covering cluster and position explained
537
+
538
+ In Matter spec the Window Covering cluster uses:
539
+
540
+ - 10000 = fully closed
541
+ - 0 = fully opened
542
+
543
+ So depending on the controller you pair with, you should see 100 for fully closed and 0 for fully open.
544
+
545
+ Some controllers invert the position so you need to verify your controller.
546
+
536
547
  # Known general issues
537
548
 
538
549
  ## Session XYZ does not exist or Cannot find a session for ID XYZ
@@ -577,11 +588,15 @@ So far is the only controller supporting all Matter 1.2, 1.3 and 1.4 device type
577
588
 
578
589
  ## Google Home
579
590
 
580
- If you face a problem pairing to Google Home from Ios app the solution is there https://github.com/Luligu/matterbridge/issues/61.
591
+ If you face a problem pairing to Google Home from iOS app the solution is there https://github.com/Luligu/matterbridge/issues/61.
581
592
 
582
593
  If you face a problem changing the brightness check this for the explanation: https://github.com/Luligu/matterbridge-zigbee2mqtt/issues/80
583
594
 
584
- No other issues reported so far.
595
+ If you encounter a “Something Went Wrong” screen while commissioning MatterBridge devices in Google Home on Android, it’s due to an Android bug. Android fails to send the country code, which is mandatory under the Matter specification.
596
+
597
+ ### Workaround
598
+
599
+ Install Google Home on an iPhone and complete the commissioning there. Once set up, the devices will appear and function normally on your Android phone and other Nest devices in your home. By [Artem Kovalov](https://github.com/artemkovalyov).
585
600
 
586
601
  ## Alexa
587
602
 
@@ -1,27 +1,3 @@
1
- /**
2
- * This file contains the BroadcastServer class.
3
- *
4
- * @file broadcastServer.ts
5
- * @author Luca Liguori
6
- * @created 2025-10-05
7
- * @version 2.0.1
8
- * @license Apache-2.0
9
- *
10
- * Copyright 2024, 2025, 2026 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
- // eslint-disable-next-line no-console
25
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
26
2
  console.log('\u001B[32mBroadcastServer loaded.\u001B[40;0m');
27
3
  import { EventEmitter } from 'node:events';
@@ -29,9 +5,6 @@ import { BroadcastChannel } from 'node:worker_threads';
29
5
  import { CYAN, db, debugStringify, er } from 'node-ansi-logger';
30
6
  import { hasParameter } from './utils/commandLine.js';
31
7
  import { logError } from './utils/error.js';
32
- /**
33
- * BroadcastServer class to handle broadcast messages between workers with BroadcastChannel.
34
- */
35
8
  export class BroadcastServer extends EventEmitter {
36
9
  name;
37
10
  log;
@@ -40,40 +13,21 @@ export class BroadcastServer extends EventEmitter {
40
13
  closed = false;
41
14
  debug = hasParameter('debug') || hasParameter('verbose');
42
15
  verbose = hasParameter('verbose');
43
- /**
44
- * Creates an instance of BroadcastServer.
45
- *
46
- * @param {string} name - The name of the broadcast server.
47
- * @param {AnsiLogger} log - The logger instance to use for logging.
48
- * @param {string} channel - The channel name for the broadcast. Default is 'broadcast-channel'.
49
- */
50
16
  constructor(name, log, channel = 'broadcast-channel') {
51
17
  super();
52
18
  this.name = name;
53
19
  this.log = log;
54
20
  this.channel = channel;
55
21
  this.broadcastChannel = new BroadcastChannel(this.channel);
56
- // this.broadcastChannel.unref();
57
22
  this.broadcastChannel.onmessage = this.broadcastMessageHandler.bind(this);
58
23
  this.broadcastChannel.onmessageerror = this.broadcastMessageErrorHandler.bind(this);
59
24
  }
60
- /**
61
- * Closes the broadcast channel.
62
- *
63
- * @returns {void}
64
- */
65
25
  close() {
66
26
  this.broadcastChannel.onmessage = null;
67
27
  this.broadcastChannel.onmessageerror = null;
68
28
  this.broadcastChannel.close();
69
29
  this.closed = true;
70
30
  }
71
- /**
72
- * Handles incoming broadcast messages.
73
- *
74
- * @param {MessageEvent} event - The message event containing the broadcast message.
75
- * @returns {void}
76
- */
77
31
  broadcastMessageHandler(event) {
78
32
  const msg = event.data;
79
33
  if (msg.dst === this.name || msg.dst === 'all') {
@@ -86,30 +40,13 @@ export class BroadcastServer extends EventEmitter {
86
40
  this.log.debug(`Server ${CYAN}${this.name}${db} received unrelated broadcast message: ${debugStringify(msg)}`);
87
41
  }
88
42
  }
89
- /**
90
- * Handles incoming broadcast error messages.
91
- *
92
- * @param {MessageEvent} event - The message event containing the broadcast message.
93
- * @returns {void}
94
- */
95
43
  broadcastMessageErrorHandler(event) {
96
44
  const msg = event.data;
97
45
  this.log.error(`Server ${CYAN}${this.name}${db} received message error: ${debugStringify(msg)}`);
98
46
  }
99
- /**
100
- * Generate a pseudo-random identifier between 100,000,000 and 999,999,999.
101
- *
102
- * @returns {number} A nine-digit identifier.
103
- */
104
47
  getUniqueId() {
105
48
  return Math.floor(Math.random() * 900000000) + 100000000;
106
49
  }
107
- /**
108
- * Type guard to verify a value matches the WorkerMessageRequest structure.
109
- *
110
- * @param {unknown} value Value to test.
111
- * @returns {value is WorkerMessageRequest} True when the value looks like a request message.
112
- */
113
50
  isWorkerRequest(value) {
114
51
  if (typeof value !== 'object' || value === null) {
115
52
  return false;
@@ -120,22 +57,9 @@ export class BroadcastServer extends EventEmitter {
120
57
  }
121
58
  return message.result === undefined && message.error === undefined;
122
59
  }
123
- /**
124
- * Type guard to verify a value matches a specific WorkerMessageRequest structure.
125
- *
126
- * @param {unknown} value Value to test.
127
- * @param {K} type Worker message type to match.
128
- * @returns {value is WorkerMessageRequest<K>} True when the value looks like a request message of the requested type.
129
- */
130
60
  isWorkerRequestOfType(value, type) {
131
61
  return this.isWorkerRequest(value) && value.type === type;
132
62
  }
133
- /**
134
- * Type guard to verify a value matches the WorkerMessageResponse structure.
135
- *
136
- * @param {unknown} value Value to test.
137
- * @returns {value is WorkerMessageResponse} True when the value looks like a response message.
138
- */
139
63
  isWorkerResponse(value) {
140
64
  if (typeof value !== 'object' || value === null) {
141
65
  return false;
@@ -148,24 +72,9 @@ export class BroadcastServer extends EventEmitter {
148
72
  const hasResult = message.result !== undefined;
149
73
  return hasError !== hasResult;
150
74
  }
151
- /**
152
- * Type guard to verify a value matches a specific WorkerMessageResponse structure.
153
- *
154
- * @param {unknown} value Value to test.
155
- * @param {K} type Worker message type to match.
156
- * @returns {value is WorkerMessageResponse<K>} True when the value looks like a response message of the requested type.
157
- */
158
75
  isWorkerResponseOfType(value, type) {
159
76
  return this.isWorkerResponse(value) && value.type === type;
160
77
  }
161
- /**
162
- * Broadcast a message to all workers.
163
- *
164
- * @param {WorkerMessage} message - The message to broadcast.
165
- * @returns {void}
166
- *
167
- * @remarks No checks are performed on the message structure.
168
- */
169
78
  broadcast(message) {
170
79
  if (this.closed) {
171
80
  this.log.error('Broadcast channel is closed');
@@ -187,13 +96,6 @@ export class BroadcastServer extends EventEmitter {
187
96
  logError(this.log, `Failed to broadcast message ${debugStringify(message)}${er}`, error);
188
97
  }
189
98
  }
190
- /**
191
- * Send a request message from the worker implementation.
192
- *
193
- * @template K
194
- * @param {WorkerMessageRequest<K>} message The request message to send.
195
- * @returns {void}
196
- */
197
99
  request(message) {
198
100
  if (this.closed) {
199
101
  this.log.error('Broadcast channel is closed');
@@ -219,14 +121,6 @@ export class BroadcastServer extends EventEmitter {
219
121
  logError(this.log, `Failed to broadcast request message ${debugStringify(message)}${er}`, error);
220
122
  }
221
123
  }
222
- /**
223
- * Send a response message from the worker implementation.
224
- * It also calculates the elapsed time since the request was sent and swaps the source and destination fields.
225
- *
226
- * @template K
227
- * @param {WorkerMessageResponse<K>} message The response message to send.
228
- * @returns {void}
229
- */
230
124
  respond(message) {
231
125
  if (this.closed) {
232
126
  this.log.error('Broadcast channel is closed');
@@ -255,16 +149,6 @@ export class BroadcastServer extends EventEmitter {
255
149
  logError(this.log, `Failed to broadcast response message ${debugStringify(message)}${er}`, error);
256
150
  }
257
151
  }
258
- /**
259
- * Fetch data from a worker.
260
- * It broadcasts a request message and waits for a valid response with the same id.
261
- *
262
- * @template K
263
- * @param {WorkerMessageRequest<K>} message - The typed request message to fetch.
264
- * @param {number} timeout - The timeout in milliseconds to wait for a response. Default is 250ms.
265
- * @returns {Promise<WorkerMessageResponseSuccess<K>>} A promise that resolves with the successful response from the worker or rejects on timeout.
266
- * @throws {Error} If the fetch operation times out after 250ms or if an error response is received or if the response is malformed.
267
- */
268
152
  async fetch(message, timeout = 250) {
269
153
  if (this.closed) {
270
154
  return Promise.reject(new Error('Broadcast channel is closed'));
@@ -305,4 +189,3 @@ export class BroadcastServer extends EventEmitter {
305
189
  });
306
190
  }
307
191
  }
308
- //# sourceMappingURL=broadcastServer.js.map
@@ -1,25 +1 @@
1
- /**
2
- * This file contains the BroadcastServer types.
3
- *
4
- * @file broadcastServerTypes.ts
5
- * @author Luca Liguori
6
- * @created 2025-10-05
7
- * @version 2.0.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
  export {};
25
- //# sourceMappingURL=broadcastServerTypes.js.map
package/dist/cli.js CHANGED
@@ -1,33 +1,6 @@
1
- /**
2
- * This file contains the CLI entry point of Matterbridge.
3
- *
4
- * @file cli.ts
5
- * @author Luca Liguori
6
- * @created 2023-12-29
7
- * @version 3.0.0
8
- * @license Apache-2.0
9
- *
10
- * Copyright 2023, 2024, 2025 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
- /* eslint-disable no-console */
25
- /* eslint-disable n/no-process-exit */
26
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
27
2
  console.log('\u001B[32mCli loaded.\u001B[40;0m');
28
- // AnsiLogger module
29
3
  import { AnsiLogger } from 'node-ansi-logger';
30
- // Cli
31
4
  import { cliEmitter } from './cliEmitter.js';
32
5
  import { hasParameter, hasAnyParameter } from './utils/commandLine.js';
33
6
  import { inspectError } from './utils/error.js';
@@ -37,10 +10,7 @@ import { formatBytes, formatUptime } from './utils/format.js';
37
10
  export let instance;
38
11
  export const tracker = new Tracker('Cli', false, false);
39
12
  export const inspector = new Inspector('Cli', false, false);
40
- const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logLevel: hasParameter('debug') ? "debug" /* LogLevel.DEBUG */ : "info" /* LogLevel.INFO */ });
41
- /**
42
- * Starts the CPU and memory tracker.
43
- */
13
+ const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
44
14
  function startCpuMemoryCheck() {
45
15
  log.debug(`Cpu memory check starting...`);
46
16
  tracker.start();
@@ -53,50 +23,26 @@ function startCpuMemoryCheck() {
53
23
  });
54
24
  log.debug(`Cpu memory check started`);
55
25
  }
56
- /**
57
- * Stops the CPU and memory tracker.
58
- */
59
26
  function stopCpuMemoryCheck() {
60
27
  log.debug(`Cpu memory check stopping...`);
61
28
  tracker.stop();
62
29
  tracker.removeAllListeners();
63
30
  log.debug(`Cpu memory check stopped`);
64
31
  }
65
- /**
66
- * Starts the inspector for heap sampling.
67
- * This function is called when the -inspect parameter is passed.
68
- */
69
32
  async function startInspector() {
70
33
  await inspector.start();
71
34
  }
72
- /**
73
- * Stops the heap sampling and saves the profile.
74
- * This function is called when the -inspect parameter is passed.
75
- */
76
35
  async function stopInspector() {
77
36
  await inspector.stop();
78
37
  }
79
- /**
80
- * Takes a heap snapshot
81
- */
82
38
  async function takeHeapSnapshot() {
83
39
  await inspector.takeHeapSnapshot();
84
40
  }
85
- /**
86
- * Triggers a manual garbage collection.
87
- * This function is working only if the node process is started with --expose_gc.
88
- *
89
- * @remarks To check the effect of the garbage collection, add also --trace_gc or --trace_gc_verbose.
90
- */
91
41
  function triggerGarbageCollection() {
92
42
  inspector.runGarbageCollector();
93
43
  }
94
- /**
95
- * Registers event handlers for the Matterbridge instance.
96
- */
97
44
  function registerHandlers() {
98
45
  log.debug('Registering event handlers...');
99
- // istanbul ignore next cause registerHandlers is called only if instance is defined
100
46
  if (!instance)
101
47
  return;
102
48
  instance.on('shutdown', () => shutdown());
@@ -110,9 +56,6 @@ function registerHandlers() {
110
56
  instance.on('triggergarbagecollection', () => triggerGarbageCollection());
111
57
  log.debug('Registered event handlers');
112
58
  }
113
- /**
114
- * Shuts down the Matterbridge instance and exits the process.
115
- */
116
59
  async function shutdown() {
117
60
  log.debug('Received shutdown event, exiting...');
118
61
  if (hasParameter('inspect'))
@@ -121,56 +64,26 @@ async function shutdown() {
121
64
  cliEmitter.emit('shutdown');
122
65
  process.exit(0);
123
66
  }
124
- /**
125
- * Restarts the Matterbridge instance.
126
- */
127
67
  async function restart() {
128
68
  log.debug('Received restart event, loading...');
129
69
  const { Matterbridge } = await import('./matterbridge.js');
130
70
  instance = await Matterbridge.loadInstance(true);
131
71
  registerHandlers();
132
72
  }
133
- /**
134
- * Updates the Matterbridge instance.
135
- */
136
73
  async function update() {
137
74
  log.debug('Received update event, updating...');
138
- // TODO: Implement update logic outside of matterbridge
139
75
  const { Matterbridge } = await import('./matterbridge.js');
140
76
  instance = await Matterbridge.loadInstance(true);
141
77
  registerHandlers();
142
78
  }
143
- /**
144
- * Starts the CPU and memory check when the -startmemorycheck parameter is passed.
145
- */
146
79
  function start() {
147
80
  log.debug('Received start memory check event');
148
81
  startCpuMemoryCheck();
149
82
  }
150
- /**
151
- * Stops the CPU and memory check when the -stopmemorycheck parameter is passed.
152
- */
153
83
  function stop() {
154
84
  log.debug('Received stop memory check event');
155
85
  stopCpuMemoryCheck();
156
86
  }
157
- /**
158
- * Main function that initializes the Matterbridge instance and starts the CLI.
159
- *
160
- * @remarks
161
- *
162
- * Debug parameters:
163
- *
164
- * --debug enables debug logging.
165
- *
166
- * --verbose enables verbose logging.
167
- *
168
- * --loader enables loader logging.
169
- *
170
- * --inspect enables the inspector for heap sampling.
171
- *
172
- * --snapshotinterval <milliseconds> can be used to set the heap snapshot interval. Default is undefined. Minimum is 30000 ms.
173
- */
174
87
  async function main() {
175
88
  log.debug(`Cli main() started`);
176
89
  startCpuMemoryCheck();
@@ -180,7 +93,6 @@ async function main() {
180
93
  const { Matterbridge } = await import('./matterbridge.js');
181
94
  instance = await Matterbridge.loadInstance(true);
182
95
  log.debug(`***Matterbridge.loadInstance(true) exited`);
183
- // Check if the instance needs to shut down from parseCommandLine()
184
96
  if (!instance || instance.shutdown) {
185
97
  shutdown();
186
98
  }
@@ -198,18 +110,11 @@ main().catch((error) => {
198
110
  inspectError(log, 'Matterbridge.loadInstance() failed with error', error);
199
111
  shutdown();
200
112
  });
201
- /**
202
- * Displays the version.
203
- */
204
113
  async function version() {
205
- // Dynamic JSON import (Node >= 20) with import attributes
206
114
  const { default: pkg } = await import('../package.json', { with: { type: 'json' } });
207
115
  console.log(`Matterbridge version ${pkg.version}`);
208
116
  process.exit(0);
209
117
  }
210
- /**
211
- * Displays the help.
212
- */
213
118
  function help() {
214
119
  console.log(`
215
120
  Usage: matterbridge [options] [command]
@@ -265,4 +170,3 @@ function help() {
265
170
  `);
266
171
  process.exit(0);
267
172
  }
268
- //# sourceMappingURL=cli.js.map
@@ -1,49 +1,12 @@
1
- /**
2
- * This file contains the CLI emitter.
3
- *
4
- * @file cliEmitter.ts
5
- * @author Luca Liguori
6
- * @created 2025-07-04
7
- * @version 1.0.2
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
- // eslint-disable-next-line no-console
25
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
26
2
  console.log('\u001B[32mCli emitter loaded.\u001B[40;0m');
27
3
  import { EventEmitter } from 'node:events';
28
4
  export const cliEmitter = new EventEmitter();
29
5
  export let lastOsCpuUsage = 0;
30
6
  export let lastProcessCpuUsage = 0;
31
- /**
32
- * Sets the last os CPU usage.
33
- *
34
- * @param {number} val - The os CPU usage percentage to set.
35
- * @returns {void}
36
- */
37
7
  export function setLastOsCpuUsage(val) {
38
8
  lastOsCpuUsage = val;
39
9
  }
40
- /**
41
- * Sets the last process CPU usage.
42
- *
43
- * @param {number} val - The process CPU usage percentage to set.
44
- * @returns {void}
45
- */
46
10
  export function setLastProcessCpuUsage(val) {
47
11
  lastProcessCpuUsage = val;
48
12
  }
49
- //# sourceMappingURL=cliEmitter.js.map
@@ -1,40 +1,9 @@
1
- /**
2
- * This file contains the CLI history page generator.
3
- *
4
- * @file cliHistory.ts
5
- * @author Luca Liguori
6
- * @created 2025-10-09
7
- * @version 1.0.1
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
- // eslint-disable-next-line no-console
25
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
26
2
  console.log('\u001B[32mCli history loaded.\u001B[40;0m');
27
3
  import { writeFileSync } from 'node:fs';
28
4
  import path from 'node:path';
29
5
  import os from 'node:os';
30
6
  import { Tracker } from './utils/tracker.js';
31
- /**
32
- * Generates a static HTML dashboard displaying CPU and memory history.
33
- *
34
- * @param {GenerateHistoryPageOptions} [options] - Optional configuration for output path, page title, and refresh interval.
35
- *
36
- * @returns {string | undefined} The absolute path to the generated HTML file, or undefined if no samples exist.
37
- */
38
7
  export function generateHistoryPage(options = {}) {
39
8
  const pageTitle = options.pageTitle ?? 'Matterbridge CPU & Memory History';
40
9
  const hostname = options.hostname ?? os.hostname();
@@ -814,13 +783,6 @@ export function generateHistoryPage(options = {}) {
814
783
  writeFileSync(outputPath, html, { encoding: 'utf-8' });
815
784
  return outputPath;
816
785
  }
817
- /**
818
- * Escapes HTML special characters to prevent breaking embedded markup.
819
- *
820
- * @param {string} input - The string to escape.
821
- * @returns {string} The escaped string safe for HTML contexts.
822
- */
823
786
  function escapeHtml(input) {
824
787
  return input.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
825
788
  }
826
- //# sourceMappingURL=cliHistory.js.map
@@ -1,3 +1 @@
1
1
  export {};
2
- // Nothing to export right now, but this file is here to make it easier to add exports in the future
3
- //# sourceMappingURL=export.js.map