matterbridge 3.5.0-dev-20260113-c10324f → 3.5.0-dev-20260114-67b3c1f

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
@@ -30,11 +30,55 @@ Advantages:
30
30
 
31
31
  ## [3.5.0] - Dev branch
32
32
 
33
+ ### Breaking Changes
34
+
35
+ - [matter]: This release brings the upgrade to matter 1.4.2 and matter.js 0.16.1.
36
+
37
+ ### Changed device types in Matter 1.4.2
38
+
39
+ - [all]: Added ScenesManagement Cluster that is no more provisional.
40
+ - [onOffMountedSwitch]: Updated onOffOutlet and onOffMountedSwitch: when using the mounted device types add as well the outlet device types on the same endpoint as subset device type.
41
+ - [dimmableMountedSwitch]: Updated dimmableOutlet and dimmableMountedSwitch: when using the mounted device types add as well the outlet device types on the same endpoint as subset device type.
42
+ - [coverDevice]: Updated coverDevice rev. 4 and removed Scene Management cluster.
43
+ - [roboticVacuumCleaner]: Updated roboticVacuumCleaner rev. 4: OperationCompletion event for RVC Operational State cluster is now mandatory (TODO: check behavior).
44
+ - [laundryWasher]: Updated laundryWasher rev. 2: OperationCompletion event for Operational State cluster is now mandatory (TODO: check behavior).
45
+ - [laundryDryer]: Updated laundryDryer rev. 2: OperationCompletion event for Operational State cluster is now mandatory (TODO: check behavior).
46
+ - [dishwasher]: Updated dishwasher rev. 2: OperationCompletion event for Operational State cluster is now mandatory (TODO: check behavior).
47
+ - [refrigerator]: Updated refrigerator: Temperature Controlled Cabinet with Cooler condition.
48
+ - [microwaveOven]: Updated microwaveOven rev. 2: OperationCompletion event for Operational State cluster is now mandatory (TODO: check behavior).
49
+ - [cookSurface]: Updated cookSurface rev. 2: TemperatureLevel is the only valid temperature control mode.
50
+ - [temperatureControlledCabinetCooler]: Updated temperatureControlledCabinetCooler rev. 5: TemperatureNumber is the only valid temperature control mode.
51
+ - [temperatureControlledCabinetHeater]: Updated temperatureControlledCabinetHeater rev. 5: TemperatureNumber is the only valid temperature control mode and OperationCompletion event for Oven Cavity Operational State cluster is now mandatory (TODO: check behavior).
52
+
53
+ ### Changed clusters in Matter 1.4.2
54
+
55
+ - [BridgedDeviceBasicInformation]: Revision 5 - ConfigurationVersion attribute added as P O.
56
+ - [DoorLock]: Revision 9 - Removed AlarmMask attribute.
57
+ - [ElectricalPowerMeasurement]: Revision 2 - Changed reactive and apparent power fields to use new data types. Revision 3 - Changed range of apparent current field to allow negative apparent current.
58
+ - [FanControl]: Revision 5 - Clarified attribute usage, added conformance column.
59
+ - [Thermostat]: Revision 9 - Removed AlarmMask attribute and AlarmCodeBitmap Type.
60
+ - [Identify]: Revision 6 - Added Q quality for IdentifyTime attribute.
61
+ - [WindowCovering]: Revision 6 - Marked AbsolutePosition feature and associated elements provisional.
62
+ - [RvcCleanMode]: Revision 4 - Add VacuumThenMop cleaning mode.
63
+ - [RvcOperationalState]: Revision 4 - Add several operational states and errors.
64
+ - [ServiceArea]: Revision 2 - Rename InitialTimeEstimate to EstimatedTime.
65
+
33
66
  ### Added
34
67
 
68
+ - [jest]: Added cache inside the repo in .cache/jest.
69
+ - [frontend]: Enhanced logging for HTTP/HTTPS server binding in Frontend class.
70
+ - [matterbridge]: Excluded specific network interfaces when looking for the first external interface.
71
+ - [thermostat]: Conformance to new matter.js internal attributes externalMeasuredIndoorTemperature and externallyMeasuredOccupancy (not in Matter 1.4.2).
72
+
35
73
  ### Changed
36
74
 
37
75
  - [package]: Updated dependencies.
76
+ - [eslint]: Moved cache in .cache/.eslintcache.
77
+ - [prettier]: Moved cache in .cache/.prettiercache.
78
+
79
+ ### Fixed
80
+
81
+ - [macOS]: Fixed the EnergyEvse.chargingEnabledUntil attribute that was wrongly set in the disable command (spec 9.3.8.4).
38
82
 
39
83
  <a href="https://www.buymeacoffee.com/luligugithub"><img src="https://matterbridge.io/bmc-button.svg" alt="Buy me a coffee" width="80"></a>
40
84
 
@@ -60,7 +60,6 @@ export class MatterbridgeEnergyEvseServer extends EnergyEvseServer {
60
60
  if (this.state.state === EnergyEvse.State.PluggedInCharging) {
61
61
  this.state.state = EnergyEvse.State.PluggedInDemand;
62
62
  }
63
- this.state.chargingEnabledUntil = 0;
64
63
  }
