UNPKG

iobroker.starline

Version:

Control your car from iobroker with Starline Telematics

546 lines (526 loc) 32.7 kB
"use strict"; const utils = require('@iobroker/adapter-core'); let https = require('https'); let querystring = require('querystring'); let adapter, sesId, userAgentId, header, data = '', flag_subscribe = false, reload_data, reAuth_TimeOut, timePool = 10000; let control_action = { 'valet': {val: false, name: "Режим валет", role: "command", type: "boolean", read: false, write: true}, 'hijack': {val: false, name: "Режим антиаграбление", role: "command", type: "boolean", read: false, write: true}, 'update_position': {val: false, name: "Обновить местоположение авто", role: "command", type: "boolean", read: false, write: true}, 'shock_bpass': {val: false, name: "Отключение датчика удара", role: "command", type: "boolean", read: false, write: true}, 'tilt_bpass': {val: false, name: "Отключение датчика наклона", role: "command", type: "boolean", read: false, write: true}, 'webasto': {val: false, name: "Управление webasto", role: "command", type: "boolean", read: false, write: true}, 'ign': {val: false, name: "Автозапуск", role: "command", type: "boolean", read: false, write: true}, 'arm': {val: false, name: "Установливаемый статус охраны устройства", role: "command", type: "boolean", read: false, write: true}, 'poke': {val: false, name: "Сигнал", role: "command", type: "boolean", read: false, write: true}, 'add_sens_bpass': {val: false, name: "Выключение доп. датчика", role: "command", type: "boolean", read: false, write: true}, 'out': {val: false, name: "Управление доп. каналом", role: "command", type: "boolean", read: false, write: true}, 'checkballance': {val: false, name: "Запросить балланс", role: "button", type: "boolean", read: false, write: true}, 'checktemp': {val: false, name: "Запрос температуры", role: "button", type: "boolean", read: false, write: true}, }; let states = { 'alias': {val: '', name: 'Имя устройства заданное пользователем при его добавлении или после эксплуатации', role: "state", type: "string", read: true, write: false}, 'skey': {val: false, name: false, role: "state", type: "string", read: true, write: false}, 'balance': {val: '', name: 'Баланс SIM-карты', role: "state", type: "number", read: true, write: false}, 'battery': {val: '', name: 'Напряжение АКБ охранно-телематического комплекса ( вольты ) или заряд батареи маяка ( в процентах )', role: "state", type: "number", read: true, write: false}, 'device_id': {val: '', name: 'Идентификатор устройства в SLNet', role: "state", type: "string", read: true, write: false}, 'fw_version': {val: '', name: 'Версия ПО устройства', role: "state", type: "string", read: true, write: false}, 'imei': {val: '', name: 'IMEI GSM-модуля устройства', role: "state", type: "string", read: true, write: false}, 'mayak_temp': {val: '', name: 'Температура маяка', role: "state", type: "number", read: true, write: false}, 'mon_type': {val: '', name: 'Тип режима мониторинга', role: "state", type: "number", read: true, write: false}, 'type': {val: '', name: 'Тип устройства', role: "state", type: "number", read: true, write: false}, '_controls': {val: false, name: false, role: "state", type: "string", read: true, write: false}, 'reg': {val: '', name: 'Уникальный идентификатор устройства', role: "state", type: "string", read: true, write: false}, 'rpl_channel': {val: '', name: 'Идентификатор канала Realplexor', role: "state", type: "string", read: true, write: false}, 'sn': {val: '', name: 'Серийный номер устройства', role: "state", type: "string", read: true, write: false}, 'ts_activity': {val: '', name: 'Время последней активности устройства, число секунд прошедших с 01.01.1970 по UTC', role: "state", type: "number", read: true, write: false}, 'shortParking': {val: '', name: 'Длительность короткой стоянки, мин', role: "state", type: "number", read: true, write: false}, 'longParking': {val: '', name: 'Длительность долгой стоянки, мин', role: "state", type: "number", read: true, write: false}, 'shared_for_me': {val: false, name: false, role: "state", type: "string", read: true, write: false}, 'showInsuranceEvents': {val: false, name: false, role: "state", type: "string", read: true, write: false}, 'ctemp': {val: '', name: 'Температура салона', role: "state", type: "number", read: true, write: false}, 'etemp': {val: '', name: 'Температура двигателя', role: "state", type: "number", read: true, write: false}, 'gps_lvl': {val: '', name: 'Уровень приёма GPS сигнала, соответвует числу спутников GPS', role: "state", type: "number", read: true, write: false}, 'gsm_lvl': {val: '', name: 'Уровень приёма GSM сигнала, соответвует числу спутников GSM', role: "state", type: "number", read: true, write: false}, 'phone': {val: '', name: 'Телефонный номер SIM-карты устройства', role: "state", type: "string", read: true, write: false}, 'status': {val: '', name: 'Статус соединения с сервером ( 1 - Online, 2 - Offline )', role: "state", type: "number", read: true, write: false}, 'car_state.add_sens_bpass': {val: false, name: 'Состояние дополнительного датчика', role: "state", type: "boolean", read: true, write: false}, 'car_state.alarm': {val: false, name: 'Статус тревоги охранно-телематического комплекса', role: "state", type: "boolean", read: true, write: false}, 'car_state.arm': {val: false, name: 'Состояние режима охраны', role: "state", type: "boolean", read: true, write: false}, 'car_state.door': {val: false, name: 'Состояние дверей', role: "state", type: "boolean", read: true, write: false}, 'car_state.hbrake': {val: false, name: 'Состояние ручного тормоза', role: "state", type: "boolean", read: true, write: false}, 'car_state.hijack': {val: false, name: 'Состояние режима "Антиограбление"', role: "state", type: "boolean", read: true, write: false}, 'car_state.hood': {val: false, name: 'Состояние капота', role: "state", type: "boolean", read: true, write: false}, 'car_state.ign': {val: false, name: 'Состояние двигателя', role: "state", type: "boolean", read: true, write: false}, 'car_state.out': {val: false, name: 'Состояние доп. канала', role: "state", type: "boolean", read: true, write: false}, 'car_state.pbrake': {val: false, name: 'Состояние педали тормоза', role: "state", type: "boolean", read: true, write: false}, 'car_state.r_start': {val: false, name: 'Статус дистанционного запуска', role: "state", type: "boolean", read: true, write: false}, 'car_state.run': {val: false, name: 'Состояние зажигания', role: "state", type: "boolean", read: true, write: false}, 'car_state.shock_bpass': {val: false, name: 'Состояние датчика удара', role: "state", type: "boolean", read: true, write: false}, 'car_state.tilt_bpass': {val: false, name: 'Состояние датчика наклона', role: "state", type: "boolean", read: true, write: false}, 'car_state.trunk': {val: false, name: 'Состояние багажника', role: "state", type: "boolean", read: true, write: false}, 'car_state.valet': {val: false, name: 'Статус сервисного режима', role: "state", type: "boolean", read: true, write: false}, 'car_state.webasto': {val: false, name: 'Состояние предпускового подогревателя', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.add_h': {val: false, name: 'Состояние тревожного уровня дополнительного датчика', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.add_l': {val: false, name: 'Состояние предупредительного уровня дополнительного датчика', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.door': {val: false, name: 'Состояние зоны дверей', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.hbrake': {val: false, name: 'Состояние ручного тормоза', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.hijack': {val: false, name: 'Состояние режима "Антиограбление"', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.hood': {val: false, name: 'Состояние зоны капота', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.ign': {val: false, name: 'Состояние зажигания', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.pbrake': {val: false, name: 'Состояние педали тормоза', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.shock_h': {val: false, name: 'Состояние тревожного уровня датчика удара', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.shock_l': {val: false, name: 'Состояние предупредительного уровня датчика удара', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.tilt': {val: false, name: 'Состояние датчика наклона', role: "state", type: "boolean", read: true, write: false}, 'car_alr_state.trunk': {val: false, name: 'Состояние зоны багажника', role: "state", type: "boolean", read: true, write: false}, 'services.control': {val: false, name: false, role: "state", type: "string", read: true, write: true}, 'services.settings': {val: false, name: false, role: "state", type: "string", read: true, write: true}, 'position.dir': {val: '', name: 'Данные о направлении движения в градусах ( 0 - Север, 180 - Юг )', role: "state", type: "number", read: true, write: true}, 'position.s': {val: '', name: 'Скорость устройства, км/ч', role: "state", type: "number", read: true, write: true}, 'position.sat_qty': {val: '', name: 'Число принимаемых спутников GPS', role: "state", type: "number", read: true, write: true}, 'position.ts': {val: '', name: 'Метка времени фиксации координат, число секунд прошедших с 01.01.1970 по UTC', role: "state", type: "number", read: true, write: true}, 'position.longitude': {val: '', name: 'Координаты широты', role: "value.gps.longitude", type: "string", read: true, write: true}, 'position.latitude': {val: '', name: 'Координаты долготы', role: "value.gps.longitude", type: "string", read: true, write: true}, }; function startAdapter(options){ return adapter = utils.adapter(Object.assign({}, options, { systemConfig: true, name: 'starline', ready: main, unload: callback => { reload_data && clearTimeout(reload_data); reAuth_TimeOut && clearTimeout(reAuth_TimeOut); try { debug('cleaned everything up...'); callback(); } catch (e) { callback(); } }, stateChange: (id, state) => { if (id && state && !state.ack){ //debug(`state ${id} changed: ${state.val} (ack = ${state.ack})`); let StateArray = id.split('.'); let action = ''; if (StateArray[3] === 'control'){ let alias = StateArray[2]; let value_command = state.val; action = StateArray[4]; adapter.getState(alias + '.device_id', (err, state) => { if (err || !state){ } else { let deviceId = parseInt(state.val); adapter.setState(alias + '.control.' + action, {ack: true}); if (action === 'ign' && value_command){ value_command = 1; } send_command(deviceId, action, value_command); } }); adapter.log.info('stateChange ' + id + ' - ' + JSON.stringify(state)); } } }, })); } function goto_web(){ let options = { hostname: 'starline-online.ru', port: 443, path: '/', method: 'GET' }; options.headers = { 'Host': 'starline-online.ru', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Connection': 'keep-alive' }; let req = https.request(options, (res) => { //res.setEncoding('utf8'); adapter.log.debug('goto_web - response from the server statusCode: ' + res.statusCode); res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { getSesId(res.headers, 'notoken', () => { adapter.log.debug('goto_web-cookie: ' + header); adapter.log.debug('auth_web (sesId)' + sesId); auth_web(); }); }); }); req.end(); req.on('error', (err) => { adapter.log.error('Error: goto_web - ' + err); reAuth(); }); } function auth_web(){ let post_data = { 'username': adapter.config.login, 'rememberMe': true, 'password': adapter.config.password }; let options = { hostname: 'starline-online.ru', port: 443, path: '/rest/security/login', method: 'POST' }; options.headers = { 'user-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36', 'accept': 'application/json, text/javascript, */*; q=0.01', 'origin': 'https://starline-online.ru', 'accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,de;q=0.6', 'content-type': 'application/json', 'x-requested-with': 'XMLHttpRequest', 'referer': 'https://starline-online.ru/', 'cookie': 'PHPSESSID=' + sesId + '; lang=ru;', 'content-Length': JSON.stringify(post_data).length }; let req = https.request(options, (res) => { //res.setEncoding('utf8'); adapter.log.debug('auth_web - response from the server statusCode: ' + res.statusCode); res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { getSesId(res.headers, null, () => { if (userAgentId && sesId){ adapter.log.debug('auth_web-cookie: ' + header); adapter.log.debug('get_data (phpsesid) ' + sesId); adapter.log.debug('get_data (token) ' + userAgentId); adapter.setState('info.connection', true, true); get_data(); } }); }); }); req.on('error', (err) => { adapter.log.error('Error: auth_web - ' + err); reAuth(); }); req.write(JSON.stringify(post_data)); req.end(); } function get_data(){ let getdata = ''; let eS = new Date().getTime() / 1000; eS = eS.toString().replace(".", ""); let options = { hostname: 'starline-online.ru', port: 443, path: '/device?tz=360&_=' + eS, //list method: 'GET' }; options.headers = { 'Host': 'starline-online.ru', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://starline-online.ru/site/map', 'Cookie': 'PHPSESSID=' + sesId + '; userAgentId=' + userAgentId + '; lang=ru;', 'Connection': 'keep-alive' }; let req = https.request(options, (res) => { //res.setEncoding('utf8'); adapter.log.debug('get_data - response from the server statusCode: ' + res.statusCode); res.on('data', (chunk) => { getdata += chunk; }); res.on('end', () => { if (res.statusCode === 200){ adapter.log.debug('Received data:' + getdata); parse_data(getdata); } else { adapter.log.error('get_data - response statusCode: ' + res.statusCode); reAuth(); } }); }); req.end(); req.on('error', (err) => { adapter.log.error('Error: get_data - ' + err); reAuth(); }); } function parse_data(getdata){ let result; let device = []; try { result = JSON.parse(getdata); if (result.result){ let numdevice = result.answer.devices.length; for (let t = 0; t < numdevice; t++) { device[t] = result.answer.devices[t].alias; adapter.log.debug('device- ' + device[t]); setObjectfun(device[t] + '.alias', result.answer.devices[t].alias, device[t]); setObjectfun(device[t] + '.skey', result.answer.skey); // setObjectfun(device[t] + '.balance', result.answer.devices[t].balance && result.answer.devices[t].balance.active.value); setObjectfun(device[t] + '.battery', result.answer.devices[t].battery); setObjectfun(device[t] + '.device_id', result.answer.devices[t].device_id); setObjectfun(device[t] + '.fw_version', result.answer.devices[t].fw_version); setObjectfun(device[t] + '.imei', result.answer.devices[t].imei); setObjectfun(device[t] + '.mayak_temp', result.answer.devices[t].mayak_temp); setObjectfun(device[t] + '.mon_type', result.answer.devices[t].mon_type); setObjectfun(device[t] + '.type', result.answer.devices[t].type); setObjectfun(device[t] + '._controls', result.answer.devices[t]._controls); setObjectfun(device[t] + '.reg', result.answer.devices[t].reg); setObjectfun(device[t] + '.rpl_channel', result.answer.devices[t].rpl_channel); setObjectfun(device[t] + '.sn', result.answer.devices[t].sn); setObjectfun(device[t] + '.ts_activity', result.answer.devices[t].ts_activity); setObjectfun(device[t] + '.shortParking', result.answer.devices[t].shortParking); setObjectfun(device[t] + '.longParking', result.answer.devices[t].longParking); setObjectfun(device[t] + '.shared_for_me', result.answer.devices[t].shared_for_me); setObjectfun(device[t] + '.showInsuranceEvents', result.answer.devices[t].showInsuranceEvents); setObjectfun(device[t] + '.ctemp', result.answer.devices[t].ctemp); setObjectfun(device[t] + '.etemp', result.answer.devices[t].etemp); setObjectfun(device[t] + '.gps_lvl', result.answer.devices[t].gps_lvl); setObjectfun(device[t] + '.gsm_lvl', result.answer.devices[t].gsm_lvl); setObjectfun(device[t] + '.phone', result.answer.devices[t].phone); setObjectfun(device[t] + '.status', result.answer.devices[t].status); //car_state setObjectfun(device[t] + '.car_state.add_sens_bpass', result.answer.devices[t].car_state.add_sens_bpass); setObjectfun(device[t] + '.car_state.alarm', result.answer.devices[t].car_state.alarm); setObjectfun(device[t] + '.car_state.arm', result.answer.devices[t].car_state.arm); setObjectfun(device[t] + '.car_state.door', result.answer.devices[t].car_state.door); setObjectfun(device[t] + '.car_state.hbrake', result.answer.devices[t].car_state.hbrake); setObjectfun(device[t] + '.car_state.hijack', result.answer.devices[t].car_state.hijack); setObjectfun(device[t] + '.car_state.hood', result.answer.devices[t].car_state.hood); setObjectfun(device[t] + '.car_state.ign', result.answer.devices[t].car_state.ign); setObjectfun(device[t] + '.car_state.out', result.answer.devices[t].car_state.out); setObjectfun(device[t] + '.car_state.pbrake', result.answer.devices[t].car_state.pbrake); setObjectfun(device[t] + '.car_state.r_start', result.answer.devices[t].car_state.r_start); setObjectfun(device[t] + '.car_state.run', result.answer.devices[t].car_state.run); setObjectfun(device[t] + '.car_state.shock_bpass', result.answer.devices[t].car_state.shock_bpass); setObjectfun(device[t] + '.car_state.tilt_bpass', result.answer.devices[t].car_state.tilt_bpass); setObjectfun(device[t] + '.car_state.trunk', result.answer.devices[t].car_state.trunk); setObjectfun(device[t] + '.car_state.valet', result.answer.devices[t].car_state.valet); setObjectfun(device[t] + '.car_state.webasto', result.answer.devices[t].car_state.webasto); //car_alr_state setObjectfun(device[t] + '.car_alr_state.add_h', result.answer.devices[t].car_alr_state.add_h); setObjectfun(device[t] + '.car_alr_state.add_l', result.answer.devices[t].car_alr_state.add_l); setObjectfun(device[t] + '.car_alr_state.door', result.answer.devices[t].car_alr_state.door); setObjectfun(device[t] + '.car_alr_state.hbrake', result.answer.devices[t].car_alr_state.hbrake); setObjectfun(device[t] + '.car_alr_state.hijack', result.answer.devices[t].car_alr_state.hijack); setObjectfun(device[t] + '.car_alr_state.hood', result.answer.devices[t].car_alr_state.hood); setObjectfun(device[t] + '.car_alr_state.ign', result.answer.devices[t].car_alr_state.ign); setObjectfun(device[t] + '.car_alr_state.pbrake', result.answer.devices[t].car_alr_state.pbrake); setObjectfun(device[t] + '.car_alr_state.shock_h', result.answer.devices[t].car_alr_state.shock_h); setObjectfun(device[t] + '.car_alr_state.shock_l', result.answer.devices[t].car_alr_state.shock_l); setObjectfun(device[t] + '.car_alr_state.tilt', result.answer.devices[t].car_alr_state.tilt); setObjectfun(device[t] + '.car_alr_state.trunk', result.answer.devices[t].car_alr_state.trunk); //services setObjectfun(device[t] + '.services.control', result.answer.devices[t].services.control); setObjectfun(device[t] + '.services.settings', result.answer.devices[t].services.settings); //position setObjectfun(device[t] + '.position.dir', result.answer.devices[t].position.dir); setObjectfun(device[t] + '.position.s', result.answer.devices[t].position.s); setObjectfun(device[t] + '.position.sat_qty', result.answer.devices[t].position.sat_qty); setObjectfun(device[t] + '.position.ts', result.answer.devices[t].position.ts); //setObjectfun (device[t]+'.position.x',result.answer.devices[t].position.x); setObjectfun(device[t] + '.position.longitude', result.answer.devices[t].position.x); //setObjectfun (device[t]+'.position.y',result.answer.devices[t].position.y); setObjectfun(device[t] + '.position.latitude', result.answer.devices[t].position.y); } adapter.log.info('Data received restart in ' + timePool / 1000 + ' sec.'); reload_data = setTimeout(() => { get_data(); }, timePool); } if (result.result === 0){ error('Error get Parse Data:' + result.answer.error); //adapter.log.error('Error get Parse Data:' + result.answer.error); //CONSTRUCTION - Тех работы на сайте. reAuth(); } } catch (e) { adapter.log.error('Parse error DATA' + JSON.stringify(getdata)); reAuth(); } } function reAuth(){ adapter.setState('info.connection', false, true); adapter.log.error('Re-authorization, and receiving data in 10 minutes.'); reAuth_TimeOut = setTimeout(() => { reload_data && clearTimeout(reload_data); goto_web(); }, 600000); } function getSesId(head, notoken, cb){ header = JSON.stringify(head); let pos = header.indexOf('PHPSESSID='); let pos_t = header.indexOf('userAgentId='); if (pos !== -1){ sesId = header.substring(pos + 'PHPSESSID='.length); pos = sesId.indexOf(';'); if (pos !== -1){ sesId = sesId.substring(0, pos); cb && cb(); } else { error('failed to get PHPSESSID'); return; } adapter.log.debug('PHPSESSID=' + sesId); } else { error('failed to get PHPSESSID'); return; } if (notoken !== 'notoken'){ if (pos_t !== -1){ userAgentId = header.substring(pos_t + 'userAgentId='.length); pos_t = userAgentId.indexOf(';'); if (pos_t !== -1){ userAgentId = userAgentId.substring(0, pos_t); cb && cb(); } else { error('failed to get userAgentId'); return; } adapter.log.debug('userAgentId=' + userAgentId); } else { error('failed to get userAgentId'); } } //return; } function setObjectfun(name, state, device){ let role = 'indicator'; adapter.getObject(device + '.alias', (err, state) => { if ((err || !state) && device){ for (let key in control_action) { adapter.setObject(device + '.control.' + key, { type: 'state', common: { name: control_action[key].name, type: control_action[key].type, role: control_action[key].role, read: control_action[key].read, write: control_action[key].write }, native: {} }); adapter.setState(device + '.control.' + key, {val: false, ack: true}); } } else { if (!flag_subscribe && device){ adapter.subscribeStates(device + '.control.' + '*'); flag_subscribe = true; } } }); let _name = name.split('.'); let name_obj = ''; if (_name.length === 2){ name_obj = _name[_name.length - 1]; } else { name_obj = _name[_name.length - 2] + '.' + _name[_name.length - 1]; } adapter.setObject(name, { type: 'state', common: { name: states[name_obj].name ? states[name_obj].name :name, type: states[name_obj].type, role: states[name_obj].role, read: states[name_obj].read, write: states[name_obj].write }, native: {} }); adapter.setState(name, {val: state, ack: true}); } /******************************************************************/ function send_command(device_id, action, value){ data = ''; let path = '/device/' + device_id + '/executeCommand'; let post_data; switch (action) { case 'checkballance': path = '/device/balance'; post_data = querystring.stringify({ 'device_id': device_id }); break; case 'checktemp': path = '/device/batteryTemperature'; post_data = querystring.stringify({ 'device_id': device_id }); break; default: post_data = querystring.stringify({ /*'device_id':device_id,*/ 'action': action, 'value': value, 'password': '' }); } let options = { hostname: 'starline-online.ru', port: 443, path: path, method: 'POST' }; options.headers = { 'Host': 'starline-online.ru', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest', 'Referer': 'https://starline-online.ru/site/map', 'Content-Length': post_data.length, 'Cookie': 'PHPSESSID=' + sesId + '; userAgentId=' + userAgentId + '; lang=ru;', 'Connection': 'keep-alive' }; let req = https.request(options, (res) => { //res.setEncoding('utf8'); adapter.log.debug('send_command - response from the server statusCode: ' + res.statusCode); res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { let result; try { result = JSON.parse(data); if (result.state){ adapter.log.info('It sent command: Device number - ' + device_id + ' * Command - ' + action + ' * Value - ' + value); } else { adapter.log.info('Error sending command - ' + result.desc.action[0]); } } catch (e) { adapter.log.error('Send command. Parsing error: ' + JSON.stringify(e) + '. Incoming data: ' + JSON.stringify(data)); } setTimeout(() => { clearTimeout(reload_data); get_data(); }, 10000); }); }); req.on('error', (err) => { adapter.log.error('Error: send_command - ' + err); }); req.write(post_data); req.end(); } function error(error){ adapter.log.error('ERROR ' + error); reAuth(); } /*******************************************************************/ function main(){ if (adapter.config.login && adapter.config.password){ timePool = adapter.config.interval; goto_web(); //test(); } else { adapter.log.error('Error! Is not set LOGIN and PASSWORD!'); } } if (module.parent){ module.exports = startAdapter; } else { startAdapter(); }