UNPKG

matterbridge-roborock-vacuum-plugin

Version:
147 lines 6.39 kB
import { CleanModeSetting } from '../../../behaviors/roborock.vacuum/core/CleanModeSetting.js'; import { CleanSequenceType } from '../../../behaviors/roborock.vacuum/enums/CleanSequenceType.js'; import { MapInfo } from '../../../core/application/models/index.js'; import { Q10RequestCode, Q10RequestMethod } from '../../enums/Q10RequestCode.js'; import { B01VacuumModeResolver } from '../../helper/B01VacuumModeResolver.js'; import { RequestMessage } from '../../models/requestMessage.js'; export class Q10MessageDispatcher { logger; client; dispatcherName = 'Q10MessageDispatcher'; lastB01Id; get messageId() { let tmpMessageId = Math.floor(Date.now() / 1000); if (tmpMessageId <= this.lastB01Id) { tmpMessageId = this.lastB01Id + 1; } this.lastB01Id = tmpMessageId; return this.lastB01Id; } constructor(logger, client) { this.logger = logger; this.client = client; this.lastB01Id = Math.floor(Date.now() / 1000); } async getNetworkInfo(duid) { // Q10 does not support getting network info, or maybe I just haven't found the right command yet. return undefined; } async getSerialNumber(duid) { return duid; } async getDeviceStatus(duid) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.rpc_response]: 1 } }); await this.client.get(duid, request); return undefined; } // #region Core Data Retrieval async getHomeMap(duid) { return {}; // TODO: Implement home map retrieval for Q10 } async getMapInfo(duid) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.rpc_request]: { [Q10RequestMethod.multimap]: { 'op': 'list' } } }, }); const response = await this.client.get(duid, request); this.logger.notice(`Get map info response for Q10 device ${duid}: ${response ? JSON.stringify(response) : 'no response'}`); return new MapInfo({ max_multi_map: 0, max_bak_map: 0, multi_map_count: 0, map_info: [] }); } async getRoomMap(duid, activeMap) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.get_prop]: 1 } }); const response = await this.client.get(duid, request); return response?.room_mapping ?? []; // TODO: Implement proper room mapping retrieval for Q10 } // #endregion Core Data Retrieval // #region Cleaning Commands async goHome(duid) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_charge]: 0 } }); await this.client.send(duid, request); } async startCleaning(duid) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_start]: { 'cmd': 1 } }, }); await this.client.send(duid, request); } async startRoomCleaning(duid, roomIds, repeat) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_start]: { 'cmd': 2, 'clean_paramters': roomIds } }, }); await this.client.send(duid, request); } async pauseCleaning(duid) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_pause]: 0 } }); await this.client.send(duid, request); } async resumeCleaning(duid) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_resume]: 0 } }); await this.client.send(duid, request); } async resumeRoomCleaning(duid) { await this.resumeCleaning(duid); } async stopCleaning(duid) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_stop]: 0 } }); await this.client.send(duid, request); } async findMyRobot(duid) { // TODO: Verify the command for Q10 const request = new RequestMessage({ messageId: this.messageId, method: 'find_me' }); await this.client.send(duid, request); } async sendCustomMessage(duid, def) { const request = new RequestMessage({ ...def, messageId: this.messageId }); return this.client.send(duid, request); } async getCustomMessage(duid, def) { const request = new RequestMessage({ ...def, messageId: this.messageId }); return this.client.get(duid, request); } async getCleanModeData(duid) { return new CleanModeSetting(0, 0, 0, 0, CleanSequenceType.Persist); // TODO: Implement retrieval of clean mode data for Q10 } 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}`); await this.setCleanMode(duid, suctionPower, waterFlow); if (suctionPower !== 0) { await this.setVacuumMode(duid, suctionPower); } if (waterFlow !== 0) { await this.setWaterMode(duid, waterFlow); } } // #endregion Cleaning Commands // #region Private Helpers async setCleanMode(duid, suctionPower, waterFlow) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestMethod.change_clean_mode]: B01VacuumModeResolver.resolveQ10CleanMode(suctionPower, waterFlow), }, }); return this.client.send(duid, request); } async setVacuumMode(duid, mode) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestMethod.change_vacuum_mode]: B01VacuumModeResolver.resolveVacuumMode(mode), }, }); return this.client.send(duid, request); } async setWaterMode(duid, mode) { const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestMethod.change_mop_mode]: B01VacuumModeResolver.resolveMopMode(mode), }, }); return this.client.send(duid, request); } } //# sourceMappingURL=Q10MessageDispatcher.js.map