matterbridge-example-dynamic-platform 1.2.0-edge.10 → 1.2.0-edge.11

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,13 +1,14 @@
1
- import { MatterbridgeEndpoint, MatterbridgeServer, MatterbridgeOnOffServer, RefrigeratorTag, PositionTag, laundryWasher, laundryDryer, dishwasher, refrigerator, temperatureControlledCabinetCooler, oven, temperatureControlledCabinetHeater, microwaveOven, extractorHood, cooktop, cookSurface, } from 'matterbridge';
1
+ import { MatterbridgeEndpoint, MatterbridgeServer, MatterbridgeOnOffServer, RefrigeratorTag, PositionTag, laundryWasher, laundryDryer, dishwasher, refrigerator, temperatureControlledCabinetCooler, oven, temperatureControlledCabinetHeater, microwaveOven, extractorHood, cooktop, cookSurface, powerSource, } from 'matterbridge';
2
2
  import { ClusterBehavior } from 'matterbridge/matter';
3
3
  import { OperationalState, TemperatureControl, DishwasherMode, LaundryWasherControls, LaundryWasherMode, LaundryDryerControls, OvenMode, ModeBase, RefrigeratorAndTemperatureControlledCabinetMode, MicrowaveOvenMode, MicrowaveOvenControl, OvenCavityOperationalState, } from 'matterbridge/matter/clusters';
4
4
  import { DishwasherAlarmServer, LaundryDryerControlsServer, LaundryWasherControlsServer, MicrowaveOvenControlBehavior, MicrowaveOvenModeServer, OperationalStateBehavior, TemperatureControlBehavior, } from 'matterbridge/matter/behaviors';
