matterbridge 3.2.6-dev-20250903-6ab5022 → 3.2.6-dev-20250904-a79f653
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 +10 -1
- package/dist/devices/airConditioner.js +17 -0
- package/dist/devices/export.js +2 -0
- package/dist/devices/speaker.js +35 -0
- package/dist/frontend.js +1 -0
- package/dist/jest-utils/jestHelpers.js +174 -0
- package/dist/matterbridgeDeviceTypes.js +82 -30
- package/dist/matterbridgeEndpoint.js +4 -4
- package/frontend/build/asset-manifest.json +3 -3
- package/frontend/build/index.html +1 -1
- package/frontend/build/static/js/{main.710b8f9f.js → main.e691e19f.js} +3 -3
- package/frontend/build/static/js/{main.710b8f9f.js.map → main.e691e19f.js.map} +1 -1
- package/npm-shrinkwrap.json +26 -10
- package/package.json +1 -1
- /package/frontend/build/static/js/{main.710b8f9f.js.LICENSE.txt → main.e691e19f.js.LICENSE.txt} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -13,11 +13,20 @@ If you like this project and find it useful, please consider giving it a star on
|
|
|
13
13
|
### Added
|
|
14
14
|
|
|
15
15
|
- [frontend]: Added primary color to QR icon in childbridge mode if the plugin is not paired.
|
|
16
|
-
- [frontend]: Added secondary color to QR icon in childbridge mode if the plugin server node is paired but
|
|
16
|
+
- [frontend]: Added secondary color to QR icon in childbridge mode if the plugin server node is paired but doesn't have at least 1 session and 1 subscription.
|
|
17
17
|
- [frontend]: Added color red to QR icon in childbridge mode if the plugin server node is not online.
|
|
18
|
+
- [frontend]: Added primary color to QR icon of 'server' mode devices if the device is not paired.
|
|
19
|
+
- [frontend]: Added secondary color to QR icon of 'server' mode devices if the device server node is paired but doesn't have at least 1 session and 1 subscription.
|
|
20
|
+
- [frontend]: Added color red to QR icon of 'server' mode devices if the device server node is not online.
|
|
21
|
+
- [frontend]: Added serialNumber to QR icon of 'server' mode devices.
|
|
18
22
|
- [frontend]: Bumped `frontend` version to 2.7.5.
|
|
19
23
|
- [childbridge]: Added restart needed when the plugin is first added in childbridge mode.
|
|
20
24
|
- [childbridge]: Create the server node for Dynamic plugins even if they have 0 devices. This allow to pair empty plugins in huge setup.
|
|
25
|
+
- [select]: Enhanced documentation for Platform setSelectDevice, setSelectDeviceEntity, and setSelectEntity methods with schema examples (see the Jsdoc of the methods).
|
|
26
|
+
- [MatterbridgeEndpoint]: Improved documentation in jsdoc.
|
|
27
|
+
- [AirConditioner]: Added AirConditioner() class and Jest test. It is not supported by the Home app. Improved createDefaultThermostatUserInterfaceConfigurationClusterServer().
|
|
28
|
+
- [DeviceTypes]: Add Chapter 10. Media Device Types.
|
|
29
|
+
- [Speaker]: Added Speaker() class and Jest test. Supported only by SmartThings.
|
|
21
30
|
|
|
22
31
|
### Changed
|
|
23
32
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ThermostatUserInterfaceConfiguration } from '@matter/main/clusters/thermostat-user-interface-configuration';
|
|
2
|
+
import { FanControl } from '@matter/main/clusters/fan-control';
|
|
3
|
+
import { airConditioner, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
4
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
5
|
+
export class AirConditioner extends MatterbridgeEndpoint {
|
|
6
|
+
constructor(name, serial, options = {}) {
|
|
7
|
+
const { localTemperature = 23, occupiedHeatingSetpoint = 21, occupiedCoolingSetpoint = 25, minSetpointDeadBand = 1, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50, temperatureDisplayMode = ThermostatUserInterfaceConfiguration.TemperatureDisplayMode.Celsius, keypadLockout = ThermostatUserInterfaceConfiguration.KeypadLockout.NoLockout, scheduleProgrammingVisibility = ThermostatUserInterfaceConfiguration.ScheduleProgrammingVisibility.ScheduleProgrammingPermitted, fanMode = FanControl.FanMode.Off, fanModeSequence = FanControl.FanModeSequence.OffLowMedHighAuto, percentSetting = 0, percentCurrent = 0, } = options;
|
|
8
|
+
super([airConditioner, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
|
9
|
+
this.createDefaultIdentifyClusterServer();
|
|
10
|
+
this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Air Conditioner');
|
|
11
|
+
this.createDefaultPowerSourceWiredClusterServer();
|
|
12
|
+
this.createDeadFrontOnOffClusterServer(true);
|
|
13
|
+
this.createDefaultThermostatClusterServer(localTemperature, occupiedHeatingSetpoint, occupiedCoolingSetpoint, minSetpointDeadBand, minHeatSetpointLimit, maxHeatSetpointLimit, minCoolSetpointLimit, maxCoolSetpointLimit);
|
|
14
|
+
this.createDefaultThermostatUserInterfaceConfigurationClusterServer(temperatureDisplayMode, keypadLockout, scheduleProgrammingVisibility);
|
|
15
|
+
this.createDefaultFanControlClusterServer(fanMode, fanModeSequence, percentSetting, percentCurrent);
|
|
16
|
+
}
|
|
17
|
+
}
|
package/dist/devices/export.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './speaker.js';
|
|
1
2
|
export * from './roboticVacuumCleaner.js';
|
|
2
3
|
export * from './laundryWasher.js';
|
|
3
4
|
export * from './laundryDryer.js';
|
|
@@ -7,6 +8,7 @@ export * from './microwaveOven.js';
|
|
|
7
8
|
export * from './oven.js';
|
|
8
9
|
export * from './cooktop.js';
|
|
9
10
|
export * from './refrigerator.js';
|
|
11
|
+
export * from './airConditioner.js';
|
|
10
12
|
export * from './waterHeater.js';
|
|
11
13
|
export * from './evse.js';
|
|
12
14
|
export * from './solarPower.js';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { OnOff, LevelControl } from '@matter/main/clusters';
|
|
2
|
+
import { speakerDevice } from '../matterbridgeDeviceTypes.js';
|
|
3
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
4
|
+
export class Speaker extends MatterbridgeEndpoint {
|
|
5
|
+
constructor(name, serial, muted = false, volume = 128) {
|
|
6
|
+
if (!Number.isFinite(volume))
|
|
7
|
+
volume = 128;
|
|
8
|
+
if (volume < 1)
|
|
9
|
+
volume = 1;
|
|
10
|
+
if (volume > 254)
|
|
11
|
+
volume = 254;
|
|
12
|
+
super([speakerDevice], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
|
13
|
+
this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Speaker');
|
|
14
|
+
this.createOnOffClusterServer(!muted);
|
|
15
|
+
this.createLevelControlClusterServer(volume);
|
|
16
|
+
}
|
|
17
|
+
async setMuted(muted) {
|
|
18
|
+
await this.setAttribute(OnOff.Cluster.id, 'onOff', !muted);
|
|
19
|
+
}
|
|
20
|
+
isMuted() {
|
|
21
|
+
return !this.getAttribute(OnOff.Cluster.id, 'onOff');
|
|
22
|
+
}
|
|
23
|
+
async setVolume(level) {
|
|
24
|
+
if (!Number.isFinite(level))
|
|
25
|
+
return;
|
|
26
|
+
if (level < 1)
|
|
27
|
+
level = 1;
|
|
28
|
+
if (level > 254)
|
|
29
|
+
level = 254;
|
|
30
|
+
await this.setAttribute(LevelControl.Cluster.id, 'currentLevel', level);
|
|
31
|
+
}
|
|
32
|
+
getVolume() {
|
|
33
|
+
return this.getAttribute(LevelControl.Cluster.id, 'currentLevel');
|
|
34
|
+
}
|
|
35
|
+
}
|
package/dist/frontend.js
CHANGED
|
@@ -673,6 +673,7 @@ export class Frontend extends EventEmitter {
|
|
|
673
673
|
manualPairingCode: device.serverNode.state.commissioning.pairingCodes.manualPairingCode,
|
|
674
674
|
fabricInformations: this.matterbridge.sanitizeFabricInformations(Object.values(device.serverNode.state.commissioning.fabrics)),
|
|
675
675
|
sessionInformations: this.matterbridge.sanitizeSessionInformation(Object.values(device.serverNode.state.sessions.sessions)),
|
|
676
|
+
serialNumber: device.serverNode.state.basicInformation.serialNumber,
|
|
676
677
|
};
|
|
677
678
|
}
|
|
678
679
|
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { rmSync } from 'node:fs';
|
|
2
|
+
import { inspect } from 'node:util';
|
|
3
|
+
import { DeviceTypeId, Endpoint, Environment, ServerNode, ServerNodeStore, VendorId, LogFormat as MatterLogFormat, LogLevel as MatterLogLevel, Lifecycle } from '@matter/main';
|
|
4
|
+
import { AggregatorEndpoint, RootEndpoint } from '@matter/main/endpoints';
|
|
5
|
+
import { MdnsService } from '@matter/main/protocol';
|
|
6
|
+
export async function flushAsync(ticks = 3, microTurns = 10, pause = 100) {
|
|
7
|
+
for (let i = 0; i < ticks; i++)
|
|
8
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
9
|
+
for (let i = 0; i < microTurns; i++)
|
|
10
|
+
await Promise.resolve();
|
|
11
|
+
if (pause)
|
|
12
|
+
await new Promise((resolve) => setTimeout(resolve, pause));
|
|
13
|
+
}
|
|
14
|
+
export async function flushAllEndpointNumberPersistence(targetServer, rounds = 2) {
|
|
15
|
+
const nodeStore = targetServer.env.get(ServerNodeStore);
|
|
16
|
+
for (let i = 0; i < rounds; i++) {
|
|
17
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
18
|
+
await nodeStore.endpointStores.close();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function collectAllEndpoints(root) {
|
|
22
|
+
const list = [];
|
|
23
|
+
const walk = (ep) => {
|
|
24
|
+
list.push(ep);
|
|
25
|
+
if (ep.parts) {
|
|
26
|
+
for (const child of ep.parts) {
|
|
27
|
+
walk(child);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
walk(root);
|
|
32
|
+
return list;
|
|
33
|
+
}
|
|
34
|
+
export async function assertAllEndpointNumbersPersisted(targetServer) {
|
|
35
|
+
const nodeStore = targetServer.env.get(ServerNodeStore);
|
|
36
|
+
await nodeStore.endpointStores.close();
|
|
37
|
+
const all = collectAllEndpoints(targetServer);
|
|
38
|
+
for (const ep of all) {
|
|
39
|
+
const store = nodeStore.storeForEndpoint(ep);
|
|
40
|
+
if (ep.maybeNumber === 0) {
|
|
41
|
+
expect(store.number ?? 0).toBe(0);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
expect(store.number).toBeGreaterThan(0);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return all.length;
|
|
48
|
+
}
|
|
49
|
+
export function createTestEnvironment(homeDir) {
|
|
50
|
+
expect(homeDir).toBeDefined();
|
|
51
|
+
expect(typeof homeDir).toBe('string');
|
|
52
|
+
expect(homeDir.length).toBeGreaterThan(5);
|
|
53
|
+
rmSync(homeDir, { recursive: true, force: true });
|
|
54
|
+
const environment = Environment.default;
|
|
55
|
+
environment.vars.set('log.level', MatterLogLevel.DEBUG);
|
|
56
|
+
environment.vars.set('log.format', MatterLogFormat.ANSI);
|
|
57
|
+
environment.vars.set('path.root', homeDir);
|
|
58
|
+
environment.vars.set('runtime.signals', false);
|
|
59
|
+
environment.vars.set('runtime.exitcode', false);
|
|
60
|
+
return environment;
|
|
61
|
+
}
|
|
62
|
+
export async function startServerNode(name, port) {
|
|
63
|
+
const server = await ServerNode.create({
|
|
64
|
+
id: name + 'ServerNode',
|
|
65
|
+
productDescription: {
|
|
66
|
+
name: name + 'ServerNode',
|
|
67
|
+
deviceType: DeviceTypeId(RootEndpoint.deviceType),
|
|
68
|
+
vendorId: VendorId(0xfff1),
|
|
69
|
+
productId: 0x8000,
|
|
70
|
+
},
|
|
71
|
+
basicInformation: {
|
|
72
|
+
vendorId: VendorId(0xfff1),
|
|
73
|
+
vendorName: 'Matterbridge',
|
|
74
|
+
productId: 0x8000,
|
|
75
|
+
productName: 'Matterbridge ' + name,
|
|
76
|
+
nodeLabel: name + 'ServerNode',
|
|
77
|
+
hardwareVersion: 1,
|
|
78
|
+
softwareVersion: 1,
|
|
79
|
+
reachable: true,
|
|
80
|
+
},
|
|
81
|
+
network: {
|
|
82
|
+
port,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
expect(server).toBeDefined();
|
|
86
|
+
expect(server.lifecycle.isReady).toBeTruthy();
|
|
87
|
+
const aggregator = new Endpoint(AggregatorEndpoint, {
|
|
88
|
+
id: name + 'AggregatorNode',
|
|
89
|
+
});
|
|
90
|
+
expect(aggregator).toBeDefined();
|
|
91
|
+
await server.add(aggregator);
|
|
92
|
+
expect(server.parts.has(aggregator.id)).toBeTruthy();
|
|
93
|
+
expect(server.parts.has(aggregator)).toBeTruthy();
|
|
94
|
+
expect(aggregator.lifecycle.isReady).toBeTruthy();
|
|
95
|
+
expect(server.lifecycle.isOnline).toBeFalsy();
|
|
96
|
+
await new Promise((resolve) => {
|
|
97
|
+
server.lifecycle.online.on(async () => {
|
|
98
|
+
resolve();
|
|
99
|
+
});
|
|
100
|
+
server.start();
|
|
101
|
+
});
|
|
102
|
+
expect(server.lifecycle.isReady).toBeTruthy();
|
|
103
|
+
expect(server.lifecycle.isOnline).toBeTruthy();
|
|
104
|
+
expect(server.lifecycle.isCommissioned).toBeFalsy();
|
|
105
|
+
expect(server.lifecycle.isPartsReady).toBeTruthy();
|
|
106
|
+
expect(server.lifecycle.hasId).toBeTruthy();
|
|
107
|
+
expect(server.lifecycle.hasNumber).toBeTruthy();
|
|
108
|
+
expect(aggregator.lifecycle.isReady).toBeTruthy();
|
|
109
|
+
expect(aggregator.lifecycle.isInstalled).toBeTruthy();
|
|
110
|
+
expect(aggregator.lifecycle.isPartsReady).toBeTruthy();
|
|
111
|
+
expect(aggregator.lifecycle.hasId).toBeTruthy();
|
|
112
|
+
expect(aggregator.lifecycle.hasNumber).toBeTruthy();
|
|
113
|
+
return [server, aggregator];
|
|
114
|
+
}
|
|
115
|
+
export async function stopServerNode(server) {
|
|
116
|
+
await flushAllEndpointNumberPersistence(server);
|
|
117
|
+
await assertAllEndpointNumbersPersisted(server);
|
|
118
|
+
expect(server).toBeDefined();
|
|
119
|
+
expect(server.lifecycle.isReady).toBeTruthy();
|
|
120
|
+
expect(server.lifecycle.isOnline).toBeTruthy();
|
|
121
|
+
await server.close();
|
|
122
|
+
expect(server.lifecycle.isReady).toBeTruthy();
|
|
123
|
+
expect(server.lifecycle.isOnline).toBeFalsy();
|
|
124
|
+
await server.env.get(MdnsService)[Symbol.asyncDispose]();
|
|
125
|
+
await flushAsync();
|
|
126
|
+
}
|
|
127
|
+
export async function addDevice(owner, device) {
|
|
128
|
+
expect(owner).toBeDefined();
|
|
129
|
+
expect(device).toBeDefined();
|
|
130
|
+
expect(owner.lifecycle.isReady).toBeTruthy();
|
|
131
|
+
expect(owner.construction.status).toBe(Lifecycle.Status.Active);
|
|
132
|
+
expect(owner.lifecycle.isPartsReady).toBeTruthy();
|
|
133
|
+
try {
|
|
134
|
+
await owner.add(device);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
const errorMessage = error instanceof Error ? error.message : error;
|
|
138
|
+
const errorInspect = inspect(error, { depth: 10 });
|
|
139
|
+
console.error(`Error adding device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}\nstack: ${errorInspect}`);
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
expect(owner.parts.has(device)).toBeTruthy();
|
|
143
|
+
expect(owner.lifecycle.isPartsReady).toBeTruthy();
|
|
144
|
+
expect(device.lifecycle.isReady).toBeTruthy();
|
|
145
|
+
expect(device.lifecycle.isInstalled).toBeTruthy();
|
|
146
|
+
expect(device.lifecycle.hasId).toBeTruthy();
|
|
147
|
+
expect(device.lifecycle.hasNumber).toBeTruthy();
|
|
148
|
+
expect(device.construction.status).toBe(Lifecycle.Status.Active);
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
export async function deleteDevice(owner, device) {
|
|
152
|
+
expect(owner).toBeDefined();
|
|
153
|
+
expect(device).toBeDefined();
|
|
154
|
+
expect(owner.lifecycle.isReady).toBeTruthy();
|
|
155
|
+
expect(owner.construction.status).toBe(Lifecycle.Status.Active);
|
|
156
|
+
expect(owner.lifecycle.isPartsReady).toBeTruthy();
|
|
157
|
+
try {
|
|
158
|
+
await device.delete();
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
const errorMessage = error instanceof Error ? error.message : error;
|
|
162
|
+
const errorInspect = inspect(error, { depth: 10 });
|
|
163
|
+
console.error(`Error deleting device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}\nstack: ${errorInspect}`);
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
expect(owner.parts.has(device)).toBeFalsy();
|
|
167
|
+
expect(owner.lifecycle.isPartsReady).toBeTruthy();
|
|
168
|
+
expect(device.lifecycle.isReady).toBeFalsy();
|
|
169
|
+
expect(device.lifecycle.isInstalled).toBeFalsy();
|
|
170
|
+
expect(device.lifecycle.hasId).toBeTruthy();
|
|
171
|
+
expect(device.lifecycle.hasNumber).toBeTruthy();
|
|
172
|
+
expect(device.construction.status).toBe(Lifecycle.Status.Destroyed);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
@@ -1,71 +1,88 @@
|
|
|
1
1
|
import { DeviceTypeId } from '@matter/main';
|
|
2
|
+
import { AccountLogin } from '@matter/main/clusters/account-login';
|
|
3
|
+
import { Actions } from '@matter/main/clusters/actions';
|
|
4
|
+
import { ActivatedCarbonFilterMonitoring } from '@matter/main/clusters/activated-carbon-filter-monitoring';
|
|
5
|
+
import { AdministratorCommissioning } from '@matter/main/clusters/administrator-commissioning';
|
|
6
|
+
import { AirQuality } from '@matter/main/clusters/air-quality';
|
|
7
|
+
import { ApplicationLauncher } from '@matter/main/clusters/application-launcher';
|
|
8
|
+
import { AudioOutput } from '@matter/main/clusters/audio-output';
|
|
2
9
|
import { BooleanState } from '@matter/main/clusters/boolean-state';
|
|
3
10
|
import { BooleanStateConfiguration } from '@matter/main/clusters/boolean-state-configuration';
|
|
4
11
|
import { BridgedDeviceBasicInformation } from '@matter/main/clusters/bridged-device-basic-information';
|
|
5
12
|
import { CarbonDioxideConcentrationMeasurement } from '@matter/main/clusters/carbon-dioxide-concentration-measurement';
|
|
6
13
|
import { CarbonMonoxideConcentrationMeasurement } from '@matter/main/clusters/carbon-monoxide-concentration-measurement';
|
|
14
|
+
import { Channel } from '@matter/main/clusters/channel';
|
|
7
15
|
import { ColorControl } from '@matter/main/clusters/color-control';
|
|
16
|
+
import { CommissionerControl } from '@matter/main/clusters/commissioner-control';
|
|
17
|
+
import { ContentControl } from '@matter/main/clusters/content-control';
|
|
18
|
+
import { ContentLauncher } from '@matter/main/clusters/content-launcher';
|
|
8
19
|
import { DeviceEnergyManagement } from '@matter/main/clusters/device-energy-management';
|
|
20
|
+
import { DeviceEnergyManagementMode } from '@matter/main/clusters/device-energy-management-mode';
|
|
21
|
+
import { DishwasherAlarm } from '@matter/main/clusters/dishwasher-alarm';
|
|
22
|
+
import { DishwasherMode } from '@matter/main/clusters/dishwasher-mode';
|
|
9
23
|
import { DoorLock } from '@matter/main/clusters/door-lock';
|
|
24
|
+
import { EcosystemInformation } from '@matter/main/clusters/ecosystem-information';
|
|
10
25
|
import { ElectricalEnergyMeasurement } from '@matter/main/clusters/electrical-energy-measurement';
|
|
11
26
|
import { ElectricalPowerMeasurement } from '@matter/main/clusters/electrical-power-measurement';
|
|
27
|
+
import { EnergyEvse } from '@matter/main/clusters/energy-evse';
|
|
28
|
+
import { EnergyEvseMode } from '@matter/main/clusters/energy-evse-mode';
|
|
29
|
+
import { EnergyPreference } from '@matter/main/clusters/energy-preference';
|
|
12
30
|
import { FanControl } from '@matter/main/clusters/fan-control';
|
|
13
31
|
import { FlowMeasurement } from '@matter/main/clusters/flow-measurement';
|
|
14
32
|
import { FormaldehydeConcentrationMeasurement } from '@matter/main/clusters/formaldehyde-concentration-measurement';
|
|
15
33
|
import { Groups } from '@matter/main/clusters/groups';
|
|
34
|
+
import { HepaFilterMonitoring } from '@matter/main/clusters/hepa-filter-monitoring';
|
|
16
35
|
import { Identify } from '@matter/main/clusters/identify';
|
|
17
36
|
import { IlluminanceMeasurement } from '@matter/main/clusters/illuminance-measurement';
|
|
37
|
+
import { KeypadInput } from '@matter/main/clusters/keypad-input';
|
|
38
|
+
import { LaundryDryerControls } from '@matter/main/clusters/laundry-dryer-controls';
|
|
39
|
+
import { LaundryWasherControls } from '@matter/main/clusters/laundry-washer-controls';
|
|
40
|
+
import { LaundryWasherMode } from '@matter/main/clusters/laundry-washer-mode';
|
|
18
41
|
import { LevelControl } from '@matter/main/clusters/level-control';
|
|
42
|
+
import { LowPower } from '@matter/main/clusters/low-power';
|
|
43
|
+
import { MediaInput } from '@matter/main/clusters/media-input';
|
|
44
|
+
import { MediaPlayback } from '@matter/main/clusters/media-playback';
|
|
45
|
+
import { Messages } from '@matter/main/clusters/messages';
|
|
46
|
+
import { MicrowaveOvenControl } from '@matter/main/clusters/microwave-oven-control';
|
|
47
|
+
import { MicrowaveOvenMode } from '@matter/main/clusters/microwave-oven-mode';
|
|
19
48
|
import { ModeSelect } from '@matter/main/clusters/mode-select';
|
|
20
49
|
import { NitrogenDioxideConcentrationMeasurement } from '@matter/main/clusters/nitrogen-dioxide-concentration-measurement';
|
|
21
50
|
import { OccupancySensing } from '@matter/main/clusters/occupancy-sensing';
|
|
22
51
|
import { OnOff } from '@matter/main/clusters/on-off';
|
|
52
|
+
import { OperationalState } from '@matter/main/clusters/operational-state';
|
|
53
|
+
import { OtaSoftwareUpdateProvider } from '@matter/main/clusters/ota-software-update-provider';
|
|
54
|
+
import { OtaSoftwareUpdateRequestor } from '@matter/main/clusters/ota-software-update-requestor';
|
|
55
|
+
import { OvenCavityOperationalState } from '@matter/main/clusters/oven-cavity-operational-state';
|
|
56
|
+
import { OvenMode } from '@matter/main/clusters/oven-mode';
|
|
23
57
|
import { OzoneConcentrationMeasurement } from '@matter/main/clusters/ozone-concentration-measurement';
|
|
24
|
-
import { Pm10ConcentrationMeasurement } from '@matter/main/clusters/pm10-concentration-measurement';
|
|
25
58
|
import { Pm1ConcentrationMeasurement } from '@matter/main/clusters/pm1-concentration-measurement';
|
|
59
|
+
import { Pm10ConcentrationMeasurement } from '@matter/main/clusters/pm10-concentration-measurement';
|
|
26
60
|
import { Pm25ConcentrationMeasurement } from '@matter/main/clusters/pm25-concentration-measurement';
|
|
27
61
|
import { PowerSource } from '@matter/main/clusters/power-source';
|
|
28
62
|
import { PowerTopology } from '@matter/main/clusters/power-topology';
|
|
29
63
|
import { PressureMeasurement } from '@matter/main/clusters/pressure-measurement';
|
|
30
64
|
import { PumpConfigurationAndControl } from '@matter/main/clusters/pump-configuration-and-control';
|
|
31
65
|
import { RadonConcentrationMeasurement } from '@matter/main/clusters/radon-concentration-measurement';
|
|
66
|
+
import { RefrigeratorAlarm } from '@matter/main/clusters/refrigerator-alarm';
|
|
67
|
+
import { RefrigeratorAndTemperatureControlledCabinetMode } from '@matter/main/clusters/refrigerator-and-temperature-controlled-cabinet-mode';
|
|
32
68
|
import { RelativeHumidityMeasurement } from '@matter/main/clusters/relative-humidity-measurement';
|
|
69
|
+
import { RvcCleanMode } from '@matter/main/clusters/rvc-clean-mode';
|
|
70
|
+
import { RvcOperationalState } from '@matter/main/clusters/rvc-operational-state';
|
|
71
|
+
import { RvcRunMode } from '@matter/main/clusters/rvc-run-mode';
|
|
72
|
+
import { ServiceArea } from '@matter/main/clusters/service-area';
|
|
33
73
|
import { SmokeCoAlarm } from '@matter/main/clusters/smoke-co-alarm';
|
|
34
74
|
import { Switch } from '@matter/main/clusters/switch';
|
|
75
|
+
import { TargetNavigator } from '@matter/main/clusters/target-navigator';
|
|
76
|
+
import { TemperatureControl } from '@matter/main/clusters/temperature-control';
|
|
35
77
|
import { TemperatureMeasurement } from '@matter/main/clusters/temperature-measurement';
|
|
36
78
|
import { Thermostat } from '@matter/main/clusters/thermostat';
|
|
79
|
+
import { ThermostatUserInterfaceConfiguration } from '@matter/main/clusters/thermostat-user-interface-configuration';
|
|
37
80
|
import { TotalVolatileOrganicCompoundsConcentrationMeasurement } from '@matter/main/clusters/total-volatile-organic-compounds-concentration-measurement';
|
|
38
81
|
import { ValveConfigurationAndControl } from '@matter/main/clusters/valve-configuration-and-control';
|
|
82
|
+
import { WakeOnLan } from '@matter/main/clusters/wake-on-lan';
|
|
83
|
+
import { WaterHeaterManagement } from '@matter/main/clusters/water-heater-management';
|
|
84
|
+
import { WaterHeaterMode } from '@matter/main/clusters/water-heater-mode';
|
|
39
85
|
import { WindowCovering } from '@matter/main/clusters/window-covering';
|
|
40
|
-
import { AirQuality } from '@matter/main/clusters/air-quality';
|
|
41
|
-
import { Actions } from '@matter/main/clusters/actions';
|
|
42
|
-
import { ThermostatUserInterfaceConfiguration } from '@matter/main/clusters/thermostat-user-interface-configuration';
|
|
43
|
-
import { EnergyPreference } from '@matter/main/clusters/energy-preference';
|
|
44
|
-
import { RvcRunMode } from '@matter/main/clusters/rvc-run-mode';
|
|
45
|
-
import { RvcOperationalState } from '@matter/main/clusters/rvc-operational-state';
|
|
46
|
-
import { RvcCleanMode } from '@matter/main/clusters/rvc-clean-mode';
|
|
47
|
-
import { HepaFilterMonitoring } from '@matter/main/clusters/hepa-filter-monitoring';
|
|
48
|
-
import { ActivatedCarbonFilterMonitoring } from '@matter/main/clusters/activated-carbon-filter-monitoring';
|
|
49
|
-
import { DeviceEnergyManagementMode } from '@matter/main/clusters/device-energy-management-mode';
|
|
50
|
-
import { AdministratorCommissioning } from '@matter/main/clusters/administrator-commissioning';
|
|
51
|
-
import { EcosystemInformation } from '@matter/main/clusters/ecosystem-information';
|
|
52
|
-
import { CommissionerControl } from '@matter/main/clusters/commissioner-control';
|
|
53
|
-
import { DishwasherAlarm } from '@matter/main/clusters/dishwasher-alarm';
|
|
54
|
-
import { DishwasherMode } from '@matter/main/clusters/dishwasher-mode';
|
|
55
|
-
import { LaundryDryerControls } from '@matter/main/clusters/laundry-dryer-controls';
|
|
56
|
-
import { LaundryWasherControls } from '@matter/main/clusters/laundry-washer-controls';
|
|
57
|
-
import { LaundryWasherMode } from '@matter/main/clusters/laundry-washer-mode';
|
|
58
|
-
import { MicrowaveOvenControl } from '@matter/main/clusters/microwave-oven-control';
|
|
59
|
-
import { MicrowaveOvenMode } from '@matter/main/clusters/microwave-oven-mode';
|
|
60
|
-
import { OperationalState } from '@matter/main/clusters/operational-state';
|
|
61
|
-
import { OvenCavityOperationalState } from '@matter/main/clusters/oven-cavity-operational-state';
|
|
62
|
-
import { OvenMode } from '@matter/main/clusters/oven-mode';
|
|
63
|
-
import { RefrigeratorAlarm } from '@matter/main/clusters/refrigerator-alarm';
|
|
64
|
-
import { RefrigeratorAndTemperatureControlledCabinetMode } from '@matter/main/clusters/refrigerator-and-temperature-controlled-cabinet-mode';
|
|
65
|
-
import { ServiceArea } from '@matter/main/clusters/service-area';
|
|
66
|
-
import { TemperatureControl } from '@matter/main/clusters/temperature-control';
|
|
67
|
-
import { OtaSoftwareUpdateRequestor } from '@matter/main/clusters/ota-software-update-requestor';
|
|
68
|
-
import { EnergyEvse, EnergyEvseMode, OtaSoftwareUpdateProvider, WaterHeaterManagement, WaterHeaterMode } from '@matter/main/clusters';
|
|
69
86
|
export var DeviceClasses;
|
|
70
87
|
(function (DeviceClasses) {
|
|
71
88
|
DeviceClasses["Node"] = "Node";
|
|
@@ -405,6 +422,41 @@ export const airPurifier = DeviceTypeDefinition({
|
|
|
405
422
|
requiredServerClusters: [Identify.Cluster.id, FanControl.Cluster.id],
|
|
406
423
|
optionalServerClusters: [Groups.Cluster.id, OnOff.Cluster.id, HepaFilterMonitoring.Cluster.id, ActivatedCarbonFilterMonitoring.Cluster.id],
|
|
407
424
|
});
|
|
425
|
+
export const basicVideoPlayer = DeviceTypeDefinition({
|
|
426
|
+
name: 'MA-basicVideoPlayer',
|
|
427
|
+
code: 0x0028,
|
|
428
|
+
deviceClass: DeviceClasses.Simple,
|
|
429
|
+
revision: 2,
|
|
430
|
+
requiredServerClusters: [OnOff.Cluster.id, MediaPlayback.Cluster.id, KeypadInput.Cluster.id],
|
|
431
|
+
optionalServerClusters: [WakeOnLan.Cluster.id, Channel.Cluster.id, TargetNavigator.Cluster.id, MediaInput.Cluster.id, LowPower.Cluster.id, AudioOutput.Cluster.id, ContentControl.Cluster.id, Messages.Cluster.id],
|
|
432
|
+
});
|
|
433
|
+
export const castingVideoPlayer = DeviceTypeDefinition({
|
|
434
|
+
name: 'MA-castingVideoPlayer',
|
|
435
|
+
code: 0x0023,
|
|
436
|
+
deviceClass: DeviceClasses.Simple,
|
|
437
|
+
revision: 2,
|
|
438
|
+
requiredServerClusters: [OnOff.Cluster.id, MediaPlayback.Cluster.id, KeypadInput.Cluster.id, ContentLauncher.Cluster.id],
|
|
439
|
+
optionalServerClusters: [
|
|
440
|
+
WakeOnLan.Cluster.id,
|
|
441
|
+
Channel.Cluster.id,
|
|
442
|
+
TargetNavigator.Cluster.id,
|
|
443
|
+
MediaInput.Cluster.id,
|
|
444
|
+
LowPower.Cluster.id,
|
|
445
|
+
AudioOutput.Cluster.id,
|
|
446
|
+
ApplicationLauncher.Cluster.id,
|
|
447
|
+
AccountLogin.Cluster.id,
|
|
448
|
+
ContentControl.Cluster.id,
|
|
449
|
+
Messages.Cluster.id,
|
|
450
|
+
],
|
|
451
|
+
});
|
|
452
|
+
export const speakerDevice = DeviceTypeDefinition({
|
|
453
|
+
name: 'MA-speaker',
|
|
454
|
+
code: 0x0022,
|
|
455
|
+
deviceClass: DeviceClasses.Simple,
|
|
456
|
+
revision: 1,
|
|
457
|
+
requiredServerClusters: [OnOff.Cluster.id, LevelControl.Cluster.id],
|
|
458
|
+
optionalServerClusters: [],
|
|
459
|
+
});
|
|
408
460
|
export const modeSelect = DeviceTypeDefinition({
|
|
409
461
|
name: 'MA-modeselect',
|
|
410
462
|
code: 0x27,
|
|
@@ -795,11 +795,11 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
795
795
|
});
|
|
796
796
|
return this;
|
|
797
797
|
}
|
|
798
|
-
createDefaultThermostatUserInterfaceConfigurationClusterServer() {
|
|
798
|
+
createDefaultThermostatUserInterfaceConfigurationClusterServer(temperatureDisplayMode = ThermostatUserInterfaceConfiguration.TemperatureDisplayMode.Celsius, keypadLockout = ThermostatUserInterfaceConfiguration.KeypadLockout.NoLockout, scheduleProgrammingVisibility = ThermostatUserInterfaceConfiguration.ScheduleProgrammingVisibility.ScheduleProgrammingPermitted) {
|
|
799
799
|
this.behaviors.require(ThermostatUserInterfaceConfigurationServer, {
|
|
800
|
-
temperatureDisplayMode
|
|
801
|
-
keypadLockout
|
|
802
|
-
scheduleProgrammingVisibility
|
|
800
|
+
temperatureDisplayMode,
|
|
801
|
+
keypadLockout,
|
|
802
|
+
scheduleProgrammingVisibility,
|
|
803
803
|
});
|
|
804
804
|
return this;
|
|
805
805
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
3
|
"main.css": "./static/css/main.a2f4846a.css",
|
|
4
|
-
"main.js": "./static/js/main.
|
|
4
|
+
"main.js": "./static/js/main.e691e19f.js",
|
|
5
5
|
"static/js/453.d855a71b.chunk.js": "./static/js/453.d855a71b.chunk.js",
|
|
6
6
|
"static/media/roboto-latin-700-normal.woff2": "./static/media/roboto-latin-700-normal.c4d6cab43bec89049809.woff2",
|
|
7
7
|
"static/media/roboto-latin-500-normal.woff2": "./static/media/roboto-latin-500-normal.599f66a60bdf974e578e.woff2",
|
|
@@ -77,11 +77,11 @@
|
|
|
77
77
|
"static/media/roboto-greek-ext-300-normal.woff": "./static/media/roboto-greek-ext-300-normal.60729cafbded24073dfb.woff",
|
|
78
78
|
"index.html": "./index.html",
|
|
79
79
|
"main.a2f4846a.css.map": "./static/css/main.a2f4846a.css.map",
|
|
80
|
-
"main.
|
|
80
|
+
"main.e691e19f.js.map": "./static/js/main.e691e19f.js.map",
|
|
81
81
|
"453.d855a71b.chunk.js.map": "./static/js/453.d855a71b.chunk.js.map"
|
|
82
82
|
},
|
|
83
83
|
"entrypoints": [
|
|
84
84
|
"static/css/main.a2f4846a.css",
|
|
85
|
-
"static/js/main.
|
|
85
|
+
"static/js/main.e691e19f.js"
|
|
86
86
|
]
|
|
87
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><base href="./"><link rel="icon" href="./matterbridge 32x32.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><title>Matterbridge</title><link rel="manifest" href="./manifest.json"/><script defer="defer" src="./static/js/main.
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><base href="./"><link rel="icon" href="./matterbridge 32x32.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><title>Matterbridge</title><link rel="manifest" href="./manifest.json"/><script defer="defer" src="./static/js/main.e691e19f.js"></script><link href="./static/css/main.a2f4846a.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|