Плагин MegaD



  • @rodik В настоящее время занимаемся движком плагинов. В том числе для Меги.
    Как закончим, опубликуем и сообщим.



  • Подскажите как правильно настроить выключатели, для MegaD-328 + реле.

    1. Установил плагин и запустил
    2. Создал устройства розетки
    3. Создал каналы для розеток
    4. Сделал экран, мнемосхему и привязал выходные каналы.

    Всё работает с планшета как положено, но не работают физические кнопки по управлению выходными каналами, если отключаю Мегу от интернета, тогда работают.

    1. Создал устройства выключатели
    2. Добавил новые каналы как входы.

    Кнопки также не работают

    1. Добавил в расширениях с разными вариантами команд

    Кнопки не работают.
    Какие действия неправильные?
    328_0.jpg 328_1.jpg 328_2.jpg 328_3.jpg



  • В вебе меги прописан сервер и порт?



  • @thunder_d 328_4.jpg
    дело в том что с планшета всё работает
    328_5.jpg



  • Это сообщение удалено!


  • всё, разобрался, для того чтобы работали физические кнопки,
    нужно было прописать скрипт.
    328_6.jpg



  • Хочу одной кнопкой выключать одновременно выключать несколько нагрузок, создал на мнемосхеме кнопку, в этой ветке нашёл команду которая будет запускаться через кнопку, но пока не удаётся,
    настройки такие
    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();
      }
    });
    


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



  • Это сообщение удалено!


  • Добрый вечер!
    Что то с командами плагина 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);
        }
    });
    

Авторизуйтесь, чтобы ответить