UNPKG

matterbridge-roborock-vacuum-plugin

Version:
187 lines 8.16 kB
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