Skip to content

Commit 82e6890

Browse files
committed
Use the PowerAsNumber and PowerNumberLimits features instead of PowerInWatts for the MicrowaveOvenControl cluster, and handle the PowerSetting field in SetCookingParameters accordingly
1 parent 5851f84 commit 82e6890

4 files changed

Lines changed: 51 additions & 48 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ If you like this project and find it useful, please consider giving it a star on
4444
### Fixed
4545

4646
- [irrigationSystem]: Remove the non-functional `singleZone` option; single-zone systems must now use `addZone` like any other zone.
47+
- [microwaveOven]: Use the `PowerAsNumber` and `PowerNumberLimits` features instead of `PowerInWatts` for the `MicrowaveOvenControl` cluster, and handle the `PowerSetting` field in `SetCookingParameters` accordingly.
4748

4849
<a href="https://www.buymeacoffee.com/luligugithub"><img src="https://matterbridge.io/assets/bmc-button.svg" alt="Buy me a coffee" width="80"></a>
4950

docs/CHANGELOG.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ <h3 id="changed">Changed</h3>
165165
<h3 id="fixed">Fixed</h3>
166166
<ul>
167167
<li>[irrigationSystem]: Remove the non-functional <code>singleZone</code> option; single-zone systems must now use <code>addZone</code> like any other zone.</li>
168+
<li>[microwaveOven]: Use the <code>PowerAsNumber</code> and <code>PowerNumberLimits</code> features instead of <code>PowerInWatts</code> for the <code>MicrowaveOvenControl</code> cluster, and handle the <code>PowerSetting</code> field in <code>SetCookingParameters</code> accordingly.</li>
168169
</ul>
169170
<p><a href="https://www.buymeacoffee.com/luligugithub"><img src="https://matterbridge.io/assets/bmc-button.svg" alt="Buy me a coffee" width="80"></a></p>
170171
<h2 id="3104-2026-08-07">[3.10.4] - 2026-08-07</h2>

