matterbridge-example-dynamic-platform 1.2.0-edge.3 → 1.2.0-edge.5

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.
@@ -1,7 +1,7 @@
1
- import { DeviceClasses, DeviceTypeDefinition, MatterbridgeEndpoint, Status, Matterbridge, VendorId, DeviceTypeId, MatterbridgeServer, smokeCoAlarm, } from 'matterbridge';
1
+ import { DeviceClasses, DeviceTypeDefinition, MatterbridgeEndpoint, Status, Matterbridge, VendorId, DeviceTypeId, MatterbridgeServer, smokeCoAlarm, MatterbridgeOnOffServer, } from 'matterbridge';
2
2
  import { ClusterBehavior, LogLevel as MatterLogLevel, LogFormat as MatterLogFormat, EndpointServer, logEndpoint } from 'matterbridge/matter';
3
- import { Identify, OperationalState, OnOff, TemperatureControl, DishwasherAlarm, DishwasherMode, LaundryWasherControls, LaundryWasherMode, TemperatureMeasurement, OvenMode, RefrigeratorAndTemperatureControlledCabinetMode, } from 'matterbridge/matter/clusters';
4
- import { DishwasherAlarmServer, OperationalStateBehavior, TemperatureControlBehavior } from 'matterbridge/matter/behaviors';
3
+ import { Identify, OperationalState, OnOff, TemperatureControl, DishwasherAlarm, DishwasherMode, LaundryWasherControls, LaundryWasherMode, LaundryDryerControls, TemperatureMeasurement, OvenMode, RefrigeratorAndTemperatureControlledCabinetMode, } from 'matterbridge/matter/clusters';
4
+ import { DishwasherAlarmServer, LaundryDryerControlsServer, LaundryWasherControlsServer, OperationalStateBehavior, TemperatureControlBehavior, } from 'matterbridge/matter/behaviors';
5
5
  import { OvenCavityOperationalState } from './implementations/ovenCavityOperationalStateCluster.js';
6
6
  import { AnsiLogger } from 'matterbridge/logger';
7
7
  import { Robot } from './robot.js';
@@ -30,6 +30,14 @@ export class Appliances extends MatterbridgeEndpoint {
30
30
  requiredServerClusters: [OperationalState.Cluster.id],
31
31
  optionalServerClusters: [Identify.Cluster.id, LaundryWasherMode.Cluster.id, OnOff.Cluster.id, LaundryWasherControls.Cluster.id, TemperatureControl.Cluster.id],
32
32
  });
