server/services/melcloud/lib/melcloud.discoverDevices.js
const logger = require('../../../utils/logger');
const { ServiceNotConfiguredError } = require('../../../utils/coreErrors');
const { WEBSOCKET_MESSAGE_TYPES, EVENTS } = require('../../../utils/constants');
const { STATUS } = require('./utils/melcloud.constants');
const { convertDevice } = require('./device/melcloud.convertDevice');
/**
* @description Discover MELCloud cloud devices.
* @returns {Promise} List of discovered devices;.
* @example
* await discoverDevices();
*/
async function discoverDevices() {
logger.debug('Looking for MELCloud devices...');
if (this.status !== STATUS.CONNECTED) {
this.gladys.event.emit(EVENTS.WEBSOCKET.SEND_ALL, {
type: WEBSOCKET_MESSAGE_TYPES.MELCLOUD.STATUS,
payload: { status: this.status },
});
throw new ServiceNotConfiguredError('Unable to discover MELCloud devices until service is not well configured');
}
// Reset already discovered devices
this.discoveredDevices = [];
this.status = STATUS.DISCOVERING_DEVICES;
this.gladys.event.emit(EVENTS.WEBSOCKET.SEND_ALL, {
type: WEBSOCKET_MESSAGE_TYPES.MELCLOUD.STATUS,
payload: { status: this.status },
});
let devices = [];
try {
devices = await this.loadDevices();
logger.info(`${devices.length} MELCloud devices found`);
} catch (e) {
logger.error('Unable to load MELCloud devices', e);
}
this.discoveredDevices = devices
.map((device) => ({
...convertDevice(device),
service_id: this.serviceId,
}))
.filter((device) => {
const existInGladys = this.gladys.stateManager.get('deviceByExternalId', device.external_id);
return existInGladys === null;
});
this.status = STATUS.CONNECTED;
this.gladys.event.emit(EVENTS.WEBSOCKET.SEND_ALL, {
type: WEBSOCKET_MESSAGE_TYPES.MELCLOUD.STATUS,
payload: { status: this.status },
});
return this.discoveredDevices;
}
module.exports = {
discoverDevices,
};