iobroker.javascript
Version:
Rules Engine for ioBroker
202 lines (190 loc) • 7.26 kB
JavaScript
'use strict';
let inited = false;
function getObjectEnumsSync(context, idObj, enumIds, enumNames) {
if (!enumIds) enumIds = [];
if (!enumNames) enumNames = [];
if (context.cacheObjectEnums[idObj]) {
for (const enumId of context.cacheObjectEnums[idObj].enumIds) {
if (!enumIds.includes(enumId)) {
enumIds.push(enumId);
}
}
for (const enumName of context.cacheObjectEnums[idObj].enumNames) {
if (!enumNames.includes(enumName)) {
enumNames.push(enumName);
}
}
return {enumIds: enumIds, enumNames: enumNames};
}
for (let i = 0, l = context.enums.length; i < l; i++) {
if (context.objects[context.enums[i]] &&
context.objects[context.enums[i]].common &&
context.objects[context.enums[i]].common.members &&
context.objects[context.enums[i]].common.members.indexOf(idObj) !== -1) {
if (enumIds.indexOf(context.enums[i]) === -1) enumIds.push(context.enums[i]);
if (enumNames.indexOf(context.objects[context.enums[i]].common.name) === -1) enumNames.push(context.objects[context.enums[i]].common.name);
}
}
if (context.objects[idObj]) {
const pos = idObj.lastIndexOf('.');
if (pos !== -1) {
const parent = idObj.substring(0, pos);
if (parent && context.objects[parent]) {
const parentEnumIds = [];
const parentEnumNames = [];
//get parent enums but do not propagate our enums to parent.
getObjectEnumsSync(context, parent, parentEnumIds, parentEnumNames);
for (const enumId of parentEnumIds) {
if (!enumIds.includes(enumId)) {
enumIds.push(enumId);
}
}
for (const enumName of parentEnumNames) {
if (!enumNames.includes(enumName)) {
enumNames.push(enumName);
}
}
}
}
}
context.cacheObjectEnums[idObj] = {enumIds: enumIds, enumNames: enumNames};
return context.cacheObjectEnums[idObj];
}
function doGetter(obj, name, ret) {
//adapter.log.debug('getter: ' + name + ' returns ' + ret);
Object.defineProperty(obj, name, {value: ret});
return ret;
}
function EventObj(id, state, oldState) {
if (!(this instanceof EventObj)) {
return new EventObj(id, state, oldState);
}
this.id = id;
this.newState = {
val: state.val,
ts: state.ts,
ack: state.ack,
lc: state.lc,
from: state.from,
q: state.q,
c: state.c,
user: state.user,
};
//if (oldState === undefined) oldState = {};
if (!oldState) {
this.oldState = {
val: undefined,
ts: undefined,
ack: undefined,
lc: undefined,
from: undefined,
q: undefined,
c: undefined,
user: undefined,
};
} else {
this.oldState = {
val: oldState.val,
ts: oldState.ts,
ack: oldState.ack,
lc: oldState.lc,
from: oldState.from,
q: oldState.q,
c: oldState.c,
user: oldState.user,
};
}
this.state = this.newState;
}
function createEventObject(context, id, state, oldState) {
if (!inited) {
inited = true;
const eventObjectProperties = {
common: {
get: function () {
const ret = context.objects[this.id] ? context.objects[this.id].common : {};
return doGetter(this, 'common', ret);
},
configurable: true,
},
native: {
get: function () {
const ret = context.objects[this.id] ? context.objects[this.id].native : {};
return doGetter(this, 'native', ret);
},
configurable: true,
},
name: {
get: function () {
const ret = this.common ? this.common.name : null;
return doGetter(this, 'name', ret);
},
configurable: true,
},
channelId: {
get: function () {
const ret = this.id.replace (/\.*[^.]+$/, '');
return doGetter(this, 'channelId', context.objects[ret] ? ret : null);
},
configurable: true,
},
channelName: {
get: function () {
const channelId = this.channelId;
const ret = channelId && context.objects[channelId].common ? context.objects[channelId].common.name : null;
return doGetter(this, 'channelName', ret);
},
configurable: true,
},
deviceId: {
get: function () {
let deviceId;
const channelId = this.channelId;
if (!channelId || !(deviceId = channelId.replace (/\.*[^.]+$/, '')) || !context.objects[deviceId]) {
Object.defineProperty(this, 'deviceName', { value: null });
return doGetter(this, 'deviceId', null);
}
return doGetter(this, 'deviceId', deviceId);
},
configurable: true,
},
deviceName: {
get: function () {
const deviceId = this.deviceId;
const ret = deviceId && context.objects[deviceId].common ? context.objects[deviceId].common.name : null;
return doGetter(this, 'deviceName', ret);
},
configurable: true,
},
enumIds: {
get: function () {
if (!context.isEnums) return undefined;
const enumIds = [];
const enumNames = [];
getObjectEnumsSync(context, this.id, enumIds, enumNames);
Object.defineProperty(this, 'enumNames', { value: enumNames });
return doGetter(this, 'enumIds', enumIds);
},
configurable: true,
},
enumNames: {
get: function () {
if (!context.isEnums) return undefined;
const enumIds = [];
const enumNames = [];
getObjectEnumsSync(context, this.id, enumIds, enumNames);
Object.defineProperty(this, 'enumIds', { value: enumIds });
return doGetter(this, 'enumNames', enumNames);
},
configurable: true,
}
};
Object.defineProperties(EventObj.prototype, eventObjectProperties);
inited = true;
}
return new EventObj(id, state, oldState);
}
module.exports = {
createEventObject,
getObjectEnumsSync
};