@matterbridge/core 3.10.7-dev-20260823-6142c00 → 3.10.7-dev-20260825-7ebac36

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.
@@ -15,6 +15,7 @@ export * from './onOffServer.js';
15
15
  export * from './occupancySensingServer.js';
16
16
  export * from './operationalStateServer.js';
17
17
  export * from './powerSourceServer.js';
18
+ export * from './pumpConfigurationAndControlServer.js';
18
19
  export * from './serviceAreaServer.js';
19
20
  export * from './smokeCoAlarmServer.js';
20
21
  export * from './switchServer.js';
@@ -15,6 +15,7 @@ export * from './onOffServer.js';
15
15
  export * from './occupancySensingServer.js';
16
16
  export * from './operationalStateServer.js';
17
17
  export * from './powerSourceServer.js';
18
+ export * from './pumpConfigurationAndControlServer.js';
18
19
  export * from './serviceAreaServer.js';
19
20
  export * from './smokeCoAlarmServer.js';
20
21
  export * from './switchServer.js';
@@ -0,0 +1,23 @@
1
+ import type { MaybePromise } from '@matter/general';
2
+ import { PumpConfigurationAndControlServer } from '@matter/node/behaviors/pump-configuration-and-control';
3
+ import { PumpConfigurationAndControl } from '@matter/types/clusters/pump-configuration-and-control';
4
+ declare const MatterbridgePumpConfigurationAndControlServer_base: import("@matter/node").ClusterBehavior.Type<typeof PumpConfigurationAndControlServer, import("@matter/types").ClusterType.WithSupportedFeatures<PumpConfigurationAndControl, {
5
+ automatic: false;
6
+ compensatedPressure: false;
7
+ constantFlow: false;
8
+ constantPressure: false;
9
+ constantSpeed: true;
10
+ constantTemperature: false;
11
+ localOperation: false;
12
+ }>, import("@matter/types").ClusterType.Concrete, new () => {}, "pumpConfigurationAndControl">;
13
+ export declare class MatterbridgePumpConfigurationAndControlServer extends MatterbridgePumpConfigurationAndControlServer_base {
14
+ #private;
15
+ protected internal: MatterbridgePumpConfigurationAndControlServer.Internal;
16
+ initialize(): MaybePromise;
17
+ }
18
+ export declare namespace MatterbridgePumpConfigurationAndControlServer {
19
+ class Internal {
20
+ lastLevel?: number;
21
+ }
22
+ }
23
+ export {};
@@ -0,0 +1,100 @@
1
+ import { LevelControlServer } from '@matter/node/behaviors/level-control';
2
+ import { OnOffServer } from '@matter/node/behaviors/on-off';
3
+ import { PumpConfigurationAndControlServer } from '@matter/node/behaviors/pump-configuration-and-control';
4
+ import { Status, StatusResponseError } from '@matter/types';
5
+ import { PumpConfigurationAndControl } from '@matter/types/clusters/pump-configuration-and-control';
6
+ import { MatterbridgeServer } from './matterbridgeServer.js';
7
+ export class MatterbridgePumpConfigurationAndControlServer extends PumpConfigurationAndControlServer.with(PumpConfigurationAndControl.Feature.ConstantSpeed) {
8
+ initialize() {
9
+ this.state.minConstSpeed ??= 600;
10
+ this.state.maxConstSpeed ??= 3000;
11
+ this.state.maxPressure ??= 6000;
12
+ this.state.maxSpeed ??= 3000;
13
+ this.state.maxFlow ??= 100;
14
+ const device = this.endpoint.stateOf(MatterbridgeServer);
15
+ device.log.info(`MatterbridgePumpConfigurationAndControlServer: initialized with minConstSpeed=${this.state.minConstSpeed}, maxConstSpeed=${this.state.maxConstSpeed}, maxPressure=${this.state.maxPressure}, maxSpeed=${this.state.maxSpeed}, maxFlow=${this.state.maxFlow} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
16
+ if (this.endpoint.behaviors.has(OnOffServer.id)) {
17
+ this.reactTo(this.agent.get(OnOffServer).events.onOff$Changed, this.#handleOnOffChanged);
18
+ }
19
+ if (this.endpoint.behaviors.has(LevelControlServer.id)) {
20
+ const levelControlState = this.agent.get(LevelControlServer).state;
21
+ this.internal.lastLevel = levelControlState.currentLevel ?? levelControlState.maxLevel;
22
+ this.reactTo(this.agent.get(LevelControlServer).events.currentLevel$Changed, this.#handleCurrentLevelChanged);
23
+ }
24
+ this.reactTo(this.events.operationMode$Changing, this.#handleOperationModeChanging);
25
+ this.reactTo(this.events.operationMode$Changed, this.#handleOperationModeChanged);
26
+ }
27
+ #percentFromLevel(currentLevel) {
28
+ if (currentLevel <= 0)
29
+ return 0;
30
+ return currentLevel <= 200 ? currentLevel / 2 : 100;
31
+ }
32
+ #speedFromPercent(percent) {
33
+ const maxConstSpeed = this.state.maxConstSpeed ?? this.state.maxSpeed ?? 0;
34
+ return Math.round((percent / 100) * maxConstSpeed);
35
+ }
36
+ #capacityFromPercent(percent) {
37
+ return Math.round(percent * 200);
38
+ }
39
+ #currentSetpoint(normalLevel) {
40
+ const maxConstSpeed = this.state.maxConstSpeed ?? this.state.maxSpeed ?? 0;
41
+ if (this.state.operationMode === PumpConfigurationAndControl.OperationMode.Minimum) {
42
+ const speed = this.state.minConstSpeed ?? 0;
43
+ return { speed, percent: maxConstSpeed > 0 ? (speed / maxConstSpeed) * 100 : 0 };
44
+ }
45
+ if (this.state.operationMode === PumpConfigurationAndControl.OperationMode.Maximum) {
46
+ return { speed: maxConstSpeed, percent: 100 };
47
+ }
48
+ const percent = this.#percentFromLevel(normalLevel);
49
+ return { speed: this.#speedFromPercent(percent), percent };
50
+ }
51
+ #applySetpoint(normalLevel) {
52
+ const { speed, percent } = this.#currentSetpoint(normalLevel);
53
+ const capacity = this.#capacityFromPercent(percent);
54
+ this.agent.asLocalActor(() => {
55
+ this.state.speed = speed;
56
+ this.state.capacity = capacity;
57
+ });
58
+ return { speed, capacity };
59
+ }
60
+ #stopPump() {
61
+ this.agent.asLocalActor(() => {
62
+ this.state.speed = 0;
63
+ this.state.capacity = 0;
64
+ });
65
+ return { speed: 0, capacity: 0 };
66
+ }
67
+ #handleOperationModeChanging() {
68
+ if (this.state.pumpStatus?.localOverride) {
69
+ throw new StatusResponseError('OperationMode cannot be changed while PumpStatus.LocalOverride is set', Status.Failure);
70
+ }
71
+ }
72
+ #handleOperationModeChanged(operationMode, oldOperationMode) {
73
+ const device = this.endpoint.stateOf(MatterbridgeServer);
74
+ device.log.info(`MatterbridgePumpConfigurationAndControlServer: operationMode changed to ${operationMode} from ${oldOperationMode} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
75
+ this.agent.asLocalActor(() => {
76
+ this.state.effectiveOperationMode = operationMode;
77
+ });
78
+ const { speed, capacity } = this.#applySetpoint(this.internal.lastLevel ?? 254);
79
+ device.log.info(`MatterbridgePumpConfigurationAndControlServer: pump speed changed to ${speed}, capacity changed to ${capacity} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
80
+ }
81
+ #handleOnOffChanged(onOff, oldOnOff) {
82
+ const device = this.endpoint.stateOf(MatterbridgeServer);
83
+ device.log.info(`MatterbridgePumpConfigurationAndControlServer: onOff changed to ${onOff} from ${oldOnOff} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
84
+ const { speed, capacity } = onOff ? this.#applySetpoint(this.internal.lastLevel ?? 254) : this.#stopPump();
85
+ device.log.info(`MatterbridgePumpConfigurationAndControlServer: pump speed changed to ${speed}, capacity changed to ${capacity} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
86
+ }
87
+ #handleCurrentLevelChanged(currentLevel, oldCurrentLevel) {
88
+ const device = this.endpoint.stateOf(MatterbridgeServer);
89
+ device.log.info(`MatterbridgePumpConfigurationAndControlServer: currentLevel changed to ${currentLevel} from ${oldCurrentLevel} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
90
+ this.internal.lastLevel = currentLevel ?? this.internal.lastLevel;
91
+ const { speed, capacity } = this.#applySetpoint(currentLevel ?? 0);
92
+ device.log.info(`MatterbridgePumpConfigurationAndControlServer: pump speed changed to ${speed}, capacity changed to ${capacity} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
93
+ }
94
+ }
95
+ (function (MatterbridgePumpConfigurationAndControlServer) {
96
+ class Internal {
97
+ lastLevel;
98
+ }
99
+ MatterbridgePumpConfigurationAndControlServer.Internal = Internal;
100
+ })(MatterbridgePumpConfigurationAndControlServer || (MatterbridgePumpConfigurationAndControlServer = {}));
@@ -1,14 +1,24 @@
1
- import { ClosureTag, ClosureWindowTag, CommonNumberTag } from '@matter/node';
1
+ import { ClosureTag, ClosureWindowTag, CommonNumberTag, CommonPositionTag, RefrigeratorTag } from '@matter/node';
2
2
  import { AirQuality } from '@matter/types/clusters/air-quality';
3
3
  import { FanControl } from '@matter/types/clusters/fan-control';
4
4
  import { PowerSource } from '@matter/types/clusters/power-source';
5
5
  import { EndpointNumber } from '@matter/types/datatype';
6
+ import { AirConditioner } from './devices/airConditioner.js';
6
7
  import { BasicVideoPlayer } from './devices/basicVideoPlayer.js';
7
8
  import { CastingVideoClient } from './devices/castingVideoClient.js';
8
9
  import { CastingVideoPlayer } from './devices/castingVideoPlayer.js';
9
10
  import { Closure } from './devices/closure.js';
10
11
  import { ContentApp } from './devices/contentApp.js';
12
+ import { Cooktop } from './devices/cooktop.js';
13
+ import { Dishwasher } from './devices/dishwasher.js';
14
+ import { ExtractorHood } from './devices/extractorHood.js';
11
15
  import { IrrigationSystem } from './devices/irrigationSystem.js';
16
+ import { LaundryDryer } from './devices/laundryDryer.js';
17
+ import { LaundryWasher } from './devices/laundryWasher.js';
18
+ import { MicrowaveOven } from './devices/microwaveOven.js';
19
+ import { Oven } from './devices/oven.js';
20
+ import { Refrigerator } from './devices/refrigerator.js';
21
+ import { RoboticVacuumCleaner } from './devices/roboticVacuumCleaner.js';
12
22
  import { Speaker } from './devices/speaker.js';
13
23
  import { VideoRemoteControl } from './devices/videoRemoteControl.js';
14
24
  import { getSupportedDeviceType } from './matterbridgeDeviceTypes.js';
@@ -101,7 +111,8 @@ export async function createDemoDevices(matterbridge) {
101
111
  await registerDevice(ep, 'Mounted Dimmable Load Control', 'ACTUATOR-05-04');
102
112
  ep = new MatterbridgeEndpoint([getSupportedDeviceType('Pump'), bridgedNode, powerSource], { id: 'Pump', number: EndpointNumber(5_05) });
103
113
  ep.createDefaultPowerSourceWiredClusterServer();
104
- ep.createOnOffClusterServer();
114
+ ep.createOnOffClusterServer(false);
115
+ ep.createLevelControlClusterServer(0);
105
116
  await registerDevice(ep, 'Pump', 'ACTUATOR-05-05');
106
117
  ep = new MatterbridgeEndpoint([getSupportedDeviceType('WaterValve'), bridgedNode, powerSource], { id: 'WaterValve', number: EndpointNumber(5_06) });
107
118
  ep.createDefaultPowerSourceWiredClusterServer();
@@ -338,4 +349,124 @@ export async function createDemoDevices(matterbridge) {
338
349
  tagList: [getSemtag(CommonNumberTag.Four)],
339
350
  }).addRequiredClusters();
340
351
  await registerDevice(ep, 'Aggregator', 'GENERIC-11-02');
352
+ ep = new RoboticVacuumCleaner('Robotic Vacuum Cleaner', 'ROBOTIC-12-01', {
353
+ id: 'RoboticVacuumCleaner',
354
+ number: EndpointNumber(12_01),
355
+ tagList: [getSemtag(CommonNumberTag.One)],
356
+ });
357
+ await registerDevice(ep, 'Robotic Vacuum Cleaner', 'ROBOTIC-12-01');
358
+ ep = new LaundryWasher('Laundry Washer', 'APPLIANCE-13-01', {
359
+ id: 'LaundryWasher',
360
+ number: EndpointNumber(13_01),
361
+ tagList: [getSemtag(CommonNumberTag.One)],
362
+ });
363
+ await registerDevice(ep, 'Laundry Washer', 'APPLIANCE-13-01');
364
+ const refrigeratorDevice = new Refrigerator('Refrigerator', 'APPLIANCE-13-02', {
365
+ id: 'Refrigerator',
366
+ number: EndpointNumber(13_02),
367
+ tagList: [getSemtag(CommonNumberTag.One)],
368
+ });
369
+ refrigeratorDevice
370
+ .addCabinet('Refrigerator Cabinet Top', {
371
+ id: 'RefrigeratorCabinetTop',
372
+ number: EndpointNumber(13_02_1),
373
+ tagList: [getSemtag(CommonPositionTag.Top), getSemtag(RefrigeratorTag.Refrigerator)],
374
+ })
375
+ .addRequiredClusters();
376
+ refrigeratorDevice
377
+ .addCabinet('Freezer Cabinet Bottom', {
378
+ id: 'FreezerCabinetBottom',
379
+ number: EndpointNumber(13_02_2),
380
+ tagList: [getSemtag(CommonPositionTag.Bottom), getSemtag(RefrigeratorTag.Freezer)],
381
+ targetTemperature: -20 * 100,
382
+ minTemperature: -30 * 100,
383
+ maxTemperature: 10 * 100,
384
+ step: 10 * 100,
385
+ })
386
+ .addRequiredClusters();
387
+ await registerDevice(refrigeratorDevice, 'Refrigerator', 'APPLIANCE-13-02');
388
+ ep = new AirConditioner('Air Conditioner', 'APPLIANCE-13-03', {
389
+ id: 'AirConditioner',
390
+ number: EndpointNumber(13_03),
391
+ tagList: [getSemtag(CommonNumberTag.One)],
392
+ });
393
+ await registerDevice(ep, 'Air Conditioner', 'APPLIANCE-13-03');
394
+ ep = new Dishwasher('Dishwasher', 'APPLIANCE-13-05', {
395
+ id: 'Dishwasher',
396
+ number: EndpointNumber(13_05),
397
+ tagList: [getSemtag(CommonNumberTag.One)],
398
+ });
399
+ await registerDevice(ep, 'Dishwasher', 'APPLIANCE-13-05');
400
+ ep = new LaundryDryer('Laundry Dryer', 'APPLIANCE-13-06', {
401
+ id: 'LaundryDryer',
402
+ number: EndpointNumber(13_06),
403
+ tagList: [getSemtag(CommonNumberTag.One)],
404
+ });
405
+ await registerDevice(ep, 'Laundry Dryer', 'APPLIANCE-13-06');
406
+ const cooktopDevice = new Cooktop('Cooktop', 'APPLIANCE-13-08', {
407
+ id: 'Cooktop',
408
+ number: EndpointNumber(13_08),
409
+ tagList: [getSemtag(CommonNumberTag.One)],
410
+ });
411
+ cooktopDevice
412
+ .addSurface('Cook Surface Top Left', {
413
+ id: 'CookSurfaceTopLeft',
414
+ number: EndpointNumber(13_08_1),
415
+ tagList: [getSemtag(CommonPositionTag.Top), getSemtag(CommonPositionTag.Left)],
416
+ })
417
+ .addRequiredClusters();
418
+ cooktopDevice
419
+ .addSurface('Cook Surface Top Right', {
420
+ id: 'CookSurfaceTopRight',
421
+ number: EndpointNumber(13_08_2),
422
+ tagList: [getSemtag(CommonPositionTag.Top), getSemtag(CommonPositionTag.Right)],
423
+ })
424
+ .addRequiredClusters();
425
+ cooktopDevice
426
+ .addSurface('Cook Surface Bottom Left', {
427
+ id: 'CookSurfaceBottomLeft',
428
+ number: EndpointNumber(13_08_3),
429
+ tagList: [getSemtag(CommonPositionTag.Bottom), getSemtag(CommonPositionTag.Left)],
430
+ })
431
+ .addRequiredClusters();
432
+ cooktopDevice
433
+ .addSurface('Cook Surface Bottom Right', {
434
+ id: 'CookSurfaceBottomRight',
435
+ number: EndpointNumber(13_08_4),
436
+ tagList: [getSemtag(CommonPositionTag.Bottom), getSemtag(CommonPositionTag.Right)],
437
+ })
438
+ .addRequiredClusters();
439
+ await registerDevice(cooktopDevice, 'Cooktop', 'APPLIANCE-13-08');
440
+ const ovenDevice = new Oven('Oven', 'APPLIANCE-13-09', {
441
+ id: 'Oven',
442
+ number: EndpointNumber(13_09),
443
+ tagList: [getSemtag(CommonNumberTag.One)],
444
+ });
445
+ ovenDevice
446
+ .addCabinet('Oven Cabinet Top', {
447
+ id: 'OvenCabinetTop',
448
+ number: EndpointNumber(13_09_1),
449
+ tagList: [getSemtag(CommonPositionTag.Top)],
450
+ })
451
+ .addRequiredClusters();
452
+ ovenDevice
453
+ .addCabinet('Oven Cabinet Bottom', {
454
+ id: 'OvenCabinetBottom',
455
+ number: EndpointNumber(13_09_2),
456
+ tagList: [getSemtag(CommonPositionTag.Bottom)],
457
+ })
458
+ .addRequiredClusters();
459
+ await registerDevice(ovenDevice, 'Oven', 'APPLIANCE-13-09');
460
+ ep = new ExtractorHood('Extractor Hood', 'APPLIANCE-13-10', {
461
+ id: 'ExtractorHood',
462
+ number: EndpointNumber(13_10),
463
+ tagList: [getSemtag(CommonNumberTag.One)],
464
+ });
465
+ await registerDevice(ep, 'Extractor Hood', 'APPLIANCE-13-10');
466
+ ep = new MicrowaveOven('Microwave Oven', 'APPLIANCE-13-11', {
467
+ id: 'MicrowaveOven',
468
+ number: EndpointNumber(13_11),
469
+ tagList: [getSemtag(CommonNumberTag.One)],
470
+ });
471
+ await registerDevice(ep, 'Microwave Oven', 'APPLIANCE-13-11');
341
472
  }
@@ -1,7 +1,13 @@
1
+ import type { EndpointNumber } from '@matter/types';
1
2
  import { FanControl } from '@matter/types/clusters/fan-control';
2
3
  import { ThermostatUserInterfaceConfiguration } from '@matter/types/clusters/thermostat-user-interface-configuration';
4
+ import type { Semtag } from '@matter/types/globals';
3
5
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
4
6
  export interface AirConditionerOptions {
7
+ mode?: 'server' | 'matter';
8
+ id?: string;
9
+ number?: EndpointNumber;
10
+ tagList?: Semtag[];
5
11
  localTemperature?: number;
6
12
  occupiedHeatingSetpoint?: number;
7
13
  occupiedCoolingSetpoint?: number;
@@ -5,7 +5,12 @@ import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
5
5
  export class AirConditioner extends MatterbridgeEndpoint {
6
6
  constructor(name, serial, options = {}) {
7
7
  const { localTemperature = 23, occupiedHeatingSetpoint = 21, occupiedCoolingSetpoint = 25, minSetpointDeadBand = 1, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 49, minCoolSetpointLimit = 1, maxCoolSetpointLimit = 50, temperatureDisplayMode = ThermostatUserInterfaceConfiguration.TemperatureDisplayMode.Celsius, keypadLockout = ThermostatUserInterfaceConfiguration.KeypadLockout.NoLockout, scheduleProgrammingVisibility = ThermostatUserInterfaceConfiguration.ScheduleProgrammingVisibility.ScheduleProgrammingPermitted, fanMode = FanControl.FanMode.Off, fanModeSequence = FanControl.FanModeSequence.OffLowMedHighAuto, percentSetting = 0, percentCurrent = 0, } = options;
8
- super([roomAirConditioner, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` });
8
+ super([roomAirConditioner, powerSource], {
9
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
10
+ number: options.number,
11
+ tagList: options.tagList,
12
+ mode: options.mode,
13
+ });
9
14
  this.createDefaultIdentifyClusterServer();
10
15
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Air Conditioner');
11
16
  this.createDefaultPowerSourceWiredClusterServer();
@@ -1,6 +1,20 @@
1
- import type { Semtag } from '@matter/types';
1
+ import type { EndpointNumber, Semtag } from '@matter/types';
2
2
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
3
+ export interface CooktopOptions {
4
+ mode?: 'server' | 'matter';
5
+ id?: string;
6
+ number?: EndpointNumber;
7
+ tagList?: Semtag[];
8
+ }
9
+ export interface CookSurfaceOptions {
10
+ id?: string;
11
+ number?: EndpointNumber;
12
+ tagList: Semtag[];
13
+ selectedTemperatureLevel?: number;
14
+ supportedTemperatureLevels?: string[];
15
+ }
3
16
  export declare class Cooktop extends MatterbridgeEndpoint {
4
- constructor(name: string, serial: string);
17
+ constructor(name: string, serial: string, options?: CooktopOptions);
18
+ addSurface(name: string, options: CookSurfaceOptions): MatterbridgeEndpoint;
5
19
  addSurface(name: string, tagList: Semtag[], selectedTemperatureLevel?: number, supportedTemperatureLevels?: string[]): MatterbridgeEndpoint;
6
20
  }
@@ -3,18 +3,24 @@ import { cookSurface, cooktop, powerSource } from '../matterbridgeDeviceTypes.js
3
3
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
4
4
  import { createLevelTemperatureControlClusterServer } from './temperatureControl.js';
5
5
  export class Cooktop extends MatterbridgeEndpoint {
6
- constructor(name, serial) {
7
- super([cooktop, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` });
6
+ constructor(name, serial, options = {}) {
7
+ super([cooktop, powerSource], {
8
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
9
+ number: options.number,
10
+ tagList: options.tagList,
11
+ mode: options.mode,
12
+ });
8
13
  this.createDefaultIdentifyClusterServer();
9
14
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Cooktop');
10
15
  this.createDefaultPowerSourceWiredClusterServer();
11
16
  this.createOffOnlyOnOffClusterServer(true);
12
17
  fireAndForget(this.addFixedLabel('composed', 'Cooktop'), this.log, 'Error adding composed label to cooktop');
13
18
  }
14
- addSurface(name, tagList, selectedTemperatureLevel = 2, supportedTemperatureLevels = ['Level 1', 'Level 2', 'Level 3', 'Level 4', 'Level 5']) {
15
- const surface = this.addChildDeviceType(name, cookSurface, { tagList });
19
+ addSurface(name, optionsOrTagList, selectedTemperatureLevel, supportedTemperatureLevels) {
20
+ const options = Array.isArray(optionsOrTagList) ? { tagList: optionsOrTagList, selectedTemperatureLevel, supportedTemperatureLevels } : optionsOrTagList;
21
+ const surface = this.addChildDeviceType(options.id ?? name, cookSurface, { number: options.number, tagList: options.tagList });
16
22
  surface.log.logName = name;
17
- createLevelTemperatureControlClusterServer(surface, selectedTemperatureLevel, supportedTemperatureLevels);
23
+ createLevelTemperatureControlClusterServer(surface, options.selectedTemperatureLevel ?? 2, options.supportedTemperatureLevels ?? ['Level 1', 'Level 2', 'Level 3', 'Level 4', 'Level 5']);
18
24
  surface.createDefaultTemperatureMeasurementClusterServer(2000);
19
25
  surface.createOffOnlyOnOffClusterServer(true);
20
26
  return surface;
@@ -1,9 +1,27 @@
1
1
  import { DishwasherModeServer } from '@matter/node/behaviors/dishwasher-mode';
2
+ import type { EndpointNumber } from '@matter/types';
2
3
  import { DishwasherMode } from '@matter/types/clusters/dishwasher-mode';
3
4
  import { ModeBase } from '@matter/types/clusters/mode-base';
4
5
  import type { OperationalState } from '@matter/types/clusters/operational-state';
6
+ import type { Semtag } from '@matter/types/globals';
5
7
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
8
+ export interface DishwasherOptions {
9
+ mode?: 'server' | 'matter';
10
+ id?: string;
11
+ number?: EndpointNumber;
12
+ tagList?: Semtag[];
13
+ currentMode?: number;
14
+ supportedModes?: DishwasherMode.ModeOption[];
15
+ selectedTemperatureLevel?: number;
16
+ supportedTemperatureLevels?: string[];
17
+ temperatureSetpoint?: number;
18
+ minTemperature?: number;
19
+ maxTemperature?: number;
20
+ step?: number;
21
+ operationalState?: OperationalState.OperationalStateEnum;
22
+ }
6
23
  export declare class Dishwasher extends MatterbridgeEndpoint {
24
+ constructor(name: string, serial: string, options?: DishwasherOptions);
7
25
  constructor(name: string, serial: string, currentMode?: number, supportedModes?: DishwasherMode.ModeOption[], selectedTemperatureLevel?: number, supportedTemperatureLevels?: string[], temperatureSetpoint?: number, minTemperature?: number, maxTemperature?: number, step?: number, operationalState?: OperationalState.OperationalStateEnum);
8
26
  createDefaultDishwasherModeClusterServer(currentMode?: number, supportedModes?: DishwasherMode.ModeOption[]): this;
9
27
  createDefaultDishwasherAlarmClusterServer(): this;
@@ -9,19 +9,37 @@ import { dishwasher, powerSource } from '../matterbridgeDeviceTypes.js';
9
9
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
10
10
  import { createLevelTemperatureControlClusterServer, createNumberTemperatureControlClusterServer } from './temperatureControl.js';
11
11
  export class Dishwasher extends MatterbridgeEndpoint {
12
- constructor(name, serial, currentMode, supportedModes, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
13
- super([dishwasher, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` });
12
+ constructor(name, serial, optionsOrCurrentMode, supportedModes, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
13
+ const options = typeof optionsOrCurrentMode === 'object'
14
+ ? optionsOrCurrentMode
15
+ : {
16
+ currentMode: optionsOrCurrentMode,
17
+ supportedModes,
18
+ selectedTemperatureLevel,
19
+ supportedTemperatureLevels,
20
+ temperatureSetpoint,
21
+ minTemperature,
22
+ maxTemperature,
23
+ step,
24
+ operationalState,
25
+ };
26
+ super([dishwasher, powerSource], {
27
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
28
+ number: options.number,
29
+ tagList: options.tagList,
30
+ mode: options.mode,
31
+ });
14
32
  this.createDefaultIdentifyClusterServer();
15
33
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Dishwasher');
16
34
  this.createDefaultPowerSourceWiredClusterServer();
17
35
  this.createDeadFrontOnOffClusterServer(true);
18
- this.createDefaultDishwasherModeClusterServer(currentMode, supportedModes);
36
+ this.createDefaultDishwasherModeClusterServer(options.currentMode, options.supportedModes);
19
37
  this.createDefaultDishwasherAlarmClusterServer();
20
- if (temperatureSetpoint)
21
- createNumberTemperatureControlClusterServer(this, temperatureSetpoint, minTemperature, maxTemperature, step);
38
+ if (options.temperatureSetpoint)
39
+ createNumberTemperatureControlClusterServer(this, options.temperatureSetpoint, options.minTemperature, options.maxTemperature, options.step);
22
40
  else
23
- createLevelTemperatureControlClusterServer(this, selectedTemperatureLevel, supportedTemperatureLevels);
24
- this.createDefaultOperationalStateClusterServer(operationalState);
41
+ createLevelTemperatureControlClusterServer(this, options.selectedTemperatureLevel, options.supportedTemperatureLevels);
42
+ this.createDefaultOperationalStateClusterServer(options.operationalState);
25
43
  }
26
44
  createDefaultDishwasherModeClusterServer(currentMode = 2, supportedModes = [
27
45
  { label: 'Light', mode: 1, modeTags: [{ value: DishwasherMode.ModeTag.Light }] },
@@ -1,5 +1,24 @@
1
+ import type { EndpointNumber } from '@matter/types';
1
2
  import { ResourceMonitoring } from '@matter/types/clusters/resource-monitoring';
3
+ import type { Semtag } from '@matter/types/globals';
2
4
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
5
+ export interface ExtractorHoodOptions {
6
+ mode?: 'server' | 'matter';
7
+ id?: string;
8
+ number?: EndpointNumber;
9
+ tagList?: Semtag[];
10
+ hepaCondition?: number;
11
+ hepaChangeIndication?: ResourceMonitoring.ChangeIndication;
12
+ hepaInPlaceIndicator?: boolean;
13
+ hepaLastChangedTime?: number | null;
14
+ hepaReplacementProductList?: ResourceMonitoring.ReplacementProduct[];
15
+ activatedCarbonCondition?: number;
16
+ activatedCarbonChangeIndication?: ResourceMonitoring.ChangeIndication;
17
+ activatedCarbonInPlaceIndicator?: boolean;
18
+ activatedCarbonLastChangedTime?: number | null;
19
+ activatedCarbonReplacementProductList?: ResourceMonitoring.ReplacementProduct[];
20
+ }
3
21
  export declare class ExtractorHood extends MatterbridgeEndpoint {
4
- constructor(name: string, serial: string, hepaCondition?: number, hepaChangeIndication?: ResourceMonitoring.ChangeIndication, hepaInPlaceIndicator?: boolean | undefined, hepaLastChangedTime?: number | null | undefined, hepaReplacementProductList?: ResourceMonitoring.ReplacementProduct[], activatedCarbonCondition?: number, activatedCarbonChangeIndication?: ResourceMonitoring.ChangeIndication, activatedCarbonInPlaceIndicator?: boolean | undefined, activatedCarbonLastChangedTime?: number | null | undefined, activatedCarbonReplacementProductList?: ResourceMonitoring.ReplacementProduct[]);
22
+ constructor(name: string, serial: string, options?: ExtractorHoodOptions);
23
+ constructor(name: string, serial: string, hepaCondition?: number, hepaChangeIndication?: ResourceMonitoring.ChangeIndication, hepaInPlaceIndicator?: boolean, hepaLastChangedTime?: number | null, hepaReplacementProductList?: ResourceMonitoring.ReplacementProduct[], activatedCarbonCondition?: number, activatedCarbonChangeIndication?: ResourceMonitoring.ChangeIndication, activatedCarbonInPlaceIndicator?: boolean, activatedCarbonLastChangedTime?: number | null, activatedCarbonReplacementProductList?: ResourceMonitoring.ReplacementProduct[]);
5
24
  }
@@ -3,14 +3,33 @@ import { fireAndForget } from '@matterbridge/utils/wait';
3
3
  import { extractorHood, powerSource } from '../matterbridgeDeviceTypes.js';
4
4
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
5
5
  export class ExtractorHood extends MatterbridgeEndpoint {
6
- constructor(name, serial, hepaCondition = 100, hepaChangeIndication = ResourceMonitoring.ChangeIndication.Ok, hepaInPlaceIndicator = true, hepaLastChangedTime = null, hepaReplacementProductList = [], activatedCarbonCondition = 100, activatedCarbonChangeIndication = ResourceMonitoring.ChangeIndication.Ok, activatedCarbonInPlaceIndicator = true, activatedCarbonLastChangedTime = null, activatedCarbonReplacementProductList = []) {
7
- super([extractorHood, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` });
6
+ constructor(name, serial, optionsOrHepaCondition, hepaChangeIndication, hepaInPlaceIndicator, hepaLastChangedTime, hepaReplacementProductList, activatedCarbonCondition, activatedCarbonChangeIndication, activatedCarbonInPlaceIndicator, activatedCarbonLastChangedTime, activatedCarbonReplacementProductList) {
7
+ const options = typeof optionsOrHepaCondition === 'object'
8
+ ? optionsOrHepaCondition
9
+ : {
10
+ hepaCondition: optionsOrHepaCondition,
11
+ hepaChangeIndication,
12
+ hepaInPlaceIndicator,
13
+ hepaLastChangedTime,
14
+ hepaReplacementProductList,
15
+ activatedCarbonCondition,
16
+ activatedCarbonChangeIndication,
17
+ activatedCarbonInPlaceIndicator,
18
+ activatedCarbonLastChangedTime,
19
+ activatedCarbonReplacementProductList,
20
+ };
21
+ super([extractorHood, powerSource], {
22
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
23
+ number: options.number,
24
+ tagList: options.tagList,
25
+ mode: options.mode,
26
+ });
8
27
  this.createDefaultIdentifyClusterServer();
9
28
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Extractor Hood');
10
29
  this.createDefaultPowerSourceWiredClusterServer();
11
30
  this.createBaseFanControlClusterServer();
12
- this.createDefaultHepaFilterMonitoringClusterServer(hepaCondition, hepaChangeIndication, hepaInPlaceIndicator, hepaLastChangedTime, hepaReplacementProductList);
13
- this.createDefaultActivatedCarbonFilterMonitoringClusterServer(activatedCarbonCondition, activatedCarbonChangeIndication, activatedCarbonInPlaceIndicator, activatedCarbonLastChangedTime, activatedCarbonReplacementProductList);
31
+ this.createDefaultHepaFilterMonitoringClusterServer(options.hepaCondition ?? 100, options.hepaChangeIndication ?? ResourceMonitoring.ChangeIndication.Ok, options.hepaInPlaceIndicator ?? true, options.hepaLastChangedTime ?? null, options.hepaReplacementProductList ?? []);
32
+ this.createDefaultActivatedCarbonFilterMonitoringClusterServer(options.activatedCarbonCondition ?? 100, options.activatedCarbonChangeIndication ?? ResourceMonitoring.ChangeIndication.Ok, options.activatedCarbonInPlaceIndicator ?? true, options.activatedCarbonLastChangedTime ?? null, options.activatedCarbonReplacementProductList ?? []);
14
33
  this.subscribeAttribute('fanControl', 'fanMode', (newValue, oldValue, context) => {
15
34
  if (context.fabric === undefined)
16
35
  return;
@@ -1,8 +1,26 @@
1
+ import type { EndpointNumber } from '@matter/types';
1
2
  import { LaundryDryerControls } from '@matter/types/clusters/laundry-dryer-controls';
2
3
  import { LaundryWasherMode } from '@matter/types/clusters/laundry-washer-mode';
3
4
  import type { OperationalState } from '@matter/types/clusters/operational-state';
5
+ import type { Semtag } from '@matter/types/globals';
4
6
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
7
+ export interface LaundryDryerOptions {
8
+ mode?: 'server' | 'matter';
9
+ id?: string;
10
+ number?: EndpointNumber;
11
+ tagList?: Semtag[];
12
+ currentMode?: number;
13
+ supportedModes?: LaundryWasherMode.ModeOption[];
14
+ selectedTemperatureLevel?: number;
15
+ supportedTemperatureLevels?: string[];
16
+ temperatureSetpoint?: number;
17
+ minTemperature?: number;
18
+ maxTemperature?: number;
19
+ step?: number;
20
+ operationalState?: OperationalState.OperationalStateEnum;
21
+ }
5
22
  export declare class LaundryDryer extends MatterbridgeEndpoint {
23
+ constructor(name: string, serial: string, options?: LaundryDryerOptions);
6
24
  constructor(name: string, serial: string, currentMode?: number, supportedModes?: LaundryWasherMode.ModeOption[], selectedTemperatureLevel?: number, supportedTemperatureLevels?: string[], temperatureSetpoint?: number, minTemperature?: number, maxTemperature?: number, step?: number, operationalState?: OperationalState.OperationalStateEnum);
7
25
  createDefaultLaundryWasherModeClusterServer(currentMode?: number, supportedModes?: LaundryWasherMode.ModeOption[]): this;
8
26
  createDefaultLaundryDryerControlsClusterServer(selectedDrynessLevel?: LaundryDryerControls.DrynessLevel, supportedDrynessLevels?: LaundryDryerControls.DrynessLevel[]): this;
@@ -6,19 +6,37 @@ import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
6
6
  import { MatterbridgeLaundryWasherModeServer } from './laundryWasher.js';
7
7
  import { createLevelTemperatureControlClusterServer, createNumberTemperatureControlClusterServer } from './temperatureControl.js';
8
8
  export class LaundryDryer extends MatterbridgeEndpoint {
9
- constructor(name, serial, currentMode, supportedModes, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
10
- super([laundryDryer, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` });
9
+ constructor(name, serial, optionsOrCurrentMode, supportedModes, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
10
+ const options = typeof optionsOrCurrentMode === 'object'
11
+ ? optionsOrCurrentMode
12
+ : {
13
+ currentMode: optionsOrCurrentMode,
14
+ supportedModes,
15
+ selectedTemperatureLevel,
16
+ supportedTemperatureLevels,
17
+ temperatureSetpoint,
18
+ minTemperature,
19
+ maxTemperature,
20
+ step,
21
+ operationalState,
22
+ };
23
+ super([laundryDryer, powerSource], {
24
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
25
+ number: options.number,
26
+ tagList: options.tagList,
27
+ mode: options.mode,
28
+ });
11
29
  this.createDefaultIdentifyClusterServer();
12
30
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Laundry Dryer');
13
31
  this.createDefaultPowerSourceWiredClusterServer();
14
32
  this.createDeadFrontOnOffClusterServer(true);
15
- this.createDefaultLaundryWasherModeClusterServer(currentMode, supportedModes);
33
+ this.createDefaultLaundryWasherModeClusterServer(options.currentMode, options.supportedModes);
16
34
  this.createDefaultLaundryDryerControlsClusterServer(1);
17
- if (temperatureSetpoint)
18
- createNumberTemperatureControlClusterServer(this, temperatureSetpoint, minTemperature, maxTemperature, step);
35
+ if (options.temperatureSetpoint)
36
+ createNumberTemperatureControlClusterServer(this, options.temperatureSetpoint, options.minTemperature, options.maxTemperature, options.step);
19
37
  else
20
- createLevelTemperatureControlClusterServer(this, selectedTemperatureLevel, supportedTemperatureLevels);
21
- this.createDefaultOperationalStateClusterServer(operationalState);
38
+ createLevelTemperatureControlClusterServer(this, options.selectedTemperatureLevel, options.supportedTemperatureLevels);
39
+ this.createDefaultOperationalStateClusterServer(options.operationalState);
22
40
  }
23
41
  createDefaultLaundryWasherModeClusterServer(currentMode = 2, supportedModes = [
24
42
  { label: 'Delicate', mode: 1, modeTags: [{ value: LaundryWasherMode.ModeTag.Delicate }] },
@@ -1,10 +1,32 @@
1
1
  import { LaundryWasherModeServer } from '@matter/node/behaviors/laundry-washer-mode';
2
+ import type { EndpointNumber } from '@matter/types';
2
3
  import { LaundryWasherControls } from '@matter/types/clusters/laundry-washer-controls';
3
4
  import { LaundryWasherMode } from '@matter/types/clusters/laundry-washer-mode';
4
5
  import { ModeBase } from '@matter/types/clusters/mode-base';
5
6
  import type { OperationalState } from '@matter/types/clusters/operational-state';
7
+ import type { Semtag } from '@matter/types/globals';
6
8
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
9
+ export interface LaundryWasherOptions {
10
+ mode?: 'server' | 'matter';
11
+ id?: string;
12
+ number?: EndpointNumber;
13
+ tagList?: Semtag[];
14
+ currentMode?: number;
15
+ supportedModes?: LaundryWasherMode.ModeOption[];
16
+ spinSpeedCurrent?: number;
17
+ spinSpeeds?: string[];
18
+ numberOfRinses?: LaundryWasherControls.NumberOfRinses;
19
+ supportedRinses?: LaundryWasherControls.NumberOfRinses[];
20
+ selectedTemperatureLevel?: number;
21
+ supportedTemperatureLevels?: string[];
22
+ temperatureSetpoint?: number;
23
+ minTemperature?: number;
24
+ maxTemperature?: number;
25
+ step?: number;
26
+ operationalState?: OperationalState.OperationalStateEnum;
27
+ }
7
28
  export declare class LaundryWasher extends MatterbridgeEndpoint {
29
+ constructor(name: string, serial: string, options?: LaundryWasherOptions);
8
30
  constructor(name: string, serial: string, currentMode?: number, supportedModes?: LaundryWasherMode.ModeOption[], spinSpeedCurrent?: number, spinSpeeds?: string[], numberOfRinses?: LaundryWasherControls.NumberOfRinses, supportedRinses?: LaundryWasherControls.NumberOfRinses[], selectedTemperatureLevel?: number, supportedTemperatureLevels?: string[], temperatureSetpoint?: number, minTemperature?: number, maxTemperature?: number, step?: number, operationalState?: OperationalState.OperationalStateEnum);
9
31
  createDefaultLaundryWasherModeClusterServer(currentMode?: number, supportedModes?: LaundryWasherMode.ModeOption[]): this;
10
32
  createDefaultLaundryWasherControlsClusterServer(spinSpeedCurrent?: number, spinSpeeds?: string[], numberOfRinses?: LaundryWasherControls.NumberOfRinses, supportedRinses?: LaundryWasherControls.NumberOfRinses[]): this;
@@ -10,19 +10,41 @@ import { laundryWasher, powerSource } from '../matterbridgeDeviceTypes.js';
10
10
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
11
11
  import { createLevelTemperatureControlClusterServer, createNumberTemperatureControlClusterServer } from './temperatureControl.js';
12
12
  export class LaundryWasher extends MatterbridgeEndpoint {
13
- constructor(name, serial, currentMode, supportedModes, spinSpeedCurrent, spinSpeeds, numberOfRinses, supportedRinses, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
14
- super([laundryWasher, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` });
13
+ constructor(name, serial, optionsOrCurrentMode, supportedModes, spinSpeedCurrent, spinSpeeds, numberOfRinses, supportedRinses, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
14
+ const options = typeof optionsOrCurrentMode === 'object'
15
+ ? optionsOrCurrentMode
16
+ : {
17
+ currentMode: optionsOrCurrentMode,
18
+ supportedModes,
19
+ spinSpeedCurrent,
20
+ spinSpeeds,
21
+ numberOfRinses,
22
+ supportedRinses,
23
+ selectedTemperatureLevel,
24
+ supportedTemperatureLevels,
25
+ temperatureSetpoint,
26
+ minTemperature,
27
+ maxTemperature,
28
+ step,
29
+ operationalState,
30
+ };
31
+ super([laundryWasher, powerSource], {
32
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
33
+ number: options.number,
34
+ tagList: options.tagList,
35
+ mode: options.mode,
36
+ });
15
37
  this.createDefaultIdentifyClusterServer();
16
38
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Laundry Washer');
17
39
  this.createDefaultPowerSourceWiredClusterServer();
18
40
  this.createDeadFrontOnOffClusterServer(true);
19
- this.createDefaultLaundryWasherModeClusterServer(currentMode, supportedModes);
20
- this.createDefaultLaundryWasherControlsClusterServer(spinSpeedCurrent, spinSpeeds, numberOfRinses, supportedRinses);
21
- if (temperatureSetpoint)
22
- createNumberTemperatureControlClusterServer(this, temperatureSetpoint, minTemperature, maxTemperature, step);
41
+ this.createDefaultLaundryWasherModeClusterServer(options.currentMode, options.supportedModes);
42
+ this.createDefaultLaundryWasherControlsClusterServer(options.spinSpeedCurrent, options.spinSpeeds, options.numberOfRinses, options.supportedRinses);
43
+ if (options.temperatureSetpoint)
44
+ createNumberTemperatureControlClusterServer(this, options.temperatureSetpoint, options.minTemperature, options.maxTemperature, options.step);
23
45
  else
24
- createLevelTemperatureControlClusterServer(this, selectedTemperatureLevel, supportedTemperatureLevels);
25
- this.createDefaultOperationalStateClusterServer(operationalState);
46
+ createLevelTemperatureControlClusterServer(this, options.selectedTemperatureLevel, options.supportedTemperatureLevels);
47
+ this.createDefaultOperationalStateClusterServer(options.operationalState);
26
48
  }
27
49
  createDefaultLaundryWasherModeClusterServer(currentMode = 2, supportedModes = [
28
50
  { label: 'Delicate', mode: 1, modeTags: [{ value: LaundryWasherMode.ModeTag.Delicate }] },
@@ -1,8 +1,25 @@
1
1
  import { MicrowaveOvenControlServer } from '@matter/node/behaviors/microwave-oven-control';
2
+ import type { EndpointNumber } from '@matter/types';
2
3
  import { MicrowaveOvenControl } from '@matter/types/clusters/microwave-oven-control';
3
4
  import { MicrowaveOvenMode } from '@matter/types/clusters/microwave-oven-mode';
5
+ import type { Semtag } from '@matter/types/globals';
4
6
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
7
+ export interface MicrowaveOvenOptions {
8
+ mode?: 'server' | 'matter';
9
+ id?: string;
10
+ number?: EndpointNumber;
11
+ tagList?: Semtag[];
12
+ currentMode?: number;
13
+ supportedModes?: MicrowaveOvenMode.ModeOption[];
14
+ powerSetting?: number;
15
+ minPower?: number;
16
+ maxPower?: number;
17
+ powerStep?: number;
18
+ cookTime?: number;
19
+ maxCookTime?: number;
20
+ }
5
21
  export declare class MicrowaveOven extends MatterbridgeEndpoint {
22
+ constructor(name: string, serial: string, options?: MicrowaveOvenOptions);
6
23
  constructor(name: string, serial: string, currentMode?: number, supportedModes?: MicrowaveOvenMode.ModeOption[], powerSetting?: number, minPower?: number, maxPower?: number, powerStep?: number, cookTime?: number, maxCookTime?: number);
7
24
  createDefaultMicrowaveOvenModeClusterServer(currentMode: number, supportedModes: MicrowaveOvenMode.ModeOption[]): this;
8
25
  createDefaultMicrowaveOvenControlClusterServer(powerSetting: number, minPower: number, maxPower: number, powerStep: number, cookTime: number, maxCookTime: number): this;
@@ -8,22 +8,31 @@ import { MatterbridgeOperationalStateServer } from '../behaviors/operationalStat
8
8
  import { microwaveOven, powerSource } from '../matterbridgeDeviceTypes.js';
9
9
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
10
10
  export class MicrowaveOven extends MatterbridgeEndpoint {
11
- constructor(name, serial, currentMode = 1, supportedModes = [
12
- { label: 'Auto', mode: 1, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Auto }] },
13
- { label: 'Quick', mode: 2, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Quick }] },
14
- { label: 'Quiet', mode: 3, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Quiet }] },
15
- { label: 'Min', mode: 4, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Min }] },
16
- { label: 'Max', mode: 5, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Max }] },
17
- { label: 'Normal', mode: 6, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Normal }] },
18
- { label: 'Defrost', mode: 7, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Defrost }] },
19
- ], powerSetting = 100, minPower = 10, maxPower = 100, powerStep = 10, cookTime = 60, maxCookTime = 3600) {
20
- super([microwaveOven, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` });
11
+ constructor(name, serial, optionsOrCurrentMode, supportedModes, powerSetting, minPower, maxPower, powerStep, cookTime, maxCookTime) {
12
+ const options = typeof optionsOrCurrentMode === 'object'
13
+ ? optionsOrCurrentMode
14
+ : { currentMode: optionsOrCurrentMode, supportedModes, powerSetting, minPower, maxPower, powerStep, cookTime, maxCookTime };
15
+ const configuredSupportedModes = options.supportedModes ?? [
16
+ { label: 'Auto', mode: 1, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Auto }] },
17
+ { label: 'Quick', mode: 2, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Quick }] },
18
+ { label: 'Quiet', mode: 3, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Quiet }] },
19
+ { label: 'Min', mode: 4, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Min }] },
20
+ { label: 'Max', mode: 5, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Max }] },
21
+ { label: 'Normal', mode: 6, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Normal }] },
22
+ { label: 'Defrost', mode: 7, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Defrost }] },
23
+ ];
24
+ super([microwaveOven, powerSource], {
25
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
26
+ number: options.number,
27
+ tagList: options.tagList,
28
+ mode: options.mode,
29
+ });
21
30
  this.createDefaultIdentifyClusterServer();
22
31
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Microwave Oven');
23
32
  this.createDefaultPowerSourceWiredClusterServer();
24
33
  this.createDefaultOperationalStateClusterServer(OperationalState.OperationalStateEnum.Stopped);
25
- this.createDefaultMicrowaveOvenModeClusterServer(currentMode, supportedModes);
26
- this.createDefaultMicrowaveOvenControlClusterServer(powerSetting, minPower, maxPower, powerStep, cookTime, maxCookTime);
34
+ this.createDefaultMicrowaveOvenModeClusterServer(options.currentMode ?? 1, configuredSupportedModes);
35
+ this.createDefaultMicrowaveOvenControlClusterServer(options.powerSetting ?? 100, options.minPower ?? 10, options.maxPower ?? 100, options.powerStep ?? 10, options.cookTime ?? 60, options.maxCookTime ?? 3600);
27
36
  }
28
37
  createDefaultMicrowaveOvenModeClusterServer(currentMode, supportedModes) {
29
38
  this.behaviors.require(MicrowaveOvenModeServer, {
@@ -1,13 +1,35 @@
1
1
  import type { MaybePromise } from '@matter/general';
2
2
  import { OvenCavityOperationalStateServer } from '@matter/node/behaviors/oven-cavity-operational-state';
3
3
  import { OvenModeServer } from '@matter/node/behaviors/oven-mode';
4
- import type { Semtag } from '@matter/types';
4
+ import type { EndpointNumber, Semtag } from '@matter/types';
5
5
  import { ModeBase } from '@matter/types/clusters/mode-base';
6
6
  import { OperationalState } from '@matter/types/clusters/operational-state';
7
7
  import { OvenMode } from '@matter/types/clusters/oven-mode';
8
8
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
9
+ export interface OvenOptions {
10
+ mode?: 'server' | 'matter';
11
+ id?: string;
12
+ number?: EndpointNumber;
13
+ tagList?: Semtag[];
14
+ }
15
+ export interface OvenCabinetOptions {
16
+ id?: string;
17
+ number?: EndpointNumber;
18
+ tagList: Semtag[];
19
+ currentMode?: number;
20
+ supportedModes?: OvenMode.ModeOption[];
21
+ targetTemperature?: number;
22
+ minTemperature?: number;
23
+ maxTemperature?: number;
24
+ step?: number;
25
+ currentTemperature?: number;
26
+ operationalState?: OperationalState.OperationalStateEnum;
27
+ currentPhase?: number;
28
+ phaseList?: string[];
29
+ }
9
30
  export declare class Oven extends MatterbridgeEndpoint {
10
- constructor(name: string, serial: string);
31
+ constructor(name: string, serial: string, options?: OvenOptions);
32
+ addCabinet(name: string, options: OvenCabinetOptions): MatterbridgeEndpoint;
11
33
  addCabinet(name: string, tagList: Semtag[], currentMode?: number, supportedModes?: OvenMode.ModeOption[], targetTemperature?: number, minTemperature?: number, maxTemperature?: number, step?: number, currentTemperature?: number, operationalState?: OperationalState.OperationalStateEnum, currentPhase?: number, phaseList?: string[]): MatterbridgeEndpoint;
12
34
  createDefaultOvenModeClusterServer(endpoint: MatterbridgeEndpoint, currentMode: number, supportedModes: OvenMode.ModeOption[]): MatterbridgeEndpoint;
13
35
  createDefaultOvenCavityOperationalStateClusterServer(endpoint: MatterbridgeEndpoint, operationalState?: OperationalState.OperationalStateEnum, currentPhase?: number, phaseList?: string[]): MatterbridgeEndpoint;
@@ -9,31 +9,52 @@ import { oven, powerSource, temperatureControlledCabinetHeater } from '../matter
9
9
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
10
10
  import { createNumberTemperatureControlClusterServer } from './temperatureControl.js';
11
11
  export class Oven extends MatterbridgeEndpoint {
12
- constructor(name, serial) {
13
- super([oven, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` });
12
+ constructor(name, serial, options = {}) {
13
+ super([oven, powerSource], {
14
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
15
+ number: options.number,
16
+ tagList: options.tagList,
17
+ mode: options.mode,
18
+ });
14
19
  this.createDefaultIdentifyClusterServer();
15
20
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Oven');
16
21
  this.createDefaultPowerSourceWiredClusterServer();
17
22
  fireAndForget(this.addFixedLabel('composed', 'Oven'), this.log, 'Oven addFixedLabel');
18
23
  }
19
- addCabinet(name, tagList, currentMode = 2, supportedModes = [
20
- { label: 'Bake', mode: 1, modeTags: [{ value: OvenMode.ModeTag.Bake }] },
21
- { label: 'Convection', mode: 2, modeTags: [{ value: OvenMode.ModeTag.Convection }] },
22
- { label: 'Grill', mode: 3, modeTags: [{ value: OvenMode.ModeTag.Grill }] },
23
- { label: 'Roast', mode: 4, modeTags: [{ value: OvenMode.ModeTag.Roast }] },
24
- { label: 'Clean', mode: 5, modeTags: [{ value: OvenMode.ModeTag.Clean }] },
25
- { label: 'Convection Bake', mode: 6, modeTags: [{ value: OvenMode.ModeTag.ConvectionBake }] },
26
- { label: 'Convection Roast', mode: 7, modeTags: [{ value: OvenMode.ModeTag.ConvectionRoast }] },
27
- { label: 'Warming', mode: 8, modeTags: [{ value: OvenMode.ModeTag.Warming }] },
28
- { label: 'Proofing', mode: 9, modeTags: [{ value: OvenMode.ModeTag.Proofing }] },
29
- { label: 'Steam', mode: 10, modeTags: [{ value: OvenMode.ModeTag.Steam }] },
30
- ], targetTemperature = 180 * 100, minTemperature = 30 * 100, maxTemperature = 300 * 100, step = 10 * 100, currentTemperature = 20 * 100, operationalState = OperationalState.OperationalStateEnum.Stopped, currentPhase, phaseList) {
31
- const cabinet = this.addChildDeviceType(name, temperatureControlledCabinetHeater, { tagList });
24
+ addCabinet(name, optionsOrTagList, currentMode, supportedModes, targetTemperature, minTemperature, maxTemperature, step, currentTemperature, operationalState, currentPhase, phaseList) {
25
+ const options = Array.isArray(optionsOrTagList)
26
+ ? {
27
+ tagList: optionsOrTagList,
28
+ currentMode,
29
+ supportedModes,
30
+ targetTemperature,
31
+ minTemperature,
32
+ maxTemperature,
33
+ step,
34
+ currentTemperature,
35
+ operationalState,
36
+ currentPhase,
37
+ phaseList,
38
+ }
39
+ : optionsOrTagList;
40
+ const configuredSupportedModes = options.supportedModes ?? [
41
+ { label: 'Bake', mode: 1, modeTags: [{ value: OvenMode.ModeTag.Bake }] },
42
+ { label: 'Convection', mode: 2, modeTags: [{ value: OvenMode.ModeTag.Convection }] },
43
+ { label: 'Grill', mode: 3, modeTags: [{ value: OvenMode.ModeTag.Grill }] },
44
+ { label: 'Roast', mode: 4, modeTags: [{ value: OvenMode.ModeTag.Roast }] },
45
+ { label: 'Clean', mode: 5, modeTags: [{ value: OvenMode.ModeTag.Clean }] },
46
+ { label: 'Convection Bake', mode: 6, modeTags: [{ value: OvenMode.ModeTag.ConvectionBake }] },
47
+ { label: 'Convection Roast', mode: 7, modeTags: [{ value: OvenMode.ModeTag.ConvectionRoast }] },
48
+ { label: 'Warming', mode: 8, modeTags: [{ value: OvenMode.ModeTag.Warming }] },
49
+ { label: 'Proofing', mode: 9, modeTags: [{ value: OvenMode.ModeTag.Proofing }] },
50
+ { label: 'Steam', mode: 10, modeTags: [{ value: OvenMode.ModeTag.Steam }] },
51
+ ];
52
+ const cabinet = this.addChildDeviceType(options.id ?? name, temperatureControlledCabinetHeater, { number: options.number, tagList: options.tagList });
32
53
  cabinet.log.logName = name;
33
- createNumberTemperatureControlClusterServer(cabinet, targetTemperature, minTemperature, maxTemperature, step);
34
- cabinet.createDefaultTemperatureMeasurementClusterServer(currentTemperature);
35
- this.createDefaultOvenModeClusterServer(cabinet, currentMode, supportedModes);
36
- this.createDefaultOvenCavityOperationalStateClusterServer(cabinet, operationalState, currentPhase, phaseList);
54
+ createNumberTemperatureControlClusterServer(cabinet, options.targetTemperature ?? 180 * 100, options.minTemperature ?? 30 * 100, options.maxTemperature ?? 300 * 100, options.step ?? 10 * 100);
55
+ cabinet.createDefaultTemperatureMeasurementClusterServer(options.currentTemperature ?? 20 * 100);
56
+ this.createDefaultOvenModeClusterServer(cabinet, options.currentMode ?? 2, configuredSupportedModes);
57
+ this.createDefaultOvenCavityOperationalStateClusterServer(cabinet, options.operationalState ?? OperationalState.OperationalStateEnum.Stopped, options.currentPhase, options.phaseList);
37
58
  return cabinet;
38
59
  }
39
60
  createDefaultOvenModeClusterServer(endpoint, currentMode, supportedModes) {
@@ -1,11 +1,31 @@
1
1
  import type { MaybePromise } from '@matter/general';
2
2
  import { RefrigeratorAndTemperatureControlledCabinetModeServer } from '@matter/node/behaviors/refrigerator-and-temperature-controlled-cabinet-mode';
3
- import type { Semtag } from '@matter/types';
3
+ import type { EndpointNumber, Semtag } from '@matter/types';
4
4
  import { ModeBase } from '@matter/types/clusters/mode-base';
5
5
  import { RefrigeratorAndTemperatureControlledCabinetMode } from '@matter/types/clusters/refrigerator-and-temperature-controlled-cabinet-mode';
6
6
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
7
+ export interface RefrigeratorOptions {
8
+ mode?: 'server' | 'matter';
9
+ id?: string;
10
+ number?: EndpointNumber;
11
+ tagList?: Semtag[];
12
+ currentMode?: number;
13
+ supportedModes?: RefrigeratorAndTemperatureControlledCabinetMode.ModeOption[];
14
+ }
15
+ export interface RefrigeratorCabinetOptions {
16
+ id?: string;
17
+ number?: EndpointNumber;
18
+ tagList: Semtag[];
19
+ targetTemperature?: number;
20
+ minTemperature?: number;
21
+ maxTemperature?: number;
22
+ step?: number;
23
+ currentTemperature?: number;
24
+ }
7
25
  export declare class Refrigerator extends MatterbridgeEndpoint {
26
+ constructor(name: string, serial: string, options?: RefrigeratorOptions);
8
27
  constructor(name: string, serial: string, currentMode?: number, supportedModes?: RefrigeratorAndTemperatureControlledCabinetMode.ModeOption[]);
28
+ addCabinet(name: string, options: RefrigeratorCabinetOptions): MatterbridgeEndpoint;
9
29
  addCabinet(name: string, tagList: Semtag[], targetTemperature?: number, minTemperature?: number, maxTemperature?: number, step?: number, currentTemperature?: number): MatterbridgeEndpoint;
10
30
  createDefaultRefrigeratorAndTemperatureControlledCabinetModeClusterServer(endpoint: MatterbridgeEndpoint, currentMode: number, supportedModes: RefrigeratorAndTemperatureControlledCabinetMode.ModeOption[]): MatterbridgeEndpoint;
11
31
  createDefaultRefrigeratorAlarmClusterServer(endpoint: MatterbridgeEndpoint, doorOpen?: boolean): MatterbridgeEndpoint;
@@ -8,24 +8,34 @@ import { powerSource, refrigerator, temperatureControlledCabinetCooler } from '.
8
8
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
9
9
  import { createNumberTemperatureControlClusterServer } from './temperatureControl.js';
10
10
  export class Refrigerator extends MatterbridgeEndpoint {
11
- constructor(name, serial, currentMode = 1, supportedModes = [
12
- { label: 'Auto', mode: 1, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.Auto }] },
13
- { label: 'RapidCool', mode: 2, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidCool }] },
14
- { label: 'RapidFreeze', mode: 3, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidFreeze }] },
15
- ]) {
16
- super([refrigerator, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` });
11
+ constructor(name, serial, optionsOrCurrentMode, supportedModes) {
12
+ const options = typeof optionsOrCurrentMode === 'object' ? optionsOrCurrentMode : { currentMode: optionsOrCurrentMode, supportedModes };
13
+ const configuredSupportedModes = options.supportedModes ?? [
14
+ { label: 'Auto', mode: 1, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.Auto }] },
15
+ { label: 'RapidCool', mode: 2, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidCool }] },
16
+ { label: 'RapidFreeze', mode: 3, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidFreeze }] },
17
+ ];
18
+ super([refrigerator, powerSource], {
19
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
20
+ number: options.number,
21
+ tagList: options.tagList,
22
+ mode: options.mode,
23
+ });
17
24
  this.createDefaultIdentifyClusterServer();
18
25
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Refrigerator');
19
26
  this.createDefaultPowerSourceWiredClusterServer();
20
27
  fireAndForget(this.addFixedLabel('composed', 'Refrigerator'), this.log, 'Error adding composed label to Refrigerator');
21
- this.createDefaultRefrigeratorAndTemperatureControlledCabinetModeClusterServer(this, currentMode, supportedModes);
28
+ this.createDefaultRefrigeratorAndTemperatureControlledCabinetModeClusterServer(this, options.currentMode ?? 1, configuredSupportedModes);
22
29
  this.createDefaultRefrigeratorAlarmClusterServer(this, false);
23
30
  }
24
- addCabinet(name, tagList, targetTemperature = 10 * 100, minTemperature = -30 * 100, maxTemperature = 20 * 100, step = 1 * 100, currentTemperature = 10 * 100) {
25
- const cabinet = this.addChildDeviceType(name, temperatureControlledCabinetCooler, { tagList });
31
+ addCabinet(name, optionsOrTagList, targetTemperature, minTemperature, maxTemperature, step, currentTemperature) {
32
+ const options = Array.isArray(optionsOrTagList)
33
+ ? { tagList: optionsOrTagList, targetTemperature, minTemperature, maxTemperature, step, currentTemperature }
34
+ : optionsOrTagList;
35
+ const cabinet = this.addChildDeviceType(options.id ?? name, temperatureControlledCabinetCooler, { number: options.number, tagList: options.tagList });
26
36
  cabinet.log.logName = name;
27
- createNumberTemperatureControlClusterServer(cabinet, targetTemperature, minTemperature, maxTemperature, step);
28
- cabinet.createDefaultTemperatureMeasurementClusterServer(currentTemperature);
37
+ createNumberTemperatureControlClusterServer(cabinet, options.targetTemperature ?? 10 * 100, options.minTemperature ?? -30 * 100, options.maxTemperature ?? 20 * 100, options.step ?? 1 * 100);
38
+ cabinet.createDefaultTemperatureMeasurementClusterServer(options.currentTemperature ?? 10 * 100);
29
39
  return cabinet;
30
40
  }
31
41
  createDefaultRefrigeratorAndTemperatureControlledCabinetModeClusterServer(endpoint, currentMode, supportedModes) {
@@ -1,14 +1,35 @@
1
1
  import { RvcCleanModeServer } from '@matter/node/behaviors/rvc-clean-mode';
2
2
  import { RvcOperationalStateServer } from '@matter/node/behaviors/rvc-operational-state';
3
3
  import { RvcRunModeServer } from '@matter/node/behaviors/rvc-run-mode';
4
+ import type { EndpointNumber } from '@matter/types';
4
5
  import { ModeBase } from '@matter/types/clusters/mode-base';
5
6
  import { OperationalState } from '@matter/types/clusters/operational-state';
6
7
  import { RvcCleanMode } from '@matter/types/clusters/rvc-clean-mode';
7
8
  import { RvcOperationalState } from '@matter/types/clusters/rvc-operational-state';
8
9
  import { RvcRunMode } from '@matter/types/clusters/rvc-run-mode';
9
10
  import { ServiceArea } from '@matter/types/clusters/service-area';
11
+ import type { Semtag } from '@matter/types/globals';
10
12
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
13
+ export interface RoboticVacuumCleanerOptions {
14
+ mode?: 'server' | 'matter';
15
+ id?: string;
16
+ number?: EndpointNumber;
17
+ tagList?: Semtag[];
18
+ currentRunMode?: number;
19
+ supportedRunModes?: RvcRunMode.ModeOption[];
20
+ currentCleanMode?: number;
21
+ supportedCleanModes?: RvcCleanMode.ModeOption[];
22
+ currentPhase?: number | null;
23
+ phaseList?: string[] | null;
24
+ operationalState?: RvcOperationalState.OperationalState;
25
+ operationalStateList?: RvcOperationalState.OperationalStateStruct[];
26
+ supportedAreas?: ServiceArea.Area[];
27
+ selectedAreas?: number[];
28
+ currentArea?: number | null;
29
+ supportedMaps?: ServiceArea.Map[];
30
+ }
11
31
  export declare class RoboticVacuumCleaner extends MatterbridgeEndpoint {
32
+ constructor(name: string, serial: string, options?: RoboticVacuumCleanerOptions);
12
33
  constructor(name: string, serial: string, mode?: 'server' | 'matter', currentRunMode?: number, supportedRunModes?: RvcRunMode.ModeOption[], currentCleanMode?: number, supportedCleanModes?: RvcCleanMode.ModeOption[], currentPhase?: number | null, phaseList?: string[] | null, operationalState?: RvcOperationalState.OperationalState, operationalStateList?: RvcOperationalState.OperationalStateStruct[], supportedAreas?: ServiceArea.Area[], selectedAreas?: number[], currentArea?: number | null, supportedMaps?: ServiceArea.Map[]);
13
34
  createDefaultRvcRunModeClusterServer(currentMode?: number, supportedModes?: RvcRunMode.ModeOption[]): this;
14
35
  createDefaultRvcCleanModeClusterServer(currentMode?: number, supportedModes?: RvcCleanMode.ModeOption[]): this;
@@ -14,15 +14,37 @@ import { MatterbridgeServiceAreaServer } from '../behaviors/serviceAreaServer.js
14
14
  import { powerSource, roboticVacuumCleaner } from '../matterbridgeDeviceTypes.js';
15
15
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
16
16
  export class RoboticVacuumCleaner extends MatterbridgeEndpoint {
17
- constructor(name, serial, mode, currentRunMode, supportedRunModes, currentCleanMode, supportedCleanModes, currentPhase = null, phaseList = null, operationalState, operationalStateList, supportedAreas, selectedAreas, currentArea, supportedMaps) {
18
- super([roboticVacuumCleaner, powerSource], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`, mode });
17
+ constructor(name, serial, modeOrOptions, currentRunMode, supportedRunModes, currentCleanMode, supportedCleanModes, currentPhase = null, phaseList = null, operationalState, operationalStateList, supportedAreas, selectedAreas, currentArea, supportedMaps) {
18
+ const options = typeof modeOrOptions === 'object'
19
+ ? modeOrOptions
20
+ : {
21
+ mode: modeOrOptions,
22
+ currentRunMode,
23
+ supportedRunModes,
24
+ currentCleanMode,
25
+ supportedCleanModes,
26
+ currentPhase,
27
+ phaseList,
28
+ operationalState,
29
+ operationalStateList,
30
+ supportedAreas,
31
+ selectedAreas,
32
+ currentArea,
33
+ supportedMaps,
34
+ };
35
+ super([roboticVacuumCleaner, powerSource], {
36
+ id: options.id ?? `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
37
+ number: options.number,
38
+ tagList: options.tagList,
39
+ mode: options.mode,
40
+ });
19
41
  this.createDefaultIdentifyClusterServer()
20
42
  .createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Robot Vacuum Cleaner')
21
43
  .createDefaultPowerSourceRechargeableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 5900)
22
- .createDefaultRvcRunModeClusterServer(currentRunMode, supportedRunModes)
23
- .createDefaultRvcCleanModeClusterServer(currentCleanMode, supportedCleanModes)
24
- .createDefaultRvcOperationalStateClusterServer(phaseList, currentPhase, operationalStateList, operationalState)
25
- .createDefaultServiceAreaClusterServer(supportedAreas, selectedAreas, currentArea, supportedMaps);
44
+ .createDefaultRvcRunModeClusterServer(options.currentRunMode, options.supportedRunModes)
45
+ .createDefaultRvcCleanModeClusterServer(options.currentCleanMode, options.supportedCleanModes)
46
+ .createDefaultRvcOperationalStateClusterServer(options.phaseList, options.currentPhase, options.operationalStateList, options.operationalState)
47
+ .createDefaultServiceAreaClusterServer(options.supportedAreas, options.selectedAreas, options.currentArea, options.supportedMaps);
26
48
  }
27
49
  createDefaultRvcRunModeClusterServer(currentMode, supportedModes) {
28
50
  this.behaviors.require(MatterbridgeRvcRunModeServer, {
@@ -207,7 +207,7 @@ export declare class MatterbridgeEndpoint extends Endpoint {
207
207
  createUserPinDoorLockClusterServer(lockState?: DoorLock.LockState, lockType?: DoorLock.LockType, autoRelockTime?: number, minPinCodeLength?: number, maxPinCodeLength?: number): this;
208
208
  createDefaultModeSelectClusterServer(description: string, supportedModes: ModeSelect.ModeOption[], currentMode?: number, startUpMode?: number): this;
209
209
  createDefaultValveConfigurationAndControlClusterServer(valveState?: ValveConfigurationAndControl.ValveState, valveLevel?: number, movementDuration?: number, autoClose?: boolean): this;
210
- createDefaultPumpConfigurationAndControlClusterServer(pumpMode?: PumpConfigurationAndControl.OperationMode): this;
210
+ createDefaultPumpConfigurationAndControlClusterServer(pumpMode?: PumpConfigurationAndControl.OperationMode, maxPressure?: number | null, maxSpeed?: number | null, maxFlow?: number | null, minConstSpeed?: number | null, maxConstSpeed?: number | null, speed?: number | null): this;
211
211
  createDefaultSmokeCOAlarmClusterServer(smokeState?: SmokeCoAlarm.AlarmState, coState?: SmokeCoAlarm.AlarmState): this;
212
212
  createSmokeOnlySmokeCOAlarmClusterServer(smokeState?: SmokeCoAlarm.AlarmState): this;
213
213
  createCoOnlySmokeCOAlarmClusterServer(coState?: SmokeCoAlarm.AlarmState): this;
@@ -20,7 +20,6 @@ import { Pm10ConcentrationMeasurementServer } from '@matter/node/behaviors/pm10-
20
20
  import { Pm25ConcentrationMeasurementServer } from '@matter/node/behaviors/pm25-concentration-measurement';
21
21
  import { PowerTopologyServer } from '@matter/node/behaviors/power-topology';
22
22
  import { PressureMeasurementServer } from '@matter/node/behaviors/pressure-measurement';
23
- import { PumpConfigurationAndControlServer } from '@matter/node/behaviors/pump-configuration-and-control';
24
23
  import { RadonConcentrationMeasurementServer } from '@matter/node/behaviors/radon-concentration-measurement';
25
24
  import { RelativeHumidityMeasurementServer } from '@matter/node/behaviors/relative-humidity-measurement';
26
25
  import { ScenesManagementServer } from '@matter/node/behaviors/scenes-management';
@@ -77,6 +76,7 @@ import { MatterbridgeOccupancySensingServer } from './behaviors/occupancySensing
77
76
  import { MatterbridgeOnOffServer } from './behaviors/onOffServer.js';
78
77
  import { MatterbridgeOperationalStateServer } from './behaviors/operationalStateServer.js';
79
78
  import { MatterbridgePowerSourceServer } from './behaviors/powerSourceServer.js';
79
+ import { MatterbridgePumpConfigurationAndControlServer } from './behaviors/pumpConfigurationAndControlServer.js';
80
80
  import { MatterbridgeSmokeCoAlarmServer } from './behaviors/smokeCoAlarmServer.js';
81
81
  import { MatterbridgeSwitchServer } from './behaviors/switchServer.js';
82
82
  import { MatterbridgeThermostatServer } from './behaviors/thermostatServer.js';
@@ -1303,17 +1303,20 @@ export class MatterbridgeEndpoint extends Endpoint {
1303
1303
  });
1304
1304
  return this;
1305
1305
  }
1306
- createDefaultPumpConfigurationAndControlClusterServer(pumpMode = PumpConfigurationAndControl.OperationMode.Normal) {
1307
- this.behaviors.require(PumpConfigurationAndControlServer.with(PumpConfigurationAndControl.Feature.ConstantSpeed), {
1308
- minConstSpeed: null,
1309
- maxConstSpeed: null,
1310
- maxPressure: null,
1311
- maxSpeed: null,
1312
- maxFlow: null,
1306
+ createDefaultPumpConfigurationAndControlClusterServer(pumpMode = PumpConfigurationAndControl.OperationMode.Normal, maxPressure = null, maxSpeed = null, maxFlow = null, minConstSpeed = null, maxConstSpeed = null, speed = null) {
1307
+ this.behaviors.require(MatterbridgePumpConfigurationAndControlServer.with(PumpConfigurationAndControl.Feature.ConstantSpeed), {
1308
+ minConstSpeed,
1309
+ maxConstSpeed,
1310
+ maxPressure,
1311
+ maxSpeed,
1312
+ maxFlow,
1313
+ speed,
1313
1314
  effectiveOperationMode: pumpMode,
1314
1315
  effectiveControlMode: PumpConfigurationAndControl.ControlMode.ConstantSpeed,
1315
1316
  capacity: null,
1317
+ pumpStatus: new PumpConfigurationAndControl.PumpStatus({ running: false }),
1316
1318
  operationMode: pumpMode,
1319
+ controlMode: PumpConfigurationAndControl.ControlMode.ConstantSpeed,
1317
1320
  });
1318
1321
  return this;
1319
1322
  }
@@ -37,7 +37,7 @@ import { Pm25ConcentrationMeasurementServer } from '@matter/node/behaviors/pm25-
37
37
  import { PowerSourceServer } from '@matter/node/behaviors/power-source';
38
38
  import { PowerTopologyServer } from '@matter/node/behaviors/power-topology';
39
39
  import { PressureMeasurementClient, PressureMeasurementServer } from '@matter/node/behaviors/pressure-measurement';
40
- import { PumpConfigurationAndControlClient, PumpConfigurationAndControlServer } from '@matter/node/behaviors/pump-configuration-and-control';
40
+ import { PumpConfigurationAndControlClient } from '@matter/node/behaviors/pump-configuration-and-control';
41
41
  import { RadonConcentrationMeasurementServer } from '@matter/node/behaviors/radon-concentration-measurement';
42
42
  import { RelativeHumidityMeasurementClient, RelativeHumidityMeasurementServer } from '@matter/node/behaviors/relative-humidity-measurement';
43
43
  import { ScenesManagementClient, ScenesManagementServer } from '@matter/node/behaviors/scenes-management';
@@ -125,6 +125,7 @@ import { MatterbridgeOccupancySensingServer } from './behaviors/occupancySensing
125
125
  import { MatterbridgeOnOffServer } from './behaviors/onOffServer.js';
126
126
  import { MatterbridgeOperationalStateServer } from './behaviors/operationalStateServer.js';
127
127
  import { MatterbridgePowerSourceServer } from './behaviors/powerSourceServer.js';
128
+ import { MatterbridgePumpConfigurationAndControlServer } from './behaviors/pumpConfigurationAndControlServer.js';
128
129
  import { MatterbridgeSmokeCoAlarmServer } from './behaviors/smokeCoAlarmServer.js';
129
130
  import { MatterbridgeThermostatServer } from './behaviors/thermostatServer.js';
130
131
  import { MatterbridgeValveConfigurationAndControlServer } from './behaviors/valveConfigurationAndControlServer.js';
@@ -293,7 +294,7 @@ export function getBehaviourTypeFromClusterServerId(clusterId) {
293
294
  if (clusterId === ValveConfigurationAndControl.id)
294
295
  return MatterbridgeValveConfigurationAndControlServer.with('Level');
295
296
  if (clusterId === PumpConfigurationAndControl.id)
296
- return PumpConfigurationAndControlServer.with('ConstantSpeed');
297
+ return MatterbridgePumpConfigurationAndControlServer.with('ConstantSpeed');
297
298
  if (clusterId === SmokeCoAlarm.id)
298
299
  return MatterbridgeSmokeCoAlarmServer.with('SmokeAlarm', 'CoAlarm');
299
300
  if (clusterId === Switch.id)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.10.7-dev-20260823-6142c00",
3
+ "version": "3.10.7-dev-20260825-7ebac36",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -132,10 +132,10 @@
132
132
  },
133
133
  "dependencies": {
134
134
  "@matter/main": "0.17.9",
135
- "@matterbridge/dgram": "3.10.7-dev-20260823-6142c00",
136
- "@matterbridge/thread": "3.10.7-dev-20260823-6142c00",
137
- "@matterbridge/types": "3.10.7-dev-20260823-6142c00",
138
- "@matterbridge/utils": "3.10.7-dev-20260823-6142c00",
135
+ "@matterbridge/dgram": "3.10.7-dev-20260825-7ebac36",
136
+ "@matterbridge/thread": "3.10.7-dev-20260825-7ebac36",
137
+ "@matterbridge/types": "3.10.7-dev-20260825-7ebac36",
138
+ "@matterbridge/utils": "3.10.7-dev-20260825-7ebac36",
139
139
  "escape-html": "1.0.3",
140
140
  "express": "5.2.1",
141
141
  "express-rate-limit": "8.6.2",