matterbridge 3.5.0-dev-20260119-f9ea00e → 3.5.1-dev-20260121-22e98b4

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 (71) hide show
  1. package/CHANGELOG.md +133 -117
  2. package/bin/mb_coap.js +1 -1
  3. package/bin/mb_mdns.js +1 -1
  4. package/dist/broadcastServer.js +1 -2
  5. package/dist/cli.d.ts +1 -2
  6. package/dist/cli.js +1 -5
  7. package/dist/cliHistory.js +1 -1
  8. package/dist/deviceManager.js +1 -1
  9. package/dist/frontend.js +2 -7
  10. package/dist/helpers.js +1 -1
  11. package/dist/matterNode.js +1 -5
  12. package/dist/matterbridge.js +14 -18
  13. package/dist/matterbridgeEndpoint.d.ts +2 -0
  14. package/dist/matterbridgeEndpoint.js +41 -2
  15. package/dist/matterbridgeEndpointHelpers.js +1 -3
  16. package/dist/matterbridgePlatform.js +1 -2
  17. package/dist/{dgram/mb_mdns.js → mb_mdns.js} +13 -1
  18. package/dist/pluginManager.js +3 -4
  19. package/dist/{utils/spawn.js → spawn.js} +2 -2
  20. package/dist/update.js +6 -7
  21. package/dist/utils/export.d.ts +1 -12
  22. package/dist/utils/export.js +1 -12
  23. package/dist/workerGlobalPrefix.js +1 -3
  24. package/frontend/build/assets/index.js +4 -4
  25. package/frontend/package.json +1 -1
  26. package/npm-shrinkwrap.json +2 -2
  27. package/package.json +5 -5
  28. package/dist/dgram/coap.d.ts +0 -34
  29. package/dist/dgram/coap.js +0 -252
  30. package/dist/dgram/dgram.d.ts +0 -45
  31. package/dist/dgram/dgram.js +0 -251
  32. package/dist/dgram/mdns.d.ts +0 -188
  33. package/dist/dgram/mdns.js +0 -702
  34. package/dist/dgram/multicast.d.ts +0 -18
  35. package/dist/dgram/multicast.js +0 -118
  36. package/dist/dgram/unicast.d.ts +0 -11
  37. package/dist/dgram/unicast.js +0 -40
  38. package/dist/utils/colorUtils.d.ts +0 -24
  39. package/dist/utils/colorUtils.js +0 -187
  40. package/dist/utils/commandLine.d.ts +0 -6
  41. package/dist/utils/commandLine.js +0 -63
  42. package/dist/utils/copyDirectory.d.ts +0 -2
  43. package/dist/utils/copyDirectory.js +0 -39
  44. package/dist/utils/createDirectory.d.ts +0 -2
  45. package/dist/utils/createDirectory.js +0 -21
  46. package/dist/utils/createZip.d.ts +0 -1
  47. package/dist/utils/createZip.js +0 -69
  48. package/dist/utils/deepCopy.d.ts +0 -1
  49. package/dist/utils/deepCopy.js +0 -40
  50. package/dist/utils/deepEqual.d.ts +0 -1
  51. package/dist/utils/deepEqual.js +0 -58
  52. package/dist/utils/error.d.ts +0 -3
  53. package/dist/utils/error.js +0 -12
  54. package/dist/utils/format.d.ts +0 -4
  55. package/dist/utils/format.js +0 -29
  56. package/dist/utils/hex.d.ts +0 -4
  57. package/dist/utils/hex.js +0 -118
  58. package/dist/utils/inspector.d.ts +0 -24
  59. package/dist/utils/inspector.js +0 -200
  60. package/dist/utils/isValid.d.ts +0 -10
  61. package/dist/utils/isValid.js +0 -69
  62. package/dist/utils/network.d.ts +0 -25
  63. package/dist/utils/network.js +0 -193
  64. package/dist/utils/tracker.d.ts +0 -52
  65. package/dist/utils/tracker.js +0 -201
  66. package/dist/utils/wait.d.ts +0 -3
  67. package/dist/utils/wait.js +0 -73
  68. /package/dist/{dgram/mb_coap.d.ts → mb_coap.d.ts} +0 -0
  69. /package/dist/{dgram/mb_coap.js → mb_coap.js} +0 -0
  70. /package/dist/{dgram/mb_mdns.d.ts → mb_mdns.d.ts} +0 -0
  71. /package/dist/{utils/spawn.d.ts → spawn.d.ts} +0 -0
package/bin/mb_coap.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import('../dist/dgram/mb_coap.js');
2
+ import('../dist/mb_coap.js');
package/bin/mb_mdns.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import('../dist/dgram/mb_mdns.js');
2
+ import('../dist/mb_mdns.js');
@@ -3,8 +3,7 @@ if (process.argv.includes('--loader') || process.argv.includes('-loader'))
3
3
  import { EventEmitter } from 'node:events';
4
4
  import { BroadcastChannel } from 'node:worker_threads';
5
5
  import { CYAN, db, debugStringify, er } from 'node-ansi-logger';
