matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
160 lines (141 loc) • 5.04 kB
text/typescript
import { MaybePromise } from 'matterbridge/matter';
import { AnsiLogger, debugStringify } from 'matterbridge/logger';
import { BehaviorDeviceGeneric, BehaviorRoborock, DeviceCommands } from '../../BehaviorDeviceGeneric.js';
import RoborockService from '../../../roborockService.js';
import { CleanModeSettings } from '../../../model/ExperimentalFeatureSetting.js';
import { RvcCleanMode as DefaultRvcCleanMode, CleanSetting as DefaultCleanSetting, getSettingFromCleanMode, RvcRunMode, CleanModeSetting } from '../default/default.js';
export interface EndpointCommandsSmart extends DeviceCommands {
selectAreas: (newAreas: number[] | undefined) => MaybePromise;
changeToMode: (newMode: number) => MaybePromise;
pause: () => MaybePromise;
resume: () => MaybePromise;
goHome: () => MaybePromise;
playSoundToLocate: (identifyTime: number) => MaybePromise;
}
export class BehaviorSmart extends BehaviorRoborock {
declare state: BehaviorRoborockSmartState;
}
export interface BehaviorRoborockSmartState {
device: BehaviorDeviceGeneric<EndpointCommandsSmart>;
}
// get_custom_mode
export enum VacuumSuctionPowerSmart {
Quiet = 101,
Balanced = 102,
Turbo = 103,
Max = 104,
Off = 105,
Custom = 106,
MaxPlus = 108,
Smart = 110,
}
// get_water_box_custom_mode
export enum MopWaterFlowSmart {
Off = 200,
Low = 201,
Medium = 202,
High = 203,
Custom = 204,
CustomizeWithDistanceOff = 207,
Smart = 209,
}
// get_mop_mode
export enum MopRouteSmart {
Standard = 300,
Deep = 301,
Custom = 302,
DeepPlus = 303,
Fast = 304,
Smart = 306,
}
export const RvcCleanMode: Record<number, string> = {
[4]: 'Smart Plan',
...DefaultRvcCleanMode,
};
// { suctionPower: [ 102 ], waterFlow: 200, distance_off: 0, mopRoute: [ 102 ] }
export const CleanSetting: Record<number, CleanModeSetting> = {
[4]: { suctionPower: 0, waterFlow: 0, distance_off: 0, mopRoute: MopRouteSmart.Smart }, // 'Smart Plan'
...DefaultCleanSetting,
};
export function setCommandHandlerSmart(
duid: string,
handler: BehaviorDeviceGeneric<EndpointCommandsSmart>,
logger: AnsiLogger,
roborockService: RoborockService,
cleanModeSettings: CleanModeSettings | undefined,
): void {
handler.setCommandHandler('changeToMode', async (newMode: number) => {
const activity = RvcRunMode[newMode] || RvcCleanMode[newMode];
switch (activity) {
case 'Cleaning': {
logger.notice('BehaviorSmart-ChangeRunMode to: ', activity);
await roborockService.startClean(duid);
break;
}
case 'Go Vacation': {
logger.notice('BehaviorSmart-GoHome');
await roborockService.stopAndGoHome(duid);
break;
}
case 'Smart Plan':
case 'Mop & Vacuum: Custom': {
const setting = CleanSetting[newMode];
logger.notice(`BehaviorSmart-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting)}`);
await roborockService.changeCleanMode(duid, setting);
break;
}
case 'Mop & Vacuum: Default':
case 'Mop: Default':
case 'Vacuum: Default': {
const setting = cleanModeSettings ? (getSettingFromCleanMode(activity, cleanModeSettings) ?? CleanSetting[newMode]) : CleanSetting[newMode];
logger.notice(`BehaviorSmart-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
if (setting) {
await roborockService.changeCleanMode(duid, setting);
}
break;
}
case 'Mop & Vacuum: Quick':
case 'Mop & Vacuum: Max':
case 'Mop & Vacuum: Min':
case 'Mop & Vacuum: Quiet':
case 'Mop: Max':
case 'Mop: Min':
case 'Mop: Quick':
case 'Mop: DeepClean':
case 'Vacuum: Max':
case 'Vacuum: Min':
case 'Vacuum: Quiet':
case 'Vacuum: Quick': {
const setting = CleanSetting[newMode];
logger.notice(`BehaviorSmart-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
if (setting) {
await roborockService.changeCleanMode(duid, setting);
}
break;
}
default:
logger.notice('BehaviorSmart-changeToMode-Unknown: ', newMode);
break;
}
});
handler.setCommandHandler('selectAreas', async (newAreas: number[] | undefined) => {
logger.notice(`BehaviorSmart-selectAreas: ${newAreas}`);
roborockService.setSelectedAreas(duid, newAreas ?? []);
});
handler.setCommandHandler('pause', async () => {
logger.notice('BehaviorSmart-Pause');
await roborockService.pauseClean(duid);
});
handler.setCommandHandler('resume', async () => {
logger.notice('BehaviorSmart-Resume');
await roborockService.resumeClean(duid);
});
handler.setCommandHandler('goHome', async () => {
logger.notice('BehaviorSmart-GoHome');
await roborockService.stopAndGoHome(duid);
});
handler.setCommandHandler('playSoundToLocate', async () => {
logger.notice('BehaviorSmart-playSoundToLocate');
await roborockService.playSoundToLocate(duid);
});
}