"use strict"; var kodi = require('kodi-ws'); var utils = require(__dirname + '/lib/utils'); var adapter = utils.Adapter('kodi'); //var querystring = require('querystring'); var object = {}; var connection = null; var player_id = null; var player_type = null; var channel = false; var canseek = false; var playlist_id = 0; var mem = null; var mem_pos = null; var mem_time = null; var timer; //TODO Изменить виджеты Коди под новый формат adapter.on('unload', function (callback){ try { adapter.log.info('cleaned everything up...'); callback(); } catch (e) { callback(); } }); adapter.on('objectChange', function (id, obj){ // Warning, obj can be null if it was deleted adapter.log.info('objectChange ' + id + ' ' + JSON.stringify(obj)); }); adapter.on('message', function (obj){ if (typeof obj === 'object' && obj.message){ if (obj.command === 'send'){ adapter.log.debug('send command ' + JSON.stringify(obj)); var _obj = obj.message; var param = {'title': '', 'message': '', 'image': 'info', 'displaytime': 5000}; if (typeof _obj.message !== "object"){ param.message = _obj.message; } param.title = _obj.title || ''; param.image = _obj.image || 'info'; param.displaytime = _obj.delay || 5000; sendCommand('GUI.ShowNotification', param); if (obj.callback){ adapter.sendTo(obj.from, obj.command, 'Message received', obj.callback); } } } }); adapter.on('stateChange', function (id, state){ // adapter.log.error('stateChange ' + id + ' ' + JSON.stringify(state)); if (id == adapter.namespace + '.playing_time_total' && state.val !== mem_time){ if (channel){ mem_time = state.val; GetCurrentItem(); } } if (id == adapter.namespace + '.currentplay' && state.val !== mem){ mem = state.val; GetCurrentItem(); setTimeout(function (){ GetPlayList(); }, 1000); } if (id == adapter.namespace + '.position' && state.val !== mem_pos){ mem_pos = state.val; GetCurrentItem(); setTimeout(function (){ GetPlayList(); }, 1000); } if (state && !state.ack){ adapter.log.info('stateChange ' + id + ' ' + JSON.stringify(state)); var param = state.val; var ids = id.split("."); var method = ids[ids.length - 2].toString(); if (isNumeric(method)){ method = null; } ids = ids[ids.length - 1].toString(); ConstructorCmd(method, ids, param); } }); function ConstructorCmd(method, ids, param){ adapter.log.debug('ConstructorCmd ' + method + ' - ' + ids + ' = ' + param); if (method === 'input'){ method = 'Input.' + ids; param = []; } else if (method === 'system'){ method = 'System.' + ids; param = []; } else { switch (ids) { case "SwitchPVR": method = null; SwitchPVR(param, function (res){ if(player_id){ sendCommand('Player.Stop', {'playerid': player_id}, function (){ sendCommand('Player.Open', res); setTimeout(function (){ sendCommand('GUI.SetFullscreen', {"fullscreen": true}); }, 5000); }); } else { sendCommand('Player.Open', res); setTimeout(function (){ sendCommand('GUI.SetFullscreen', {"fullscreen": true}); }, 5000); } }); break; case "ShowNotif": ShowNotification(param, function (res){ method = 'GUI.ShowNotification'; param = res; }); break; case "zoom": if (param >= 0 && param <= 10){ method = 'Player.Zoom'; // param = {"playerid": player_id, "zoom": parseInt(param)}; } break; case "setsubtitle": method = 'Player.SetSubtitle'; //"previous", "next", "off", "on param = {"playerid": player_id, "subtitle": param}; break; case "seek": if (param >= 0 && param <= 100 && canseek){ method = 'Player.Seek'; //int 0-100 param = {"playerid": player_id, "value": parseInt(param)} } break; case "volume": if (param >= 0 && param <= 100){ method = 'Application.SetVolume'; //int 0-100 param = parseInt(param); } break; case "mute": method = 'Application.SetMute'; //bool param = bool(param); break; case "repeat": method = 'Player.SetRepeat'; //off, on, all param = bool(param); if (param){ param = 'all'; } else { param = 'off'; } param = {'playerid': player_id, "repeat": param}; break; case "shuffle": method = 'Player.SetShuffle'; //bool param = {'playerid': player_id, "shuffle": bool(param)}; break; case "play": param = bool(param); if (param){ method = 'Input.ExecuteAction'; param = 'play'; } else { method = 'Player.SetSpeed'; param = {'playerid': player_id, 'speed': 0}; } break; case "playid": method = null; if (player_id !== 'undefined'){ method = 'Player.GoTo'; } else { sendCommand('Input.ExecuteAction', 'play', function (){ //TODO sendCommand('Player.GoTo', {"playerid": player_id, "to": param}, function (){ }); }); } param = {"playerid": player_id, "to": param}; break; case "next": method = 'Input.ExecuteAction'; param = 'skipnext'; break; case "previous": method = 'Input.ExecuteAction'; param = 'skipprevious'; break; case "pause": method = 'Player.PlayPause'; param = {'playerid': player_id, "play": "toggle"}; break; case "stop": method = 'Player.Stop'; param = {'playerid': player_id}; break; case "clear": method = 'Playlist.Clear'; param = {'playlistid': playlist_id}; adapter.setState('playlist', {val: '[]', ack: true}); break; case "add": var type; method = null; param = param.toString(); playlist_id = 0; type = {'playlistid': playlist_id, 'item': {'file': param}}; if (param.slice(-1) === '\\' || param.slice(-1) === '/'){ type = {'playlistid': playlist_id, 'item': {'directory': param}}; } sendCommand('Playlist.Add', type, function (){ sendCommand('Player.Open', {'item': {'playlistid': playlist_id, 'position': 0}}, function (){ sendCommand('GUI.SetFullscreen', {"fullscreen": true}); }); }); break; case "youtube": method = null; if (param){ if (~param.indexOf('http')){ /*param = param.replace('&', '?').replace('#', '?'); param = querystring.parse(param, '?', '=');*/ param = param.toString().split('='); if (param.length > 2){ param = param[param.length - 1]; param = {'item': {'file': 'plugin://plugin.video.youtube/?path=/root/video&action=play_all&playlist=' + param.toString()}}; } else if (param.length === 2){ param = param[1]; param = {'item': {'file': 'plugin://plugin.video.youtube/?path=/root/video&action=play_video&videoid=' + param.toString()}}; } } else { if (param.toString().length > 12){ param = {'item': {'file': 'plugin://plugin.video.youtube/?path=/root/video&action=play_all&playlist=' + param.toString()}}; } else { param = {'item': {'file': 'plugin://plugin.video.youtube/?path=/root/video&action=play_video&videoid=' + param.toString()}}; } } } sendCommand('Player.Open', param, function (){ sendCommand('Input.ExecuteAction', { "action": "select" }, function (){ sendCommand('Player.Open', {'item': {'playlistid': 1, 'position': 0}}, function (){ sendCommand('GUI.SetFullscreen', {"fullscreen": true}); }); }); }); break; case "ActivateWindow": method = 'GUI.ActivateWindow'; param = {"window": param}; break; case "ExecuteAction": method = 'Input.ExecuteAction'; param = { "action": param }; break; case "open": var type2; method = null; param = param.toString(); playlist_id = 0; type2 = {'playlistid': playlist_id, 'item': {'file': param}}; if (param.slice(-1) === '\\'){ type2 = {'playlistid': playlist_id, 'item': {'directory': param}}; } sendCommand('Playlist.Clear', {'playlistid': playlist_id}, function (){ sendCommand('Playlist.Add', type2, function (){ sendCommand('Player.Open', {'item': {'playlistid': playlist_id, 'position': 0}}, function (){ sendCommand('GUI.SetFullscreen', {"fullscreen": true}); }); }); }); break; case "speed": if (~[-32, -16, -8, -4, -2, -1, 0, 1, 2, 4, 8, 16, 32].indexOf(parseInt(param))){ method = 'Player.SetSpeed'; param = {'playerid': player_id, 'speed': parseInt(param)}; } else if (param === 'increment' || param === 'decrement'){ method = 'Player.SetSpeed'; param = {'playerid': player_id, 'speed': param}; } break; case "Directory": method = null; param = param.toString().replace("\\", "\\\\"); GetDirectory(param); break; case "ScanVideoLibrary": method = 'VideoLibrary.Scan'; break; case "ScanAudioLibrary": method = 'AudioLibrary.Scan'; break; case "CleanVideoLibrary": method = 'VideoLibrary.Clean'; break; case "CleanAudioLibrary": method = 'AudioLibrary.Clean'; break; default: } } //adapter.log.error('stateChange ' + method + ' - ' + ids + ' = ' + JSON.stringify(param)); sendCommand(method, param); } function sendCommand(method, param, callback){ if (method){ getConnection(function (err, _connection){ if (_connection){ adapter.log.info('sending in KODI: ' + method + ' - ' + JSON.stringify(param)); _connection.run(method, param).then(function (result){ adapter.log.debug('response from KODI: ' + JSON.stringify(result)); if (callback) callback(); }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }) } }); } else { adapter.log.debug('It does not specify commands or invalid value!'); } } adapter.on('ready', function (){ main(); }); function connect(){ adapter.setState('info.connection', false, true); adapter.log.debug('KODI connecting to: ' + adapter.config.ip + ':' + adapter.config.port); getConnection(function (err, _connection){ if (_connection){ GetNameVersion(); GetPlayerId(); GetVolume(); GetChannels(); GetVideoLibrary(); setTimeout(function (){ GetSources(); }, 10000); connection_emit(); } }); } function connection_emit(){ connection.notification('Player.OnPlay', function(res) { adapter.setState('state', {val: 'play', ack: true}); }); connection.notification('Player.OnPause', function(res) { adapter.setState('state', {val: 'pause', ack: true}); }); connection.notification('Player.OnStop', function(res) { adapter.setState('state', {val: 'stop', ack: true}); }); connection.notification('Input.OnInputRequested', function(res) { //adapter.log.error('OnInputRequested: ' + JSON.stringify(res)); //{"data":{"title":"Строка поиска","type":"keyboard","value":""},"sender":"xbmc"} //adapter.setState('OnInputRequested', {val: true, ack: true}); }); connection.notification('Playlist.OnClear', function(res) { adapter.setState('playlist', {val: '[]', ack: true}); }); } function GetVolume(){ if (connection){ connection.run('Application.GetProperties', {'properties': ['volume', 'muted'] }).then(function (res){ adapter.log.debug('GetVolume: ' + JSON.stringify(res)); adapter.setState('mute', {val: res.muted, ack: true}); adapter.setState('volume', {val: res.volume, ack: true}); connection.notification('Application.OnVolumeChanged', function(res) { adapter.log.debug('OnVolumeChanged: ' + JSON.stringify(res)); adapter.setState('mute', {val: res.data.muted, ack: true}); adapter.setState('volume', {val: res.data.volume, ack: true}); }); }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }) } } function main(){ /***/ //adapter.setState('Directory', false, true); adapter.subscribeStates('*'); connect(); } function GetSources(root){ var obj = { 'video':[], 'music':[], 'pictures':[], 'files':[], 'programs':[] }; var count = 0; if (connection){ Object.keys(obj).forEach(function(key) { connection.run('Files.GetSources', {"media": key}).then(function (res){ //adapter.log.debug('GetSources: ' + JSON.stringify(res)); if (res.limits.total > 0){ for (var i = 0; i < res.limits.total; i++) { obj[key][i] = res.sources[i]; //adapter.log.debug('GetSources: ' + JSON.stringify(obj)); } } count++; if (count === 5){ adapter.log.debug('GetSources: ' + JSON.stringify(obj)); adapter.setState('Sources', {val: JSON.stringify(obj), ack: true}); filemanager(root, obj); } }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }) }); } } function filemanager(root, obj){ var browser = {}; var files = []; for (var key in obj){ if (obj.hasOwnProperty(key)){ if (obj[key].length > 0){ for (var i = 0; i < obj[key].length; i++) { var o = {}; o.file = obj[key][i].file; o.filetype = 'directory'; files.push(o); } } } } browser.files = files; adapter.setState('Directory', {val: JSON.stringify(browser), ack: true}); } function GetDirectory(path){ adapter.log.debug('GetDirectory path: ' + JSON.stringify(path)); if (path !== '/'){ if (connection){ connection.run('Files.GetDirectory', { "directory": path, "media": "files", "properties": ["title", "thumbnail", "fanart", "rating", "genre", "artist", "track", "season", "episode", "year", "duration", "album", "showtitle", "playcount", "file", "mimetype", "size", "lastmodified", "resume"], "sort": {"method": "none", "order": "ascending"} }).then(function (res){ adapter.log.debug('GetDirectory: ' + JSON.stringify(res)); adapter.setState('Directory', {val: JSON.stringify(res), ack: true}); }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }) } } else { GetSources(true); } } function GetVideoLibrary(){ if (connection){ connection.run('VideoLibrary.GetMovies', { "properties": ["genre", "director", "trailer", "tagline", "plot", "plotoutline", "title", "originaltitle", "lastplayed", "runtime", "year", "playcount", "rating", "thumbnail", "file"], "limits": {"start": 0}, "sort": {"method": "dateadded", "ignorearticle": true} }).then(function (res){ adapter.log.debug('GetVideoLibrary: ' + JSON.stringify(res)); adapter.setState('VideoLibrary', {val: JSON.stringify(res), ack: true}); }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }) } } function GetPlayList(){ if (connection){ connection.run('Playlist.GetItems', { "playlistid": playlist_id, "properties": ["title", "thumbnail", "fanart", "rating", "genre", "artist", "track", "season", "episode", "year", "duration", "album", "showtitle", "playcount", "file"]/*,"limits":{"start":0,"end":750}*/ }).then(function (res){ var plst = res.items; adapter.log.debug('GetPlayList: ' + JSON.stringify(plst)); adapter.setState('playlist', {val: JSON.stringify(plst), ack: true}); }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }) } } function GetCurrentItem(){ if (connection){ adapter.getStates('info.*', function (err, obj){ for (var state in obj) { if (state !== adapter.namespace + '.info.connection'){ adapter.setState(state, {val: '', ack: true}); } } connection.run('Player.GetItem', { "playerid": player_id, "properties": ["album", "albumartist", "artist", "director", "episode", "fanart", "file", "genre", "plot", "rating", "season", "showtitle", "studio", "imdbnumber", "tagline", "thumbnail", "title", "track", "writer", "year", "streamdetails", "originaltitle", "cast", "playcount"] }).then(function (res){ adapter.log.debug('GetCurrentItem: ' + JSON.stringify(res)); res = res.item; for (var key in res) { if (typeof res[key] == 'object'){ var obj = res[key]; if (key === 'streamdetails'){ for (var _key in obj) { if (obj[_key].length > 0){ var _obj = obj[_key][0]; for (var __key in _obj) { adapter.setState('info.' + _key + '_' + __key, {val: _obj[__key], ack: true}); //adapter.log.debug('GetPlayList: ' +_key+'_'+__key+' = '+ JSON.stringify(_obj[__key]) +' - '+typeof _obj[__key]); } } else { adapter.setState('info.' + _key, {val: obj[_key], ack: true}); //adapter.log.debug('GetPlayList: ' +_key+' = '+ JSON.stringify(obj[_key]) +' - '+typeof obj[_key] +' length = '+obj[_key].length); } } } else { for (var id in obj) { //TODO adapter.setState('info.' + key, {val: obj[id], ack: true}); //adapter.log.debug('GetPlayList: ' +_key+'_'+__key+' = '+ JSON.stringify(_obj[__key]) +' - '+typeof _obj[__key]); } } } else { adapter.setState('info.' + key, {val: res[key], ack: true}); //adapter.log.debug('GetPlayList: ' +key+' = '+ JSON.stringify(res[0][key]) +' - '+typeof res[0][key]); } //adapter.log.debug('GetPlayList: ' +key+' = '+ JSON.stringify(res[0][key]) +' - '+typeof res[0][key]); } }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }); }); } } function GetNameVersion(){ if (connection){ var batch = connection.batch(); var GetProperties = batch.Application.GetProperties({"properties": ["name", "version"]}); var GetInfoBooleans = batch.XBMC.GetInfoBooleans({"booleans": ["System.Platform.Linux", "System.Platform.Linux.RaspberryPi", "System.Platform.Windows", "System.Platform.OSX", "System.Platform.IOS", "System.Platform.Darwin", "System.Platform.ATV2", "System.Platform.Android"]}); var GetInfoLabels = batch.XBMC.GetInfoLabels({"labels": ["System.KernelVersion", "System.BuildVersion"]}); batch.send(); Promise.all([GetProperties, GetInfoBooleans, GetInfoLabels]).then(function (res){ adapter.log.debug('GetNameVersion: ' + JSON.stringify(res[1])); if (res[2]['System.KernelVersion'] === 'Ждите…' || res[2]['System.KernelVersion'] === 'Wait…' || res[2]['System.KernelVersion'] === 'Warten…'){ setTimeout(function (){ GetNameVersion(); }, 10000); } else { adapter.setState('systeminfo.name', {val: res[0].name, ack: true}); adapter.setState('systeminfo.version', { val: res[0].version.major + '.' + res[0].version.minor, ack: true }); for (var key in res[1]) { if (res[1][key] === true){ var system = key.split("."); system = system[system.length - 1]; adapter.setState('systeminfo.system', {val: system, ack: true}); } } adapter.setState('systeminfo.kernel', {val: res[2]['System.KernelVersion'], ack: true}); } }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }); } } function GetChannels(){ if (connection){ var batch = connection.batch(); var alltv = batch.PVR.GetChannels({ "channelgroupid": "alltv", "properties": ["channel", "channeltype", "hidden", "lastplayed", "locked", "thumbnail", "broadcastnow"] }); var allradio = batch.PVR.GetChannels({ "channelgroupid": "allradio", "properties": ["channel", "channeltype", "hidden", "lastplayed", "locked", "thumbnail", "broadcastnow"] }); batch.send(); Promise.all([alltv, allradio]).then(function (res){ if(res){ adapter.setState('pvr.playlist_tv', {val: JSON.stringify(res[0]), ack: true}); adapter.setState('pvr.playlist_radio', {val: JSON.stringify(res[1]), ack: true}); } }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }); } } function GetPlayerProperties(){ if (connection && player_id !== undefined && player_id !== null){ var batch = connection.batch(); var Properties = batch.Player.GetProperties({ "playerid": player_id, "properties": ["audiostreams", "canseek", "currentaudiostream", "currentsubtitle", "partymode", "playlistid", "position", "repeat", "shuffled", "speed", "subtitleenabled", "subtitles", "time", "totaltime", "type"] }); var InfoLabels = batch.XBMC.GetInfoLabels({"labels": ["MusicPlayer.Codec", "MusicPlayer.SampleRate", "MusicPlayer.BitRate"]}); var CurrentPlay = batch.Player.GetItem({"playerid": player_id}); batch.send(); Promise.all([Properties, InfoLabels, CurrentPlay]).then(function (res){ //TODO сохранять только изменения //pre = res[0]; adapter.log.debug('Response GetPlayerProperties ' + JSON.stringify(res)); var total = (res[0].totaltime.hours * 3600) + (res[0].totaltime.minutes * 60) + res[0].totaltime.seconds; var cur = (res[0].time.hours * 3600) + (res[0].time.minutes * 60) + res[0].time.seconds; playlist_id = res[0].playlistid; adapter.setState('playing_time', { val: time(res[0].time.hours, res[0].time.minutes, res[0].time.seconds), ack: true }); adapter.setState('playing_time_total', { val: time(res[0].totaltime.hours, res[0].totaltime.minutes, res[0].totaltime.seconds), ack: true }); canseek = res[0].canseek; adapter.setState('seek', {val: parseInt(cur * 100 / total), ack: true}); adapter.setState('canseek', {val: res[0].canseek, ack: true}); adapter.setState('repeat', {val: res[0].repeat, ack: true}); adapter.setState('shuffle', {val: res[0].shuffled, ack: true}); adapter.setState('speed', {val: res[0].speed, ack: true}); adapter.setState('position', {val: res[0].position, ack: true}); adapter.setState('playlistid', {val: res[0].playlistid, ack: true}); adapter.setState('partymode', {val: res[0].partymode, ack: true}); if (res[0].audiostreams.length > 0){ adapter.setState('codec', {val: res[0].audiostreams[0].codec, ack: true}); adapter.setState('bitrate', {val: res[0].audiostreams[0].bitrate, ack: true}); adapter.setState('channels', {val: res[0].audiostreams[0].channels, ack: true}); adapter.setState('language', {val: res[0].audiostreams[0].language, ack: true}); adapter.setState('audiostream', {val: res[0].audiostreams[0].name, ack: true}); } else { adapter.setState('channels', {val: 2, ack: true}); adapter.setState('audiostream', {val: '', ack: true}); adapter.setState('language', {val: '', ack: true}); adapter.setState('codec', {val: res[1]['MusicPlayer.Codec'], ack: true}); adapter.setState('samplerate', {val: res[1]['MusicPlayer.SampleRate'], ack: true}); adapter.setState('bitrate', {val: res[1]['MusicPlayer.BitRate'], ack: true}); } if (res[2].item.type == 'channel'){ adapter.setState('type', {val: res[2].item.type, ack: true}); channel = true; } else { adapter.setState('type', {val: res[0].type, ack: true}); channel = false; } if (res[2].item.label.toString().length < 2){ setTimeout(function (){ adapter.getState(adapter.namespace + '.info.file', function (err, state){ state = state.val.substring(state.val.lastIndexOf('/') + 1, state.val.length - 4); adapter.setState('currentplay', {val: state, ack: true}); }); }, 1000); } else { adapter.setState('currentplay', {val: res[2].item.label, ack: true}); } }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }); } } function GetPlayerId(){ clearTimeout(timer); if (connection){ connection.run('Player.GetActivePlayers').then(function (res){ adapter.log.debug('Response GetPlayerId: ' + JSON.stringify(res)); if (res.length > 0){ player_id = res[0].playerid; player_type = res[0].type; GetPlayerProperties(); } else { player_id = null; player_type = null; } timer = setTimeout(function (){ GetPlayerId(); }, 2000); }, function (e){ ErrProcessing(e); }).catch(function (e){ ErrProcessing(e); }) } else { connect(); } } function getConnection(cb){ if (connection){ cb && cb(null, connection); return; } clearTimeout(timer); kodi(adapter.config.ip, adapter.config.port).then(function (_connection){ connection = _connection; _connection.on('error', function (err){ adapter.log.warn('Error: ' + err); }).on('close', function (){ if (connection){ console.log('Connection closed'); if (connection.socket) connection.socket.close(); connection = null; setTimeout(connect, 5000); } }); adapter.log.info('KODI connected'); adapter.setState('info.connection', true, true); GetPlayerId(); cb && cb(null, connection); }, function (error){ adapter.log.debug(error); adapter.setState('info.connection', false, true); setTimeout(connect, 5000, cb); }).catch(function (error){ if (error.stack){ adapter.log.error(error.stack); } else { adapter.log.error(error); } adapter.setState('info.connection', false, true); setTimeout(connect, 5000, cb); }); } function time(hour, min, sec){ var time = ''; hour = (parseInt(hour) < 10 ? '0' : '') + hour; min = (parseInt(min) < 10 ? '0' : '') + min; sec = (parseInt(sec) < 10 ? '0' : '') + sec; if (parseInt(hour) === 0){ time = min + ':' + sec; } else { time = hour + ':' + min + ':' + sec; } return time; } function SwitchPVR(val, callback){ adapter.getState(adapter.namespace + '.pvr.playlist_tv', function (err, state){ if (state){ var Break = {}; val = val.toString().toLowerCase(); var obj = JSON.parse(state.val); try { obj.channels.forEach(function (item, i, a){ var channel = item.label.toString().toLowerCase(); var pos = channel.indexOf(val); if (pos === 0){ //TODO //adapter.log.debug('PVR.GetChannelsIPTV: '+item.channelid); callback({"item": {"channelid": item.channelid}}); throw Break; } }); } catch (e) { if (e !== Break) throw e; } } }); } function ShowNotification(param, callback){ var title = ''; var message = ''; var displaytime = 5000; var img = ['info', 'warning', 'error']; var image = 'info'; var c = (';' + param).split(';'); var flag = false; c.forEach(function (item, i, arr){ if (!isNaN(item)){ var num = parseInt(item); if (num >= 1500 && num <= 30000){ displaytime = num; } else if (num >= 0 && num <= 2){ image = img[num]; } } if (isNaN(arr[i]) && isNaN(arr[i + 1]) && flag === false){ if (arr[i] && arr[i + 1]){ title = arr[i].toString(); message = arr[i + 1].toString(); flag = true; } } }); if (!flag){ c.forEach(function (item, i, arr){ if (isNaN(arr[i]) && arr[i]){ message = arr[i].toString(); } }); } callback({'title': title, 'message': message, 'image': image, 'displaytime': displaytime}); } function bool(s){ //s = s.toString(); if (s === 1 || s === '1' || s === 'true' || s === true){ return true; } else { return false; } } function ErrProcessing(error){ adapter.log.error(error); connection = null; getConnection(); } function isNumeric(n) { return !isNaN(parseFloat(n)) && isFinite(n); }