class ChartTemplateService {
static PAGE_SIZE = 50;
measurementService;
alarmService;
eventService;
inventoryService;
fetchClient;
constructor() {
}
async init(url, user, password) {
const client = await c8y.Client.authenticate({ user, password }, url);
this.measurementService = client.measurement;
this.alarmService = client.alarm;
this.eventService = client.event;
this.inventoryService = client.inventory;
this.inventoryBinaryService = client.inventoryBinary;
this.fetchClient = client.core;
}
async getMeasurementsArray(
deviceId, measurementsFilter
) {
let deviceIds = await this.getSubAssets(deviceId);
let measurements = [];
const promises = deviceIds.map(async (deviceId) => {
return (await this.getMeasurements({deviceId, filter: measurementsFilter})).data;
});
const measurementsList = await Promise.all(promises);
measurementsList.forEach(result => {
measurements = measurements.concat(result);
});
return this.flatten(measurements);
}
async getAlarmsArray(deviceId, alarmsFilter) {
let deviceIds = await this.getSubAssets(deviceId);
let alarms = [];
const promises = deviceIds.map(async (deviceId) => {
return (await this.getAlarms({ deviceId, filter: alarmsFilter})).data;
});
const alarmsList = await Promise.all(promises);
alarmsList.forEach(result => {
alarms = alarms.concat(result);
});
return this.flatten(alarms);
}
async getEventsArray(deviceId, eventsFilter) {
let deviceIds = await this.getSubAssets(deviceId);
let events = [];
const promises = deviceIds.map(async (deviceId) => {
return (await this.getEvents({ deviceId, filter: eventsFilter})).data;
});
const eventsList = await Promise.all(promises);
eventsList.forEach(result => {
events = events.concat(result);
});
return this.flatten(events);
}
flatten( obj ) {
function _flatten( parent, parentKey, obj ) {
const keys = Object.keys(obj);
if (keys.length == 0) return parent;
if (parentKey) delete parent[parentKey];
keys.forEach( key => {
const v = obj[key];
const ckey = parentKey + ((parentKey !== '')?'_':'') + key;
if ( v !== null && typeof v === 'object' && !Array.isArray(v)) {
_flatten(parent, ckey, v);
} else {
if (parent !== obj) {
parent[ckey] = v;
}
}
});
}
obj.forEach( obj => _flatten(obj, '', obj) )
return obj;
}
async getAlarms(param) {
const requestFilter = (param.filter)? JSON.parse(JSON.stringify(param.filter)) : {};
if (param.deviceId) {
requestFilter.source = param.deviceId;
}
requestFilter.withTotalPages = true;
return await this.alarmService.list(requestFilter);
}
async getEvents(param) {
const requestFilter = (param.filter)? JSON.parse(JSON.stringify(param.filter)) : {};
if (param.deviceId) {
requestFilter.source = param.deviceId;
}
requestFilter.withTotalPages = true;
return await this.eventService.list(requestFilter);
}
async getMeasurements(param) {
const requestFilter = (param.filter)? JSON.parse(JSON.stringify(param.filter)) : {};
if (param.deviceId) {
requestFilter.source = param.deviceId;
}
return await this.measurementService.list(requestFilter);
}
async getSubAssets(moId) {
const mos = await this.getSubAssetMOs(moId);
return mos.map( mo => mo.id );
}
async getSubAssetMOs(moId) {
const devices = [];
await this.getSubAssetMOsImpl(moId, devices);
return devices;
}
async getSubAssetMOsImpl(moId, devices) {
const res = await this.inventoryService.detail(moId);
if (res.data.childAssets.references.length > 0) {
for (const data of res.data.childAssets.references) {
await this.getSubAssetMOsImpl(data.managedObject.id, devices);
}
} else {
if (devices.map( mo => mo.id).indexOf(res.data.id) > -1) return;
devices.push(res.data);
}
}
}