@matterbridge/core 3.6.2-dev-20260317-e291a17 → 3.7.0-dev-20260318-5bb831c

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.
Files changed (33) hide show
  1. package/dist/devices/basicVideoPlayer.d.ts +8 -9
  2. package/dist/devices/basicVideoPlayer.js +64 -16
  3. package/dist/devices/closure.d.ts +2 -3
  4. package/dist/devices/closure.js +16 -4
  5. package/dist/devices/closurePanel.d.ts +2 -3
  6. package/dist/devices/closurePanel.js +16 -4
  7. package/dist/devices/dishwasher.d.ts +1 -2
  8. package/dist/devices/dishwasher.js +8 -2
  9. package/dist/devices/evse.d.ts +3 -3
  10. package/dist/devices/evse.js +24 -6
  11. package/dist/devices/laundryWasher.d.ts +1 -2
  12. package/dist/devices/laundryWasher.js +8 -2
  13. package/dist/devices/microwaveOven.d.ts +1 -2
  14. package/dist/devices/microwaveOven.js +15 -3
  15. package/dist/devices/roboticVacuumCleaner.d.ts +5 -6
  16. package/dist/devices/roboticVacuumCleaner.js +40 -10
  17. package/dist/devices/temperatureControl.d.ts +2 -3
  18. package/dist/devices/temperatureControl.js +16 -4
  19. package/dist/devices/waterHeater.d.ts +3 -4
  20. package/dist/devices/waterHeater.js +24 -6
  21. package/dist/export.d.ts +1 -0
  22. package/dist/export.js +1 -0
  23. package/dist/jestutils/jestHelpers.js +1 -1
  24. package/dist/matterbridgeBehaviorsServer.d.ts +55 -53
  25. package/dist/matterbridgeBehaviorsServer.js +403 -139
  26. package/dist/matterbridgeEndpoint.d.ts +9 -7
  27. package/dist/matterbridgeEndpoint.js +11 -6
  28. package/dist/matterbridgeEndpointCommandHandler.d.ts +806 -0
  29. package/dist/matterbridgeEndpointCommandHandler.js +31 -0
  30. package/dist/matterbridgeEndpointHelpers.d.ts +2 -2
  31. package/dist/matterbridgeEndpointHelpers.js +1 -0
  32. package/dist/matterbridgeEndpointTypes.d.ts +0 -83
  33. package/package.json +5 -5
@@ -1,4 +1,4 @@
1
- import { AtLeastOne, NamedHandler } from '@matter/general';
1
+ import { AtLeastOne } from '@matter/general';
2
2
  import { ActionContext, Behavior, Endpoint, ServerNode } from '@matter/node';
3
3
  import { ClusterType } from '@matter/types/cluster';
4
4
  import { AirQuality } from '@matter/types/clusters/air-quality';
@@ -24,7 +24,8 @@ import { ClusterId, EndpointNumber } from '@matter/types/datatype';
24
24
  import { Semtag } from '@matter/types/globals';
25
25
  import { AnsiLogger, LogLevel } from 'node-ansi-logger';
26
26
  import { DeviceTypeDefinition } from './matterbridgeDeviceTypes.js';
27
- import { CommandHandlerFunction, MatterbridgeEndpointCommands, MatterbridgeEndpointOptions, SerializedMatterbridgeEndpoint } from './matterbridgeEndpointTypes.js';
27
+ import { CommandHandler, CommandHandlerData, CommandHandlerFunction, CommandHandlers } from './matterbridgeEndpointCommandHandler.js';
28
+ import { MatterbridgeEndpointOptions, SerializedMatterbridgeEndpoint } from './matterbridgeEndpointTypes.js';
28
29
  type BehaviorCommandName<T extends Behavior.Type> = {
29
30
  [K in keyof CommandsOfBehavior<T>]: K;
30
31
  }[keyof CommandsOfBehavior<T>] & string;