5
5
  export class Appliances extends MatterbridgeEndpoint {
6
6
  constructor(deviceType, name, serial) {
7
- super(deviceType, { uniqueStorageKey: `${name}-${serial}` }, true);
7
+ super([deviceType, powerSource], { uniqueStorageKey: `${name}-${serial}` }, true);
8
8
  if (deviceType.code === laundryWasher.code) {
9
9
  this.createDefaultIdentifyClusterServer();
10
10
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Laundry Washer');
11
+ this.createDefaultPowerSourceWiredClusterServer();
11
12
  this.createDeadFrontOnOffClusterServer();
12
13
  this.createLevelTemperatureControlClusterServer(3, ['Cold', '30°', '40°', '60°', '80°']);
13
14
  this.createDefaultLaundryWasherModeClusterServer();
@@ -17,6 +18,7 @@ export class Appliances extends MatterbridgeEndpoint {
17
18
  else if (deviceType.code === laundryDryer.code) {
18
19
  this.createDefaultIdentifyClusterServer();
19
20
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Laundry Dryer');
21
+ this.createDefaultPowerSourceWiredClusterServer();
20
22
  this.createDeadFrontOnOffClusterServer();
21
23
  this.createLevelTemperatureControlClusterServer(3, ['Cold', '30°', '40°', '60°', '80°']);
22
24
  this.createDefaultLaundryWasherModeClusterServer();
@@ -26,6 +28,7 @@ export class Appliances extends MatterbridgeEndpoint {
26
28
  else if (deviceType.code === dishwasher.code) {
27
29
  this.createDefaultIdentifyClusterServer();
28
30
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Dishwasher');
31
+ this.createDefaultPowerSourceWiredClusterServer();
29
32
  this.createDeadFrontOnOffClusterServer();
30
33
  this.createLevelTemperatureControlClusterServer(1, ['Cold', '30°', '40°', '60°']);
31
34
  this.createDefaultDishwasherModeClusterServer();
@@ -35,6 +38,7 @@ export class Appliances extends MatterbridgeEndpoint {
35
38
  else if (deviceType.name === refrigerator.name) {
36
39
  this.createDefaultIdentifyClusterServer();
37
40
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Refrigerator');
41
+ this.createDefaultPowerSourceWiredClusterServer();
38
42
  const refrigerator = this.addChildDeviceType('Refrigerator', temperatureControlledCabinetCooler, { tagList: [{ mfgCode: null, namespaceId: RefrigeratorTag.Refrigerator.namespaceId, tag: RefrigeratorTag.Refrigerator.tag, label: RefrigeratorTag.Refrigerator.label }] }, true);
39
43
  refrigerator.log.logName = `Refrigerator (cabinet Refrigerator)`;
40
44
  refrigerator.createDefaultIdentifyClusterServer();
@@ -51,6 +55,7 @@ export class Appliances extends MatterbridgeEndpoint {
51
55
  else if (deviceType.name === oven.name) {
52
56
  this.createDefaultIdentifyClusterServer();
53
57
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Oven');
58
+ this.createDefaultPowerSourceWiredClusterServer();
54
59
  const cabinettop = this.addChildDeviceType('Oven (top)', temperatureControlledCabinetHeater, { tagList: [{ mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: PositionTag.Top.label }] }, true);
55
60
  cabinettop.log.logName = `Oven (top)`;
56
61
  cabinettop.createDefaultIdentifyClusterServer();
@@ -67,6 +72,7 @@ export class Appliances extends MatterbridgeEndpoint {
67
72
  else if (deviceType.name === microwaveOven.name) {
68
73
  this.createDefaultIdentifyClusterServer();
69
74
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Microwave Oven');
75
+ this.createDefaultPowerSourceWiredClusterServer();
70
76
  this.createDefaultOperationalStateClusterServer(OperationalState.OperationalStateEnum.Stopped);
71
77
  this.createDefaultMicrowaveOvenModeClusterServer();
72
78
  this.createDefaultMicrowaveOvenControlClusterServer();
@@ -74,6 +80,7 @@ export class Appliances extends MatterbridgeEndpoint {
74
80
  else if (deviceType.name === extractorHood.name) {
75
81
  this.createDefaultIdentifyClusterServer();
76
82
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Extractor Hood');
83
+ this.createDefaultPowerSourceWiredClusterServer();
77
84
  this.createBaseFanControlClusterServer();
78
85
  this.createDefaultHepaFilterMonitoringClusterServer();
79
86
  this.createDefaultActivatedCarbonFilterMonitoringClusterServer();
@@ -81,6 +88,7 @@ export class Appliances extends MatterbridgeEndpoint {
81
88
  else if (deviceType.name === cooktop.name) {
82
89
  this.createDefaultIdentifyClusterServer();
83
90
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Cooktop');
91
+ this.createDefaultPowerSourceWiredClusterServer();
84
92
  this.createOffOnlyOnOffClusterServer(true);
85
93
  const cookSurface1 = this.addChildDeviceType('Surface 1', cookSurface, { tagList: [{ mfgCode: null, namespaceId: PositionTag.Left.namespaceId, tag: PositionTag.Left.tag, label: PositionTag.Left.label }] }, true);
86
94
  cookSurface1.log.logName = `Cook surface (right)`;
package/dist/platform.js CHANGED
@@ -738,8 +738,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
738
738
  this.valve?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
739
739
  this.valve?.log.info(`Command identify called identifyTime:${identifyTime}`);
740
740
  });
741
- this.fan = new MatterbridgeEndpoint([fanDevice, bridgedNode], { uniqueStorageKey: 'Fan' }, this.config.debug)
741
+ this.fan = new MatterbridgeEndpoint([fanDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Fan' }, this.config.debug)
742
742
  .createDefaultBridgedDeviceBasicInformationClusterServer('Fan', 'serial_980545631228', 0xfff1, 'Matterbridge', 'Matterbridge Fan', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
743
+ .createDefaultPowerSourceWiredClusterServer()
743
744
  .addRequiredClusterServers();
744
745
  this.setSelectDevice(this.fan.serialNumber ?? '', this.fan.deviceName ?? '', undefined, 'hub');
745
746
  if (this.validateDevice(this.fan.deviceName ?? '')) {
@@ -786,8 +787,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
786
787
  if (isValidNumber(newValue, 0, 100))
787
788
  await this.fan?.setAttribute(FanControl.Cluster.id, 'speedCurrent', newValue, this.fan?.log);
788
789
  }, this.fan.log);
789
- this.waterLeak = new MatterbridgeEndpoint([waterLeakDetector, bridgedNode], { uniqueStorageKey: 'Water leak detector' }, this.config.debug)
790
+ this.waterLeak = new MatterbridgeEndpoint([waterLeakDetector, bridgedNode, powerSource], { uniqueStorageKey: 'Water leak detector' }, this.config.debug)
790
791
  .createDefaultBridgedDeviceBasicInformationClusterServer('Water leak detector', 'serial_98745631222', 0xfff1, 'Matterbridge', 'Matterbridge WaterLeakDetector', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
792
+ .createDefaultPowerSourceRechargeableBatteryClusterServer()
791
793
  .createDefaultBooleanStateClusterServer(false)
792
794
  .addRequiredClusterServers()
793
795
  .addOptionalClusterServers();
@@ -799,8 +801,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
799
801
  else {
800
802
  this.waterLeak = undefined;
801
803
  }
802
- this.waterFreeze = new MatterbridgeEndpoint([waterFreezeDetector, bridgedNode], { uniqueStorageKey: 'Water freeze detector' }, this.config.debug)
804
+ this.waterFreeze = new MatterbridgeEndpoint([waterFreezeDetector, bridgedNode, powerSource], { uniqueStorageKey: 'Water freeze detector' }, this.config.debug)
803
805
  .createDefaultBridgedDeviceBasicInformationClusterServer('Water freeze detector', 'serial_98745631223', 0xfff1, 'Matterbridge', 'Matterbridge WaterFreezeDetector', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
806
+ .createDefaultPowerSourceRechargeableBatteryClusterServer()
804
807
  .createDefaultBooleanStateClusterServer(false)
805
808
  .addRequiredClusterServers()
806
809
  .addOptionalClusterServers();
@@ -812,8 +815,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
812
815
  else {
813
816
  this.waterFreeze = undefined;
814
817
  }
815
- this.rain = new MatterbridgeEndpoint([rainSensor, bridgedNode], { uniqueStorageKey: 'Rain sensor' }, this.config.debug)
818
+ this.rain = new MatterbridgeEndpoint([rainSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Rain sensor' }, this.config.debug)
816
819
  .createDefaultBridgedDeviceBasicInformationClusterServer('Rain sensor', 'serial_98745631224', 0xfff1, 'Matterbridge', 'Matterbridge RainSensor', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
820
+ .createDefaultPowerSourceRechargeableBatteryClusterServer()
817
821
  .createDefaultIdentifyClusterServer()
818
822
  .createDefaultBooleanStateClusterServer(false)
819
823
  .createDefaultBooleanStateConfigurationClusterServer();
@@ -825,10 +829,11 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
825
829
  else {
826
830
  this.rain = undefined;
827
831
  }
828
- this.smokeCo = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode], { uniqueStorageKey: 'SmokeCo alarm sensor' }, this.config.debug)
832
+ this.smokeCo = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode, powerSource], { uniqueStorageKey: 'SmokeCo alarm sensor' }, this.config.debug)
829
833
  .createDefaultBridgedDeviceBasicInformationClusterServer('SmokeCo alarm sensor', 'serial_94745631225', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
830
834
  .createDefaultIdentifyClusterServer()
831
- .createDefaultSmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal, SmokeCoAlarm.AlarmState.Normal);
835
+ .createDefaultSmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal, SmokeCoAlarm.AlarmState.Normal)
836
+ .createDefaultPowerSourceReplaceableBatteryClusterServer();
832
837
  if (this.config.enableConcentrationMeasurements === true)
833
838
  this.smokeCo.createDefaultCarbonMonoxideConcentrationMeasurementClusterServer(100);
834
839
  this.setSelectDevice(this.smokeCo.serialNumber ?? '', this.smokeCo.deviceName ?? '', undefined, 'hub');
@@ -839,10 +844,11 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
839
844
  else {
840
845
  this.smokeCo = undefined;
841
846
  }
842
- this.smokeOnly = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode], { uniqueStorageKey: 'Smoke only SmokeCo alarm sensor' }, this.config.debug)
843
- .createDefaultBridgedDeviceBasicInformationClusterServer('Smoke only SmokeCo alarm sensor', 'serial_94755661225', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
847
+ this.smokeOnly = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode, powerSource], { uniqueStorageKey: 'Smoke alarm sensor' }, this.config.debug)
848
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Smoke alarm sensor', 'serial_94755661225', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
844
849
  .createDefaultIdentifyClusterServer()
845
- .createSmokeOnlySmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal);
850
+ .createSmokeOnlySmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal)
851
+ .createDefaultPowerSourceReplaceableBatteryClusterServer();
846
852
  this.setSelectDevice(this.smokeOnly.serialNumber ?? '', this.smokeOnly.deviceName ?? '', undefined, 'hub');
847
853
  if (this.validateDevice(this.smokeOnly.deviceName ?? '')) {
848
854
  await this.registerDevice(this.smokeOnly);
@@ -851,10 +857,11 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
851
857
  else {
852
858
  this.smokeOnly = undefined;
853
859
  }
854
- this.coOnly = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode], { uniqueStorageKey: 'Co only SmokeCo alarm sensor' }, this.config.debug)
855
- .createDefaultBridgedDeviceBasicInformationClusterServer('Co only SmokeCo alarm sensor', 'serial_947456317488', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
860
+ this.coOnly = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode, powerSource], { uniqueStorageKey: 'Co alarm sensor' }, this.config.debug)
861
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Co alarm sensor', 'serial_947456317488', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
856
862
  .createDefaultIdentifyClusterServer()
857
- .createCoOnlySmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal);
863
+ .createCoOnlySmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal)
864
+ .createDefaultPowerSourceReplaceableBatteryClusterServer();
858
865
  if (this.config.enableConcentrationMeasurements === true)
859
866
  this.coOnly.createDefaultCarbonMonoxideConcentrationMeasurementClusterServer(100);
860
867
  this.setSelectDevice(this.coOnly.serialNumber ?? '', this.coOnly.deviceName ?? '', undefined, 'hub');
@@ -865,8 +872,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
865
872
  else {
866
873
  this.coOnly = undefined;
867
874
  }
868
- this.airQuality = new MatterbridgeEndpoint([airQualitySensor, bridgedNode], { uniqueStorageKey: 'Air quality sensor' }, this.config.debug)
875
+ this.airQuality = new MatterbridgeEndpoint([airQualitySensor, bridgedNode, powerSource], { uniqueStorageKey: 'Air quality sensor' }, this.config.debug)
869
876
  .createDefaultBridgedDeviceBasicInformationClusterServer('Air quality sensor', 'serial_987484318322', 0xfff1, 'Matterbridge', 'Matterbridge Air Quality Sensor', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
877
+ .createDefaultPowerSourceReplaceableBatteryClusterServer(50, PowerSource.BatChargeLevel.Warning, 2900, 'CR2450', 1)
870
878
  .addRequiredClusterServers()
871
879
  .addClusterServers([TemperatureMeasurement.Cluster.id, RelativeHumidityMeasurement.Cluster.id]);
872
880
  if (this.config.enableConcentrationMeasurements === true) {
@@ -940,12 +948,14 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
940
948
  this.bridgedDevices.set(dishwasherDevice.deviceName ?? '', dishwasherDevice);
941
949
  }
942
950
  const refrigeratorDevice = new Appliances(refrigerator, 'Refrigerator', '9987654322');
951
+ refrigeratorDevice.addFixedLabel('composed', 'Refrigerator');
943
952
  this.setSelectDevice(refrigeratorDevice.serialNumber ?? '', refrigeratorDevice.deviceName ?? '', undefined, 'hub');
944
953
  if (this.validateDevice(refrigeratorDevice.deviceName ?? '')) {
945
954
  await this.registerDevice(refrigeratorDevice);
946
955
  this.bridgedDevices.set(refrigeratorDevice.deviceName ?? '', refrigeratorDevice);
947
956
  }
948
957
  const ovenDevice = new Appliances(oven, 'Oven', '1298867891');
958
+ ovenDevice.addFixedLabel('composed', 'Oven');
949
959
  this.setSelectDevice(ovenDevice.serialNumber ?? '', ovenDevice.deviceName ?? '', undefined, 'hub');
950
960
  if (this.validateDevice(ovenDevice.deviceName ?? '')) {
951
961
  await this.registerDevice(ovenDevice);
@@ -973,7 +983,6 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
973
983
  async onConfigure() {
974
984
  await super.onConfigure();
975
985
  this.log.info('onConfigure called');
976
- this.log.notice('<iframe width="500" height="500" src="https://www.youtube.com/embed/DLzxrzFCyOs?hl=en_US&version=3&rel=0&autoplay=1" frameborder="1" allowfullscreen></iframe>');
977
986
  await this.switch?.setAttribute(OnOff.Cluster.id, 'onOff', this.intervalOnOff, this.switch.log);
978
987
  await this.mountedOnOffSwitch?.setAttribute(OnOff.Cluster.id, 'onOff', this.intervalOnOff, this.mountedOnOffSwitch.log);
979
988
  this.switch?.log.info(`Set switch initial onOff to ${this.intervalOnOff}`);
@@ -40,7 +40,7 @@
40
40
  "default": true
41
41
  },
42
42
  "enableConcentrationMeasurements": {
43
- "description": "Enable the ConcentrationMeasurements in the Air Quality device and SmokeCoSensor devices (Apple Home 18.4 will discard these devices when enabled)",
43
+ "description": "Enable the ConcentrationMeasurements in the Air Quality device and SmokeCoSensor device (Apple Home 18.4 will discard these devices when enabled)",
44
44
  "type": "boolean",
45
45
  "default": true
46
46
  },
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "1.2.0-edge.10",
3
+ "version": "1.2.0-edge.11",
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.10",
9
+ "version": "1.2.0-edge.11",
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.10",
3
+ "version": "1.2.0-edge.11",
4
4
  "description": "Matterbridge dynamic plugin",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "MIT",