matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
77 lines (76 loc) • 3.93 kB
JavaScript
import { debugStringify } from 'matterbridge/logger';
import { RoomMap } from './model/RoomMap.js';
export function getVacuumProperty(device, property) {
if (device) {
const schemas = device.schema;
const schema = schemas.find((sch) => sch.code == property);
if (schema && device.deviceStatus && device.deviceStatus[schema.id] != undefined) {
return Number(device.deviceStatus[schema.id]);
}
if (device.deviceStatus && device.deviceStatus[property] != undefined) {
return Number(device.deviceStatus[property]);
}
}
return undefined;
}
export function isSupportedDevice(model) {
return model.startsWith('roborock.vacuum.');
}
export function isStatusUpdate(result) {
return (Array.isArray(result) &&
result.length > 0 &&
typeof result[0] === 'object' &&
result[0] !== null &&
'msg_ver' in result[0] &&
result[0].msg_ver !== undefined &&
result[0].msg_ver !== null);
}
export async function getRoomMap(duid, platform) {
const robot = platform.robots.get(duid);
const enableMultipleMap = (platform.enableExperimentalFeature?.enableExperimentalFeature && platform.enableExperimentalFeature?.advancedFeature.enableMultipleMap) ?? false;
if (robot === undefined) {
platform.log.error(`Error6: Robot with DUID ${duid} not found`);
return undefined;
}
if (platform.roborockService === undefined)
return undefined;
const rooms = robot.device.rooms ?? [];
if (robot.roomInfo === undefined) {
const mapInfo = await platform.roborockService.getMapInformation(robot.device.duid);
if (mapInfo && mapInfo.allRooms && mapInfo.allRooms.length > 0) {
platform.log.info(`getRoomMap - mapInfo: ${debugStringify(mapInfo.allRooms)}`);
robot.roomInfo = new RoomMap(mapInfo.allRooms, rooms, mapInfo.maps, enableMultipleMap);
}
}
if (robot.roomInfo === undefined) {
const roomData = await platform.roborockService.getRoomMappings(robot.device.duid);
if (roomData !== undefined && roomData.length > 0) {
const roomDataMap = roomData.map((r) => ({ id: r[0], iot_name_id: String(r[1]), globalId: r[1], tag: r[2], mapId: 0, displayName: undefined }));
robot.roomInfo = new RoomMap(roomDataMap, rooms, [], enableMultipleMap);
return robot.roomInfo;
}
}
return robot.roomInfo;
}
export async function getRoomMapFromDevice(device, platform) {
const rooms = device?.rooms ?? [];
const enableMultipleMap = (platform.enableExperimentalFeature?.enableExperimentalFeature && platform.enableExperimentalFeature?.advancedFeature.enableMultipleMap) ?? false;
if (device && platform.roborockService) {
const mapInfo = await platform.roborockService.getMapInformation(device.duid);
platform.log.debug(`getRoomMapFromDevice - mapInfo: ${mapInfo ? debugStringify(mapInfo) : 'undefined'}`);
platform.log.debug(`getRoomMapFromDevice - rooms: ${debugStringify(rooms)}`);
if (mapInfo && mapInfo.allRooms && mapInfo.allRooms.length > 0) {
const roomDataMap = mapInfo.allRooms;
const roomMap = new RoomMap(roomDataMap, rooms, mapInfo.maps, enableMultipleMap);
return roomMap;
}
const roomData = await platform.roborockService.getRoomMappings(device.duid);
if (roomData !== undefined && roomData.length > 0) {
platform.log.notice(`getRoomMapFromDevice - roomData: ${debugStringify(roomData ?? [])}`);
const roomDataMap = roomData.map((r) => ({ id: r[0], iot_name_id: String(r[1]), globalId: r[1], tag: r[2], mapId: 0, displayName: undefined }));
const roomMap = new RoomMap(roomDataMap ?? [], rooms, [], enableMultipleMap);
return roomMap;
}
}
return new RoomMap([], rooms, [], enableMultipleMap);
}