Плагин MegaD
-
Хочу одной кнопкой выключать одновременно выключать несколько нагрузок, создал на мнемосхеме кнопку, в этой ветке нашёл команду которая будет запускаться через кнопку, но пока не удаётся,
настройки такие
в отладчике вот это, что можно увидеть где ошибка?16.07 22:34:18.951 megad4: 16.07 22:34:18.952 megad4: localhost => 192.168.1.34 HTTP GET /sec/?pt=8&cmd=get 16.07 22:34:18.956 megad4: localhost <= 192.168.1.34 response: statusCode=200 contentType = text/html 16.07 22:34:18.956 megad4: body: ON 16.07 22:34:18.956 IH: get [ { id: '8', value: '1' } ] set { Roz_328_8: { dval: 1, err: 0 } } 16.07 22:34:19.041 IH: plugin command { unit: 'megad4', clid: 'EHomCfealNm5NKWvB2Zm3Q==', command: 'this.pluginCommand({unit:\'megad4\', command:{url:\'/sec/?cmd=11:2;12:2\', onResponse:[{id:"11",value:2},{id:"12",value:"TOGGLE"}]});', arg: { parentId: '2', parentType: 'WIDGET_MNEMOSCHEMES', targetId: '10', targetType: 'button', targetValue: null, layoutId: [ '7' ], inputs: {}, arg: 'this.pluginCommand({unit:\'megad4\', command:{url:\'/sec/?cmd=11:2;12:2\', onResponse:[{id:"11",value:2},{id:"12",value:"TOGGLE"}]});' }, type: 'command' } 16.07 22:34:19.042 megad4: command: 'this.pluginCommand({unit:\'megad4\', command:{url:\'/sec/?cmd=11:2;12:2\', onResponse:[{id:"11",value:2},{id:"12",value:"TOGGLE"}]});' 16.07 22:34:19.151 megad4: 16.07 22:34:19.151 megad4: localhost => 192.168.1.34 HTTP GET this.pluginCommand({unit:'megad4', command:{url:'/sec/?cmd=11:2;12:2', onResponse:[{id:"11",value:2},{id:"12",value:"TOGGLE"}]}); 16.07 22:34:19.151 megad4: Http request error: Request path contains unescaped characters 16.07 22:34:19.352 megad4:
-
Вопрос отпал. Не достаток информации, приходится много искать на форуме, достаточно было команды
/sec/?cmd=a:0
чтобы выключить все выходы, подсмотрел в ответе от Alex_Jet, спасибо.
-
Всем привет!
Разбираюсь сейчас с плагином системой Интрахаус и привязкой к МегаД.
У меня к МегаД подключен частотник, по протоколу ModBus.
Управлять в принципе им получаеться, отправляя команду плагину из сценария. ```
this.pluginCommand({unit:'megad1', command:'/sec/?uart_tx=010601100000&mode=rs485'})Но хотелось бы получать от частотника и обратную связь. Для этого создал канал с произвольным именем, тип Аналоговый вход, и прописал в строку запроса состояния нужный запрос:
/sec/?uart_rx=1&mode=rs485&cmd=get
Далее планировал его обработать с помощью обработки данных на плагине, чтобы из ответа контроллера выделить цифру. Однако, не могу получит данные в канал. Интрахауз дает запрос, получает ответ:
13.11 21:29:41.239 megad1: localhost => 192.168.0.14 HTTP GET /sec/?uart_rx=1&mode=rs485&cmd=get
13.11 21:29:41.248 megad1: localhost <= 192.168.0.14 response: statusCode=200 contentType = text/html
13.11 21:29:41.249 megad1: body: 01|06|01|10|11|30одако этих данных ( 01|06|01|10|11|30 ) на канале не появляеться. Подскажите, может я где то не так делаю?
-
@AlexMer, добрый день
Канал МегаД принимает только результат в виде числа, body нужно предварительно обработать с помощью формулы обработки, сниппета или сценария.
Чтение данных с uart разбиралось здесь:
Там несколько вариантов предлагается, но смысл в том, что нужно сырые данные распарсить, а результат уже передать в устройствоОдин из вариантов - сценарий чтения данных со счетчика.
const power = Device("SensorA", "Power"); script({ start() { this.pluginCommand({unit:'megad1', command:{url:'/sec/?uart_tx=010400030002&mode=rs485'}}); // Следующий запрос через 100 мсек this.startTimer('T1', 0.1, 'getNext'); // Взвести таймер на случай, если ответа от контроллера нет this.startTimer('T2', 2, 'onTimeout'); }, getNext() { // Передать запрос на megad1, ответ без обработки придет в сценарий (onResponse:'raw') this.pluginCommand({unit:'megad1', command:{url:'/sec/?pt=7&cmd=get', onResponse:'raw'}}, 'getResponse'); }, getResponse(body) { this.log('getResponse body= '+body); if (body.includes('CRC Error')) { this.log('CRC Error'); // Контроллер вернул ошибку CRC this.exit(); } // 01|03|02|08|a1 - в таком виде ожидается ответ const arr = body.split("|"); if (arr && arr.length > 4) { const val = parseInt(arr[3]+arr[4], 16); this.assign(power,"value",val/10000 ); } else { this.log('Не удалось извлечь значение из строки: '+ body); // Данные получены, но парсинг неудачен } this.exit(); }, onTimeout() { this.log('Истек таймаут, ответ от megad не получен'); this.exit(); } });
-
Спасибо за подсказку, принцип понял, подправил код под себя, все работает.
-
Это сообщение удалено!
-
Добрый вечер!
Что то с командами плагина MegaD похоже не все в порядке. Вот сценарий:
Вот результат в отладчике:
Сценарий работу не заканчивает, зависает. Что тут не так?И еще вопрос. Как задать интервал таймера например 0,1 секунды? Или можно только кратно 1 секунде?
Интервал таймера пробовал меньше секунды. Получается если задать меньше 0.5 сек то по факту таймер не работает (интервал типа 0). Если задать 0.5 и более то интервал отрабатывает 1 сек. В 4 версии все нормально. Проблемы видимо в 5-ке.
-
@Lost, Добрый день!
Недавно стал разбираться с IntraHouse и пришлось потрать время пока не наткнулся на ваше сообщение в этой ветке и еще в соседней. Оба случая подтверждаю, все тоже самое.
Из ситуации вышел сценарием, который состряпал из разных примеров. В моей задаче нужно получать данные со счетчика Mercury 200.02 через шлюз MegaD.
Вот что получилось и работает стабильно несколько дней (запросы удаленные, через VPN):getMercury() { require('http').get('http://192.168.2.14/sec/?uart_tx=000816F063&mode=rs485', res => { //C38D - CRC16 Modbus if (res.statusCode != 200) { res.resume(); this.log('Error code: ' +res.statusCode); rawError("rawError", res.statusCode); voltage.assign("volt", 0); current.assign("current", 0); power.assign("power", 0); return; } else { //this.log('Start sleep 100ms'); const date = Date.now(); let currentDate = null; do { currentDate = Date.now(); } while (currentDate - date < 100); //this.log('End sleep 100ms'); require('http').get('http://192.168.2.14/sec/?uart_rx=1&mode=rs485', res => { let rawData = ''; res.on('data', chunk => { rawData += chunk; rawData1 = rawData; }); if (rawData1.includes('CRC Error')) { this.log('rawData= '+rawData1); rawError.assign("rawError", rawData1); } else { res.on('end', () => { const arr = rawData.split("|"); res.resume(); const volt = Number(arr[5]+arr[6])/10; const tok = Number(arr[7]+arr[8])/100; const watt = Number(arr[9]+arr[10]+arr[11]); voltage.assign("volt", volt); current.assign("current", tok); power.assign("power", watt); this.log('getResponse body= '+rawData+ ' Volt='+volt ); }); } }); } }); // Запрос следующего цикла через 5 сек this.startTimer('T2', 5, 'getMercury'); },
-
@VictorT Добрый день, тоже разбираюсь с 5 версией сценарий из 4 работать отказался, можно посмотреть ваш сценарий полностью? Попробую переделать под себя.
-
@aleks-zonov извиняюсь, не заглядывал давно, думал вообще не живая ветка.
Вот мой рабочий вариант. Иногда проверяю работу через вызов плагина, но там без изменений, может я чего то упускаю, но раскопать не получилось и разрабы не комментируют. А судя по коду в плагине Megad, в моем скрипте делается так же, как и через плагин.// переменные должны совпадать с id на устройстве const voltage = Device("Mercury_200"); const current = Device("Mercury_200"); const power = Device("Mercury_200"); const rawError = Device("Mercury_200"); script({ boot() { return true; // Сценарий будет запускаться на старте и всегда будет активным }, start() { //this.startTimer('T2', 5, 'getMercury'); this.getMercury(); //this.startTimer('T2', 5, 'onTimeout'); }, getMercury() { require('http').get('http://192.168.2.14/sec/?uart_tx=000816F063&mode=rs485', res => { //C38D - посчитанный CRC16 для клнкретного счетчика if (res.statusCode == 200 ) { //this.log('Start sleep 100ms'); для проверки создаваемой задержки const date = Date.now(); let currentDate = null; do { currentDate = Date.now(); } while (currentDate - date < 100); // ждем XXX ms //this.log('End sleep 100ms'); // проверка созданной задержки let rawData =''; require('http').get('http://192.168.2.14/sec/?uart_rx=1&mode=rs485', res => { res.on("data", chunk => { rawData += chunk; }); res.on('end', () => { const arr = rawData.split("|"); //res.resume(); if (rawData.includes('CRC Error')) { this.log('rawData error= '+rawData); rawError.assign("rawError", rawData); return; } else { const volt = Number(arr[5]+arr[6])/10; const tok = Number(arr[7]+arr[8])/100; const watt = Number(arr[9]+arr[10]+arr[11]); const volts = String(arr[5]+arr[6])/10; voltage.assign("volt", volt); //require('http').get('http://192.168.2.14/sec/?pt=29&disp_cmd=1&row=1'); // вывод показаний на OLED //require('http').get('http://192.168.2.14/sec/?pt=29&disp_cmd=1&row=2'); //require('http').get('http://192.168.2.14/sec/?pt=29&disp_cmd=1&row=3'); //require('http').get('http://192.168.2.14/sec/?pt=29&text=String((arr[5]+arr[6])/10)'); current.assign("current", tok); power.assign("power", watt); this.log('getResponse body= '+rawData+ ' Volt='+(arr[5]+arr[6])/10 ); //this.exit(); } }); }); } else { res.resume(); this.log('Return code: '+res.statusCode); rawError("rawError", res.statusCode); voltage.assign("volt", 0); current.assign("current", 0); power.assign("power", 0); //return; } }); // Запрос следующего цикла через 3 сек this.startTimer('T1', 3, 'getMercury'); }, onTimeout() { this.log('Истек таймаут, ответ от megad не получен'); voltage.assign("volt", 0); current.assign("current", 0); power.assign("power", 0); } });