matterbridge 3.1.1-dev-20250629-cfe9124 → 3.1.1-dev-20250630-ea4c889
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 +5 -3
- package/dist/{batteryStorage.js → devices/batteryStorage.js} +14 -10
- package/dist/{evse.js → devices/evse.js} +4 -3
- package/dist/devices/export.js +8 -6
- package/dist/devices/heatPump.js +36 -0
- package/dist/devices/laundryDryer.js +58 -0
- package/dist/{laundryWasher.js → devices/laundryWasher.js} +4 -4
- package/dist/{roboticVacuumCleaner.js → devices/roboticVacuumCleaner.js} +4 -4
- package/dist/{solarPower.js → devices/solarPower.js} +3 -2
- package/dist/{waterHeater.js → devices/waterHeater.js} +4 -4
- package/dist/index.js +8 -6
- package/dist/matterbridgeEndpoint.js +3 -25
- package/npm-shrinkwrap.json +44 -44
- package/package.json +2 -2
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
|
-
- [
|
|
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
|
|
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
import { PowerSourceTag } from '@matter/main';
|
|
2
2
|
import { DeviceEnergyManagement } from '@matter/main/clusters/device-energy-management';
|
|
3
3
|
import { PowerSource } from '@matter/main/clusters/power-source';
|
|
4
|
-
import { MatterbridgeEndpoint } from '
|
|
5
|
-
import { deviceEnergyManagement, electricalSensor, batteryStorage, powerSource } from '
|
|
4
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
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, 24_000)
|
|
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
|
}
|
|
@@ -3,9 +3,9 @@ import { EnergyEvseModeServer } from '@matter/main/behaviors/energy-evse-mode';
|
|
|
3
3
|
import { EnergyEvse, EnergyEvseMode } from '@matter/main/clusters';
|
|
4
4
|
import { DeviceEnergyManagement } from '@matter/main/clusters/device-energy-management';
|
|
5
5
|
import { ModeBase } from '@matter/main/clusters/mode-base';
|
|
6
|
-
import { MatterbridgeEndpoint } from '
|
|
7
|
-
import { MatterbridgeServer } from '
|
|
8
|
-
import { deviceEnergyManagement, electricalSensor, evse, powerSource } from '
|
|
6
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
7
|
+
import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
|
|
8
|
+
import { deviceEnergyManagement, electricalSensor, evse, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
9
9
|
export class Evse extends MatterbridgeEndpoint {
|
|
10
10
|
constructor(name, serial, currentMode, supportedModes, state, supplyState, faultState, absMinPower, absMaxPower) {
|
|
11
11
|
super([evse, powerSource, electricalSensor, deviceEnergyManagement], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
|
@@ -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();
|
package/dist/devices/export.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
export * from '
|
|
2
|
-
export * from '
|
|
3
|
-
export * from '
|
|
4
|
-
export * from '
|
|
5
|
-
export * from '
|
|
6
|
-
export * from '
|
|
1
|
+
export * from './roboticVacuumCleaner.js';
|
|
2
|
+
export * from './laundryWasher.js';
|
|
3
|
+
export * from './laundryDryer.js';
|
|
4
|
+
export * from './waterHeater.js';
|
|
5
|
+
export * from './evse.js';
|
|
6
|
+
export * from './solarPower.js';
|
|
7
|
+
export * from './batteryStorage.js';
|
|
8
|
+
export * from './heatPump.js';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { NumberTag, 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, temperatureSensor, thermostatDevice } 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.SpaceHeating, false, DeviceEnergyManagement.EsaState.Online, absMinPower, absMaxPower)
|
|
18
|
+
.createDefaultDeviceEnergyManagementModeClusterServer()
|
|
19
|
+
.addRequiredClusterServers();
|
|
20
|
+
this.addChildDeviceType('FlowTemperature', temperatureSensor, {
|
|
21
|
+
tagList: [{ mfgCode: null, namespaceId: NumberTag.One.namespaceId, tag: NumberTag.One.tag, label: 'Flow' }],
|
|
22
|
+
})
|
|
23
|
+
.createDefaultTemperatureMeasurementClusterServer(4500)
|
|
24
|
+
.addRequiredClusterServers();
|
|
25
|
+
this.addChildDeviceType('ReturnTemperature', temperatureSensor, {
|
|
26
|
+
tagList: [{ mfgCode: null, namespaceId: NumberTag.Two.namespaceId, tag: NumberTag.Two.tag, label: 'Return' }],
|
|
27
|
+
})
|
|
28
|
+
.createDefaultTemperatureMeasurementClusterServer(3500)
|
|
29
|
+
.addRequiredClusterServers();
|
|
30
|
+
this.addChildDeviceType('Thermostat', thermostatDevice, {
|
|
31
|
+
tagList: [{ mfgCode: null, namespaceId: NumberTag.One.namespaceId, tag: NumberTag.One.tag, label: 'Main Thermostat' }],
|
|
32
|
+
})
|
|
33
|
+
.createDefaultHeatingThermostatClusterServer()
|
|
34
|
+
.addRequiredClusterServers();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -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 '
|
|
9
|
-
import { MatterbridgeEndpoint } from '
|
|
10
|
-
import { MatterbridgeOnOffServer, MatterbridgeServer } from '
|
|
8
|
+
import { laundryWasher, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
9
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
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();
|
|
@@ -7,12 +7,12 @@ import { RvcCleanMode } from '@matter/main/clusters/rvc-clean-mode';
|
|
|
7
7
|
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
|
-
import { MatterbridgeEndpoint } from '
|
|
11
|
-
import { roboticVacuumCleaner } from '
|
|
12
|
-
import { MatterbridgeServer, MatterbridgeServiceAreaServer } from '
|
|
10
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
11
|
+
import { powerSource, roboticVacuumCleaner } from '../matterbridgeDeviceTypes.js';
|
|
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)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PowerSourceTag } from '@matter/main';
|
|
2
2
|
import { DeviceEnergyManagement } from '@matter/main/clusters/device-energy-management';
|
|
3
|
-
import { MatterbridgeEndpoint } from '
|
|
4
|
-
import { deviceEnergyManagement, electricalSensor, solarPower, powerSource } from '
|
|
3
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
4
|
+
import { deviceEnergyManagement, electricalSensor, solarPower, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
5
5
|
export class SolarPower extends MatterbridgeEndpoint {
|
|
6
6
|
constructor(name, serial, voltage = null, current = null, power = null, energyExported = null, absMinPower = 0, absMaxPower = 0) {
|
|
7
7
|
super([solarPower, powerSource, electricalSensor, deviceEnergyManagement], {
|
|
@@ -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
|
}
|
|
@@ -3,12 +3,12 @@ import { WaterHeaterManagement } from '@matter/main/clusters/water-heater-manage
|
|
|
3
3
|
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
|
-
import { MatterbridgeServer } from '
|
|
7
|
-
import { waterHeater } from '
|
|
8
|
-
import { MatterbridgeEndpoint } from '
|
|
6
|
+
import { MatterbridgeServer } from '../matterbridgeBehaviors.js';
|
|
7
|
+
import { electricalSensor, powerSource, waterHeater } from '../matterbridgeDeviceTypes.js';
|
|
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()
|
package/dist/index.js
CHANGED
|
@@ -11,12 +11,14 @@ export * from './matterbridgePlatform.js';
|
|
|
11
11
|
export * from './matterbridgeAccessoryPlatform.js';
|
|
12
12
|
export * from './matterbridgeDynamicPlatform.js';
|
|
13
13
|
export { addVirtualDevice } from './helpers.js';
|
|
14
|
-
export * from './roboticVacuumCleaner.js';
|
|
15
|
-
export * from './laundryWasher.js';
|
|
16
|
-
export * from './
|
|
17
|
-
export * from './
|
|
18
|
-
export * from './
|
|
19
|
-
export * from './
|
|
14
|
+
export * from './devices/roboticVacuumCleaner.js';
|
|
15
|
+
export * from './devices/laundryWasher.js';
|
|
16
|
+
export * from './devices/laundryDryer.js';
|
|
17
|
+
export * from './devices/waterHeater.js';
|
|
18
|
+
export * from './devices/evse.js';
|
|
19
|
+
export * from './devices/solarPower.js';
|
|
20
|
+
export * from './devices/batteryStorage.js';
|
|
21
|
+
export * from './devices/heatPump.js';
|
|
20
22
|
const log = new AnsiLogger({ logName: 'Main', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
|
|
21
23
|
async function main() {
|
|
22
24
|
log.debug('***Matterbridge.loadInstance() called');
|
|
@@ -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,
|
|
@@ -464,11 +441,12 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
464
441
|
description: 'Primary battery',
|
|
465
442
|
batVoltage,
|
|
466
443
|
batPercentRemaining: Math.min(Math.max(batPercentRemaining * 2, 0), 200),
|
|
467
|
-
batTimeRemaining:
|
|
444
|
+
batTimeRemaining: null,
|
|
468
445
|
batChargeLevel,
|
|
469
446
|
batReplacementNeeded: false,
|
|
470
447
|
batReplaceability: PowerSource.BatReplaceability.Unspecified,
|
|
471
|
-
|
|
448
|
+
batPresent: true,
|
|
449
|
+
activeBatFaults: [],
|
|
472
450
|
batChargeState: PowerSource.BatChargeState.IsNotCharging,
|
|
473
451
|
batFunctionalWhileCharging: true,
|
|
474
452
|
endpointList: [],
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge",
|
|
3
|
-
"version": "3.1.1-dev-
|
|
3
|
+
"version": "3.1.1-dev-20250630-ea4c889",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "matterbridge",
|
|
9
|
-
"version": "3.1.1-dev-
|
|
9
|
+
"version": "3.1.1-dev-20250630-ea4c889",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@matter/main": "0.15.0",
|
|
12
|
+
"@matter/main": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
13
13
|
"archiver": "7.0.1",
|
|
14
14
|
"express": "5.1.0",
|
|
15
15
|
"glob": "11.0.3",
|
|
@@ -68,86 +68,86 @@
|
|
|
68
68
|
}
|
|
69
69
|
},
|
|
70
70
|
"node_modules/@matter/general": {
|
|
71
|
-
"version": "0.15.0",
|
|
72
|
-
"resolved": "https://registry.npmjs.org/@matter/general/-/general-0.15.0.tgz",
|
|
73
|
-
"integrity": "sha512-
|
|
71
|
+
"version": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
72
|
+
"resolved": "https://registry.npmjs.org/@matter/general/-/general-0.15.1-alpha.0-20250630-daa5888a0.tgz",
|
|
73
|
+
"integrity": "sha512-ngZijLAMlS+fbkOyfkhayatFQ96jIN2lDU3XWIYtvZZvFUs7tCaxwkYyTaYegmEwwUhGLlxH0/A9T38+NU//Pw==",
|
|
74
74
|
"license": "Apache-2.0",
|
|
75
75
|
"dependencies": {
|
|
76
76
|
"@noble/curves": "^1.9.2"
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
79
|
"node_modules/@matter/main": {
|
|
80
|
-
"version": "0.15.0",
|
|
81
|
-
"resolved": "https://registry.npmjs.org/@matter/main/-/main-0.15.0.tgz",
|
|
82
|
-
"integrity": "sha512
|
|
80
|
+
"version": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
81
|
+
"resolved": "https://registry.npmjs.org/@matter/main/-/main-0.15.1-alpha.0-20250630-daa5888a0.tgz",
|
|
82
|
+
"integrity": "sha512-iKXAhqOCdW4kVJsK0MDqBbpxovUu2fU0dtndTzJjFO2DCSBOLqUhEwmlFcGPikhxTlGVtLr10+oi5O/51kB7AA==",
|
|
83
83
|
"license": "Apache-2.0",
|
|
84
84
|
"dependencies": {
|
|
85
|
-
"@matter/general": "0.15.0",
|
|
86
|
-
"@matter/model": "0.15.0",
|
|
87
|
-
"@matter/node": "0.15.0",
|
|
88
|
-
"@matter/protocol": "0.15.0",
|
|
89
|
-
"@matter/types": "0.15.0"
|
|
85
|
+
"@matter/general": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
86
|
+
"@matter/model": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
87
|
+
"@matter/node": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
88
|
+
"@matter/protocol": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
89
|
+
"@matter/types": "0.15.1-alpha.0-20250630-daa5888a0"
|
|
90
90
|
},
|
|
91
91
|
"optionalDependencies": {
|
|
92
|
-
"@matter/nodejs": "0.15.0"
|
|
92
|
+
"@matter/nodejs": "0.15.1-alpha.0-20250630-daa5888a0"
|
|
93
93
|
}
|
|
94
94
|
},
|
|
95
95
|
"node_modules/@matter/model": {
|
|
96
|
-
"version": "0.15.0",
|
|
97
|
-
"resolved": "https://registry.npmjs.org/@matter/model/-/model-0.15.0.tgz",
|
|
98
|
-
"integrity": "sha512-
|
|
96
|
+
"version": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
97
|
+
"resolved": "https://registry.npmjs.org/@matter/model/-/model-0.15.1-alpha.0-20250630-daa5888a0.tgz",
|
|
98
|
+
"integrity": "sha512-rMr9SIrv0sXdaZvTpZTJEKnQpNXvoqsb078vMaNoPJOKDjipbvjgnVsTGK3uvSAtwmM2jN/ryv9ZhvnSSxcIJA==",
|
|
99
99
|
"license": "Apache-2.0",
|
|
100
100
|
"dependencies": {
|
|
101
|
-
"@matter/general": "0.15.0"
|
|
101
|
+
"@matter/general": "0.15.1-alpha.0-20250630-daa5888a0"
|
|
102
102
|
}
|
|
103
103
|
},
|
|
104
104
|
"node_modules/@matter/node": {
|
|
105
|
-
"version": "0.15.0",
|
|
106
|
-
"resolved": "https://registry.npmjs.org/@matter/node/-/node-0.15.0.tgz",
|
|
107
|
-
"integrity": "sha512-
|
|
105
|
+
"version": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
106
|
+
"resolved": "https://registry.npmjs.org/@matter/node/-/node-0.15.1-alpha.0-20250630-daa5888a0.tgz",
|
|
107
|
+
"integrity": "sha512-XIr9xa49EZ83ErCUAn2euTvCr+/e8eDVu8RpEnqMAAZsMKONcIMolKI5Movde1j0BSwjkyG4SS3sjlrZR/ccFg==",
|
|
108
108
|
"license": "Apache-2.0",
|
|
109
109
|
"dependencies": {
|
|
110
|
-
"@matter/general": "0.15.0",
|
|
111
|
-
"@matter/model": "0.15.0",
|
|
112
|
-
"@matter/protocol": "0.15.0",
|
|
113
|
-
"@matter/types": "0.15.0"
|
|
110
|
+
"@matter/general": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
111
|
+
"@matter/model": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
112
|
+
"@matter/protocol": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
113
|
+
"@matter/types": "0.15.1-alpha.0-20250630-daa5888a0"
|
|
114
114
|
}
|
|
115
115
|
},
|
|
116
116
|
"node_modules/@matter/nodejs": {
|
|
117
|
-
"version": "0.15.0",
|
|
118
|
-
"resolved": "https://registry.npmjs.org/@matter/nodejs/-/nodejs-0.15.0.tgz",
|
|
119
|
-
"integrity": "sha512-
|
|
117
|
+
"version": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
118
|
+
"resolved": "https://registry.npmjs.org/@matter/nodejs/-/nodejs-0.15.1-alpha.0-20250630-daa5888a0.tgz",
|
|
119
|
+
"integrity": "sha512-zvOgJGVbtyWJw5rqhLoprrjheqCR9NAk2MHi7kG6P7D/pUl5KoeddYmjfgey9AVyyJwz90+m3qMYa7PH5StoaQ==",
|
|
120
120
|
"license": "Apache-2.0",
|
|
121
121
|
"optional": true,
|
|
122
122
|
"dependencies": {
|
|
123
|
-
"@matter/general": "0.15.0",
|
|
124
|
-
"@matter/node": "0.15.0",
|
|
125
|
-
"@matter/protocol": "0.15.0",
|
|
126
|
-
"@matter/types": "0.15.0"
|
|
123
|
+
"@matter/general": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
124
|
+
"@matter/node": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
125
|
+
"@matter/protocol": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
126
|
+
"@matter/types": "0.15.1-alpha.0-20250630-daa5888a0"
|
|
127
127
|
},
|
|
128
128
|
"engines": {
|
|
129
129
|
"node": ">=18.0.0"
|
|
130
130
|
}
|
|
131
131
|
},
|
|
132
132
|
"node_modules/@matter/protocol": {
|
|
133
|
-
"version": "0.15.0",
|
|
134
|
-
"resolved": "https://registry.npmjs.org/@matter/protocol/-/protocol-0.15.0.tgz",
|
|
135
|
-
"integrity": "sha512-
|
|
133
|
+
"version": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
134
|
+
"resolved": "https://registry.npmjs.org/@matter/protocol/-/protocol-0.15.1-alpha.0-20250630-daa5888a0.tgz",
|
|
135
|
+
"integrity": "sha512-EwO0WX/jKWgsXthN6ZK0/xk3ELD/kgyBHZqc5aMLmQFKmMzn8lbMU5LNul1/tp7xhrHgehR0Y4oYzL+jhPGnGQ==",
|
|
136
136
|
"license": "Apache-2.0",
|
|
137
137
|
"dependencies": {
|
|
138
|
-
"@matter/general": "0.15.0",
|
|
139
|
-
"@matter/model": "0.15.0",
|
|
140
|
-
"@matter/types": "0.15.0"
|
|
138
|
+
"@matter/general": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
139
|
+
"@matter/model": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
140
|
+
"@matter/types": "0.15.1-alpha.0-20250630-daa5888a0"
|
|
141
141
|
}
|
|
142
142
|
},
|
|
143
143
|
"node_modules/@matter/types": {
|
|
144
|
-
"version": "0.15.0",
|
|
145
|
-
"resolved": "https://registry.npmjs.org/@matter/types/-/types-0.15.0.tgz",
|
|
146
|
-
"integrity": "sha512-
|
|
144
|
+
"version": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
145
|
+
"resolved": "https://registry.npmjs.org/@matter/types/-/types-0.15.1-alpha.0-20250630-daa5888a0.tgz",
|
|
146
|
+
"integrity": "sha512-3lpWYaE/s8R90gR9sSnQ06EZ3mSufBLuyxYLzG8SvNdqjVSFyxzgsZAHgzad/EYre5U0+sro/R9yakV8w67kYw==",
|
|
147
147
|
"license": "Apache-2.0",
|
|
148
148
|
"dependencies": {
|
|
149
|
-
"@matter/general": "0.15.0",
|
|
150
|
-
"@matter/model": "0.15.0"
|
|
149
|
+
"@matter/general": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
150
|
+
"@matter/model": "0.15.1-alpha.0-20250630-daa5888a0"
|
|
151
151
|
}
|
|
152
152
|
},
|
|
153
153
|
"node_modules/@noble/curves": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge",
|
|
3
|
-
"version": "3.1.1-dev-
|
|
3
|
+
"version": "3.1.1-dev-20250630-ea4c889",
|
|
4
4
|
"description": "Matterbridge plugin manager for Matter",
|
|
5
5
|
"author": "https://github.com/Luligu",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
}
|
|
99
99
|
},
|
|
100
100
|
"dependencies": {
|
|
101
|
-
"@matter/main": "0.15.0",
|
|
101
|
+
"@matter/main": "0.15.1-alpha.0-20250630-daa5888a0",
|
|
102
102
|
"archiver": "7.0.1",
|
|
103
103
|
"express": "5.1.0",
|
|
104
104
|
"glob": "11.0.3",
|