@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.
- package/dist/behaviors/export.d.ts +1 -0
- package/dist/behaviors/export.js +1 -0
- package/dist/behaviors/pumpConfigurationAndControlServer.d.ts +23 -0
- package/dist/behaviors/pumpConfigurationAndControlServer.js +100 -0
- package/dist/demoDevices.js +133 -2
- package/dist/devices/airConditioner.d.ts +6 -0
- package/dist/devices/airConditioner.js +6 -1
- package/dist/devices/cooktop.d.ts +16 -2
- package/dist/devices/cooktop.js +11 -5
- package/dist/devices/dishwasher.d.ts +18 -0
- package/dist/devices/dishwasher.js +25 -7
- package/dist/devices/extractorHood.d.ts +20 -1
- package/dist/devices/extractorHood.js +23 -4
- package/dist/devices/laundryDryer.d.ts +18 -0
- package/dist/devices/laundryDryer.js +25 -7
- package/dist/devices/laundryWasher.d.ts +22 -0
- package/dist/devices/laundryWasher.js +30 -8
- package/dist/devices/microwaveOven.d.ts +17 -0
- package/dist/devices/microwaveOven.js +21 -12
- package/dist/devices/oven.d.ts +24 -2
- package/dist/devices/oven.js +40 -19
- package/dist/devices/refrigerator.d.ts +21 -1
- package/dist/devices/refrigerator.js +21 -11
- package/dist/devices/roboticVacuumCleaner.d.ts +21 -0
- package/dist/devices/roboticVacuumCleaner.js +28 -6
- package/dist/matterbridgeEndpoint.d.ts +1 -1
- package/dist/matterbridgeEndpoint.js +11 -8
- package/dist/matterbridgeEndpointHelpers.js +3 -2
- package/package.json +5 -5
|
@@ -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';
|
package/dist/behaviors/export.js
CHANGED
|
@@ -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 = {}));
|
package/dist/demoDevices.js
CHANGED
|
@@ -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], {
|
|
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
|
}
|
package/dist/devices/cooktop.js
CHANGED
|
@@ -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], {
|
|
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,
|
|
15
|
-
const
|
|
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,
|
|
13
|
-
|
|
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,
|
|
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,
|
|
7
|
-
|
|
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,
|
|
10
|
-
|
|
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,
|
|
14
|
-
|
|
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,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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,
|
|
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, {
|
package/dist/devices/oven.d.ts
CHANGED
|
@@ -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;
|
package/dist/devices/oven.js
CHANGED
|
@@ -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], {
|
|
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,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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,
|
|
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,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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,
|
|
28
|
+
this.createDefaultRefrigeratorAndTemperatureControlledCabinetModeClusterServer(this, options.currentMode ?? 1, configuredSupportedModes);
|
|
22
29
|
this.createDefaultRefrigeratorAlarmClusterServer(this, false);
|
|
23
30
|
}
|
|
24
|
-
addCabinet(name,
|
|
25
|
-
const
|
|
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,
|
|
18
|
-
|
|
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(
|
|
1308
|
-
minConstSpeed
|
|
1309
|
-
maxConstSpeed
|
|
1310
|
-
maxPressure
|
|
1311
|
-
maxSpeed
|
|
1312
|
-
maxFlow
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
136
|
-
"@matterbridge/thread": "3.10.7-dev-
|
|
137
|
-
"@matterbridge/types": "3.10.7-dev-
|
|
138
|
-
"@matterbridge/utils": "3.10.7-dev-
|
|
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",
|