matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
86 lines • 4.1 kB
JavaScript
import { debugStringify } from 'matterbridge/logger';
import { CleanSequenceType } from '../behaviors/roborock.vacuum/enums/CleanSequenceType.js';
import { DockErrorCode } from '../roborockCommunication/enums/vacuumAndDockErrorCode.js';
import { getVacuumProperty } from '../share/helper.js';
import { NotifyMessageTypes } from '../types/notifyMessageTypes.js';
/**
* Update robot states from home data polling response.
* Synchronizes battery level, charge state, run mode, and operational state from cloud API.
* @param homeData - Home data from Roborock cloud API containing device states
* @param platform - Platform instance for robot access and logging
*/
export async function updateFromHomeData(homeData, platform) {
if (platform.registry.robotsMap.size === 0)
return;
const devices = homeData.devices.filter((d) => platform.registry.robotsMap.has(d.duid));
for (const device of devices) {
const robot = platform.registry.getRobot(device.duid);
if (robot === undefined) {
platform.log.error(`Robot not found: ${device.duid}`);
continue;
}
const deviceData = robot.device.specs;
if (!device || deviceData === undefined) {
platform.log.error('Device not found in home data');
return;
}
device.schema =
homeData.products.find((prd) => prd.id === device.productId || prd.model === robot.device.specs.model || prd.model === device.specs.model)?.schema ?? [];
platform.log.debug('updateFromHomeData-homeData:', debugStringify(homeData));
platform.log.debug('updateFromHomeData-device:', debugStringify(device));
platform.log.debug('updateFromHomeData-schema:' + debugStringify(device.schema));
platform.log.debug('updateFromHomeData-deviceStatus:' + debugStringify(device.deviceStatus));
const batteryLevel = getVacuumProperty(device, 'battery');
const state = getVacuumProperty(device, 'state');
const errorCode = getVacuumProperty(device, 'error_code');
const suctionPower = getVacuumProperty(device, 'fan_power');
const waterBoxMode = getVacuumProperty(device, 'water_box_mode');
const chargeStatus = getVacuumProperty(device, 'charge_status');
if (errorCode && errorCode !== 0) {
await platform.platformRunner.updateRobotWithPayload({
type: NotifyMessageTypes.ErrorOccurred,
data: {
duid: device.duid,
vacuumErrorCode: errorCode,
dockErrorCode: DockErrorCode.None,
dockStationStatus: undefined,
},
});
}
if (batteryLevel) {
await platform.platformRunner.updateRobotWithPayload({
type: NotifyMessageTypes.BatteryUpdate,
data: {
duid: device.duid,
percentage: batteryLevel,
chargeStatus: chargeStatus,
deviceStatus: state,
},
});
}
if (state && !deviceData.hasRealTimeConnection) {
platform.log.notice(`hasRealTimeConnection is false, updating device status from home data: ${state}`);
await platform.platformRunner.updateRobotWithPayload({
type: NotifyMessageTypes.DeviceStatusSimple,
data: {
duid: device.duid,
status: state,
},
});
}
if (suctionPower && waterBoxMode) {
await platform.platformRunner.updateRobotWithPayload({
type: NotifyMessageTypes.CleanModeUpdate,
data: {
duid: device.duid,
suctionPower: suctionPower,
waterFlow: waterBoxMode,
distance_off: 0,
mopRoute: undefined,
seq_type: CleanSequenceType.Persist,
},
});
}
}
}
//# sourceMappingURL=handleHomeDataMessage.js.map