homebridge
Version:
HomeKit support for the impatient
387 lines • 11.4 kB
TypeScript
/**
* Cluster State Types
*
* TypeScript interfaces for Matter cluster state objects.
* These are used in behavior files to avoid repeated 'as any' casts.
*
* Types are derived from @matter/main/clusters where possible.
*/
import type { WindowCovering } from '@matter/main/clusters';
/**
* Base interface for any cluster state
*/
export interface ClusterState {
[key: string]: unknown;
}
/**
* OnOff cluster state
*/
export interface OnOffState {
onOff?: boolean;
}
/**
* LevelControl cluster state
*/
export interface LevelControlState {
currentLevel?: number;
minLevel?: number;
maxLevel?: number;
remainingTime?: number;
onLevel?: number | null;
options?: number;
}
/**
* ColorControl cluster state
* Based on @matter/main/clusters ColorControl
*
* Note: We use a flexible interface to accommodate both ColorMode and EnhancedColorMode
* from Matter.js, which are distinct types in the spec but functionally compatible
*/
export interface ColorControlState {
colorTemperatureMireds?: number;
colorTempPhysicalMinMireds?: number;
colorTempPhysicalMaxMireds?: number;
currentHue?: number;
currentSaturation?: number;
enhancedCurrentHue?: number;
currentX?: number;
currentY?: number;
colorX?: number;
colorY?: number;
colorMode?: number;
enhancedColorMode?: number;
options?: number;
coupleColorTempToLevelMinMireds?: number;
transitionTime?: number;
}
/**
* Partial state interfaces for specific color control operations
* These are used when we only need to read/write specific properties
* from the complex Matter.js ColorControl state
*/
/**
* Color temperature specific state
*/
export interface ColorTemperatureState {
colorTemperatureMireds?: number;
}
/**
* Hue and saturation specific state
*/
export interface HueSaturationState {
currentHue?: number;
currentSaturation?: number;
}
/**
* XY color specific state
*/
export interface XYColorState {
currentX?: number;
currentY?: number;
}
/**
* Hue specific state (including enhanced hue)
*/
export interface HueState {
currentHue?: number;
enhancedCurrentHue?: number;
}
/**
* Saturation specific state
*/
export interface SaturationState {
currentSaturation?: number;
}
/**
* WindowCovering cluster state
* Based on @matter/main/clusters WindowCovering
*/
export interface WindowCoveringState {
type?: WindowCovering.WindowCoveringType;
configStatus?: {
operational?: boolean;
onlineReserved?: boolean;
online?: boolean;
liftMovementReversed?: boolean;
liftPositionAware?: boolean;
tiltPositionAware?: boolean;
liftEncoderControlled?: boolean;
tiltEncoderControlled?: boolean;
};
targetPositionLiftPercent100ths?: number | null;
currentPositionLiftPercent100ths?: number | null;
targetPositionTiltPercent100ths?: number | null;
currentPositionTiltPercent100ths?: number | null;
operationalStatus?: {
global: number;
lift: number;
tilt: number;
};
safetyStatus?: number;
endProductType?: number;
mode?: number;
}
/**
* FanControl cluster state
*/
export interface FanControlState {
fanMode?: number;
fanModeSequence?: number;
percentSetting?: number | null;
percentCurrent?: number;
speedMax?: number;
speedSetting?: number | null;
speedCurrent?: number;
rockSupport?: number;
rockSetting?: number;
windSupport?: number;
windSetting?: number;
}
/**
* Thermostat cluster state
*/
export interface ThermostatState {
localTemperature?: number | null;
externalMeasuredIndoorTemperature?: number | null;
outdoorTemperature?: number | null;
occupancy?: {
occupied?: boolean;
};
externallyMeasuredOccupancy?: boolean;
absMinHeatSetpointLimit?: number;
absMaxHeatSetpointLimit?: number;
absMinCoolSetpointLimit?: number;
absMaxCoolSetpointLimit?: number;
occupiedCoolingSetpoint?: number;
occupiedHeatingSetpoint?: number;
unoccupiedCoolingSetpoint?: number;
unoccupiedHeatingSetpoint?: number;
minHeatSetpointLimit?: number;
maxHeatSetpointLimit?: number;
minCoolSetpointLimit?: number;
maxCoolSetpointLimit?: number;
minSetpointDeadBand?: number;
remoteSensing?: number;
controlSequenceOfOperation?: number;
systemMode?: number;
thermostatRunningMode?: number;
startOfWeek?: number;
numberOfWeeklyTransitions?: number;
numberOfDailyTransitions?: number;
}
/**
* DoorLock cluster state
*/
export interface DoorLockState {
lockState?: number | null;
lockType?: number;
actuatorEnabled?: boolean;
operatingMode?: number;
doorState?: number | null;
doorOpenEvents?: number;
doorClosedEvents?: number;
openPeriod?: number;
}
/**
* RVC (Robotic Vacuum Cleaner) Operational State
*/
export interface RvcOperationalState {
phaseList?: string[] | null;
currentPhase?: number | null;
countdownTime?: number | null;
operationalStateList?: Array<{
operationalStateId: number;
operationalStateLabel?: string;
}>;
operationalState?: number;
operationalError?: {
errorStateId: number;
errorStateLabel?: string;
errorStateDetails?: string;
};
}
/**
* RVC Run Mode state
*/
export interface RvcRunModeState {
supportedModes?: Array<{
label: string;
mode: number;
modeTags?: Array<{
value: number;
}>;
}>;
currentMode?: number;
startUpMode?: number | null;
onMode?: number | null;
}
/**
* RVC Clean Mode state
*/
export interface RvcCleanModeState {
supportedModes?: Array<{
label: string;
mode: number;
modeTags?: Array<{
value: number;
}>;
}>;
currentMode?: number;
startUpMode?: number | null;
onMode?: number | null;
}
/**
* ValveConfigurationAndControl cluster state
*/
export interface ValveConfigurationAndControlState {
openDuration?: number | null;
defaultOpenDuration?: number | null;
remainingDuration?: number | null;
currentState?: number | null;
targetState?: number | null;
valveFault?: number;
}
/**
* Service Area state
*/
export interface ServiceAreaState {
supportedAreas?: Array<{
areaId: number;
mapId: number | null;
areaInfo: {
locationInfo?: {
locationName?: string;
floorNumber?: number | null;
areaType?: number | null;
} | null;
landmarkInfo?: {
landmarkTag?: number;
positionTag?: number | null;
relativePositionTag?: number | null;
} | null;
};
}>;
supportedMaps?: Array<{
mapId: number;
name: string;
}>;
selectedAreas?: number[];
currentArea?: number | null;
estimatedEndTime?: number | null;
progress?: Array<{
areaId: number;
status: number;
totalOperationalTime?: number | null;
}>;
}
/**
* Power Source state
* @see {@link https://matter-standard.github.io/matter/specification/latest/#ref-power-source-cluster}
*
* `batPercentRemaining` is encoded as double the percentage (0–200), so 100% = 200.
* `batChargeLevel`: 0 = Ok, 1 = Warning, 2 = Critical
*/
export interface PowerSourceState {
status?: number;
order?: number;
description?: string;
batVoltage?: number | null;
batPercentRemaining?: number | null;
batTimeRemaining?: number | null;
batChargeLevel?: number;
batReplacementNeeded?: boolean;
batReplaceability?: number;
batPresent?: boolean;
activeBatFaults?: number[];
batReplacementDescription?: string;
batQuantity?: number;
batChargeState?: number;
batTimeToFullCharge?: number | null;
batFunctionalWhileCharging?: boolean;
batChargingCurrent?: number | null;
activeBatChargeFaults?: number[];
}
/**
* One accuracy range within a MeasurementAccuracyStruct.
* At least one of the percent or fixed fields must be present.
* Percent fields are in hundredths of a percent (e.g. 100 = 1%),
* fixed fields are in the measurement's base unit (mV/mA/mW/mWh).
*/
export interface MeasurementAccuracyRangeStruct {
rangeMin: number;
rangeMax: number;
percentMax?: number;
percentMin?: number;
percentTypical?: number;
fixedMax?: number;
fixedMin?: number;
fixedTypical?: number;
}
/**
* Accuracy declaration for one measurement type (MeasurementAccuracyStruct).
* measurementType uses the Matter MeasurementType enum
* (1 = Voltage, 2 = ActiveCurrent, 5 = ActivePower, 14 = ElectricalEnergy).
*/
export interface MeasurementAccuracyStruct {
measurementType: number;
measured: boolean;
minMeasuredValue: number;
maxMeasuredValue: number;
accuracyRanges: MeasurementAccuracyRangeStruct[];
}
/**
* An energy reading (EnergyMeasurementStruct). energy is in milliwatt-hours.
* Timestamps are epoch seconds; systimes are milliseconds since boot.
*/
export interface EnergyMeasurementStruct {
energy: number;
startTimestamp?: number;
endTimestamp?: number;
startSystime?: number;
endSystime?: number;
}
/**
* ElectricalPowerMeasurement cluster state.
* Units are the raw Matter units: voltage in millivolts, current in
* milliamps, power in milliwatts. All measurement values are nullable
* (null = no measurement currently available).
*
* powerMode, numberOfMeasurementTypes and accuracy are mandatory in Matter
* but are synthesized with sensible defaults at registration when omitted
* (powerMode defaults to AC; accuracy is derived from the declared
* measurement attributes).
*
* Update cadence: the reading attributes (voltage, activeCurrent,
* activePower) are quieter-quality attributes - matter.js throttles their
* reports to subscribers (roughly one per 10 seconds), so frequent updates
* are tolerated but wasted. A cadence of a few seconds or slower is plenty.
*/
export interface ElectricalPowerMeasurementState {
powerMode?: number;
numberOfMeasurementTypes?: number;
accuracy?: MeasurementAccuracyStruct[];
voltage?: number | null;
activeCurrent?: number | null;
activePower?: number | null;
}
/**
* ElectricalEnergyMeasurement cluster state.
* Cluster features (Imported/Exported x Cumulative/Periodic) are detected at
* registration from which of these attributes the accessory declares.
* accuracy is mandatory in Matter but synthesized with a sensible default
* when omitted.
*
* Update cadence: energy readings are delivered to controllers through the
* Matter CumulativeEnergyMeasured / PeriodicEnergyMeasured events, and these
* are NOT throttled - every update is pushed to every subscribed controller
* immediately. Update energy totals at a measured cadence (for example every
* 30-60 seconds), not on every raw sample from the device.
*/
export interface ElectricalEnergyMeasurementState {
accuracy?: MeasurementAccuracyStruct;
cumulativeEnergyImported?: EnergyMeasurementStruct | null;
cumulativeEnergyExported?: EnergyMeasurementStruct | null;
periodicEnergyImported?: EnergyMeasurementStruct | null;
periodicEnergyExported?: EnergyMeasurementStruct | null;
}
//# sourceMappingURL=clusterTypes.d.ts.map