matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
187 lines • 8.16 kB
JavaScript
import { CleanModeSetting } from '../../../behaviors/roborock.vacuum/core/CleanModeSetting.js';
import { MopRoute, MopWaterFlow } from '../../../behaviors/roborock.vacuum/enums/index.js';
import { MapInfo } from '../../../core/application/models/index.js';
import { Protocol, RequestMessage } from '../../models/index.js';
function parseV1Result(msg, messageId) {
if (!msg.body)
return undefined;
let dps = msg.get(Protocol.rpc_response);
if (!dps)
dps = msg.get(Protocol.general_response);
if (!dps)
dps = msg.get(Protocol.general_request);
if (!dps || dps.id !== messageId)
return undefined;
const result = dps.result;
if (result === undefined || result === null)
return undefined;
return Array.isArray(result) ? result[0] : result;
}
export class V10MessageDispatcher {
logger;
client;
dispatcherName = 'V10MessageDispatcher';
supportsMapQueryResponse = true;
constructor(logger, client) {
this.logger = logger;
this.client = client;
}
async getNetworkInfo(duid) {
const request = new RequestMessage({ method: 'get_network_info' });
return await this.client.query(duid, request, (msg) => parseV1Result(msg, request.messageId));
}
async getSerialNumber(duid) {
const request = new RequestMessage({ method: 'get_serial_number' });
const response = await this.client.query(duid, request, (msg) => {
if (!msg.body)
return undefined;
let dps = msg.get(Protocol.rpc_response);
if (!dps)
dps = msg.get(Protocol.general_response);
if (!dps || dps.id !== request.messageId)
return undefined;
return dps.result;
});
return response && response.length > 0 ? response[0].serial_number : duid;
}
getDeviceStatus(duid) {
const request = new RequestMessage({ method: 'get_prop', params: ['get_status'] });
return this.client.send(duid, request);
}
async getHomeMap(duid) {
const request = new RequestMessage({ method: 'get_map_v1', secure: true });
const response = await this.client.query(duid, request, (msg) => parseV1Result(msg, request.messageId));
return response ?? {};
}
async getMapInfo(duid) {
const request = new RequestMessage({ method: 'get_multi_maps_list' });
const response = await this.client.query(duid, request, (msg) => parseV1Result(msg, request.messageId));
return new MapInfo(response ?? { max_multi_map: 0, max_bak_map: 0, multi_map_count: 0, map_info: [] });
}
getMapInfoV2(duid) {
return this.client.send(duid, new RequestMessage({ method: 'get_multi_maps_list' }));
}
async getRoomMap(duid, _activeMap) {
const request = new RequestMessage({ method: 'get_room_mapping' });
const response = await this.client.query(duid, request, (msg) => {
if (!msg.body)
return undefined;
let dps = msg.get(Protocol.rpc_response);
if (!dps)
dps = msg.get(Protocol.general_response);
if (!dps || dps.id !== request.messageId)
return undefined;
return dps.result;
});
return response ?? [];
}
getRoomMapV2(duid, _activeMap) {
return this.client.send(duid, new RequestMessage({ method: 'get_room_mapping' }));
}
switchMap(duid, mapId) {
return this.client.send(duid, new RequestMessage({ method: 'load_multi_map', params: [mapId] }));
}
goHome(duid) {
const request = new RequestMessage({ method: 'app_charge' });
return this.client.send(duid, request);
}
startCleaning(duid) {
const request = new RequestMessage({ method: 'app_start' });
return this.client.send(duid, request);
}
startRoomCleaning(duid, roomIds, repeat) {
const request = new RequestMessage({
method: 'app_segment_clean',
params: [{ segments: roomIds, repeat: repeat }],
});
return this.client.send(duid, request);
}
pauseCleaning(duid) {
const request = new RequestMessage({ method: 'app_pause' });
return this.client.send(duid, request);
}
resumeCleaning(duid) {
const request = new RequestMessage({ method: 'app_resume' });
return this.client.send(duid, request);
}
resumeRoomCleaning(duid) {
const request = new RequestMessage({ method: 'resume_segment_clean' });
return this.client.send(duid, request);
}
skipRoomCleaning(duid) {
const request = new RequestMessage({ method: 'stop_segment_clean' });
return this.client.send(duid, request);
}
stopCleaning(duid) {
const request = new RequestMessage({ method: 'app_stop' });
return this.client.send(duid, request);
}
findMyRobot(duid) {
const request = new RequestMessage({ method: 'find_me' });
return this.client.send(duid, request);
}
sendCustomMessage(duid, def) {
const request = new RequestMessage(def);
return this.client.send(duid, request);
}
async getCustomMessage(duid, def) {
const result = await this.client.query(duid, def, (msg) => parseV1Result(msg, def.messageId));
return result;
}
async getCleanModeData(duid) {
const currentMopMode = await this.getCustomMessage(duid, new RequestMessage({ method: 'get_mop_mode' }));
const suctionPowerRaw = await this.getCustomMessage(duid, new RequestMessage({ method: 'get_custom_mode' }));
const waterFlowRaw = await this.getCustomMessage(duid, new RequestMessage({ method: 'get_water_box_custom_mode' }));
let suctionPower;
let waterFlow;
let mopRoute;
let distance_off = 0;
if (Array.isArray(suctionPowerRaw)) {
suctionPower = suctionPowerRaw[0];
}
else {
suctionPower = suctionPowerRaw;
}
if (Array.isArray(currentMopMode)) {
mopRoute = currentMopMode[0];
}
else {
mopRoute = currentMopMode;
}
if (typeof waterFlowRaw === 'object' && waterFlowRaw !== null && 'water_box_mode' in waterFlowRaw) {
waterFlow = waterFlowRaw.water_box_mode;
if ('distance_off' in waterFlowRaw) {
distance_off = waterFlowRaw.distance_off ?? 0;
}
}
else {
waterFlow = waterFlowRaw;
}
return new CleanModeSetting(suctionPower, waterFlow, distance_off, mopRoute, undefined);
}
async changeCleanMode(duid, setting) {
const { suctionPower, waterFlow, distance_off, mopRoute } = setting;
this.logger.notice(`Change clean mode for ${duid} to suctionPower: ${suctionPower}, waterFlow: ${waterFlow}, mopRoute: ${mopRoute}, distance_off: ${distance_off}`);
const smartMopRoute = MopRoute.Smart;
const customMopRoute = MopRoute.Custom;
if (mopRoute && mopRoute !== smartMopRoute) {
await this.client.send(duid, new RequestMessage({ method: 'set_mop_mode', params: [customMopRoute] }));
}
if (suctionPower && suctionPower != 0) {
await this.client.send(duid, new RequestMessage({ method: 'set_custom_mode', params: [suctionPower] }));
}
if (waterFlow && waterFlow == MopWaterFlow.CustomizeWithDistanceOff && distance_off && distance_off != 0) {
await this.client.send(duid, new RequestMessage({
method: 'set_water_box_custom_mode',
params: { 'water_box_mode': waterFlow, 'distance_off': distance_off },
}));
}
else if (waterFlow && waterFlow != 0) {
await this.client.send(duid, new RequestMessage({ method: 'set_water_box_custom_mode', params: [waterFlow] }));
}
if (mopRoute && mopRoute != 0) {
await this.client.send(duid, new RequestMessage({ method: 'set_mop_mode', params: [mopRoute] }));
}
}
}
//# sourceMappingURL=V10MessageDispatcher.js.map