matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
91 lines (90 loc) • 3.88 kB
JavaScript
import { PowerSource, RvcOperationalState } from 'matterbridge/matter/clusters';
import { getBatteryStatus, getOperationalErrorState } from './initialData/index.js';
import { NotifyMessageTypes } from './notifyMessageTypes.js';
import { debugStringify } from 'matterbridge/logger';
import { handleLocalMessage } from './runtimes/handleLocalMessage.js';
import { handleCloudMessage } from './runtimes/handleCloudMessage.js';
import { updateFromHomeData } from './runtimes/handleHomeDataMessage.js';
export class PlatformRunner {
platform;
constructor(platform) {
this.platform = platform;
}
async updateRobot(messageSource, homeData) {
if (messageSource === NotifyMessageTypes.HomeData) {
updateFromHomeData(homeData, this.platform);
}
else {
await this.updateFromMQTTMessage(messageSource, homeData);
}
}
async requestHomeData() {
const platform = this.platform;
if (platform.robots.size === 0 || !platform.rrHomeId)
return;
if (platform.roborockService === undefined)
return;
const homeData = await platform.roborockService.getHomeDataForUpdating(platform.rrHomeId);
await this.updateRobot(NotifyMessageTypes.HomeData, homeData);
}
async updateFromMQTTMessage(messageSource, messageData, duid = '', tracked = false) {
const platform = this.platform;
duid = duid || messageData?.duid || '';
const robot = platform.robots.get(duid);
if (robot === undefined) {
platform.log.error(`Error1: Robot with DUID ${duid} not found`);
return;
}
const deviceData = robot.device.data;
if (deviceData === undefined) {
platform.log.error('Device data is undefined');
return;
}
if (!tracked) {
platform.log.debug(`Receive: ${messageSource} updateFromMQTTMessage: ${debugStringify(messageData)}`);
}
if (!robot.serialNumber) {
platform.log.error('Robot serial number is undefined');
return;
}
switch (messageSource) {
case NotifyMessageTypes.ErrorOccurred: {
const message = messageData;
const operationalStateId = getOperationalErrorState(message.errorCode);
if (operationalStateId) {
platform.log.error(`Error occurred: ${message.errorCode}`);
robot.updateAttribute(RvcOperationalState.Cluster.id, 'operationalState', operationalStateId, platform.log);
}
break;
}
case NotifyMessageTypes.BatteryUpdate: {
const message = messageData;
const batteryLevel = message.percentage;
if (batteryLevel) {
robot.updateAttribute(PowerSource.Cluster.id, 'batPercentRemaining', batteryLevel * 2, platform.log);
robot.updateAttribute(PowerSource.Cluster.id, 'batChargeLevel', getBatteryStatus(batteryLevel), platform.log);
}
break;
}
case NotifyMessageTypes.LocalMessage: {
const data = messageData;
const robot = platform.robots.get(duid);
if (robot && data) {
await handleLocalMessage(data, platform, duid);
return;
}
platform.log.error(`Error2: Robot with DUID ${duid} not found`);
break;
}
case NotifyMessageTypes.CloudMessage: {
const data = messageData;
if (!data)
return;
await handleCloudMessage(data, platform, this, duid);
break;
}
default:
break;
}
}
}