@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?: Semtag['label'], mfgCode?: Semtag['mfgCode']): Semtag;
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 = null, mfgCode = null) {
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-20260305-776ca2f",
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-20260305-776ca2f",
126
- "@matterbridge/thread": "3.6.0-dev-20260305-776ca2f",
127
- "@matterbridge/types": "3.6.0-dev-20260305-776ca2f",
128
- "@matterbridge/utils": "3.6.0-dev-20260305-776ca2f",
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",