matterbridge-example-dynamic-platform 1.3.8 → 1.3.9-dev-20250901-ccc8cd6
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 +28 -0
- package/README.md +14 -1
- package/dist/platform.js +405 -77
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -23,6 +23,34 @@ If you like this project and find it useful, please consider giving it a star on
|
|
|
23
23
|
<img src="bmc-button.svg" alt="Buy me a coffee" width="120">
|
|
24
24
|
</a>
|
|
25
25
|
|
|
26
|
+
## [1.3.9] - 2025-08-30
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- [platform]: Added a door contact sensor
|
|
31
|
+
- [platform]: Added a motion sensor
|
|
32
|
+
- [platform]: Added an illuminance sensor
|
|
33
|
+
- [platform]: Added a temperature sensor
|
|
34
|
+
- [platform]: Added an humidity sensor
|
|
35
|
+
- [platform]: Added a pressure sensor
|
|
36
|
+
- [platform]: Added a flow sensor
|
|
37
|
+
- [platform]: Added a climate sensor with temperature, humidity and pressure
|
|
38
|
+
- [platform]: Added a mode select device
|
|
39
|
+
- [platform]: Added animation in 10 phases for refrigerator
|
|
40
|
+
- [platform]: Added animation in 10 phases for oven
|
|
41
|
+
- [platform]: Added animation in 10 phases for rvc
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
|
|
45
|
+
- [package]: Updated dependencies.
|
|
46
|
+
- [package]: Updated to Automator v. 2.0.5.
|
|
47
|
+
- [devContainer]: Updated devContainer with repository name for the container and shallow clone matterbridge for speed and memory optimization.
|
|
48
|
+
- [package]: Required matterbridge 3.2.5.
|
|
49
|
+
|
|
50
|
+
<a href="https://www.buymeacoffee.com/luligugithub">
|
|
51
|
+
<img src="bmc-button.svg" alt="Buy me a coffee" width="80">
|
|
52
|
+
</a>
|
|
53
|
+
|
|
26
54
|
## [1.3.8] - 2025-08-20
|
|
27
55
|
|
|
28
56
|
### Added
|
package/README.md
CHANGED
|
@@ -17,8 +17,17 @@
|
|
|
17
17
|
|
|
18
18
|
Matterbridge dynamic platform example plugin is a template to develop your own plugin using the dynamic platform.
|
|
19
19
|
|
|
20
|
-
It exposes
|
|
20
|
+
It exposes 56 virtual devices:
|
|
21
21
|
|
|
22
|
+
- a door contact sensor
|
|
23
|
+
- a motion sensor
|
|
24
|
+
- an illuminance sensor
|
|
25
|
+
- a temperature sensor
|
|
26
|
+
- an humidity sensor
|
|
27
|
+
- a pressure sensor
|
|
28
|
+
- a flow sensor
|
|
29
|
+
- a climate sensor with temperature, humidity and pressure
|
|
30
|
+
- a mode select device
|
|
22
31
|
- a switch with onOff cluster
|
|
23
32
|
- a light with onOff
|
|
24
33
|
- a light with onOff and levelControl (dimmer)
|
|
@@ -83,3 +92,7 @@ If you like this project and find it useful, please consider giving it a star on
|
|
|
83
92
|
### Matterbridge
|
|
84
93
|
|
|
85
94
|
See the guidelines on [Matterbridge](https://github.com/Luligu/matterbridge/blob/main/README.md) for more information.
|
|
95
|
+
|
|
96
|
+
## Style guide
|
|
97
|
+
|
|
98
|
+
See also the [Style Guide](./STYLE_GUIDE.md) for JSDoc, naming and logging conventions used in this repository.
|
package/dist/platform.js
CHANGED
|
@@ -1,10 +1,34 @@
|
|
|
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, onOffMountedSwitch, dimmableMountedSwitch, extendedColorLight, } from 'matterbridge';
|
|
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, onOffMountedSwitch, dimmableMountedSwitch, extendedColorLight, pressureSensor, contactSensor, occupancySensor, lightSensor, modeSelect, } from 'matterbridge';
|
|
2
2
|
import { RoboticVacuumCleaner, LaundryWasher, WaterHeater, Evse, SolarPower, BatteryStorage, LaundryDryer, HeatPump, Dishwasher, ExtractorHood, MicrowaveOven, Oven, Cooktop, Refrigerator, } from 'matterbridge/devices';
|
|
3
|
-
import { isValidBoolean, isValidNumber, isValidString } from 'matterbridge/utils';
|
|
3
|
+
import { isValidBoolean, isValidNumber, isValidObject, isValidString } from 'matterbridge/utils';
|
|
4
4
|
import { debugStringify } from 'matterbridge/logger';
|
|
5
5
|
import { AreaNamespaceTag, LocationTag, NumberTag, PositionTag, RefrigeratorTag, SwitchesTag, UINT16_MAX, UINT32_MAX } from 'matterbridge/matter';
|
|
6
|
-
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, RvcRunMode, RvcCleanMode, ConcentrationMeasurement, Descriptor, BridgedDeviceBasicInformation, OvenMode, OperationalState, } from 'matterbridge/matter/clusters';
|
|
6
|
+
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, RvcRunMode, RvcCleanMode, ConcentrationMeasurement, Descriptor, BridgedDeviceBasicInformation, OvenMode, OperationalState, OccupancySensing, IlluminanceMeasurement, PressureMeasurement, RefrigeratorAndTemperatureControlledCabinetMode, RvcOperationalState, } from 'matterbridge/matter/clusters';
|
|
7
|
+
function luxToMatter(lux) {
|
|
8
|
+
if (!Number.isFinite(lux) || lux <= 0)
|
|
9
|
+
return 0;
|
|
10
|
+
const encoded = 10000 * Math.log10(lux);
|
|
11
|
+
if (!Number.isFinite(encoded) || encoded < 0)
|
|
12
|
+
return 0;
|
|
13
|
+
return Math.round(Math.min(encoded, 0xfffe));
|
|
14
|
+
}
|
|
15
|
+
function matterToLux(value) {
|
|
16
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
17
|
+
return 0;
|
|
18
|
+
const v = Math.min(value, 0xfffe);
|
|
19
|
+
const lux = Math.pow(10, v / 10000);
|
|
20
|
+
return Math.round(lux < 0 ? 0 : lux);
|
|
21
|
+
}
|
|
7
22
|
export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatform {
|
|
23
|
+
door;
|
|
24
|
+
occupancy;
|
|
25
|
+
illuminance;
|
|
26
|
+
temperature;
|
|
27
|
+
humidity;
|
|
28
|
+
pressure;
|
|
29
|
+
flow;
|
|
30
|
+
select;
|
|
31
|
+
climate;
|
|
8
32
|
switch;
|
|
9
33
|
mountedOnOffSwitch;
|
|
10
34
|
mountedDimmerSwitch;
|
|
@@ -53,6 +77,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
53
77
|
oven;
|
|
54
78
|
cooktop;
|
|
55
79
|
refrigerator;
|
|
80
|
+
phaseInterval;
|
|
81
|
+
phase = -1;
|
|
82
|
+
sensorInterval;
|
|
56
83
|
switchInterval;
|
|
57
84
|
lightInterval;
|
|
58
85
|
outletInterval;
|
|
@@ -69,15 +96,15 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
69
96
|
genericSwitchInterval;
|
|
70
97
|
genericSwitchLastEvent = 'Release';
|
|
71
98
|
intervalOnOff = false;
|
|
72
|
-
intervalLevel =
|
|
99
|
+
intervalLevel = 1;
|
|
73
100
|
intervalColorTemperature = 147;
|
|
74
101
|
bridgedDevices = new Map();
|
|
75
102
|
fanModeLookup = ['Off', 'Low', 'Medium', 'High', 'On', 'Auto', 'Smart'];
|
|
76
103
|
fanDirectionLookup = ['Forward', 'Reverse'];
|
|
77
104
|
constructor(matterbridge, log, config) {
|
|
78
105
|
super(matterbridge, log, config);
|
|
79
|
-
if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.2.
|
|
80
|
-
throw new Error(`This plugin requires Matterbridge version >= "3.2.
|
|
106
|
+
if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.2.5')) {
|
|
107
|
+
throw new Error(`This plugin requires Matterbridge version >= "3.2.5". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version in the frontend.`);
|
|
81
108
|
}
|
|
82
109
|
this.log.info('Initializing platform:', this.config.name);
|
|
83
110
|
if (config.whiteList === undefined)
|
|
@@ -93,12 +120,82 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
93
120
|
this.log.info('onStart called with reason:', reason ?? 'none');
|
|
94
121
|
await this.ready;
|
|
95
122
|
await this.clearSelect();
|
|
123
|
+
this.door = new MatterbridgeEndpoint([contactSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Door' }, this.config.debug)
|
|
124
|
+
.createDefaultIdentifyClusterServer()
|
|
125
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Door', 'DOO00001', 0xfff1, 'Matterbridge', 'Matterbridge Door')
|
|
126
|
+
.createDefaultBooleanStateClusterServer(true)
|
|
127
|
+
.createDefaultPowerSourceReplaceableBatteryClusterServer(90, PowerSource.BatChargeLevel.Ok, 2990, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
|
|
128
|
+
.addRequiredClusterServers();
|
|
129
|
+
this.door = await this.addDevice(this.door);
|
|
130
|
+
this.occupancy = new MatterbridgeEndpoint([occupancySensor, bridgedNode, powerSource], { uniqueStorageKey: 'Occupancy' }, this.config.debug)
|
|
131
|
+
.createDefaultIdentifyClusterServer()
|
|
132
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Occupancy', 'OCC00002', 0xfff1, 'Matterbridge', 'Matterbridge Occupancy')
|
|
133
|
+
.createDefaultOccupancySensingClusterServer(false)
|
|
134
|
+
.createDefaultPowerSourceReplaceableBatteryClusterServer(70, PowerSource.BatChargeLevel.Ok, 2950, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
|
|
135
|
+
.addRequiredClusterServers();
|
|
136
|
+
this.occupancy = await this.addDevice(this.occupancy);
|
|
137
|
+
this.illuminance = new MatterbridgeEndpoint([lightSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Illuminance' }, this.config.debug)
|
|
138
|
+
.createDefaultIdentifyClusterServer()
|
|
139
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Illuminance', 'ILL00003', 0xfff1, 'Matterbridge', 'Matterbridge Illuminance')
|
|
140
|
+
.createDefaultIlluminanceMeasurementClusterServer(luxToMatter(1))
|
|
141
|
+
.createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3100, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
|
|
142
|
+
.addRequiredClusterServers();
|
|
143
|
+
this.illuminance = await this.addDevice(this.illuminance);
|
|
144
|
+
this.temperature = new MatterbridgeEndpoint([temperatureSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Temperature' }, this.config.debug)
|
|
145
|
+
.createDefaultIdentifyClusterServer()
|
|
146
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Temperature', 'TEM00004', 0xfff1, 'Matterbridge', 'Matterbridge Temperature')
|
|
147
|
+
.createDefaultTemperatureMeasurementClusterServer(1000)
|
|
148
|
+
.createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3100, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
|
|
149
|
+
.addRequiredClusterServers();
|
|
150
|
+
this.temperature = await this.addDevice(this.temperature);
|
|
151
|
+
this.humidity = new MatterbridgeEndpoint([humiditySensor, bridgedNode, powerSource], { uniqueStorageKey: 'Humidity' }, this.config.debug)
|
|
152
|
+
.createDefaultIdentifyClusterServer()
|
|
153
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Humidity', 'HUM00005', 0xfff1, 'Matterbridge', 'Matterbridge Humidity')
|
|
154
|
+
.createDefaultRelativeHumidityMeasurementClusterServer(1000)
|
|
155
|
+
.createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3100, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
|
|
156
|
+
.addRequiredClusterServers();
|
|
157
|
+
this.humidity = await this.addDevice(this.humidity);
|
|
158
|
+
this.pressure = new MatterbridgeEndpoint([pressureSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Pressure' }, this.config.debug)
|
|
159
|
+
.createDefaultIdentifyClusterServer()
|
|
160
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Pressure', 'PRE00006', 0xfff1, 'Matterbridge', 'Matterbridge Pressure')
|
|
161
|
+
.createDefaultPressureMeasurementClusterServer(9000)
|
|
162
|
+
.createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3050, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
|
|
163
|
+
.addRequiredClusterServers();
|
|
164
|
+
this.pressure = await this.addDevice(this.pressure);
|
|
165
|
+
this.flow = new MatterbridgeEndpoint([flowSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Flow' }, this.config.debug)
|
|
166
|
+
.createDefaultIdentifyClusterServer()
|
|
167
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Flow', 'FLO00007', 0xfff1, 'Matterbridge', 'Matterbridge Flow')
|
|
168
|
+
.createDefaultFlowMeasurementClusterServer(10)
|
|
169
|
+
.createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3050, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
|
|
170
|
+
.addRequiredClusterServers();
|
|
171
|
+
this.flow = await this.addDevice(this.flow);
|
|
172
|
+
this.climate = new MatterbridgeEndpoint([temperatureSensor, humiditySensor, pressureSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Climate' }, this.config.debug)
|
|
173
|
+
.createDefaultIdentifyClusterServer()
|
|
174
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Climate', 'CLI00008', 0xfff1, 'Matterbridge', 'Matterbridge Climate')
|
|
175
|
+
.createDefaultTemperatureMeasurementClusterServer(1000)
|
|
176
|
+
.createDefaultRelativeHumidityMeasurementClusterServer(1000)
|
|
177
|
+
.createDefaultPressureMeasurementClusterServer(9000)
|
|
178
|
+
.createDefaultPowerSourceReplaceableBatteryClusterServer(90, PowerSource.BatChargeLevel.Ok, 2990, '2 x AA', 2, PowerSource.BatReplaceability.UserReplaceable)
|
|
179
|
+
.addRequiredClusterServers();
|
|
180
|
+
this.climate = await this.addDevice(this.climate);
|
|
181
|
+
this.select = new MatterbridgeEndpoint([modeSelect, bridgedNode, powerSource], { uniqueStorageKey: 'Select' }, this.config.debug)
|
|
182
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Select', 'SEL00009', 0xfff1, 'Matterbridge', 'Matterbridge Select')
|
|
183
|
+
.createDefaultModeSelectClusterServer('Night mode', [
|
|
184
|
+
{ label: 'Led ON', mode: 1, semanticTags: [] },
|
|
185
|
+
{ label: 'Led OFF', mode: 2, semanticTags: [] },
|
|
186
|
+
], 1, 1)
|
|
187
|
+
.createDefaultPowerSourceWiredClusterServer()
|
|
188
|
+
.addRequiredClusterServers();
|
|
189
|
+
this.select = await this.addDevice(this.select);
|
|
190
|
+
this.select?.addCommandHandler('changeToMode', async ({ request: { newMode } }) => {
|
|
191
|
+
this.log.info(`Command changeToMode called newMode:${newMode}`);
|
|
192
|
+
});
|
|
96
193
|
this.switch = new MatterbridgeEndpoint([onOffSwitch, bridgedNode, powerSource], { uniqueStorageKey: 'Switch' }, this.config.debug)
|
|
97
194
|
.createDefaultIdentifyClusterServer()
|
|
98
195
|
.createDefaultGroupsClusterServer()
|
|
99
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Switch', '
|
|
196
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Switch', 'SWI00010', 0xfff1, 'Matterbridge', 'Matterbridge Switch')
|
|
100
197
|
.createDefaultOnOffClusterServer()
|
|
101
|
-
.
|
|
198
|
+
.createDefaultPowerSourceWiredClusterServer();
|
|
102
199
|
this.switch = await this.addDevice(this.switch);
|
|
103
200
|
this.switch?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
|
|
104
201
|
this.log.info(`Command identify called identifyTime:${identifyTime}`);
|
|
@@ -114,9 +211,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
114
211
|
this.mountedOnOffSwitch = new MatterbridgeEndpoint([onOffMountedSwitch, bridgedNode, powerSource], { uniqueStorageKey: 'OnOffMountedSwitch' }, this.config.debug)
|
|
115
212
|
.createDefaultIdentifyClusterServer()
|
|
116
213
|
.createDefaultGroupsClusterServer()
|
|
117
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('OnOff Mounted Switch', '
|
|
214
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('OnOff Mounted Switch', 'OMS00011', 0xfff1, 'Matterbridge', 'Matterbridge OnOff Mounted Switch')
|
|
118
215
|
.createDefaultOnOffClusterServer()
|
|
119
|
-
.
|
|
216
|
+
.createDefaultPowerSourceWiredClusterServer();
|
|
120
217
|
this.mountedOnOffSwitch = await this.addDevice(this.mountedOnOffSwitch);
|
|
121
218
|
this.mountedOnOffSwitch?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
|
|
122
219
|
this.mountedOnOffSwitch?.log.info(`Command identify called identifyTime:${identifyTime}`);
|
|
@@ -132,7 +229,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
132
229
|
this.mountedDimmerSwitch = new MatterbridgeEndpoint([dimmableMountedSwitch, bridgedNode, powerSource], { uniqueStorageKey: 'DimmerMountedSwitch' }, this.config.debug)
|
|
133
230
|
.createDefaultIdentifyClusterServer()
|
|
134
231
|
.createDefaultGroupsClusterServer()
|
|
135
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Dimmer Mounted Switch', '
|
|
232
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Dimmer Mounted Switch', 'DMS00012', 0xfff1, 'Matterbridge', 'Matterbridge Dimmer Mounted Switch')
|
|
136
233
|
.createDefaultOnOffClusterServer()
|
|
137
234
|
.createDefaultLevelControlClusterServer()
|
|
138
235
|
.createDefaultPowerSourceWiredClusterServer()
|
|
@@ -160,7 +257,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
160
257
|
this.lightOnOff = new MatterbridgeEndpoint([onOffLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (on/off)' }, this.config.debug)
|
|
161
258
|
.createDefaultIdentifyClusterServer()
|
|
162
259
|
.createDefaultGroupsClusterServer()
|
|
163
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (on/off)', '
|
|
260
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (on/off)', 'LON00013', 0xfff1, 'Matterbridge', 'Matterbridge Light on/off')
|
|
164
261
|
.createDefaultOnOffClusterServer()
|
|
165
262
|
.createDefaultPowerSourceWiredClusterServer();
|
|
166
263
|
this.lightOnOff = await this.addDevice(this.lightOnOff);
|
|
@@ -178,10 +275,10 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
178
275
|
this.dimmer = new MatterbridgeEndpoint([dimmableLight, bridgedNode, powerSource], { uniqueStorageKey: 'Dimmer' }, this.config.debug)
|
|
179
276
|
.createDefaultIdentifyClusterServer()
|
|
180
277
|
.createDefaultGroupsClusterServer()
|
|
181
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Dimmer', '
|
|
278
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Dimmer', 'DMR00014', 0xfff1, 'Matterbridge', 'Matterbridge Dimmer')
|
|
182
279
|
.createDefaultOnOffClusterServer()
|
|
183
280
|
.createDefaultLevelControlClusterServer()
|
|
184
|
-
.
|
|
281
|
+
.createDefaultPowerSourceWiredClusterServer();
|
|
185
282
|
this.dimmer = await this.addDevice(this.dimmer);
|
|
186
283
|
this.dimmer?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
|
|
187
284
|
this.dimmer?.log.info(`Command identify called identifyTime:${identifyTime}`);
|
|
@@ -205,11 +302,11 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
205
302
|
this.light = new MatterbridgeEndpoint([extendedColorLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (XY, HS and CT)' }, this.config.debug)
|
|
206
303
|
.createDefaultIdentifyClusterServer()
|
|
207
304
|
.createDefaultGroupsClusterServer()
|
|
208
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (XY, HS and CT)', '
|
|
305
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (XY, HS and CT)', 'LXC00015', 0xfff1, 'Matterbridge', 'Matterbridge Light')
|
|
209
306
|
.createDefaultOnOffClusterServer()
|
|
210
307
|
.createDefaultLevelControlClusterServer()
|
|
211
308
|
.createDefaultColorControlClusterServer()
|
|
212
|
-
.
|
|
309
|
+
.createDefaultPowerSourceWiredClusterServer();
|
|
213
310
|
this.light = await this.addDevice(this.light);
|
|
214
311
|
this.light?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
|
|
215
312
|
this.light?.log.info(`Command identify called identifyTime:${identifyTime}`);
|
|
@@ -255,7 +352,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
255
352
|
this.lightHS = new MatterbridgeEndpoint([colorTemperatureLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (HS, CT)' }, this.config.debug)
|
|
256
353
|
.createDefaultIdentifyClusterServer()
|
|
257
354
|
.createDefaultGroupsClusterServer()
|
|
258
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (HS, CT)', '
|
|
355
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (HS, CT)', 'LHC00016', 0xfff1, 'Matterbridge', 'Matterbridge Light')
|
|
259
356
|
.createDefaultOnOffClusterServer()
|
|
260
357
|
.createDefaultLevelControlClusterServer()
|
|
261
358
|
.createHsColorControlClusterServer()
|
|
@@ -300,7 +397,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
300
397
|
this.lightXY = new MatterbridgeEndpoint([extendedColorLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (XY, CT)' }, this.config.debug)
|
|
301
398
|
.createDefaultIdentifyClusterServer()
|
|
302
399
|
.createDefaultGroupsClusterServer()
|
|
303
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (XY, CT)', '
|
|
400
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (XY, CT)', 'LXT00017', 0xfff1, 'Matterbridge', 'Matterbridge Light')
|
|
304
401
|
.createDefaultOnOffClusterServer()
|
|
305
402
|
.createDefaultLevelControlClusterServer()
|
|
306
403
|
.createXyColorControlClusterServer()
|
|
@@ -337,11 +434,11 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
337
434
|
this.lightCT = new MatterbridgeEndpoint([colorTemperatureLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (CT)' }, this.config.debug)
|
|
338
435
|
.createDefaultIdentifyClusterServer()
|
|
339
436
|
.createDefaultGroupsClusterServer()
|
|
340
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (CT)', '
|
|
437
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Light (CT)', 'LCT00018', 0xfff1, 'Matterbridge', 'Matterbridge Light')
|
|
341
438
|
.createDefaultOnOffClusterServer()
|
|
342
439
|
.createDefaultLevelControlClusterServer()
|
|
343
440
|
.createCtColorControlClusterServer()
|
|
344
|
-
.
|
|
441
|
+
.createDefaultPowerSourceWiredClusterServer();
|
|
345
442
|
this.lightCT = await this.addDevice(this.lightCT);
|
|
346
443
|
this.lightCT?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
|
|
347
444
|
this.lightCT?.log.info(`Command identify called identifyTime:${identifyTime}`);
|
|
@@ -369,7 +466,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
369
466
|
this.outlet = new MatterbridgeEndpoint([onOffOutlet, bridgedNode, powerSource], { uniqueStorageKey: 'Outlet' }, this.config.debug)
|
|
370
467
|
.createDefaultIdentifyClusterServer()
|
|
371
468
|
.createDefaultGroupsClusterServer()
|
|
372
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Outlet', '
|
|
469
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Outlet', 'OUT00019', 0xfff1, 'Matterbridge', 'Matterbridge Outlet')
|
|
373
470
|
.createDefaultOnOffClusterServer()
|
|
374
471
|
.createDefaultPowerSourceWiredClusterServer();
|
|
375
472
|
this.outlet = await this.addDevice(this.outlet);
|
|
@@ -387,9 +484,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
387
484
|
this.coverLift = new MatterbridgeEndpoint([coverDevice, bridgedNode, powerSource], { uniqueStorageKey: 'CoverLift' }, this.config.debug)
|
|
388
485
|
.createDefaultIdentifyClusterServer()
|
|
389
486
|
.createDefaultGroupsClusterServer()
|
|
390
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Cover lift', '
|
|
487
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Cover lift', 'COV00020', 0xfff1, 'Matterbridge', 'Matterbridge Cover')
|
|
391
488
|
.createDefaultWindowCoveringClusterServer()
|
|
392
|
-
.
|
|
489
|
+
.createDefaultPowerSourceWiredClusterServer();
|
|
393
490
|
this.coverLift = await this.addDevice(this.coverLift);
|
|
394
491
|
this.coverLift?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
|
|
395
492
|
this.coverLift?.log.info(`Command identify called identifyTime:${identifyTime}`);
|
|
@@ -413,9 +510,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
413
510
|
this.coverLiftTilt = new MatterbridgeEndpoint([coverDevice, bridgedNode, powerSource], { uniqueStorageKey: 'CoverLiftTilt' }, this.config.debug)
|
|
414
511
|
.createDefaultIdentifyClusterServer()
|
|
415
512
|
.createDefaultGroupsClusterServer()
|
|
416
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Cover lift and tilt', '
|
|
513
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Cover lift and tilt', 'CLT00021', 0xfff1, 'Matterbridge', 'Matterbridge Cover')
|
|
417
514
|
.createDefaultLiftTiltWindowCoveringClusterServer()
|
|
418
|
-
.
|
|
515
|
+
.createDefaultPowerSourceWiredClusterServer();
|
|
419
516
|
this.coverLiftTilt = await this.addDevice(this.coverLiftTilt);
|
|
420
517
|
this.coverLiftTilt?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
|
|
421
518
|
this.coverLiftTilt?.log.info(`Command identify called identifyTime:${identifyTime}`);
|
|
@@ -443,7 +540,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
443
540
|
});
|
|
444
541
|
this.lock = new MatterbridgeEndpoint([doorLockDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Lock' }, this.config.debug)
|
|
445
542
|
.createDefaultIdentifyClusterServer()
|
|
446
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Lock', '
|
|
543
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Lock', 'LOC00022', 0xfff1, 'Matterbridge', 'Matterbridge Lock')
|
|
447
544
|
.createDefaultDoorLockClusterServer()
|
|
448
545
|
.createDefaultPowerSourceRechargeableBatteryClusterServer(30);
|
|
449
546
|
this.lock = await this.addDevice(this.lock);
|
|
@@ -461,7 +558,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
461
558
|
this.thermoAuto = new MatterbridgeEndpoint([thermostatDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Thermostat (AutoMode)' }, this.config.debug)
|
|
462
559
|
.createDefaultIdentifyClusterServer()
|
|
463
560
|
.createDefaultGroupsClusterServer()
|
|
464
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (AutoMode)', '
|
|
561
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (AutoMode)', 'TAU00023', 0xfff1, 'Matterbridge', 'Matterbridge Thermostat')
|
|
465
562
|
.createDefaultThermostatClusterServer(20, 18, 22)
|
|
466
563
|
.createDefaultPowerSourceRechargeableBatteryClusterServer(70, PowerSource.BatChargeLevel.Ok, 4700);
|
|
467
564
|
this.thermoAuto
|
|
@@ -510,7 +607,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
510
607
|
this.thermoHeat = new MatterbridgeEndpoint([thermostatDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Thermostat (Heat)' }, this.config.debug)
|
|
511
608
|
.createDefaultIdentifyClusterServer()
|
|
512
609
|
.createDefaultGroupsClusterServer()
|
|
513
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (Heat)', '
|
|
610
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (Heat)', 'THE00024', 0xfff1, 'Matterbridge', 'Matterbridge Thermostat')
|
|
514
611
|
.createDefaultHeatingThermostatClusterServer(20, 18, 5, 35)
|
|
515
612
|
.createDefaultPowerSourceReplaceableBatteryClusterServer(70, PowerSource.BatChargeLevel.Ok, 6010, 'AA 1.5V', 4);
|
|
516
613
|
this.thermoHeat
|
|
@@ -548,7 +645,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
548
645
|
this.thermoCool = new MatterbridgeEndpoint([thermostatDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Thermostat (Cool)' }, this.config.debug)
|
|
549
646
|
.createDefaultIdentifyClusterServer()
|
|
550
647
|
.createDefaultGroupsClusterServer()
|
|
551
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (Cool)', '
|
|
648
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (Cool)', 'TCO00025', 0xfff1, 'Matterbridge', 'Matterbridge Thermostat')
|
|
552
649
|
.createDefaultCoolingThermostatClusterServer(20, 18, 5, 35)
|
|
553
650
|
.createDefaultPowerSourceReplaceableBatteryClusterServer(40, PowerSource.BatChargeLevel.Ok, 5080, 'AA 1.5V', 4);
|
|
554
651
|
this.thermoCool = await this.addDevice(this.thermoCool);
|
|
@@ -566,7 +663,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
566
663
|
this.thermoCool?.log.info('Subscribe occupiedCoolingSetpoint called with:', value / 100);
|
|
567
664
|
}, this.thermoCool.log);
|
|
568
665
|
this.airPurifier = new MatterbridgeEndpoint([airPurifier, temperatureSensor, humiditySensor, bridgedNode, powerSource], { uniqueStorageKey: 'Air purifier' }, this.config.debug)
|
|
569
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Air purifier', '
|
|
666
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Air purifier', 'AIR00026', 0xfff1, 'Matterbridge', 'Matterbridge Air purifier')
|
|
570
667
|
.createDefaultIdentifyClusterServer()
|
|
571
668
|
.createDefaultFanControlClusterServer()
|
|
572
669
|
.createDefaultTemperatureMeasurementClusterServer(20 * 100)
|
|
@@ -611,7 +708,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
611
708
|
this.airPurifier?.setAttribute(FanControl.Cluster.id, 'percentCurrent', newValue, this.airPurifier?.log);
|
|
612
709
|
}, this.airPurifier.log);
|
|
613
710
|
this.airConditioner = new MatterbridgeEndpoint([airConditioner, bridgedNode, powerSource], { uniqueStorageKey: 'Air Conditioner' }, this.config.debug)
|
|
614
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Air Conditioner', '
|
|
711
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Air Conditioner', 'ACO00027', 0xfff1, 'Matterbridge', 'Matterbridge Air Conditioner')
|
|
615
712
|
.createDefaultIdentifyClusterServer()
|
|
616
713
|
.createDeadFrontOnOffClusterServer(true)
|
|
617
714
|
.createDefaultThermostatClusterServer(20, 18, 22)
|
|
@@ -640,7 +737,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
640
737
|
await this.airConditioner?.setAttribute(FanControl.Cluster.id, 'percentSetting', null, this.airConditioner?.log);
|
|
641
738
|
});
|
|
642
739
|
this.pump = new MatterbridgeEndpoint([pumpDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Pump' }, this.config.debug)
|
|
643
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Pump', '
|
|
740
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Pump', 'PUM00028', 0xfff1, 'Matterbridge', 'Matterbridge Pump')
|
|
644
741
|
.createDefaultIdentifyClusterServer()
|
|
645
742
|
.createOnOffClusterServer()
|
|
646
743
|
.createLevelControlClusterServer()
|
|
@@ -663,7 +760,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
663
760
|
this.pump?.log.info(`Command moveToLevelWithOnOff called request: ${level}`);
|
|
664
761
|
});
|
|
665
762
|
this.valve = new MatterbridgeEndpoint([waterValve, bridgedNode, powerSource], { uniqueStorageKey: 'Water valve' }, this.config.debug)
|
|
666
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Water valve', '
|
|
763
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Water valve', 'WAV00029', 0xfff1, 'Matterbridge', 'Matterbridge Water valve')
|
|
667
764
|
.createDefaultIdentifyClusterServer()
|
|
668
765
|
.createDefaultValveConfigurationAndControlClusterServer()
|
|
669
766
|
.createDefaultPowerSourceWiredClusterServer();
|
|
@@ -672,7 +769,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
672
769
|
this.valve?.log.info(`Command identify called identifyTime:${identifyTime}`);
|
|
673
770
|
});
|
|
674
771
|
this.fanDefault = new MatterbridgeEndpoint([fanDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Fan off low medium high auto' }, this.config.debug)
|
|
675
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Fan', '
|
|
772
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Fan', 'FAN00030', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
|
|
676
773
|
.createDefaultPowerSourceWiredClusterServer()
|
|
677
774
|
.addRequiredClusterServers();
|
|
678
775
|
this.fanDefault = await this.addDevice(this.fanDefault);
|
|
@@ -713,7 +810,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
713
810
|
this.fanDefault?.setAttribute(FanControl.Cluster.id, 'percentCurrent', newValue, this.fanDefault?.log);
|
|
714
811
|
}, this.fanDefault.log);
|
|
715
812
|
this.fanBase = new MatterbridgeEndpoint([fanDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Fan off low medium high' }, this.config.debug)
|
|
716
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Fan base', '
|
|
813
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Fan base', 'FBA00031', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
|
|
717
814
|
.createDefaultPowerSourceWiredClusterServer()
|
|
718
815
|
.createBaseFanControlClusterServer()
|
|
719
816
|
.addRequiredClusterServers();
|
|
@@ -755,7 +852,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
755
852
|
this.fanBase?.setAttribute(FanControl.Cluster.id, 'percentCurrent', newValue, this.fanBase?.log);
|
|
756
853
|
}, this.fanBase.log);
|
|
757
854
|
this.fanOnHigh = new MatterbridgeEndpoint([fanDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Fan off high' }, this.config.debug)
|
|
758
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Fan off high', '
|
|
855
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Fan off high', 'FOH00032', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
|
|
759
856
|
.createDefaultPowerSourceWiredClusterServer()
|
|
760
857
|
.createOnOffFanControlClusterServer()
|
|
761
858
|
.addRequiredClusterServers();
|
|
@@ -785,7 +882,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
785
882
|
}
|
|
786
883
|
}, this.fanOnHigh.log);
|
|
787
884
|
this.fanComplete = new MatterbridgeEndpoint([fanDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Fan complete' }, this.config.debug)
|
|
788
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Fan complete', '
|
|
885
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Fan complete', 'FCO00033', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
|
|
789
886
|
.createDefaultPowerSourceWiredClusterServer()
|
|
790
887
|
.createCompleteFanControlClusterServer()
|
|
791
888
|
.addRequiredClusterServers();
|
|
@@ -836,48 +933,48 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
836
933
|
this.fanComplete?.log.info(`Airflow direction changed from ${this.fanDirectionLookup[oldValue]} to ${this.fanDirectionLookup[newValue]} context: ${context.offline === true ? 'offline' : 'online'}`);
|
|
837
934
|
}, this.fanComplete?.log);
|
|
838
935
|
this.waterLeak = new MatterbridgeEndpoint([waterLeakDetector, bridgedNode, powerSource], { uniqueStorageKey: 'Water leak detector' }, this.config.debug)
|
|
839
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Water leak detector', '
|
|
936
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Water leak detector', 'WLD00034', 0xfff1, 'Matterbridge', 'Matterbridge WaterLeakDetector')
|
|
840
937
|
.createDefaultPowerSourceRechargeableBatteryClusterServer()
|
|
841
938
|
.createDefaultBooleanStateClusterServer(false)
|
|
842
939
|
.addRequiredClusterServers()
|
|
843
940
|
.addOptionalClusterServers();
|
|
844
941
|
this.waterLeak = await this.addDevice(this.waterLeak);
|
|
845
942
|
this.waterFreeze = new MatterbridgeEndpoint([waterFreezeDetector, bridgedNode, powerSource], { uniqueStorageKey: 'Water freeze detector' }, this.config.debug)
|
|
846
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Water freeze detector', '
|
|
943
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Water freeze detector', 'WFD00035', 0xfff1, 'Matterbridge', 'Matterbridge WaterFreezeDetector')
|
|
847
944
|
.createDefaultPowerSourceRechargeableBatteryClusterServer()
|
|
848
945
|
.createDefaultBooleanStateClusterServer(false)
|
|
849
946
|
.addRequiredClusterServers()
|
|
850
947
|
.addOptionalClusterServers();
|
|
851
948
|
this.waterFreeze = await this.addDevice(this.waterFreeze);
|
|
852
949
|
this.rain = new MatterbridgeEndpoint([rainSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Rain sensor' }, this.config.debug)
|
|
853
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Rain sensor', '
|
|
950
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Rain sensor', 'RAI00036', 0xfff1, 'Matterbridge', 'Matterbridge RainSensor')
|
|
854
951
|
.createDefaultPowerSourceRechargeableBatteryClusterServer()
|
|
855
952
|
.createDefaultIdentifyClusterServer()
|
|
856
953
|
.createDefaultBooleanStateClusterServer(false)
|
|
857
954
|
.createDefaultBooleanStateConfigurationClusterServer();
|
|
858
955
|
this.rain = await this.addDevice(this.rain);
|
|
859
956
|
this.smokeCo = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode, powerSource], { uniqueStorageKey: 'SmokeCo alarm sensor' }, this.config.debug)
|
|
860
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('SmokeCo alarm sensor', '
|
|
957
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('SmokeCo alarm sensor', 'SCA00037', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm')
|
|
861
958
|
.createDefaultIdentifyClusterServer()
|
|
862
959
|
.createDefaultSmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal, SmokeCoAlarm.AlarmState.Normal)
|
|
863
960
|
.createDefaultPowerSourceReplaceableBatteryClusterServer()
|
|
864
961
|
.createDefaultCarbonMonoxideConcentrationMeasurementClusterServer(100);
|
|
865
962
|
this.smokeCo = await this.addDevice(this.smokeCo);
|
|
866
963
|
this.smokeOnly = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode, powerSource], { uniqueStorageKey: 'Smoke alarm sensor' }, this.config.debug)
|
|
867
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Smoke alarm sensor', '
|
|
964
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Smoke alarm sensor', 'SAL00038', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm')
|
|
868
965
|
.createDefaultIdentifyClusterServer()
|
|
869
966
|
.createSmokeOnlySmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal)
|
|
870
967
|
.createDefaultPowerSourceReplaceableBatteryClusterServer();
|
|
871
968
|
this.smokeOnly = await this.addDevice(this.smokeOnly);
|
|
872
969
|
this.coOnly = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode, powerSource], { uniqueStorageKey: 'Co alarm sensor' }, this.config.debug)
|
|
873
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Co alarm sensor', '
|
|
970
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Co alarm sensor', 'COA00039', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm')
|
|
874
971
|
.createDefaultIdentifyClusterServer()
|
|
875
972
|
.createCoOnlySmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal)
|
|
876
973
|
.createDefaultPowerSourceReplaceableBatteryClusterServer()
|
|
877
974
|
.createDefaultCarbonMonoxideConcentrationMeasurementClusterServer(100);
|
|
878
975
|
this.coOnly = await this.addDevice(this.coOnly);
|
|
879
976
|
this.airQuality = new MatterbridgeEndpoint([airQualitySensor, bridgedNode, powerSource], { uniqueStorageKey: 'Air quality sensor' }, this.config.debug)
|
|
880
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Air quality sensor', '
|
|
977
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Air quality sensor', 'AQS00040', 0xfff1, 'Matterbridge', 'Matterbridge Air Quality Sensor')
|
|
881
978
|
.createDefaultPowerSourceReplaceableBatteryClusterServer(50, PowerSource.BatChargeLevel.Warning, 2900, 'CR2450', 1)
|
|
882
979
|
.addRequiredClusterServers()
|
|
883
980
|
.addClusterServers([TemperatureMeasurement.Cluster.id, RelativeHumidityMeasurement.Cluster.id])
|
|
@@ -893,7 +990,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
893
990
|
.createDefaultTvocMeasurementClusterServer(100, ConcentrationMeasurement.MeasurementUnit.Ugm3);
|
|
894
991
|
this.airQuality = await this.addDevice(this.airQuality);
|
|
895
992
|
this.momentarySwitch = new MatterbridgeEndpoint([bridgedNode, powerSource], { uniqueStorageKey: 'Momentary switch composed' }, this.config.debug)
|
|
896
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Momentary switch
|
|
993
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Momentary switch', 'MOS00041', 0xfff1, 'Matterbridge', 'Matterbridge MomentarySwitch')
|
|
897
994
|
.createDefaultIdentifyClusterServer()
|
|
898
995
|
.createDefaultPowerSourceReplaceableBatteryClusterServer(50, PowerSource.BatChargeLevel.Ok, 2900, 'CR2450', 1);
|
|
899
996
|
this.momentarySwitch
|
|
@@ -975,12 +1072,12 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
975
1072
|
await switch6.addFixedLabel('button', 'Button 6');
|
|
976
1073
|
}
|
|
977
1074
|
this.latchingSwitch = new MatterbridgeEndpoint([genericSwitch, bridgedNode, powerSource], { uniqueStorageKey: 'Latching switch' }, this.config.debug)
|
|
978
|
-
.createDefaultBridgedDeviceBasicInformationClusterServer('Latching switch', '
|
|
1075
|
+
.createDefaultBridgedDeviceBasicInformationClusterServer('Latching switch', 'LAS00042', 0xfff1, 'Matterbridge', 'Matterbridge LatchingSwitch')
|
|
979
1076
|
.createDefaultIdentifyClusterServer()
|
|
980
1077
|
.createDefaultLatchingSwitchClusterServer()
|
|
981
1078
|
.createDefaultPowerSourceReplaceableBatteryClusterServer(10, PowerSource.BatChargeLevel.Critical, 2850, 'CR2032', 1);
|
|
982
1079
|
this.latchingSwitch = await this.addDevice(this.latchingSwitch);
|
|
983
|
-
this.roboticVacuum = new RoboticVacuumCleaner('Robot Vacuum', '
|
|
1080
|
+
this.roboticVacuum = new RoboticVacuumCleaner('Robot Vacuum', 'RVC00043', this.config.enableServerRvc === true ? 'server' : undefined, 1, [
|
|
984
1081
|
{ label: 'Idle', mode: 1, modeTags: [{ value: RvcRunMode.ModeTag.Idle }] },
|
|
985
1082
|
{ label: 'Cleaning', mode: 2, modeTags: [{ value: RvcRunMode.ModeTag.Cleaning }] },
|
|
986
1083
|
{ label: 'Mapping', mode: 3, modeTags: [{ value: RvcRunMode.ModeTag.Mapping }] },
|
|
@@ -1021,43 +1118,43 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
1021
1118
|
},
|
|
1022
1119
|
]);
|
|
1023
1120
|
if (this.config.enableServerRvc === true) {
|
|
1024
|
-
this.log.notice('RVC is in server mode');
|
|
1121
|
+
this.log.notice('RVC is in server mode so it has its own QR code (it shows in the "Devices" panel of the Home page)');
|
|
1025
1122
|
}
|
|
1026
1123
|
this.roboticVacuum = await this.addDevice(this.roboticVacuum);
|
|
1027
|
-
this.waterHeater = new WaterHeater('Water Heater', '
|
|
1124
|
+
this.waterHeater = new WaterHeater('Water Heater', 'WHT00044', 50, 60, 20, 80, undefined, 85, 220_000, 1_000, 220_000, 12_000_000, 500_000, 3_000_000);
|
|
1028
1125
|
this.waterHeater = await this.addDevice(this.waterHeater);
|
|
1029
|
-
this.evse = new Evse('Evse', '
|
|
1126
|
+
this.evse = new Evse('Evse', 'EVS00045', 1, [
|
|
1030
1127
|
{ label: 'On demand', mode: 1, modeTags: [{ value: EnergyEvseMode.ModeTag.Manual }] },
|
|
1031
1128
|
{ label: 'Scheduled', mode: 2, modeTags: [{ value: EnergyEvseMode.ModeTag.TimeOfUse }] },
|
|
1032
1129
|
{ label: 'Solar Charging', mode: 3, modeTags: [{ value: EnergyEvseMode.ModeTag.SolarCharging }] },
|
|
1033
1130
|
{ label: 'Solar Charging Scheduled', mode: 4, modeTags: [{ value: EnergyEvseMode.ModeTag.SolarCharging }, { value: EnergyEvseMode.ModeTag.TimeOfUse }] },
|
|
1034
1131
|
], EnergyEvse.State.PluggedInCharging, EnergyEvse.SupplyState.ChargingEnabled, EnergyEvse.FaultState.NoError, 220_000, 10_000, 2_200_000, 1_000_000, 500_000, 32_000_000);
|
|
1035
1132
|
this.evse = await this.addDevice(this.evse);
|
|
1036
|
-
this.solarPower = new SolarPower('Solar Power', '
|
|
1133
|
+
this.solarPower = new SolarPower('Solar Power', 'SOL00046', 220_000, 10_000, 2200_000, 2_200_000, -10_000_000, 500_000);
|
|
1037
1134
|
this.solarPower = await this.addDevice(this.solarPower);
|
|
1038
|
-
this.batteryStorage = new BatteryStorage('Battery Storage', '
|
|
1135
|
+
this.batteryStorage = new BatteryStorage('Battery Storage', 'BST00047', 75, PowerSource.BatChargeLevel.Ok, 220_000, 10_000, 2_200_000, 1_000_000, 2_000_000, -2_000_000, 3_000_000);
|
|
1039
1136
|
this.batteryStorage = await this.addDevice(this.batteryStorage);
|
|
1040
|
-
this.heatPump = new HeatPump('Heat Pump', '
|
|
1137
|
+
this.heatPump = new HeatPump('Heat Pump', 'HPU00048', 220_000, 10_000, 2_200_000, 1_000_000, 500_000, 3_000_000);
|
|
1041
1138
|
this.heatPump = await this.addDevice(this.heatPump);
|
|
1042
|
-
this.laundryWasher = new LaundryWasher('Laundry Washer', '
|
|
1139
|
+
this.laundryWasher = new LaundryWasher('Laundry Washer', 'LWA00049');
|
|
1043
1140
|
this.laundryWasher = await this.addDevice(this.laundryWasher);
|
|
1044
|
-
this.laundryDryer = new LaundryDryer('Laundry Dryer', '
|
|
1141
|
+
this.laundryDryer = new LaundryDryer('Laundry Dryer', 'LDR00050');
|
|
1045
1142
|
this.laundryDryer = await this.addDevice(this.laundryDryer);
|
|
1046
|
-
this.dishwasher = new Dishwasher('Dishwasher', '
|
|
1143
|
+
this.dishwasher = new Dishwasher('Dishwasher', 'DSW00051');
|
|
1047
1144
|
this.dishwasher = await this.addDevice(this.dishwasher);
|
|
1048
|
-
this.extractorHood = new ExtractorHood('Extractor Hood', '
|
|
1145
|
+
this.extractorHood = new ExtractorHood('Extractor Hood', 'EXH00052');
|
|
1049
1146
|
this.extractorHood = await this.addDevice(this.extractorHood);
|
|
1050
|
-
this.microwaveOven = new MicrowaveOven('Microwave Oven', '
|
|
1147
|
+
this.microwaveOven = new MicrowaveOven('Microwave Oven', 'MWO00053');
|
|
1051
1148
|
this.microwaveOven = await this.addDevice(this.microwaveOven);
|
|
1052
|
-
this.oven = new Oven('Oven', '
|
|
1053
|
-
this.oven.addCabinet('Upper Cabinet', [{ mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: PositionTag.Top.label }]);
|
|
1149
|
+
this.oven = new Oven('Oven', 'OVN00054');
|
|
1150
|
+
this.oven.addCabinet('Upper Cabinet', [{ mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: PositionTag.Top.label }], undefined, undefined, undefined, undefined, undefined, undefined, ['pre-heating', 'pre-heated', 'cooling down']);
|
|
1054
1151
|
this.oven.addCabinet('Lower Cabinet', [{ mfgCode: null, namespaceId: PositionTag.Bottom.namespaceId, tag: PositionTag.Bottom.tag, label: PositionTag.Bottom.label }], 3, [
|
|
1055
1152
|
{ label: 'Convection', mode: 1, modeTags: [{ value: OvenMode.ModeTag.Convection }] },
|
|
1056
1153
|
{ label: 'Clean', mode: 2, modeTags: [{ value: OvenMode.ModeTag.Clean }] },
|
|
1057
1154
|
{ label: 'Steam', mode: 3, modeTags: [{ value: OvenMode.ModeTag.Steam }] },
|
|
1058
|
-
], 2, ['180°', '190°', '200°'], OperationalState.OperationalStateEnum.Running,
|
|
1155
|
+
], 2, ['180°', '190°', '200°'], OperationalState.OperationalStateEnum.Running, undefined, ['pre-heating', 'pre-heated', 'cooling down']);
|
|
1059
1156
|
this.oven = (await this.addDevice(this.oven));
|
|
1060
|
-
this.cooktop = new Cooktop('Cooktop', '
|
|
1157
|
+
this.cooktop = new Cooktop('Cooktop', 'CKT00055');
|
|
1061
1158
|
this.cooktop.addSurface('Surface Top Left', [
|
|
1062
1159
|
{ mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: PositionTag.Top.label },
|
|
1063
1160
|
{ mfgCode: null, namespaceId: PositionTag.Left.namespaceId, tag: PositionTag.Left.tag, label: PositionTag.Left.label },
|
|
@@ -1075,20 +1172,260 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
1075
1172
|
{ mfgCode: null, namespaceId: PositionTag.Right.namespaceId, tag: PositionTag.Right.tag, label: PositionTag.Right.label },
|
|
1076
1173
|
]);
|
|
1077
1174
|
this.cooktop = (await this.addDevice(this.cooktop));
|
|
1078
|
-
const refrigerator = new Refrigerator('Refrigerator', '
|
|
1175
|
+
const refrigerator = new Refrigerator('Refrigerator', 'REF00056');
|
|
1079
1176
|
refrigerator.addCabinet('Refrigerator Top', [
|
|
1080
1177
|
{ mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: 'Refrigerator Top' },
|
|
1081
1178
|
{ mfgCode: null, namespaceId: RefrigeratorTag.Refrigerator.namespaceId, tag: RefrigeratorTag.Refrigerator.tag, label: RefrigeratorTag.Refrigerator.label },
|
|
1082
|
-
]
|
|
1179
|
+
], 1, [
|
|
1180
|
+
{ label: 'Auto', mode: 1, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.Auto }] },
|
|
1181
|
+
{ label: 'RapidCool', mode: 2, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidCool }] },
|
|
1182
|
+
], undefined, undefined, 1200);
|
|
1083
1183
|
refrigerator.addCabinet('Freezer Bottom', [
|
|
1084
1184
|
{ mfgCode: null, namespaceId: PositionTag.Bottom.namespaceId, tag: PositionTag.Bottom.tag, label: 'Freezer Bottom' },
|
|
1085
1185
|
{ mfgCode: null, namespaceId: RefrigeratorTag.Freezer.namespaceId, tag: RefrigeratorTag.Freezer.tag, label: RefrigeratorTag.Freezer.label },
|
|
1086
|
-
]
|
|
1186
|
+
], 1, [
|
|
1187
|
+
{ label: 'Auto', mode: 1, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.Auto }] },
|
|
1188
|
+
{ label: 'RapidFreeze', mode: 2, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidFreeze }] },
|
|
1189
|
+
], undefined, undefined, -1000);
|
|
1087
1190
|
this.refrigerator = (await this.addDevice(refrigerator));
|
|
1088
1191
|
}
|
|
1089
1192
|
async onConfigure() {
|
|
1090
1193
|
await super.onConfigure();
|
|
1091
1194
|
this.log.info('onConfigure called');
|
|
1195
|
+
if (this.config.useInterval) {
|
|
1196
|
+
this.phaseInterval = setInterval(async () => {
|
|
1197
|
+
this.phase = this.phase + 1 > 10 ? 0 : this.phase + 1;
|
|
1198
|
+
this.log.info(`Appliances animation phase ${this.phase}`);
|
|
1199
|
+
if (this.roboticVacuum) {
|
|
1200
|
+
if (this.phase === 0) {
|
|
1201
|
+
this.roboticVacuum.log.info(`RVC: Reset to Idle, Vacuum, Docked`);
|
|
1202
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 200, this.roboticVacuum.log);
|
|
1203
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batChargeState', PowerSource.BatChargeState.IsAtFullCharge, this.roboticVacuum.log);
|
|
1204
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batVoltage', 6000, this.roboticVacuum.log);
|
|
1205
|
+
await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
|
|
1206
|
+
await this.roboticVacuum.setAttribute('RvcCleanMode', 'currentMode', 1, this.roboticVacuum.log);
|
|
1207
|
+
await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Docked, this.roboticVacuum.log);
|
|
1208
|
+
}
|
|
1209
|
+
if (this.phase === 1) {
|
|
1210
|
+
this.roboticVacuum.log.info(`RVC: start cleaning...`);
|
|
1211
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batChargeState', PowerSource.BatChargeState.IsNotCharging, this.roboticVacuum.log);
|
|
1212
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batVoltage', 5900, this.roboticVacuum.log);
|
|
1213
|
+
await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 2, this.roboticVacuum.log);
|
|
1214
|
+
await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Running, this.roboticVacuum.log);
|
|
1215
|
+
await this.roboticVacuum.setAttribute('ServiceArea', 'currentArea', 1, this.roboticVacuum.log);
|
|
1216
|
+
}
|
|
1217
|
+
if (this.phase === 2) {
|
|
1218
|
+
this.roboticVacuum.log.info(`RVC: pause cleaning...`);
|
|
1219
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 180, this.roboticVacuum.log);
|
|
1220
|
+
await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 2, this.roboticVacuum.log);
|
|
1221
|
+
await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Paused, this.roboticVacuum.log);
|
|
1222
|
+
}
|
|
1223
|
+
if (this.phase === 3) {
|
|
1224
|
+
this.roboticVacuum.log.info(`RVC: resume cleaning...`);
|
|
1225
|
+
await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 2, this.roboticVacuum.log);
|
|
1226
|
+
await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Running, this.roboticVacuum.log);
|
|
1227
|
+
await this.roboticVacuum.setAttribute('ServiceArea', 'currentArea', 2, this.roboticVacuum.log);
|
|
1228
|
+
}
|
|
1229
|
+
if (this.phase === 4) {
|
|
1230
|
+
this.roboticVacuum.log.info(`RVC: stop cleaning...`);
|
|
1231
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 160, this.roboticVacuum.log);
|
|
1232
|
+
await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
|
|
1233
|
+
await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Stopped, this.roboticVacuum.log);
|
|
1234
|
+
}
|
|
1235
|
+
if (this.phase === 5) {
|
|
1236
|
+
this.roboticVacuum.log.info(`RVC: going home...`);
|
|
1237
|
+
await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
|
|
1238
|
+
await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.SeekingCharger, this.roboticVacuum.log);
|
|
1239
|
+
}
|
|
1240
|
+
if (this.phase === 6) {
|
|
1241
|
+
this.roboticVacuum.log.info(`RVC: charging...`);
|
|
1242
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 180, this.roboticVacuum.log);
|
|
1243
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batChargeState', PowerSource.BatChargeState.IsCharging, this.roboticVacuum.log);
|
|
1244
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batVoltage', 6100, this.roboticVacuum.log);
|
|
1245
|
+
await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
|
|
1246
|
+
await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Charging, this.roboticVacuum.log);
|
|
1247
|
+
await this.roboticVacuum.setAttribute('ServiceArea', 'currentArea', 1, this.roboticVacuum.log);
|
|
1248
|
+
}
|
|
1249
|
+
if (this.phase === 7) {
|
|
1250
|
+
this.roboticVacuum.log.info(`RVC: charging...`);
|
|
1251
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 190, this.roboticVacuum.log);
|
|
1252
|
+
await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
|
|
1253
|
+
await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Charging, this.roboticVacuum.log);
|
|
1254
|
+
}
|
|
1255
|
+
if (this.phase === 8) {
|
|
1256
|
+
this.roboticVacuum.log.info(`RVC: docked...`);
|
|
1257
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 200, this.roboticVacuum.log);
|
|
1258
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batChargeState', PowerSource.BatChargeState.IsAtFullCharge, this.roboticVacuum.log);
|
|
1259
|
+
await this.roboticVacuum.setAttribute('PowerSource', 'batVoltage', 6000, this.roboticVacuum.log);
|
|
1260
|
+
await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
|
|
1261
|
+
await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Docked, this.roboticVacuum.log);
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
if (this.phase === 0) {
|
|
1265
|
+
if (this.airConditioner || this.laundryWasher || this.laundryDryer || this.dishwasher)
|
|
1266
|
+
this.log.info(`Set appliances dead front OnOff to true`);
|
|
1267
|
+
await this.airConditioner?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.airConditioner.log);
|
|
1268
|
+
await this.laundryWasher?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.laundryWasher.log);
|
|
1269
|
+
await this.laundryDryer?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.laundryDryer.log);
|
|
1270
|
+
await this.dishwasher?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.dishwasher.log);
|
|
1271
|
+
this.cooktop?.log.info(`Set Cooktop offOnly onOff clusters to on`);
|
|
1272
|
+
await this.cooktop?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop.log);
|
|
1273
|
+
await this.cooktop?.getChildEndpointByName('SurfaceTopLeft')?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop?.log);
|
|
1274
|
+
await this.cooktop?.getChildEndpointByName('SurfaceTopRight')?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop?.log);
|
|
1275
|
+
}
|
|
1276
|
+
if (this.oven) {
|
|
1277
|
+
const upperCabinet = this.oven.getChildEndpointByName('UpperCabinet');
|
|
1278
|
+
const lowerCabinet = this.oven.getChildEndpointByName('LowerCabinet');
|
|
1279
|
+
if (this.phase === 0) {
|
|
1280
|
+
await upperCabinet?.setAttribute('OvenMode', 'currentMode', 3, upperCabinet.log);
|
|
1281
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, upperCabinet.log);
|
|
1282
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, upperCabinet.log);
|
|
1283
|
+
await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
|
|
1284
|
+
await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 2000, upperCabinet.log);
|
|
1285
|
+
await lowerCabinet?.setAttribute('OvenMode', 'currentMode', 3, lowerCabinet.log);
|
|
1286
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, lowerCabinet.log);
|
|
1287
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, lowerCabinet.log);
|
|
1288
|
+
await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
|
|
1289
|
+
await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 2000, lowerCabinet.log);
|
|
1290
|
+
}
|
|
1291
|
+
if (this.phase === 1) {
|
|
1292
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, upperCabinet.log);
|
|
1293
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 0, upperCabinet.log);
|
|
1294
|
+
await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
|
|
1295
|
+
await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, upperCabinet.log);
|
|
1296
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, lowerCabinet.log);
|
|
1297
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 0, lowerCabinet.log);
|
|
1298
|
+
await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
|
|
1299
|
+
await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, lowerCabinet.log);
|
|
1300
|
+
}
|
|
1301
|
+
if (this.phase === 2) {
|
|
1302
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, upperCabinet.log);
|
|
1303
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 1, upperCabinet.log);
|
|
1304
|
+
await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
|
|
1305
|
+
await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 19000, upperCabinet.log);
|
|
1306
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, lowerCabinet.log);
|
|
1307
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 1, lowerCabinet.log);
|
|
1308
|
+
await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
|
|
1309
|
+
await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 20000, lowerCabinet.log);
|
|
1310
|
+
}
|
|
1311
|
+
if (this.phase === 8) {
|
|
1312
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, upperCabinet.log);
|
|
1313
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, upperCabinet.log);
|
|
1314
|
+
await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
|
|
1315
|
+
await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 10000, upperCabinet.log);
|
|
1316
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, lowerCabinet.log);
|
|
1317
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, lowerCabinet.log);
|
|
1318
|
+
await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
|
|
1319
|
+
await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 10000, lowerCabinet.log);
|
|
1320
|
+
}
|
|
1321
|
+
if (this.phase === 9) {
|
|
1322
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, upperCabinet.log);
|
|
1323
|
+
await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, upperCabinet.log);
|
|
1324
|
+
await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
|
|
1325
|
+
await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, upperCabinet.log);
|
|
1326
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, lowerCabinet.log);
|
|
1327
|
+
await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, lowerCabinet.log);
|
|
1328
|
+
await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
|
|
1329
|
+
await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, lowerCabinet.log);
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
if (this.refrigerator) {
|
|
1333
|
+
if (this.phase === 0) {
|
|
1334
|
+
let mode;
|
|
1335
|
+
const refrigerator = this.refrigerator.getChildEndpointByName('RefrigeratorTop');
|
|
1336
|
+
mode = refrigerator?.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', refrigerator.log);
|
|
1337
|
+
mode = mode === 1 ? 2 : 1;
|
|
1338
|
+
await refrigerator?.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, refrigerator.log);
|
|
1339
|
+
if (mode === 1)
|
|
1340
|
+
await refrigerator?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, refrigerator.log);
|
|
1341
|
+
if (mode === 1)
|
|
1342
|
+
await refrigerator?.setAttribute('TemperatureMeasurement', 'measuredValue', 1200, refrigerator.log);
|
|
1343
|
+
if (mode === 2)
|
|
1344
|
+
await refrigerator?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 0, refrigerator.log);
|
|
1345
|
+
if (mode === 2)
|
|
1346
|
+
await refrigerator?.setAttribute('TemperatureMeasurement', 'measuredValue', 1000, refrigerator.log);
|
|
1347
|
+
const freezer = this.refrigerator.getChildEndpointByName('FreezerBottom');
|
|
1348
|
+
mode = freezer?.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', freezer.log);
|
|
1349
|
+
mode = mode === 1 ? 2 : 1;
|
|
1350
|
+
await freezer?.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, freezer.log);
|
|
1351
|
+
if (mode === 1)
|
|
1352
|
+
await freezer?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, freezer.log);
|
|
1353
|
+
if (mode === 1)
|
|
1354
|
+
await freezer?.setAttribute('TemperatureMeasurement', 'measuredValue', -1000, freezer.log);
|
|
1355
|
+
if (mode === 2)
|
|
1356
|
+
await freezer?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 0, freezer.log);
|
|
1357
|
+
if (mode === 2)
|
|
1358
|
+
await freezer?.setAttribute('TemperatureMeasurement', 'measuredValue', -1500, freezer.log);
|
|
1359
|
+
}
|
|
1360
|
+
if (this.phase === 1)
|
|
1361
|
+
await this.refrigerator.setDoorOpenState('RefrigeratorTop', true);
|
|
1362
|
+
if (this.phase === 2)
|
|
1363
|
+
await this.refrigerator.triggerDoorOpenState('RefrigeratorTop', true);
|
|
1364
|
+
if (this.phase === 4)
|
|
1365
|
+
await this.refrigerator.setDoorOpenState('RefrigeratorTop', false);
|
|
1366
|
+
if (this.phase === 4)
|
|
1367
|
+
await this.refrigerator.triggerDoorOpenState('RefrigeratorTop', false);
|
|
1368
|
+
if (this.phase === 6)
|
|
1369
|
+
await this.refrigerator.setDoorOpenState('FreezerBottom', true);
|
|
1370
|
+
if (this.phase === 7)
|
|
1371
|
+
await this.refrigerator.triggerDoorOpenState('FreezerBottom', true);
|
|
1372
|
+
if (this.phase === 9)
|
|
1373
|
+
await this.refrigerator.setDoorOpenState('FreezerBottom', false);
|
|
1374
|
+
if (this.phase === 9)
|
|
1375
|
+
await this.refrigerator.triggerDoorOpenState('FreezerBottom', false);
|
|
1376
|
+
}
|
|
1377
|
+
}, 10 * 1000);
|
|
1378
|
+
}
|
|
1379
|
+
if (this.config.useInterval) {
|
|
1380
|
+
this.sensorInterval = setInterval(async () => {
|
|
1381
|
+
let value = this.door?.getAttribute(BooleanState.Cluster.id, 'stateValue', this.door.log);
|
|
1382
|
+
if (isValidBoolean(value)) {
|
|
1383
|
+
value = !value;
|
|
1384
|
+
await this.door?.setAttribute(BooleanState.Cluster.id, 'stateValue', value, this.door.log);
|
|
1385
|
+
this.door?.log.info(`Set door stateValue to ${value}`);
|
|
1386
|
+
}
|
|
1387
|
+
const occupancyValue = this.occupancy?.getAttribute(OccupancySensing.Cluster.id, 'occupancy', this.occupancy.log);
|
|
1388
|
+
if (isValidObject(occupancyValue, 1)) {
|
|
1389
|
+
occupancyValue.occupied = !occupancyValue.occupied;
|
|
1390
|
+
await this.occupancy?.setAttribute(OccupancySensing.Cluster.id, 'occupancy', occupancyValue, this.occupancy.log);
|
|
1391
|
+
this.occupancy?.log.info(`Set occupancy to ${occupancyValue.occupied}`);
|
|
1392
|
+
}
|
|
1393
|
+
value = this.illuminance?.getAttribute(IlluminanceMeasurement.Cluster.id, 'measuredValue', this.illuminance.log);
|
|
1394
|
+
if (isValidNumber(value, 0, 0xfffe)) {
|
|
1395
|
+
value = matterToLux(value);
|
|
1396
|
+
value = value + 10 < 500 ? value + 10 : 1;
|
|
1397
|
+
await this.illuminance?.setAttribute(IlluminanceMeasurement.Cluster.id, 'measuredValue', luxToMatter(value), this.illuminance.log);
|
|
1398
|
+
this.illuminance?.log.info(`Set illuminance measuredValue to ${value}`);
|
|
1399
|
+
}
|
|
1400
|
+
value = this.temperature?.getAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', this.temperature.log);
|
|
1401
|
+
if (isValidNumber(value, 0, 0xfffe)) {
|
|
1402
|
+
value = value + 100 < 3000 ? value + 100 : 1000;
|
|
1403
|
+
await this.temperature?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', value, this.temperature.log);
|
|
1404
|
+
await this.climate?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
|
|
1405
|
+
this.temperature?.log.info(`Set temperature measuredValue to ${value}`);
|
|
1406
|
+
}
|
|
1407
|
+
value = this.humidity?.getAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', this.humidity.log);
|
|
1408
|
+
if (isValidNumber(value, 0, 0xfffe)) {
|
|
1409
|
+
value = value + 100 < 10000 ? value + 100 : 100;
|
|
1410
|
+
await this.humidity?.setAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', value, this.humidity.log);
|
|
1411
|
+
await this.climate?.setAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
|
|
1412
|
+
this.humidity?.log.info(`Set humidity measuredValue to ${value}`);
|
|
1413
|
+
}
|
|
1414
|
+
value = this.pressure?.getAttribute(PressureMeasurement.Cluster.id, 'measuredValue', this.pressure.log);
|
|
1415
|
+
if (isValidNumber(value, 0, 0xfffe)) {
|
|
1416
|
+
value = value + 10 < 9900 ? value + 10 : 8600;
|
|
1417
|
+
await this.pressure?.setAttribute(PressureMeasurement.Cluster.id, 'measuredValue', value, this.pressure.log);
|
|
1418
|
+
await this.climate?.setAttribute(PressureMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
|
|
1419
|
+
this.pressure?.log.info(`Set pressure measuredValue to ${value}`);
|
|
1420
|
+
}
|
|
1421
|
+
value = this.flow?.getAttribute(FlowMeasurement.Cluster.id, 'measuredValue', this.flow.log);
|
|
1422
|
+
if (isValidNumber(value, 0, 0xfffe)) {
|
|
1423
|
+
value = value + 1 < 50 ? value + 1 : 1;
|
|
1424
|
+
await this.flow?.setAttribute(FlowMeasurement.Cluster.id, 'measuredValue', value, this.flow.log);
|
|
1425
|
+
this.flow?.log.info(`Set flow measuredValue to ${value}`);
|
|
1426
|
+
}
|
|
1427
|
+
}, 60 * 1000 + 900);
|
|
1428
|
+
}
|
|
1092
1429
|
await this.switch?.setAttribute(OnOff.Cluster.id, 'onOff', this.intervalOnOff, this.switch.log);
|
|
1093
1430
|
await this.mountedOnOffSwitch?.setAttribute(OnOff.Cluster.id, 'onOff', this.intervalOnOff, this.mountedOnOffSwitch.log);
|
|
1094
1431
|
this.switch?.log.info(`Set switch initial onOff to ${this.intervalOnOff}`);
|
|
@@ -1134,7 +1471,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
1134
1471
|
this.lightInterval = setInterval(async () => {
|
|
1135
1472
|
this.intervalLevel += 10;
|
|
1136
1473
|
if (this.intervalLevel >= 250) {
|
|
1137
|
-
this.intervalLevel =
|
|
1474
|
+
this.intervalLevel = 1;
|
|
1138
1475
|
await this.lightOnOff?.setAttribute(OnOff.Cluster.id, 'onOff', false, this.lightOnOff.log);
|
|
1139
1476
|
await this.dimmer?.setAttribute(OnOff.Cluster.id, 'onOff', false, this.dimmer.log);
|
|
1140
1477
|
await this.mountedDimmerSwitch?.setAttribute(OnOff.Cluster.id, 'onOff', false, this.mountedDimmerSwitch.log);
|
|
@@ -1365,17 +1702,6 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
1365
1702
|
}
|
|
1366
1703
|
}, 60 * 1000 + 1100);
|
|
1367
1704
|
}
|
|
1368
|
-
await this.airConditioner?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.airConditioner.log);
|
|
1369
|
-
await this.laundryWasher?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.laundryWasher.log);
|
|
1370
|
-
await this.laundryDryer?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.laundryDryer.log);
|
|
1371
|
-
await this.dishwasher?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.dishwasher.log);
|
|
1372
|
-
this.log.info(`Set appliances dead front OnOff to on`);
|
|
1373
|
-
this.cooktop?.log.info(`Set Cooktop offOnly onOff clusters to on`);
|
|
1374
|
-
await this.cooktop?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop.log);
|
|
1375
|
-
await this.cooktop?.getChildEndpointByName('SurfaceTopLeft')?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop?.log);
|
|
1376
|
-
await this.cooktop?.getChildEndpointByName('SurfaceTopRight')?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop?.log);
|
|
1377
|
-
await this.refrigerator?.getChildEndpointByName('RefrigeratorTop')?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', 1200, this.refrigerator?.log);
|
|
1378
|
-
await this.refrigerator?.getChildEndpointByName('FreezerBottom')?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', -1000, this.refrigerator?.log);
|
|
1379
1705
|
if (this.config.useInterval) {
|
|
1380
1706
|
this.genericSwitchLastEvent = 'Release';
|
|
1381
1707
|
this.genericSwitchInterval = setInterval(async () => {
|
|
@@ -1412,6 +1738,8 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
|
|
|
1412
1738
|
}
|
|
1413
1739
|
}
|
|
1414
1740
|
async onShutdown(reason) {
|
|
1741
|
+
clearInterval(this.phaseInterval);
|
|
1742
|
+
clearInterval(this.sensorInterval);
|
|
1415
1743
|
clearInterval(this.switchInterval);
|
|
1416
1744
|
clearInterval(this.lightInterval);
|
|
1417
1745
|
clearInterval(this.outletInterval);
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge-example-dynamic-platform",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.9-dev-20250901-ccc8cd6",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "matterbridge-example-dynamic-platform",
|
|
9
|
-
"version": "1.3.
|
|
9
|
+
"version": "1.3.9-dev-20250901-ccc8cd6",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"node-ansi-logger": "3.1.1",
|