6
- import { hasParameter } from './utils/commandLine.js';
7
- import { logError } from './utils/error.js';
6
+ import { hasParameter, logError } from '@matterbridge/utils';
8
7
  export class BroadcastServer extends EventEmitter {
9
8
  name;
10
9
  log;
package/dist/cli.d.ts CHANGED
@@ -1,6 +1,5 @@
1
+ import { Inspector, Tracker } from '@matterbridge/utils';
1
2
  import type { Matterbridge } from './matterbridge.js';
2
- import { Tracker } from './utils/tracker.js';
3
- import { Inspector } from './utils/inspector.js';
4
3
  export declare let instance: Matterbridge | undefined;
5
4
  export declare const tracker: Tracker;
6
5
  export declare const inspector: Inspector;
package/dist/cli.js CHANGED
@@ -1,12 +1,8 @@
1
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
2
2
  console.log('\u001B[32mCli loaded.\u001B[40;0m');
3
3
  import { AnsiLogger } from 'node-ansi-logger';
4
+ import { formatBytes, formatUptime, hasAnyParameter, hasParameter, Inspector, inspectError, Tracker } from '@matterbridge/utils';
4
5
  import { cliEmitter } from './cliEmitter.js';
5
- import { hasParameter, hasAnyParameter } from './utils/commandLine.js';
6
- import { inspectError } from './utils/error.js';
7
- import { Tracker } from './utils/tracker.js';
8
- import { Inspector } from './utils/inspector.js';
9
- import { formatBytes, formatUptime } from './utils/format.js';
10
6
  export let instance;
11
7
  export const tracker = new Tracker('Cli', false, false);
12
8
  export const inspector = new Inspector('Cli', false, false);
@@ -3,7 +3,7 @@ if (process.argv.includes('--loader') || process.argv.includes('-loader'))
3
3
  import { writeFileSync } from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import os from 'node:os';
6
- import { Tracker } from './utils/tracker.js';
6
+ import { Tracker } from '@matterbridge/utils';
7
7
  export function generateHistoryPage(options = {}) {
8
8
  const pageTitle = options.pageTitle ?? 'Matterbridge CPU & Memory History';
9
9
  const hostname = options.hostname ?? os.hostname();
@@ -1,7 +1,7 @@
1
1
  import { AnsiLogger, BLUE, CYAN, db, debugStringify, er } from 'node-ansi-logger';
2
+ import { hasParameter } from '@matterbridge/utils';
2
3
  import { dev } from './matterbridgeTypes.js';
3
4
  import { BroadcastServer } from './broadcastServer.js';
4
- import { hasParameter } from './utils/commandLine.js';
5
5
  export function toBaseDevice(device) {
6
6
  return {
7
7
  mode: device.mode,
package/dist/frontend.js CHANGED
@@ -10,13 +10,8 @@ import { FabricIndex } from '@matter/types/datatype';
10
10
  import { CommissioningOptions } from '@matter/types/commissioning';
11
11
  import { BridgedDeviceBasicInformation } from '@matter/types/clusters/bridged-device-basic-information';
12
12
  import { PowerSource } from '@matter/types/clusters/power-source';
13
+ import { createZip, formatBytes, formatPercent, formatUptime, getParameter, hasParameter, inspectError, isValidArray, isValidBoolean, isValidNumber, isValidObject, isValidString, wait, withTimeout } from '@matterbridge/utils';
13
14
  import { MATTER_LOGGER_FILE, MATTER_STORAGE_NAME, MATTERBRIDGE_DIAGNOSTIC_FILE, MATTERBRIDGE_HISTORY_FILE, MATTERBRIDGE_LOGGER_FILE, NODE_STORAGE_DIR, plg } from './matterbridgeTypes.js';
14
- import { isValidArray, isValidNumber, isValidObject, isValidString, isValidBoolean } from './utils/isValid.js';
15
- import { createZip } from './utils/createZip.js';
16
- import { hasParameter, getParameter } from './utils/commandLine.js';
17
- import { withTimeout, wait } from './utils/wait.js';
18
- import { inspectError } from './utils/error.js';
19
- import { formatBytes, formatUptime, formatPercent } from './utils/format.js';
20
15
  import { capitalizeFirstLetter, getAttribute } from './matterbridgeEndpointHelpers.js';
21
16
  import { cliEmitter, lastOsCpuUsage, lastProcessCpuUsage } from './cliEmitter.js';
22
17
  import { generateHistoryPage } from './cliHistory.js';
@@ -699,7 +694,7 @@ export class Frontend extends EventEmitter {
699
694
  await fs.promises.rename(file.path, filePath);
700
695
  this.log.info(`File ${plg}${filename}${nf} uploaded successfully`);
701
696
  if (filename.endsWith('.tgz')) {
702
- const { spawnCommand } = await import('./utils/spawn.js');
697
+ const { spawnCommand } = await import('./spawn.js');
703
698
  if (await spawnCommand('npm', ['install', '-g', filePath, '--omit=dev', '--verbose'], 'install', filename)) {
704
699
  this.log.info(`Plugin package ${plg}${filename}${nf} installed successfully. Full restart required.`);
705
700
  this.wssSendCloseSnackbarMessage(`Installing package ${filename}. Please wait...`);
package/dist/helpers.js CHANGED
@@ -6,7 +6,7 @@ import { OnOffPlugInUnitDevice } from '@matter/node/devices/on-off-plug-in-unit'
6
6
  import { MountedOnOffControlDevice } from '@matter/node/devices/mounted-on-off-control';
7
7
  import { OnOffLightDevice } from '@matter/node/devices/on-off-light';
8
8
  import { OnOffLightSwitchDevice } from '@matter/node/devices/on-off-light-switch';
9
- import { hasParameter } from './utils/commandLine.js';
9
+ import { hasParameter } from '@matterbridge/utils';
10
10
  export async function addVirtualDevice(aggregatorEndpoint, name, type, callback) {
11
11
  let deviceType;
12
12
  switch (type) {
@@ -11,13 +11,9 @@ import { ServerNode, Endpoint } from '@matter/node';
11
11
  import { AggregatorEndpoint } from '@matter/node/endpoints/aggregator';
12
12
  import { BasicInformationServer } from '@matter/node/behaviors/basic-information';
13
13
  import { BridgedDeviceBasicInformationServer } from '@matter/node/behaviors/bridged-device-basic-information';
14
+ import { copyDirectory, getIntParameter, getParameter, hasParameter, inspectError, isValidNumber, isValidString, parseVersionString, wait, withTimeout } from '@matterbridge/utils';
14
15
  import { dev, MATTER_LOGGER_FILE, MATTER_STORAGE_NAME, plg, NODE_STORAGE_DIR, MATTERBRIDGE_LOGGER_FILE } from './matterbridgeTypes.js';
15
16
  import { bridge } from './matterbridgeDeviceTypes.js';
16
- import { getIntParameter, getParameter, hasParameter } from './utils/commandLine.js';
17
- import { copyDirectory } from './utils/copyDirectory.js';
18
- import { isValidNumber, isValidString, parseVersionString } from './utils/isValid.js';
19
- import { wait, withTimeout } from './utils/wait.js';
20
- import { inspectError } from './utils/error.js';
21
17
  import { BroadcastServer } from './broadcastServer.js';
22
18
  import { toBaseDevice } from './deviceManager.js';
23
19
  import { PluginManager } from './pluginManager.js';
@@ -14,11 +14,7 @@ import { Endpoint, ServerNode } from '@matter/node';
14
14
  import { DeviceTypeId, VendorId } from '@matter/types/datatype';
15
15
  import { AggregatorEndpoint } from '@matter/node/endpoints';
16
16
  import { BasicInformationServer } from '@matter/node/behaviors/basic-information';
17
- import { getParameter, getIntParameter, hasParameter } from './utils/commandLine.js';
18
- import { copyDirectory } from './utils/copyDirectory.js';
19
- import { createDirectory } from './utils/createDirectory.js';
20
- import { isValidString, parseVersionString, isValidNumber, isValidObject } from './utils/isValid.js';
21
- import { formatBytes, formatPercent, formatUptime } from './utils/format.js';
17
+ import { copyDirectory, createDirectory, formatBytes, formatPercent, formatUptime, getIntParameter, getParameter, hasParameter, isValidNumber, isValidObject, isValidString, parseVersionString } from '@matterbridge/utils';
22
18
  import { dev, MATTER_LOGGER_FILE, MATTER_STORAGE_NAME, MATTERBRIDGE_LOGGER_FILE, NODE_STORAGE_DIR, plg, typ } from './matterbridgeTypes.js';
23
19
  import { PluginManager } from './pluginManager.js';
24
20
  import { DeviceManager } from './deviceManager.js';
@@ -286,7 +282,7 @@ export class Matterbridge extends EventEmitter {
286
282
  this.log.info(`Pairing file ${CYAN}${pairingFilePath}${nf} found. Using passcode ${CYAN}${this.passcode}${nf} and discriminator ${CYAN}${this.discriminator}${nf} from pairing file.`);
287
283
  }
288
284
  if (pairingFileJson.privateKey && pairingFileJson.certificate && pairingFileJson.intermediateCertificate && pairingFileJson.declaration) {
289
- const { hexToBuffer } = await import('./utils/hex.js');
285
+ const { hexToBuffer } = await import('@matterbridge/utils');
290
286
  this.certification = {
291
287
  privateKey: hexToBuffer(pairingFileJson.privateKey),
292
288
  certificate: hexToBuffer(pairingFileJson.certificate),
@@ -474,7 +470,7 @@ export class Matterbridge extends EventEmitter {
474
470
  for (const plugin of this.plugins) {
475
471
  if (!fs.existsSync(plugin.path) && !hasParameter('add') && !hasParameter('remove') && !hasParameter('enable') && !hasParameter('disable') && !hasParameter('reset') && !hasParameter('factoryreset')) {
476
472
  this.log.info(`Error parsing plugin ${plg}${plugin.name}${nf}. Trying to reinstall it from npm...`);
477
- const { spawnCommand } = await import('./utils/spawn.js');
473
+ const { spawnCommand } = await import('./spawn.js');
478
474
  if (await spawnCommand('npm', ['install', '-g', `${plugin.name}${plugin.version.includes('-dev-') ? '@dev' : ''}`, '--omit=dev', '--verbose'], 'install', plugin.name)) {
479
475
  this.log.info(`Plugin ${plg}${plugin.name}${nf} reinstalled.`);
480
476
  plugin.error = false;
@@ -548,7 +544,7 @@ export class Matterbridge extends EventEmitter {
548
544
  return;
549
545
  }
550
546
  if (hasParameter('loginterfaces')) {
551
- const { logInterfaces } = await import('./utils/network.js');
547
+ const { logInterfaces } = await import('@matterbridge/utils');
552
548
  logInterfaces();
553
549
  this.shutdown = true;
554
550
  return;
@@ -652,13 +648,13 @@ export class Matterbridge extends EventEmitter {
652
648
  await this.nodeContext?.set('bridgeMode', 'bridge');
653
649
  }
654
650
  if (hasParameter('delay') && os.uptime() <= 60 * 5) {
655
- const { wait } = await import('./utils/wait.js');
651
+ const { wait } = await import('@matterbridge/utils');
656
652
  const delay = getIntParameter('delay') || 120;
657
653
  this.log.warn('Delay switch found with system uptime less then 5 minutes. Waiting for ' + delay + ' seconds before starting matterbridge...');
658
654
  await wait(delay * 1000, 'Race condition delay', true);
659
655
  }
660
656
  if (hasParameter('fixed_delay')) {
661
- const { wait } = await import('./utils/wait.js');
657
+ const { wait } = await import('@matterbridge/utils');
662
658
  const delay = getIntParameter('fixed_delay') || 120;
663
659
  this.log.warn('Fixed delay switch found. Waiting for ' + delay + ' seconds before starting matterbridge...');
664
660
  await wait(delay * 1000, 'Fixed race condition delay', true);
@@ -827,7 +823,7 @@ export class Matterbridge extends EventEmitter {
827
823
  if (this.globalModulesDirectory === '') {
828
824
  this.log.debug(`Getting global node_modules directory...`);
829
825
  try {
830
- const { getGlobalNodeModules } = await import('./utils/network.js');
826
+ const { getGlobalNodeModules } = await import('@matterbridge/utils');
831
827
  this.globalModulesDirectory = await getGlobalNodeModules();
832
828
  this.log.debug(`Global node_modules Directory: ${this.globalModulesDirectory}`);
833
829
  await this.nodeContext?.set('globalModulesDirectory', this.globalModulesDirectory);
@@ -927,7 +923,7 @@ export class Matterbridge extends EventEmitter {
927
923
  }
928
924
  async updateProcess() {
929
925
  this.log.info('Updating matterbridge...');
930
- const { spawnCommand } = await import('./utils/spawn.js');
926
+ const { spawnCommand } = await import('./spawn.js');
931
927
  if (await spawnCommand('npm', ['install', '-g', 'matterbridge', '--omit=dev', '--verbose'], 'install', 'matterbridge')) {
932
928
  this.log.info('Matterbridge has been updated. Full restart required.');
933
929
  }
@@ -938,7 +934,7 @@ export class Matterbridge extends EventEmitter {
938
934
  await this.cleanup('updating...', false);
939
935
  }
940
936
  async unregisterAndShutdownProcess(timeout = 1000) {
941
- const { wait } = await import('./utils/wait.js');
937
+ const { wait } = await import('@matterbridge/utils');
942
938
  this.log.info('Unregistering all devices and shutting down...');
943
939
  for (const plugin of this.plugins.array()) {
944
940
  if (plugin.error || !plugin.enabled)
@@ -1001,7 +997,7 @@ export class Matterbridge extends EventEmitter {
1001
997
  }
1002
998
  this.log.notice(`Stopping matter server nodes in ${this.bridgeMode} mode...`);
1003
999
  if (pause > 0) {
1004
- const { wait } = await import('./utils/wait.js');
1000
+ const { wait } = await import('@matterbridge/utils');
1005
1001
  this.log.debug(`Waiting ${pause}ms for the MessageExchange to finish...`);
1006
1002
  await wait(pause, `Waiting ${pause}ms for the MessageExchange to finish...`, false);
1007
1003
  }
@@ -1251,7 +1247,7 @@ export class Matterbridge extends EventEmitter {
1251
1247
  async startChildbridge(delay = 1000) {
1252
1248
  if (!this.matterStorageManager)
1253
1249
  throw new Error('No storage manager initialized');
1254
- const { wait } = await import('./utils/wait.js');
1250
+ const { wait } = await import('@matterbridge/utils');
1255
1251
  this.log.debug('Loading all plugins in childbridge mode...');
1256
1252
  await this.startPlugins(true, false);
1257
1253
  this.log.debug('Creating server nodes for DynamicPlatform plugins and starting all plugins in childbridge mode...');
@@ -1562,7 +1558,7 @@ export class Matterbridge extends EventEmitter {
1562
1558
  await matterServerNode.start();
1563
1559
  }
1564
1560
  async stopServerNode(matterServerNode, timeout = 10000) {
1565
- const { withTimeout } = await import('./utils/wait.js');
1561
+ const { withTimeout } = await import('@matterbridge/utils');
1566
1562
  if (!matterServerNode)
1567
1563
  return;
1568
1564
  this.log.notice(`Closing ${matterServerNode.id} server node`);
@@ -1614,7 +1610,7 @@ export class Matterbridge extends EventEmitter {
1614
1610
  }
1615
1611
  }
1616
1612
  async addBridgedEndpoint(pluginName, device) {
1617
- const { waiter } = await import('./utils/wait.js');
1613
+ const { waiter } = await import('@matterbridge/utils');
1618
1614
  const plugin = this.plugins.get(pluginName);
1619
1615
  if (!plugin) {
1620
1616
  this.log.error(`Error adding bridged endpoint ${dev}${device.deviceName}${er} (${zb}${device.id}${er}) plugin ${plg}${pluginName}${er} not found`);
@@ -1755,7 +1751,7 @@ export class Matterbridge extends EventEmitter {
1755
1751
  this.devices.remove(device);
1756
1752
  }
1757
1753
  async removeAllBridgedEndpoints(pluginName, delay = 0) {
1758
- const { wait } = await import('./utils/wait.js');
1754
+ const { wait } = await import('@matterbridge/utils');
1759
1755
  this.log.debug(`Removing all bridged endpoints for plugin ${plg}${pluginName}${db}${delay > 0 ? ` with delay ${delay} ms` : ''}`);
1760
1756
  for (const device of this.devices.array().filter((device) => device.plugin === pluginName)) {
1761
1757
  await this.removeBridgedEndpoint(pluginName, device);
@@ -9,6 +9,7 @@ import { Identify } from '@matter/types/clusters/identify';
9
9
  import { OnOff } from '@matter/types/clusters/on-off';
10
10
  import { ColorControl } from '@matter/types/clusters/color-control';
11
11
  import { WindowCovering } from '@matter/types/clusters/window-covering';
12
+ import { Thermostat } from '@matter/types/clusters/thermostat';
12
13
  import { FanControl } from '@matter/types/clusters/fan-control';
13
14
  import { DoorLock } from '@matter/types/clusters/door-lock';
14
15
  import { ModeSelect } from '@matter/types/clusters/mode-select';
@@ -117,6 +118,7 @@ export declare class MatterbridgeEndpoint extends Endpoint {
117
118
  setWindowCoveringTargetAndCurrentPosition(liftPosition: number, tiltPosition?: number): Promise<void>;
118
119
  createDefaultThermostatClusterServer(localTemperature?: number, occupiedHeatingSetpoint?: number, occupiedCoolingSetpoint?: number, minSetpointDeadBand?: number, minHeatSetpointLimit?: number, maxHeatSetpointLimit?: number, minCoolSetpointLimit?: number, maxCoolSetpointLimit?: number, unoccupiedHeatingSetpoint?: number | undefined, unoccupiedCoolingSetpoint?: number | undefined, occupied?: boolean | undefined, outdoorTemperature?: number | null | undefined): this;
119
120
  createDefaultHeatingThermostatClusterServer(localTemperature?: number, occupiedHeatingSetpoint?: number, minHeatSetpointLimit?: number, maxHeatSetpointLimit?: number, unoccupiedHeatingSetpoint?: number | undefined, occupied?: boolean | undefined, outdoorTemperature?: number | null | undefined): this;
121
+ createDefaultPresetsThermostatClusterServer(localTemperature?: number, occupiedHeatingSetpoint?: number, occupiedCoolingSetpoint?: number, minSetpointDeadBand?: number, minHeatSetpointLimit?: number, maxHeatSetpointLimit?: number, minCoolSetpointLimit?: number, maxCoolSetpointLimit?: number, unoccupiedHeatingSetpoint?: number | undefined, unoccupiedCoolingSetpoint?: number | undefined, occupied?: boolean | undefined, outdoorTemperature?: number | null | undefined, activePresetHandle?: number | undefined, presetsList?: Thermostat.Preset[] | null | undefined, presetTypes?: Thermostat.PresetType[] | null | undefined): this;
120
122
  createDefaultCoolingThermostatClusterServer(localTemperature?: number, occupiedCoolingSetpoint?: number, minCoolSetpointLimit?: number, maxCoolSetpointLimit?: number, unoccupiedCoolingSetpoint?: number | undefined, occupied?: boolean | undefined, outdoorTemperature?: number | null | undefined): this;
121
123
  createDefaultThermostatUserInterfaceConfigurationClusterServer(temperatureDisplayMode?: ThermostatUserInterfaceConfiguration.TemperatureDisplayMode, keypadLockout?: ThermostatUserInterfaceConfiguration.KeypadLockout, scheduleProgrammingVisibility?: ThermostatUserInterfaceConfiguration.ScheduleProgrammingVisibility): this;
122
124
  createDefaultFanControlClusterServer(fanMode?: FanControl.FanMode, fanModeSequence?: FanControl.FanModeSequence, percentSetting?: number, percentCurrent?: number): this;
@@ -60,10 +60,9 @@ import { RadonConcentrationMeasurementServer } from '@matter/node/behaviors/rado
60
60
  import { TotalVolatileOrganicCompoundsConcentrationMeasurementServer } from '@matter/node/behaviors/total-volatile-organic-compounds-concentration-measurement';
61
61
  import { FanControlServer } from '@matter/node/behaviors/fan-control';
62
62
  import { ThermostatUserInterfaceConfigurationServer } from '@matter/node/behaviors/thermostat-user-interface-configuration';
63
- import { isValidNumber, isValidObject, isValidString } from './utils/isValid.js';
63
+ import { inspectError, isValidNumber, isValidObject, isValidString } from '@matterbridge/utils';
64
64
  import { MatterbridgeServer, MatterbridgeIdentifyServer, MatterbridgeOnOffServer, MatterbridgeLevelControlServer, MatterbridgeColorControlServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeLiftTiltWindowCoveringServer, MatterbridgeThermostatServer, MatterbridgeFanControlServer, MatterbridgeDoorLockServer, MatterbridgeModeSelectServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeSwitchServer, MatterbridgeOperationalStateServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeHepaFilterMonitoringServer, MatterbridgeEnhancedColorControlServer, MatterbridgePowerSourceServer, } from './matterbridgeBehaviors.js';
65
65
  import { addClusterServers, addFixedLabel, addOptionalClusterServers, addRequiredClusterServers, addUserLabel, createUniqueId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getDefaultOperationalStateClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, getDefaultOccupancySensingClusterServer, getDefaultElectricalEnergyMeasurementClusterServer, getDefaultElectricalPowerMeasurementClusterServer, getApparentElectricalPowerMeasurementClusterServer, lowercaseFirstLetter, updateAttribute, getClusterId, getAttributeId, setAttribute, getAttribute, checkNotLatinCharacters, generateUniqueId, subscribeAttribute, invokeBehaviorCommand, triggerEvent, featuresFor, getDefaultPowerSourceWiredClusterServer, getDefaultPowerSourceReplaceableBatteryClusterServer, getDefaultPowerSourceRechargeableBatteryClusterServer, getDefaultDeviceEnergyManagementClusterServer, getDefaultDeviceEnergyManagementModeClusterServer, getDefaultPowerSourceBatteryClusterServer, } from './matterbridgeEndpointHelpers.js';
66
- import { inspectError } from './utils/error.js';
67
66
  export class MatterbridgeEndpoint extends Endpoint {
68
67
  static logLevel = "info";
69
68
  mode = undefined;
@@ -855,6 +854,46 @@ export class MatterbridgeEndpoint extends Endpoint {
855
854
  });
856
855
  return this;
857
856
  }
857
+ createDefaultPresetsThermostatClusterServer(localTemperature = 23, occupiedHeatingSetpoint = 21, occupiedCoolingSetpoint = 25, minSetpointDeadBand = 2, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50, unoccupiedHeatingSetpoint = undefined, unoccupiedCoolingSetpoint = undefined, occupied = undefined, outdoorTemperature = undefined, activePresetHandle = undefined, presetsList = undefined, presetTypes = undefined) {
858
+ this.behaviors.require(MatterbridgeThermostatServer.with(Thermostat.Feature.Heating, Thermostat.Feature.Cooling, Thermostat.Feature.AutoMode, ...(occupied !== undefined ? [Thermostat.Feature.Occupancy] : []), ...(presetsList !== undefined || presetTypes !== undefined ? [Thermostat.Feature.Presets] : [])), {
859
+ localTemperature: localTemperature * 100,
860
+ externalMeasuredIndoorTemperature: localTemperature * 100,
861
+ ...(outdoorTemperature !== undefined ? { outdoorTemperature: outdoorTemperature !== null ? outdoorTemperature * 100 : outdoorTemperature } : {}),
862
+ systemMode: Thermostat.SystemMode.Auto,
863
+ controlSequenceOfOperation: Thermostat.ControlSequenceOfOperation.CoolingAndHeating,
864
+ occupiedHeatingSetpoint: occupiedHeatingSetpoint * 100,
865
+ minHeatSetpointLimit: minHeatSetpointLimit * 100,
866
+ maxHeatSetpointLimit: maxHeatSetpointLimit * 100,
867
+ absMinHeatSetpointLimit: minHeatSetpointLimit * 100,
868
+ absMaxHeatSetpointLimit: maxHeatSetpointLimit * 100,
869
+ occupiedCoolingSetpoint: occupiedCoolingSetpoint * 100,
870
+ minCoolSetpointLimit: minCoolSetpointLimit * 100,
871
+ maxCoolSetpointLimit: maxCoolSetpointLimit * 100,
872
+ absMinCoolSetpointLimit: minCoolSetpointLimit * 100,
873
+ absMaxCoolSetpointLimit: maxCoolSetpointLimit * 100,
874
+ minSetpointDeadBand: minSetpointDeadBand * 10,
875
+ thermostatRunningMode: Thermostat.ThermostatRunningMode.Off,
876
+ ...(occupied !== undefined ? { unoccupiedHeatingSetpoint: unoccupiedHeatingSetpoint !== undefined ? unoccupiedHeatingSetpoint * 100 : 1900 } : {}),
877
+ ...(occupied !== undefined ? { unoccupiedCoolingSetpoint: unoccupiedCoolingSetpoint !== undefined ? unoccupiedCoolingSetpoint * 100 : 2700 } : {}),
878
+ ...(occupied !== undefined ? { occupancy: { occupied } } : {}),
879
+ numberOfPresets: Array.isArray(presetsList) ? presetsList.length : 0,
880
+ activePresetHandle: activePresetHandle !== undefined ? Uint8Array.from([activePresetHandle]) : null,
881
+ presets: (presetsList ?? []).map((p) => ({
882
+ presetHandle: Uint8Array.from(p.presetHandle || [0]),
883
+ presetScenario: p.presetScenario,
884
+ name: p.name,
885
+ coolingSetpoint: p.coolingSetpoint,
886
+ heatingSetpoint: p.heatingSetpoint,
887
+ builtIn: p.builtIn ?? true,
888
+ })),
889
+ presetTypes: (presetTypes ?? []).map((pt) => ({
890
+ ...pt,
891
+ numberOfPresets: pt.numberOfPresets ?? 0,
892
+ presetTypeFeatures: pt.presetTypeFeatures ?? { automatic: false, supportsNames: true },
893
+ })),
894
+ });
895
+ return this;
896
+ }
858
897
  createDefaultCoolingThermostatClusterServer(localTemperature = 23, occupiedCoolingSetpoint = 25, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50, unoccupiedCoolingSetpoint = undefined, occupied = undefined, outdoorTemperature = undefined) {
859
898
  this.behaviors.require(MatterbridgeThermostatServer.with(Thermostat.Feature.Cooling, ...(occupied !== undefined ? [Thermostat.Feature.Occupancy] : [])), {
860
899
  localTemperature: localTemperature * 100,
@@ -80,9 +80,7 @@ import { Pm25ConcentrationMeasurementServer } from '@matter/node/behaviors/pm25-
80
80
  import { Pm10ConcentrationMeasurementServer } from '@matter/node/behaviors/pm10-concentration-measurement';
81
81
  import { RadonConcentrationMeasurementServer } from '@matter/node/behaviors/radon-concentration-measurement';
82
82
  import { TotalVolatileOrganicCompoundsConcentrationMeasurementServer } from '@matter/node/behaviors/total-volatile-organic-compounds-concentration-measurement';
83
- import { deepCopy } from './utils/deepCopy.js';
84
- import { deepEqual } from './utils/deepEqual.js';
85
- import { isValidArray } from './utils/isValid.js';
83
+ import { deepCopy, deepEqual, isValidArray } from '@matterbridge/utils';
86
84
  import { MatterbridgeIdentifyServer, MatterbridgeOnOffServer, MatterbridgeLevelControlServer, MatterbridgeColorControlServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeThermostatServer, MatterbridgeFanControlServer, MatterbridgeDoorLockServer, MatterbridgeModeSelectServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDeviceEnergyManagementModeServer, } from './matterbridgeBehaviors.js';
87
85
  export function capitalizeFirstLetter(name) {
88
86
  if (!name)
@@ -5,10 +5,9 @@ import { CYAN, db, er, nf, wr } from 'node-ansi-logger';
5
5
  import { NodeStorageManager } from 'node-persist-manager';
6
6
  import { Descriptor } from '@matter/types/clusters/descriptor';
7
7
  import { BridgedDeviceBasicInformation } from '@matter/types/clusters/bridged-device-basic-information';
8
+ import { hasParameter, isValidArray, isValidObject, isValidString } from '@matterbridge/utils';
8
9
  import { checkNotLatinCharacters } from './matterbridgeEndpointHelpers.js';
9
10
  import { bridgedNode } from './matterbridgeDeviceTypes.js';
10
- import { isValidArray, isValidObject, isValidString } from './utils/isValid.js';
11
- import { hasParameter } from './utils/commandLine.js';
12
11
  import { BroadcastServer } from './broadcastServer.js';
13
12
  export class MatterbridgePlatform {
14
13
  matterbridge;
@@ -46,7 +46,7 @@ Examples:
46
46
  `);
47
47
  process.exit(0);
48
48
  }
49
- const { default: pkg } = await import('../../package.json', { with: { type: 'json' } });
49
+ const { default: pkg } = await import('../package.json', { with: { type: 'json' } });
50
50
  let mdnsIpv4QueryInterval;
51
51
  let mdnsIpv6QueryInterval;
52
52
  let mdnsIpv4AdvertiseInterval;
@@ -83,6 +83,18 @@ Examples:
83
83
  { name: '_mqtt._tcp.local', type: 12, class: 1, unicastResponse: true },
84
84
  { name: '_http._tcp.local', type: 12, class: 1, unicastResponse: true },
85
85
  { name: '_googlecast._tcp.local', type: 12, class: 1, unicastResponse: true },
86
+ { name: '_airplay._tcp.local', type: 12, class: 1, unicastResponse: true },
87
+ { name: '_amzn-alexa._tcp.local', type: 12, class: 1, unicastResponse: true },
88
+ { name: '_companion-link._tcp.local', type: 12, class: 1, unicastResponse: true },
89
+ { name: '_hap._tcp.local', type: 12, class: 1, unicastResponse: true },
90
+ { name: '_hap._udp.local', type: 12, class: 1, unicastResponse: true },
91
+ { name: '_ipp._tcp.local', type: 12, class: 1, unicastResponse: true },
92
+ { name: '_ipps._tcp.local', type: 12, class: 1, unicastResponse: true },
93
+ { name: '_meshcop._tcp.local', type: 12, class: 1, unicastResponse: true },
94
+ { name: '_printer._tcp.local', type: 12, class: 1, unicastResponse: true },
95
+ { name: '_raop._tcp.local', type: 12, class: 1, unicastResponse: true },
96
+ { name: '_sleep-proxy._tcp.local', type: 12, class: 1, unicastResponse: true },
97
+ { name: '_ssh._tcp.local', type: 12, class: 1, unicastResponse: true },
86
98
  { name: '_services._dns-sd._udp.local', type: 12, class: 1, unicastResponse: true },
87
99
  ]);
88
100
  }
@@ -1,8 +1,7 @@
1
1
  import EventEmitter from 'node:events';
2
2
  import { AnsiLogger, UNDERLINE, UNDERLINEOFF, BLUE, db, er, nf, nt, rs, wr, debugStringify, CYAN } from 'node-ansi-logger';
3
+ import { hasParameter, inspectError, logError } from '@matterbridge/utils';
3
4
  import { plg, typ } from './matterbridgeTypes.js';
4
- import { inspectError, logError } from './utils/error.js';
5
- import { hasParameter } from './utils/commandLine.js';
6
5
  import { BroadcastServer } from './broadcastServer.js';
7
6
  export class PluginManager extends EventEmitter {
8
7
  matterbridge;
@@ -439,7 +438,7 @@ export class PluginManager extends EventEmitter {
439
438
  }
440
439
  async install(packageName) {
441
440
  this.log.debug(`Installing plugin ${plg}${packageName}${db}...`);
442
- const { spawnCommand } = await import('./utils/spawn.js');
441
+ const { spawnCommand } = await import('./spawn.js');
443
442
  if (await spawnCommand('npm', ['install', '-g', packageName, '--omit=dev', '--verbose'], 'install', packageName)) {
444
443
  this.matterbridge.restartRequired = true;
445
444
  this.matterbridge.fixedRestartRequired = true;
@@ -466,7 +465,7 @@ export class PluginManager extends EventEmitter {
466
465
  }
467
466
  async uninstall(packageName) {
468
467
  this.log.debug(`Uninstalling plugin ${plg}${packageName}${db}...`);
469
- const { spawnCommand } = await import('./utils/spawn.js');
468
+ const { spawnCommand } = await import('./spawn.js');
470
469
  packageName = packageName.replace(/@.*$/, '');
471
470
  if (packageName === 'matterbridge')
472
471
  return false;
@@ -1,6 +1,6 @@
1
1
  import { AnsiLogger } from 'node-ansi-logger';
2
- import { BroadcastServer } from '../broadcastServer.js';
3
- import { hasParameter } from './commandLine.js';
2
+ import { hasParameter } from '@matterbridge/utils';
3
+ import { BroadcastServer } from './broadcastServer.js';
4
4
  export async function spawnCommand(command, args, packageCommand, packageName) {
5
5
  const { spawn } = await import('node:child_process');
6
6
  const debug = hasParameter('debug') || hasParameter('verbose');
package/dist/update.js CHANGED
@@ -1,8 +1,7 @@
1
1
  import { AnsiLogger, db, debugStringify, nt, wr } from 'node-ansi-logger';
2
+ import { hasParameter, isValidString } from '@matterbridge/utils';
2
3
  import { plg } from './matterbridgeTypes.js';
3
4
  import { BroadcastServer } from './broadcastServer.js';
4
- import { hasParameter } from './utils/commandLine.js';
5
- import { isValidString } from './utils/isValid.js';
6
5
  export async function checkUpdates(matterbridge) {
7
6
  const log = new AnsiLogger({ logName: 'MatterbridgeUpdates', logTimestampFormat: 4, logLevel: matterbridge.logLevel });
8
7
  const server = new BroadcastServer('updates', log);
@@ -26,7 +25,7 @@ export async function checkUpdates(matterbridge) {
26
25
  server.close();
27
26
  }
28
27
  export async function checkUpdatesAndLog(matterbridge, log, server) {
29
- const { getGitHubUpdate } = await import('./utils/network.js');
28
+ const { getGitHubUpdate } = await import('@matterbridge/utils');
30
29
  const branch = matterbridge.matterbridgeVersion.includes('-dev-') ? 'dev' : 'main';
31
30
  try {
32
31
  const updateJson = await getGitHubUpdate(branch, 'update.json', 5_000);
@@ -48,7 +47,7 @@ export async function checkUpdatesAndLog(matterbridge, log, server) {
48
47
  }
49
48
  }
50
49
  export async function getMatterbridgeLatestVersion(matterbridge, log, server) {
51
- const { getNpmPackageVersion } = await import('./utils/network.js');
50
+ const { getNpmPackageVersion } = await import('@matterbridge/utils');
52
51
  try {
53
52
  const version = await getNpmPackageVersion('matterbridge');
54
53
  server.request({ type: 'matterbridge_latest_version', src: server.name, dst: 'matterbridge', params: { version } });
@@ -73,7 +72,7 @@ export async function getMatterbridgeLatestVersion(matterbridge, log, server) {
73
72
  }
74
73
  }
75
74
  export async function getMatterbridgeDevVersion(matterbridge, log, server) {
76
- const { getNpmPackageVersion } = await import('./utils/network.js');
75
+ const { getNpmPackageVersion } = await import('@matterbridge/utils');
77
76
  try {
78
77
  const version = await getNpmPackageVersion('matterbridge', 'dev');
79
78
  server.request({ type: 'matterbridge_dev_version', src: server.name, dst: 'matterbridge', params: { version } });
@@ -98,7 +97,7 @@ export async function getMatterbridgeDevVersion(matterbridge, log, server) {
98
97
  }
99
98
  }
100
99
  export async function getPluginLatestVersion(log, server, plugin) {
101
- const { getNpmPackageVersion } = await import('./utils/network.js');
100
+ const { getNpmPackageVersion } = await import('@matterbridge/utils');
102
101
  try {
103
102
  const version = await getNpmPackageVersion(plugin.name);
104
103
  plugin.latestVersion = version;
@@ -117,7 +116,7 @@ export async function getPluginLatestVersion(log, server, plugin) {
117
116
  }
118
117
  }
119
118
  export async function getPluginDevVersion(log, server, plugin) {
120
- const { getNpmPackageVersion } = await import('./utils/network.js');
119
+ const { getNpmPackageVersion } = await import('@matterbridge/utils');
121
120
  try {
122
121
  const version = await getNpmPackageVersion(plugin.name, 'dev');
123
122
  plugin.devVersion = version;
@@ -1,12 +1 @@
1
- export * from './network.js';
2
- export * from './commandLine.js';
3
- export * from './isValid.js';
4
- export * from './colorUtils.js';
5
- export * from './deepCopy.js';
6
- export * from './deepEqual.js';
7
- export * from './copyDirectory.js';
8
- export * from './createDirectory.js';
9
- export * from './createZip.js';
10
- export * from './wait.js';
11
- export * from './hex.js';
12
- export * from './error.js';
1
+ export * from '@matterbridge/utils';
@@ -1,12 +1 @@
1
- export * from './network.js';
2
- export * from './commandLine.js';
3
- export * from './isValid.js';
4
- export * from './colorUtils.js';
5
- export * from './deepCopy.js';
6
- export * from './deepEqual.js';
7
- export * from './copyDirectory.js';
8
- export * from './createDirectory.js';
9
- export * from './createZip.js';
10
- export * from './wait.js';
11
- export * from './hex.js';
12
- export * from './error.js';
1
+ export * from '@matterbridge/utils';
@@ -1,10 +1,8 @@
1
1
  import { threadId, isMainThread, parentPort, workerData } from 'node:worker_threads';
2
2
  import { AnsiLogger } from 'node-ansi-logger';
3
- import { getGlobalNodeModules } from './utils/network.js';
3
+ import { getGlobalNodeModules, hasParameter, inspectError } from '@matterbridge/utils';
4
4
  import { BroadcastServer } from './broadcastServer.js';
5
- import { inspectError } from './utils/error.js';
6
5
  import { logWorkerInfo, parentLog, parentPost } from './workers.js';
7
- import { hasParameter } from './utils/commandLine.js';
8
6
  const debug = hasParameter('debug') || hasParameter('verbose');
9
7
  const verbose = hasParameter('verbose');
10
8
  if (!isMainThread && parentPort) {