Плагин MegaD



  • Хочу одной кнопкой выключать одновременно выключать несколько нагрузок, создал на мнемосхеме кнопку, в этой ветке нашёл команду которая будет запускаться через кнопку, но пока не удаётся,
    настройки такие
    328_7.jpg
    в отладчике вот это, что можно увидеть где ошибка?

    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();
      }
    });
    


  • Спасибо за подсказку, принцип понял, подправил код под себя, все работает.



  • This post is deleted!


  • Добрый вечер!
    Что то с командами плагина MegaD похоже не все в порядке. Вот сценарий:
    c83f3bb4-b298-4231-b9b9-129ecf371123-image.png
    Вот результат в отладчике:
    9cbd6e93-d8bb-43f3-a219-fd713af68e63-image.png
    Сценарий работу не заканчивает, зависает. Что тут не так?

    И еще вопрос. Как задать интервал таймера например 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);
        }
    });
    

Log in to reply