packages/core/src/devices/microwaveOven.ts

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ export class MicrowaveOven extends MatterbridgeEndpoint {
4949
* @param {string} serial - The serial number of the microwave oven.
5050
* @param {number} currentMode - The current mode of the microwave oven. Default is 1 = Auto.
5151
* @param {MicrowaveOvenMode.ModeOption[]} supportedModes - The supported modes of the microwave oven. Default is an array of all modes.
52-
* @param {number} selectedWattIndex - The selected wattage index. Default is 5 (600W).
53-
* @param {number[]} supportedWatts - The supported wattages. Default is an array of all standard microwave wattages.
52+
* @param {number} powerSetting - The power level associated with the operation of the device. Default is 100.
53+
* @param {number} minPower - The minimum value to which the PowerSetting attribute can be set. Default is 10.
54+
* @param {number} maxPower - The maximum value to which the PowerSetting attribute can be set. Default is 100.
55+
* @param {number} powerStep - The increment of power that can be set on the server. Default is 10.
5456
* @param {number} cookTime - The initial cook time in seconds. Default is 60 seconds.
5557
* @param {number} maxCookTime - The maximum cook time in seconds. Default is 3600 seconds (1 hour).
5658
*
@@ -72,8 +74,10 @@ export class MicrowaveOven extends MatterbridgeEndpoint {
7274
{ label: 'Normal', mode: 6, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Normal }] },
7375
{ label: 'Defrost', mode: 7, modeTags: [{ value: MicrowaveOvenMode.ModeTag.Defrost }] },
7476
],
75-
selectedWattIndex: number = 5,
76-
supportedWatts: number[] = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000],
77+
powerSetting: number = 100,
78+
minPower: number = 10,
79+
maxPower: number = 100,
80+
powerStep: number = 10,
7781
cookTime: number = 60, // 1 minute
7882
maxCookTime: number = 3600, // 1 hour
7983
) {
@@ -83,7 +87,7 @@ export class MicrowaveOven extends MatterbridgeEndpoint {
8387
this.createDefaultPowerSourceWiredClusterServer();
8488
this.createDefaultOperationalStateClusterServer(OperationalState.OperationalStateEnum.Stopped);
8589
this.createDefaultMicrowaveOvenModeClusterServer(currentMode, supportedModes);
86-
this.createDefaultMicrowaveOvenControlClusterServer(selectedWattIndex, supportedWatts, cookTime, maxCookTime);
90+
this.createDefaultMicrowaveOvenControlClusterServer(powerSetting, minPower, maxPower, powerStep, cookTime, maxCookTime);
8791
}
8892

8993
/**
@@ -114,22 +118,26 @@ export class MicrowaveOven extends MatterbridgeEndpoint {
114118
/**
115119
* Creates a default MicrowaveOvenControl Cluster Server.
116120
*
117-
* @param {number} selectedWattIndex - The selected watt index.
118-
* @param {number[]} supportedWatts - The supported watt values.
121+
* @param {number} powerSetting - The power level associated with the operation of the device.
122+
* @param {number} minPower - The minimum value to which the PowerSetting attribute can be set.
123+
* @param {number} maxPower - The maximum value to which the PowerSetting attribute can be set.
124+
* @param {number} powerStep - The increment of power that can be set on the server.
119125
* @param {number} cookTime - The initial cook time.
120126
* @param {number} maxCookTime - The maximum cook time.
121127
*
122128
* @returns {this} The current MatterbridgeEndpoint instance for chaining.
123129
*
124130
* @remarks
125131
* - 8.13. Microwave Oven Control Cluster
126-
* - the supported watt values are fixed and cannot be changed at runtime.
132+
* - minPower, maxPower and powerStep are fixed attributes and cannot be changed at runtime.
127133
* - the maxCookTime is a fixed attribute and cannot be changed at runtime.
128134
*/
129-
createDefaultMicrowaveOvenControlClusterServer(selectedWattIndex: number, supportedWatts: number[], cookTime: number, maxCookTime: number): this {
130-
this.behaviors.require(MatterbridgeMicrowaveOvenControlServer.with(MicrowaveOvenControl.Feature.PowerInWatts), {
131-
supportedWatts, // Fixed attribute
132-
selectedWattIndex,
135+
createDefaultMicrowaveOvenControlClusterServer(powerSetting: number, minPower: number, maxPower: number, powerStep: number, cookTime: number, maxCookTime: number): this {
136+
this.behaviors.require(MatterbridgeMicrowaveOvenControlServer.with(MicrowaveOvenControl.Feature.PowerAsNumber, MicrowaveOvenControl.Feature.PowerNumberLimits), {
137+
powerSetting,
138+
minPower, // Fixed attribute
139+
maxPower, // Fixed attribute
140+
powerStep, // Fixed attribute
133141
cookTime,
134142
maxCookTime, // Fixed attribute
135143
});
@@ -140,7 +148,10 @@ export class MicrowaveOven extends MatterbridgeEndpoint {
140148
/**
141149
* Matterbridge Microwave Oven Control Server
142150
*/
143-
export class MatterbridgeMicrowaveOvenControlServer extends MicrowaveOvenControlServer.with(MicrowaveOvenControl.Feature.PowerInWatts) {
151+
export class MatterbridgeMicrowaveOvenControlServer extends MicrowaveOvenControlServer.with(
152+
MicrowaveOvenControl.Feature.PowerAsNumber,
153+
MicrowaveOvenControl.Feature.PowerNumberLimits,
154+
) {
144155
/**
145156
* Initializes the server.
146157
*/
@@ -187,13 +198,13 @@ export class MatterbridgeMicrowaveOvenControlServer extends MicrowaveOvenControl
187198
this.state.cookTime = 30;
188199
}
189200

190-
// 8.13.6.2.4. WattSettingIndex Field. Default the highest Watt setting for the selected CookMode.
191-
if (request.wattSettingIndex !== undefined && request.wattSettingIndex >= 0 && request.wattSettingIndex < this.state.supportedWatts.length) {
192-
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting selectedWattIndex to ${request.wattSettingIndex}`);
193-
this.state.selectedWattIndex = request.wattSettingIndex;
201+
// 8.13.6.2.3. PowerSetting Field. Default to MaxPower if not present.
202+
if (request.powerSetting !== undefined && request.powerSetting >= this.state.minPower && request.powerSetting <= this.state.maxPower) {
203+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting powerSetting to ${request.powerSetting}`);
204+
this.state.powerSetting = request.powerSetting;
194205
} else {
195-
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no wattSettingIndex so set to the highest Watt setting for the selected CookMode`);
196-
this.state.selectedWattIndex = this.state.supportedWatts.length - 1;
206+
device.log.info(`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no powerSetting so set to maxPower`);
207+
this.state.powerSetting = this.state.maxPower;
197208
}
198209

199210
// 8.13.6.2.5. StartAfterSetting Field. Default to false.

packages/core/vitest/devices/microwaveOven.test.ts

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,16 @@ describe('Matterbridge ' + NAME, () => {
148148
'identify(0x3).identifyTime(0x0)=0',
149149
'identify(0x3).identifyType(0x1)=0',
150150
'microwaveOvenControl(0x5f).acceptedCommandList(0xfff9)=[ 0, 1 ]',
151-
'microwaveOvenControl(0x5f).attributeList(0xfffb)=[ 0, 1, 6, 7, 65528, 65529, 65531, 65532, 65533 ]',
151+
'microwaveOvenControl(0x5f).attributeList(0xfffb)=[ 0, 1, 2, 3, 4, 5, 65528, 65529, 65531, 65532, 65533 ]',
152152
'microwaveOvenControl(0x5f).clusterRevision(0xfffd)=1',
153153
'microwaveOvenControl(0x5f).cookTime(0x0)=60',
154-
'microwaveOvenControl(0x5f).featureMap(0xfffc)={ powerAsNumber: false, powerInWatts: true, powerNumberLimits: false }',
154+
'microwaveOvenControl(0x5f).featureMap(0xfffc)={ powerAsNumber: true, powerInWatts: false, powerNumberLimits: true }',
155155
'microwaveOvenControl(0x5f).generatedCommandList(0xfff8)=[ ]',
156156
'microwaveOvenControl(0x5f).maxCookTime(0x1)=3600',
157-
'microwaveOvenControl(0x5f).selectedWattIndex(0x7)=5',
158-
'microwaveOvenControl(0x5f).supportedWatts(0x6)=[ 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 ]',
157+
'microwaveOvenControl(0x5f).maxPower(0x4)=100',
158+
'microwaveOvenControl(0x5f).minPower(0x3)=10',
159+
'microwaveOvenControl(0x5f).powerSetting(0x2)=100',
160+
'microwaveOvenControl(0x5f).powerStep(0x5)=10',
159161
'microwaveOvenMode(0x5e).acceptedCommandList(0xfff9)=[ ]',
160162
'microwaveOvenMode(0x5e).attributeList(0xfffb)=[ 0, 1, 65528, 65529, 65531, 65532, 65533 ]',
161163
'microwaveOvenMode(0x5e).clusterRevision(0xfffd)=2',
@@ -210,61 +212,49 @@ describe('Matterbridge ' + NAME, () => {
210212
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', {});
211213
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no cookMode so set to Normal`);
212214
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no cookTime so set to 30sec.`);
213-
expect(loggerLogSpy).toHaveBeenCalledWith(
214-
LogLevel.INFO,
215-
`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no wattSettingIndex so set to the highest Watt setting for the selected CookMode`,
216-
);
215+
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no powerSetting so set to maxPower`);
217216

218217
// Test setCookingParameters - valid cookMode only
219218
vi.clearAllMocks();
220219
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookMode: 2 });
221220
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting cookMode to 2`);
222221
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no cookTime so set to 30sec.`);
223-
expect(loggerLogSpy).toHaveBeenCalledWith(
224-
LogLevel.INFO,
225-
`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no wattSettingIndex so set to the highest Watt setting for the selected CookMode`,
226-
);
222+
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no powerSetting so set to maxPower`);
227223

228-
// Test setCookingParameters - no cookMode provided but valid cookTime and wattSettingIndex
224+
// Test setCookingParameters - no cookMode provided but valid cookTime and powerSetting
229225
vi.clearAllMocks();
230-
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookTime: 120, wattSettingIndex: 3 });
226+
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookTime: 120, powerSetting: 30 });
231227
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no cookMode so set to Normal`);
232228
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting cookTime to 120`);
233-
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting selectedWattIndex to 3`);
229+
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting powerSetting to 30`);
234230

235231
// Test setCookingParameters - invalid cookTime (<0) -> default to 30sec
236232
vi.clearAllMocks();
237-
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookMode: 7, cookTime: -5, wattSettingIndex: 0 });
233+
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookMode: 7, cookTime: -5, powerSetting: 10 });
238234
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting cookMode to 7`);
239235
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no cookTime so set to 30sec.`);
240-
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting selectedWattIndex to 0`);
236+
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting powerSetting to 10`);
241237

242238
// Test setCookingParameters - cookTime > maxCookTime -> default to 30sec
243239
vi.clearAllMocks();
244240
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookTime: 5000 });
245241
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no cookMode so set to Normal`);
246242
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no cookTime so set to 30sec.`);
247-
expect(loggerLogSpy).toHaveBeenCalledWith(
248-
LogLevel.INFO,
249-
`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no wattSettingIndex so set to the highest Watt setting for the selected CookMode`,
250-
);
243+
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no powerSetting so set to maxPower`);
251244

