matterbridge 3.2.8 → 3.2.9-dev-20250922-517cae7

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 (296) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/README-NGINX.md +47 -23
  3. package/dist/cli.js +2 -91
  4. package/dist/cliEmitter.js +0 -30
  5. package/dist/clusters/export.js +0 -2
  6. package/dist/defaultConfigSchema.js +0 -24
  7. package/dist/deviceManager.js +1 -94
  8. package/dist/devices/airConditioner.js +0 -57
  9. package/dist/devices/batteryStorage.js +1 -48
  10. package/dist/devices/cooktop.js +0 -55
  11. package/dist/devices/dishwasher.js +0 -57
  12. package/dist/devices/evse.js +10 -74
  13. package/dist/devices/export.js +0 -5
  14. package/dist/devices/extractorHood.js +0 -42
  15. package/dist/devices/heatPump.js +2 -50
  16. package/dist/devices/laundryDryer.js +3 -62
  17. package/dist/devices/laundryWasher.js +4 -70
  18. package/dist/devices/microwaveOven.js +5 -88
  19. package/dist/devices/oven.js +0 -85
  20. package/dist/devices/refrigerator.js +0 -102
  21. package/dist/devices/roboticVacuumCleaner.js +9 -100
  22. package/dist/devices/solarPower.js +0 -38
  23. package/dist/devices/speaker.js +0 -84
  24. package/dist/devices/temperatureControl.js +3 -25
  25. package/dist/devices/waterHeater.js +2 -82
  26. package/dist/dgram/coap.js +13 -126
  27. package/dist/dgram/dgram.js +2 -114
  28. package/dist/dgram/mb_coap.js +3 -41
  29. package/dist/dgram/mb_mdns.js +15 -80
  30. package/dist/dgram/mdns.js +137 -299
  31. package/dist/dgram/multicast.js +1 -62
  32. package/dist/dgram/unicast.js +0 -54
  33. package/dist/frontend.js +45 -435
  34. package/dist/frontendTypes.js +3 -51
  35. package/dist/globalMatterbridge.js +0 -47
  36. package/dist/helpers.js +0 -53
  37. package/dist/index.js +1 -30
  38. package/dist/logger/export.js +0 -1
  39. package/dist/matter/behaviors.js +0 -2
  40. package/dist/matter/clusters.js +0 -2
  41. package/dist/matter/devices.js +0 -2
  42. package/dist/matter/endpoints.js +0 -2
  43. package/dist/matter/export.js +0 -3
  44. package/dist/matter/types.js +0 -3
  45. package/dist/matterbridge.js +57 -780
  46. package/dist/matterbridgeAccessoryPlatform.js +0 -36
  47. package/dist/matterbridgeBehaviors.js +5 -65
  48. package/dist/matterbridgeDeviceTypes.js +17 -630
  49. package/dist/matterbridgeDynamicPlatform.js +0 -36
  50. package/dist/matterbridgeEndpoint.js +55 -1373
  51. package/dist/matterbridgeEndpointHelpers.js +12 -345
  52. package/dist/matterbridgePlatform.js +0 -304
  53. package/dist/matterbridgeTypes.js +0 -25
  54. package/dist/pluginManager.js +3 -249
  55. package/dist/shelly.js +11 -172
  56. package/dist/storage/export.js +0 -1
  57. package/dist/update.js +0 -69
  58. package/dist/utils/colorUtils.js +2 -97
  59. package/dist/utils/commandLine.js +0 -54
  60. package/dist/utils/copyDirectory.js +1 -38
  61. package/dist/utils/createDirectory.js +0 -33
  62. package/dist/utils/createZip.js +2 -47
  63. package/dist/utils/deepCopy.js +0 -39
  64. package/dist/utils/deepEqual.js +1 -72
  65. package/dist/utils/error.js +0 -41
  66. package/dist/utils/export.js +0 -1
  67. package/dist/utils/hex.js +0 -124
  68. package/dist/utils/isvalid.js +0 -101
  69. package/dist/utils/jestHelpers.js +3 -153
  70. package/dist/utils/network.js +5 -91
  71. package/dist/utils/spawn.js +0 -68
  72. package/dist/utils/wait.js +8 -60
  73. package/frontend/build/assets/index.js +2 -2
  74. package/frontend/build/assets/vendor_lodash.js +1 -1
  75. package/frontend/build/assets/vendor_mdi.js +1 -1
  76. package/frontend/build/assets/vendor_mui.js +31 -23
  77. package/frontend/build/assets/vendor_node_modules.js +28 -45
  78. package/frontend/build/assets/vendor_notistack.js +2 -2
  79. package/frontend/build/assets/vendor_qrcode.js +1 -1
  80. package/frontend/build/assets/vendor_rjsf.js +12 -3
  81. package/frontend/build/index.html +0 -1
  82. package/frontend/package-lock.json +208 -283
  83. package/frontend/package.json +4 -13
  84. package/npm-shrinkwrap.json +44 -44
  85. package/package.json +2 -3
  86. package/dist/cli.d.ts +0 -26
  87. package/dist/cli.d.ts.map +0 -1
  88. package/dist/cli.js.map +0 -1
  89. package/dist/cliEmitter.d.ts +0 -34
  90. package/dist/cliEmitter.d.ts.map +0 -1
  91. package/dist/cliEmitter.js.map +0 -1
  92. package/dist/clusters/export.d.ts +0 -2
  93. package/dist/clusters/export.d.ts.map +0 -1
  94. package/dist/clusters/export.js.map +0 -1
  95. package/dist/defaultConfigSchema.d.ts +0 -28
  96. package/dist/defaultConfigSchema.d.ts.map +0 -1
  97. package/dist/defaultConfigSchema.js.map +0 -1
  98. package/dist/deviceManager.d.ts +0 -112
  99. package/dist/deviceManager.d.ts.map +0 -1
  100. package/dist/deviceManager.js.map +0 -1
  101. package/dist/devices/airConditioner.d.ts +0 -98
  102. package/dist/devices/airConditioner.d.ts.map +0 -1
  103. package/dist/devices/airConditioner.js.map +0 -1
  104. package/dist/devices/batteryStorage.d.ts +0 -48
  105. package/dist/devices/batteryStorage.d.ts.map +0 -1
  106. package/dist/devices/batteryStorage.js.map +0 -1
  107. package/dist/devices/cooktop.d.ts +0 -60
  108. package/dist/devices/cooktop.d.ts.map +0 -1
  109. package/dist/devices/cooktop.js.map +0 -1
  110. package/dist/devices/dishwasher.d.ts +0 -71
  111. package/dist/devices/dishwasher.d.ts.map +0 -1
  112. package/dist/devices/dishwasher.js.map +0 -1
  113. package/dist/devices/evse.d.ts +0 -75
  114. package/dist/devices/evse.d.ts.map +0 -1
  115. package/dist/devices/evse.js.map +0 -1
  116. package/dist/devices/export.d.ts +0 -17
  117. package/dist/devices/export.d.ts.map +0 -1
  118. package/dist/devices/export.js.map +0 -1
  119. package/dist/devices/extractorHood.d.ts +0 -46
  120. package/dist/devices/extractorHood.d.ts.map +0 -1
  121. package/dist/devices/extractorHood.js.map +0 -1
  122. package/dist/devices/heatPump.d.ts +0 -47
  123. package/dist/devices/heatPump.d.ts.map +0 -1
  124. package/dist/devices/heatPump.js.map +0 -1
  125. package/dist/devices/laundryDryer.d.ts +0 -67
  126. package/dist/devices/laundryDryer.d.ts.map +0 -1
  127. package/dist/devices/laundryDryer.js.map +0 -1
  128. package/dist/devices/laundryWasher.d.ts +0 -81
  129. package/dist/devices/laundryWasher.d.ts.map +0 -1
  130. package/dist/devices/laundryWasher.js.map +0 -1
  131. package/dist/devices/microwaveOven.d.ts +0 -168
  132. package/dist/devices/microwaveOven.d.ts.map +0 -1
  133. package/dist/devices/microwaveOven.js.map +0 -1
  134. package/dist/devices/oven.d.ts +0 -105
  135. package/dist/devices/oven.d.ts.map +0 -1
  136. package/dist/devices/oven.js.map +0 -1
  137. package/dist/devices/refrigerator.d.ts +0 -118
  138. package/dist/devices/refrigerator.d.ts.map +0 -1
  139. package/dist/devices/refrigerator.js.map +0 -1
  140. package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
  141. package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
  142. package/dist/devices/roboticVacuumCleaner.js.map +0 -1
  143. package/dist/devices/solarPower.d.ts +0 -40
  144. package/dist/devices/solarPower.d.ts.map +0 -1
  145. package/dist/devices/solarPower.js.map +0 -1
  146. package/dist/devices/speaker.d.ts +0 -87
  147. package/dist/devices/speaker.d.ts.map +0 -1
  148. package/dist/devices/speaker.js.map +0 -1
  149. package/dist/devices/temperatureControl.d.ts +0 -166
  150. package/dist/devices/temperatureControl.d.ts.map +0 -1
  151. package/dist/devices/temperatureControl.js.map +0 -1
  152. package/dist/devices/waterHeater.d.ts +0 -111
  153. package/dist/devices/waterHeater.d.ts.map +0 -1
  154. package/dist/devices/waterHeater.js.map +0 -1
  155. package/dist/dgram/coap.d.ts +0 -205
  156. package/dist/dgram/coap.d.ts.map +0 -1
  157. package/dist/dgram/coap.js.map +0 -1
  158. package/dist/dgram/dgram.d.ts +0 -141
  159. package/dist/dgram/dgram.d.ts.map +0 -1
  160. package/dist/dgram/dgram.js.map +0 -1
  161. package/dist/dgram/mb_coap.d.ts +0 -24
  162. package/dist/dgram/mb_coap.d.ts.map +0 -1
  163. package/dist/dgram/mb_coap.js.map +0 -1
  164. package/dist/dgram/mb_mdns.d.ts +0 -24
  165. package/dist/dgram/mb_mdns.d.ts.map +0 -1
  166. package/dist/dgram/mb_mdns.js.map +0 -1
  167. package/dist/dgram/mdns.d.ts +0 -290
  168. package/dist/dgram/mdns.d.ts.map +0 -1
  169. package/dist/dgram/mdns.js.map +0 -1
  170. package/dist/dgram/multicast.d.ts +0 -67
  171. package/dist/dgram/multicast.d.ts.map +0 -1
  172. package/dist/dgram/multicast.js.map +0 -1
  173. package/dist/dgram/unicast.d.ts +0 -56
  174. package/dist/dgram/unicast.d.ts.map +0 -1
  175. package/dist/dgram/unicast.js.map +0 -1
  176. package/dist/frontend.d.ts +0 -228
  177. package/dist/frontend.d.ts.map +0 -1
  178. package/dist/frontend.js.map +0 -1
  179. package/dist/frontendTypes.d.ts +0 -572
  180. package/dist/frontendTypes.d.ts.map +0 -1
  181. package/dist/frontendTypes.js.map +0 -1
  182. package/dist/globalMatterbridge.d.ts +0 -59
  183. package/dist/globalMatterbridge.d.ts.map +0 -1
  184. package/dist/globalMatterbridge.js.map +0 -1
  185. package/dist/helpers.d.ts +0 -48
  186. package/dist/helpers.d.ts.map +0 -1
  187. package/dist/helpers.js.map +0 -1
  188. package/dist/index.d.ts +0 -33
  189. package/dist/index.d.ts.map +0 -1
  190. package/dist/index.js.map +0 -1
  191. package/dist/logger/export.d.ts +0 -2
  192. package/dist/logger/export.d.ts.map +0 -1
  193. package/dist/logger/export.js.map +0 -1
  194. package/dist/matter/behaviors.d.ts +0 -2
  195. package/dist/matter/behaviors.d.ts.map +0 -1
  196. package/dist/matter/behaviors.js.map +0 -1
  197. package/dist/matter/clusters.d.ts +0 -2
  198. package/dist/matter/clusters.d.ts.map +0 -1
  199. package/dist/matter/clusters.js.map +0 -1
  200. package/dist/matter/devices.d.ts +0 -2
  201. package/dist/matter/devices.d.ts.map +0 -1
  202. package/dist/matter/devices.js.map +0 -1
  203. package/dist/matter/endpoints.d.ts +0 -2
  204. package/dist/matter/endpoints.d.ts.map +0 -1
  205. package/dist/matter/endpoints.js.map +0 -1
  206. package/dist/matter/export.d.ts +0 -5
  207. package/dist/matter/export.d.ts.map +0 -1
  208. package/dist/matter/export.js.map +0 -1
  209. package/dist/matter/types.d.ts +0 -3
  210. package/dist/matter/types.d.ts.map +0 -1
  211. package/dist/matter/types.js.map +0 -1
  212. package/dist/matterbridge.d.ts +0 -442
  213. package/dist/matterbridge.d.ts.map +0 -1
  214. package/dist/matterbridge.js.map +0 -1
  215. package/dist/matterbridgeAccessoryPlatform.d.ts +0 -42
  216. package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
  217. package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
  218. package/dist/matterbridgeBehaviors.d.ts +0 -1747
  219. package/dist/matterbridgeBehaviors.d.ts.map +0 -1
  220. package/dist/matterbridgeBehaviors.js.map +0 -1
  221. package/dist/matterbridgeDeviceTypes.d.ts +0 -761
  222. package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
  223. package/dist/matterbridgeDeviceTypes.js.map +0 -1
  224. package/dist/matterbridgeDynamicPlatform.d.ts +0 -42
  225. package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
  226. package/dist/matterbridgeDynamicPlatform.js.map +0 -1
  227. package/dist/matterbridgeEndpoint.d.ts +0 -1515
  228. package/dist/matterbridgeEndpoint.d.ts.map +0 -1
  229. package/dist/matterbridgeEndpoint.js.map +0 -1
  230. package/dist/matterbridgeEndpointHelpers.d.ts +0 -407
  231. package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
  232. package/dist/matterbridgeEndpointHelpers.js.map +0 -1
  233. package/dist/matterbridgePlatform.d.ts +0 -380
  234. package/dist/matterbridgePlatform.d.ts.map +0 -1
  235. package/dist/matterbridgePlatform.js.map +0 -1
  236. package/dist/matterbridgeTypes.d.ts +0 -190
  237. package/dist/matterbridgeTypes.d.ts.map +0 -1
  238. package/dist/matterbridgeTypes.js.map +0 -1
  239. package/dist/pluginManager.d.ts +0 -270
  240. package/dist/pluginManager.d.ts.map +0 -1
  241. package/dist/pluginManager.js.map +0 -1
  242. package/dist/shelly.d.ts +0 -174
  243. package/dist/shelly.d.ts.map +0 -1
  244. package/dist/shelly.js.map +0 -1
  245. package/dist/storage/export.d.ts +0 -2
  246. package/dist/storage/export.d.ts.map +0 -1
  247. package/dist/storage/export.js.map +0 -1
  248. package/dist/update.d.ts +0 -75
  249. package/dist/update.d.ts.map +0 -1
  250. package/dist/update.js.map +0 -1
  251. package/dist/utils/colorUtils.d.ts +0 -99
  252. package/dist/utils/colorUtils.d.ts.map +0 -1
  253. package/dist/utils/colorUtils.js.map +0 -1
  254. package/dist/utils/commandLine.d.ts +0 -59
  255. package/dist/utils/commandLine.d.ts.map +0 -1
  256. package/dist/utils/commandLine.js.map +0 -1
  257. package/dist/utils/copyDirectory.d.ts +0 -33
  258. package/dist/utils/copyDirectory.d.ts.map +0 -1
  259. package/dist/utils/copyDirectory.js.map +0 -1
  260. package/dist/utils/createDirectory.d.ts +0 -34
  261. package/dist/utils/createDirectory.d.ts.map +0 -1
  262. package/dist/utils/createDirectory.js.map +0 -1
  263. package/dist/utils/createZip.d.ts +0 -39
  264. package/dist/utils/createZip.d.ts.map +0 -1
  265. package/dist/utils/createZip.js.map +0 -1
  266. package/dist/utils/deepCopy.d.ts +0 -32
  267. package/dist/utils/deepCopy.d.ts.map +0 -1
  268. package/dist/utils/deepCopy.js.map +0 -1
  269. package/dist/utils/deepEqual.d.ts +0 -54
  270. package/dist/utils/deepEqual.d.ts.map +0 -1
  271. package/dist/utils/deepEqual.js.map +0 -1
  272. package/dist/utils/error.d.ts +0 -44
  273. package/dist/utils/error.d.ts.map +0 -1
  274. package/dist/utils/error.js.map +0 -1
  275. package/dist/utils/export.d.ts +0 -13
  276. package/dist/utils/export.d.ts.map +0 -1
  277. package/dist/utils/export.js.map +0 -1
  278. package/dist/utils/hex.d.ts +0 -89
  279. package/dist/utils/hex.d.ts.map +0 -1
  280. package/dist/utils/hex.js.map +0 -1
  281. package/dist/utils/isvalid.d.ts +0 -103
  282. package/dist/utils/isvalid.d.ts.map +0 -1
  283. package/dist/utils/isvalid.js.map +0 -1
  284. package/dist/utils/jestHelpers.d.ts +0 -137
  285. package/dist/utils/jestHelpers.d.ts.map +0 -1
  286. package/dist/utils/jestHelpers.js.map +0 -1
  287. package/dist/utils/network.d.ts +0 -84
  288. package/dist/utils/network.d.ts.map +0 -1
  289. package/dist/utils/network.js.map +0 -1
  290. package/dist/utils/spawn.d.ts +0 -33
  291. package/dist/utils/spawn.d.ts.map +0 -1
  292. package/dist/utils/spawn.js.map +0 -1
  293. package/dist/utils/wait.d.ts +0 -54
  294. package/dist/utils/wait.d.ts.map +0 -1
  295. package/dist/utils/wait.js.map +0 -1
  296. package/frontend/build/assets/vendor_react_table.js +0 -1
