matterbridge-example-dynamic-platform 1.2.4 → 1.2.5-dev-20250625-a228359

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 CHANGED
@@ -1,4 +1,17 @@
1
- # Changelog
1
+ # <img src="https://github.com/Luligu/matterbridge/blob/main/frontend/public/matterbridge%2064x64.png" alt="Matterbridge Logo" width="64px" height="64px">&nbsp;&nbsp;&nbsp;Matterbridge dynamic platform example plugin changelog
2
+
3
+ [![npm version](https://img.shields.io/npm/v/matterbridge-example-dynamic-platform.svg)](https://www.npmjs.com/package/matterbridge-example-dynamic-platform)
4
+ [![npm downloads](https://img.shields.io/npm/dt/matterbridge-example-dynamic-platform.svg)](https://www.npmjs.com/package/matterbridge-example-dynamic-platform)
5
+ [![Docker Version](https://img.shields.io/docker/v/luligu/matterbridge?label=docker%20version&sort=semver)](https://hub.docker.com/r/luligu/matterbridge)
6
+ [![Docker Pulls](https://img.shields.io/docker/pulls/luligu/matterbridge.svg)](https://hub.docker.com/r/luligu/matterbridge)
7
+ ![Node.js CI](https://github.com/Luligu/matterbridge-example-dynamic-platform/actions/workflows/build-matterbridge-plugin.yml/badge.svg)
8
+ ![CodeQL](https://github.com/Luligu/matterbridge-example-dynamic-platform/actions/workflows/codeql.yml/badge.svg)
9
+ [![codecov](https://codecov.io/gh/Luligu/matterbridge-example-dynamic-platform/branch/main/graph/badge.svg)](https://codecov.io/gh/Luligu/matterbridge-example-dynamic-platformr)
10
+
11
+ [![power by](https://img.shields.io/badge/powered%20by-matterbridge-blue)](https://www.npmjs.com/package/matterbridge)
12
+ [![power by](https://img.shields.io/badge/powered%20by-matter--history-blue)](https://www.npmjs.com/package/matter-history)
13
+ [![power by](https://img.shields.io/badge/powered%20by-node--ansi--logger-blue)](https://www.npmjs.com/package/node-ansi-logger)
14
+ [![power by](https://img.shields.io/badge/powered%20by-node--persist--manager-blue)](https://www.npmjs.com/package/node-persist-manager)
2
15
 
3
16
  All notable changes to this project will be documented in this file.
4
17
 
@@ -8,7 +21,33 @@ If you like this project and find it useful, please consider giving it a star on
8
21
  <img src="bmc-button.svg" alt="Buy me a coffee" width="120">
9
22
  </a>
10
23
 
11
- ## [1.2.4] - 2025-06-11
24
+ ## [1.2.5] - 2025-06-25
25
+
26
+ ### Added
27
+
28
+ - [DevContainer]: Added support for the **Matterbridge Dev Container** with an optimized named volume for `node_modules`.
29
+ - [GitHub]: Added GitHub issue templates for bug reports and feature requests.
30
+ - [ESLint]: Refactored the flat config.
31
+ - [ESLint]: Added the plugins `eslint-plugin-promise`, `eslint-plugin-jsdoc`, and `@vitest/eslint-plugin`.
32
+ - [Jest]: Refactored the flat config.
33
+ - [Vitest]: Added Vitest for TypeScript project testing. It will replace Jest, which does not work correctly with ESM module mocks.
34
+ - [JSDoc]: Added missing JSDoc comments, including `@param` and `@returns` tags.
35
+ - [CodeQL]: Added CodeQL badge in the readme.
36
+ - [Codecov]: Added Codecov badge in the readme.
37
+
38
+ ### Changed
39
+
40
+ - [package]: Require matterbridge 3.0.6.
41
+ - [package]: Updated package to Automator v. 2.0.1.
42
+ - [package]: Updated dependencies.
43
+ - [storage]: Bumped `node-storage-manager` to 2.0.0.
44
+ - [logger]: Bumped `node-ansi-logger` to 3.1.1.
45
+
46
+ <a href="https://www.buymeacoffee.com/luligugithub">
47
+ <img src="bmc-button.svg" alt="Buy me a coffee" width="80">
48
+ </a>
49
+
50
+ ## [1.2.4] - 2025-06-13
12
51
 
13
52
  ### Added
14
53
 
package/README.md CHANGED
@@ -5,7 +5,8 @@
5
5
  [![Docker Version](https://img.shields.io/docker/v/luligu/matterbridge?label=docker%20version&sort=semver)](https://hub.docker.com/r/luligu/matterbridge)
6
6
  [![Docker Pulls](https://img.shields.io/docker/pulls/luligu/matterbridge.svg)](https://hub.docker.com/r/luligu/matterbridge)
7
7
  ![Node.js CI](https://github.com/Luligu/matterbridge-example-dynamic-platform/actions/workflows/build-matterbridge-plugin.yml/badge.svg)
8
- ![Coverage](https://img.shields.io/badge/Jest%20coverage-100%25-brightgreen)
8
+ ![CodeQL](https://github.com/Luligu/matterbridge-example-dynamic-platform/actions/workflows/codeql.yml/badge.svg)
9
+ [![codecov](https://codecov.io/gh/Luligu/matterbridge-example-dynamic-platform/branch/main/graph/badge.svg)](https://codecov.io/gh/Luligu/matterbridge-example-dynamic-platformr)
9
10
 
10
11
  [![power by](https://img.shields.io/badge/powered%20by-matterbridge-blue)](https://www.npmjs.com/package/matterbridge)
11
12
  [![power by](https://img.shields.io/badge/powered%20by-matter--history-blue)](https://www.npmjs.com/package/matter-history)
@@ -45,7 +46,7 @@ It exposes 41 virtual devices:
45
46
  - a pumpDevice device
46
47
  - a waterValve device
47
48
  - an airQuality device with all concentration measurements clusters (supported by Apple Home with the concentration measurements from version 18.5)
48
- - a momentary switch
49
+ - a momentary switch composed by three switches (tagged with One Two Three and Top Middle Bottom)
49
50
  - a latching switch
50
51
  - a Robot Vacuum Cleaner device (supported by SmartThings, Alexa, Home Assistant and partially by Apple Home). Read also https://github.com/Luligu/matterbridge/discussions/264.
51
52
  - a onOff Mounted Switch device (supported by SmartThings, Alexa, Home Assistant)
package/dist/platform.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { MatterbridgeEndpoint, MatterbridgeDynamicPlatform, airQualitySensor, bridgedNode, colorTemperatureLight, coverDevice, dimmableLight, doorLockDevice, fanDevice, flowSensor, humiditySensor, onOffLight, onOffOutlet, onOffSwitch, powerSource, rainSensor, smokeCoAlarm, temperatureSensor, thermostatDevice, waterFreezeDetector, waterLeakDetector, airPurifier, pumpDevice, waterValve, genericSwitch, airConditioner, laundryWasher, cooktop, extractorHood, microwaveOven, oven, refrigerator, dishwasher, laundryDryer, onOffMountedSwitch, dimmableMountedSwitch, extendedColorLight, RoboticVacuumCleaner, WaterHeater, Evse, } from 'matterbridge';
2
2
  import { isValidBoolean, isValidNumber } from 'matterbridge/utils';
3
- import { LocationTag } from 'matterbridge/matter';
4
- import { PowerSource, BooleanState, OnOff, LevelControl, AirQuality, CarbonDioxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurement, FlowMeasurement, ColorControl, DoorLock, FanControl, FormaldehydeConcentrationMeasurement, NitrogenDioxideConcentrationMeasurement, OzoneConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm1ConcentrationMeasurement, Pm25ConcentrationMeasurement, RadonConcentrationMeasurement, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, SmokeCoAlarm, TemperatureMeasurement, Thermostat, ThermostatCluster, TotalVolatileOrganicCompoundsConcentrationMeasurement, WindowCovering, EnergyEvseMode, } from 'matterbridge/matter/clusters';
3
+ import { LocationTag, NumberTag, PositionTag } from 'matterbridge/matter';
4
+ import { PowerSource, BooleanState, OnOff, LevelControl, AirQuality, CarbonDioxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurement, FlowMeasurement, ColorControl, DoorLock, FanControl, FormaldehydeConcentrationMeasurement, NitrogenDioxideConcentrationMeasurement, OzoneConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm1ConcentrationMeasurement, Pm25ConcentrationMeasurement, RadonConcentrationMeasurement, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, SmokeCoAlarm, TemperatureMeasurement, Thermostat, ThermostatCluster, TotalVolatileOrganicCompoundsConcentrationMeasurement, WindowCovering, EnergyEvseMode, EnergyEvse, } from 'matterbridge/matter/clusters';
5
5
  import { Appliances } from './appliances.js';
6
6
  export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatform {
7
7
  switch;
@@ -939,11 +939,37 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
939
939
  else {
940
940
  this.airQuality = undefined;
941
941
  }
942
- this.momentarySwitch = new MatterbridgeEndpoint([genericSwitch, bridgedNode, powerSource], { uniqueStorageKey: 'Momentary switch' }, this.config.debug)
943
- .createDefaultBridgedDeviceBasicInformationClusterServer('Momentary switch', 'serial_947942331225', 0xfff1, 'Matterbridge', 'Matterbridge MomentarySwitch', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
942
+ this.momentarySwitch = new MatterbridgeEndpoint([bridgedNode, powerSource], { uniqueStorageKey: 'Momentary switch composed' }, this.config.debug)
943
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Momentary switch (Top-1 Middle-2 Bottom-3)', 'serial_947942331225', 0xfff1, 'Matterbridge', 'Matterbridge MomentarySwitch', parseInt(this.version.replace(/\D/g, '')), this.version === '' ? 'Unknown' : this.version, parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, '')), this.matterbridge.matterbridgeVersion)
944
944
  .createDefaultIdentifyClusterServer()
945
- .createDefaultSwitchClusterServer()
946
945
  .createDefaultPowerSourceReplaceableBatteryClusterServer(50, PowerSource.BatChargeLevel.Ok, 2900, 'CR2450', 1);
946
+ this.momentarySwitch
947
+ .addChildDeviceType('Momentary switch 1', [genericSwitch], {
948
+ tagList: [
949
+ { mfgCode: null, namespaceId: NumberTag.One.namespaceId, tag: NumberTag.One.tag, label: null },
950
+ { mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: null },
951
+ ],
952
+ })
953
+ .createDefaultIdentifyClusterServer()
954
+ .createDefaultSwitchClusterServer();
955
+ this.momentarySwitch
956
+ .addChildDeviceType('Momentary switch 2', [genericSwitch], {
957
+ tagList: [
958
+ { mfgCode: null, namespaceId: NumberTag.Two.namespaceId, tag: NumberTag.Two.tag, label: null },
959
+ { mfgCode: null, namespaceId: PositionTag.Middle.namespaceId, tag: PositionTag.Middle.tag, label: null },
960
+ ],
961
+ })
962
+ .createDefaultIdentifyClusterServer()
963
+ .createDefaultSwitchClusterServer();
964
+ this.momentarySwitch
965
+ .addChildDeviceType('Momentary switch 3', [genericSwitch], {
966
+ tagList: [
967
+ { mfgCode: null, namespaceId: NumberTag.Three.namespaceId, tag: NumberTag.Three.tag, label: null },
968
+ { mfgCode: null, namespaceId: PositionTag.Bottom.namespaceId, tag: PositionTag.Bottom.tag, label: null },
969
+ ],
970
+ })
971
+ .createDefaultIdentifyClusterServer()
972
+ .createDefaultSwitchClusterServer();
947
973
  this.setSelectDevice(this.momentarySwitch.serialNumber ?? '', this.momentarySwitch.deviceName ?? '', undefined, 'hub');
948
974
  if (this.validateDevice(this.momentarySwitch.deviceName ?? '')) {
949
975
  await this.registerDevice(this.momentarySwitch);
@@ -984,7 +1010,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
984
1010
  { label: 'Scheduled', mode: 2, modeTags: [{ value: EnergyEvseMode.ModeTag.TimeOfUse }] },
985
1011
  { label: 'Solar Charging', mode: 3, modeTags: [{ value: EnergyEvseMode.ModeTag.SolarCharging }] },
986
1012
  { label: 'Solar Charging Scheduled', mode: 4, modeTags: [{ value: EnergyEvseMode.ModeTag.SolarCharging }, { value: EnergyEvseMode.ModeTag.TimeOfUse }] },
987
- ]);
1013
+ ], EnergyEvse.State.PluggedInDemand, EnergyEvse.SupplyState.ChargingEnabled, EnergyEvse.FaultState.NoError, 8_000, 32_000);
988
1014
  this.setSelectDevice(this.evse.serialNumber ?? '', this.evse.deviceName ?? '', undefined, 'hub');
989
1015
  if (this.validateDevice(this.evse.deviceName ?? '')) {
990
1016
  await this.registerDevice(this.evse);
@@ -1329,15 +1355,21 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1329
1355
  this.genericSwitchInterval = setInterval(async () => {
1330
1356
  if (this.genericSwitchLastEvent === 'Release') {
1331
1357
  this.genericSwitchLastEvent = 'Single';
1332
- await this.momentarySwitch?.triggerSwitchEvent('Single', this.momentarySwitch?.log);
1358
+ await this.momentarySwitch?.getChildEndpointByName('Momentaryswitch1')?.triggerSwitchEvent('Single', this.momentarySwitch?.log);
1359
+ await this.momentarySwitch?.getChildEndpointByName('Momentaryswitch2')?.triggerSwitchEvent('Double', this.momentarySwitch?.log);
1360
+ await this.momentarySwitch?.getChildEndpointByName('Momentaryswitch3')?.triggerSwitchEvent('Long', this.momentarySwitch?.log);
1333
1361
  }
1334
1362
  else if (this.genericSwitchLastEvent === 'Single') {
1335
1363
  this.genericSwitchLastEvent = 'Double';
1336
- await this.momentarySwitch?.triggerSwitchEvent('Double', this.momentarySwitch?.log);
1364
+ await this.momentarySwitch?.getChildEndpointByName('Momentaryswitch1')?.triggerSwitchEvent('Double', this.momentarySwitch?.log);
1365
+ await this.momentarySwitch?.getChildEndpointByName('Momentaryswitch2')?.triggerSwitchEvent('Long', this.momentarySwitch?.log);
1366
+ await this.momentarySwitch?.getChildEndpointByName('Momentaryswitch3')?.triggerSwitchEvent('Single', this.momentarySwitch?.log);
1337
1367
  }
1338
1368
  else if (this.genericSwitchLastEvent === 'Double') {
1339
1369
  this.genericSwitchLastEvent = 'Long';
1340
- await this.momentarySwitch?.triggerSwitchEvent('Long', this.momentarySwitch?.log);
1370
+ await this.momentarySwitch?.getChildEndpointByName('Momentaryswitch1')?.triggerSwitchEvent('Long', this.momentarySwitch?.log);
1371
+ await this.momentarySwitch?.getChildEndpointByName('Momentaryswitch2')?.triggerSwitchEvent('Single', this.momentarySwitch?.log);
1372
+ await this.momentarySwitch?.getChildEndpointByName('Momentaryswitch3')?.triggerSwitchEvent('Double', this.momentarySwitch?.log);
1341
1373
  }
1342
1374
  else if (this.genericSwitchLastEvent === 'Long') {
1343
1375
  this.genericSwitchLastEvent = 'Press';
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "1.2.4",
3
+ "version": "1.2.5-dev-20250625-a228359",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge-example-dynamic-platform",
9
- "version": "1.2.4",
10
- "license": "MIT",
9
+ "version": "1.2.5-dev-20250625-a228359",
10
+ "license": "Apache-2.0",
11
11
  "dependencies": {
12
- "node-ansi-logger": "3.0.1",
13
- "node-persist-manager": "1.0.8"
12
+ "node-ansi-logger": "3.1.1",
13
+ "node-persist-manager": "2.0.0"
14
14
  },
15
15
  "engines": {
16
- "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0"
16
+ "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
17
17
  },
18
18
  "funding": {
19
19
  "type": "buymeacoffee",
@@ -21,12 +21,13 @@
21
21
  }
22
22
  },
23
23
  "node_modules/node-ansi-logger": {
24
- "version": "3.0.1",
25
- "resolved": "https://registry.npmjs.org/node-ansi-logger/-/node-ansi-logger-3.0.1.tgz",
26
- "integrity": "sha512-Nx7nkO6Sby8Eti1UFFdff3gImEC35izuvf+aRFh3mrDZ8hgXM/cZdflkpDMnDdxnabYl91LVi4RhB/dm5Yk9iA==",
27
- "license": "MIT",
24
+ "version": "3.1.1",
25
+ "resolved": "https://registry.npmjs.org/node-ansi-logger/-/node-ansi-logger-3.1.1.tgz",
26
+ "integrity": "sha512-tFeCSxwiRg5XaNda5nC27alzraZP76nLtUk1JDZqb9byhW4WYaSGL7/lmxFHEI16gypQDMEYljuF+wcG+cPPHw==",
27
+ "hasShrinkwrap": true,
28
+ "license": "Apache-2.0",
28
29
  "engines": {
29
- "node": ">=18.0.0"
30
+ "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
30
31
  },
31
32
  "funding": {
32
33
  "type": "buymeacoffee",
@@ -46,15 +47,15 @@
46
47
  }
47
48
  },
48
49
  "node_modules/node-persist-manager": {
49
- "version": "1.0.8",
50
- "resolved": "https://registry.npmjs.org/node-persist-manager/-/node-persist-manager-1.0.8.tgz",
51
- "integrity": "sha512-J0wjdxOloD6aw4s2kljbV3nvHfguWph8LnfmTL+6MZiBsh46wjaIaZd/cHU0HWonrNfktCv7Zuvn0sEH0f2s+A==",
50
+ "version": "2.0.0",
51
+ "resolved": "https://registry.npmjs.org/node-persist-manager/-/node-persist-manager-2.0.0.tgz",
52
+ "integrity": "sha512-jpgOqCCn4ZEnIr4WcvqkyyGmmLJarV6aUyBlDQdG1G84X9UUmOmI1W2OZtc9K0z375CYWhjtGEXaY7GXNiEOfA==",
52
53
  "license": "MIT",
53
54
  "dependencies": {
54
- "node-persist": "^4.0.2"
55
+ "node-persist": "4.0.4"
55
56
  },
56
57
  "engines": {
57
- "node": ">=18.0.0"
58
+ "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
58
59
  },
59
60
  "funding": {
60
61
  "type": "buymeacoffee",
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "1.2.4",
3
+ "version": "1.2.5-dev-20250625-a228359",
4
4
  "description": "Matterbridge dynamic plugin",
5
5
  "author": "https://github.com/Luligu",
6
- "license": "MIT",
6
+ "license": "Apache-2.0",
7
7
  "homepage": "https://www.npmjs.com/package/matterbridge-example-dynamic-platform",
8
8
  "type": "module",
9
9
  "main": "dist/index.js",
@@ -31,10 +31,10 @@
31
31
  "virtual devices"
32
32
  ],
33
33
  "engines": {
34
- "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0"
34
+ "node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
35
35
  },
36
36
  "dependencies": {
37
- "node-ansi-logger": "3.0.1",
38
- "node-persist-manager": "1.0.8"
37
+ "node-ansi-logger": "3.1.1",
38
+ "node-persist-manager": "2.0.0"
39
39
  }
40
40
  }
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- // enable isolatedModules just for ts-jest
5
- "isolatedModules": true
6
- },
7
- "include": ["**/*.spec.ts", "**/*.test.ts", "**/__test__/*"]
8
- }