252-
// Test setCookingParameters - invalid wattSettingIndex (out of range) -> default to highest supported index
245+
// Test setCookingParameters - invalid powerSetting (out of range) -> default to maxPower
253246
vi.clearAllMocks();
254-
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookMode: 3, cookTime: 45, wattSettingIndex: 100 });
247+
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookMode: 3, cookTime: 45, powerSetting: 150 });
255248
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting cookMode to 3`);
256249
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting cookTime to 45`);
257-
expect(loggerLogSpy).toHaveBeenCalledWith(
258-
LogLevel.INFO,
259-
`MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no wattSettingIndex so set to the highest Watt setting for the selected CookMode`,
260-
);
250+
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called with no powerSetting so set to maxPower`);
261251

262252
// Test setCookingParameters - all valid values
263253
vi.clearAllMocks();
264-
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookMode: 4, cookTime: 90, wattSettingIndex: 2 });
254+
await device.invokeBehaviorCommand('microwaveOvenControl', 'setCookingParameters', { cookMode: 4, cookTime: 90, powerSetting: 50 });
265255
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting cookMode to 4`);
266256
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting cookTime to 90`);
267-
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting selectedWattIndex to 2`);
257+
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, `MatterbridgeMicrowaveOvenControlServer: setCookingParameters called setting powerSetting to 50`);
268258

269259
// Test setCookingParameters - startAfterSetting false (no change expected)
270260
vi.clearAllMocks();

0 commit comments

Comments
 (0)