matterbridge 3.2.3-dev-20250812-77f592b → 3.2.3-dev-20250813-34745fd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/devices/dishwasher.js +1 -1
- package/dist/devices/export.js +5 -3
- package/dist/devices/laundryDryer.js +2 -1
- package/dist/devices/laundryWasher.js +3 -58
- package/dist/devices/microwaveOven.js +96 -0
- package/dist/devices/oven.js +104 -0
- package/dist/devices/temperatureControl.js +57 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,16 @@ If you like this project and find it useful, please consider giving it a star on
|
|
|
10
10
|
|
|
11
11
|
## [3.2.3] - 2025-08-??
|
|
12
12
|
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- [Oven]: Added Oven class and Jest test. It is not supported by the Home app.
|
|
16
|
+
- [MicrowaveOven]: Added MicrowaveOven class and Jest test. It is not supported by the Home app.
|
|
17
|
+
- [Matter]: Added Matter Specification Version 1.4 pdf files.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- [package]: Updated dependencies.
|
|
22
|
+
|
|
13
23
|
<a href="https://www.buymeacoffee.com/luligugithub">
|
|
14
24
|
<img src="bmc-button.svg" alt="Buy me a coffee" width="80">
|
|
15
25
|
</a>
|
|
@@ -6,7 +6,7 @@ import { DishwasherMode } from '@matter/main/clusters/dishwasher-mode';
|
|
|
6
6
|
import { dishwasher, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
7
7
|
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
8
8
|
import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviors.js';
|
|
9
|
-
import { MatterbridgeLevelTemperatureControlServer, MatterbridgeNumberTemperatureControlServer } from './
|
|
9
|
+
import { MatterbridgeLevelTemperatureControlServer, MatterbridgeNumberTemperatureControlServer } from './temperatureControl.js';
|
|
10
10
|
export class Dishwasher extends MatterbridgeEndpoint {
|
|
11
11
|
constructor(name, serial, currentMode, supportedModes, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
|
|
12
12
|
super([dishwasher, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
package/dist/devices/export.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
export * from './roboticVacuumCleaner.js';
|
|
2
1
|
export * from './laundryWasher.js';
|
|
3
2
|
export * from './laundryDryer.js';
|
|
3
|
+
export * from './extractorHood.js';
|
|
4
|
+
export * from './dishwasher.js';
|
|
5
|
+
export * from './microwaveOven.js';
|
|
6
|
+
export * from './oven.js';
|
|
4
7
|
export * from './waterHeater.js';
|
|
5
8
|
export * from './evse.js';
|
|
6
9
|
export * from './solarPower.js';
|
|
7
10
|
export * from './batteryStorage.js';
|
|
8
11
|
export * from './heatPump.js';
|
|
9
|
-
export * from './
|
|
10
|
-
export * from './dishwasher.js';
|
|
12
|
+
export * from './roboticVacuumCleaner.js';
|
|
@@ -4,7 +4,8 @@ import { LaundryDryerControls } from '@matter/main/clusters/laundry-dryer-contro
|
|
|
4
4
|
import { LaundryDryerControlsServer } from '@matter/main/behaviors/laundry-dryer-controls';
|
|
5
5
|
import { laundryDryer, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
6
6
|
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
7
|
-
import { MatterbridgeLaundryWasherModeServer
|
|
7
|
+
import { MatterbridgeLaundryWasherModeServer } from './laundryWasher.js';
|
|
8
|
+
import { MatterbridgeLevelTemperatureControlServer, MatterbridgeNumberTemperatureControlServer } from './temperatureControl.js';
|
|
8
9
|
export class LaundryDryer extends MatterbridgeEndpoint {
|
|
9
10
|
constructor(name, serial, currentMode, supportedModes, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
|
|
10
11
|
super([laundryDryer, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { LaundryWasherControls } from '@matter/main/clusters/laundry-washer-controls';
|
|
2
2
|
import { LaundryWasherMode } from '@matter/main/clusters/laundry-washer-mode';
|
|
3
|
-
import { TemperatureControl } from '@matter/main/clusters/temperature-control';
|
|
4
3
|
import { ModeBase } from '@matter/main/clusters/mode-base';
|
|
5
|
-
import { TemperatureControlServer } from '@matter/main/behaviors/temperature-control';
|
|
6
4
|
import { LaundryWasherModeServer } from '@matter/main/behaviors/laundry-washer-mode';
|
|
7
5
|
import { LaundryWasherControlsServer } from '@matter/main/behaviors/laundry-washer-controls';
|
|
8
6
|
import { laundryWasher, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
9
7
|
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
10
8
|
import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviors.js';
|
|
9
|
+
import { createLevelTemperatureControlClusterServer, createNumberTemperatureControlClusterServer } from './temperatureControl.js';
|
|
11
10
|
export class LaundryWasher extends MatterbridgeEndpoint {
|
|
12
11
|
constructor(name, serial, currentMode, supportedModes, spinSpeedCurrent, spinSpeeds, numberOfRinses, supportedRinses, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
|
|
13
12
|
super([laundryWasher, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
|
@@ -18,9 +17,9 @@ export class LaundryWasher extends MatterbridgeEndpoint {
|
|
|
18
17
|
this.createDefaultLaundryWasherModeClusterServer(currentMode, supportedModes);
|
|
19
18
|
this.createDefaultLaundryWasherControlsClusterServer(spinSpeedCurrent, spinSpeeds, numberOfRinses, supportedRinses);
|
|
20
19
|
if (temperatureSetpoint)
|
|
21
|
-
|
|
20
|
+
createNumberTemperatureControlClusterServer(this, temperatureSetpoint, minTemperature, maxTemperature, step);
|
|
22
21
|
else
|
|
23
|
-
|
|
22
|
+
createLevelTemperatureControlClusterServer(this, selectedTemperatureLevel, supportedTemperatureLevels);
|
|
24
23
|
this.createDefaultOperationalStateClusterServer(operationalState);
|
|
25
24
|
}
|
|
26
25
|
createDefaultLaundryWasherModeClusterServer(currentMode = 2, supportedModes = [
|
|
@@ -44,60 +43,6 @@ export class LaundryWasher extends MatterbridgeEndpoint {
|
|
|
44
43
|
});
|
|
45
44
|
return this;
|
|
46
45
|
}
|
|
47
|
-
createLevelTemperatureControlClusterServer(selectedTemperatureLevel = 1, supportedTemperatureLevels = ['Cold', 'Warm', 'Hot', '30°', '40°', '60°', '80°']) {
|
|
48
|
-
this.behaviors.require(MatterbridgeLevelTemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel), {
|
|
49
|
-
selectedTemperatureLevel,
|
|
50
|
-
supportedTemperatureLevels,
|
|
51
|
-
});
|
|
52
|
-
return this;
|
|
53
|
-
}
|
|
54
|
-
createNumberTemperatureControlClusterServer(temperatureSetpoint = 40 * 100, minTemperature = 30 * 100, maxTemperature = 60 * 100, step = 10 * 100) {
|
|
55
|
-
this.behaviors.require(MatterbridgeNumberTemperatureControlServer.with(TemperatureControl.Feature.TemperatureNumber, TemperatureControl.Feature.TemperatureStep), {
|
|
56
|
-
temperatureSetpoint,
|
|
57
|
-
minTemperature,
|
|
58
|
-
maxTemperature,
|
|
59
|
-
step,
|
|
60
|
-
});
|
|
61
|
-
return this;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
export class MatterbridgeLevelTemperatureControlServer extends TemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel) {
|
|
65
|
-
initialize() {
|
|
66
|
-
if (this.state.supportedTemperatureLevels.length >= 2) {
|
|
67
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
68
|
-
device.log.info(`MatterbridgeLevelTemperatureControlServer initialized with selectedTemperatureLevel ${this.state.selectedTemperatureLevel} and supportedTemperatureLevels: ${this.state.supportedTemperatureLevels.join(', ')}`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
setTemperature(request) {
|
|
72
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
73
|
-
device.log.info(`SetTemperature (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
74
|
-
device.commandHandler.executeHandler('setTemperature', { request, cluster: TemperatureControlServer.id, attributes: this.state, endpoint: this.endpoint });
|
|
75
|
-
if (request.targetTemperatureLevel !== undefined && request.targetTemperatureLevel >= 0 && request.targetTemperatureLevel < this.state.supportedTemperatureLevels.length) {
|
|
76
|
-
device.log.debug(`MatterbridgeLevelTemperatureControlServer: setTemperature called setting selectedTemperatureLevel to ${request.targetTemperatureLevel}: ${this.state.supportedTemperatureLevels[request.targetTemperatureLevel]}`);
|
|
77
|
-
this.state.selectedTemperatureLevel = request.targetTemperatureLevel;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
device.log.error(`MatterbridgeLevelTemperatureControlServer: setTemperature called with invalid targetTemperatureLevel ${request.targetTemperatureLevel}`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
export class MatterbridgeNumberTemperatureControlServer extends TemperatureControlServer.with(TemperatureControl.Feature.TemperatureNumber, TemperatureControl.Feature.TemperatureStep) {
|
|
85
|
-
initialize() {
|
|
86
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
87
|
-
device.log.info(`MatterbridgeNumberTemperatureControlServer initialized with temperatureSetpoint ${this.state.temperatureSetpoint} minTemperature ${this.state.minTemperature} maxTemperature ${this.state.maxTemperature} step ${this.state.step}`);
|
|
88
|
-
}
|
|
89
|
-
setTemperature(request) {
|
|
90
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
91
|
-
device.log.info(`SetTemperature (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
92
|
-
device.commandHandler.executeHandler('setTemperature', { request, cluster: TemperatureControlServer.id, attributes: this.state, endpoint: this.endpoint });
|
|
93
|
-
if (request.targetTemperature !== undefined && request.targetTemperature >= this.state.minTemperature && request.targetTemperature <= this.state.maxTemperature) {
|
|
94
|
-
device.log.debug(`MatterbridgeNumberTemperatureControlServer: setTemperature called setting temperatureSetpoint to ${request.targetTemperature}`);
|
|
95
|
-
this.state.temperatureSetpoint = request.targetTemperature;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
device.log.error(`MatterbridgeNumberTemperatureControlServer: setTemperature called with invalid targetTemperature ${request.targetTemperature}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
46
|
}
|
|
102
47
|
export class MatterbridgeLaundryWasherModeServer extends LaundryWasherModeServer {
|
|
103
48
|
initialize() {
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { OperationalState } from '@matter/main/clusters/operational-state';
|
|
2
|
+
import { MicrowaveOvenMode } from '@matter/main/clusters/microwave-oven-mode';
|
|
3
|
+
import { MicrowaveOvenControl } from '@matter/main/clusters/microwave-oven-control';
|
|
4
|
+
import { MicrowaveOvenControlServer } from '@matter/main/behaviors/microwave-oven-control';
|
|
5
|
+
import { MicrowaveOvenModeServer } from '@matter/main/behaviors/microwave-oven-mode';
|
|
6
|
+
import { microwaveOven, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
7
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
8
|
+
import { MatterbridgeServer, MatterbridgeOperationalStateServer } from '../matterbridgeBehaviors.js';
|
|
9
|
+
export class MicrowaveOven extends MatterbridgeEndpoint {
|
|
10
|
+
constructor(name, serial, currentMode = 1, supportedModes = [
|
|
11
|
+
{ label: 'Auto', mode: 1, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Auto }] },
|
|
12
|
+
{ label: 'Quick', mode: 2, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Quick }] },
|
|
13
|
+
{ label: 'Quiet', mode: 3, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Quiet }] },
|
|
14
|
+
{ label: 'Min', mode: 4, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Min }] },
|
|
15
|
+
{ label: 'Max', mode: 5, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Max }] },
|
|
16
|
+
{ label: 'Normal', mode: 6, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Normal }] },
|
|
17
|
+
{ label: 'Defrost', mode: 7, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Defrost }] },
|
|
18
|
+
], selectedWattIndex = 5, supportedWatts = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000], cookTime = 60, maxCookTime = 3600) {
|
|
19
|
+
super([microwaveOven, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
|
20
|
+
this.createDefaultIdentifyClusterServer();
|
|
21
|
+
this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Microwave Oven');
|
|
22
|
+
this.createDefaultPowerSourceWiredClusterServer();
|
|
23
|
+
this.createDefaultOperationalStateClusterServer(OperationalState.OperationalStateEnum.Stopped);
|
|
24
|
+
this.createDefaultMicrowaveOvenModeClusterServer(currentMode, supportedModes);
|
|
25
|
+
this.createDefaultMicrowaveOvenControlClusterServer(selectedWattIndex, supportedWatts, cookTime, maxCookTime);
|
|
26
|
+
}
|
|
27
|
+
createDefaultMicrowaveOvenModeClusterServer(currentMode, supportedModes) {
|
|
28
|
+
this.behaviors.require(MicrowaveOvenModeServer, {
|
|
29
|
+
supportedModes,
|
|
30
|
+
currentMode,
|
|
31
|
+
});
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
createDefaultMicrowaveOvenControlClusterServer(selectedWattIndex, supportedWatts, cookTime, maxCookTime) {
|
|
35
|
+
this.behaviors.require(MatterbridgeMicrowaveOvenControlServer.with(MicrowaveOvenControl.Feature.PowerInWatts), {
|
|
36
|
+
supportedWatts,
|
|
37
|
+
selectedWattIndex,
|
|
38
|
+
cookTime,
|
|
39
|
+
maxCookTime,
|
|
40
|
+
});
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class MatterbridgeMicrowaveOvenControlServer extends MicrowaveOvenControlServer.with(MicrowaveOvenControl.Feature.PowerInWatts) {
|
|
45
|
+
initialize() {
|
|
46
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
47
|
+
device.log.info('MatterbridgeMicrowaveOvenControlServer initialized');
|
|
48
|
+
}
|
|
49
|
+
setCookingParameters(request) {
|
|
50
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
51
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
52
|
+
device.commandHandler.executeHandler('setCookingParameters', { request, cluster: MicrowaveOvenControl.Cluster.id, attributes: this.state, endpoint: this.endpoint });
|
|
53
|
+
if (request.cookMode !== undefined) {
|
|
54
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting cookMode to ${request.cookMode}`);
|
|
55
|
+
this.endpoint.setStateOf(MicrowaveOvenModeServer, { currentMode: request.cookMode });
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no cookMode so set to Normal`);
|
|
59
|
+
const supportedModes = this.endpoint.stateOf(MicrowaveOvenModeServer).supportedModes;
|
|
60
|
+
const normalMode = supportedModes.find((mode) => mode.modeTags.some((tag) => tag.value === MicrowaveOvenMode.ModeTag.Normal));
|
|
61
|
+
this.endpoint.setStateOf(MicrowaveOvenModeServer, { currentMode: normalMode?.mode });
|
|
62
|
+
}
|
|
63
|
+
if (request.cookTime !== undefined && request.cookTime >= 0 && request.cookTime <= this.state.maxCookTime) {
|
|
64
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting cookTime to ${request.cookTime}`);
|
|
65
|
+
this.state.cookTime = request.cookTime;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no cookTime so set to 30sec.`);
|
|
69
|
+
this.state.cookTime = 30;
|
|
70
|
+
}
|
|
71
|
+
if (request.wattSettingIndex !== undefined && request.wattSettingIndex >= 0 && request.wattSettingIndex < this.state.supportedWatts.length) {
|
|
72
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting selectedWattIndex to ${request.wattSettingIndex}`);
|
|
73
|
+
this.state.selectedWattIndex = request.wattSettingIndex;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no wattSettingIndex so set to the highest Watt setting for the selected CookMode`);
|
|
77
|
+
this.state.selectedWattIndex = this.state.supportedWatts.length - 1;
|
|
78
|
+
}
|
|
79
|
+
if (request.startAfterSetting === true) {
|
|
80
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting startAfterSetting = true`);
|
|
81
|
+
this.endpoint.setStateOf(MatterbridgeOperationalStateServer, { operationalState: OperationalState.OperationalStateEnum.Running });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
addMoreTime(request) {
|
|
85
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
86
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: addMoreTime (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
87
|
+
device.commandHandler.executeHandler('addMoreTime', { request, cluster: MicrowaveOvenControl.Cluster.id, attributes: this.state, endpoint: this.endpoint });
|
|
88
|
+
if (request.timeToAdd !== undefined && request.timeToAdd > 0 && this.state.cookTime + request.timeToAdd <= this.state.maxCookTime) {
|
|
89
|
+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: addMoreTime called setting cookTime to ${this.state.cookTime + request.timeToAdd}`);
|
|
90
|
+
this.state.cookTime += request.timeToAdd;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
device.log.error(`MatterbridgeMicrowaveOvenControlServer: addMoreTime called with invalid cookTime ${request.timeToAdd}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { ModeBase } from '@matter/main/clusters/mode-base';
|
|
2
|
+
import { OvenMode } from '@matter/main/clusters/oven-mode';
|
|
3
|
+
import { OperationalState } from '@matter/main/clusters/operational-state';
|
|
4
|
+
import { OvenModeServer } from '@matter/main/behaviors/oven-mode';
|
|
5
|
+
import { OvenCavityOperationalStateServer } from '@matter/main/behaviors/oven-cavity-operational-state';
|
|
6
|
+
import { oven, powerSource, temperatureControlledCabinetHeater } from '../matterbridgeDeviceTypes.js';
|
|
7
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
8
|
+
import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
|
|
9
|
+
import { createLevelTemperatureControlClusterServer } from './temperatureControl.js';
|
|
10
|
+
export class Oven extends MatterbridgeEndpoint {
|
|
11
|
+
constructor(name, serial) {
|
|
12
|
+
super([oven, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
|
13
|
+
this.createDefaultIdentifyClusterServer();
|
|
14
|
+
this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Oven');
|
|
15
|
+
this.createDefaultPowerSourceWiredClusterServer();
|
|
16
|
+
}
|
|
17
|
+
addCabinet(name, tagList, currentMode = 2, supportedModes = [
|
|
18
|
+
{ label: 'Bake', mode: 1, modeTags: [{ value: OvenMode.ModeTag.Bake }] },
|
|
19
|
+
{ label: 'Convection', mode: 2, modeTags: [{ value: OvenMode.ModeTag.Convection }] },
|
|
20
|
+
{ label: 'Grill', mode: 3, modeTags: [{ value: OvenMode.ModeTag.Grill }] },
|
|
21
|
+
{ label: 'Roast', mode: 4, modeTags: [{ value: OvenMode.ModeTag.Roast }] },
|
|
22
|
+
{ label: 'Clean', mode: 5, modeTags: [{ value: OvenMode.ModeTag.Clean }] },
|
|
23
|
+
{ label: 'Convection Bake', mode: 6, modeTags: [{ value: OvenMode.ModeTag.ConvectionBake }] },
|
|
24
|
+
{ label: 'Convection Roast', mode: 7, modeTags: [{ value: OvenMode.ModeTag.ConvectionRoast }] },
|
|
25
|
+
{ label: 'Warming', mode: 8, modeTags: [{ value: OvenMode.ModeTag.Warming }] },
|
|
26
|
+
{ label: 'Proofing', mode: 9, modeTags: [{ value: OvenMode.ModeTag.Proofing }] },
|
|
27
|
+
{ label: 'Steam', mode: 10, modeTags: [{ value: OvenMode.ModeTag.Steam }] },
|
|
28
|
+
], selectedTemperatureLevel = 1, supportedTemperatureLevels = ['Defrost', '180°', '190°', '200°', '250°', '300°'], operationalState = OperationalState.OperationalStateEnum.Stopped, currentPhase, phaseList) {
|
|
29
|
+
const cabinet = this.addChildDeviceType(name, temperatureControlledCabinetHeater, { tagList }, true);
|
|
30
|
+
cabinet.log.logName = name;
|
|
31
|
+
cabinet.createDefaultIdentifyClusterServer();
|
|
32
|
+
createLevelTemperatureControlClusterServer(cabinet, selectedTemperatureLevel, supportedTemperatureLevels);
|
|
33
|
+
cabinet.createDefaultTemperatureMeasurementClusterServer(2000);
|
|
34
|
+
this.createDefaultOvenModeClusterServer(cabinet, currentMode, supportedModes);
|
|
35
|
+
this.createDefaultOvenCavityOperationalStateClusterServer(cabinet, operationalState, currentPhase, phaseList);
|
|
36
|
+
return cabinet;
|
|
37
|
+
}
|
|
38
|
+
createDefaultOvenModeClusterServer(endpoint, currentMode, supportedModes) {
|
|
39
|
+
endpoint.behaviors.require(MatterbridgeOvenModeServer, {
|
|
40
|
+
supportedModes,
|
|
41
|
+
currentMode,
|
|
42
|
+
});
|
|
43
|
+
return endpoint;
|
|
44
|
+
}
|
|
45
|
+
createDefaultOvenCavityOperationalStateClusterServer(endpoint, operationalState = OperationalState.OperationalStateEnum.Stopped, currentPhase, phaseList) {
|
|
46
|
+
endpoint.behaviors.require(MatterbridgeOvenCavityOperationalStateServer, {
|
|
47
|
+
phaseList: phaseList || null,
|
|
48
|
+
currentPhase: currentPhase || null,
|
|
49
|
+
operationalStateList: [
|
|
50
|
+
{ operationalStateId: OperationalState.OperationalStateEnum.Stopped, operationalStateLabel: 'Stopped' },
|
|
51
|
+
{ operationalStateId: OperationalState.OperationalStateEnum.Running, operationalStateLabel: 'Running' },
|
|
52
|
+
{ operationalStateId: OperationalState.OperationalStateEnum.Error, operationalStateLabel: 'Error' },
|
|
53
|
+
],
|
|
54
|
+
operationalState,
|
|
55
|
+
operationalError: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
|
|
56
|
+
});
|
|
57
|
+
return endpoint;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export class MatterbridgeOvenModeServer extends OvenModeServer {
|
|
61
|
+
initialize() {
|
|
62
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
63
|
+
device.log.info('MatterbridgeOvenModeServer initialized');
|
|
64
|
+
}
|
|
65
|
+
changeToMode(request) {
|
|
66
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
67
|
+
const supportedMode = this.state.supportedModes.find((supportedMode) => supportedMode.mode === request.newMode);
|
|
68
|
+
if (supportedMode) {
|
|
69
|
+
device.log.info(`MatterbridgeOvenModeServer: changeToMode (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber}) called with mode ${supportedMode.mode} = ${supportedMode.label}`);
|
|
70
|
+
this.state.currentMode = request.newMode;
|
|
71
|
+
return { status: ModeBase.ModeChangeStatus.Success, statusText: 'Success' };
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
device.log.error(`MatterbridgeOvenModeServer: changeToMode (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber}) called with invalid mode ${request.newMode}`);
|
|
75
|
+
return { status: ModeBase.ModeChangeStatus.InvalidInMode, statusText: 'Invalid mode' };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export class MatterbridgeOvenCavityOperationalStateServer extends OvenCavityOperationalStateServer {
|
|
80
|
+
initialize() {
|
|
81
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
82
|
+
device.log.info('MatterbridgeOvenCavityOperationalStateServer initialized: setting operational state to Stopped and operational error to No error');
|
|
83
|
+
this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
|
|
84
|
+
this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
|
|
85
|
+
}
|
|
86
|
+
stop() {
|
|
87
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
88
|
+
device.log.info(`MatterbridgeOvenCavityOperationalStateServer: stop (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber}) called setting operational state to Stopped and operational error to No error`);
|
|
89
|
+
this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
|
|
90
|
+
this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
|
|
91
|
+
return {
|
|
92
|
+
commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
start() {
|
|
96
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
97
|
+
device.log.info(`MatterbridgeOvenCavityOperationalStateServer: start (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber}) called setting operational state to Running and operational error to No error`);
|
|
98
|
+
this.state.operationalState = OperationalState.OperationalStateEnum.Running;
|
|
99
|
+
this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
|
|
100
|
+
return {
|
|
101
|
+
commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { TemperatureControl } from '@matter/main/clusters/temperature-control';
|
|
2
|
+
import { TemperatureControlServer } from '@matter/main/behaviors/temperature-control';
|
|
3
|
+
import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
|
|
4
|
+
export function createLevelTemperatureControlClusterServer(endpoint, selectedTemperatureLevel = 1, supportedTemperatureLevels = ['Cold', 'Warm', 'Hot', '30°', '40°', '60°', '80°']) {
|
|
5
|
+
endpoint.behaviors.require(MatterbridgeLevelTemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel), {
|
|
6
|
+
selectedTemperatureLevel,
|
|
7
|
+
supportedTemperatureLevels,
|
|
8
|
+
});
|
|
9
|
+
return endpoint;
|
|
10
|
+
}
|
|
11
|
+
export function createNumberTemperatureControlClusterServer(endpoint, temperatureSetpoint = 40 * 100, minTemperature = 30 * 100, maxTemperature = 60 * 100, step = 10 * 100) {
|
|
12
|
+
endpoint.behaviors.require(MatterbridgeNumberTemperatureControlServer.with(TemperatureControl.Feature.TemperatureNumber, TemperatureControl.Feature.TemperatureStep), {
|
|
13
|
+
temperatureSetpoint,
|
|
14
|
+
minTemperature,
|
|
15
|
+
maxTemperature,
|
|
16
|
+
step,
|
|
17
|
+
});
|
|
18
|
+
return endpoint;
|
|
19
|
+
}
|
|
20
|
+
export class MatterbridgeLevelTemperatureControlServer extends TemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel) {
|
|
21
|
+
initialize() {
|
|
22
|
+
if (this.state.supportedTemperatureLevels.length >= 2) {
|
|
23
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
24
|
+
device.log.info(`MatterbridgeLevelTemperatureControlServer initialized with selectedTemperatureLevel ${this.state.selectedTemperatureLevel} and supportedTemperatureLevels: ${this.state.supportedTemperatureLevels.join(', ')}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
setTemperature(request) {
|
|
28
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
29
|
+
device.log.info(`SetTemperature (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
30
|
+
device.commandHandler.executeHandler('setTemperature', { request, cluster: TemperatureControlServer.id, attributes: this.state, endpoint: this.endpoint });
|
|
31
|
+
if (request.targetTemperatureLevel !== undefined && request.targetTemperatureLevel >= 0 && request.targetTemperatureLevel < this.state.supportedTemperatureLevels.length) {
|
|
32
|
+
device.log.debug(`MatterbridgeLevelTemperatureControlServer: setTemperature called setting selectedTemperatureLevel to ${request.targetTemperatureLevel}: ${this.state.supportedTemperatureLevels[request.targetTemperatureLevel]}`);
|
|
33
|
+
this.state.selectedTemperatureLevel = request.targetTemperatureLevel;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
device.log.error(`MatterbridgeLevelTemperatureControlServer: setTemperature called with invalid targetTemperatureLevel ${request.targetTemperatureLevel}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class MatterbridgeNumberTemperatureControlServer extends TemperatureControlServer.with(TemperatureControl.Feature.TemperatureNumber, TemperatureControl.Feature.TemperatureStep) {
|
|
41
|
+
initialize() {
|
|
42
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
43
|
+
device.log.info(`MatterbridgeNumberTemperatureControlServer initialized with temperatureSetpoint ${this.state.temperatureSetpoint} minTemperature ${this.state.minTemperature} maxTemperature ${this.state.maxTemperature} step ${this.state.step}`);
|
|
44
|
+
}
|
|
45
|
+
setTemperature(request) {
|
|
46
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
47
|
+
device.log.info(`SetTemperature (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
48
|
+
device.commandHandler.executeHandler('setTemperature', { request, cluster: TemperatureControlServer.id, attributes: this.state, endpoint: this.endpoint });
|
|
49
|
+
if (request.targetTemperature !== undefined && request.targetTemperature >= this.state.minTemperature && request.targetTemperature <= this.state.maxTemperature) {
|
|
50
|
+
device.log.debug(`MatterbridgeNumberTemperatureControlServer: setTemperature called setting temperatureSetpoint to ${request.targetTemperature}`);
|
|
51
|
+
this.state.temperatureSetpoint = request.targetTemperature;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
device.log.error(`MatterbridgeNumberTemperatureControlServer: setTemperature called with invalid targetTemperature ${request.targetTemperature}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge",
|
|
3
|
-
"version": "3.2.3-dev-
|
|
3
|
+
"version": "3.2.3-dev-20250813-34745fd",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "matterbridge",
|
|
9
|
-
"version": "3.2.3-dev-
|
|
9
|
+
"version": "3.2.3-dev-20250813-34745fd",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@matter/main": "0.15.3",
|
package/package.json
CHANGED