UNPKG

matterbridge-roborock-vacuum-plugin

Version:
91 lines (90 loc) 3.88 kB
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; } } }