@matterbridge/core 3.6.1-dev-20260313-a699c0e → 3.6.1

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.
@@ -2,7 +2,7 @@ import { KeypadInputServer } from '@matter/node/behaviors/keypad-input';
2
2
  import { MediaPlaybackServer } from '@matter/node/behaviors/media-playback';
3
3
  import { KeypadInput } from '@matter/types/clusters/keypad-input';
4
4
  import { MediaPlayback } from '@matter/types/clusters/media-playback';
5
- import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviors.js';
5
+ import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
6
6
  import { basicVideoPlayer, powerSource } from '../matterbridgeDeviceTypes.js';
7
7
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
8
8
  export class BasicVideoPlayer extends MatterbridgeEndpoint {
@@ -1,6 +1,6 @@
1
1
  import { ContentLauncherServer } from '@matter/node/behaviors/content-launcher';
2
2
  import { MediaPlayback } from '@matter/types/clusters/media-playback';
3
- import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
3
+ import { MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
4
4
  import { castingVideoPlayer, powerSource } from '../matterbridgeDeviceTypes.js';
5
5
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
6
6
  import { MatterbridgeKeypadInputServer, MatterbridgeMediaPlaybackServer } from './basicVideoPlayer.js';
@@ -2,7 +2,7 @@ import { AttributeElement, ClusterElement, ClusterModel, CommandElement, Datatyp
2
2
  import { ClusterBehavior } from '@matter/node';
3
3
  import { ClusterType } from '@matter/types';
4
4
  import { ClosureControl } from '../clusters/closure-control.js';
5
- import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
5
+ import { MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
6
6
  import { closure } from '../matterbridgeDeviceTypes.js';
7
7
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
8
8
  const ClosureControlSchema = ClusterElement({
@@ -2,7 +2,7 @@ import { AttributeElement, ClusterElement, ClusterModel, CommandElement, Datatyp
2
2
  import { ClusterBehavior } from '@matter/node';
3
3
  import { ClusterType } from '@matter/types';
4
4
  import { ClosureDimension } from '../clusters/closure-dimension.js';
5
- import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
5
+ import { MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
6
6
  import { closurePanel } from '../matterbridgeDeviceTypes.js';
7
7
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
8
8
  const ClosureDimensionSchema = ClusterElement({
@@ -2,7 +2,7 @@ import { DishwasherAlarmServer } from '@matter/node/behaviors/dishwasher-alarm';
2
2
  import { DishwasherModeServer } from '@matter/node/behaviors/dishwasher-mode';
3
3
  import { DishwasherMode } from '@matter/types/clusters/dishwasher-mode';
4
4
  import { ModeBase } from '@matter/types/clusters/mode-base';
5
- import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviors.js';
5
+ import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
6
6
  import { dishwasher, powerSource } from '../matterbridgeDeviceTypes.js';
7
7
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
8
8
  import { createLevelTemperatureControlClusterServer, createNumberTemperatureControlClusterServer } from './temperatureControl.js';
@@ -4,7 +4,7 @@ import { DeviceEnergyManagement } from '@matter/types/clusters/device-energy-man
4
4
  import { EnergyEvse } from '@matter/types/clusters/energy-evse';
5
5
  import { EnergyEvseMode } from '@matter/types/clusters/energy-evse-mode';
6
6
  import { ModeBase } from '@matter/types/clusters/mode-base';
7
- import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
7
+ import { MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
8
8
  import { deviceEnergyManagement, electricalSensor, evse, powerSource } from '../matterbridgeDeviceTypes.js';
9
9
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
10
10
  export class Evse extends MatterbridgeEndpoint {
@@ -3,7 +3,7 @@ import { LaundryWasherModeServer } from '@matter/node/behaviors/laundry-washer-m
3
3
  import { LaundryWasherControls } from '@matter/types/clusters/laundry-washer-controls';
4
4
  import { LaundryWasherMode } from '@matter/types/clusters/laundry-washer-mode';
5
5
  import { ModeBase } from '@matter/types/clusters/mode-base';
6
- import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviors.js';
6
+ import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
7
7
  import { laundryWasher, powerSource } from '../matterbridgeDeviceTypes.js';
8
8
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
9
9
  import { createLevelTemperatureControlClusterServer, createNumberTemperatureControlClusterServer } from './temperatureControl.js';
@@ -3,7 +3,7 @@ import { MicrowaveOvenModeServer } from '@matter/node/behaviors/microwave-oven-m
3
3
  import { MicrowaveOvenControl } from '@matter/types/clusters/microwave-oven-control';
4
4
  import { MicrowaveOvenMode } from '@matter/types/clusters/microwave-oven-mode';
5
5
  import { OperationalState } from '@matter/types/clusters/operational-state';
6
- import { MatterbridgeOperationalStateServer, MatterbridgeServer } from '../matterbridgeBehaviors.js';
6
+ import { MatterbridgeOperationalStateServer, MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
7
7
  import { microwaveOven, powerSource } from '../matterbridgeDeviceTypes.js';
8
8
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
9
9
  export class MicrowaveOven extends MatterbridgeEndpoint {
@@ -3,7 +3,7 @@ import { OvenModeServer } from '@matter/node/behaviors/oven-mode';
3
3
  import { ModeBase } from '@matter/types/clusters/mode-base';
4
4
  import { OperationalState } from '@matter/types/clusters/operational-state';
5
5
  import { OvenMode } from '@matter/types/clusters/oven-mode';
6
- import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
6
+ import { MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
7
7
  import { oven, powerSource, temperatureControlledCabinetHeater } from '../matterbridgeDeviceTypes.js';
8
8
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
9
9
  import { createNumberTemperatureControlClusterServer } from './temperatureControl.js';
@@ -2,7 +2,7 @@ import { RefrigeratorAlarmServer } from '@matter/node/behaviors/refrigerator-ala
2
2
  import { RefrigeratorAndTemperatureControlledCabinetModeServer } from '@matter/node/behaviors/refrigerator-and-temperature-controlled-cabinet-mode';
3
3
  import { ModeBase } from '@matter/types/clusters/mode-base';
4
4
  import { RefrigeratorAndTemperatureControlledCabinetMode } from '@matter/types/clusters/refrigerator-and-temperature-controlled-cabinet-mode';
5
- import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
5
+ import { MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
6
6
  import { powerSource, refrigerator, temperatureControlledCabinetCooler } from '../matterbridgeDeviceTypes.js';
7
7
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
8
8
  import { createNumberTemperatureControlClusterServer } from './temperatureControl.js';
@@ -9,7 +9,7 @@ import { RvcCleanMode } from '@matter/types/clusters/rvc-clean-mode';
9
9
  import { RvcOperationalState } from '@matter/types/clusters/rvc-operational-state';
10
10
  import { RvcRunMode } from '@matter/types/clusters/rvc-run-mode';
11
11
  import { ServiceArea } from '@matter/types/clusters/service-area';
12
- import { MatterbridgeServer, MatterbridgeServiceAreaServer } from '../matterbridgeBehaviors.js';
12
+ import { MatterbridgeServer, MatterbridgeServiceAreaServer } from '../matterbridgeBehaviorsServer.js';
13
13
  import { powerSource, roboticVacuumCleaner } from '../matterbridgeDeviceTypes.js';
14
14
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
15
15
  export class RoboticVacuumCleaner extends MatterbridgeEndpoint {
@@ -1,6 +1,6 @@
1
1
  import { TemperatureControlServer } from '@matter/node/behaviors/temperature-control';
2
2
  import { TemperatureControl } from '@matter/types/clusters/temperature-control';
3
- import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
3
+ import { MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
4
4
  export function createLevelTemperatureControlClusterServer(endpoint, selectedTemperatureLevel = 1, supportedTemperatureLevels = ['Cold', 'Warm', 'Hot', '30°', '40°', '60°', '80°']) {
5
5
  endpoint.behaviors.require(MatterbridgeLevelTemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel), {
6
6
  selectedTemperatureLevel,
@@ -4,7 +4,7 @@ import { DeviceEnergyManagement } from '@matter/types/clusters/device-energy-man
4
4
  import { ModeBase } from '@matter/types/clusters/mode-base';
5
5
  import { WaterHeaterManagement } from '@matter/types/clusters/water-heater-management';
6
6
  import { WaterHeaterMode } from '@matter/types/clusters/water-heater-mode';
7
- import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
7
+ import { MatterbridgeServer } from '../matterbridgeBehaviorsServer.js';
8
8
  import { deviceEnergyManagement, electricalSensor, powerSource, waterHeater } from '../matterbridgeDeviceTypes.js';
9
9
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
10
10
  export class WaterHeater extends MatterbridgeEndpoint {
package/dist/export.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { addVirtualDevice } from './helpers.js';
2
2
  export * from './matterbridgeAccessoryPlatform.js';
3
- export * from './matterbridgeBehaviors.js';
3
+ export * from './matterbridgeBehaviorsServer.js';
4
4
  export * from './matterbridgeDeviceTypes.js';
5
5
  export * from './matterbridgeDynamicPlatform.js';
6
6
  export * from './matterbridgeEndpoint.js';
package/dist/export.js CHANGED
@@ -2,7 +2,7 @@ if (process.argv.includes('--loader') || process.argv.includes('-loader'))
2
2
  console.log('\u001B[32mIndex loaded.\u001B[40;0m');
3
3
  export { addVirtualDevice } from './helpers.js';
4
4
  export * from './matterbridgeAccessoryPlatform.js';
5
- export * from './matterbridgeBehaviors.js';
5
+ export * from './matterbridgeBehaviorsServer.js';
6
6
  export * from './matterbridgeDeviceTypes.js';
7
7
  export * from './matterbridgeDynamicPlatform.js';
8
8
  export * from './matterbridgeEndpoint.js';
@@ -93,6 +93,8 @@ export declare function deleteDevice(owner: ServerNode<ServerNode.RootEndpoint>
93
93
  export declare function getMoveToLevelRequest(level: number, transitionTime: number, executeIfOff: boolean): LevelControl.MoveToLevelRequest;
94
94
  export declare function getMoveToColorTemperatureRequest(colorTemperatureMireds: number, transitionTime: number, executeIfOff: boolean): ColorControl.MoveToColorTemperatureRequest;
95
95
  export declare function getMoveToHueRequest(hue: number, transitionTime: number, executeIfOff: boolean): ColorControl.MoveToHueRequest;
96
+ export declare function getEnhancedMoveToHueRequest(enhancedHue: number, transitionTime: number, executeIfOff: boolean): ColorControl.EnhancedMoveToHueRequest;
96
97
  export declare function getMoveToSaturationRequest(saturation: number, transitionTime: number, executeIfOff: boolean): ColorControl.MoveToSaturationRequest;
97
98
  export declare function getMoveToHueAndSaturationRequest(hue: number, saturation: number, transitionTime: number, executeIfOff: boolean): ColorControl.MoveToHueAndSaturationRequest;
99
+ export declare function getEnhancedMoveToHueAndSaturationRequest(enhancedHue: number, saturation: number, transitionTime: number, executeIfOff: boolean): ColorControl.EnhancedMoveToHueAndSaturationRequest;
98
100
  export declare function getMoveToColorRequest(colorX: number, colorY: number, transitionTime: number, executeIfOff: boolean): ColorControl.MoveToColorRequest;
@@ -579,6 +579,7 @@ export async function addDevice(owner, device, pause = 10) {
579
579
  process.stderr.write(`${er}Error adding device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}${rs}\nStack: ${errorInspect}\n`);
580
580
  return false;
581
581
  }
582
+ await device.construction.ready;
582
583
  expect(owner.parts.has(device)).toBeTruthy();
583
584
  expect(owner.lifecycle.isPartsReady).toBeTruthy();
584
585
  expect(device.lifecycle.isReady).toBeTruthy();
@@ -642,6 +643,16 @@ export function getMoveToHueRequest(hue, transitionTime, executeIfOff) {
642
643
  };
643
644
  return request;
644
645
  }
646
+ export function getEnhancedMoveToHueRequest(enhancedHue, transitionTime, executeIfOff) {
647
+ const request = {
648
+ enhancedHue,
649
+ transitionTime,
650
+ direction: ColorControl.Direction.Shortest,
651
+ optionsMask: { executeIfOff },
652
+ optionsOverride: { executeIfOff },
653
+ };
654
+ return request;
655
+ }
645
656
  export function getMoveToSaturationRequest(saturation, transitionTime, executeIfOff) {
646
657
  const request = {
647
658
  saturation,
@@ -661,6 +672,16 @@ export function getMoveToHueAndSaturationRequest(hue, saturation, transitionTime
661
672
  };
662
673
  return request;
663
674
  }
675
+ export function getEnhancedMoveToHueAndSaturationRequest(enhancedHue, saturation, transitionTime, executeIfOff) {
676
+ const request = {
677
+ enhancedHue,
678
+ saturation,
679
+ transitionTime,
680
+ optionsMask: { executeIfOff },
681
+ optionsOverride: { executeIfOff },
682
+ };
683
+ return request;
684
+ }
664
685
  export function getMoveToColorRequest(colorX, colorY, transitionTime, executeIfOff) {
665
686
  const request = {
666
687
  colorX,
@@ -1183,7 +1183,7 @@ export class Matterbridge extends EventEmitter {
1183
1183
  catch {
1184
1184
  }
1185
1185
  }
1186
- if (hasParameter('reset-sessions')) {
1186
+ if (hasParameter('reset-sessions') || !hasParameter('no-reset-sessions')) {
1187
1187
  this.log.debug(`Cleaning matter storage context for ${GREEN}Matterbridge${db}...`);
1188
1188
  unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, 'Matterbridge', 'sessions.resumptionRecords'), this.log);
1189
1189
  unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, 'Matterbridge', 'root.subscriptions.subscriptions'), this.log);
@@ -1,6 +1,6 @@
1
1
  import { BindingBehavior } from '@matter/main/behaviors/binding';
2
2
  import { DescriptorServer } from '@matter/main/behaviors/descriptor';
3
- import { MatterbridgeServer } from './matterbridgeBehaviors.js';
3
+ import { MatterbridgeServer } from './matterbridgeBehaviorsServer.js';
4
4
  export class MatterbridgeBindingServer extends BindingBehavior {
5
5
  async initialize() {
6
6
  const device = this.endpoint.stateOf(MatterbridgeServer);
@@ -1327,12 +1327,12 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
1327
1327
  }>, void, any>;
1328
1328
  readonly atomicRequest: import("@matter/types").Command<import("@matter/types").TypeFromFields<{
1329
1329
  requestType: import("@matter/types").FieldType<Thermostat.RequestType>;
1330
- attributeRequests: import("@matter/types").FieldType<import("@matter/types/datatype").AttributeId[]>;
1330
+ attributeRequests: import("@matter/types").FieldType<import("@matter/types").AttributeId[]>;
1331
1331
  timeout: import("@matter/types").OptionalFieldType<number>;
1332
1332
  }>, import("@matter/types").TypeFromFields<{
1333
1333
  statusCode: import("@matter/types").FieldType<import("@matter/types").Status>;
1334
1334
  attributeStatus: import("@matter/types").FieldType<import("@matter/types").TypeFromFields<{
1335
- attributeId: import("@matter/types").FieldType<import("@matter/types/datatype").AttributeId>;
1335
+ attributeId: import("@matter/types").FieldType<import("@matter/types").AttributeId>;
1336
1336
  statusCode: import("@matter/types").FieldType<import("@matter/types").Status>;
1337
1337
  }>[]>;
1338
1338
  timeout: import("@matter/types").OptionalFieldType<number>;
@@ -1615,6 +1615,7 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
1615
1615
  }];
1616
1616
  }>, readonly [Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode]>, typeof ThermostatServer, import("@matter/node/behaviors/thermostat").ThermostatInterface>;
1617
1617
  export declare class MatterbridgeThermostatServer extends MatterbridgeThermostatServer_base {
1618
+ initialize(): Promise<void>;
1618
1619
  setpointRaiseLower(request: Thermostat.SetpointRaiseLowerRequest): MaybePromise;
1619
1620
  }
1620
1621
  declare const MatterbridgePresetThermostatServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
@@ -1691,12 +1692,12 @@ declare const MatterbridgePresetThermostatServer_base: import("@matter/node").Cl
1691
1692
  }>, void, any>;
1692
1693
  readonly atomicRequest: import("@matter/types").Command<import("@matter/types").TypeFromFields<{
1693
1694
  requestType: import("@matter/types").FieldType<Thermostat.RequestType>;
1694
- attributeRequests: import("@matter/types").FieldType<import("@matter/types/datatype").AttributeId[]>;
1695
+ attributeRequests: import("@matter/types").FieldType<import("@matter/types").AttributeId[]>;
1695
1696
  timeout: import("@matter/types").OptionalFieldType<number>;
1696
1697
  }>, import("@matter/types").TypeFromFields<{
1697
1698
  statusCode: import("@matter/types").FieldType<import("@matter/types").Status>;
1698
1699
  attributeStatus: import("@matter/types").FieldType<import("@matter/types").TypeFromFields<{
1699
- attributeId: import("@matter/types").FieldType<import("@matter/types/datatype").AttributeId>;
1700
+ attributeId: import("@matter/types").FieldType<import("@matter/types").AttributeId>;
1700
1701
  statusCode: import("@matter/types").FieldType<import("@matter/types").Status>;
1701
1702
  }>[]>;
1702
1703
  timeout: import("@matter/types").OptionalFieldType<number>;
@@ -1,3 +1,4 @@
1
+ import { Bytes } from '@matter/general';
1
2
  import { Behavior } from '@matter/node';
2
3
  import { ActivatedCarbonFilterMonitoringServer } from '@matter/node/behaviors/activated-carbon-filter-monitoring';
3
4
  import { BooleanStateConfigurationServer } from '@matter/node/behaviors/boolean-state-configuration';
@@ -19,6 +20,7 @@ import { SwitchServer } from '@matter/node/behaviors/switch';
19
20
  import { ThermostatServer } from '@matter/node/behaviors/thermostat';
20
21
  import { ValveConfigurationAndControlServer } from '@matter/node/behaviors/valve-configuration-and-control';
21
22
  import { WindowCoveringServer } from '@matter/node/behaviors/window-covering';
23
+ import { StatusResponse } from '@matter/types';
22
24
  import { BooleanStateConfiguration } from '@matter/types/clusters/boolean-state-configuration';
23
25
  import { ColorControl } from '@matter/types/clusters/color-control';
24
26
  import { DeviceEnergyManagement } from '@matter/types/clusters/device-energy-management';
@@ -321,6 +323,17 @@ export class MatterbridgeFanControlServer extends FanControlServer.with(FanContr
321
323
  }
322
324
  }
323
325
  export class MatterbridgeThermostatServer extends ThermostatServer.with(Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode) {
326
+ async initialize() {
327
+ await super.initialize();
328
+ this.endpoint.construction.onSuccess(async () => {
329
+ const device = this.endpoint.stateOf(MatterbridgeServer);
330
+ device.log.debug(`Removing atomic commands (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
331
+ await this.endpoint.setStateOf(ThermostatServer, {
332
+ acceptedCommandList: [0],
333
+ generatedCommandList: [],
334
+ });
335
+ });
336
+ }
324
337
  setpointRaiseLower(request) {
325
338
  const device = this.endpoint.stateOf(MatterbridgeServer);
326
339
  device.log.info(`Setting setpoint by ${request.amount} in mode ${request.mode} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
@@ -369,6 +382,12 @@ export class MatterbridgePresetThermostatServer extends ThermostatServer.with(Th
369
382
  const device = this.endpoint.stateOf(MatterbridgeServer);
370
383
  device.log.info(`Setting preset to ${request.presetHandle} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
371
384
  device.commandHandler.executeHandler('setActivePresetRequest', { request, cluster: ThermostatServer.id, attributes: this.state, endpoint: this.endpoint });
385
+ if (request.presetHandle !== null) {
386
+ const preset = this.state.persistedPresets?.find((storedPreset) => storedPreset.presetHandle !== null && Bytes.areEqual(storedPreset.presetHandle, request.presetHandle));
387
+ if (preset === undefined)
388
+ throw new StatusResponse.InvalidCommandError('Requested PresetHandle not found');
389
+ }
390
+ this.state.activePresetHandle = request.presetHandle;
372
391
  device.log.debug(`MatterbridgePresetThermostatServer: setActivePresetRequest called with presetHandle: ${request.presetHandle}`);
373
392
  }
374
393
  }
@@ -62,15 +62,27 @@ export declare class MatterbridgeEndpoint extends Endpoint {
62
62
  setAttribute(clusterId: Behavior.Type | ClusterType | ClusterId | string, attribute: string, value: boolean | number | bigint | string | object | null, log?: AnsiLogger): Promise<boolean>;
63
63
  updateAttribute(cluster: Behavior.Type | ClusterType | ClusterId | string, attribute: string, value: boolean | number | bigint | string | object | null, log?: AnsiLogger): Promise<boolean>;
64
64
  subscribeAttribute(cluster: Behavior.Type | ClusterType | ClusterId | string, attribute: string, listener: (newValue: any, oldValue: any, context: ActionContext) => void, log?: AnsiLogger): Promise<boolean>;
65
- setCluster(cluster: Behavior.Type | ClusterType | ClusterId | string, value: Record<string, boolean | number | bigint | string | object | undefined | null>, log?: AnsiLogger): Promise<boolean>;
66
- getCluster(cluster: Behavior.Type | ClusterType | ClusterId | string, log?: AnsiLogger): Record<string, boolean | number | bigint | string | object | undefined | null> | undefined;
65
+ setCluster<T extends Behavior.Type>(cluster: T, value: Behavior.StateOf<T>, log?: AnsiLogger): Promise<boolean>;
66
+ setCluster<T extends ClusterType>(cluster: T, value: ClusterType.AttributeValues<T>, log?: AnsiLogger): Promise<boolean>;
67
+ setCluster(cluster: ClusterId | string, value: Record<string, boolean | number | bigint | string | object | undefined | null>, log?: AnsiLogger): Promise<boolean>;
68
+ getCluster<T extends Behavior.Type>(cluster: T, log?: AnsiLogger): Behavior.StateOf<T> | undefined;
69
+ getCluster<T extends ClusterType>(cluster: T, log?: AnsiLogger): ClusterType.AttributeValues<T> | undefined;
70
+ getCluster(cluster: ClusterId | string, log?: AnsiLogger): Record<string, boolean | number | bigint | string | object | undefined | null> | undefined;
67
71
  triggerEvent(cluster: Behavior.Type | ClusterType | ClusterId | string, event: string, payload: Record<string, boolean | number | bigint | string | object | undefined | null>, log?: AnsiLogger): Promise<boolean>;
68
72
  addClusterServers(serverList: ClusterId[]): this;
69
73
  addFixedLabel(label: string, value: string): Promise<this>;
70
74
  addUserLabel(label: string, value: string): Promise<this>;
71
75
  addCommandHandler(command: keyof MatterbridgeEndpointCommands, handler: CommandHandlerFunction): this;
72
76
  executeCommandHandler(command: keyof MatterbridgeEndpointCommands, request?: Record<string, boolean | number | bigint | string | object | null>, cluster?: string, attributes?: Record<string, boolean | number | bigint | string | object | null>, endpoint?: MatterbridgeEndpoint): Promise<void>;
73
- invokeBehaviorCommand(cluster: Behavior.Type | ClusterType | ClusterId | string, command: keyof MatterbridgeEndpointCommands, params?: Record<string, boolean | number | bigint | string | object | null>): Promise<void>;
77
+ invokeBehaviorCommand<T extends Behavior.Type, C extends keyof {
78
+ [K in keyof InstanceType<T> as InstanceType<T>[K] extends (...args: unknown[]) => unknown ? K : never]: InstanceType<T>[K];
79
+ }>(cluster: T, command: C, params?: {
80
+ [K in keyof InstanceType<T> as InstanceType<T>[K] extends (...args: unknown[]) => unknown ? K : never]: InstanceType<T>[K];
81
+ }[C] extends (...args: infer P) => unknown ? P[0] : never): Promise<void>;
82
+ invokeBehaviorCommand<T extends ClusterType, C extends keyof ClusterType.CommandsOf<T>>(cluster: T, command: C, params?: ClusterType.CommandsOf<T>[C] extends {
83
+ requestSchema: infer S extends import('@matter/types/tlv').TlvSchema<unknown>;
84
+ } ? import('@matter/types/tlv').TypeFromSchema<S> : never): Promise<void>;
85
+ invokeBehaviorCommand(cluster: ClusterId | string, command: keyof MatterbridgeEndpointCommands, params?: Record<string, boolean | number | bigint | string | object | null>): Promise<void>;
74
86
  addRequiredClusterServers(): MatterbridgeEndpoint;
75
87
  addOptionalClusterServers(): MatterbridgeEndpoint;
76
88
  getAllClusterServers(): Behavior.Type[];
@@ -62,7 +62,7 @@ import { VendorId } from '@matter/types/datatype';
62
62
  import { inspectError } from '@matterbridge/utils/error';
63
63
  import { isValidNumber, isValidObject, isValidString } from '@matterbridge/utils/validate';
64
64
  import { AnsiLogger, CYAN, db, debugStringify, hk, or, YELLOW, zb } from 'node-ansi-logger';
65
- import { MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeEnhancedColorControlServer, MatterbridgeFanControlServer, MatterbridgeHepaFilterMonitoringServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeLiftTiltWindowCoveringServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgePresetThermostatServer, MatterbridgeServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeSwitchServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, } from './matterbridgeBehaviors.js';
65
+ import { MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeEnhancedColorControlServer, MatterbridgeFanControlServer, MatterbridgeHepaFilterMonitoringServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeLiftTiltWindowCoveringServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgePresetThermostatServer, MatterbridgeServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeSwitchServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, } from './matterbridgeBehaviorsServer.js';
66
66
  import { addClusterServers, addFixedLabel, addOptionalClusterServers, addRequiredClusterServers, addUserLabel, checkNotLatinCharacters, createUniqueId, featuresFor, generateUniqueId, getApparentElectricalPowerMeasurementClusterServer, getAttribute, getAttributeId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getCluster, getClusterId, getDefaultDeviceEnergyManagementClusterServer, getDefaultDeviceEnergyManagementModeClusterServer, getDefaultElectricalEnergyMeasurementClusterServer, getDefaultElectricalPowerMeasurementClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultOccupancySensingClusterServer, getDefaultOperationalStateClusterServer, getDefaultPowerSourceBatteryClusterServer, getDefaultPowerSourceRechargeableBatteryClusterServer, getDefaultPowerSourceReplaceableBatteryClusterServer, getDefaultPowerSourceWiredClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, invokeBehaviorCommand, lowercaseFirstLetter, setAttribute, setCluster, subscribeAttribute, triggerEvent, updateAttribute, } from './matterbridgeEndpointHelpers.js';
67
67
  const MATTERBRIDGE_ENDPOINT_BRAND = Symbol('MatterbridgeEndpoint.brand');
68
68
  export function isMatterbridgeEndpoint(value) {
@@ -910,7 +910,7 @@ export class MatterbridgeEndpoint extends Endpoint {
910
910
  ...(occupied !== undefined ? { unoccupiedCoolingSetpoint: unoccupiedCoolingSetpoint !== undefined ? unoccupiedCoolingSetpoint * 100 : 2700 } : {}),
911
911
  ...(occupied !== undefined ? { occupancy: { occupied } } : {}),
912
912
  ...(occupied !== undefined ? { externallyMeasuredOccupancy: true } : {}),
913
- numberOfPresets: Array.isArray(presetsList) ? presetsList.length : 0,
913
+ numberOfPresets: Math.max(Array.isArray(presetsList) ? presetsList.length : 0, 10),
914
914
  activePresetHandle: activePresetHandle !== undefined ? Uint8Array.from([activePresetHandle]) : null,
915
915
  presets: (presetsList ?? []).map((p) => ({
916
916
  presetHandle: Uint8Array.from(p.presetHandle || [0]),
@@ -18,7 +18,7 @@ import { TemperatureMeasurement } from '@matter/types/clusters/temperature-measu
18
18
  import { ClusterId, VendorId } from '@matter/types/datatype';
19
19
  import { MeasurementType, Semtag } from '@matter/types/globals';
20
20
  import { AnsiLogger } from 'node-ansi-logger';
21
- import { MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer } from './matterbridgeBehaviors.js';
21
+ import { MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer } from './matterbridgeBehaviorsServer.js';
22
22
  import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
23
23
  import { MatterbridgeEndpointCommands } from './matterbridgeEndpointTypes.js';
24
24
  export declare function capitalizeFirstLetter(name: string): string;
@@ -83,7 +83,7 @@ import { deepCopy } from '@matterbridge/utils/deep-copy';
83
83
  import { deepEqual } from '@matterbridge/utils/deep-equal';
84
84
  import { isValidArray } from '@matterbridge/utils/validate';
85
85
  import { BLUE, CYAN, db, debugStringify, er, hk, or, YELLOW, zb } from 'node-ansi-logger';
86
- import { MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeFanControlServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, } from './matterbridgeBehaviors.js';
86
+ import { MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeFanControlServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, } from './matterbridgeBehaviorsServer.js';
87
87
  export function capitalizeFirstLetter(name) {
88
88
  if (!name)
89
89
  return name;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.6.1-dev-20260313-a699c0e",
3
+ "version": "3.6.1",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -121,11 +121,11 @@
121
121
  "CHANGELOG.md"
122
122
  ],
123
123
  "dependencies": {
124
- "@matter/main": "0.17.0-alpha.0-20260311-3dbb8a732",
125
- "@matterbridge/dgram": "3.6.1-dev-20260313-a699c0e",
126
- "@matterbridge/thread": "3.6.1-dev-20260313-a699c0e",
127
- "@matterbridge/types": "3.6.1-dev-20260313-a699c0e",
128
- "@matterbridge/utils": "3.6.1-dev-20260313-a699c0e",
124
+ "@matter/main": "0.16.10",
125
+ "@matterbridge/dgram": "3.6.1",
126
+ "@matterbridge/thread": "3.6.1",
127
+ "@matterbridge/types": "3.6.1",
128
+ "@matterbridge/utils": "3.6.1",
129
129
  "archiver": "7.0.1",
130
130
  "express": "5.2.1",
131
131
  "glob": "13.0.6",