matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
85 lines • 3.32 kB
JavaScript
import { CleanSequenceType, MopWaterFlow, VacuumSuctionPower } from '../enums/index.js';
import { CleanModeDisplayLabel, CleanModeLabelInfo } from './cleanModeConfig.js';
var BehaviorType;
(function (BehaviorType) {
BehaviorType["Default"] = "default";
BehaviorType["Smart"] = "smart";
})(BehaviorType || (BehaviorType = {}));
/**
* Resolve current clean mode from device settings using mode configurations.
* Supports both default and smart device types through configuration injection.
*/
export class ModeResolver {
behavior;
settingsToModeMap;
customCheckFn;
constructor(configs, customCheckFn, behavior = BehaviorType.Default) {
this.behavior = behavior;
this.settingsToModeMap = new Map(configs.map((c) => [this.serializeSetting(c.setting), c.mode]));
this.customCheckFn = customCheckFn;
}
/**
* Determine current mode from device settings.
*/
resolve(setting) {
if (!setting || typeof setting !== 'object') {
return undefined;
}
if (this.customCheckFn) {
const customResult = this.customCheckFn(setting);
if (customResult !== undefined) {
return customResult;
}
}
const serialized = this.serializeSetting(setting);
const exactMatch = this.settingsToModeMap.get(serialized);
if (exactMatch !== undefined) {
return exactMatch;
}
return this.resolveFallback(setting);
}
serializeSetting(setting) {
return `${setting.suctionPower}:${setting.waterFlow}:${setting.mopRoute}`;
}
resolveFallback(setting) {
if (setting.suctionPower === VacuumSuctionPower.Off)
return CleanModeLabelInfo[CleanModeDisplayLabel.MopDefault].mode;
if (setting.waterFlow === MopWaterFlow.Off)
return CleanModeLabelInfo[CleanModeDisplayLabel.VacuumDefault].mode;
if (setting.suctionPower !== VacuumSuctionPower.Off && setting.waterFlow !== MopWaterFlow.Off)
return CleanModeLabelInfo[CleanModeDisplayLabel.VacuumAndMopDefault].mode;
return undefined;
}
}
/**
* Create resolver for default devices.
*/
export function createDefaultModeResolver(configs) {
return new ModeResolver(configs, (setting) => {
if (setting.sequenceType === CleanSequenceType.OneTime) {
return CleanModeLabelInfo[CleanModeDisplayLabel.VacFollowedByMop].mode;
}
if (setting.isCustomMode) {
return CleanModeLabelInfo[CleanModeDisplayLabel.VacuumAndMopEnergySaving].mode;
}
return undefined;
}, BehaviorType.Default);
}
/**
* Create resolver for smart devices.
*/
export function createSmartModeResolver(configs) {
return new ModeResolver(configs, (setting) => {
if (setting.isSmartMode) {
return CleanModeLabelInfo[CleanModeDisplayLabel.SmartPlan].mode;
}
if (setting.sequenceType === CleanSequenceType.OneTime) {
return CleanModeLabelInfo[CleanModeDisplayLabel.VacFollowedByMop].mode;
}
if (setting.isCustomMode) {
return CleanModeLabelInfo[CleanModeDisplayLabel.VacuumAndMopEnergySaving].mode;
}
return undefined;
}, BehaviorType.Smart);
}
//# sourceMappingURL=modeResolver.js.map