@matterbridge/core 3.6.0-dev-20260305-776ca2f → 3.6.0-dev-20260306-2d4caeb
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.
|
@@ -2,6 +2,7 @@ import { LocationTag } from '@matter/main/node';
|
|
|
2
2
|
import { OperationalState } from '@matter/types/clusters/operational-state';
|
|
3
3
|
import { irrigationSystem, powerSource, waterValve } from '../matterbridgeDeviceTypes.js';
|
|
4
4
|
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
5
|
+
import { getSemtag } from '../matterbridgeEndpointHelpers.js';
|
|
5
6
|
export class IrrigationSystem extends MatterbridgeEndpoint {
|
|
6
7
|
constructor(name, serial, options = {}) {
|
|
7
8
|
const deviceTypes = options.singleZone ? [irrigationSystem, waterValve, powerSource] : [irrigationSystem, powerSource];
|
|
@@ -23,7 +24,7 @@ export class IrrigationSystem extends MatterbridgeEndpoint {
|
|
|
23
24
|
this.addRequiredClusterServers();
|
|
24
25
|
}
|
|
25
26
|
addZone(tag) {
|
|
26
|
-
this.addChildDeviceType(`Zone ${tag.tag}`, waterValve, { tagList: [tag, LocationTag.Zone] })
|
|
27
|
+
this.addChildDeviceType(`Zone ${tag.tag}`, waterValve, { tagList: [getSemtag(tag), getSemtag(LocationTag.Zone)] })
|
|
27
28
|
.createDefaultValveConfigurationAndControlClusterServer()
|
|
28
29
|
.addRequiredClusterServers();
|
|
29
30
|
return this;
|
|
@@ -62,6 +62,8 @@ export declare class MatterbridgeEndpoint extends Endpoint {
|
|
|
62
62
|
setAttribute(clusterId: Behavior.Type | ClusterType | ClusterId | string, attribute: string, value: boolean | number | bigint | string | object | null, log?: AnsiLogger): Promise<boolean>;
|
|
63
63
|
updateAttribute(cluster: Behavior.Type | ClusterType | ClusterId | string, attribute: string, value: boolean | number | bigint | string | object | null, log?: AnsiLogger): Promise<boolean>;
|
|
64
64
|
subscribeAttribute(cluster: Behavior.Type | ClusterType | ClusterId | string, attribute: string, listener: (newValue: any, oldValue: any, context: ActionContext) => void, log?: AnsiLogger): Promise<boolean>;
|
|
65
|
+
setCluster(cluster: Behavior.Type | ClusterType | ClusterId | string, value: Record<string, boolean | number | bigint | string | object | undefined | null>, log?: AnsiLogger): Promise<boolean>;
|
|
66
|
+
getCluster(cluster: Behavior.Type | ClusterType | ClusterId | string, log?: AnsiLogger): Record<string, boolean | number | bigint | string | object | undefined | null> | undefined;
|
|
65
67
|
triggerEvent(cluster: Behavior.Type | ClusterType | ClusterId | string, event: string, payload: Record<string, boolean | number | bigint | string | object | undefined | null>, log?: AnsiLogger): Promise<boolean>;
|
|
66
68
|
addClusterServers(serverList: ClusterId[]): this;
|
|
67
69
|
addFixedLabel(label: string, value: string): Promise<this>;
|
|
@@ -62,7 +62,7 @@ import { VendorId } from '@matter/types/datatype';
|
|
|
62
62
|
import { inspectError, isValidNumber, isValidObject, isValidString } from '@matterbridge/utils';
|
|
63
63
|
import { AnsiLogger, CYAN, db, debugStringify, hk, or, YELLOW, zb } from 'node-ansi-logger';
|
|
64
64
|
import { MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeEnhancedColorControlServer, MatterbridgeFanControlServer, MatterbridgeHepaFilterMonitoringServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeLiftTiltWindowCoveringServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgePresetThermostatServer, MatterbridgeServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeSwitchServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, } from './matterbridgeBehaviors.js';
|
|
65
|
-
import { addClusterServers, addFixedLabel, addOptionalClusterServers, addRequiredClusterServers, addUserLabel, checkNotLatinCharacters, createUniqueId, featuresFor, generateUniqueId, getApparentElectricalPowerMeasurementClusterServer, getAttribute, getAttributeId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getClusterId, getDefaultDeviceEnergyManagementClusterServer, getDefaultDeviceEnergyManagementModeClusterServer, getDefaultElectricalEnergyMeasurementClusterServer, getDefaultElectricalPowerMeasurementClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultOccupancySensingClusterServer, getDefaultOperationalStateClusterServer, getDefaultPowerSourceBatteryClusterServer, getDefaultPowerSourceRechargeableBatteryClusterServer, getDefaultPowerSourceReplaceableBatteryClusterServer, getDefaultPowerSourceWiredClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, invokeBehaviorCommand, lowercaseFirstLetter, setAttribute, subscribeAttribute, triggerEvent, updateAttribute, } from './matterbridgeEndpointHelpers.js';
|
|
65
|
+
import { addClusterServers, addFixedLabel, addOptionalClusterServers, addRequiredClusterServers, addUserLabel, checkNotLatinCharacters, createUniqueId, featuresFor, generateUniqueId, getApparentElectricalPowerMeasurementClusterServer, getAttribute, getAttributeId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getCluster, getClusterId, getDefaultDeviceEnergyManagementClusterServer, getDefaultDeviceEnergyManagementModeClusterServer, getDefaultElectricalEnergyMeasurementClusterServer, getDefaultElectricalPowerMeasurementClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultOccupancySensingClusterServer, getDefaultOperationalStateClusterServer, getDefaultPowerSourceBatteryClusterServer, getDefaultPowerSourceRechargeableBatteryClusterServer, getDefaultPowerSourceReplaceableBatteryClusterServer, getDefaultPowerSourceWiredClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, invokeBehaviorCommand, lowercaseFirstLetter, setAttribute, setCluster, subscribeAttribute, triggerEvent, updateAttribute, } from './matterbridgeEndpointHelpers.js';
|
|
66
66
|
const MATTERBRIDGE_ENDPOINT_BRAND = Symbol('MatterbridgeEndpoint.brand');
|
|
67
67
|
export function isMatterbridgeEndpoint(value) {
|
|
68
68
|
if (!value || typeof value !== 'object')
|
|
@@ -211,6 +211,12 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
211
211
|
async subscribeAttribute(cluster, attribute, listener, log) {
|
|
212
212
|
return await subscribeAttribute(this, cluster, attribute, listener, log);
|
|
213
213
|
}
|
|
214
|
+
async setCluster(cluster, value, log) {
|
|
215
|
+
return await setCluster(this, cluster, value, log);
|
|
216
|
+
}
|
|
217
|
+
getCluster(cluster, log) {
|
|
218
|
+
return getCluster(this, cluster, log);
|
|
219
|
+
}
|
|
214
220
|
async triggerEvent(cluster, event, payload, log) {
|
|
215
221
|
return await triggerEvent(this, cluster, event, payload, log);
|
|
216
222
|
}
|
|
@@ -15,7 +15,7 @@ import { PowerSource } from '@matter/types/clusters/power-source';
|
|
|
15
15
|
import { PressureMeasurement } from '@matter/types/clusters/pressure-measurement';
|
|
16
16
|
import { RelativeHumidityMeasurement } from '@matter/types/clusters/relative-humidity-measurement';
|
|
17
17
|
import { TemperatureMeasurement } from '@matter/types/clusters/temperature-measurement';
|
|
18
|
-
import { ClusterId } from '@matter/types/datatype';
|
|
18
|
+
import { ClusterId, VendorId } from '@matter/types/datatype';
|
|
19
19
|
import { MeasurementType, Semtag } from '@matter/types/globals';
|
|
20
20
|
import { AnsiLogger } from 'node-ansi-logger';
|
|
21
21
|
import { MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer } from './matterbridgeBehaviors.js';
|
|
@@ -26,7 +26,7 @@ export declare function lowercaseFirstLetter(name: string): string;
|
|
|
26
26
|
export declare function checkNotLatinCharacters(deviceName: string): boolean;
|
|
27
27
|
export declare function generateUniqueId(deviceName: string): string;
|
|
28
28
|
export declare function createUniqueId(param1: string, param2: string, param3: string, param4: string): string;
|
|
29
|
-
export declare function getSemtag(semtag: Semtag, label?:
|
|
29
|
+
export declare function getSemtag(semtag: Semtag, label?: string | null | undefined, mfgCode?: VendorId | null): Semtag;
|
|
30
30
|
export declare function featuresFor(endpoint: MatterbridgeEndpoint, cluster: Behavior.Type | ClusterType | ClusterId | string): Record<string, boolean | undefined>;
|
|
31
31
|
export declare function getBehaviourTypesFromClusterServerIds(clusterServerList: ClusterId[]): Behavior.Type[];
|
|
32
32
|
export declare function getBehaviourTypesFromClusterClientIds(clusterClientList: ClusterId[]): Behavior.Type[];
|
|
@@ -47,6 +47,8 @@ export declare function getAttribute(endpoint: MatterbridgeEndpoint, cluster: Be
|
|
|
47
47
|
export declare function setAttribute(endpoint: MatterbridgeEndpoint, cluster: Behavior.Type | ClusterType | ClusterId | string, attribute: string, value: boolean | number | bigint | string | object | null, log?: AnsiLogger): Promise<boolean>;
|
|
48
48
|
export declare function updateAttribute(endpoint: MatterbridgeEndpoint, cluster: Behavior.Type | ClusterType | ClusterId | string, attribute: string, value: boolean | number | bigint | string | object | null, log?: AnsiLogger): Promise<boolean>;
|
|
49
49
|
export declare function subscribeAttribute(endpoint: MatterbridgeEndpoint, cluster: Behavior.Type | ClusterType | ClusterId | string, attribute: string, listener: (newValue: any, oldValue: any, context: ActionContext) => void, log?: AnsiLogger): Promise<boolean>;
|
|
50
|
+
export declare function setCluster(endpoint: MatterbridgeEndpoint, cluster: Behavior.Type | ClusterType | ClusterId | string, value: Record<string, boolean | number | bigint | string | object | undefined | null>, log?: AnsiLogger): Promise<boolean>;
|
|
51
|
+
export declare function getCluster(endpoint: MatterbridgeEndpoint, cluster: Behavior.Type | ClusterType | ClusterId | string, log?: AnsiLogger): Record<string, boolean | number | bigint | string | object | undefined | null> | undefined;
|
|
50
52
|
export declare function triggerEvent(endpoint: MatterbridgeEndpoint, cluster: Behavior.Type | ClusterType | ClusterId | string, event: string, payload: Record<string, boolean | number | bigint | string | object | undefined | null>, log?: AnsiLogger): Promise<boolean>;
|
|
51
53
|
export declare function getDefaultPowerSourceWiredClusterServer(wiredCurrentType?: PowerSource.WiredCurrentType): Partial<import("@matter/node").ClusterState.Type<import("@matter/types/cluster").ClusterComposer.WithFeatures<ClusterType.Of<{
|
|
52
54
|
readonly id: 47;
|
|
@@ -113,9 +113,11 @@ export function createUniqueId(param1, param2, param3, param4) {
|
|
|
113
113
|
hash.update(param1 + param2 + param3 + param4);
|
|
114
114
|
return hash.digest('hex');
|
|
115
115
|
}
|
|
116
|
-
export function getSemtag(semtag, label =
|
|
117
|
-
if (label !== null && typeof label === 'string')
|
|
116
|
+
export function getSemtag(semtag, label = undefined, mfgCode = null) {
|
|
117
|
+
if (label !== undefined && label !== null && typeof label === 'string')
|
|
118
118
|
label = label.trim().slice(0, 64);
|
|
119
|
+
if (label === undefined)
|
|
120
|
+
return { mfgCode, namespaceId: semtag.namespaceId, tag: semtag.tag };
|
|
119
121
|
return { mfgCode, namespaceId: semtag.namespaceId, tag: semtag.tag, label };
|
|
120
122
|
}
|
|
121
123
|
export function featuresFor(endpoint, cluster) {
|
|
@@ -538,6 +540,35 @@ export async function subscribeAttribute(endpoint, cluster, attribute, listener,
|
|
|
538
540
|
log?.info(`${db}Subscribed endpoint ${or}${endpoint.id}${db}:${or}${endpoint.number}${db} attribute ${hk}${capitalizeFirstLetter(clusterName)}${db}.${hk}${attribute}${db}`);
|
|
539
541
|
return true;
|
|
540
542
|
}
|
|
543
|
+
export async function setCluster(endpoint, cluster, value, log) {
|
|
544
|
+
const clusterName = getBehavior(endpoint, cluster)?.id;
|
|
545
|
+
if (!clusterName) {
|
|
546
|
+
endpoint.log.error(`setCluster error: cluster not found on endpoint ${or}${endpoint.maybeId}${er}:${or}${endpoint.maybeNumber}${er}`);
|
|
547
|
+
return false;
|
|
548
|
+
}
|
|
549
|
+
if (endpoint.construction.status !== Lifecycle.Status.Active) {
|
|
550
|
+
endpoint.log.error(`setCluster ${hk}${capitalizeFirstLetter(clusterName)}${er} error: Endpoint ${or}${endpoint.maybeId}${er}:${or}${endpoint.maybeNumber}${er} is in the ${BLUE}${endpoint.construction.status}${er} state`);
|
|
551
|
+
return false;
|
|
552
|
+
}
|
|
553
|
+
await endpoint.setStateOf(endpoint.behaviors.supported[clusterName], value);
|
|
554
|
+
log?.info(`${db}Set endpoint ${or}${endpoint.id}${db}:${or}${endpoint.number}${db} cluster ${hk}${capitalizeFirstLetter(clusterName)}${db} to ${debugStringify(value)}`);
|
|
555
|
+
return true;
|
|
556
|
+
}
|
|
557
|
+
export function getCluster(endpoint, cluster, log) {
|
|
558
|
+
const clusterName = getBehavior(endpoint, cluster)?.id;
|
|
559
|
+
if (!clusterName) {
|
|
560
|
+
endpoint.log.error(`getCluster error: cluster not found on endpoint ${or}${endpoint.maybeId}${er}:${or}${endpoint.maybeNumber}${er}`);
|
|
561
|
+
return undefined;
|
|
562
|
+
}
|
|
563
|
+
if (endpoint.construction.status !== Lifecycle.Status.Active) {
|
|
564
|
+
endpoint.log.error(`getCluster ${hk}${capitalizeFirstLetter(clusterName)}${er} error: Endpoint ${or}${endpoint.maybeId}${er}:${or}${endpoint.maybeNumber}${er} is in the ${BLUE}${endpoint.construction.status}${er} state`);
|
|
565
|
+
return undefined;
|
|
566
|
+
}
|
|
567
|
+
const state = endpoint.state;
|
|
568
|
+
const value = deepCopy(state[clusterName]);
|
|
569
|
+
log?.info(`${db}Get endpoint ${or}${endpoint.id}${db}:${or}${endpoint.number}${db} cluster ${hk}${capitalizeFirstLetter(clusterName)}${db} state ${debugStringify(value)}}`);
|
|
570
|
+
return value;
|
|
571
|
+
}
|
|
541
572
|
export async function triggerEvent(endpoint, cluster, event, payload, log) {
|
|
542
573
|
const clusterName = getBehavior(endpoint, cluster)?.id;
|
|
543
574
|
if (!clusterName) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matterbridge/core",
|
|
3
|
-
"version": "3.6.0-dev-
|
|
3
|
+
"version": "3.6.0-dev-20260306-2d4caeb",
|
|
4
4
|
"description": "Matterbridge core library",
|
|
5
5
|
"author": "https://github.com/Luligu",
|
|
6
6
|
"homepage": "https://matterbridge.io/",
|
|
@@ -122,10 +122,10 @@
|
|
|
122
122
|
],
|
|
123
123
|
"dependencies": {
|
|
124
124
|
"@matter/main": "0.16.10",
|
|
125
|
-
"@matterbridge/dgram": "3.6.0-dev-
|
|
126
|
-
"@matterbridge/thread": "3.6.0-dev-
|
|
127
|
-
"@matterbridge/types": "3.6.0-dev-
|
|
128
|
-
"@matterbridge/utils": "3.6.0-dev-
|
|
125
|
+
"@matterbridge/dgram": "3.6.0-dev-20260306-2d4caeb",
|
|
126
|
+
"@matterbridge/thread": "3.6.0-dev-20260306-2d4caeb",
|
|
127
|
+
"@matterbridge/types": "3.6.0-dev-20260306-2d4caeb",
|
|
128
|
+
"@matterbridge/utils": "3.6.0-dev-20260306-2d4caeb",
|
|
129
129
|
"archiver": "7.0.1",
|
|
130
130
|
"express": "5.2.1",
|
|
131
131
|
"glob": "13.0.6",
|