matterbridge-dyson-robot
Version:
A Matterbridge plugin that connects Dyson robot vacuums and air treatment devices to the Matter smart home ecosystem via their local or cloud MQTT APIs.
97 lines • 4.14 kB
JavaScript
// Matterbridge plugin for Dyson robot vacuum and air treatment devices
// Copyright © 2025 Alexander Thoukydides
import { FanControl, ResourceMonitoring } from 'matterbridge/matter/clusters';
import { ActivatedCarbonFilterMonitoringServer, FanControlServer, HepaFilterMonitoringServer } from 'matterbridge/matter/behaviors';
import { MatterbridgeOnOffServer } from 'matterbridge';
// Create the On/Off cluster
export function createOnOffClusterServer({ behaviors }) {
behaviors.require(MatterbridgeOnOffServer, {
// Variable attributes
onOff: false
});
}
// Create the Fan Control cluster
export function createFanControlClusterServer({ behaviors }, options) {
const { directionSupport } = options;
let { rockSupport, windSupport } = options;
const features = [
FanControl.Feature.MultiSpeed,
FanControl.Feature.Auto
];
if (directionSupport)
features.push(FanControl.Feature.AirflowDirection);
if (!rockSupport?.rockLeftRight && !rockSupport?.rockUpDown && !rockSupport?.rockRound)
rockSupport = undefined;
else
features.push(FanControl.Feature.Rocking);
if (!windSupport?.sleepWind && !windSupport?.naturalWind)
windSupport = undefined;
else
features.push(FanControl.Feature.Wind);
behaviors.require(FanControlServer.withFeatures(...features), {
// Constant attributes
rockSupport,
windSupport,
speedMax: 10,
fanModeSequence: FanControl.FanModeSequence.OffLowMedHighAuto,
// Variable attributes
fanMode: FanControl.FanMode.Off,
percentSetting: 0,
percentCurrent: 0,
speedSetting: 0,
speedCurrent: 0,
rockSetting: rockSupport && {},
windSetting: windSupport && {},
airflowDirection: directionSupport ? FanControl.AirflowDirection.Forward : undefined
});
}
// Create the HEPA Filter Monitoring cluster
export function createHepaFilterMonitoringClusterServer({ behaviors }, options) {
const { features, replacementProductList } = makeFeaturesAndReplacements(options);
behaviors.require(HepaFilterMonitoringServer.withFeatures(...features), {
// Constant attributes
degradationDirection: ResourceMonitoring.DegradationDirection.Down,
replacementProductList,
// Variable attributes
condition: 0,
changeIndication: ResourceMonitoring.ChangeIndication.Ok,
inPlaceIndicator: true,
// Unsupported attributes
lastChangedTime: undefined
});
}
// Create the Activated Carbon Filter Monitoring cluster
export function createActivatedCarbonFilterMonitoringClusterServer({ behaviors }, options) {
const { features, replacementProductList } = makeFeaturesAndReplacements(options);
behaviors.require(ActivatedCarbonFilterMonitoringServer.withFeatures(...features), {
// Constant attributes
degradationDirection: ResourceMonitoring.DegradationDirection.Down,
replacementProductList,
// Variable attributes
condition: 0,
changeIndication: ResourceMonitoring.ChangeIndication.Ok,
inPlaceIndicator: false,
// Unsupported attributes
lastChangedTime: undefined
});
}
// Prepare features and replacement products for a Filter Monitoring cluster
function makeFeaturesAndReplacements(options) {
// Default features that are always supported
const features = [
ResourceMonitoring.Feature.Condition,
ResourceMonitoring.Feature.Warning
];
let replacementProductList;
// Add a ReplacementProductList if filter part numbers were provided
const { filterPartNumbers } = options;
if (filterPartNumbers?.length) {
features.push(ResourceMonitoring.Feature.ReplacementProductList);
replacementProductList = filterPartNumbers.map(identifier => ({
productIdentifierType: ResourceMonitoring.ProductIdentifierType.Oem,
productIdentifierValue: identifier.substring(0, 20)
}));
}
return { features, replacementProductList };
}
//# sourceMappingURL=endpoint-air-purifier.js.map