matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
147 lines • 6.39 kB
JavaScript
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