65
64
  enableCharging(request) {
66
65
  const device = this.endpoint.stateOf(MatterbridgeServer);
package/dist/frontend.js CHANGED
@@ -206,6 +206,10 @@ export class Frontend extends EventEmitter {
206
206
  }
207
207
  else {
208
208
  this.httpServer.listen(this.port, () => {
209
+ const addr = this.httpServer?.address();
210
+ if (addr && typeof addr !== 'string') {
211
+ this.log.info(`The frontend http server is bound to ${addr.family} ${addr.address}:${addr.port}`);
212
+ }
209
213
  if (this.matterbridge.systemInformation.ipv4Address !== '')
210
214
  this.log.info(`The frontend http server is listening on ${UNDERLINE}http://${this.matterbridge.systemInformation.ipv4Address}:${this.port}${UNDERLINEOFF}${rs}`);
211
215
  if (this.matterbridge.systemInformation.ipv6Address !== '')
@@ -338,6 +342,10 @@ export class Frontend extends EventEmitter {
338
342
  }
339
343
  else {
340
344
  this.httpsServer.listen(this.port, () => {
345
+ const addr = this.httpsServer?.address();
346
+ if (addr && typeof addr !== 'string') {
347
+ this.log.info(`The frontend https server is bound to ${addr.family} ${addr.address}:${addr.port}`);
348
+ }
341
349
  if (this.matterbridge.systemInformation.ipv4Address !== '')
342
350
  this.log.info(`The frontend https server is listening on ${UNDERLINE}https://${this.matterbridge.systemInformation.ipv4Address}:${this.port}${UNDERLINEOFF}${rs}`);
343
351
  if (this.matterbridge.systemInformation.ipv6Address !== '')
@@ -1496,8 +1504,10 @@ export class Frontend extends EventEmitter {
1496
1504
  this.wssSendRefreshRequired('matter', { matter: { ...matter, advertising: true } });
1497
1505
  }
1498
1506
  if (data.params.removeFabric) {
1499
- if (serverNode.env.get(FabricManager).has(FabricIndex(data.params.removeFabric)))
1500
- await serverNode.env.get(FabricManager).removeFabric(FabricIndex(data.params.removeFabric));
1507
+ const fabricIndex = FabricIndex(data.params.removeFabric);
1508
+ const fabricManager = serverNode.env.get(FabricManager);
1509
+ if (fabricManager.has(fabricIndex))
1510
+ await fabricManager.for(fabricIndex).leave();
1501
1511
  this.log.debug(`*Removed fabric index ${data.params.removeFabric} for node ${data.params.id}`);
1502
1512
  this.wssSendRefreshRequired('matter', { matter: { ...matter } });
1503
1513
  }
@@ -162,7 +162,10 @@ export async function startMatterbridge(bridgeMode = 'bridge', frontendPort = 82
162
162
  process.env['MATTERBRIDGE_PAUSE_MATTER_INTERVAL_MS'] = '100';
163
163
  process.argv.length = 0;
164
164
  process.argv.push(...originalProcessArgv, '-novirtual', '-debug', '-verbose', '-logger', 'debug', '-matterlogger', 'debug', bridgeMode === '' ? '-test' : '-' + bridgeMode, '-homedir', HOMEDIR, '-frontend', frontendPort.toString(), '-port', matterPort.toString(), '-passcode', passcode.toString(), '-discriminator', discriminator.toString());
165
+ expect(Matterbridge.instance).toBeUndefined();
165
166
  matterbridge = await Matterbridge.loadInstance(true);
167
+ expect(matterbridge.environment).toBeDefined();
168
+ new MdnsService(matterbridge.environment);
166
169
  expect(matterbridge).toBeDefined();
167
170
  expect(matterbridge.profile).toBeUndefined();
168
171
  expect(matterbridge.bridgeMode).toBe(bridgeMode);
@@ -333,7 +336,7 @@ export async function stopMatterbridgeEnvironment() {
333
336
  expect(server.lifecycle.isReady).toBeTruthy();
334
337
  expect(server.lifecycle.isOnline).toBeTruthy();
335
338
  await server.close();
336
- expect(server.lifecycle.isReady).toBeTruthy();
339
+ expect(server.lifecycle.isReady).toBeFalsy();
337
340
  expect(server.lifecycle.isOnline).toBeFalsy();
338
341
  await matterbridge.stopMatterStorage();
339
342
  expect(matterbridge.matterStorageService).not.toBeDefined();
@@ -357,10 +360,7 @@ export async function destroyInstance(matterbridge, cleanupPause = 10, destroyPa
357
360
  }
358
361
  export async function closeMdnsInstance(matterbridge) {
359
362
  const mdns = matterbridge.environment.get(MdnsService);
360
- if (mdns && mdns[Symbol.asyncDispose] && typeof mdns[Symbol.asyncDispose] === 'function')
361
- await mdns[Symbol.asyncDispose]();
362
- if (mdns && mdns.close && typeof mdns.close === 'function')
363
- await mdns.close();
363
+ await mdns.close();
364
364
  }
365
365
  export function createTestEnvironment(name) {
366
366
  expect(name).toBeDefined();
@@ -379,10 +379,7 @@ export function createTestEnvironment(name) {
379
379
  }
380
380
  export async function destroyTestEnvironment() {
381
381
  const mdns = environment.get(MdnsService);
382
- if (mdns && typeof mdns[Symbol.asyncDispose] === 'function')
383
- await mdns[Symbol.asyncDispose]();
384
- if (mdns && typeof mdns.close === 'function')
385
- await mdns.close();
382
+ await mdns.close();
386
383
  }
387
384
  export async function flushAsync(ticks = 3, microTurns = 10, pause = 250) {
388
385
  for (let i = 0; i < ticks; i++)
@@ -532,7 +529,7 @@ export async function stopServerNode(server) {
532
529
  expect(server.lifecycle.isReady).toBeTruthy();
533
530
  expect(server.lifecycle.isOnline).toBeTruthy();
534
531
  await server.close();
535
- expect(server.lifecycle.isReady).toBeTruthy();
532
+ expect(server.lifecycle.isReady).toBeFalsy();
536
533
  expect(server.lifecycle.isOnline).toBeFalsy();
537
534
  const mdns = environment.get(MdnsService);
538
535
  if (mdns && typeof mdns[Symbol.asyncDispose] === 'function')
@@ -5,7 +5,7 @@ import { AnsiLogger, BLUE, CYAN, db, debugStringify, er, nf, or, zb } from 'node
5
5
  import { NodeStorageManager } from 'node-persist-manager';
6
6
  import '@matter/nodejs';
7
7
  import { Logger, LogLevel as MatterLogLevel, LogFormat as MatterLogFormat, StorageService, UINT32_MAX, UINT16_MAX, Environment } from '@matter/general';
8
- import { FabricAction, MdnsService } from '@matter/protocol';
8
+ import { MdnsService } from '@matter/protocol';
9
9
  import { VendorId, DeviceTypeId } from '@matter/types';
10
10
  import { ServerNode, Endpoint } from '@matter/node';
11
11
  import { AggregatorEndpoint } from '@matter/node/endpoints/aggregator';
@@ -64,6 +64,9 @@ export class MatterNode extends EventEmitter {
64
64
  this.log.logNameColor = '\x1b[38;5;65m';
65
65
  if (this.debug)
66
66
  this.log.debug(`MatterNode ${this.pluginName ? 'for plugin ' + this.pluginName : 'bridge'} loading...`);
67
+ this.port = matterbridge.port;
68
+ this.passcode = matterbridge.passcode;
69
+ this.discriminator = matterbridge.discriminator;
67
70
  this.server = new BroadcastServer('matter', this.log);
68
71
  this.server.on('broadcast_message', this.msgHandler.bind(this));
69
72
  if (this.verbose)
@@ -81,6 +84,12 @@ export class MatterNode extends EventEmitter {
81
84
  this.environment.vars.set('runtime.exitcode', false);
82
85
  if (this.verbose)
83
86
  this.log.debug(`Matter Environment is ready`);
87
+ this.matterMdnsService = new MdnsService(this.environment);
88
+ setImmediate(async () => {
89
+ await this.matterMdnsService?.construction.ready;
90
+ if (this.verbose)
91
+ this.log.debug(`Matter MdnsService is ready`);
92
+ });
84
93
  if (this.matterbridge.fileLogger) {
85
94
  AnsiLogger.setGlobalLogfile(path.join(this.matterbridge.matterbridgeDirectory, MATTERBRIDGE_LOGGER_FILE), this.matterbridge.logLevel);
86
95
  }
@@ -127,11 +136,7 @@ export class MatterNode extends EventEmitter {
127
136
  if (closeMdns) {
128
137
  if (this.verbose)
129
138
  this.log.debug(`Closing Matter MdnsService for ${this.storeId}...`);
130
- this.matterMdnsService = this.environment.get(MdnsService);
131
- if (typeof this.matterMdnsService[Symbol.asyncDispose] === 'function')
132
- await this.matterMdnsService[Symbol.asyncDispose]();
133
- else
134
- await this.matterMdnsService.close();
139
+ await this.matterMdnsService?.close();
135
140
  if (this.verbose)
136
141
  this.log.debug(`Closed Matter MdnsService for ${this.storeId}`);
137
142
  }
@@ -429,14 +434,14 @@ export class MatterNode extends EventEmitter {
429
434
  serverNode.events.commissioning.fabricsChanged.on((fabricIndex, fabricAction) => {
430
435
  let action = '';
431
436
  switch (fabricAction) {
432
- case FabricAction.Added:
437
+ case 'added':
433
438
  this.advertisingNodes.delete(storeId);
434
439
  action = 'added';
435
440
  break;
436
- case FabricAction.Removed:
441
+ case 'deleted':
437
442
  action = 'removed';
438
443
  break;
439
- case FabricAction.Updated:
444
+ case 'updated':
440
445
  action = 'updated';
441
446
  break;
442
447
  }
@@ -595,6 +600,9 @@ export class MatterNode extends EventEmitter {
595
600
  try {
596
601
  this.log.debug(`Creating MatterNode for device ${plg}${pluginName}${db}:${dev}${device.deviceName}${db} (${zb}${device.name}${db})...`);
597
602
  const matterNode = new MatterNode(this.matterbridge, pluginName, device);
603
+ matterNode.port = this.port ? this.port++ : undefined;
604
+ matterNode.passcode = this.passcode ? this.passcode++ : undefined;
605
+ matterNode.discriminator = this.discriminator ? this.discriminator++ : undefined;
598
606
  this.dependantMatterNodes.set(device.id, matterNode);
599
607
  await matterNode.create();
600
608
  this.log.debug(`Created MatterNode for device ${plg}${pluginName}${db}:${dev}${device.deviceName}${db} (${zb}${device.name}${db})`);
@@ -9,7 +9,7 @@ import { AnsiLogger, UNDERLINE, UNDERLINEOFF, db, debugStringify, BRIGHT, RESET,
9
9
  import { NodeStorageManager } from 'node-persist-manager';
10
10
  import '@matter/nodejs';
11
11
  import { Logger, LogLevel as MatterLogLevel, LogFormat as MatterLogFormat, UINT32_MAX, UINT16_MAX, Crypto, Environment, StorageService } from '@matter/general';
12
- import { FabricAction, PaseClient } from '@matter/protocol';
12
+ import { PaseClient } from '@matter/protocol';
13
13
  import { Endpoint, ServerNode } from '@matter/node';
14
14
  import { DeviceTypeId, VendorId } from '@matter/types/datatype';
15
15
  import { AggregatorEndpoint } from '@matter/node/endpoints';
@@ -746,6 +746,7 @@ export class Matterbridge extends EventEmitter {
746
746
  this.sigtermHandler = undefined;
747
747
  }
748
748
  async logNodeAndSystemInfo() {
749
+ const excludedInterfaceNamePattern = /(tailscale|wireguard|openvpn|zerotier|hamachi|\bwg\d+\b|\btun\d+\b|\btap\d+\b|\butun\d+\b|docker|podman|\bveth[a-z0-9]*\b|\bbr-[a-z0-9]+\b|cni|kube|flannel|calico|virbr\d*\b|vmware|vmnet\d*\b|virtualbox|vboxnet\d*\b|teredo|isatap)/i;
749
750
  const networkInterfaces = os.networkInterfaces();
750
751
  this.systemInformation.interfaceName = '';
751
752
  this.systemInformation.ipv4Address = '';
@@ -754,9 +755,10 @@ export class Matterbridge extends EventEmitter {
754
755
  for (const [interfaceName, interfaceDetails] of Object.entries(networkInterfaces)) {
755
756
  if (this.mdnsInterface && interfaceName !== this.mdnsInterface)
756
757
  continue;
757
- if (!interfaceDetails) {
758
- break;
759
- }
758
+ if (!this.mdnsInterface && excludedInterfaceNamePattern.test(interfaceName))
759
+ continue;
760
+ if (!interfaceDetails)
761
+ continue;
760
762
  for (const detail of interfaceDetails) {
761
763
  if (detail.family === 'IPv4' && !detail.internal && this.systemInformation.ipv4Address === '') {
762
764
  this.systemInformation.interfaceName = interfaceName;
@@ -1484,14 +1486,14 @@ export class Matterbridge extends EventEmitter {
1484
1486
  serverNode.events.commissioning.fabricsChanged.on((fabricIndex, fabricAction) => {
1485
1487
  let action = '';
1486
1488
  switch (fabricAction) {
1487
- case FabricAction.Added:
1489
+ case 'added':
1488
1490
  this.advertisingNodes.delete(storeId);
1489
1491
  action = 'added';
1490
1492
  break;
1491
- case FabricAction.Removed:
1493
+ case 'deleted':
1492
1494
  action = 'removed';
1493
1495
  break;
1494
- case FabricAction.Updated:
1496
+ case 'updated':
1495
1497
  action = 'updated';
1496
1498
  break;
1497
1499
  }
@@ -857,7 +857,7 @@ export declare class MatterbridgeEnhancedColorControlServer extends Matterbridge
857
857
  declare const MatterbridgeLiftWindowCoveringServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
858
858
  readonly id: 258;
859
859
  readonly name: "WindowCovering";
860
- readonly revision: 5;
860
+ readonly revision: 6;
861
861
  readonly features: {
862
862
  readonly lift: import("@matter/types").BitFlag;
863
863
  readonly tilt: import("@matter/types").BitFlag;
@@ -1052,7 +1052,7 @@ export declare class MatterbridgeLiftWindowCoveringServer extends MatterbridgeLi
1052
1052
  declare const MatterbridgeLiftTiltWindowCoveringServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
1053
1053
  readonly id: 258;
1054
1054
  readonly name: "WindowCovering";
1055
- readonly revision: 5;
1055
+ readonly revision: 6;
1056
1056
  readonly features: {
1057
1057
  readonly lift: import("@matter/types").BitFlag;
1058
1058
  readonly tilt: import("@matter/types").BitFlag;
@@ -1256,7 +1256,7 @@ export declare class MatterbridgeFanControlServer extends MatterbridgeFanControl
1256
1256
  declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
1257
1257
  readonly id: 513;
1258
1258
  readonly name: "Thermostat";
1259
- readonly revision: 8;
1259
+ readonly revision: 9;
1260
1260
  readonly features: {
1261
1261
  readonly heating: import("@matter/types").BitFlag;
1262
1262
  readonly cooling: import("@matter/types").BitFlag;
@@ -1325,6 +1325,18 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
1325
1325
  mode: import("@matter/types").FieldType<Thermostat.SetpointRaiseLowerMode>;
1326
1326
  amount: import("@matter/types").FieldType<number>;
1327
1327
  }>, void, any>;
1328
+ readonly atomicRequest: import("@matter/types").Command<import("@matter/types").TypeFromFields<{
1329
+ requestType: import("@matter/types").FieldType<Thermostat.RequestType>;
1330
+ attributeRequests: import("@matter/types").FieldType<import("@matter/types/datatype").AttributeId[]>;
1331
+ timeout: import("@matter/types").OptionalFieldType<number>;
1332
+ }>, import("@matter/types").TypeFromFields<{
1333
+ statusCode: import("@matter/types").FieldType<import("@matter/types").Status>;
1334
+ attributeStatus: import("@matter/types").FieldType<import("@matter/types").TypeFromFields<{
1335
+ attributeId: import("@matter/types").FieldType<import("@matter/types/datatype").AttributeId>;
1336
+ statusCode: import("@matter/types").FieldType<import("@matter/types").Status>;
1337
+ }>[]>;
1338
+ timeout: import("@matter/types").OptionalFieldType<number>;
1339
+ }>, any>;
1328
1340
  };
1329
1341
  readonly extensions: readonly [{
1330
1342
  readonly flags: {
@@ -1515,9 +1527,9 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
1515
1527
  }>>;
1516
1528
  }>[], any>;
1517
1529
  readonly numberOfPresets: import("@matter/types").FixedAttribute<number, any>;
1518
- readonly activePresetHandle: import("@matter/types").Attribute<Uint8Array<ArrayBufferLike> | null, any>;
1530
+ readonly activePresetHandle: import("@matter/types").Attribute<AllowSharedBufferSource | null, any>;
1519
1531
  readonly presets: import("@matter/types").WritableAttribute<import("@matter/types").TypeFromFields<{
1520
- presetHandle: import("@matter/types").FieldType<Uint8Array<ArrayBufferLike> | null>;
1532
+ presetHandle: import("@matter/types").FieldType<AllowSharedBufferSource | null>;
1521
1533
  presetScenario: import("@matter/types").FieldType<Thermostat.PresetScenario>;
1522
1534
  name: import("@matter/types").OptionalFieldType<string | null>;
1523
1535
  coolingSetpoint: import("@matter/types").OptionalFieldType<number>;
@@ -1527,7 +1539,7 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
1527
1539
  };
1528
1540
  readonly commands: {
1529
1541
  readonly setActivePresetRequest: import("@matter/types").Command<import("@matter/types").TypeFromFields<{
1530
- presetHandle: import("@matter/types").FieldType<Uint8Array<ArrayBufferLike> | null>;
1542
+ presetHandle: import("@matter/types").FieldType<AllowSharedBufferSource | null>;
1531
1543
  }>, void, any>;
1532
1544
  };
1533
1545
  };
@@ -1550,12 +1562,12 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
1550
1562
  readonly numberOfSchedules: import("@matter/types").FixedAttribute<number, any>;
1551
1563
  readonly numberOfScheduleTransitions: import("@matter/types").FixedAttribute<number, any>;
1552
1564
  readonly numberOfScheduleTransitionPerDay: import("@matter/types").FixedAttribute<number | null, any>;
1553
- readonly activeScheduleHandle: import("@matter/types").Attribute<Uint8Array<ArrayBufferLike> | null, any>;
1565
+ readonly activeScheduleHandle: import("@matter/types").Attribute<AllowSharedBufferSource | null, any>;
1554
1566
  readonly schedules: import("@matter/types").WritableAttribute<import("@matter/types").TypeFromFields<{
1555
- scheduleHandle: import("@matter/types").FieldType<Uint8Array<ArrayBufferLike> | null>;
1567
+ scheduleHandle: import("@matter/types").FieldType<AllowSharedBufferSource | null>;
1556
1568
  systemMode: import("@matter/types").FieldType<Thermostat.SystemMode>;
1557
1569
  name: import("@matter/types").OptionalFieldType<string>;
1558
- presetHandle: import("@matter/types").OptionalFieldType<Uint8Array<ArrayBufferLike>>;
1570
+ presetHandle: import("@matter/types").OptionalFieldType<AllowSharedBufferSource>;
1559
1571
  transitions: import("@matter/types").FieldType<import("@matter/types").TypeFromFields<{
1560
1572
  dayOfWeek: import("@matter/types").FieldType<import("@matter/types").TypeFromPartialBitSchema<{
1561
1573
  sunday: import("@matter/types").BitFlag;
@@ -1568,7 +1580,7 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
1568
1580
  away: import("@matter/types").BitFlag;
1569
1581
  }>>;
1570
1582
  transitionTime: import("@matter/types").FieldType<number>;
1571
- presetHandle: import("@matter/types").OptionalFieldType<Uint8Array<ArrayBufferLike>>;
1583
+ presetHandle: import("@matter/types").OptionalFieldType<AllowSharedBufferSource>;
1572
1584
  systemMode: import("@matter/types").OptionalFieldType<Thermostat.SystemMode>;
1573
1585
  coolingSetpoint: import("@matter/types").OptionalFieldType<number>;
1574
1586
  heatingSetpoint: import("@matter/types").OptionalFieldType<number>;
@@ -1578,7 +1590,7 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
1578
1590
  };
1579
1591
  readonly commands: {
1580
1592
  readonly setActiveScheduleRequest: import("@matter/types").Command<import("@matter/types").TypeFromFields<{
1581
- scheduleHandle: import("@matter/types").FieldType<Uint8Array<ArrayBufferLike>>;
1593
+ scheduleHandle: import("@matter/types").FieldType<AllowSharedBufferSource>;
1582
1594
  }>, void, any>;
1583
1595
  };
1584
1596
  };
@@ -1608,7 +1620,7 @@ export declare class MatterbridgeThermostatServer extends MatterbridgeThermostat
1608
1620
  declare const MatterbridgePresetThermostatServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
1609
1621
  readonly id: 513;
1610
1622
  readonly name: "Thermostat";
1611
- readonly revision: 8;
1623
+ readonly revision: 9;
1612
1624
  readonly features: {
1613
1625
  readonly heating: import("@matter/types").BitFlag;
1614
1626
  readonly cooling: import("@matter/types").BitFlag;
@@ -1677,6 +1689,18 @@ declare const MatterbridgePresetThermostatServer_base: import("@matter/node").Cl
1677
1689
  mode: import("@matter/types").FieldType<Thermostat.SetpointRaiseLowerMode>;
1678
1690
  amount: import("@matter/types").FieldType<number>;
1679
1691
  }>, void, any>;
1692
+ readonly atomicRequest: import("@matter/types").Command<import("@matter/types").TypeFromFields<{
1693
+ requestType: import("@matter/types").FieldType<Thermostat.RequestType>;
1694
+ attributeRequests: import("@matter/types").FieldType<import("@matter/types/datatype").AttributeId[]>;
1695
+ timeout: import("@matter/types").OptionalFieldType<number>;
1696
+ }>, import("@matter/types").TypeFromFields<{
1697
+ statusCode: import("@matter/types").FieldType<import("@matter/types").Status>;
1698
+ attributeStatus: import("@matter/types").FieldType<import("@matter/types").TypeFromFields<{
1699
+ attributeId: import("@matter/types").FieldType<import("@matter/types/datatype").AttributeId>;
1700
+ statusCode: import("@matter/types").FieldType<import("@matter/types").Status>;
1701
+ }>[]>;
1702
+ timeout: import("@matter/types").OptionalFieldType<number>;
1703
+ }>, any>;
1680
1704
  };
1681
1705
  readonly extensions: readonly [{
1682
1706
  readonly flags: {
@@ -1867,9 +1891,9 @@ declare const MatterbridgePresetThermostatServer_base: import("@matter/node").Cl
1867
1891
  }>>;
1868
1892
  }>[], any>;
1869
1893
  readonly numberOfPresets: import("@matter/types").FixedAttribute<number, any>;
1870
- readonly activePresetHandle: import("@matter/types").Attribute<Uint8Array<ArrayBufferLike> | null, any>;
1894
+ readonly activePresetHandle: import("@matter/types").Attribute<AllowSharedBufferSource | null, any>;
1871
1895
  readonly presets: import("@matter/types").WritableAttribute<import("@matter/types").TypeFromFields<{
1872
- presetHandle: import("@matter/types").FieldType<Uint8Array<ArrayBufferLike> | null>;
1896
+ presetHandle: import("@matter/types").FieldType<AllowSharedBufferSource | null>;
1873
1897
  presetScenario: import("@matter/types").FieldType<Thermostat.PresetScenario>;
1874
1898
  name: import("@matter/types").OptionalFieldType<string | null>;
1875
1899
  coolingSetpoint: import("@matter/types").OptionalFieldType<number>;
@@ -1879,7 +1903,7 @@ declare const MatterbridgePresetThermostatServer_base: import("@matter/node").Cl
1879
1903
  };
1880
1904
  readonly commands: {
1881
1905
  readonly setActivePresetRequest: import("@matter/types").Command<import("@matter/types").TypeFromFields<{
1882
- presetHandle: import("@matter/types").FieldType<Uint8Array<ArrayBufferLike> | null>;
1906
+ presetHandle: import("@matter/types").FieldType<AllowSharedBufferSource | null>;
1883
1907
  }>, void, any>;
1884
1908
  };
1885
1909
  };
@@ -1902,12 +1926,12 @@ declare const MatterbridgePresetThermostatServer_base: import("@matter/node").Cl
1902
1926
  readonly numberOfSchedules: import("@matter/types").FixedAttribute<number, any>;
1903
1927
  readonly numberOfScheduleTransitions: import("@matter/types").FixedAttribute<number, any>;
1904
1928
  readonly numberOfScheduleTransitionPerDay: import("@matter/types").FixedAttribute<number | null, any>;
1905
- readonly activeScheduleHandle: import("@matter/types").Attribute<Uint8Array<ArrayBufferLike> | null, any>;
1929
+ readonly activeScheduleHandle: import("@matter/types").Attribute<AllowSharedBufferSource | null, any>;
1906
1930
  readonly schedules: import("@matter/types").WritableAttribute<import("@matter/types").TypeFromFields<{
1907
- scheduleHandle: import("@matter/types").FieldType<Uint8Array<ArrayBufferLike> | null>;
1931
+ scheduleHandle: import("@matter/types").FieldType<AllowSharedBufferSource | null>;
1908
1932
  systemMode: import("@matter/types").FieldType<Thermostat.SystemMode>;
1909
1933
  name: import("@matter/types").OptionalFieldType<string>;
1910
- presetHandle: import("@matter/types").OptionalFieldType<Uint8Array<ArrayBufferLike>>;
1934
+ presetHandle: import("@matter/types").OptionalFieldType<AllowSharedBufferSource>;
1911
1935
  transitions: import("@matter/types").FieldType<import("@matter/types").TypeFromFields<{
1912
1936
  dayOfWeek: import("@matter/types").FieldType<import("@matter/types").TypeFromPartialBitSchema<{
1913
1937
  sunday: import("@matter/types").BitFlag;
@@ -1920,7 +1944,7 @@ declare const MatterbridgePresetThermostatServer_base: import("@matter/node").Cl
1920
1944
  away: import("@matter/types").BitFlag;
1921
1945
  }>>;
1922
1946
  transitionTime: import("@matter/types").FieldType<number>;
1923
- presetHandle: import("@matter/types").OptionalFieldType<Uint8Array<ArrayBufferLike>>;
1947
+ presetHandle: import("@matter/types").OptionalFieldType<AllowSharedBufferSource>;
1924
1948
  systemMode: import("@matter/types").OptionalFieldType<Thermostat.SystemMode>;
1925
1949
  coolingSetpoint: import("@matter/types").OptionalFieldType<number>;
1926
1950
  heatingSetpoint: import("@matter/types").OptionalFieldType<number>;
@@ -1930,7 +1954,7 @@ declare const MatterbridgePresetThermostatServer_base: import("@matter/node").Cl
1930
1954
  };
1931
1955
  readonly commands: {
1932
1956
  readonly setActiveScheduleRequest: import("@matter/types").Command<import("@matter/types").TypeFromFields<{
1933
- scheduleHandle: import("@matter/types").FieldType<Uint8Array<ArrayBufferLike>>;
1957
+ scheduleHandle: import("@matter/types").FieldType<AllowSharedBufferSource>;
1934
1958
  }>, void, any>;
1935
1959
  };
1936
1960
  };
@@ -174,7 +174,7 @@ export const onOffLight = DeviceTypeDefinition({
174
174
  code: 0x0100,
175
175
  deviceClass: DeviceClasses.Simple,
176
176
  revision: 3,
177
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, OnOff.Cluster.id],
177
+ requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, ScenesManagement.Cluster.id, OnOff.Cluster.id],
178
178
  optionalServerClusters: [LevelControl.Cluster.id],
179
179
  });
180
180
  export const dimmableLight = DeviceTypeDefinition({
@@ -182,7 +182,7 @@ export const dimmableLight = DeviceTypeDefinition({
182
182
  code: 0x0101,
183
183
  deviceClass: DeviceClasses.Simple,
184
184
  revision: 3,
185
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id],
185
+ requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, ScenesManagement.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id],
186
186
  optionalServerClusters: [],
187
187
  });
188
188
  export const colorTemperatureLight = DeviceTypeDefinition({
@@ -190,7 +190,7 @@ export const colorTemperatureLight = DeviceTypeDefinition({
190
190
  code: 0x010c,
191
191
  deviceClass: DeviceClasses.Simple,
192
192
  revision: 4,
193
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id, ColorControl.Cluster.id],
193
+ requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, ScenesManagement.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id, ColorControl.Cluster.id],
194
194
  optionalServerClusters: [],
195
195
  });
196
196
  export const extendedColorLight = DeviceTypeDefinition({
@@ -198,39 +198,39 @@ export const extendedColorLight = DeviceTypeDefinition({
198
198
  code: 0x010d,
199
199
  deviceClass: DeviceClasses.Simple,
200
200
  revision: 4,
201
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id, ColorControl.Cluster.id],
201
+ requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, ScenesManagement.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id, ColorControl.Cluster.id],
202
202
  optionalServerClusters: [],
203
203
  });
204
204
  export const onOffOutlet = DeviceTypeDefinition({
205
205
  name: 'MA-onoffpluginunit',
206
206
  code: 0x010a,
207
207
  deviceClass: DeviceClasses.Simple,
208
- revision: 3,
209
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, OnOff.Cluster.id],
208
+ revision: 4,
209
+ requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, ScenesManagement.Cluster.id, OnOff.Cluster.id],
210
210
  optionalServerClusters: [LevelControl.Cluster.id],
211
211
  });
212
212
  export const dimmableOutlet = DeviceTypeDefinition({
213
213
  name: 'MA-dimmablepluginunit',
214
214
  code: 0x010b,
215
215
  deviceClass: DeviceClasses.Simple,
216
- revision: 4,
217
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id],
216
+ revision: 5,
217
+ requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, ScenesManagement.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id],
218
218
  optionalServerClusters: [],
219
219
  });
220
220
  export const onOffMountedSwitch = DeviceTypeDefinition({
221
221
  name: 'MA-onoffmountedswitch',
222
222
  code: 0x010f,
223
223
  deviceClass: DeviceClasses.Simple,
224
- revision: 1,
225
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, OnOff.Cluster.id],
224
+ revision: 2,
225
+ requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, ScenesManagement.Cluster.id, OnOff.Cluster.id],
226
226
  optionalServerClusters: [LevelControl.Cluster.id],
227
227
  });
228
228
  export const dimmableMountedSwitch = DeviceTypeDefinition({
229
229
  name: 'MA-dimmablemountedswitch',
230
230
  code: 0x0110,
231
231
  deviceClass: DeviceClasses.Simple,
232
- revision: 1,
233
- requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id],
232
+ revision: 2,
233
+ requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, ScenesManagement.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id],
234
234
  optionalServerClusters: [],
235
235
  });
236
236
  export const pumpDevice = DeviceTypeDefinition({
@@ -397,7 +397,7 @@ export const coverDevice = DeviceTypeDefinition({
397
397
  name: 'MA-windowCovering',
398
398
  code: 0x202,
399
399
  deviceClass: DeviceClasses.Simple,
400
- revision: 3,
400
+ revision: 4,
401
401
  requiredServerClusters: [Identify.Cluster.id, WindowCovering.Cluster.id],
402
402
  optionalServerClusters: [Groups.Cluster.id],
403
403
  });
@@ -480,7 +480,7 @@ export const roboticVacuumCleaner = DeviceTypeDefinition({
480
480
  name: 'MA-roboticvacuumcleaner',
481
481
  code: 0x74,
482
482
  deviceClass: DeviceClasses.Simple,
483
- revision: 3,
483
+ revision: 4,
484
484
  requiredServerClusters: [Identify.Cluster.id, RvcRunMode.Cluster.id, RvcOperationalState.Cluster.id],
485
485
  optionalServerClusters: [RvcCleanMode.Cluster.id, ServiceArea.Cluster.id],
486
486
  });
@@ -488,7 +488,7 @@ export const laundryWasher = DeviceTypeDefinition({
488
488
  name: 'MA-laundrywasher',
489
489
  code: 0x73,
490
490
  deviceClass: DeviceClasses.Simple,
491
- revision: 1,
491
+ revision: 2,
492
492
  requiredServerClusters: [OperationalState.Cluster.id],
493
493
  optionalServerClusters: [Identify.Cluster.id, LaundryWasherMode.Cluster.id, OnOff.Cluster.id, LaundryWasherControls.Cluster.id, TemperatureControl.Cluster.id],
494
494
  });
@@ -512,7 +512,7 @@ export const temperatureControlledCabinetCooler = DeviceTypeDefinition({
512
512
  name: 'MA-temperaturecontrolledcabinetcooler',
513
513
  code: 0x71,
514
514
  deviceClass: DeviceClasses.Simple,
515
- revision: 3,
515
+ revision: 5,
516
516
  requiredServerClusters: [TemperatureControl.Cluster.id, RefrigeratorAndTemperatureControlledCabinetMode.Cluster.id],
517
517
  optionalServerClusters: [TemperatureMeasurement.Cluster.id],
518
518
  });
@@ -520,7 +520,7 @@ export const temperatureControlledCabinetHeater = DeviceTypeDefinition({
520
520
  name: 'MA-temperaturecontrolledcabinetheater',
521
521
  code: 0x71,
522
522
  deviceClass: DeviceClasses.Simple,
523
- revision: 3,
523
+ revision: 5,
524
524
  requiredServerClusters: [TemperatureControl.Cluster.id, OvenMode.Cluster.id, OvenCavityOperationalState.Cluster.id],
525
525
  optionalServerClusters: [TemperatureMeasurement.Cluster.id],
526
526
  });
@@ -528,7 +528,7 @@ export const dishwasher = DeviceTypeDefinition({
528
528
  name: 'MA-dishwasher',
529
529
  code: 0x75,
530
530
  deviceClass: DeviceClasses.Simple,
531
- revision: 1,
531
+ revision: 2,
532
532
  requiredServerClusters: [OperationalState.Cluster.id],
533
533
  optionalServerClusters: [Identify.Cluster.id, OnOff.Cluster.id, TemperatureControl.Cluster.id, DishwasherMode.Cluster.id, DishwasherAlarm.Cluster.id],
534
534
  });
@@ -536,7 +536,7 @@ export const laundryDryer = DeviceTypeDefinition({
536
536
  name: 'MA-laundrydryer',
537
537
  code: 0x7c,
538
538
  deviceClass: DeviceClasses.Simple,
539
- revision: 1,
539
+ revision: 2,
540
540
  requiredServerClusters: [OperationalState.Cluster.id],
541
541
  optionalServerClusters: [Identify.Cluster.id, LaundryWasherMode.Cluster.id, OnOff.Cluster.id, LaundryDryerControls.Cluster.id, TemperatureControl.Cluster.id],
542
542
  });
@@ -544,7 +544,7 @@ export const cookSurface = DeviceTypeDefinition({
544
544
  name: 'MA-cooksurface',
545
545
  code: 0x77,
546
546
  deviceClass: DeviceClasses.Simple,
547
- revision: 1,
547
+ revision: 2,
548
548
  requiredServerClusters: [],
549
549
  optionalServerClusters: [TemperatureControl.Cluster.id, TemperatureMeasurement.Cluster.id, OnOff.Cluster.id],
550
550
  });
@@ -576,7 +576,7 @@ export const microwaveOven = DeviceTypeDefinition({
576
576
  name: 'MA-microwaveoven',
577
577
  code: 0x79,
578
578
  deviceClass: DeviceClasses.Simple,
579
- revision: 1,
579
+ revision: 2,
580
580
  requiredServerClusters: [OperationalState.Cluster.id, MicrowaveOvenMode.Cluster.id, MicrowaveOvenControl.Cluster.id],
581
581
  optionalServerClusters: [Identify.Cluster.id, FanControl.Cluster.id],
582
582
  });