matterbridge 3.1.1-dev-20250629-cfe9124 → 3.1.1-dev-20250630-1555eae

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
@@ -10,15 +10,17 @@ If you like this project and find it useful, please consider giving it a star on
10
10
 
11
11
  ## [3.1.1] - 2025-07-??
12
12
 
13
- ### Breaking Changes
13
+ ### Development Breaking Changes
14
14
 
15
15
  - [devices]: The single devices (i.e. Rvc, Evse etc...) are only exported from matterbridge/devices. Please update your imports to use the new export path. Refer to the [documentation](README-DEV.md) for details on imports.
16
16
 
17
17
  ### Added
18
18
 
19
- - [SolarPower]: Added SolarPower class and Jest test. Thanks Ludovic BOUÉ.
20
- - [BatteryStorage]: Added BatteryStorage class and Jest test. Thanks Ludovic BOUÉ.
19
+ - [LaundryDryer]: Added LaundryDryer (not supported by the Home app) class and Jest test.
21
20
  - [DeviceEnergyManagement]: Added MatterbridgeDeviceEnergyManagementServer with power adjustment methods.
21
+ - [SolarPower]: Added SolarPower class and Jest test (working on Home Assistant and SmartThings). Thanks Ludovic BOUÉ.
22
+ - [BatteryStorage]: Added BatteryStorage class and Jest test (working on Home Assistant and SmartThings). Thanks Ludovic BOUÉ.
23
+ - [HeatPump]: Added HeatPump class and Jest test (working on Home Assistant and SmartThings).
22
24
 
23
25
  ### Changed
24
26
 
@@ -5,20 +5,24 @@ import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
5
5
  import { deviceEnergyManagement, electricalSensor, batteryStorage, powerSource } from './matterbridgeDeviceTypes.js';
