matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
170 lines • 7.17 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';
supportsMapQueryResponse = false;
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) {
const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.dps_request]: 1 } });
await this.client.send(duid, request);
return undefined;
}
async getSerialNumber(duid) {
return duid;
}
getDeviceStatus(duid) {
const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.dps_request]: 1 } });
return this.client.send(duid, request);
}
// #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.common_request]: { [Q10RequestMethod.multimap]: { 'op': 'list' } } },
});
await this.client.send(duid, request);
return new MapInfo({ max_multi_map: 0, max_bak_map: 0, multi_map_count: 0, map_info: [] });
}
getMapInfoV2(duid) {
return this.client.send(duid, new RequestMessage({
messageId: this.messageId,
dps: { [Q10RequestCode.common_request]: { [Q10RequestMethod.multimap]: { 'op': 'list' } } },
}));
}
async getRoomMap(duid, _activeMap) {
await this.client.send(duid, new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.get_prop]: 1 } }));
return [];
}
getRoomMapV2(duid, _activeMap) {
return this.client.send(duid, new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.get_prop]: 1 } }));
}
switchMap(duid, mapId) {
return this.client.send(duid, new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.multi_map_switch]: mapId } }));
}
// #endregion Core Data Retrieval
// #region Cleaning Commands
goHome(duid) {
const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_charge]: 0 } });
return this.client.send(duid, request);
}
startCleaning(duid) {
const request = new RequestMessage({
messageId: this.messageId,
dps: { [Q10RequestCode.app_start]: { 'cmd': 1 } },
});
return this.client.send(duid, request);
}
startRoomCleaning(duid, roomIds, repeat) {
const request = new RequestMessage({
messageId: this.messageId,
dps: { [Q10RequestCode.app_start]: { 'cmd': 2, 'clean_paramters': roomIds } },
});
return this.client.send(duid, request);
}
pauseCleaning(duid) {
const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_pause]: 0 } });
return this.client.send(duid, request);
}
resumeCleaning(duid) {
const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_resume]: 0 } });
return this.client.send(duid, request);
}
resumeRoomCleaning(duid) {
return this.resumeCleaning(duid);
}
skipRoomCleaning(duid) {
throw new Error(`skipRoomCleaning is not supported on ${this.dispatcherName}`);
}
stopCleaning(duid) {
const request = new RequestMessage({ messageId: this.messageId, dps: { [Q10RequestCode.app_stop]: 0 } });
return this.client.send(duid, request);
}
findMyRobot(duid) {
// TODO: Verify the command for Q10
const request = new RequestMessage({ messageId: this.messageId, method: 'find_me' });
return this.client.send(duid, request);
}
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 });
const result = await this.client.query(duid, request, (msg) => {
if (!msg.body)
return undefined;
const data = msg.body.data;
if (!data)
return undefined;
const values = Object.values(data);
return values.length > 0 ? values[0] : undefined;
});
return result;
}
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
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);
}
setVacuumMode(duid, mode) {
const request = new RequestMessage({
messageId: this.messageId,
dps: {
[Q10RequestMethod.change_vacuum_mode]: B01VacuumModeResolver.resolveQ10VacuumMode(mode),
},
});
return this.client.send(duid, request);
}
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