33
+ static laundryDryer = DeviceTypeDefinition({
34
+ name: 'MA-laundrydryer',
35
+ code: 0x7c,
36
+ deviceClass: DeviceClasses.Simple,
37
+ revision: 1,
38
+ requiredServerClusters: [OperationalState.Cluster.id],
39
+ optionalServerClusters: [Identify.Cluster.id, LaundryWasherMode.Cluster.id, OnOff.Cluster.id, LaundryDryerControls.Cluster.id, TemperatureControl.Cluster.id],
40
+ });
33
41
  static dishwasher = DeviceTypeDefinition({
34
42
  name: 'MA-dishwasher',
35
43
  code: 0x75,
@@ -43,13 +51,25 @@ export class Appliances extends MatterbridgeEndpoint {
43
51
  if (deviceType.code === Appliances.laundryWasher.code) {
44
52
  this.createDefaultIdentifyClusterServer();
45
53
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Laundry Washer');
46
- this.createLevelTemperatureControlClusterServer(1, ['Cold', '30°', '40°', '60°']);
54
+ this.createDeadFrontOnOffClusterServer();
55
+ this.createLevelTemperatureControlClusterServer(3, ['Cold', '30°', '40°', '60°', '80°']);
56
+ this.createDefaultLaundryWasherModeClusterServer();
57
+ this.createSpinLaundryWasherControlsClusterServer(3, ['400', '800', '1200', '1600']);
47
58
  this.createDefaultOperationalStateClusterServer(OperationalState.OperationalStateEnum.Stopped);
48
59
  }
49
- else if (deviceType.code === Appliances.dishwasher.code) {
60
+ else if (deviceType.code === Appliances.laundryDryer.code) {
50
61
  this.createDefaultIdentifyClusterServer();
62
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Laundry Dryer');
51
63
  this.createDeadFrontOnOffClusterServer();
64
+ this.createLevelTemperatureControlClusterServer(3, ['Cold', '30°', '40°', '60°', '80°']);
65
+ this.createDefaultLaundryWasherModeClusterServer();
66
+ this.createDefaultLaundryDryerControlsClusterServer(1);
67
+ this.createDefaultOperationalStateClusterServer(OperationalState.OperationalStateEnum.Stopped);
68
+ }
69
+ else if (deviceType.code === Appliances.dishwasher.code) {
70
+ this.createDefaultIdentifyClusterServer();
52
71
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Dishwasher');
72
+ this.createDeadFrontOnOffClusterServer();
53
73
  this.createLevelTemperatureControlClusterServer(1, ['Cold', '30°', '40°', '60°']);
54
74
  this.createDefaultDishwasherModeClusterServer();
55
75
  this.createDefaultDishwasherAlarmClusterServer();
@@ -121,6 +141,49 @@ export class Appliances extends MatterbridgeEndpoint {
121
141
  });
122
142
  return this;
123
143
  }
144
+ createDefaultLaundryWasherModeClusterServer(currentMode) {
145
+ this.behaviors.require(LaundryWasherModeServer, {
146
+ supportedModes: [
147
+ { label: 'Delicate', mode: 1, modeTags: [{ value: LaundryWasherMode.ModeTag.Delicate }] },
148
+ { label: 'Normal', mode: 2, modeTags: [{ value: LaundryWasherMode.ModeTag.Normal }] },
149
+ { label: 'Heavy', mode: 3, modeTags: [{ value: LaundryWasherMode.ModeTag.Heavy }] },
150
+ { label: 'Whites', mode: 4, modeTags: [{ value: LaundryWasherMode.ModeTag.Whites }] },
151
+ ],
152
+ currentMode,
153
+ });
154
+ return this;
155
+ }
156
+ createSpinLaundryWasherControlsClusterServer(spinSpeedCurrent, spinSpeeds) {
157
+ this.behaviors.require(LaundryWasherControlsServer.with(LaundryWasherControls.Feature.Spin), {
158
+ spinSpeeds: spinSpeeds ?? ['400', '800', '1200', '1600'],
159
+ spinSpeedCurrent,
160
+ });
161
+ return this;
162
+ }
163
+ createRinseLaundryWasherControlsClusterServer(numberOfRinses, supportedRinses) {
164
+ this.behaviors.require(LaundryWasherControlsServer.with(LaundryWasherControls.Feature.Rinse), {
165
+ supportedRinses: supportedRinses ?? [
166
+ LaundryWasherControls.NumberOfRinses.None,
167
+ LaundryWasherControls.NumberOfRinses.Normal,
168
+ LaundryWasherControls.NumberOfRinses.Extra,
169
+ LaundryWasherControls.NumberOfRinses.Max,
170
+ ],
171
+ numberOfRinses,
172
+ });
173
+ return this;
174
+ }
175
+ createDefaultLaundryDryerControlsClusterServer(selectedDrynessLevel, supportedDrynessLevels) {
176
+ this.behaviors.require(LaundryDryerControlsServer, {
177
+ supportedDrynessLevels: supportedDrynessLevels ?? [
178
+ LaundryDryerControls.DrynessLevel.Low,
179
+ LaundryDryerControls.DrynessLevel.Normal,
180
+ LaundryDryerControls.DrynessLevel.Extra,
181
+ LaundryDryerControls.DrynessLevel.Max,
182
+ ],
183
+ selectedDrynessLevel,
184
+ });
185
+ return this;
186
+ }
124
187
  createDefaultDishwasherAlarmClusterServer() {
125
188
  this.behaviors.require(DishwasherAlarmServer, {
126
189
  mask: { inflowError: true, drainError: true, doorError: true, tempTooLow: true, tempTooHigh: true, waterLevelError: true },
@@ -167,13 +230,13 @@ export class Appliances extends MatterbridgeEndpoint {
167
230
  class MatterbridgeOperationalStateServer extends OperationalStateBehavior {
168
231
  initialize() {
169
232
  const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
170
- device.log.info('MatterbridgeOperationalStateServer initialized: setting operational state to Docked');
233
+ device.log.info('MatterbridgeOperationalStateServer initialized: setting operational state to Stopped');
171
234
  this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
172
235
  this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
173
236
  }
174
237
  pause() {
175
238
  const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
176
- device.log.info('MatterbridgeOperationalStateServer: pause called setting operational state to Paused and currentMode to Paused');
239
+ device.log.info('MatterbridgeOperationalStateServer: pause called setting operational state to Paused');
177
240
  this.state.operationalState = OperationalState.OperationalStateEnum.Paused;
178
241
  this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
179
242
  return {
@@ -182,7 +245,7 @@ class MatterbridgeOperationalStateServer extends OperationalStateBehavior {
182
245
  }
183
246
  stop() {
184
247
  const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
185
- device.log.info('MatterbridgeOperationalStateServer: stop called setting operational state to Stopped and currentMode to Idle');
248
+ device.log.info('MatterbridgeOperationalStateServer: stop called setting operational state to Stopped');
186
249
  this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
187
250
  this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
188
251
  return {
@@ -191,7 +254,7 @@ class MatterbridgeOperationalStateServer extends OperationalStateBehavior {
191
254
  }
192
255
  start() {
193
256
  const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
194
- device.log.info('MatterbridgeOperationalStateServer: start called setting operational state to Running and currentMode to Running');
257
+ device.log.info('MatterbridgeOperationalStateServer: start called setting operational state to Running');
195
258
  this.state.operationalState = OperationalState.OperationalStateEnum.Running;
196
259
  this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
197
260
  return {
@@ -200,7 +263,7 @@ class MatterbridgeOperationalStateServer extends OperationalStateBehavior {
200
263
  }
201
264
  resume() {
202
265
  const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
203
- device.log.info('MatterbridgeOperationalStateServer: resume called setting operational state to Running and currentMode to Cleaning');
266
+ device.log.info('MatterbridgeOperationalStateServer: resume called setting operational state to Running');
204
267
  this.state.operationalState = OperationalState.OperationalStateEnum.Running;
205
268
  this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
206
269
  return {
@@ -218,7 +281,7 @@ class MatterbridgeLevelTemperatureControlServer extends TemperatureControlBehavi
218
281
  }
219
282
  setTemperature(request) {
220
283
  const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
221
- if (request.targetTemperatureLevel && request.targetTemperatureLevel >= 0 && request.targetTemperatureLevel < this.state.supportedTemperatureLevels.length) {
284
+ if (request.targetTemperatureLevel !== undefined && request.targetTemperatureLevel >= 0 && request.targetTemperatureLevel < this.state.supportedTemperatureLevels.length) {
222
285
  device.log.info(`MatterbridgeLevelTemperatureControlServer: setTemperature called setting selectedTemperatureLevel to ${request.targetTemperatureLevel}: ${this.state.supportedTemperatureLevels[request.targetTemperatureLevel]}`);
223
286
  this.state.selectedTemperatureLevel = request.targetTemperatureLevel;
224
287
  }
@@ -234,7 +297,7 @@ class MatterbridgeNumberTemperatureControlServer extends TemperatureControlBehav
234
297
  }
235
298
  setTemperature(request) {
236
299
  const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
237
- if (request.targetTemperature && request.targetTemperature >= this.state.minTemperature && request.targetTemperature <= this.state.maxTemperature) {
300
+ if (request.targetTemperature !== undefined && request.targetTemperature >= this.state.minTemperature && request.targetTemperature <= this.state.maxTemperature) {
238
301
  device.log.info(`MatterbridgeNumberTemperatureControlServer: setTemperature called setting temperatureSetpoint to ${request.targetTemperature}`);
239
302
  this.state.temperatureSetpoint = request.targetTemperature;
240
303
  }
@@ -315,12 +378,21 @@ class DishwasherModeServer extends DishwasherModeBehavior {
315
378
  initialize() {
316
379
  const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
317
380
  device.log.info('DishwasherModeServer initialized: setting currentMode to 3');
318
- this.state.currentMode = 3;
381
+ this.state.currentMode = 2;
382
+ this.reactTo(this.agent.get(MatterbridgeOnOffServer).events.onOff$Changed, this.handleOnOffChange);
383
+ }
384
+ handleOnOffChange(onOff) {
385
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
386
+ if (onOff === false) {
387
+ device.log.info('***OnOffServer changed to OFF: setting Dead Front state to Manufacturer Specific');
388
+ this.state.currentMode = 2;
389
+ }
319
390
  }
320
391
  changeToMode(request) {
321
392
  const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
322
- if (this.state.supportedModes.find((mode) => mode.mode === request.newMode)) {
323
- device.log.info(`DishwasherModeServer: changeToMode called with mode ${request.newMode} = ${this.state.supportedModes[request.newMode].label}`);
393
+ const supportedMode = this.state.supportedModes.find((supportedMode) => supportedMode.mode === request.newMode);
394
+ if (supportedMode) {
395
+ device.log.info(`DishwasherModeServer: changeToMode called with mode ${supportedMode.mode} = ${supportedMode.label}`);
324
396
  this.state.currentMode = request.newMode;
325
397
  return { status: Status.Success, statusText: 'Success' };
326
398
  }
@@ -330,6 +402,35 @@ class DishwasherModeServer extends DishwasherModeBehavior {
330
402
  }
331
403
  }
332
404
  }
405
+ export const LaundryWasherModeBehavior = ClusterBehavior.withInterface().for(LaundryWasherMode.Cluster);
406
+ class LaundryWasherModeServer extends LaundryWasherModeBehavior {
407
+ initialize() {
408
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
409
+ device.log.info('LaundryWasherModeServer initialized: setting currentMode to 3');
410
+ this.state.currentMode = 2;
411
+ this.reactTo(this.agent.get(MatterbridgeOnOffServer).events.onOff$Changed, this.handleOnOffChange);
412
+ }
413
+ handleOnOffChange(onOff) {
414
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
415
+ if (onOff === false) {
416
+ device.log.info('***OnOffServer changed to OFF: setting Dead Front state to Manufacturer Specific');
417
+ this.state.currentMode = 2;
418
+ }
419
+ }
420
+ changeToMode(request) {
421
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
422
+ const supportedMode = this.state.supportedModes.find((supportedMode) => supportedMode.mode === request.newMode);
423
+ if (supportedMode) {
424
+ device.log.info(`LaundryWasherModeServer: changeToMode called with mode ${supportedMode.mode} = ${supportedMode.label}`);
425
+ this.state.currentMode = request.newMode;
426
+ return { status: Status.Success, statusText: 'Success' };
427
+ }
428
+ else {
429
+ device.log.error(`LaundryWasherModeServer: changeToMode called with invalid mode ${request.newMode}`);
430
+ return { status: Status.InvalidCommand, statusText: 'Invalid mode' };
431
+ }
432
+ }
433
+ }
333
434
  if (process.argv.includes('-testRobot')) {
334
435
  const matterbridge = await Matterbridge.loadInstance(false);
335
436
  matterbridge.log = new AnsiLogger({ logName: 'Matterbridge', logTimestampFormat: 4, logLevel: "debug" });
package/dist/platform.js CHANGED
@@ -865,6 +865,12 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
865
865
  await this.registerDevice(laundryWasher);
866
866
  this.bridgedDevices.set(laundryWasher.deviceName ?? '', laundryWasher);
867
867
  }
868
+ const laundryDryer = new Appliances(Appliances.laundryDryer, 'Laundry Dryer', '1235227890');
869
+ this.setSelectDevice(laundryDryer.serialNumber ?? '', laundryDryer.deviceName ?? '', undefined, 'hub');
870
+ if (this.validateDevice(laundryDryer.deviceName ?? '')) {
871
+ await this.registerDevice(laundryDryer);
872
+ this.bridgedDevices.set(laundryDryer.deviceName ?? '', laundryDryer);
873
+ }
868
874
  const dishwasher = new Appliances(Appliances.dishwasher, 'Dishwasher', '0987654321');
869
875
  this.setSelectDevice(dishwasher.serialNumber ?? '', dishwasher.deviceName ?? '', undefined, 'hub');
870
876
  if (this.validateDevice(dishwasher.deviceName ?? '')) {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "1.2.0-edge.3",
3
+ "version": "1.2.0-edge.5",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge-example-dynamic-platform",
9
- "version": "1.2.0-edge.3",
9
+ "version": "1.2.0-edge.5",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "node-ansi-logger": "3.0.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "1.2.0-edge.3",
3
+ "version": "1.2.0-edge.5",
4
4
  "description": "Matterbridge dynamic plugin",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "MIT",