Сценарии - новая версия API
-
@intrapro, помогите свежим взглядом разобраться. Выявил, что почему-то иногда сценарий передает "не контроллируемые" данные - передачу громкости 58 и 100 единиц:
Сам сценарий запускается по входящему от терминала:12.10 12:39:55.773 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /api/method/name.method?terminal=VT1&volume=58&uptime=92530&username=voiceterminal 12.10 12:39:55.774 voiceterminal1: 192.168.11.51 <= localhost:11051 12.10 12:39:55.774 voiceterminal1: { type: 'startscene', id: 'VoiceTerminal_Status', arg: '{"terminal":"VT1","volume":"58","uptime":"92530","username":"voiceterminal"}' } 12.10 12:39:55.776 IH: plugin command { unit: 'voiceterminal1', command: 'volume:58', type: 'command' } 12.10 12:39:55.778 IH: startscene VoiceTerminal_Status 12.10 12:39:55.779 voiceterminal1: send command to terminal - 'volume:58' 12.10 12:39:55.779 voiceterminal1: connection by socket to the 192.168.11.51:7999 successfull! 12.10 12:39:55.779 voiceterminal1: send data by socket - 'volume:58' 12.10 12:39:55.780 voiceterminal1: connection by socket to the 192.168.11.51:7999 is end! 12.10 12:39:55.833 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /api/method/name.method?terminal=VT1&volume=100&uptime=92530&username=voiceterminal 12.10 12:39:55.834 voiceterminal1: 192.168.11.51 <= localhost:11051 12.10 12:39:55.834 voiceterminal1: { type: 'startscene', id: 'VoiceTerminal_Status', arg: '{"terminal":"VT1","volume":"100","uptime":"92530","username":"voiceterminal"}' } 12.10 12:39:55.835 IH: plugin command { unit: 'voiceterminal1', command: 'volume:100', type: 'command' } 12.10 12:39:55.838 IH: startscene VoiceTerminal_Status 12.10 12:39:55.838 voiceterminal1: send command to terminal - 'volume:100' 12.10 12:39:55.839 voiceterminal1: connection by socket to the 192.168.11.51:7999 successfull! 12.10 12:39:55.839 voiceterminal1: send data by socket - 'volume:100' 12.10 12:39:55.839 voiceterminal1: connection by socket to the 192.168.11.51:7999 is end! 12.10 12:39:55.893 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /api/method/name.method?terminal=VT1&volume=58&uptime=92530&username=voiceterminal 12.10 12:39:55.893 voiceterminal1: 192.168.11.51 <= localhost:11051 12.10 12:39:55.894 voiceterminal1: { type: 'startscene', id: 'VoiceTerminal_Status', arg: '{"terminal":"VT1","volume":"58","uptime":"92530","username":"voiceterminal"}' } 12.10 12:39:55.895 IH: plugin command { unit: 'voiceterminal1', command: 'volume:58', type: 'command' } 12.10 12:39:55.898 IH: startscene VoiceTerminal_Status 12.10 12:39:55.898 voiceterminal1: send command to terminal - 'volume:58' 12.10 12:39:55.899 voiceterminal1: connection by socket to the 192.168.11.51:7999 successfull! 12.10 12:39:55.899 voiceterminal1: send data by socket - 'volume:58' 12.10 12:39:55.899 voiceterminal1: connection by socket to the 192.168.11.51:7999 is end! 12.10 12:39:55.950 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /api/method/name.method?terminal=VT1&volume=100&uptime=92530&username=voiceterminal 12.10 12:39:55.950 voiceterminal1: 192.168.11.51 <= localhost:11051 12.10 12:39:55.951 voiceterminal1: { type: 'startscene', id: 'VoiceTerminal_Status', arg: '{"terminal":"VT1","volume":"100","uptime":"92530","username":"voiceterminal"}' } 12.10 12:39:55.952 IH: plugin command { unit: 'voiceterminal1', command: 'volume:100', type: 'command' } 12.10 12:39:55.955 IH: startscene VoiceTerminal_Status 12.10 12:39:55.956 voiceterminal1: send command to terminal - 'volume:100' 12.10 12:39:55.956 voiceterminal1: connection by socket to the 192.168.11.51:7999 successfull! 12.10 12:39:55.957 voiceterminal1: send data by socket - 'volume:100' 12.10 12:39:55.957 voiceterminal1: connection by socket to the 192.168.11.51:7999 is end! 12.10 12:39:56.006 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /api/method/name.method?terminal=VT1&volume=58&uptime=92531&username=voiceterminal 12.10 12:39:56.006 voiceterminal1: 192.168.11.51 <= localhost:11051 12.10 12:39:56.007 voiceterminal1: { type: 'startscene', id: 'VoiceTerminal_Status', arg: '{"terminal":"VT1","volume":"58","uptime":"92531","username":"voiceterminal"}' } 12.10 12:39:56.008 IH: plugin command { unit: 'voiceterminal1', command: 'volume:58', type: 'command' } 12.10 12:39:56.011 IH: startscene VoiceTerminal_Status 12.10 12:39:56.012 voiceterminal1: send command to terminal - 'volume:58' 12.10 12:39:56.012 voiceterminal1: connection by socket to the 192.168.11.51:7999 successfull! 12.10 12:39:56.012 voiceterminal1: send data by socket - 'volume:58' 12.10 12:39:56.012 voiceterminal1: connection by socket to the 192.168.11.51:7999 is end! 12.10 12:39:56.044 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /api/method/name.method?terminal=VT1&volume=100&uptime=92531&username=voiceterminal 12.10 12:39:56.044 voiceterminal1: 192.168.11.51 <= localhost:11051 12.10 12:39:56.045 voiceterminal1: { type: 'startscene', id: 'VoiceTerminal_Status', arg: '{"terminal":"VT1","volume":"100","uptime":"92531","username":"voiceterminal"}' } 12.10 12:39:56.046 IH: plugin command { unit: 'voiceterminal1', command: 'volume:100', type: 'command' } 12.10 12:39:56.048 IH: startscene VoiceTerminal_Status 12.10 12:39:56.049 voiceterminal1: send command to terminal - 'volume:100' 12.10 12:39:56.049 voiceterminal1: connection by socket to the 192.168.11.51:7999 successfull! 12.10 12:39:56.049 voiceterminal1: send data by socket - 'volume:100' 12.10 12:39:56.050 voiceterminal1: connection by socket to the 192.168.11.51:7999 is end! 12.10 12:39:56.366 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /api/method/name.method?terminal=VT1&volume=58&uptime=92531&username=voiceterminal 12.10 12:39:56.366 voiceterminal1: 192.168.11.51 <= localhost:11051 12.10 12:39:56.367 voiceterminal1: { type: 'startscene', id: 'VoiceTerminal_Status', arg: '{"terminal":"VT1","volume":"58","uptime":"92531","username":"voiceterminal"}' } 12.10 12:39:56.368 IH: plugin command { unit: 'voiceterminal1', command: 'volume:58', type: 'command' } 12.10 12:39:56.370 IH: startscene VoiceTerminal_Status 12.10 12:39:56.371 voiceterminal1: send command to terminal - 'volume:58' 12.10 12:39:56.371 voiceterminal1: connection by socket to the 192.168.11.51:7999 successfull! 12.10 12:39:56.372 voiceterminal1: send data by socket - 'volume:58' 12.10 12:39:56.372 voiceterminal1: connection by socket to the 192.168.11.51:7999 is end! 12.10 12:39:56.403 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /api/method/name.method?terminal=VT1&volume=100&uptime=92531&username=voiceterminal 12.10 12:39:56.403 voiceterminal1: 192.168.11.51 <= localhost:11051 12.10 12:39:56.403 voiceterminal1: { type: 'startscene', id: 'VoiceTerminal_Status', arg: '{"terminal":"VT1","volume":"100","uptime":"92531","username":"voiceterminal"}' } 12.10 12:39:56.405 IH: plugin command { unit: 'voiceterminal1', command: 'volume:100', type: 'command' } 12.10 12:39:56.408 IH: startscene VoiceTerminal_Status 12.10 12:39:56.408 voiceterminal1: send command to terminal - 'volume:100' 12.10 12:39:56.408 voiceterminal1: connection by socket to the 192.168.11.51:7999 successfull! 12.10 12:39:56.409 voiceterminal1: send data by socket - 'volume:100' 12.10 12:39:56.409 voiceterminal1: connection by socket to the 192.168.11.51:7999 is end! 12.10 12:39:56.632 voiceterminal1: 192.168.11.51 => localhost:11051 HTTP GET /api/method/name.method?terminal=VT1&status=start_record&uptime=92531&username=voiceterminal 12.10 12:39:56.632 voiceterminal1: 192.168.11.51 <= localhost:11051 12.10 12:39:56.633 voiceterminal1: { type: 'startscene', id: 'VoiceTerminal_Status', arg: '{"terminal":"VT1","status":"start_record","uptime":"92531","username":"voiceterminal"}' } 12.10 12:39:56.636 IH: startscene VoiceTerminal_Status
Сценарий создавался для того, чтобы:
- На вкладке параметры устройства отображать состояние терминала
- Со вкладки параемтры регулировать громкость терминала и плеера.
const dev1 = Device("_UNIT_voiceterminal1", [ {"name":"uptime", "note":"Времы работы", "type":"string", "val":""}, {"name":"status", "note":"Состояние", "type":"string", "val":""}, {"name":"updater", "note":"Обновления", "type":"string", "val":""}, {"name":"set_volume", "note":"Громкость терминала", "type":"number", "val":50}, {"name":"set_music_volume", "note":"Громкость плеера", "type":"number", "val":50}, {"name":"last_update", "note":"Update", "type":"string", "val":""} ]); const dev2 = Device("_UNIT_voiceterminal2", [ {"name":"uptime", "note":"Времы работы", "type":"string", "val":""}, {"name":"status", "note":"Состояние", "type":"string", "val":""}, {"name":"updater", "note":"Обновление", "type":"string", "val":""}, {"name":"set_volume", "note":"Громкость терминала", "type":"number", "val":50}, {"name":"set_music_volume", "note":"Громкость плеера", "type":"number", "val":50}, {"name":"last_update", "note":"Last update", "type":"string", "val":""} ]); script({ start(param) { let device = ''; //Скрипт запускается плагином с параметрами if(param !== undefined) { const obj = this.ParseJSON(param); //Выбор устройства if(obj.terminal == "VT1") { device = dev1; } else if(obj.terminal == "VT2") { device = dev2; } //Конвертация времени из секунд в часы let days = Math.floor(obj.uptime/86400); let hours = Math.floor((obj.uptime % 86400)/3600); let minutes = Math.floor((obj.uptime % 3600)/60); let seconds = obj.uptime % 60; let time = days+ "d " +((hours < 10) ? "0" : "")+hours+ ":" +((minutes < 10) ? "0" : "")+minutes+ ":" +((seconds < 10) ? "0" : "")+seconds; //Обновление параметров устройства if(obj.uptime !== undefined) device.setParam("uptime", time); if(obj.status !== undefined) device.setParam("status", obj.status); if(obj.updater !== undefined) device.setParam("updater", obj.updater); if(obj.volume !== undefined) device.setParam("set_volume", obj.volume); if(obj.music_volume !== undefined) device.setParam("set_music_volume", obj.music_volume); device.setParam("last_update", this.GetDate()); } }, ParseJSON(param) { try { return JSON.parse(param); } catch (e) { let text = e instanceof SyntaxError; this.log("SyntaxError - " +text+ "; param - " +param); } }, GetDate() { return new Date().toLocaleString('ru-RU'); } });
В отладчике сценария:
12.10 12:39:37.115 Started 12.10 12:39:37.116 do _UNIT_voiceterminal1 uptime 1d 01:41:52 12.10 12:39:37.117 do _UNIT_voiceterminal1 set_volume 58 12.10 12:39:37.121 do _UNIT_voiceterminal1 last_update 2020-10-12 12:39:37 12.10 12:39:37.122 Stopped 12.10 12:39:37.148 Started 12.10 12:39:37.149 do _UNIT_voiceterminal1 uptime 1d 01:41:52 12.10 12:39:37.150 do _UNIT_voiceterminal1 set_volume 100 12.10 12:39:37.152 do _UNIT_voiceterminal1 last_update 2020-10-12 12:39:37 12.10 12:39:37.153 Stopped 12.10 12:39:37.427 Started 12.10 12:39:37.428 do _UNIT_voiceterminal1 uptime 1d 01:41:52 12.10 12:39:37.428 do _UNIT_voiceterminal1 set_volume 58 12.10 12:39:37.432 do _UNIT_voiceterminal1 last_update 2020-10-12 12:39:37 12.10 12:39:37.432 Stopped 12.10 12:39:37.464 Started 12.10 12:39:37.464 do _UNIT_voiceterminal1 uptime 1d 01:41:52 12.10 12:39:37.465 do _UNIT_voiceterminal1 set_volume 100 12.10 12:39:37.467 do _UNIT_voiceterminal1 last_update 2020-10-12 12:39:37 12.10 12:39:37.468 Stopped 12.10 12:39:37.676 Started 12.10 12:39:37.676 do _UNIT_voiceterminal1 uptime 1d 01:41:52 12.10 12:39:37.677 do _UNIT_voiceterminal1 status start_record 12.10 12:39:37.680 do _UNIT_voiceterminal1 last_update 2020-10-12 12:39:37 12.10 12:39:37.681 Stopped
Хм...этот сценарий причем лишь косвенно. Отрабатывает другой - вот этот!!!
const dev1 = Device("_UNIT_voiceterminal1"); const dev2 = Device("_UNIT_voiceterminal2"); startOnChange([dev1,dev2]); script({ start() { let device = ''; let flag_volume = 0; //Проверка с какого устройства поступила команда if(this.isChanged(dev1, "set_volume")) { device = dev1; flag_volume = 1; } else if(this.isChanged(dev2, "set_volume")) { device = dev2; flag_volume = 1; } else if(this.isChanged(dev1, "set_music_volume")) { device = dev1; flag_volume = 2; } else if(this.isChanged(dev2, "set_music_volume")) { device = dev2; flag_volume = 2; } //Установка громкости на нужном терминале if(flag_volume == 1) this.SetVolumeTerminal(device); else if(flag_volume == 2) this.SetVolumeMusic(device); }, SetVolumeTerminal(device) { let unit = device.id.replace('_UNIT_', ''); let command = device.getParam('set_volume'); this.pluginCommand({unit: unit, command:"volume:" +command}); }, SetVolumeMusic(device) { let unit = device.id.replace('_UNIT_', ''); let command = device.getParam('set_music_volume'); this.pluginCommand({unit: unit, command:"mvolume:" +command}); } });
Его лог:
12.10 12:52:43.246 Trigger _UNIT_voiceterminal1 12.10 12:52:43.247 Started 12.10 12:52:43.247 isChanged(_UNIT_voiceterminal1,set_volume)=true Changed: {"_UNIT_voiceterminal1":{"set_volume":"58"}} 12.10 12:52:43.247 plugincCommand { unit: 'voiceterminal1', command: 'volume:58' } 12.10 12:52:43.248 Stopped 12.10 12:52:43.285 Trigger _UNIT_voiceterminal1 12.10 12:52:43.285 Started 12.10 12:52:43.286 isChanged(_UNIT_voiceterminal1,set_volume)=true Changed: {"_UNIT_voiceterminal1":{"set_volume":"100"}} 12.10 12:52:43.286 plugincCommand { unit: 'voiceterminal1', command: 'volume:100' } 12.10 12:52:43.287 Stopped 12.10 12:52:43.602 Trigger _UNIT_voiceterminal1 12.10 12:52:43.603 Started 12.10 12:52:43.603 isChanged(_UNIT_voiceterminal1,set_volume)=true Changed: {"_UNIT_voiceterminal1":{"set_volume":"58"}} 12.10 12:52:43.604 plugincCommand { unit: 'voiceterminal1', command: 'volume:58' } 12.10 12:52:43.604 Stopped 12.10 12:52:43.661 Trigger _UNIT_voiceterminal1 12.10 12:52:43.661 Started 12.10 12:52:43.662 isChanged(_UNIT_voiceterminal1,set_volume)=true Changed: {"_UNIT_voiceterminal1":{"set_volume":"100"}} 12.10 12:52:43.662 plugincCommand { unit: 'voiceterminal1', command: 'volume:100' } 12.10 12:52:43.663 Stopped 12.10 12:52:43.698 Trigger _UNIT_voiceterminal1 12.10 12:52:43.698 Started 12.10 12:52:43.699 isChanged(_UNIT_voiceterminal1,set_volume)=true Changed: {"_UNIT_voiceterminal1":{"set_volume":"58"}} 12.10 12:52:43.699 plugincCommand { unit: 'voiceterminal1', command: 'volume:58' } 12.10 12:52:43.700 Stopped 12.10 12:52:43.931 Trigger _UNIT_voiceterminal1
Заблокировал сценарий - все пропало. Разблокировал сценарий - тоже все нормально. В какой-то момент что-то происходит, что на каждый "чих" голосового терминала последний сценарий шлет ему громкость 58 и 100 попеременно (вероятно эти значения были заданы на вкладке "Параметры").
Пока не могу предположить почему так происходит...
-
Подсжите как сделать сценарий: обратный отсчет времени для замены фильтра воды.
-
@amgstone создал сценарий:
/** * @name Заміна фільтра води * @desc * @version 4 */ const meter = Device("Meter","час заміни фільтра"); script({ start() { meter.setParam("aval",meter.getParam("aval")+1); if(meter.getParam("aval")===90){ this.info('telegram', 'OWNER', 'Заміна фільтра води'); this.info('pushnotification', 'OWNER', 'Заміна фільтра води'); } } });
но в IH не смог создать дату, чтобы визуализировало дату когда надо заменить фильтр, возможно добавите устройство?
-
Готовлюсь к новому году) в проем гаражных ворот смонтировал RGB-ленту на базе WS2818. Хочется реализовать эффект бегущего огня с плавно изменяемой яркостью (вот пример - смотреть на 2:52-3:02). Я конечно понимаю, что iH - это не RGB-контроллер, но все же есть ли какая-то возможность сделать подобный эффект?? Сам сделал "длинный" бегущий огонь, но код очень топорный...
TronEffect() { this.addListener(sw, "ChangeStateSw"); let blue = 'FF00FF'; let dark = '000000'; let color = [blue+blue+blue+dark+dark+dark,dark+blue+blue+blue+dark+dark, dark+dark+blue+blue+blue+dark, dark+dark+dark+blue+blue+blue, blue+dark+dark+dark+blue+blue, blue+blue+dark+dark+dark+blue]; if(++this.i > color.length-1) this.i = 0; this.cmd = color[this.i]; this.SendDataToWS2818(this.plugin, this.channel, this.cmd, this.chip); this.startTimer("T1", this.period, "TronEffect"); },
Причем это просто бегущий огонь из 6 "пикселей". Как сделать уменьшающийся по яркости хвост огня и увеличить его скорость - это большой вопрос!!
-
@Alex_Jet Добрый день, судя по коду, огонь у вас бегает в переделах 6-ти пикселей ? какая длина ленты у вас ? есть фризы ?
-
@dev, огонь смещается по 6 пикселям. Но поскольку megad повторяет всю эту посылку N-количество раз (ключ "chip" - тут описание), то выглядит это вот так:
видео. Лента состоит из двух логических запараллеленых кусков длиной 39 чипов)). Ну а вообще длина - 2,4+3+2,4 м. Что такое фризы?
-
Пользователь @intrapro написал в Сценарии - новая версия API:
@homa, пока такой возможности нет
Подскажите, появилась возможность запуска сценария из сценария ?
И есть ли возможность после перезагрузки системы возобновлять работу активных сценариев ?
-
Пользователь @fanagor написал в Сценарии - новая версия API:
И есть ли возможность после перезагрузки системы возобновлять работу активных сценариев ?
А так не получается - функция boot()?
@intrahouse, @dev, я бы всякие такие возможности (startOnChange, check, boot и прочее) добавил бы на страницу "Система команд".
-
Пользователь @Alex_Jet написал в Сценарии - новая версия API:
А так не получается - функция boot()?
Если сценарий инициирует перезагрузку системы, думаю как сделать, чтобы после перезагрузки он продолжил свое выполнение дальше.
boot() инициирует новый запуск, вопрос как возобновить исполнение с нужной точки.
-
Пользователь @fanagor написал в Сценарии - новая версия API:
boot() инициирует новый запуск, вопрос как возобновить исполнение с нужной точки.
Может быть запоминать состояние в переменной сценария или вообще в глобальной переменной?
-
Пользователь @Alex_Jet написал в Сценарии - новая версия API:
Может быть запоминать состояние в переменной сценария или вообще в глобальной переменной?
Да, видимо так и сделаю.
Есть сценарии которые выполняются циклически через заданный промежуток времени, если он выполнил перезагрузку системы, то нужно ждать пока он не запустится заново.
Видимо перед перезагрузкой нужно присвоить значение нужной переменной, продублировать сценарий но уже с функцией boot() и проверкой этой переменной.
Думал обойтись без дублирования сценария, может есть механизм ? Было бы удобно.
-
Коллеги, старую версию сценариев уже забыл...как в сценарии проверить включен ли RGB-светильник? По isChanged в отладчике вижу вот это:
isChanged(RGBLAMP4_01,aval)=true Changed: {"RGBLAMP4_01":{"aval":[255,255,255],"dval":1,"stval":1}}
-
Добрый день.
this.isChanged(device1) проверяет свойство Error устройства device1 ?
В сценарии есть команда
if(this.isChanged(TERMOREG_1)) {
//
}Сценарий запускается по изменению, но при этом результат проверки условия false.
02.12 16:10:27.687 Check(TERMOREG_1) => true
02.12 16:10:27.688 Started
02.12 16:10:27.689 isChanged(TERMOREG_1,aval)=false Changed: {"TERMOREG_1":{"err":"Device timeout error!"}}
02.12 16:10:27.689 isChanged(LAMP_32,dval)=false Changed: {"TERMOREG_1":{"err":"Device timeout error!"}}
02.12 16:10:27.689 isChanged(TERMOREG_3_1,aval)=false Changed: {"TERMOREG_1":{"err":"Device timeout error!"}}
02.12 16:10:27.689 StoppedТип устройства: аналоговый датчик.
-
@fanagor, добрый день.
Метод this.isChanged позволяет узнать, какое событие стало причиной запуска сценария:
this.isChanged(device, 'setpoint') - изменили уставку
this.isChanged(device, 'auto') - изменился флаг auto
this.isChanged(device, 'value') - изменилось основное значениеthis.isChanged(device) сокращенная форма для this.isChanged(device, 'value'), то есть =true, если сценарий запущен при изменении основного свойства устройства (aval для аналогового, dval для дискретного устройства)
isChanged(TERMOREG_1,aval)=false Changed: {"TERMOREG_1":{"err":"Device timeout error!"}} означает:
Сценарий запустился при изменении основного значения TERMOREG_1?
Нет, изменился флаг ошибки "err", так как сработал таймаут
Истинным в данном случае будет
this.isChanged(TERMOREG_1, 'error') или this.isChanged(TERMOREG_1, 'err')
-
Это сообщение удалено!
-
Добрый день!
При использовании функции boot() сценарий запускается при старте сервера и остается постоянно активным хотя в нем никаких таймеров и слушателей нет. Так и должно быть?
-
@Lost, добрый день!
Нет, так быть не должно.
Функция boot должна проверить условие, и если истина, запускается функция start(). Дальше работает как обычно. Этот же сценарий может запускаться дальше по startOnChange() или интерактивноscript({ boot() { return lamp.isOn(); // Запустит на старте функцию start, если выполнено условие // return true; // Будет всегда запускать на старте функцию start }, start() { ..... },
В самой boot никаких действий делать не надо!
-
Я и не делал. Сделано пока вот так для пробы:
script({
boot() {
return true;
},
start() {
global.set(‘Armed’, 1);
},
Скрипт после перезагрузки сервера запускается и висит активным в рабочих сценариях (есть зеленая галочка). Вручную останавливается. Если вручную запустить то он после отработки останавливается (увеличивается счетчик количества запусков). Что не так?
-
@Lost, Вы правы, это баг
Сценарий с boot, не имеющий асинхронных механизмов, остается в состоянии активный (зеленая галочка)
Исправим в версии 4.7.7, выйдет на следующей неделе
-
Здравствуйте, уважаемые разработчики и форумчане! Поздравляю всех с наступившим Новым 2021 годом!
Желаю всем творческих успехов.
А теперь о проблеме. Пишу сценарий для управления новогодней гирляндой. У нее есть http API. При управлении используются данные из предыдущих ответов на запрос. Проблема в том, что не получается распарсить ответ и присвоить его разным переменным. Вот, собственно, сценарий/** * @name twinkly_http * @desc * @version 4 */ script({ host: '192.168.144.68', port: 80, method: '', path: '', myObj: '', start() { // login this.path = '/xled/v1/login'; this.method = 'POST'; this.send_http(); // verify // Действие }, send_http() { const http = require('http'); const querystring = require('querystring'); const postData = JSON.stringify({ challenge: 'AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=' }); this.log('postData: '+postData); var options = { hostname: this.host, port: this.port, path: this.path, method: this.method, headers: { 'Host': '192.168.144.68', 'Content-Type': 'application/json', 'Content-Length': postData.length //Buffer.byteLength(postData) } }; var req = http.request(options, (res) => { this.log('STATUS: '+res.statusCode); this.log('HEADERS:' +JSON.stringify(res.headers)); res.setEncoding('utf8'); res.on('data', (chunk) => this.myObj += chunk); res.on('end', () => { this.log('Data:' +this.myObj); const data = JSON.parse(this.myObj); this.log('Code:' +data); this.log(typeof this.myObj === 'string'); this.log('No more data in response.'); }); }); req.on('error', (e) => { this.log('problem with request: ' +e.message); }); // write data to request body req.write(postData); req.end(); } });
А вот сообщение в отладчике
03.01 13:15:08.970 Started
03.01 13:15:08.971 log: postData: {"challenge":"AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8="}
03.01 13:15:08.994 Stopped
03.01 13:15:09.013 log: STATUS: 200
03.01 13:15:09.017 log: HEADERS:{"connection":"close","content-length":"155","content-type":"application/json"}
03.01 13:15:09.021 log: Data:{"authentication_token":"4Be8Ix3sQBQ=","authentication_token_expires_in":14400,"challenge-response":"7ef99322220ff8a9c45aa1efa26ba01d2320aecc","code":1000}
03.01 13:15:09.024 log: Code:[object Object]
03.01 13:15:09.026 log: true
03.01 13:15:09.028 log: No more data in response.Данные из строки Data не могу получить по отдельности. Перечитал разные доки, форумы. Ничего не получается. Что я делаю не так?