matterbridge 1.5.8 → 1.5.10

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.
package/CHANGELOG.md CHANGED
@@ -8,10 +8,46 @@ If you like this project and find it useful, please consider giving it a star on
8
8
 
9
9
  The Home Assistant Community Add-ons and plugins are not verified to work with Matterbridge. I strongly advise against using them. If you do use them and encounter an issue (which is likely because some do not meet the Matterbridge guidelines), please do not open an issue in the Matterbridge repository.
10
10
 
11
+ If you want to run Matterbridge in Home Assistant please use the official add-on https://github.com/Luligu/matterbridge-home-assistant-addon.
12
+
11
13
  ### New Apple firmware v. 18.0
12
14
 
13
15
  Please read this: https://github.com/Luligu/matterbridge/discussions/135
14
16
 
17
+ ### Discord
18
+
19
+ Tamer (https://github.com/tammeryousef1006) has created the Matterbridge Discord group: https://discord.gg/raWywpD4.
20
+
21
+ Feel free to join!
22
+
23
+ ## [1.5.10] - 2024-10-01
24
+
25
+ ### Changed
26
+
27
+ - [matterbridge]: Added '--omit=dev' to all install commands to save space and time on low powered devices.
28
+ - [matterbridge]: Integrated the DeviceManager class and removed the old array.
29
+ - [package]: Update dependencies.
30
+
31
+ <a href="https://www.buymeacoffee.com/luligugithub">
32
+ <img src="./yellow-button.png" alt="Buy me a coffee" width="120">
33
+ </a>
34
+
35
+ ## [1.5.9] - 2024-09-23
36
+
37
+ ### Fixed
38
+
39
+ - [ingress]: Fixed download routes with Ingress from the ha addon. The add-on https://github.com/Luligu/matterbridge-home-assistant-addon has been updated to v. 1.0.4.
40
+
41
+ ### Changed
42
+
43
+ - [package]: Update matter-node.js to 0.10.6.
44
+ - [package]: Update matter-history to 1.1.16.
45
+ - [package]: Update dependencies.
46
+
47
+ <a href="https://www.buymeacoffee.com/luligugithub">
48
+ <img src="./yellow-button.png" alt="Buy me a coffee" width="120">
49
+ </a>
50
+
15
51
  ## [1.5.8] - 2024-09-21
16
52
 
17
53
  ### Added
package/README-DEV.md CHANGED
@@ -43,23 +43,27 @@ Matterbridge exports from:
43
43
 
44
44
  - NodeStorage classes.
45
45
 
46
- # ****\*\*****
46
+ # \***\*\*\*\*\***
47
47
 
48
- A plugin must never install or import from `matter-node.js` or `matter.js` directly, as this leads to a second instance of `matter.js`, causing instability and unpredictable errors such as "The only instance is Endpoint". Additionally, when Matterbridge updates the `matter.js` version, it should be consistent across all plugins.
48
+ A plugin must never install or import from `matter-node.js` or `matter.js` directly (neither as a dependency, devDependency, nor peerDependency), as this leads to a second instance of `matter.js`, causing instability and unpredictable errors such as "The only instance is Endpoint".
49
49
 
50
- # ****\*\*****
50
+ Additionally, when Matterbridge updates the `matter.js` version, it should be consistent across all plugins.
51
51
 
52
- A plugin must never install Matterbridge (neither as dependencies nor as devDependencies). Matterbridge must be linked to the plugin:
52
+ # \***\*\*\*\*\***
53
+
54
+ A plugin must never install Matterbridge (neither as a dependency, devDependency, nor peerDependency).
55
+
56
+ Matterbridge must be linked to the plugin in development only.
53
57
 
54
58
  ```json
55
59
  "scripts": {
56
60
  '''
57
- "install": "node link-matterbridge-script.js",
61
+ "dev:link": "npm link matterbridge",
58
62
  '''
59
63
  }
60
64
  ```
61
65
 
62
- # ****\*\*****
66
+ # \***\*\*\*\*\***
63
67
 
64
68
  In the next releases I will remove the duplicated exports so please update your plugins.
65
69
 
package/README-DOCKER.md CHANGED
@@ -20,7 +20,7 @@ The Matterbridge Docker image, which includes a manifest list for the linux/amd6
20
20
 
21
21
  ### First create the Matterbridge directories
22
22
 
23
- This will create the required directories if they don't exist
23
+ This will create the required directories in your home directory if they don't exist
24
24
 
25
25
  ```
26
26
  cd ~
@@ -31,9 +31,18 @@ sudo chown -R $USER:$USER ./Matterbridge ./.matterbridge
31
31
 
32
32
  You may need to adapt the script to your setup.
33
33
 
34
+ ### Add your user to docker group
35
+
36
+ If you don't want to use sudo with docker commands, run this command:
37
+
38
+ ```
39
+ sudo groupadd docker
40
+ sudo usermod -aG docker $USER
41
+ ```
42
+
34
43
  ### Run the Docker container and start it
35
44
 
36
- The container has full access to the host network (needed for mdns).
45
+ The container must have full access to the host network (needed for mdns).
37
46
 
38
47
  ```
39
48
  docker run --name matterbridge \
package/README-PODMAN.md CHANGED
@@ -41,6 +41,7 @@ sudo chown -R $USER:$USER ./Matterbridge ./.matterbridge
41
41
  ```
42
42
 
43
43
  You may need to adapt the script to your setup:
44
+
44
45
  - ./Matterbridge is the position outside of the container of your matterbridge plugin directory (inside your home directory).
45
46
  - ./.matterbridge is the position outside of the container of your matterbridge storage directory (inside your home directory).
46
47
 
@@ -56,6 +57,7 @@ podman run --name matterbridge \
56
57
  ```
57
58
 
58
59
  You may need to adapt the script to your setup:
60
+
59
61
  - ~/Matterbridge is the position outside of the container of your matterbridge plugin directory.
60
62
  - ~/.matterbridge is the position outside of the container of your matterbridge storage directory.
61
63
 
package/README-SERVICE.md CHANGED
@@ -16,6 +16,19 @@
16
16
 
17
17
  ## Run matterbridge as a daemon with systemctl (Linux only)
18
18
 
19
+ ### First create the Matterbridge directories
20
+
21
+ This will create the required directories if they don't exist
22
+
23
+ ```
24
+ cd ~
25
+ mkdir -p ./Matterbridge
26
+ mkdir -p ./.matterbridge
27
+ sudo chown -R $USER:$USER ./Matterbridge ./.matterbridge
28
+ ```
29
+
30
+ ### Then create a systemctl configuration file for Matterbridge
31
+
19
32
  Create a systemctl configuration file for Matterbridge
20
33
 
21
34
  ```
@@ -92,48 +105,86 @@ sudo journalctl -u matterbridge.service -f --output cat
92
105
 
93
106
  ### Delete the logs older then 3 days (all of them not only the ones of Matterbridge!)
94
107
 
108
+ Check the space used
109
+
110
+ ```
111
+ sudo journalctl --disk-usage
95
112
  ```
113
+
114
+ remove all log older then 3 days
115
+
116
+ ```
117
+ sudo journalctl --rotate
96
118
  sudo journalctl --vacuum-time=3d
97
119
  ```
98
120
 
99
- If you want to make the setting permanent edit
121
+ ## Prevent the journal logs to grow
122
+
123
+ If you want to make the setting permanent to prevent the journal logs to grow too much, run
124
+
100
125
  ```
101
126
  sudo nano /etc/systemd/journald.conf
102
127
  ```
128
+
103
129
  add
130
+
104
131
  ```
105
- SystemMaxUse=3d
132
+ Compress=yes # Compress logs
133
+ MaxRetentionSec=3days # Keep logs for a maximum of 3 days.
134
+ MaxFileSec=1day # Rotate logs daily within the 3-day retention period.
135
+ ForwardToSyslog=no # Disable forwarding to syslog to prevent duplicate logging.
136
+ SystemMaxUse=100M # Limit persistent logs in /var/log/journal to 100 MB.
137
+ RuntimeMaxUse=100M # Limit runtime logs in /run/log/journal to 100 MB.
106
138
  ```
139
+
107
140
  save it and run
141
+
108
142
  ```
109
143
  sudo systemctl restart systemd-journald
110
144
  ```
111
145
 
112
- ### Verify that with your distro you can run sudo npm install -g matterbridge without the password
146
+ ## Verify that with your distro you can run sudo npm install -g matterbridge without the password
113
147
 
114
148
  Run the following command to verify if you can install Matterbridge globally without being prompted for a password:
115
149
 
116
150
  ```
117
151
  sudo npm install -g matterbridge
118
152
  ```
153
+
119
154
  If you are not prompted for a password, no further action is required.
120
155
 
121
- If that is not the case open the sudoers file for editing using visudo
156
+ If that is not the case, open the sudoers file for editing using visudo
157
+
122
158
  ```
123
159
  sudo visudo
124
160
  ```
125
161
 
162
+ verify the presence of of a line
163
+
164
+ ```
165
+ @includedir /etc/sudoers.d
166
+ ```
167
+
168
+ exit and create a configuration file for sudoers
169
+
170
+ ```
171
+ sudo nano /etc/sudoers.d/matterbridge
172
+ ```
173
+
126
174
  add this line replacing USER with your user name (e.g. radxa ALL=(ALL) NOPASSWD: ALL)
127
175
 
128
176
  ```
129
177
  <USER> ALL=(ALL) NOPASSWD: ALL
130
178
  ```
131
179
 
132
- or if you prefers to only give access to npm without password try (e.g. radxa ALL=(ALL) NOPASSWD: /usr/bin/npm)
180
+ or if you prefers to only give access to npm without password try with (e.g. radxa ALL=(ALL) NOPASSWD: /usr/bin/npm)
133
181
 
134
182
  ```
135
183
  <USER> ALL=(ALL) NOPASSWD: /usr/bin/npm
136
184
  ```
137
185
 
138
- save the file and restart the system.
186
+ save the file and reload the settings with:
139
187
 
188
+ ```
189
+ sudo visudo -c
190
+ ```
package/README.md CHANGED
@@ -320,6 +320,52 @@ matterbridge -factoryreset
320
320
 
321
321
  This will reset the internal storages. All commissioning informations will be lost. All plugins will be unregistered.
322
322
 
323
+ # Frequently asked questions
324
+
325
+ ## How to enable HTTPS for the frontend
326
+
327
+ ### Provide your own certificates
328
+
329
+ Place your own certificates in the `.matterbridge/cert` directory:
330
+
331
+ - `cert.pem`
332
+ - `key.pem`
333
+ - `ca.pem` (optional)
334
+
335
+ ![image](https://github.com/user-attachments/assets/846785ca-6f5c-458b-b786-a6417a4da319)
336
+
337
+ ### Change the command line
338
+
339
+ Add the **-ssl** parameter to the command line. If desired, you can also change the frontend port with **-frontend 443**.
340
+
341
+ ```sh
342
+ matterbridge -ssl -frontend 443
343
+ ```
344
+
345
+ ### Restart
346
+
347
+ If the certificate are correctly configured, you will be able to connect with https to the frontend.
348
+
349
+ ![image](https://github.com/user-attachments/assets/9c38776d-064f-4d91-9359-a2cd3319b1ff)
350
+
351
+ ## How to send the debug log files
352
+
353
+ ### Enable debug and log on file
354
+
355
+ In the frontend, go to settings and enable debug mode as shown below:
356
+
357
+ ![Debug Matterbridge Settings](https://github.com/user-attachments/assets/83181dc2-969a-4b71-aff4-f1498fa1d665)
358
+
359
+ ![Debug Matter Settings](https://github.com/user-attachments/assets/617961a9-7cb0-46cf-9878-981f61738f8c)
360
+
361
+ ### Restart
362
+
363
+ Wait a few minutes to allow the logs to to accumulate.
364
+
365
+ Then, from the dots menu in the frontend, download the `matterbridge.log` and `matter.log` files.
366
+
367
+ ![image](https://github.com/user-attachments/assets/04ba65f6-594a-4ff8-9732-3df049f5a33e)
368
+
323
369
  # Known general issues
324
370
 
325
371
  ## Session XYZ does not exist
@@ -1 +1 @@
1
- {"version":3,"file":"defaultConfigSchema.d.ts","sourceRoot":"","sources":["../src/defaultConfigSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,eAAO,MAAM,kBAAkB,EAAE,cAiBhC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,cAWhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,cAkB3B,CAAC"}
1
+ {"version":3,"file":"defaultConfigSchema.d.ts","sourceRoot":"","sources":["../src/defaultConfigSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,eAAO,MAAM,kBAAkB,EAAE,cAiBhC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,cAWhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,cAwB3B,CAAC"}
@@ -56,8 +56,9 @@ export const shelly_config = {
56
56
  username: '',
57
57
  password: '',
58
58
  exposeSwitch: 'switch',
59
- exposeInput: 'disabled',
60
- exposePowerMeter: 'evehistory',
59
+ exposeInput: 'momentary',
60
+ exposeInputEvent: 'momentary',
61
+ exposePowerMeter: 'disabled',
61
62
  blackList: [],
62
63
  whiteList: [],
63
64
  deviceIp: {},
@@ -65,8 +66,13 @@ export const shelly_config = {
65
66
  enableStorageDiscover: true,
66
67
  resetStorageDiscover: false,
67
68
  enableConfigDiscover: false,
68
- enableBleDiscover: false,
69
+ enableBleDiscover: true,
70
+ failsafeCount: 0,
71
+ postfix: '',
69
72
  debug: false,
73
+ debugMdns: false,
74
+ debugCoap: false,
75
+ debugWs: false,
70
76
  unregisterOnShutdown: false,
71
77
  };
72
78
  //# sourceMappingURL=defaultConfigSchema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultConfigSchema.js","sourceRoot":"","sources":["../src/defaultConfigSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,gBAAgB,EAAE,EAAE;IACpB,sBAAsB,EAAE,EAAE;IAC1B,KAAK,EAAE,KAAK;IACZ,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,2BAA2B;IACjC,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,gBAAgB,EAAE,EAAE;IACpB,KAAK,EAAE,KAAK;IACZ,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,YAAY,EAAE,QAAQ;IACtB,WAAW,EAAE,UAAU;IACvB,gBAAgB,EAAE,YAAY;IAC9B,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,kBAAkB,EAAE,IAAI;IACxB,qBAAqB,EAAE,IAAI;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,iBAAiB,EAAE,KAAK;IACxB,KAAK,EAAE,KAAK;IACZ,oBAAoB,EAAE,KAAK;CAC5B,CAAC"}
1
+ {"version":3,"file":"defaultConfigSchema.js","sourceRoot":"","sources":["../src/defaultConfigSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,gBAAgB,EAAE,EAAE;IACpB,sBAAsB,EAAE,EAAE;IAC1B,KAAK,EAAE,KAAK;IACZ,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,2BAA2B;IACjC,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,gBAAgB,EAAE,EAAE;IACpB,KAAK,EAAE,KAAK;IACZ,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,YAAY,EAAE,QAAQ;IACtB,WAAW,EAAE,WAAW;IACxB,gBAAgB,EAAE,WAAW;IAC7B,gBAAgB,EAAE,UAAU;IAC5B,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,kBAAkB,EAAE,IAAI;IACxB,qBAAqB,EAAE,IAAI;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,CAAC;IAChB,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,KAAK;IACd,oBAAoB,EAAE,KAAK;CAC5B,CAAC"}
@@ -51,7 +51,6 @@ export declare class Matterbridge extends EventEmitter {
51
51
  private matterLoggerFile;
52
52
  private plugins;
53
53
  private devices;
54
- private registeredDevices;
55
54
  private nodeStorage;
56
55
  private nodeContext;
57
56
  private matterStorageName;
@@ -1 +1 @@
1
- {"version":3,"file":"matterbridge.d.ts","sourceRoot":"","sources":["../src/matterbridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"matterbridge.d.ts","sourceRoot":"","sources":["../src/matterbridge.ts"],"names":[],"mappings":"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"}
@@ -121,7 +121,6 @@ export class Matterbridge extends EventEmitter {
121
121
  matterLoggerFile = 'matter' + (getParameter('profile') ? '.' + getParameter('profile') : '') + '.log';
122
122
  plugins;
123
123
  devices;
124
- registeredDevices = [];
125
124
  nodeStorage;
126
125
  nodeContext;
127
126
  matterStorageName = 'matterbridge' + (getParameter('profile') ? '.' + getParameter('profile') : '') + '.json';
@@ -225,6 +224,8 @@ export class Matterbridge extends EventEmitter {
225
224
  this.nodeStorage = new NodeStorageManager({ dir: path.join(this.matterbridgeDirectory, this.nodeStorageName), writeQueue: false, expiredInterval: undefined, logging: false });
226
225
  // this.log.debug('Creating node storage context for matterbridge');
227
226
  this.nodeContext = await this.nodeStorage.createStorage('matterbridge');
227
+ // Check if the storage is corrupted and remove it
228
+ // TODO: Check if the storage is corrupted and remove it
228
229
  // Create matterbridge logger
229
230
  this.log = new AnsiLogger({ logName: 'Matterbridge', logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logLevel: "info" /* LogLevel.INFO */ });
230
231
  // Create the file logger for matterbridge (context: matterbridgeFileLog)
@@ -344,7 +345,7 @@ export class Matterbridge extends EventEmitter {
344
345
  // We don't do this when the add parameter is set because we shut down the process after adding the plugin
345
346
  this.log.info(`Error parsing plugin ${plg}${plugin.name}${nf}. Trying to reinstall it from npm.`);
346
347
  try {
347
- await this.spawnCommand('npm', ['install', '-g', plugin.name]);
348
+ await this.spawnCommand('npm', ['install', '-g', '--omit=dev', plugin.name]);
348
349
  this.log.info(`Plugin ${plg}${plugin.name}${nf} reinstalled.`);
349
350
  plugin.error = false;
350
351
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -473,28 +474,24 @@ export class Matterbridge extends EventEmitter {
473
474
  }
474
475
  if (getParameter('add')) {
475
476
  this.log.debug(`Adding plugin ${getParameter('add')}`);
476
- // await this.executeCommandLine(getParameter('add') as string, 'add');
477
477
  await this.plugins.add(getParameter('add'));
478
478
  this.emit('shutdown');
479
479
  return;
480
480
  }
481
481
  if (getParameter('remove')) {
482
482
  this.log.debug(`Removing plugin ${getParameter('remove')}`);
483
- // await this.executeCommandLine(getParameter('remove') as string, 'remove');
484
483
  await this.plugins.remove(getParameter('remove'));
485
484
  this.emit('shutdown');
486
485
  return;
487
486
  }
488
487
  if (getParameter('enable')) {
489
488
  this.log.debug(`Enabling plugin ${getParameter('enable')}`);
490
- // await this.executeCommandLine(getParameter('enable') as string, 'enable');
491
489
  await this.plugins.enable(getParameter('enable'));
492
490
  this.emit('shutdown');
493
491
  return;
494
492
  }
495
493
  if (getParameter('disable')) {
496
494
  this.log.debug(`Disabling plugin ${getParameter('disable')}`);
497
- // await this.executeCommandLine(getParameter('disable') as string, 'disable');
498
495
  await this.plugins.disable(getParameter('disable'));
499
496
  this.emit('shutdown');
500
497
  return;
@@ -518,7 +515,7 @@ export class Matterbridge extends EventEmitter {
518
515
  this.nodeContext = undefined;
519
516
  this.nodeStorage = undefined;
520
517
  this.plugins.clear();
521
- this.registeredDevices = [];
518
+ this.devices.clear();
522
519
  this.emit('shutdown');
523
520
  return;
524
521
  }
@@ -1175,8 +1172,8 @@ export class Matterbridge extends EventEmitter {
1175
1172
  if (this.nodeStorage && this.nodeContext) {
1176
1173
  this.log.info('Saving registered devices...');
1177
1174
  const serializedRegisteredDevices = [];
1178
- this.registeredDevices.forEach((registeredDevice) => {
1179
- const serializedMatterbridgeDevice = registeredDevice.device.serialize(registeredDevice.plugin);
1175
+ this.devices.forEach(async (device) => {
1176
+ const serializedMatterbridgeDevice = device.serialize();
1180
1177
  // this.log.info(`- ${serializedMatterbridgeDevice.deviceName}${rs}\n`, serializedMatterbridgeDevice);
1181
1178
  if (serializedMatterbridgeDevice)
1182
1179
  serializedRegisteredDevices.push(serializedMatterbridgeDevice);
@@ -1203,7 +1200,8 @@ export class Matterbridge extends EventEmitter {
1203
1200
  this.log.error('Error saving registered devices: nodeContext not found!');
1204
1201
  }
1205
1202
  this.plugins.clear();
1206
- this.registeredDevices = [];
1203
+ this.devices.clear();
1204
+ // this.registeredDevices = [];
1207
1205
  // this.log.info('Waiting for matter to deliver last messages...');
1208
1206
  // this.cleanupTimeout2 = setTimeout(async () => {
1209
1207
  if (restart) {
@@ -1301,7 +1299,6 @@ export class Matterbridge extends EventEmitter {
1301
1299
  plugin.aggregator?.addBridgedDevice(device);
1302
1300
  }
1303
1301
  }
1304
- this.registeredDevices.push({ plugin: pluginName, device });
1305
1302
  if (plugin.registeredDevices !== undefined)
1306
1303
  plugin.registeredDevices++;
1307
1304
  if (plugin.addedDevices !== undefined)
@@ -1337,12 +1334,6 @@ export class Matterbridge extends EventEmitter {
1337
1334
  // device.getClusterServerById(BridgedDeviceBasicInformation.Cluster.id)?.triggerShutDownEvent({});
1338
1335
  // device.getClusterServerById(BridgedDeviceBasicInformation.Cluster.id)?.triggerLeaveEvent({});
1339
1336
  this.matterAggregator?.removeBridgedDevice(device);
1340
- this.registeredDevices.forEach((registeredDevice, index) => {
1341
- if (registeredDevice.device === device) {
1342
- this.registeredDevices.splice(index, 1);
1343
- return;
1344
- }
1345
- });
1346
1337
  this.log.info(`Removed bridged device(${plugin.registeredDevices}/${plugin.addedDevices}) ${dev}${device.deviceName}${nf} (${dev}${device.name}${nf}) for plugin ${plg}${pluginName}${nf}`);
1347
1338
  if (plugin.registeredDevices !== undefined)
1348
1339
  plugin.registeredDevices--;
@@ -1356,24 +1347,12 @@ export class Matterbridge extends EventEmitter {
1356
1347
  this.log.error(`Error removing bridged device ${dev}${device.deviceName}${er} (${dev}${device.name}${er}) for plugin ${plg}${pluginName}${er}: commissioning server not found`);
1357
1348
  return;
1358
1349
  }
1359
- this.registeredDevices.forEach((registeredDevice, index) => {
1360
- if (registeredDevice.device === device) {
1361
- this.registeredDevices.splice(index, 1);
1362
- return;
1363
- }
1364
- });
1365
1350
  }
1366
1351
  else if (plugin.type === 'DynamicPlatform') {
1367
1352
  if (!plugin.aggregator) {
1368
1353
  this.log.error(`Error removing bridged device ${dev}${device.deviceName}${er} (${dev}${device.name}${er}) for plugin ${plg}${pluginName}${er}: aggregator not found`);
1369
1354
  return;
1370
1355
  }
1371
- this.registeredDevices.forEach((registeredDevice, index) => {
1372
- if (registeredDevice.device === device) {
1373
- this.registeredDevices.splice(index, 1);
1374
- return;
1375
- }
1376
- });
1377
1356
  if (device.number !== undefined) {
1378
1357
  device.setBridgedDeviceReachability(false);
1379
1358
  device.getClusterServerById(BridgedDeviceBasicInformation.Cluster.id)?.triggerReachableChangedEvent({ reachableNewValue: false });
@@ -1403,18 +1382,14 @@ export class Matterbridge extends EventEmitter {
1403
1382
  */
1404
1383
  async removeAllBridgedDevices(pluginName) {
1405
1384
  this.log.debug(`Removing all bridged devices for plugin ${plg}${pluginName}${db}`);
1406
- const devicesToRemove = [];
1407
- for (const registeredDevice of this.registeredDevices) {
1408
- if (registeredDevice.plugin === pluginName) {
1409
- devicesToRemove.push(registeredDevice);
1385
+ this.devices.forEach(async (device) => {
1386
+ if (device.plugin === pluginName) {
1387
+ await this.removeBridgedDevice(pluginName, device);
1410
1388
  }
1411
- }
1412
- for (const registeredDevice of devicesToRemove) {
1413
- this.removeBridgedDevice(pluginName, registeredDevice.device);
1414
- }
1389
+ });
1415
1390
  }
1416
1391
  async startTest() {
1417
- // Start the Matterbridge
1392
+ // Start the Matterbridge test
1418
1393
  }
1419
1394
  /**
1420
1395
  * Starts the Matterbridge in bridge mode.
@@ -2452,7 +2427,7 @@ export class Matterbridge extends EventEmitter {
2452
2427
  this.wssSendMessage('spawn', this.log.now(), 'Matterbridge:spawn', `child process closed with code ${code} and signal ${signal}`);
2453
2428
  if (code === 0) {
2454
2429
  if (cmdLine.startsWith('npm install -g'))
2455
- this.log.notice(`Package ${cmdLine.replace('npm install -g ', '').replace('--verbose', '')} installed correctly`);
2430
+ this.log.notice(`Package ${cmdLine.replace('npm install -g ', '').replace('--verbose', '').replace('--omit=dev', '')} installed correctly`);
2456
2431
  this.log.debug(`Child process "${cmdLine}" closed with code ${code} and signal ${signal}`);
2457
2432
  resolve();
2458
2433
  }
@@ -2745,21 +2720,21 @@ export class Matterbridge extends EventEmitter {
2745
2720
  this.expressApp.get('/api/devices', (req, res) => {
2746
2721
  this.log.debug('The frontend sent /api/devices');
2747
2722
  const data = [];
2748
- this.registeredDevices.forEach((registeredDevice) => {
2749
- let name = registeredDevice.device.getClusterServer(BasicInformationCluster)?.attributes.nodeLabel?.getLocal();
2723
+ this.devices.forEach(async (device) => {
2724
+ let name = device.getClusterServer(BasicInformationCluster)?.attributes.nodeLabel?.getLocal();
2750
2725
  if (!name)
2751
- name = registeredDevice.device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.nodeLabel?.getLocal() ?? 'Unknown';
2752
- let serial = registeredDevice.device.getClusterServer(BasicInformationCluster)?.attributes.serialNumber?.getLocal();
2726
+ name = device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.nodeLabel?.getLocal() ?? 'Unknown';
2727
+ let serial = device.getClusterServer(BasicInformationCluster)?.attributes.serialNumber?.getLocal();
2753
2728
  if (!serial)
2754
- serial = registeredDevice.device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.serialNumber?.getLocal() ?? 'Unknown';
2755
- let uniqueId = registeredDevice.device.getClusterServer(BasicInformationCluster)?.attributes.uniqueId?.getLocal();
2729
+ serial = device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.serialNumber?.getLocal() ?? 'Unknown';
2730
+ let uniqueId = device.getClusterServer(BasicInformationCluster)?.attributes.uniqueId?.getLocal();
2756
2731
  if (!uniqueId)
2757
- uniqueId = registeredDevice.device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.uniqueId?.getLocal() ?? 'Unknown';
2758
- const cluster = this.getClusterTextFromDevice(registeredDevice.device);
2732
+ uniqueId = device.getClusterServer(BridgedDeviceBasicInformationCluster)?.attributes.uniqueId?.getLocal() ?? 'Unknown';
2733
+ const cluster = this.getClusterTextFromDevice(device);
2759
2734
  data.push({
2760
- pluginName: registeredDevice.plugin,
2761
- type: registeredDevice.device.name + ' (0x' + registeredDevice.device.deviceType.toString(16).padStart(4, '0') + ')',
2762
- endpoint: registeredDevice.device.number,
2735
+ pluginName: device.plugin ?? 'Unknown',
2736
+ type: device.name + ' (0x' + device.deviceType.toString(16).padStart(4, '0') + ')',
2737
+ endpoint: device.number,
2763
2738
  name,
2764
2739
  serial,
2765
2740
  uniqueId,
@@ -2779,9 +2754,9 @@ export class Matterbridge extends EventEmitter {
2779
2754
  return;
2780
2755
  }
2781
2756
  const data = [];
2782
- this.registeredDevices.forEach((registeredDevice) => {
2783
- if (registeredDevice.plugin === selectedPluginName && registeredDevice.device.number === selectedDeviceEndpoint) {
2784
- const clusterServers = registeredDevice.device.getAllClusterServers();
2757
+ this.devices.forEach(async (device) => {
2758
+ if (device.plugin === selectedPluginName && device.number === selectedDeviceEndpoint) {
2759
+ const clusterServers = device.getAllClusterServers();
2785
2760
  clusterServers.forEach((clusterServer) => {
2786
2761
  Object.entries(clusterServer.attributes).forEach(([key, value]) => {
2787
2762
  if (clusterServer.name === 'EveHistory')
@@ -2800,7 +2775,7 @@ export class Matterbridge extends EventEmitter {
2800
2775
  // console.log(error);
2801
2776
  }
2802
2777
  data.push({
2803
- endpoint: registeredDevice.device.number ? registeredDevice.device.number.toString() : '...',
2778
+ endpoint: device.number ? device.number.toString() : '...',
2804
2779
  clusterName: clusterServer.name,
2805
2780
  clusterId: '0x' + clusterServer.id.toString(16).padStart(2, '0'),
2806
2781
  attributeName: key,
@@ -2809,8 +2784,8 @@ export class Matterbridge extends EventEmitter {
2809
2784
  });
2810
2785
  });
2811
2786
  });
2812
- registeredDevice.device.getChildEndpoints().forEach((childEndpoint) => {
2813
- const name = registeredDevice.device.getChildEndpointName(childEndpoint);
2787
+ device.getChildEndpoints().forEach((childEndpoint) => {
2788
+ const name = device.getChildEndpointName(childEndpoint);
2814
2789
  const clusterServers = childEndpoint.getAllClusterServers();
2815
2790
  clusterServers.forEach((clusterServer) => {
2816
2791
  Object.entries(clusterServer.attributes).forEach(([key, value]) => {
@@ -3138,7 +3113,7 @@ export class Matterbridge extends EventEmitter {
3138
3113
  if (command === 'update') {
3139
3114
  this.log.info('Updating matterbridge...');
3140
3115
  try {
3141
- await this.spawnCommand('npm', ['install', '-g', 'matterbridge', '--verbose']);
3116
+ await this.spawnCommand('npm', ['install', '-g', 'matterbridge', '--omit=dev', '--verbose']);
3142
3117
  this.log.info('Matterbridge has been updated. Full restart required.');
3143
3118
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
3144
3119
  }
@@ -3173,7 +3148,7 @@ export class Matterbridge extends EventEmitter {
3173
3148
  param = param.replace(/\*/g, '\\');
3174
3149
  this.log.info(`Installing plugin ${plg}${param}${nf}...`);
3175
3150
  try {
3176
- await this.spawnCommand('npm', ['install', '-g', param, '--verbose']);
3151
+ await this.spawnCommand('npm', ['install', '-g', param, '--omit=dev', '--verbose']);
3177
3152
  this.log.info(`Plugin ${plg}${param}${nf} installed. Full restart required.`);
3178
3153
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
3179
3154
  }