@@ -58,7 +59,7 @@ export declare class MatterbridgeEndpoint extends Endpoint {
58
59
  name: string | undefined;
59
60
  deviceType: number | undefined;
60
61
  readonly deviceTypes: Map<number, DeviceTypeDefinition>;
61
- readonly commandHandler: NamedHandler<MatterbridgeEndpointCommands>;
62
+ readonly commandHandler: CommandHandler;
62
63
  constructor(definition: DeviceTypeDefinition | AtLeastOne<DeviceTypeDefinition>, options?: MatterbridgeEndpointOptions, debug?: boolean);
63
64
  static loadInstance(definition: DeviceTypeDefinition | AtLeastOne<DeviceTypeDefinition>, options?: MatterbridgeEndpointOptions, debug?: boolean): Promise<MatterbridgeEndpoint>;
64
65
  getDeviceTypes(): DeviceTypeDefinition[];
@@ -87,13 +88,14 @@ export declare class MatterbridgeEndpoint extends Endpoint {
87
88
  addClusterServers(serverList: ClusterId[]): this;
88
89
  addFixedLabel(label: string, value: string): Promise<this>;
89
90
  addUserLabel(label: string, value: string): Promise<this>;
90
- addCommandHandler(command: keyof MatterbridgeEndpointCommands, handler: CommandHandlerFunction): this;
91
- executeCommandHandler(command: keyof MatterbridgeEndpointCommands, request?: Record<string, boolean | number | bigint | string | object | null>, cluster?: string, attributes?: Record<string, boolean | number | bigint | string | object | null>, endpoint?: MatterbridgeEndpoint): Promise<void>;
91
+ addCommandHandler<C extends CommandHandlers>(command: C, handler: CommandHandlerFunction<C>): this;
92
+ removeCommandHandler<C extends CommandHandlers>(command: C, handler: CommandHandlerFunction<C>): this;
93
+ executeCommandHandler<C extends CommandHandlers>(command: C, request: CommandHandlerData<C>['request'], cluster: CommandHandlerData<C>['cluster'], attributes: CommandHandlerData<C>['attributes'], endpoint: CommandHandlerData<C>['endpoint']): Promise<void>;
92
94
  invokeBehaviorCommand<T extends Behavior.Type, C extends BehaviorCommandName<T>>(cluster: T, command: C, params?: BehaviorCommandParams<T, C>): Promise<void>;
93
95
  invokeBehaviorCommand<T extends ClusterType, C extends keyof ClusterType.CommandsOf<T>>(cluster: T, command: C, params?: ClusterType.CommandsOf<T>[C] extends {
94
96
  requestSchema: infer S extends import('@matter/types/tlv').TlvSchema<unknown>;
95
97
  } ? import('@matter/types/tlv').TypeFromSchema<S> : never): Promise<void>;
96
- invokeBehaviorCommand(cluster: ClusterId | string, command: keyof MatterbridgeEndpointCommands, params?: Record<string, boolean | number | bigint | string | object | null>): Promise<void>;
98
+ invokeBehaviorCommand(cluster: ClusterId | string, command: CommandHandlers, params?: Record<string, boolean | number | bigint | string | object | null>): Promise<void>;
97
99
  addRequiredClusterServers(): MatterbridgeEndpoint;
98
100
  addOptionalClusterServers(): MatterbridgeEndpoint;
99
101
  getAllClusterServers(): Behavior.Type[];
@@ -145,7 +147,7 @@ export declare class MatterbridgeEndpoint extends Endpoint {
145
147
  setWindowCoveringTargetAndCurrentPosition(liftPosition: number, tiltPosition?: number): Promise<void>;
146
148
  createDefaultThermostatClusterServer(localTemperature?: number, occupiedHeatingSetpoint?: number, occupiedCoolingSetpoint?: number, minSetpointDeadBand?: number, minHeatSetpointLimit?: number, maxHeatSetpointLimit?: number, minCoolSetpointLimit?: number, maxCoolSetpointLimit?: number, unoccupiedHeatingSetpoint?: number | undefined, unoccupiedCoolingSetpoint?: number | undefined, occupied?: boolean | undefined, outdoorTemperature?: number | null | undefined): this;
147
149
  createDefaultHeatingThermostatClusterServer(localTemperature?: number, occupiedHeatingSetpoint?: number, minHeatSetpointLimit?: number, maxHeatSetpointLimit?: number, unoccupiedHeatingSetpoint?: number | undefined, occupied?: boolean | undefined, outdoorTemperature?: number | null | undefined): this;
148
- createDefaultPresetsThermostatClusterServer(localTemperature?: number, occupiedHeatingSetpoint?: number, occupiedCoolingSetpoint?: number, minSetpointDeadBand?: number, minHeatSetpointLimit?: number, maxHeatSetpointLimit?: number, minCoolSetpointLimit?: number, maxCoolSetpointLimit?: number, unoccupiedHeatingSetpoint?: number | undefined, unoccupiedCoolingSetpoint?: number | undefined, occupied?: boolean | undefined, outdoorTemperature?: number | null | undefined, activePresetHandle?: number | undefined, presetsList?: Thermostat.Preset[] | null | undefined, presetTypes?: Thermostat.PresetType[] | null | undefined): this;
150
+ createDefaultPresetsThermostatClusterServer(localTemperature?: number, occupiedHeatingSetpoint?: number, occupiedCoolingSetpoint?: number, minSetpointDeadBand?: number, minHeatSetpointLimit?: number, maxHeatSetpointLimit?: number, minCoolSetpointLimit?: number, maxCoolSetpointLimit?: number, unoccupiedHeatingSetpoint?: number | undefined, unoccupiedCoolingSetpoint?: number | undefined, occupied?: boolean | undefined, outdoorTemperature?: number | null | undefined, activePresetHandle?: Uint8Array | null, presetsList?: Thermostat.Preset[] | null | undefined, presetTypes?: Thermostat.PresetType[] | null | undefined): this;
149
151
  createDefaultCoolingThermostatClusterServer(localTemperature?: number, occupiedCoolingSetpoint?: number, minCoolSetpointLimit?: number, maxCoolSetpointLimit?: number, unoccupiedCoolingSetpoint?: number | undefined, occupied?: boolean | undefined, outdoorTemperature?: number | null | undefined): this;
150
152
  createDefaultThermostatUserInterfaceConfigurationClusterServer(temperatureDisplayMode?: ThermostatUserInterfaceConfiguration.TemperatureDisplayMode, keypadLockout?: ThermostatUserInterfaceConfiguration.KeypadLockout, scheduleProgrammingVisibility?: ThermostatUserInterfaceConfiguration.ScheduleProgrammingVisibility): this;
151
153
  createDefaultFanControlClusterServer(fanMode?: FanControl.FanMode, fanModeSequence?: FanControl.FanModeSequence, percentSetting?: number, percentCurrent?: number): this;
@@ -1,6 +1,6 @@
1
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
2
2
  console.log('\u001B[32mMatterbridgeEndpoint loaded.\u001B[40;0m');
3
- import { Lifecycle, NamedHandler, UINT16_MAX, UINT32_MAX } from '@matter/general';
3
+ import { Lifecycle, UINT16_MAX, UINT32_MAX } from '@matter/general';
4
4
  import { Endpoint, MutableEndpoint, SupportedBehaviors } from '@matter/node';
5
5
  import { AirQualityServer } from '@matter/node/behaviors/air-quality';
6
6
  import { BooleanStateServer } from '@matter/node/behaviors/boolean-state';
@@ -63,6 +63,7 @@ import { inspectError } from '@matterbridge/utils/error';
63
63
  import { isValidNumber, isValidObject, isValidString } from '@matterbridge/utils/validate';
64
64
  import { AnsiLogger, CYAN, db, debugStringify, hk, or, YELLOW, zb } from 'node-ansi-logger';
65
65
  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 './matterbridgeBehaviorsServer.js';
66
+ import { CommandHandler } from './matterbridgeEndpointCommandHandler.js';
66
67
  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';
67
68
  const MATTERBRIDGE_ENDPOINT_BRAND = Symbol('MatterbridgeEndpoint.brand');
68
69
  export function isMatterbridgeEndpoint(value) {
@@ -104,7 +105,7 @@ export class MatterbridgeEndpoint extends Endpoint {
104
105
  name = undefined;
105
106
  deviceType = undefined;
106
107
  deviceTypes = new Map();
107
- commandHandler = new NamedHandler();
108
+ commandHandler = new CommandHandler();
108
109
  constructor(definition, options = {}, debug = false) {
109
110
  let deviceTypeList = [];
110
111
  const originalId = options.id;
@@ -237,8 +238,12 @@ export class MatterbridgeEndpoint extends Endpoint {
237
238
  this.commandHandler.addHandler(command, handler);
238
239
  return this;
239
240
  }
241
+ removeCommandHandler(command, handler) {
242
+ this.commandHandler.removeHandler(command, handler);
243
+ return this;
244
+ }
240
245
  async executeCommandHandler(command, request, cluster, attributes, endpoint) {
241
- await this.commandHandler.executeHandler(command, { request, cluster, attributes, endpoint });
246
+ await this.commandHandler.executeHandler(command, { command, request, cluster, attributes, endpoint });
242
247
  }
243
248
  async invokeBehaviorCommand(cluster, command, params) {
244
249
  await invokeBehaviorCommand(this, cluster, command, params);
@@ -887,7 +892,7 @@ export class MatterbridgeEndpoint extends Endpoint {
887
892
  });
888
893
  return this;
889
894
  }
890
- createDefaultPresetsThermostatClusterServer(localTemperature = 23, occupiedHeatingSetpoint = 21, occupiedCoolingSetpoint = 25, minSetpointDeadBand = 0, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50, unoccupiedHeatingSetpoint = undefined, unoccupiedCoolingSetpoint = undefined, occupied = undefined, outdoorTemperature = undefined, activePresetHandle = undefined, presetsList = undefined, presetTypes = undefined) {
895
+ createDefaultPresetsThermostatClusterServer(localTemperature = 23, occupiedHeatingSetpoint = 21, occupiedCoolingSetpoint = 25, minSetpointDeadBand = 0, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50, unoccupiedHeatingSetpoint = undefined, unoccupiedCoolingSetpoint = undefined, occupied = undefined, outdoorTemperature = undefined, activePresetHandle = null, presetsList = undefined, presetTypes = undefined) {
891
896
  this.behaviors.require(MatterbridgePresetThermostatServer.with(Thermostat.Feature.Heating, Thermostat.Feature.Cooling, Thermostat.Feature.AutoMode, ...(occupied !== undefined ? [Thermostat.Feature.Occupancy] : []), Thermostat.Feature.Presets), {
892
897
  localTemperature: localTemperature * 100,
893
898
  externalMeasuredIndoorTemperature: localTemperature * 100,
@@ -911,9 +916,9 @@ export class MatterbridgeEndpoint extends Endpoint {
911
916
  ...(occupied !== undefined ? { occupancy: { occupied } } : {}),
912
917
  ...(occupied !== undefined ? { externallyMeasuredOccupancy: true } : {}),
913
918
  numberOfPresets: Math.max(Array.isArray(presetsList) ? presetsList.length : 0, 10),
914
- activePresetHandle: activePresetHandle !== undefined ? Uint8Array.from([activePresetHandle]) : null,
919
+ activePresetHandle: activePresetHandle ? Uint8Array.from([activePresetHandle]) : null,
915
920
  presets: (presetsList ?? []).map((p) => ({
916
- presetHandle: Uint8Array.from(p.presetHandle || [0]),
921
+ presetHandle: p.presetHandle ? Uint8Array.from(p.presetHandle) : null,
917
922
  presetScenario: p.presetScenario,
918
923
  name: p.name,
919
924
  coolingSetpoint: p.coolingSetpoint,