6
6
  export class BatteryStorage extends MatterbridgeEndpoint {
7
7
  constructor(name, serial, batPercentRemaining = 100, batChargeLevel = PowerSource.BatChargeLevel.Ok, voltage = null, current = null, power = null, energyImported = null, energyExported = null, absMinPower = 0, absMaxPower = 0) {
8
- super([batteryStorage, powerSource, electricalSensor, deviceEnergyManagement], {
9
- tagList: [
10
- { mfgCode: null, namespaceId: PowerSourceTag.Battery.namespaceId, tag: PowerSourceTag.Battery.tag, label: null },
11
- { mfgCode: null, namespaceId: PowerSourceTag.Grid.namespaceId, tag: PowerSourceTag.Grid.tag, label: null },
12
- ],
13
- id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
14
- }, true);
8
+ super([batteryStorage, powerSource, electricalSensor, deviceEnergyManagement], { id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
15
9
  this.createDefaultIdentifyClusterServer()
16
10
  .createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Solar Power')
17
- .createDefaultPowerSourceWiredBatteryClusterServer(batPercentRemaining, batChargeLevel)
18
11
  .createDefaultPowerTopologyClusterServer()
19
12
  .createDefaultElectricalPowerMeasurementClusterServer(voltage, current, power)
20
13
  .createDefaultElectricalEnergyMeasurementClusterServer(energyImported, energyExported)
21
14
  .createDefaultDeviceEnergyManagementClusterServer(DeviceEnergyManagement.EsaType.BatteryStorage, true, DeviceEnergyManagement.EsaState.Online, absMinPower, absMaxPower)
15
+ .createDefaultDeviceEnergyManagementModeClusterServer()
16
+ .addRequiredClusterServers();
17
+ this.addChildDeviceType('BatteryPowerSource', powerSource, {
18
+ tagList: [{ mfgCode: null, namespaceId: PowerSourceTag.Battery.namespaceId, tag: PowerSourceTag.Battery.tag, label: null }],
19
+ })
20
+ .createDefaultPowerSourceRechargeableBatteryClusterServer(batPercentRemaining, batChargeLevel)
21
+ .addRequiredClusterServers();
22
+ this.addChildDeviceType('GridPowerSource', powerSource, {
23
+ tagList: [{ mfgCode: null, namespaceId: PowerSourceTag.Grid.namespaceId, tag: PowerSourceTag.Grid.tag, label: null }],
24
+ })
25
+ .createDefaultPowerSourceWiredClusterServer()
22
26
  .addRequiredClusterServers();
23
27
  }
24
28
  }
@@ -1,5 +1,6 @@
1
1
  export * from '../roboticVacuumCleaner.js';
2
2
  export * from '../laundryWasher.js';
3
+ export * from '../laundryDryer.js';
3
4
  export * from '../waterHeater.js';
4
5
  export * from '../evse.js';
5
6
  export * from '../solarPower.js';
package/dist/evse.js CHANGED
@@ -16,6 +16,7 @@ export class Evse extends MatterbridgeEndpoint {
16
16
  .createDefaultElectricalPowerMeasurementClusterServer()
17
17
  .createDefaultElectricalEnergyMeasurementClusterServer()
18
18
  .createDefaultDeviceEnergyManagementClusterServer(DeviceEnergyManagement.EsaType.Evse, false, DeviceEnergyManagement.EsaState.Online, absMinPower, absMaxPower)
19
+ .createDefaultDeviceEnergyManagementModeClusterServer()
19
20
  .createDefaultEnergyEvseClusterServer(state, supplyState, faultState)
20
21
  .createDefaultEnergyEvseModeClusterServer(currentMode, supportedModes)
21
22
  .addRequiredClusterServers();
@@ -0,0 +1,21 @@
1
+ import { PowerSourceTag } from '@matter/main';
2
+ import { DeviceEnergyManagement } from '@matter/main/clusters/device-energy-management';
3
+ import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
4
+ import { deviceEnergyManagement, electricalSensor, powerSource, heatPump } from './matterbridgeDeviceTypes.js';
5
+ export class HeatPump extends MatterbridgeEndpoint {
6
+ constructor(name, serial, voltage = null, current = null, power = null, energyImported = null, absMinPower = 0, absMaxPower = 0) {
7
+ super([heatPump, powerSource, electricalSensor, deviceEnergyManagement], {
8
+ tagList: [{ mfgCode: null, namespaceId: PowerSourceTag.Grid.namespaceId, tag: PowerSourceTag.Grid.tag, label: null }],
9
+ id: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}`,
10
+ }, true);
11
+ this.createDefaultIdentifyClusterServer()
12
+ .createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Heat Pump')
13
+ .createDefaultPowerSourceWiredClusterServer()
14
+ .createDefaultPowerTopologyClusterServer()
15
+ .createDefaultElectricalPowerMeasurementClusterServer(voltage, current, power)
16
+ .createDefaultElectricalEnergyMeasurementClusterServer(energyImported)
17
+ .createDefaultDeviceEnergyManagementClusterServer(DeviceEnergyManagement.EsaType.Other, true, DeviceEnergyManagement.EsaState.Online, absMinPower, absMaxPower)
18
+ .createDefaultDeviceEnergyManagementModeClusterServer()
19
+ .addRequiredClusterServers();
20
+ }
21
+ }
@@ -0,0 +1,58 @@
1
+ import { LaundryWasherMode } from '@matter/main/clusters/laundry-washer-mode';
2
+ import { TemperatureControl } from '@matter/main/clusters/temperature-control';
3
+ import { LaundryDryerControls } from '@matter/main/clusters/laundry-dryer-controls';
4
+ import { LaundryDryerControlsServer } from '@matter/main/behaviors/laundry-dryer-controls';
5
+ import { laundryDryer, powerSource } from './matterbridgeDeviceTypes.js';
6
+ import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
7
+ import { MatterbridgeLaundryWasherModeServer, MatterbridgeLevelTemperatureControlServer, MatterbridgeNumberTemperatureControlServer } from './laundryWasher.js';
8
+ export class LaundryDryer extends MatterbridgeEndpoint {
9
+ constructor(name, serial, currentMode, supportedModes, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
10
+ super([laundryDryer, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
11
+ this.createDefaultIdentifyClusterServer();
12
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Laundry Dryer');
13
+ this.createDefaultPowerSourceWiredClusterServer();
14
+ this.createDeadFrontOnOffClusterServer(true);
15
+ this.createDefaultLaundryWasherModeClusterServer(currentMode, supportedModes);
16
+ this.createDefaultLaundryDryerControlsClusterServer(1);
17
+ if (temperatureSetpoint)
18
+ this.createNumberTemperatureControlClusterServer(temperatureSetpoint, minTemperature, maxTemperature, step);
19
+ else
20
+ this.createLevelTemperatureControlClusterServer(selectedTemperatureLevel, supportedTemperatureLevels);
21
+ this.createDefaultOperationalStateClusterServer(operationalState);
22
+ }
23
+ createDefaultLaundryWasherModeClusterServer(currentMode = 2, supportedModes = [
24
+ { label: 'Delicate', mode: 1, modeTags: [{ value: LaundryWasherMode.ModeTag.Delicate }] },
25
+ { label: 'Normal', mode: 2, modeTags: [{ value: LaundryWasherMode.ModeTag.Normal }] },
26
+ { label: 'Heavy', mode: 3, modeTags: [{ value: LaundryWasherMode.ModeTag.Heavy }] },
27
+ { label: 'Whites', mode: 4, modeTags: [{ value: LaundryWasherMode.ModeTag.Whites }] },
28
+ ]) {
29
+ this.behaviors.require(MatterbridgeLaundryWasherModeServer, {
30
+ supportedModes,
31
+ currentMode,
32
+ });
33
+ return this;
34
+ }
35
+ createDefaultLaundryDryerControlsClusterServer(selectedDrynessLevel, supportedDrynessLevels) {
36
+ this.behaviors.require(LaundryDryerControlsServer, {
37
+ supportedDrynessLevels: supportedDrynessLevels ?? [LaundryDryerControls.DrynessLevel.Low, LaundryDryerControls.DrynessLevel.Normal, LaundryDryerControls.DrynessLevel.Extra, LaundryDryerControls.DrynessLevel.Max],
38
+ selectedDrynessLevel,
39
+ });
40
+ return this;
41
+ }
42
+ createLevelTemperatureControlClusterServer(selectedTemperatureLevel = 1, supportedTemperatureLevels = ['Cold', 'Warm', 'Hot', '30°', '40°', '60°', '80°']) {
43
+ this.behaviors.require(MatterbridgeLevelTemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel), {
44
+ selectedTemperatureLevel,
45
+ supportedTemperatureLevels,
46
+ });
47
+ return this;
48
+ }
49
+ createNumberTemperatureControlClusterServer(temperatureSetpoint = 40 * 100, minTemperature = 30 * 100, maxTemperature = 60 * 100, step = 10 * 100) {
50
+ this.behaviors.require(MatterbridgeNumberTemperatureControlServer.with(TemperatureControl.Feature.TemperatureNumber, TemperatureControl.Feature.TemperatureStep), {
51
+ temperatureSetpoint,
52
+ minTemperature,
53
+ maxTemperature,
54
+ step,
55
+ });
56
+ return this;
57
+ }
58
+ }
@@ -5,12 +5,12 @@ import { ModeBase } from '@matter/main/clusters/mode-base';
5
5
  import { TemperatureControlServer } from '@matter/main/behaviors/temperature-control';
6
6
  import { LaundryWasherModeServer } from '@matter/main/behaviors/laundry-washer-mode';
7
7
  import { LaundryWasherControlsServer } from '@matter/main/behaviors/laundry-washer-controls';
8
- import { laundryWasher } from './matterbridgeDeviceTypes.js';
8
+ import { laundryWasher, powerSource } from './matterbridgeDeviceTypes.js';
9
9
  import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
10
10
  import { MatterbridgeOnOffServer, MatterbridgeServer } from './matterbridgeBehaviors.js';
11
11
  export class LaundryWasher extends MatterbridgeEndpoint {
12
12
  constructor(name, serial, currentMode, supportedModes, spinSpeedCurrent, spinSpeeds, numberOfRinses, supportedRinses, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
13
- super(laundryWasher, { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
13
+ super([laundryWasher, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
14
14
  this.createDefaultIdentifyClusterServer();
15
15
  this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Laundry Washer');
16
16
  this.createDefaultPowerSourceWiredClusterServer();
@@ -417,29 +417,6 @@ export class MatterbridgeEndpoint extends Endpoint {
417
417
  });
418
418
  return this;
419
419
  }
420
- createDefaultPowerSourceWiredBatteryClusterServer(batPercentRemaining = 100, batChargeLevel = PowerSource.BatChargeLevel.Ok) {
421
- this.behaviors.require(PowerSourceServer.with(PowerSource.Feature.Battery, PowerSource.Feature.Rechargeable), {
422
- status: PowerSource.PowerSourceStatus.Active,
423
- order: 0,
424
- description: 'Primary battery',
425
- endpointList: [],
426
- batVoltage: null,
427
- batPercentRemaining: Math.min(Math.max(batPercentRemaining * 2, 0), 200),
428
- batTimeRemaining: null,
429
- batChargeLevel,
430
- batReplacementNeeded: false,
431
- batReplaceability: PowerSource.BatReplaceability.Unspecified,
432
- batPresent: true,
433
- activeBatFaults: [],
434
- batChargeState: PowerSource.BatChargeState.IsNotCharging,
435
- batTimeToFullCharge: null,
436
- batFunctionalWhileCharging: true,
437
- batChargingCurrent: null,
438
- batCapacity: 1,
439
- activeBatChargeFaults: [],
440
- });
441
- return this;
442
- }
443
420
  createDefaultPowerSourceReplaceableBatteryClusterServer(batPercentRemaining = 100, batChargeLevel = PowerSource.BatChargeLevel.Ok, batVoltage = 1500, batReplacementDescription = 'Battery type', batQuantity = 1) {
444
421
  this.behaviors.require(PowerSourceServer.with(PowerSource.Feature.Battery, PowerSource.Feature.Replaceable), {
445
422
  status: PowerSource.PowerSourceStatus.Active,
@@ -8,11 +8,11 @@ import { RvcOperationalState } from '@matter/main/clusters/rvc-operational-state
8
8
  import { ModeBase } from '@matter/main/clusters/mode-base';
9
9
  import { OperationalState } from '@matter/main/clusters/operational-state';
10
10
  import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
11
- import { roboticVacuumCleaner } from './matterbridgeDeviceTypes.js';
11
+ import { powerSource, roboticVacuumCleaner } from './matterbridgeDeviceTypes.js';
12
12
  import { MatterbridgeServer, MatterbridgeServiceAreaServer } from './matterbridgeBehaviors.js';
13
13
  export class RoboticVacuumCleaner extends MatterbridgeEndpoint {
14
14
  constructor(name, serial, currentRunMode, supportedRunModes, currentCleanMode, supportedCleanModes, currentPhase = null, phaseList = null, operationalState, operationalStateList, supportedAreas, selectedAreas, currentArea) {
15
- super(roboticVacuumCleaner, { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
15
+ super([roboticVacuumCleaner, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
16
16
  this.createDefaultIdentifyClusterServer()
17
17
  .createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Robot Vacuum Cleaner')
18
18
  .createDefaultPowerSourceRechargeableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 5900)
@@ -15,6 +15,7 @@ export class SolarPower extends MatterbridgeEndpoint {
15
15
  .createDefaultElectricalPowerMeasurementClusterServer(voltage, current, power)
16
16
  .createDefaultElectricalEnergyMeasurementClusterServer(0, energyExported)
17
17
  .createDefaultDeviceEnergyManagementClusterServer(DeviceEnergyManagement.EsaType.SolarPv, true, DeviceEnergyManagement.EsaState.Online, absMinPower, absMaxPower)
18
+ .createDefaultDeviceEnergyManagementModeClusterServer()
18
19
  .addRequiredClusterServers();
19
20
  }
20
21
  }
@@ -4,11 +4,11 @@ import { WaterHeaterMode } from '@matter/main/clusters/water-heater-mode';
4
4
  import { WaterHeaterManagementServer } from '@matter/main/behaviors/water-heater-management';
5
5
  import { WaterHeaterModeServer } from '@matter/main/behaviors/water-heater-mode';
6
6
  import { MatterbridgeServer } from './matterbridgeBehaviors.js';
7
- import { waterHeater } from './matterbridgeDeviceTypes.js';
7
+ import { electricalSensor, powerSource, waterHeater } from './matterbridgeDeviceTypes.js';
8
8
  import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
9
9
  export class WaterHeater extends MatterbridgeEndpoint {
10
10
  constructor(name, serial, waterTemperature = 50, targetWaterTemperature = 55, minHeatSetpointLimit = 20, maxHeatSetpointLimit = 80, heaterTypes = { immersionElement1: true }, tankPercentage = 90) {
11
- super(waterHeater, { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
11
+ super([waterHeater, powerSource, electricalSensor], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
12
12
  this.createDefaultIdentifyClusterServer()
13
13
  .createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Water Heater')
14
14
  .createDefaultPowerSourceWiredClusterServer()
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.1.1-dev-20250629-cfe9124",
3
+ "version": "3.1.1-dev-20250630-1555eae",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge",
9
- "version": "3.1.1-dev-20250629-cfe9124",
9
+ "version": "3.1.1-dev-20250630-1555eae",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@matter/main": "0.15.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.1.1-dev-20250629-cfe9124",
3
+ "version": "3.1.1-dev-20250630-1555eae",
4
4
  "description": "Matterbridge plugin manager for Matter",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",