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.
- package/dist/appliances.js +116 -15
- package/dist/platform.js +6 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/dist/appliances.js
CHANGED
@@ -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.
|
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.
|
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
|
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
|
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
|
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
|
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
|
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 =
|
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
|
-
|
323
|
-
|
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 ?? '')) {
|
package/npm-shrinkwrap.json
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
{
|
2
2
|
"name": "matterbridge-example-dynamic-platform",
|
3
|
-
"version": "1.2.0-edge.
|
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.
|
9
|
+
"version": "1.2.0-edge.5",
|
10
10
|
"license": "MIT",
|
11
11
|
"dependencies": {
|
12
12
|
"node-ansi-logger": "3.0.1",
|