UNPKG

homebridge

Version:
684 lines 28.2 kB
/** * Matter Types for Homebridge Plugin API * * This module provides types and interfaces for plugin developers * to create Matter-compatible accessories. */ import type { Endpoint, EndpointType } from '@matter/main'; import type { Behavior } from '@matter/node'; import type { UnknownContext } from '../platformAccessory.js'; import type { ClusterHandlerMap } from './clusterHandlerMap.js'; import type { ClusterStateMap } from './clusterStateMap.js'; import { EventEmitter } from 'node:events'; /** * Optimized Matter.js Device and Cluster Imports * * Imports Matter.js devices and clusters from individual files instead of barrel exports, * which dramatically reduces startup time. * * Why this matters: * - Barrel import: `import * as devices from '@matter/main/devices'` loads ALL 186+ exports (~800ms) * - Individual imports: Only loads the 23 devices we actually use (~50-100ms) * - Result: 50-100x faster on powerful machines, even more improvement on Raspberry Pi * * This optimization is especially important for users on resource-constrained devices like * Raspberry Pi where the difference can be several minutes of startup time. */ import { AirQuality } from '@matter/main/clusters/air-quality'; import { BooleanState } from '@matter/main/clusters/boolean-state'; import { CarbonMonoxideConcentrationMeasurement } from '@matter/main/clusters/carbon-monoxide-concentration-measurement'; import { ColorControl } from '@matter/main/clusters/color-control'; import { DoorLock } from '@matter/main/clusters/door-lock'; import { FanControl } from '@matter/main/clusters/fan-control'; import { LevelControl } from '@matter/main/clusters/level-control'; import { NitrogenDioxideConcentrationMeasurement } from '@matter/main/clusters/nitrogen-dioxide-concentration-measurement'; import { OnOff } from '@matter/main/clusters/on-off'; import { OzoneConcentrationMeasurement } from '@matter/main/clusters/ozone-concentration-measurement'; import { Pm10ConcentrationMeasurement } from '@matter/main/clusters/pm10-concentration-measurement'; import { Pm25ConcentrationMeasurement } from '@matter/main/clusters/pm25-concentration-measurement'; import { RvcOperationalState } from '@matter/main/clusters/rvc-operational-state'; import { Thermostat } from '@matter/main/clusters/thermostat'; import { ValveConfigurationAndControl } from '@matter/main/clusters/valve-configuration-and-control'; import { WindowCovering } from '@matter/main/clusters/window-covering'; import { AirQualitySensorDevice } from '@matter/main/devices/air-quality-sensor'; import { ColorTemperatureLightDevice } from '@matter/main/devices/color-temperature-light'; import { ContactSensorDevice } from '@matter/main/devices/contact-sensor'; import { DimmableLightDevice } from '@matter/main/devices/dimmable-light'; import { DimmablePlugInUnitDevice } from '@matter/main/devices/dimmable-plug-in-unit'; import { DoorLockDevice } from '@matter/main/devices/door-lock'; import { ExtendedColorLightDevice } from '@matter/main/devices/extended-color-light'; import { FanDevice } from '@matter/main/devices/fan'; import { GenericSwitchDevice } from '@matter/main/devices/generic-switch'; import { HumiditySensorDevice } from '@matter/main/devices/humidity-sensor'; import { LightSensorDevice } from '@matter/main/devices/light-sensor'; import { OccupancySensorDevice } from '@matter/main/devices/occupancy-sensor'; import { OnOffLightDevice } from '@matter/main/devices/on-off-light'; import { OnOffLightSwitchDevice } from '@matter/main/devices/on-off-light-switch'; import { OnOffPlugInUnitDevice } from '@matter/main/devices/on-off-plug-in-unit'; import { PumpDevice } from '@matter/main/devices/pump'; import { RoboticVacuumCleanerDevice, RoboticVacuumCleanerRequirements } from '@matter/main/devices/robotic-vacuum-cleaner'; import { RoomAirConditionerDevice } from '@matter/main/devices/room-air-conditioner'; import { SmokeCoAlarmDevice } from '@matter/main/devices/smoke-co-alarm'; import { TemperatureSensorDevice } from '@matter/main/devices/temperature-sensor'; import { ThermostatDevice, ThermostatRequirements } from '@matter/main/devices/thermostat'; import { WaterLeakDetectorDevice } from '@matter/main/devices/water-leak-detector'; import { WaterValveDevice, WaterValveRequirements } from '@matter/main/devices/water-valve'; import { WindowCoveringDevice } from '@matter/main/devices/window-covering'; import { BridgedNodeEndpoint } from '@matter/main/endpoints/bridged-node'; type BehaviorType = Behavior.Type; export type { EndpointType }; /** * Handler context information * Provides information about which part of a composed device triggered the handler */ export interface MatterHandlerContext { /** Parent accessory UUID */ uuid: string; /** Part ID if this handler was triggered from a part, undefined for main accessory */ partId?: string; } /** * Matter command handler function type * * Handlers can be synchronous or asynchronous (returning a Promise). * The args parameter contains the command arguments passed by Matter.js (optional). * The context parameter provides information about which part triggered the handler (for composed devices). */ export type MatterCommandHandler<TArgs = unknown> = (args: TArgs, context?: MatterHandlerContext) => Promise<void> | void; /** * Matter cluster handlers interface * * Maps command names to their handler functions. * Each command can have custom argument types. * * Note: Uses `any` instead of `unknown` to allow handlers to specify * their own argument types without TypeScript variance errors. * Handlers can still be strongly typed in their implementations. */ export interface MatterClusterHandlers { [commandName: string]: MatterCommandHandler<any>; } /** * Matter Accessory Part - Sub-device in a composed accessory * * Represents a child endpoint in a composed device (e.g., individual outlets in a power strip). * Parts are added as child endpoints to the main accessory. */ export interface MatterAccessoryPart { /** Unique identifier for this part within the accessory (e.g., 'outlet-1', 'light', 'shade') */ id: string; /** Display name for this part (optional, defaults to parent's name + part id) */ displayName?: string; /** Matter device type for this part */ deviceType: EndpointType; /** * Initial cluster states for this part * Same format as `MatterAccessory.clusters` * * Known clusters get full autocomplete; unknown clusters use the fallback type. */ clusters: { [K in keyof ClusterStateMap]?: Partial<ClusterStateMap[K]>; } & { [clusterName: string]: Record<string, unknown>; }; /** * Handlers for this part's commands * Handlers receive context.partId to identify which part was triggered * * Known clusters get full autocomplete; unknown clusters use the fallback type. */ handlers?: { [K in keyof ClusterHandlerMap]?: Partial<ClusterHandlerMap[K]>; } & { [clusterName: string]: MatterClusterHandlers; }; } /** * Matter Accessory - Plugin API Interface * * This is the main interface that plugin developers use to register * Matter accessories with Homebridge. * * For composed devices (devices with multiple subcomponents), use the `parts` array * to define child endpoints. Each part appears as a separate device in the Home app. */ export interface MatterAccessory<T extends UnknownContext = UnknownContext> { /** Unique identifier for this accessory (must be unique across all accessories) */ UUID: string; /** Display name for the accessory */ displayName: string; /** Matter device type (e.g., OnOffLightDevice, DimmableLightDevice, etc.) */ deviceType: EndpointType; /** Serial number for the device */ serialNumber: string; /** Manufacturer name */ manufacturer: string; /** Model name/identifier */ model: string; /** Firmware revision (optional) */ firmwareRevision?: string; /** Hardware revision (optional) */ hardwareRevision?: string; /** Software version (optional) */ softwareVersion?: string; /** * Plugin developer storage - persists across restarts * This is a way for plugin developers to store custom data with their accessory * Similar to `PlatformAccessory.context` for HAP accessories */ context: T; /** * Initial cluster states * Key is the cluster name, value is an object of attribute name -> value * * Known clusters (onOff, levelControl, colorControl, etc.) provide full autocomplete. * Unknown clusters are still supported with the fallback `Record<string, unknown>` type. * * @example * ```typescript * clusters: { * onOff: { onOff: true }, * levelControl: { currentLevel: 127, minLevel: 1, maxLevel: 254 }, * } * ``` * * Note: If using `parts`, this is optional (main accessory may only be a container) */ clusters?: { [K in keyof ClusterStateMap]?: Partial<ClusterStateMap[K]>; } & { [clusterName: string]: Record<string, unknown>; }; /** * Handlers for Matter commands (Home app -> Device) * * These handlers are called when a user controls the accessory via the Home app. * Use handlers to send commands to your actual device (cloud API, local network, etc.). * * Known clusters (onOff, levelControl, colorControl, etc.) provide full autocomplete * for handler method names and argument types. * * @example * ```typescript * handlers: { * onOff: { * on: async () => { await device.turnOn() }, * off: async () => { await device.turnOff() }, * }, * levelControl: { * moveToLevel: async (args) => { * // args is typed as LevelControl.MoveToLevelRequest * await device.setBrightness(args?.level ?? 0) * }, * }, * } * ``` */ handlers?: { [K in keyof ClusterHandlerMap]?: Partial<ClusterHandlerMap[K]>; } & { [clusterName: string]: MatterClusterHandlers; }; /** * Optional: Get current state handler * Called when a Matter controller reads an attribute * If not provided, the last set value is returned * * @param cluster - Cluster name (e.g., 'onOff', 'levelControl') * @param attribute - Attribute name to read * @returns Current value of the attribute */ getState?: (cluster: string, attribute: string) => Promise<unknown> | unknown; /** * Optional: Array of child endpoints (parts) for composed devices * * Use this to create devices with multiple independent subcomponents, such as: * - Power strip with multiple outlets * - Window covering with shade + light * - Multi-zone thermostat or speaker system * * Each part appears as a separate device in the Home app and can be controlled independently. * * Example: * ```typescript * parts: [ * { * id: 'outlet-1', * displayName: 'Outlet 1', * deviceType: api.matter!.deviceTypes.OnOffOutlet, * clusters: { onOff: { onOff: false } }, * handlers: { * onOff: { * on: async (args, context) => { * console.log(`Part ${context.partId} turned on`) * await controlOutlet(1, true) * } * } * } * }, * // ... more outlets * ] * ``` */ parts?: MatterAccessoryPart[]; /** * Event emitter for accessory lifecycle events. * * **Only available for external accessories** published via `api.matter?.publishExternalAccessories()`. * This property is `undefined` for accessories registered via `api.matter?.registerPlatformAccessories()`. * * The event emitter is created automatically when the accessory is published and allows * plugins to listen for the 'ready' event (fired when the Matter server starts). * * **HAP Equivalent:** Similar to accessing events on `PlatformAccessory._associatedHAPAccessory` * * @example * ```typescript * const accessory: MatterAccessory = { ... }; * api.matter?.publishExternalAccessories('plugin', [accessory]); * * // Listen for when the accessory is ready on the network * accessory._eventEmitter?.on(MatterAccessoryEventTypes.READY, (port) => { * console.log(`Accessory ready on port ${port}`); * // Safe to start device integration, polling, webhooks, etc. * }); * ``` * * @see MatterAccessoryEventTypes for available events */ _eventEmitter?: MatterAccessoryEventEmitter; } /** * Matter Configuration (for bridge or child bridge) */ export interface MatterConfig extends Record<string, unknown> { /** Port for Matter server (optional, will auto-assign if not specified) */ port?: number; /** Name for the Matter bridge (optional) */ name?: string; } /** * Matter Accessory Event Types * * Events that can be emitted by Matter accessories during their lifecycle. * * @example * ```typescript * Listen for when a Matter accessory is ready * const accessory: MatterAccessory = { ... }; * api.matter?.publishExternalAccessories('plugin-name', [accessory]); * * const internal = accessory as any; * internal._eventEmitter?.on(MatterAccessoryEventTypes.READY, (port: number) => { * console.log(`Accessory ready on port ${port}`); * }); * ``` * * @group Matter Accessory */ export declare enum MatterAccessoryEventTypes { /** * Emitted when the Matter server is ready and the accessory is available on the network. * This is the main event to listen for to know when an external accessory is ready. * * **HAP Equivalent:** `AccessoryEventTypes.ADVERTISED` * * @param port - The port number the Matter server is listening on */ READY = "ready" } /** * Matter Accessory Event Emitter Interface * * Defines the typed event emitter interface for Matter accessories. * This interface extends Node's EventEmitter to provide type-safe event handling * for Matter accessory lifecycle events. * * **Usage Pattern:** * ```typescript * const accessory: MatterAccessory = { ... }; * api.matter?.publishExternalAccessories('plugin-name', [accessory]); * * Access the event emitter (note: created during registration) * const internal = accessory as InternalMatterAccessory; * internal._eventEmitter?.on(MatterAccessoryEventTypes.READY, (port: number) => { * console.log(`Accessory ready on port ${port}`); * }); * ``` * * @group Matter Accessory */ export interface MatterAccessoryEventEmitter extends EventEmitter { /** Register listener for 'ready' event (fired when accessory is available on network) */ on: (event: 'ready', listener: (port: number) => void) => this; /** Emit 'ready' event */ emit: (event: 'ready', port: number) => boolean; } /** * Internal representation of a part endpoint */ export interface InternalMatterAccessoryPart extends MatterAccessoryPart { /** Matter.js endpoint instance for this part */ endpoint?: Endpoint; } /** * Internal Matter accessory representation * (Used internally by MatterServer) * * @internal */ export interface InternalMatterAccessory extends MatterAccessory { /** Plugin identifier (set when registered) */ _associatedPlugin?: string; /** Platform name (set when registered) */ _associatedPlatform?: string; /** Matter.js endpoint instance */ endpoint?: Endpoint; /** Whether this accessory is currently registered */ registered: boolean; /** Internal part endpoints (if using parts) */ _parts?: InternalMatterAccessoryPart[]; } /** * Matter error type enum (for error handler categorization) */ export declare enum MatterErrorType { INITIALIZATION = "INITIALIZATION", NETWORK = "NETWORK", COMMISSIONING = "COMMISSIONING", DEVICE_SYNC = "DEVICE_SYNC", SERVER = "SERVER", STORAGE = "STORAGE", CONFIGURATION = "CONFIGURATION", DEVICE_ERROR = "DEVICE_ERROR", UNKNOWN = "UNKNOWN" } /** * Matter error details interface */ export interface MatterErrorDetails { type?: MatterErrorType; recoverable?: boolean; code?: string; context?: string; originalError?: Error; } /** * Matter error types */ export declare class MatterError extends Error { readonly code: string; readonly details?: MatterErrorDetails | undefined; readonly type: MatterErrorType; readonly timestamp: Date; readonly recoverable: boolean; constructor(message: string, code: string, details?: MatterErrorDetails | undefined); } export declare class MatterCommissioningError extends MatterError { constructor(message: string, details?: MatterErrorDetails); } export declare class MatterStorageError extends MatterError { constructor(message: string, details?: MatterErrorDetails); } export declare class MatterDeviceError extends MatterError { constructor(message: string, details?: MatterErrorDetails); } export declare class MatterNetworkError extends MatterError { constructor(message: string, details?: MatterErrorDetails); } /** * Matter device types * * All supported Matter device types, imported from individual files for optimal performance. */ declare const devices: { AirQualitySensorDevice: AirQualitySensorDevice; ColorTemperatureLightDevice: ColorTemperatureLightDevice; ContactSensorDevice: ContactSensorDevice; DimmableLightDevice: DimmableLightDevice; DimmablePlugInUnitDevice: DimmablePlugInUnitDevice; DoorLockDevice: DoorLockDevice; ExtendedColorLightDevice: ExtendedColorLightDevice; FanDevice: FanDevice; GenericSwitchDevice: GenericSwitchDevice; HumiditySensorDevice: HumiditySensorDevice; LightSensorDevice: LightSensorDevice; OccupancySensorDevice: OccupancySensorDevice; OnOffLightDevice: OnOffLightDevice; OnOffLightSwitchDevice: OnOffLightSwitchDevice; OnOffPlugInUnitDevice: OnOffPlugInUnitDevice; PumpDevice: PumpDevice; RoboticVacuumCleanerDevice: RoboticVacuumCleanerDevice; RoboticVacuumCleanerRequirements: typeof RoboticVacuumCleanerRequirements; RoomAirConditionerDevice: RoomAirConditionerDevice; SmokeCoAlarmDevice: SmokeCoAlarmDevice; TemperatureSensorDevice: TemperatureSensorDevice; ThermostatDevice: ThermostatDevice; ThermostatRequirements: typeof ThermostatRequirements; WaterLeakDetectorDevice: WaterLeakDetectorDevice; WaterValveDevice: WaterValveDevice; WaterValveRequirements: typeof WaterValveRequirements; WindowCoveringDevice: WindowCoveringDevice; }; /** * Matter cluster types * * All supported Matter cluster types, imported from individual files for optimal performance. */ declare const clusters: { AirQuality: typeof AirQuality; BooleanState: typeof BooleanState; CarbonMonoxideConcentrationMeasurement: typeof CarbonMonoxideConcentrationMeasurement; ColorControl: typeof ColorControl; DoorLock: typeof DoorLock; FanControl: typeof FanControl; LevelControl: typeof LevelControl; NitrogenDioxideConcentrationMeasurement: typeof NitrogenDioxideConcentrationMeasurement; OnOff: typeof OnOff; OzoneConcentrationMeasurement: typeof OzoneConcentrationMeasurement; Pm10ConcentrationMeasurement: typeof Pm10ConcentrationMeasurement; Pm25ConcentrationMeasurement: typeof Pm25ConcentrationMeasurement; RvcOperationalState: typeof RvcOperationalState; Thermostat: typeof Thermostat; ValveConfigurationAndControl: typeof ValveConfigurationAndControl; WindowCovering: typeof WindowCovering; }; export { clusters, devices }; /** * Friendly device type names for the Plugin API * Maps simplified names to actual Matter.js device types */ export declare const deviceTypes: { readonly OnOffLight: OnOffLightDevice; readonly DimmableLight: DimmableLightDevice; readonly ColorTemperatureLight: ColorTemperatureLightDevice; readonly ExtendedColorLight: ExtendedColorLightDevice; readonly OnOffSwitch: OnOffLightSwitchDevice; readonly OnOffOutlet: OnOffPlugInUnitDevice; readonly DimmableOutlet: DimmablePlugInUnitDevice; readonly AirQualitySensor: AirQualitySensorDevice; readonly TemperatureSensor: TemperatureSensorDevice; readonly HumiditySensor: HumiditySensorDevice; readonly LightSensor: LightSensorDevice; readonly MotionSensor: OccupancySensorDevice; readonly ContactSensor: ContactSensorDevice; readonly LeakSensor: WaterLeakDetectorDevice; readonly SmokeSensor: SmokeCoAlarmDevice; readonly Thermostat: import("@matter/main").MutableEndpoint.With<EndpointType.For<{ readonly name: "Thermostat"; readonly deviceType: 769; readonly deviceRevision: 5; readonly requirements: typeof ThermostatRequirements; readonly behaviors: { readonly identify: typeof import("@matter/node/behaviors").IdentifyServer; }; }>, import("@matter/main").SupportedBehaviors.With<{ readonly identify: typeof import("@matter/node/behaviors").IdentifyServer; }, readonly [import("@matter/main").ClusterBehavior.Type<typeof import("@matter/node/behaviors").ThermostatServer, import("@matter/types").ClusterType.WithSupportedFeatures<Thermostat, { occupancy: true; presets: false; heating: true; cooling: true; autoMode: true; setback: false; localTemperatureNotExposed: false; matterScheduleConfiguration: false; }>, import("@matter/types").ClusterType.Concrete, typeof import("@matter/node/behaviors").ThermostatBaseServer.Internal, "thermostat">]>>; readonly Fan: FanDevice; readonly DoorLock: DoorLockDevice; readonly WindowCovering: WindowCoveringDevice; readonly RoboticVacuumCleaner: RoboticVacuumCleanerDevice; readonly WaterValve: import("@matter/main").MutableEndpoint.With<EndpointType.For<{ readonly name: "WaterValve"; readonly deviceType: 66; readonly deviceRevision: 1; readonly requirements: typeof WaterValveRequirements; readonly behaviors: { readonly identify: typeof import("@matter/node/behaviors").IdentifyServer; } & { readonly valveConfigurationAndControl: typeof import("@matter/node/behaviors").ValveConfigurationAndControlServer; }; }>, import("@matter/main").SupportedBehaviors.With<{ readonly identify: typeof import("@matter/node/behaviors").IdentifyServer; } & { readonly valveConfigurationAndControl: typeof import("@matter/node/behaviors").ValveConfigurationAndControlServer; }, readonly [typeof import("@matter/node/behaviors").ValveConfigurationAndControlServer]>>; readonly GenericSwitch: GenericSwitchDevice; readonly Pump: PumpDevice; readonly RoomAirConditioner: RoomAirConditionerDevice; readonly BridgedNode: BridgedNodeEndpoint; }; /** * Matter Cluster Names * Commonly used cluster names for type safety and autocomplete * Use these with api.updateMatterAccessoryState() and api.getAccessoryState() * * @example * ```typescript * With autocomplete and type safety: * api.updateMatterAccessoryState(uuid, api.matterClusterNames.OnOff, { onOff: true }) * api.getAccessoryState(uuid, api.matterClusterNames.LevelControl) * ``` */ export declare const clusterNames: { readonly OnOff: "onOff"; readonly LevelControl: "levelControl"; readonly ColorControl: "colorControl"; readonly DoorLock: "doorLock"; readonly WindowCovering: "windowCovering"; readonly Thermostat: "thermostat"; readonly FanControl: "fanControl"; readonly AirQuality: "airQuality"; readonly CarbonMonoxideConcentrationMeasurement: "carbonMonoxideConcentrationMeasurement"; readonly NitrogenDioxideConcentrationMeasurement: "nitrogenDioxideConcentrationMeasurement"; readonly OzoneConcentrationMeasurement: "ozoneConcentrationMeasurement"; readonly Pm10ConcentrationMeasurement: "pm10ConcentrationMeasurement"; readonly Pm25ConcentrationMeasurement: "pm25ConcentrationMeasurement"; readonly TemperatureMeasurement: "temperatureMeasurement"; readonly RelativeHumidityMeasurement: "relativeHumidityMeasurement"; readonly IlluminanceMeasurement: "illuminanceMeasurement"; readonly OccupancySensing: "occupancySensing"; readonly BooleanState: "booleanState"; readonly SmokeCoAlarm: "smokeCoAlarm"; readonly RvcRunMode: "rvcRunMode"; readonly RvcOperationalState: "rvcOperationalState"; readonly RvcCleanMode: "rvcCleanMode"; readonly ServiceArea: "serviceArea"; readonly PowerSource: "powerSource"; readonly PumpConfigurationAndControl: "pumpConfigurationAndControl"; readonly ValveConfigurationAndControl: "valveConfigurationAndControl"; readonly Identify: "identify"; readonly Switch: "switch"; readonly BasicInformation: "basicInformation"; readonly BridgedDeviceBasicInformation: "bridgedDeviceBasicInformation"; }; /** * Type for Matter cluster names * Provides type safety for cluster name strings */ export type MatterClusterName = typeof clusterNames[keyof typeof clusterNames]; /** * Type-safe accessory map for MatterServer */ export type MatterAccessoryMap = Map<string, InternalMatterAccessory>; /** * Type representing an Endpoint with settable state * * This type is used when we need to check if an endpoint has a state * object and a set method. The state structure varies by device type, * so we use a generic Record type. */ export type EndpointWithSettableState = Endpoint & { state: Record<string, unknown>; set: (values: Record<string, Record<string, unknown>>) => Promise<void>; }; /** * Check if endpoint has state property (type guard) * * We use a runtime check to determine if an endpoint has a settable state. * This is necessary because Endpoint's state structure is complex and varies * based on device type. * * @param endpoint - The endpoint to check * @returns True if endpoint has state and set method */ export declare function hasEndpointState(endpoint: Endpoint): endpoint is EndpointWithSettableState; /** * Safely update endpoint state * Uses the Endpoint's set method to update cluster attributes * * @param endpoint - The Matter endpoint * @param cluster - Cluster name * @param attributes - Attributes to update * @throws {Error} If endpoint does not support state updates */ export declare function updateEndpointState(endpoint: Endpoint, cluster: string, attributes: Record<string, unknown>): Promise<void>; /** * Device type with behaviors (internal Matter.js structure) * Used when we need to check if a device type supports .with() */ export interface DeviceTypeWithBehaviors extends EndpointType { with: (...behaviors: BehaviorType[]) => DeviceTypeWithBehaviors; } /** * WindowCovering cluster with dynamic attributes */ export interface WindowCoveringCluster { type?: number; configStatus?: { operational?: boolean; onlineReserved?: boolean; liftMovementReversed?: boolean; liftPositionAware?: boolean; tiltPositionAware?: boolean; liftEncoderControlled?: boolean; tiltEncoderControlled?: boolean; }; targetPositionLiftPercent100ths?: number; currentPositionLiftPercent100ths?: number; targetPositionTiltPercent100ths?: number; currentPositionTiltPercent100ths?: number; operationalStatus?: { global: number; lift: number; tilt: number; }; } /** * Type-safe cluster access for WindowCovering */ export declare function getWindowCoveringCluster(accessory: MatterAccessory): WindowCoveringCluster | undefined; /** * Events emitted by MatterServer */ export interface MatterServerEvents { 'commissioning-status-changed': (commissioned: boolean, fabricCount: number) => void; 'stateChange': (data: { uuid: string; cluster: string; state: Record<string, unknown>; partId?: string; }) => void; } //# sourceMappingURL=types.d.ts.map