UNPKG

iobroker.moma

Version:
751 lines (719 loc) 31.3 kB
/* jshint strict:true */ /* jslint node: true */ /* jslint esversion: 9 */ 'use strict'; // structure of systeminformation data const sysInfo = { 'version': {'type': 'string', 'role': 'text'}, 'time': { 'current': {'type': 'number', 'role': 'date'}, 'uptime': {'type': 'number', 'role': 'value'}, 'timezone': {'type': 'string', 'role': 'text'}, 'timezoneName': {'type': 'string', 'role': 'text'} }, 'system': { 'manufacturer': {'type': 'string', 'role': 'text'}, 'model': {'type': 'string', 'role': 'text'}, 'version': {'type': 'string', 'role': 'text'}, 'serial': {'type': 'string', 'role': 'text'}, 'uuid': {'type': 'string', 'role': 'text'}, 'sku': {'type': 'string', 'role': 'text'} }, 'bios': { 'vendor': {'type': 'string', 'role': 'text'}, 'version': {'type': 'string', 'role': 'text'}, 'releaseDate': {'type': 'string', 'role': 'date'}, 'revision': {'type': 'string', 'role': 'text'} }, 'baseboard': { 'manufacturer': {'type': 'string', 'role': 'text'}, 'model': {'type': 'string', 'role': 'text'}, 'version': {'type': 'string', 'role': 'text'}, 'serial': {'type': 'string', 'role': 'text'}, 'assetTag': {'type': 'string', 'role': 'text'} }, 'chassis': { 'manufacturer': {'type': 'string', 'role': 'text'}, 'model': {'type': 'string', 'role': 'text'}, 'type': {'type': 'string', 'role': 'text'}, 'version': {'type': 'string', 'role': 'text'}, 'serial': {'type': 'string', 'role': 'text'}, 'assetTag': {'type': 'string', 'role': 'text'}, 'sku': {'type': 'string', 'role': 'text'} }, 'cpu': { 'manufacturer': {'type': 'string', 'role': 'text'}, 'brand': {'type': 'string', 'role': 'text'}, 'speed': {'type': 'number', 'role': 'value'}, 'speedmin': {'type': 'number', 'role': 'value.min'}, 'speedmax': {'type': 'number', 'role': 'value.max'}, 'cores': {'type': 'number', 'role': 'value'}, 'physicalCores':{'type': 'number', 'role': 'value'}, 'processors': {'type': 'string', 'role': 'text'}, 'socket': {'type': 'string', 'role': 'text'}, 'vendor': {'type': 'string', 'role': 'text'}, 'family': {'type': 'string', 'role': 'text'}, 'model': {'type': 'string', 'role': 'text'}, 'stepping': {'type': 'string', 'role': 'text'}, 'revision': {'type': 'string', 'role': 'text'}, 'voltage': {'type': 'number', 'role': 'value'}, 'cache': { 'l1d': {'type': 'number', 'role': 'value'}, 'l1i': {'type': 'number', 'role': 'value'}, 'l2': {'type': 'number', 'role': 'value'}, 'l3': {'type': 'number', 'role': 'value'} } }, 'cpuFlags': {'type': 'string', 'role': 'text'}, 'memLayout': [ { 'size': {'type': 'number', 'role': 'value'}, 'bank': {'type': 'number', 'role': 'value'}, 'type': {'type': 'string', 'role': 'text'}, 'clockSpeed': {'type': 'number', 'role': 'value'}, 'formFactor': {'type': 'number', 'role': 'value'}, 'manufacturer': {'type': 'string', 'role': 'text'}, 'partNum': {'type': 'number', 'role': 'value'}, 'serialNum': {'type': 'number', 'role': 'value'}, 'voltageConfigured': {'type': 'number', 'role': 'value'}, 'voltageMin': {'type': 'number', 'role': 'value'}, 'voltageMax': {'type': 'number', 'role': 'value'} } ], 'cpuCurrentSpeed': { 'avg': {'type': 'number', 'role': 'value'}, 'min': {'type': 'number', 'role': 'value'}, 'max': {'type': 'number', 'role': 'value'}, 'cores': [{'type': 'number', 'role': 'value'}] }, 'cpuTemperature': { 'main': {'type': 'number', 'role': 'value'}, 'cores':[{'type': 'number', 'role': 'value'}], 'max': {'type': 'number', 'role': 'value'} }, 'mem': { 'total': {'type': 'number', 'role': 'value'}, 'free': {'type': 'number', 'role': 'value'}, 'used': {'type': 'number', 'role': 'value'}, 'active': {'type': 'number', 'role': 'value'}, 'buffcache': {'type': 'number', 'role': 'value'}, 'buffers': {'type': 'number', 'role': 'value'}, 'slab': {'type': 'number', 'role': 'value'}, 'cached': {'type': 'number', 'role': 'value'}, 'available': {'type': 'number', 'role': 'value'}, 'swaptotal': {'type': 'number', 'role': 'value'}, 'swapused': {'type': 'number', 'role': 'value'}, 'swapfree': {'type': 'number', 'role': 'value'} }, 'battery': { 'hasbattery': {'type': 'boolean', 'role': 'indicator'}, 'cyclecount': {'type': 'number', 'role': 'value'}, 'ischarging': {'type': 'boolean', 'role': 'indicator'}, 'maxcapacity': {'type': 'number', 'role': 'value.max'}, 'currentcapacity': {'type': 'number', 'role': 'value.battery'}, 'percent': {'type': 'number', 'role': 'value.battery'}, 'timeremaining': {'type': 'number', 'role': 'value'}, 'acconnected': {'type': 'boolean', 'role': 'indicator'}, 'type': {'type': 'string', 'role': 'text'}, 'model': {'type': 'string', 'role': 'text'}, 'manufacturer': {'type': 'string', 'role': 'text'}, 'serial': {'type': 'string', 'role': 'text'} }, 'graphics': { 'controllers': [ { 'model': {'type': 'string', 'role': 'text'}, 'vendor': {'type': 'string', 'role': 'text'}, 'bus': {'type': 'string', 'role': 'text'}, 'vram': {'type': 'number', 'role': 'value'}, 'vramDynamic': {'type': 'number', 'role': 'value'} } ], 'displays': [ { 'vendor': {'type': 'string', 'role': 'text'}, 'model': {'type': 'string', 'role': 'text'}, 'main': {'type': 'string', 'role': 'text'}, 'builtin': {'type': 'boolean', 'role': 'indicator'}, 'connection': {'type': 'string', 'role': 'text'}, 'sizex': {'type': 'number', 'role': 'value'}, 'sizey': {'type': 'number', 'role': 'value'}, 'pixeldepth': {'type': 'number', 'role': 'value'}, 'resolutionx': {'type': 'number', 'role': 'value'}, 'resolutiony': {'type': 'number', 'role': 'value'}, 'currentResX': {'type': 'number', 'role': 'value'}, 'currentResY': {'type': 'number', 'role': 'value'}, 'currentRefreshRate': {'type': 'number', 'role': 'value'} } ] }, 'osInfo': { 'platform': {'type': 'string', 'role': 'text'}, 'distro': {'type': 'string', 'role': 'text'}, 'release': {'type': 'string', 'role': 'text'}, 'codename': {'type': 'string', 'role': 'text'}, 'kernel': {'type': 'string', 'role': 'text'}, 'arch': {'type': 'string', 'role': 'text'}, 'hostname': {'type': 'string', 'role': 'text'}, 'codepage': {'type': 'string', 'role': 'text'}, 'logofile': {'type': 'string', 'role': 'text'}, 'serial': {'type': 'string', 'role': 'text'} // 'build': {'type': 'string', 'role': 'text'} }, 'uuid': { 'os': {'type': 'string', 'role': 'text'}, 'hardware': {'type': 'string', 'role': 'text'}, 'macs': [ {'type': 'string', 'role': 'text'} ] }, 'shell': {'type': 'string', 'role': 'text'}, 'versions': { 'kernel': {'type': 'string', 'role': 'text'}, 'openssl': {'type': 'string', 'role': 'text'}, 'systemOpenssl': {'type': 'string', 'role': 'text'}, 'systemOpensslLib': {'type': 'string', 'role': 'text'}, 'node': {'type': 'string', 'role': 'text'}, 'v8': {'type': 'string', 'role': 'text'}, 'npm': {'type': 'string', 'role': 'text'}, 'yarn': {'type': 'string', 'role': 'text'}, 'pm2': {'type': 'string', 'role': 'text'}, 'gulp': {'type': 'string', 'role': 'text'}, 'grunt': {'type': 'string', 'role': 'text'}, 'git': {'type': 'string', 'role': 'text'}, 'tsc': {'type': 'string', 'role': 'text'}, 'mysql': {'type': 'string', 'role': 'text'}, 'redis': {'type': 'string', 'role': 'text'}, 'mongodb': {'type': 'string', 'role': 'text'}, 'apache': {'type': 'string', 'role': 'text'}, 'ngginx': {'type': 'string', 'role': 'text'}, 'php': {'type': 'string', 'role': 'text'}, 'docker': {'type': 'string', 'role': 'text'}, 'postfix': {'type': 'string', 'role': 'text'}, 'postgresql': {'type': 'string', 'role': 'text'}, 'perl': {'type': 'string', 'role': 'text'}, 'python': {'type': 'string', 'role': 'text'}, 'python3': {'type': 'string', 'role': 'text'}, 'java': {'type': 'string', 'role': 'text'}, 'gcc': {'type': 'string', 'role': 'text'} }, 'users': [ { 'user': {'type': 'string', 'role': 'text'}, 'tty': {'type': 'string', 'role': 'text'}, 'date': {'type': 'string', 'role': 'text'}, 'time': {'type': 'string', 'role': 'text'}, 'ip': {'type': 'string', 'role': 'text'}, 'command': {'type': 'string', 'role': 'text'} } ], 'diskLayout': [ { 'device': {'type': 'string', 'role': 'text'}, 'type': {'type': 'string', 'role': 'text'}, 'name': {'type': 'string', 'role': 'text'}, 'vendor': {'type': 'string', 'role': 'text'}, 'size': {'type': 'number', 'role': 'value'}, 'totalCylinders': {'type': 'string', 'role': 'text'}, 'totalHeads': {'type': 'number', 'role': 'value'}, 'totalTracks': {'type': 'number', 'role': 'value'}, 'totalSectors': {'type': 'string', 'role': 'text'}, 'tracksPerCylinder': {'type': 'number', 'role': 'value'}, 'sectorsPerTrack': {'type': 'number', 'role': 'value'}, 'bytesPerSector': {'type': 'number', 'role': 'value'}, 'firmwareRevision': {'type': 'string', 'role': 'text'}, 'serialNum': {'type': 'number', 'role': 'value'}, 'interfaceType': {'type': 'string', 'role': 'text'}, 'smartStatus': {'type': 'number', 'role': 'value'} } ], 'blockDevices': [ { 'name': {'type': 'string', 'role': 'text'}, 'type': {'type': 'string', 'role': 'text'}, 'fstype': {'type': 'string', 'role': 'text'}, 'mount': {'type': 'string', 'role': 'text'}, 'size': {'type': 'number', 'role': 'value'}, 'physical': {'type': 'string', 'role': 'text'}, 'uuid': {'type': 'string', 'role': 'text'}, 'label': {'type': 'string', 'role': 'text'}, 'model': {'type': 'string', 'role': 'text'}, 'serial': {'type': 'string', 'role': 'text'}, 'removable': {'type': 'boolean', 'role': 'indicator'}, 'protocol': {'type': 'string', 'role': 'text'} } ], 'disksIO': { 'rIO': {'type': 'number', 'role': 'value'}, 'wIO': {'type': 'number', 'role': 'value'}, 'tIO': {'type': 'number', 'role': 'value'}, 'rIO_sec': {'type': 'number', 'role': 'value'}, 'wIO_sec': {'type': 'number', 'role': 'value'}, 'tIO_sec': {'type': 'number', 'role': 'value'}, 'ms': {'type': 'number', 'role': 'value'} }, 'fsSize': [ { 'fs': {'type': 'string', 'role': 'text'}, 'type': {'type': 'string', 'role': 'text'}, 'size': {'type': 'number', 'role': 'value'}, 'used': {'type': 'number', 'role': 'value'}, 'available': {'type': 'number', 'role': 'value'}, 'use': {'type': 'number', 'role': 'value'}, 'mount': {'type': 'string', 'role': 'text'} } ], 'fsOpenFiles': { 'max': {'type': 'number', 'role': 'value'}, 'allocated': {'type': 'number', 'role': 'value'}, 'available': {'type': 'number', 'role': 'value'} }, 'fsStats': { 'rx': {'type': 'number', 'role': 'value'}, 'wx': {'type': 'number', 'role': 'value'}, 'tx': {'type': 'number', 'role': 'value'}, 'rx_sec': {'type': 'number', 'role': 'value'}, 'wx_sec': {'type': 'number', 'role': 'value'}, 'tx_sec': {'type': 'number', 'role': 'value'}, 'ms': {'type': 'number', 'role': 'value'} }, 'networkInterfaces': [ { 'iface': {'type': 'string', 'role': 'text'}, 'ifaceName': {'type': 'string', 'role': 'text'}, 'ip4': {'type': 'string', 'role': 'text'}, 'ip6': {'type': 'string', 'role': 'text'}, 'mac': {'type': 'string', 'role': 'text'}, 'internal': {'type': 'boolean', 'role': 'indicator'}, 'operstate': {'type': 'string', 'role': 'text'}, 'type': {'type': 'string', 'role': 'text'}, 'duplex': {'type': 'string', 'role': 'text'}, 'mtu': {'type': 'string', 'role': 'text'}, 'speed': {'type': 'string', 'role': 'text'}, 'carrierChanges': {'type': 'string', 'role': 'text'} } ], 'networkInterfaceDefault': {'type': 'string', 'role': 'text'}, 'networkStats': [ { 'iface': {'type': 'string', 'role': 'text'}, 'operstate': {'type': 'string', 'role': 'text'}, 'rx_bytes': {'type': 'number', 'role': 'value'}, 'rx_errors': {'type': 'number', 'role': 'value'}, 'rx_dropped':{'type': 'number', 'role': 'value'}, 'tx_bytes': {'type': 'number', 'role': 'value'}, 'tx_errors': {'type': 'number', 'role': 'value'}, 'tx_dropped':{'type': 'number', 'role': 'value'}, 'rx_sec': {'type': 'number', 'role': 'value'}, 'tx_sec': {'type': 'number', 'role': 'value'}, 'ms': {'type': 'number', 'role': 'value'} } ], 'networkConnections': {'type': 'string', 'role': 'html'}, // details see @Interval0.js 'inetLatency': {'type': 'number', 'role': 'value'}, // 'inetChecksite': { // 'url': {'type': 'string', 'role': 'text'}, // 'ok': {'type': 'string', 'role': 'text'}, // 'status': {'type': 'string', 'role': 'text'}, // 'ms': {'type': 'number', 'role': 'value'} // }, 'currentLoad': { 'avgLoad': {'type': 'number', 'role': 'value'}, 'currentLoad': {'type': 'number', 'role': 'value'}, 'currentLoadUser': {'type': 'number', 'role': 'value'}, 'currentLoadSystem': {'type': 'number', 'role': 'value'}, 'currentLoadNice': {'type': 'number', 'role': 'value'}, 'currentLoadIdle': {'type': 'number', 'role': 'value'}, 'currentLoadIrq': {'type': 'number', 'role': 'value'}, 'rawCurrentLoad': {'type': 'number', 'role': 'value'}, 'rawCurrentLoadUser': {'type': 'number', 'role': 'value'}, 'rawCurrentLoadSystem': {'type': 'number', 'role': 'value'}, 'rawCurrentLoadNice': {'type': 'number', 'role': 'value'}, 'rawCurrentLoadIdle': {'type': 'number', 'role': 'value'}, 'rawCurrentLoadIrq': {'type': 'number', 'role': 'value'}, 'cpus': [ { 'load': {'type': 'number', 'role': 'value'}, 'loadUser': {'type': 'number', 'role': 'value'}, 'loadSystem': {'type': 'number', 'role': 'value'}, 'loadNice': {'type': 'number', 'role': 'value'}, 'loadIdle': {'type': 'number', 'role': 'value'}, 'loadIrq': {'type': 'number', 'role': 'value'}, 'rawLoad': {'type': 'number', 'role': 'value'}, 'rawLoadUser': {'type': 'number', 'role': 'value'}, 'rawLoadSystem': {'type': 'number', 'role': 'value'}, 'rawLoadNice': {'type': 'number', 'role': 'value'}, 'rawLoadIdle': {'type': 'number', 'role': 'value'}, 'rawLoadIrq': {'type': 'number', 'role': 'value'} } ] }, 'fullLoad': {'type': 'number', 'role': 'value'}, 'processes': { 'all': {'type': 'number', 'role': 'value'}, 'running': {'type': 'number', 'role': 'value'}, 'blocked': {'type': 'number', 'role': 'value'}, 'sleeping': {'type': 'number', 'role': 'value'}, 'unknown': {'type': 'number', 'role': 'value'}, 'list': {'type': 'string', 'role': 'html'} // details see @Interval0.js }, 'dockerInfo': { 'id': {'type': 'string', 'role': 'text'}, 'containers': {'type': 'number', 'role': 'value'}, 'containersRunning': {'type': 'number', 'role': 'value'}, 'containersPaused': {'type': 'number', 'role': 'value'}, 'containersStopped': {'type': 'number', 'role': 'value'}, 'images': {'type': 'number', 'role': 'value'}, 'driver': {'type': 'string', 'role': 'text'}, 'memoryLimit': {'type': 'boolean', 'role': 'indicator'}, 'swapLimit': {'type': 'boolean', 'role': 'indicator'}, 'kernelMemory': {'type': 'boolean', 'role': 'indicator'}, 'cpuCfsPeriod': {'type': 'boolean', 'role': 'indicator'}, 'cpuCfsQuota': {'type': 'boolean', 'role': 'indicator'}, 'cpuShares': {'type': 'boolean', 'role': 'indicator'}, 'cpuSet': {'type': 'boolean', 'role': 'indicator'}, 'ipv4Forwarding': {'type': 'boolean', 'role': 'indicator'}, 'bridgeNfIptables': {'type': 'boolean', 'role': 'indicator'}, 'bridgeNfIp6tables': {'type': 'boolean', 'role': 'indicator'}, 'debug': {'type': 'boolean', 'role': 'indicator'}, 'nfd': {'type': 'number', 'role': 'value'}, 'oomKillDisable': {'type': 'boolean', 'role': 'indicator'}, 'ngoroutines': {'type': 'number', 'role': 'value'}, 'systemTime': {'type': 'number', 'role': 'date'}, 'loggingDriver': {'type': 'string', 'role': 'text'}, 'cgroupDriver': {'type': 'string', 'role': 'text'}, 'nEventsListener': {'type': 'number', 'role': 'value'}, 'kernelVersion': {'type': 'string', 'role': 'text'}, 'operatingSystem': {'type': 'string', 'role': 'text'}, 'osType': {'type': 'string', 'role': 'text'}, 'architecture': {'type': 'string', 'role': 'text'}, 'ncpu': {'type': 'number', 'role': 'value'}, 'memTotal': {'type': 'number', 'role': 'value'}, 'dockerRootDir': {'type': 'string', 'role': 'text'}, 'httpProxy': {'type': 'string', 'role': 'text'}, 'httpsProxy': {'type': 'string', 'role': 'text'}, 'noProxy': {'type': 'string', 'role': 'text'}, 'name': {'type': 'string', 'role': 'text'}, 'labels': {'type': 'string', 'role': 'text'}, // is an array!! 'experimentalBuild': {'type': 'boolean', 'role': 'indicator'}, 'serverVersion': {'type': 'string', 'role': 'text'}, 'clusterStore': {'type': 'string', 'role': 'text'}, 'clusterAdvertise': {'type': 'string', 'role': 'text'}, 'defaultRuntime': {'type': 'string', 'role': 'text'}, 'liveRestoreEnabled': {'type': 'boolean', 'role': 'indicator'}, 'isolation': {'type': 'string', 'role': 'text'}, 'initBinary': {'type': 'string', 'role': 'text'}, 'productLicense': {'type': 'string', 'role': 'text'} }, 'dockerContainers': {'type': 'string', 'role': 'html'} // details see @Interval3.js }; async function releasePreparation(adapter) { adapter.log.debug('release preparation'); // cleanup the renamed fields from systeminfo 5.6.7 const states = await adapter.getStatesOfAsync('currentLoad'); states.forEach(state => { //adapter.log.debug(JSON.stringify(state)); const name = new String(state.common.name); if(name.indexOf('_') > 0) { adapter.log.info('deleting: ' + name); adapter.delObject(state._id); } else if(name == 'currentload') { adapter.log.info('deleting: ' + name); adapter.delObject(state._id); } else if(name == 'avgload') { adapter.log.info('deleting: ' + name); adapter.delObject(state._id); } }); } // internal helper functions function isStateEntry(entry) { // eslint-disable-next-line no-prototype-builtins if(entry != undefined && entry.hasOwnProperty('type') && entry.hasOwnProperty('role')) { return true; } return false; } function isArrayEntry(entry) { if(entry != undefined && entry.length != undefined) { return true; } return false; } async function createDeviceEntry(adapter, parent, name) { let id = name; if(parent != null && parent !== '') { id = parent+'.'+name; } //adapter.log.debug('device name :' + (isNaN(name) ? name : 'i'+name)); await adapter.extendObjectAsync(id, { type: 'device', common: { name: isNaN(name) ? name : 'i'+name }, native: {} }); } async function createChannelEntry(adapter, parent, name) { //adapter.log.debug('channel name :' + (isNaN(name) ? name : 'i'+name)); await adapter.extendObjectAsync(parent+'.'+name, { type: 'channel', common: { name: isNaN(name) ? name : 'i'+name }, native: {} }); } async function createStateEntry(adapter, parent, newName, newType, newRole) { let id; if(parent != null && parent !== '') id = parent+'.'+newName; else id = newName; //adapter.log.debug('state name :' + (isNaN(newName) ? newName : 'i'+newName)); await adapter.extendObjectAsync(id, { type: 'state', common: { name: isNaN(newName) ? newName : 'i'+newName, type: newType, role: newRole }, native: {} }); } async function createEntry(adapter, entry, parent, id) { const newId = parent+'.'+id; if(isStateEntry(entry)) { await createStateEntry(adapter, parent, id, entry.type, entry.role); } else if(isArrayEntry(entry)) { await createChannelEntry(adapter, parent, id); } else { await createChannelEntry(adapter, parent, id); for (const key in entry) { // eslint-disable-next-line no-prototype-builtins if (entry.hasOwnProperty(key)) { const newEntry = entry[key]; try { await createEntry(adapter, newEntry, newId, key); } catch(err) { adapter.log.error('createEntry():'+id, err); } } } } } async function removeEntry(adapter, id2delete) { try { let deviceFound = false; // delete device bottom up const devices = await adapter.getDevicesAsync(); for (const j in devices) { const id = devices[j]._id.split('.').pop(); if (id && id == id2delete) { deviceFound = true; const promiseDevicesChildrenDeleted = []; // delete channels below device const channels = await adapter.getChannelsOfAsync(id2delete); if(channels) { for (const i in channels) { const channelid = channels[i]._id.split('.').pop(); // delete states below channel const states2 = await adapter.getStatesOfAsync(id2delete, channelid); if(states2) { const promiseChannelsChildrenDeleted = []; for (const j in states2) { const stateid = states2[j]._id.split('.').pop(); const id = id2delete + '.' + channelid + '.' + stateid; try { promiseChannelsChildrenDeleted.push(adapter.delObjectAsync(id)); } catch (err1) { adapter.log.error('error deleting state ' + id + ' from channel ' + channelid + ': ' + err1); } } // wait for deletion of state children await Promise.all(promiseChannelsChildrenDeleted); } // delete channel try { promiseDevicesChildrenDeleted.push(adapter.deleteChannelAsync(id2delete, channelid)); } catch (err2) { adapter.log.error('error deleting channel ' + channelid + ' from device ' + id2delete + ': ' + err2); } } } // delete states below device const states = await adapter.getStatesOfAsync(id2delete, id2delete); if(states) { for (const j in states) { const id = id2delete + '.' + states[j]._id.split('.').pop(); try { promiseDevicesChildrenDeleted.push(await adapter.delObjectAsync(id)); } catch (err3) { adapter.log.error('error deleting state ' + id + ' from device ' + id2delete + ': ' + err3); } } } // wait for deletion of state and channel children await Promise.all(promiseDevicesChildrenDeleted); // delete device await adapter.deleteDeviceAsync(id2delete); } } // maybe it is a state directly connected to the moma.<instance> like 'cpuflags' if (!deviceFound) { try { // delete state const states = await adapter.getStatesOfAsync(adapter.namespace); for (const j in states) { const id = states[j]._id; if (id && id == adapter.namespace + '.' +id2delete) { await adapter.delObjectAsync(id); } } } catch(err4) { adapter.log.error('error deleting state ' + id2delete + ': ' + err4); } } } catch (err5) { adapter.log.error('error deleting objects from ' + id2delete + ': ' + err5); } } /** * Creates all entries needed for the current configuration. * Device-Entries that have been deselected will be deleted. */ async function createMomaInstanceEntries(adapter) { adapter.log.debug('creating moma instance entries'); for (const key0 in sysInfo) { // eslint-disable-next-line no-prototype-builtins if (sysInfo.hasOwnProperty(key0)) { const level0 = sysInfo[key0]; // check configuration if(adapter.config[key0] || key0 == 'version') { // check for state entry if(isStateEntry(level0)) { // adapter.log.debug('state: ' + key0 + ' : ' + JSON.stringify(level0)); await createStateEntry(adapter, '', key0, level0.type, level0.role); // check for array entry } else if(isArrayEntry(level0)) { // adapter.log.debug('array: ' + key0 + ' : ' + JSON.stringify(level0)); await createDeviceEntry(adapter, null, key0); // create on the fly, when data is read first time // not a state and not an object entry } else { // adapter.log.debug('object: ' + key0 + ' : ' + JSON.stringify(level0)); const parent0 = key0; await createDeviceEntry(adapter, null, parent0); // adapter.log.debug(JSON.stringify(parent0)); for (const key1 in level0) { // adapter.log.debug(key1); // eslint-disable-next-line no-prototype-builtins if (level0.hasOwnProperty(key1)) { await createEntry(adapter, level0[key1], parent0, key1); } } } } else { // remove entry removeEntry(adapter, key0); } } } } async function createMetaState(adapter, id, varRole, varType) { const state = { _id: id, type: 'state', common: { name: id.split('.').pop(), role: varRole, type: varType, read: true, write: false }, native: {} }; await adapter.extendForeignObjectAsync(state._id, state); } /** * Creates all meta entries. */ async function createMomaMetaEntries(adapter) { adapter.log.debug('creating moma meta entries'); // needed definitions const defs = require(__dirname + '/definitions'); await createMetaState(adapter, defs.hostNeedsAttention, 'indicator', 'boolean'); await adapter.setForeignStateChangedAsync(defs.hostNeedsAttention, {val: false, ack: true}); await createMetaState(adapter, defs.hostNeedsAttentionList, 'text', 'string'); await createMetaState(adapter, defs.hostNeedsUpdate, 'indicator', 'boolean'); await adapter.setForeignStateChangedAsync(defs.hostNeedsUpdate, {val: false, ack: true}); await createMetaState(adapter, defs.hostNeedsUpdateList, 'text', 'string'); await createMetaState(adapter, defs.hostNeedsReboot, 'indicator', 'boolean'); await adapter.setForeignStateChangedAsync(defs.hostNeedsReboot, {val: false, ack: true}); await createMetaState(adapter, defs.hostNeedsRebootList, 'text', 'string'); await createMetaState(adapter, defs.deviceNeedsBatteryChange, 'indicator', 'boolean'); await adapter.setForeignStateChangedAsync(defs.deviceNeedsBatteryChange, {val: false, ack: true}); await createMetaState(adapter, defs.deviceNeedsBatteryChangeList, 'text', 'string'); // create entry into list of hosts const channel = { _id: defs.hostListEntry, type: 'channel', common: { name: 'hostname' }, native: {} }; await adapter.extendForeignObjectAsync(channel._id, channel); await createMetaState(adapter, defs.hostEntryInstance, 'text', 'string'); await createMetaState(adapter, defs.hostEntryAlive, 'indicator', 'boolean'); await adapter.setForeignStateChangedAsync(defs.hostEntryAlive, {val: false, ack: true, expire: 10000}); await createMetaState(adapter, defs.hostEntryNeedsAttention, 'indicator', 'boolean'); await adapter.setForeignStateChangedAsync(defs.hostEntryNeedsAttention, {val: false, ack: true}); await createMetaState(adapter, defs.hostEntryHasUpdates, 'value', 'number'); await adapter.setForeignStateChangedAsync(defs.hostEntryHasUpdates, {val: 0, ack: true}); await createMetaState(adapter, defs.hostEntryListOfUpdates, 'text', 'string'); await adapter.setForeignStateChangedAsync(defs.hostEntryListOfUpdates, {val: '', ack: true}); await createMetaState(adapter, defs.hostEntryLastUpdate, 'date', 'number'); await createMetaState(adapter, defs.hostEntryNeedsReboot, 'indicator', 'boolean'); await adapter.setForeignStateChangedAsync(defs.hostEntryNeedsReboot, {val: false, ack: true}); await createMetaState(adapter, defs.hostEntryListOfAdapterUpdates, 'text', 'string'); await adapter.setForeignStateChangedAsync(defs.hostEntryListOfAdapterUpdates, {val: '', ack: true}); await createMetaState(adapter, defs.hostEntryControllerUpdate, 'text', 'string'); await adapter.setForeignStateChangedAsync(defs.hostEntryControllerUpdate, {val: '', ack: true}); // set the instance in moma.meta.<hostname>.instance await adapter.setForeignStateChangedAsync(defs.hostEntryInstance, {val: adapter.namespace, ack: true}); await adapter.setForeignStateChangedAsync(defs.hostEntryNeedsAttention, {val: false, ack: true}); } module.exports.init = async (adapter) => { // cleanup old stuff await releasePreparation(adapter); // create Entries moma.meta.<hostname>.* await createMomaMetaEntries(adapter); // create Entries moma.<instanceId>.* await createMomaInstanceEntries(adapter); adapter.log.debug('init done'); }; /** * Creates all entries for an array below a parent device or channel */ module.exports.createArrayEntry = async (adapter, parent, id) => { try { const comp = parent.split('.'); if(comp.length == 1) await createEntry(adapter, sysInfo[comp[0]][0], parent, id); else if(comp.length == 2) await createEntry(adapter, sysInfo[comp[0]][comp[1]][0], parent, id); else if(comp.length == 3) await createEntry(adapter, sysInfo[comp[0]][comp[1]][comp[2]][0], parent, id); else { adapter.log.error('length in createArrayEntry() parent: ' + parent + ' id: ' + id); return; } } catch(err) { adapter.log.error('createArrayEntry() parent: ' + parent + ' id: ' + id); } }; // end of helper functions