package/CHANGELOG.md CHANGED
@@ -8,10 +8,33 @@ If you like this project and find it useful, please consider giving it a star on
8
8
  <img src="bmc-button.svg" alt="Buy me a coffee" width="120">
9
9
  </a>
10
10
 
11
- ## [3.2.8] - 2025-09-20
11
+ ## [3.2.9] - Not released
12
12
 
13
13
  ### Breaking Changes
14
14
 
15
+ - [profiles]: Profile management has changed. Now, each profile has its own independent directories under `profiles` with storage, matterstorage, plugin config, and plugin directory. This means that if you are using profiles, Matterbridge will not find the old profile data. This allows to run multiple instances of matterbridge (change the frontend port and the matter port for each profile) or to simply make a test of a new plugin without modifing your production setup.
16
+
17
+ ### Added
18
+
19
+ - [frontend]: Bumped `frontend` version to 3.1.0. Fully typed with the backend.
20
+ - [frontend]: Removed legacy `react-table` and created an autonomous component `MbfTable`. Features: unique UI for all tables with integrated column sorting and column selection.
21
+ - [frontend]: Use MbfTable for Plugins, Devices, Registered devices and Clusters tables.
22
+
23
+ ### Changed
24
+
25
+ - [matter]: Bumped `matter.js` version to 0.15.4. Thanks matter.js!
26
+ - [package]: Updated dependencies.
27
+
28
+ ### Fixed
29
+
30
+ - [frontend]: Fix default values for homePageMode in MatterbridgeSettings
31
+
32
+ <a href="https://www.buymeacoffee.com/luligugithub">
33
+ <img src="bmc-button.svg" alt="Buy me a coffee" width="80">
34
+ </a>
35
+
36
+ ## [3.2.8] - 2025-09-20
37
+
15
38
  ### Added
16
39
 
17
40
  - [logger]: Set different color for log names to matterbridge, frontend and matter.js.
package/README-NGINX.md CHANGED
@@ -18,9 +18,18 @@
18
18
 
19
19
  ## Run matterbridge with nginx
20
20
 
21
- ### Create a basic nginx configuration file that redirect to http://yourhost:8283
21
+ ### Install nginx if it is not installed
22
22
 
23
+ ```bash
24
+ sudo apt update
25
+ sudo apt install nginx
23
26
  ```
27
+
28
+ ### Create a basic nginx configuration file that redirect from http://yourhost to http://yourhost:8283
29
+
30
+ Create or edit the matterbridge configuration file
31
+
32
+ ```bash
24
33
  sudo nano /etc/nginx/sites-available/matterbridge
25
34
  ```
26
35
 
@@ -33,7 +42,7 @@ server {
33
42
  server_name _;
34
43
 
35
44
  location / {
36
- # Redirect to Matterbridge frontend from http:/server_name:80
45
+ # Redirect to Matterbridge frontend from http:/yourhost:80
37
46
  proxy_pass http://localhost:8283/;
38
47
  proxy_set_header Host $host;
39
48
  proxy_set_header X-Real-IP $remote_addr;
@@ -54,7 +63,16 @@ Add matterbridge to enabled sites
54
63
  sudo ln -s /etc/nginx/sites-available/matterbridge /etc/nginx/sites-enabled/
55
64
  ```
56
65
 
57
- ### Create a basic nginx configuration file that redirect to http://yourhost:8283/matterbridge
66
+ Restart nginx and test the configuration
67
+
68
+ ```bash
69
+ sudo systemctl restart nginx
70
+ sudo nginx -t
71
+ ```
72
+
73
+ ### Create a basic nginx configuration file that redirect from http://yourhost/matterbridge to http://yourhost:8283/matterbridge
74
+
75
+ Create or edit the matterbridge configuration file
58
76
 
59
77
  ```bash
60
78
  sudo nano /etc/nginx/sites-available/matterbridge
@@ -69,7 +87,7 @@ server {
69
87
  server_name _;
70
88
 
71
89
  location /matterbridge/ {
72
- # Redirect to Matterbridge frontend from http:/server_name/matterbridge:80
90
+ # Redirect to Matterbridge frontend from http:/yourhost/matterbridge:80
73
91
  proxy_pass http://localhost:8283/;
74
92
  proxy_set_header Host $host;
75
93
  proxy_set_header X-Real-IP $remote_addr;
@@ -97,17 +115,19 @@ sudo systemctl restart nginx
97
115
  sudo nginx -t
98
116
  ```
99
117
 
100
- ### Create an advanced nginx configuration file that redirect to http://yourhost:8283 with ssl
118
+ ### Create an advanced nginx configuration file that redirect from http://yourhost or https://yourhost to http://yourhost:8283 with ssl
119
+
120
+ Add your certificates in /etc/nginx/certs: `cert.pem` and `key.pem`
121
+
122
+ Create or edit the matterbridge configuration file
101
123
 
102
124
  ```bash
103
125
  sudo nano /etc/nginx/sites-available/matterbridge
104
126
  ```
105
127
 
106
- paste this configuration adding your certificates:
128
+ paste this configuration:
107
129
 
108
130
  ```
109
- # Default server configuration
110
-
111
131
  # Redirect all HTTP requests to HTTPS
112
132
  server {
113
133
  listen 80 default_server;
@@ -134,7 +154,7 @@ server {
134
154
  ssl_prefer_server_ciphers on;
135
155
 
136
156
  location / {
137
- # Redirect to Matterbridge frontend from https:/server_name:443
157
+ # Redirect to Matterbridge frontend from https:/yourhost:443
138
158
  proxy_pass http://localhost:8283/;
139
159
  proxy_set_header Host $host;
140
160
  proxy_set_header X-Real-IP $remote_addr;
@@ -162,13 +182,17 @@ sudo systemctl restart nginx
162
182
  sudo nginx -t
163
183
  ```
164
184
 
165
- ### Create an advanced nginx configuration file that redirect to http://yourhost/matterbridge with ssl
185
+ ### Create an advanced nginx configuration file that redirect from http://yourhost/matterbridge or https://yourhost/matterbridge to http://yourhost/matterbridge with ssl
186
+
187
+ Add your certificates in /etc/nginx/certs: `cert.pem` and `key.pem`
188
+
189
+ Create or edit the matterbridge configuration file
166
190
 
167
191
  ```bash
168
192
  sudo nano /etc/nginx/sites-available/matterbridge
169
193
  ```
170
194
 
171
- paste this configuration adding your certificates:
195
+ paste this configuration:
172
196
 
173
197
  ```
174
198
  # Redirect all HTTP requests to HTTPS
@@ -205,19 +229,19 @@ server {
205
229
  try_files $uri $uri/ =404;
206
230
  }
207
231
 
208
- location /matterbridge/ {
209
- # Redirect to Matterbridge frontend from https:/server_name/matterbridge:443
210
- proxy_pass http://localhost:8283/;
211
- proxy_set_header Host $host;
212
- proxy_set_header X-Real-IP $remote_addr;
213
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
214
- proxy_set_header X-Forwarded-Proto $scheme;
232
+ location /matterbridge/ {
233
+ # Redirect to Matterbridge frontend from https:/yourhost/matterbridge:443
234
+ proxy_pass http://localhost:8283/;
235
+ proxy_set_header Host $host;
236
+ proxy_set_header X-Real-IP $remote_addr;
237
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
238
+ proxy_set_header X-Forwarded-Proto $scheme;
215
239
 
216
- # WebSocket support
217
- proxy_http_version 1.1;
218
- proxy_set_header Upgrade $http_upgrade;
219
- proxy_set_header Connection $http_connection;
220
- }
240
+ # WebSocket support
241
+ proxy_http_version 1.1;
242
+ proxy_set_header Upgrade $http_upgrade;
243
+ proxy_set_header Connection $http_connection;
244
+ }
221
245
  }
222
246
  ```
223
247
 
package/dist/cli.js CHANGED
@@ -1,44 +1,17 @@
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 2.0.1
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
1
  import os from 'node:os';
25
2
  import { inspect } from 'node:util';
26
- // AnsiLogger module
27
3
  import { AnsiLogger, BRIGHT, CYAN, db, YELLOW } from 'node-ansi-logger';
28
- // Matterbridge
29
4
  import { getIntParameter, hasParameter } from './utils/export.js';
30
5
  import { Matterbridge } from './matterbridge.js';
31
6
  import { cliEmitter, lastCpuUsage, setLastCpuUsage } from './cliEmitter.js';
32
7
  export let instance;
33
- // Inspectop
34
8
  let session;
35
9
  let snapshotInterval;
36
- // Cpu and memory check
37
10
  let memoryCheckInterval;
38
11
  let prevCpus;
39
12
  let peakCpu = 0;
40
13
  let peakRss = 0;
41
- const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logLevel: hasParameter('debug') ? "debug" /* LogLevel.DEBUG */ : "info" /* LogLevel.INFO */ });
14
+ const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
42
15
  const formatMemoryUsage = (bytes) => {
43
16
  if (bytes >= 1024 ** 3) {
44
17
  return `${(bytes / 1024 ** 3).toFixed(2)} GB`;
@@ -65,20 +38,14 @@ const formatOsUpTime = (seconds) => {
65
38
  }
66
39
  return `${seconds} second${seconds !== 1 ? 's' : ''}`;
67
40
  };
68
- /**
69
- * Starts the CPU and memory check interval.
70
- */
71
41
  async function startCpuMemoryCheck() {
72
- // const os = await import('node:os');
73
42
  log.debug(`Cpu memory check started`);
74
43
  prevCpus = os.cpus();
75
44
  clearInterval(memoryCheckInterval);
76
45
  const interval = () => {
77
- // Get the os uptime
78
46
  const systemUptime = formatOsUpTime(Math.floor(os.uptime()));
79
47
  const processUptime = formatOsUpTime(Math.floor(process.uptime()));
80
48
  cliEmitter.emit('uptime', systemUptime, processUptime);
81
- // Get the memory usage
82
49
  const totalMememory = formatMemoryUsage(os.totalmem());
83
50
  const freeMemory = formatMemoryUsage(os.freemem());
84
51
  const memoryUsageRaw = process.memoryUsage();
@@ -90,12 +57,10 @@ async function startCpuMemoryCheck() {
90
57
  if (memoryUsageRaw.rss > peakRss)
91
58
  peakRss = memoryUsageRaw.rss;
92
59
  cliEmitter.emit('memory', totalMememory, freeMemory, rss, heapTotal, heapUsed, external, arrayBuffers);
93
- // Get the cpu usage
94
60
  const currCpus = os.cpus();
95
- // log.debug(`Cpus: ${JSON.stringify(currCpus)}`);
96
61
  let cpuUsageLog;
97
62
  if (currCpus.length !== prevCpus.length) {
98
- prevCpus = currCpus; // Reset the previous cpus
63
+ prevCpus = currCpus;
99
64
  log.debug(`Cpu check length failed, resetting previous cpus`);
100
65
  return;
101
66
  }
@@ -121,29 +86,20 @@ async function startCpuMemoryCheck() {
121
86
  cliEmitter.emit('cpu', lastCpuUsage);
122
87
  }
123
88
  prevCpus = currCpus;
124
- // Show the cpu and memory usage
125
89
  log.debug(`***${YELLOW}${BRIGHT}Cpu usage:${db} ${CYAN}${cpuUsageLog.padStart(6, ' ')} %${db} ${YELLOW}${BRIGHT}Memory usage:${db} rss ${CYAN}${rss}${db} heapTotal ${CYAN}${heapTotal}${db} heapUsed ${CYAN}${heapUsed}${db} external ${external} arrayBuffers ${arrayBuffers}`);
126
90
  };
127
91
  interval();
128
92
  clearInterval(memoryCheckInterval);
129
93
  memoryCheckInterval = setInterval(interval, getIntParameter('memoryinterval') ?? 10 * 1000).unref();
130
94
  }
131
- /**
132
- * Stops the CPU and memory check interval.
133
- */
134
95
  async function stopCpuMemoryCheck() {
135
96
  log.debug(`***Cpu memory check stopped. Peak cpu: ${CYAN}${peakCpu.toFixed(2)} %${db}. Peak rss: ${CYAN}${formatMemoryUsage(peakRss)}${db}.`);
136
97
  clearInterval(memoryCheckInterval);
137
98
  }
138
- /**
139
- * Starts the inspector for heap sampling.
140
- * This function is called when the -inspect parameter is passed.
141
- */
142
99
  async function startInspector() {
143
100
  const { Session } = await import('node:inspector');
144
101
  const { mkdirSync } = await import('node:fs');
145
102
  log.debug(`***Starting heap sampling...`);
146
- // Create the heap snapshots directory if it doesn't exist
147
103
  mkdirSync('heap_profile', { recursive: true });
148
104
  try {
149
105
  session = new Session();
@@ -152,7 +108,6 @@ async function startInspector() {
152
108
  session?.post('HeapProfiler.startSampling', (err) => (err ? reject(err) : resolve()));
153
109
  });
154
110
  log.debug(`***Started heap sampling`);
155
- // Set an interval to take heap snapshots
156
111
  const interval = getIntParameter('snapshotinterval');
157
112
  if (interval && interval >= 30000) {
158
113
  log.debug(`***Started heap snapshot interval of ${CYAN}${interval}${db} ms`);
@@ -170,19 +125,13 @@ async function startInspector() {
170
125
  return;
171
126
  }
172
127
  }
173
- /**
174
- * Stops the heap sampling and saves the profile to a file.
175
- * This function is called when the inspector is stopped.
176
- */
177
128
  async function stopInspector() {
178
129
  const { writeFileSync } = await import('node:fs');
179
130
  const path = await import('node:path');
180
131
  log.debug(`***Stopping heap sampling...`);
181
132
  if (snapshotInterval) {
182
133
  log.debug(`***Clearing heap snapshot interval...`);
183
- // Clear the snapshot interval if it exists
184
134
  clearInterval(snapshotInterval);
185
- // Take a final heap snapshot before stopping
186
135
  await takeHeapSnapshot();
187
136
  }
188
137
  if (!session) {
@@ -190,7 +139,6 @@ async function stopInspector() {
190
139
  return;
191
140
  }
192
141
  try {
193
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
194
142
  const result = await new Promise((resolve, reject) => {
195
143
  session?.post('HeapProfiler.stopSampling', (err, result) => (err ? reject(err) : resolve(result)));
196
144
  });
@@ -208,13 +156,6 @@ async function stopInspector() {
208
156
  log.debug(`***Stopped heap sampling`);
209
157
  }
210
158
  }
211
- /**
212
- * Takes a heap snapshot and saves it to the file name Heap-snapshot-<timestamp>.heapsnapshot.
213
- * This function is called periodically based on the -snapshotinterval parameter.
214
- * The -snapshotinterval parameter must at least 30000 ms.
215
- * The snapshot is saved in the heap_profile directory that is created in the current working directory.
216
- * The snapshot can be analyzed using vscode or Chrome DevTools or other tools that support heap snapshots.
217
- */
218
159
  async function takeHeapSnapshot() {
219
160
  const { writeFileSync } = await import('node:fs');
220
161
  const path = await import('node:path');
@@ -246,10 +187,6 @@ async function takeHeapSnapshot() {
246
187
  });
247
188
  });
248
189
  }
249
- /**
250
- * Triggers a manual garbage collection.
251
- * This function is working only if the process is started with --expose-gc.
252
- */
253
190
  function triggerGarbageCollection() {
254
191
  if (typeof global.gc === 'function') {
255
192
  global.gc();
@@ -259,9 +196,6 @@ function triggerGarbageCollection() {
259
196
  log.debug('Garbage collection is not exposed. Start Node.js with --expose-gc to enable manual GC.');
260
197
  }
261
198
  }
262
- /**
263
- * Registers event handlers for the Matterbridge instance.
264
- */
265
199
  function registerHandlers() {
266
200
  log.debug('Registering event handlers...');
267
201
  if (instance)
@@ -284,52 +218,32 @@ function registerHandlers() {
284
218
  instance.on('triggergarbagecollection', async () => triggerGarbageCollection());
285
219
  log.debug('Registered event handlers');
286
220
  }
287
- /**
288
- * Shuts down the Matterbridge instance and exits the process.
289
- */
290
221
  async function shutdown() {
291
222
  log.debug('Received shutdown event, exiting...');
292
223
  if (hasParameter('inspect'))
293
224
  await stopInspector();
294
225
  await stopCpuMemoryCheck();
295
226
  cliEmitter.emit('shutdown');
296
- // eslint-disable-next-line n/no-process-exit
297
227
  process.exit(0);
298
228
  }
299
- /**
300
- *
301
- */
302
229
  async function restart() {
303
230
  log.debug('Received restart event, loading...');
304
231
  instance = await Matterbridge.loadInstance(true);
305
232
  registerHandlers();
306
233
  }
307
- /**
308
- *
309
- */
310
234
  async function update() {
311
235
  log.debug('Received update event, updating...');
312
- // TODO: Implement update logic outside of matterbridge
313
236
  instance = await Matterbridge.loadInstance(true);
314
237
  registerHandlers();
315
238
  }
316
- /**
317
- * Starts the CPU and memory check when the -startmemorycheck parameter is passed.
318
- */
319
239
  async function start() {
320
240
  log.debug('Received start memory check event');
321
241
  await startCpuMemoryCheck();
322
242
  }
323
- /**
324
- * Stops the CPU and memory check when the -stopmemorycheck parameter is passed.
325
- */
326
243
  async function stop() {
327
244
  log.debug('Received stop memory check event');
328
245
  await stopCpuMemoryCheck();
329
246
  }
330
- /**
331
- * Main function that initializes the Matterbridge instance and starts the CLI.
332
- */
333
247
  async function main() {
334
248
  log.debug(`Cli main() started`);
335
249
  await startCpuMemoryCheck();
@@ -338,7 +252,6 @@ async function main() {
338
252
  log.debug(`***Matterbridge.loadInstance(true) called`);
339
253
  instance = await Matterbridge.loadInstance(true);
340
254
  log.debug(`***Matterbridge.loadInstance(true) exited`);
341
- // Check if the instance needs to shut down from parseCommandLine()
342
255
  if (!instance || instance.shutdown) {
343
256
  shutdown();
344
257
  }
@@ -347,11 +260,9 @@ async function main() {
347
260
  cliEmitter.emit('ready');
348
261
  }
349
262
  }
350
- // Run the main function
351
263
  process.title = 'matterbridge';
352
264
  main().catch((error) => {
353
265
  const errorMessage = error instanceof Error ? error.message : error;
354
266
  const errorInspect = inspect(error, { depth: 10 });
355
267
  log.error(`Matterbridge.loadInstance() failed with error: ${errorMessage}\nstack: ${errorInspect}`);
356
268
  });
357
- //# sourceMappingURL=cli.js.map
@@ -1,36 +1,6 @@
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.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 { EventEmitter } from 'node:events';
25
2
  export const cliEmitter = new EventEmitter();
26
3
  export let lastCpuUsage = 0;
27
- /**
28
- * Sets the last CPU usage.
29
- *
30
- * @param {number} val - The CPU usage percentage to set.
31
- * @returns {void}
32
- */
33
4
  export function setLastCpuUsage(val) {
34
5
  lastCpuUsage = val;
35
6
  }
36
- //# sourceMappingURL=cliEmitter.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
@@ -1,26 +1,3 @@
1
- /**
2
- * This file contains the default config for the plugins.
3
- *
4
- * @file defaultConfigSchema.ts
5
- * @author Luca Liguori
6
- * @created 2024-05-07
7
- * @version 1.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
1
  export const zigbee2mqtt_config = {
25
2
  name: 'matterbridge-zigbee2mqtt',
26
3
  type: 'DynamicPlatform',
@@ -82,4 +59,3 @@ export const shelly_config = {
82
59
  debugWs: false,
83
60
  unregisterOnShutdown: false,
84
61
  };
85
- //# sourceMappingURL=defaultConfigSchema.js.map
@@ -1,87 +1,26 @@
1
- /**
2
- * This file contains the DeviceManager class.
3
- *
4
- * @file devices.ts
5
- * @author Luca Liguori
6
- * @created 2024-07-26
7
- * @version 1.0.11
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
- // AnsiLogger module
25
1
  import { AnsiLogger, BLUE, er } from 'node-ansi-logger';
26
2
  import { dev } from './matterbridgeTypes.js';
27
- /**
28
- * Manages Matterbridge devices.
29
- */
30
3
  export class DeviceManager {
31
4
  _devices = new Map();
32
5
  matterbridge;
33
6
  log;
34
- /**
35
- * Creates an instance of DeviceManager.
36
- *
37
- * @param {Matterbridge} matterbridge - The Matterbridge instance.
38
- */
39
7
  constructor(matterbridge) {
40
8
  this.matterbridge = matterbridge;
41
- this.log = new AnsiLogger({ logName: 'DeviceManager', logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logLevel: matterbridge.log.logLevel });
9
+ this.log = new AnsiLogger({ logName: 'DeviceManager', logTimestampFormat: 4, logLevel: matterbridge.log.logLevel });
42
10
  this.log.debug('Matterbridge device manager starting...');
43
11
  }
44
- /**
45
- * Gets the number of devices.
46
- *
47
- * @returns {number} The number of devices.
48
- */
49
12
  get length() {
50
13
  return this._devices.size;
51
14
  }
52
- /**
53
- * Gets the number of devices.
54
- *
55
- * @returns {number} The number of devices.
56
- */
57
15
  get size() {
58
16
  return this._devices.size;
59
17
  }
60
- /**
61
- * Checks if a device with the specified unique ID exists.
62
- *
63
- * @param {string} uniqueId - The unique ID of the device.
64
- * @returns {boolean} True if the device exists, false otherwise.
65
- */
66
18
  has(uniqueId) {
67
19
  return this._devices.has(uniqueId);
68
20
  }
69
- /**
70
- * Gets a device by its unique ID.
71
- *
72
- * @param {string} uniqueId - The unique ID of the device.
73
- * @returns {MatterbridgeEndpoint | undefined} The device, or undefined if not found.
74
- */
75
21
  get(uniqueId) {
76
22
  return this._devices.get(uniqueId);
77
23
  }
78
- /**
79
- * Adds a device to the manager.
80
- *
81
- * @param {MatterbridgeEndpoint} device - The device to add.
82
- * @returns {MatterbridgeEndpoint} The added device.
83
- * @throws {Error} If the device does not have a unique ID.
84
- */
85
24
  set(device) {
86
25
  if (!device.uniqueId)
87
26
  throw new Error(`The device ${dev}${device.deviceName}${er} has not been initialized: uniqueId is required`);
@@ -90,13 +29,6 @@ export class DeviceManager {
90
29
  this._devices.set(device.uniqueId, device);
91
30
  return device;
92
31
  }
93
- /**
94
- * Removes a device from the manager.
95
- *
96
- * @param {MatterbridgeEndpoint} device - The device to remove.
97
- * @returns {boolean} True if the device was removed, false otherwise.
98
- * @throws {Error} If the device does not have a unique ID.
99
- */
100
32
  remove(device) {
101
33
  if (!device.uniqueId)
102
34
  throw new Error(`The device ${dev}${device.deviceName}${er} has not been initialized: uniqueId is required`);
@@ -104,34 +36,15 @@ export class DeviceManager {
104
36
  this.log.error(`The device ${dev}${device.deviceName}${er} with uniqueId ${BLUE}${device.uniqueId}${er} serialNumber ${BLUE}${device.serialNumber}${er} is not registered in the device manager`);
105
37
  return this._devices.delete(device.uniqueId);
106
38
  }
107
- /**
108
- * Clears all devices from the manager.
109
- */
110
39
  clear() {
111
40
  this._devices.clear();
112
41
  }
113
- /**
114
- * Gets an array of all devices.
115
- *
116
- * @returns {MatterbridgeEndpoint[]} An array of all devices.
117
- */
118
42
  array() {
119
43
  return Array.from(this._devices.values());
120
44
  }
121
- /**
122
- * Iterates over all devices.
123
- *
124
- * @returns {IterableIterator<MatterbridgeEndpoint>} An iterator for the devices.
125
- */
126
45
  [Symbol.iterator]() {
127
46
  return this._devices.values();
128
47
  }
129
- /**
130
- * Asynchronously iterates over each device and calls the provided callback function.
131
- *
132
- * @param {(device: MatterbridgeEndpoint) => Promise<void>} callback - The callback function to call with each device.
133
- * @returns {Promise<void>} A promise that resolves when all callbacks have been called.
134
- */
135
48
  async forEach(callback) {
136
49
  if (this.size === 0)
137
50
  return;
@@ -145,13 +58,7 @@ export class DeviceManager {
145
58
  });
146
59
  await Promise.all(tasks);
147
60
  }
148
- /**
149
- * Sets the log level.
150
- *
151
- * @param {LogLevel} logLevel - The log level to set.
152
- */
153
61
  set logLevel(logLevel) {
154
62
  this.log.logLevel = logLevel;
155
63
  }
156
64
  }
157
- //# sourceMappingURL=deviceManager.js.map