Плагин MegaD



  • Имя скрипта MegaD отправляет в запросе перед отправкой параметров (перед знаком вопроса):

    То есть:
    имя скрипта = megad.php --> запрос будет /megad.php?pt=16
    имя скрипта пустое --> запрос будет /?pt=16

    То есть пустое имя скрипта - это нормальный рабочий вариант



  • Добрый день, можно как то дать запрос на мегу чтобы узнать статус реле, включено или выключено реле? У меня внешние ролокасети на 3 провода (1 общий, 2,3 верх, низ). Хочу что бы Ih помнил статус (последние действие), проверял или реле активно у меня сейчас работает без обратной связи а ето не удобно. У меня реализировано команду устройству.



  • @amgstone

    Создайте кнопку.
    В ней выбирете "команда плагина", выберите свою мегу и напишите эту команду.
    /%pwd%/?cmd=all
    вместо pwd - свой пароль на меге.
    Кнопка будет обновлять состояния всех каналов этой меги.



  • @Erik у маня созданы ACTOR для каждой ролокасети, можно как то чтобы в ACTORе обновлялось состояние, нету описания на эту тему. Чтобы использовать эти значения в сценарии.
    Ну и у меня открытие и закрытие подключено к 2 разных реле через: ```

    this.pluginCommand({unit:'megad3', command:'/258/?cmd='+jalusi.getParam('point_open')+':1;p200;'+jalusi.getParam('point_open')+':0'});
    

    ну и по аналогии закрытие
    Вопрос как мне с 2 реле собрать информацию в одном акторе чтобы видеть последнее состояния с реле, чтобы ІН знал жалюзя сейчас открыта или закрыта, нету обратной связи.

    скрипт

    /** 
    * @name Новый мультисценарий 
    * @desc  
    * @version 4 
    */
    const switch_1 = Device("ActorE","Switch");
    const jalusi = Device("ActorD","Actor",[
        {"name":"point_open", "note":"Пін відкриття", "type":"number", "val":15},
        {"name":"point_close", "note":"Пін закриття", "type":"number", "val":16}
      ]);
    
    startOnChange([switch_1,jalusi]); 
    
    script({
        start() {
          if(this.isChanged(switch_1)){
            this.onSwitch();
          }
          if(this.isChanged(jalusi)){
            this.onJalusi();
          }
        },
        onSwitch(){
          switch(switch_1.value){
              case 0:
                if(jalusi.id === "ACTOR7"){
                  jalusi.on();
                  this.pluginCommand({unit:'megad3', command:'/258/?cmd='+jalusi.getParam('point_open')+':1;p200;'+jalusi.getParam('point_open')+':0'});
                }
                if(jalusi.id === "ACTOR8"){
                  //this.pluginCommand({unit:'megad2', command:'/258/?cmd='+jalusi.getParam('point_open')+':1;p210;'+jalusi.getParam('point_open')+':0'});
                }
                if(jalusi.id === "ACTOR9"){
                  //this.pluginCommand({unit:'megad2', command:'/258/?cmd='+jalusi.getParam('point_open')+':1;p230;'+jalusi.getParam('point_open')+':0'});
                }
              break;
              case 1:
                //this.pluginCommand({unit:'megad3', command:'/258/?cmd='+jalusi.getParam('point_open')+':0;'+jalusi.getParam('point_close')+':0'});
              break;
              case 2:
                if(jalusi.id === "ACTOR7"){
                  jalusi.off();
                  this.pluginCommand({unit:'megad3', command:'/258/?cmd='+jalusi.getParam('point_close')+':1;p200;'+jalusi.getParam('point_close')+':0'});
                }
                if(jalusi.id === "ACTOR8"){
                  jalusi.off();
                  this.pluginCommand({unit:'megad2', command:'/258/?cmd='+jalusi.getParam('point_close')+':1;p210;'+jalusi.getParam('point_close')+':0'});
                }
                if(jalusi.id === "ACTOR9"){
                  this.startTimer('T1', 30, 'turnAllOff');
                }
              break;
            }
            this.log('Жалюзі статус : '+switch_1.value+' '+jalusi.id);
        },
        turnAllOff(){
          jalusi.off();
          this.pluginCommand({unit:'megad2', command:'/258/?cmd='+jalusi.getParam('point_close')+':1;p240;'+jalusi.getParam('point_close')+':0'});
          this.exit();
        },
        onJalusi(){
          //this.log(this.isChanged(jalusi)+' 38 line');
          if(jalusi.isOn()){
            //this.log('jalusi On');
            if(jalusi.id === "ACTOR7"){
              this.pluginCommand({unit:'megad3', command:'/258/?cmd='+jalusi.getParam('point_open')+':1;p200;'+jalusi.getParam('point_open')+':0'});
            }
            if(jalusi.id === "ACTOR8"){
              this.pluginCommand({unit:'megad2', command:'/258/?cmd='+jalusi.getParam('point_open')+':1;p210;'+jalusi.getParam('point_open')+':0'});
            }
            if(jalusi.id === "ACTOR9"){
              this.pluginCommand({unit:'megad2', command:'/258/?cmd='+jalusi.getParam('point_open')+':1;p240;'+jalusi.getParam('point_open')+':0'});
            }
          }else{
            //this.log('jalusi Off');
            if(jalusi.id === "ACTOR7"){
              this.pluginCommand({unit:'megad3', command:'/258/?cmd='+jalusi.getParam('point_close')+':1;p200;'+jalusi.getParam('point_close')+':0'});
            }
            if(jalusi.id === "ACTOR8"){
              this.pluginCommand({unit:'megad2', command:'/258/?cmd='+jalusi.getParam('point_close')+':1;p210;'+jalusi.getParam('point_close')+':0'});
            }
            if(jalusi.id === "ACTOR9"){
              this.pluginCommand({unit:'megad2', command:'/258/?cmd='+jalusi.getParam('point_close')+':1;p240;'+jalusi.getParam('point_close')+':0'});
            }
          }
          this.exit();
        }
    });
    

    а так в админке http://joxi.ru/DmBRwpQSJvnMNm



  • В этом же скрипте после действия присвойте атуатору нужное значение.
    После каждого действия присвоение соответствующего значения.
    Актуатор будет всегда иметь значение, соответствующее последнему действию.



  • версию 1.1.14 убрали?
    Обновление предлагается на 1.1.13 сегодня.
    alt text



  • Участник @Erik написал в Плагин MegaD:

    версию 1.1.14 убрали?

    Версия 1.1.14 была сделана для тестирования и официально еще не публиковалась.
    При желании ее можно взять на гитхабе.



  • Значит это нервное уже.
    А что в ней нового?



  • @Erik можете подсказать что дописать?



  • После открытия
    Actor.On();
    после закрытия
    Actor.Off();

    Вместо Actor - название нужного актуатора.



  • Участник @Erik написал в Плагин MegaD:

    А что в ней нового?

    В версии v1.1.14 изменение только для параметра канала
    "Использовать функцию обработки при получении данных от контроллера"

    Ранее функция была привязана к номеру порта контроллера, теперь - к идентификатору канала, чтобы это работало для расширенных портов (MCP, I2C)

    Сегодня на github планируем выложить версию v1.1.15, в которой будет:

    1. Решение для одновременной сработки датчиков, подключенных к MCP
      (модуль MegaD-16I-XT)

    2. Возможность обработать в сценарии ответ от контроллера для команды pluginCommand

    Также на github выложен список изменений плагина за этот год :
    https://github.com/intrahouseio/intraHouse.plugin-MegaD файл CHANGELOG



  • @intrapro будет реализована обратная связь (pluginCommand) с ролокасетами? То что я так долго ждал?



  • @amgstone, реализовано получение ответа от контроллера в сценарий:

    script({
        start() {
            // Передать запрос на megad1, ответ придет в сценарий (onResponse:'raw')
            this.pluginCommand({unit:'megad1', command:{url:'/sec/?pt=7&cmd=get', onResponse:'raw'}}, 'getResponse');
            // Взвести таймер на случай, если ответа от контроллера нет
            this.startTimer('T1', 3, 'onTimeout');
        },
        
        getResponse(body) {
          // body 
          this.log('getResponse body= '+body);
         // Анализируем body ....
          this.exit();
        },
        
        onTimeout() {
          this.log('Истек таймаут, ответ от megad1 не получен');
          this.exit();
        }
    });
    

    Если это поможет, то да 🙂



  • @intrapro, так в body будет всего лишь "Done". Какой смысл его анализировать? Собственно, тут написал как правильнее сделать @amgstone



  • @Alex_Jet а у Вас ролета подключена к 2 реле, одно на открытие а второе на закрытие?



  • @amgstone, нет - у меня одно выбирает направление, другое подает питание))). Но от этого суть не меняется.



  • @intrapro, даже не представляю какая полезность будет от доработки по п.2...
    А вы мои выкладки тут не анализировали?
    И да - для Формулы расчета входного значения нужно добавить конвертацию типа данных чтобы не писать "Number(value)+2".

    Update: тестируя версию 1.1.14, я на старом форуме в личных сообщениях писал что не работает.



  • Участник @Alex_Jet написал в Плагин MegaD:

    @intrapro, даже не представляю какая полезность будет от доработки по п.2...

    • Во-первых, такой функционал (функция-обработчик для ответа при выполнении pluginCommand ) добавлен в ядре, и при доработке плагинов добавляем всем, тут просто совпало.
    • Во-вторых, можно ведь послать команду на опрос канала, как в примере:
    this.pluginCommand({unit:'megad1', command:{url:'/sec/?pt=7&cmd=get', onResponse:'raw'}}, 'getResponse');
    

    Для выхода контроллер вернет "ON" или "OFF". Можно иногда использовать, если выход постоянно не опрашивать. Или еще какой экзотический запрос. Да, не несущая конструкция, но пригодится

    И да - для Формулы расчета входного значения нужно добавить конвертацию типа данных чтобы не писать "Number(value)+2".

    Это на сервере считается, в релизе нужно будет поправить

    Update: тестируя версию 1.1.14, я на старом форуме в личных сообщениях писал что не работает.

    Не работает функция для подканала? А мы так поняли что работает 🙂 Личка старого форума к сожалению больше не доступна.

    А вы мои выкладки тут не анализировали?

    Конечно, анализировали, спасибо за подробное описание и предложения. Но пока не хочется ничего менять сущностно. Для версии сервера 5.x будем переделывать плагин с использованием иерархических структур.
    Цель последнего изменения - решение для датчиков, подключенных к MCP. Сейчас нет никакой возможности обработать одновременные сработки.



  • Участник @gis написал в Плагин MegaD:

    Подскажите, будет ли доработан плагин для обработки одновременных срабатываний каналов MegaD-16I-XT?
    Подключил датчики движения, там через раз происходят одновременные срабатывания которые не обрабатываются плагином. Периодически опрашивать датчики движения, как вы понимаете, нет ни какого смысла.

    На github выложена новая версия плагина v1.1.15:
    https://github.com/intrahouseio/intraHouse.plugin-MegaD/releases/tag/v1.1.15

    Нужно скачать zip архив и загрузить его:
    Плагины -> меню Command -> Загрузить из .zip файла

    В новой версии плагина в Расширениях добавлен флаг:
    Расширенный порт (одновременная сработка датчиков)

    Все датчики одного порта pt, которые могут сработать одновременно, нужно прописать в одном запросе (обратите внимание, что MCP расширения (ext) нумеруются с 0, а каналы на сервере с 1, т е ext0 - это 32_1 )

    Пример настройки расширений для порта 32:
    Входящее от контроллера:
    /?pt=32&ext0=*&ext1=*&ext2=*&ext3=*&ext4=*&ext5=*&ext6=*&ext7=*

    Установить состояния каналов:
    32_1=%ext0%&32_2=%ext1%&32_3=%ext2%&32_4=%ext3%&32_5=%ext4%&32_6=%ext5%&32_7=%ext6%&32_8=%ext7%

    Расширенный порт: Да

    В результате, например, такого входящего запроса /pt=32&ext1=1&ext7=0 будут присвоены значения 32_2=1 и 32_8=0

    Просьба счастливых обладателей расширенных портов протестировать функционал 🙂



  • Участник @intrapro написал в Плагин MegaD:

    Не работает функция для подканала? А мы так поняли что работает Личка старого форума к сожалению больше не доступна.

    Да, вот посмотрите лог плагина. Обратите внимание на каналы 30 и 33_ff48a6701605 - для обоих включена функция обработки значений (пишем 5 в массив, сортируем, откидываем крайние и вычисляем среднее с округлением до 2-х знаков после запятой).
    Не буду томить - для канала в режиме DSen->1W все работает, а для DSen->1WBUS не работает, то есть при каждом получении значения оно присваивается устройству сразу же.

    25.12 21:45:56.722 megad1: 
    25.12 21:45:56.723 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=30&cmd=get
    25.12 21:45:56.731 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:45:56.731 megad1:  body: temp:4.62
    25.12 21:45:56.924 megad1: 
    25.12 21:45:56.925 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=31&cmd=get
    25.12 21:45:56.932 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:45:56.933 megad1:  body: temp:3.18
    25.12 21:45:56.933 IH: get [ { id: '31', value: '3.18' } ]
    set { ST_SEWERAGE2: { aval: 3.18, err: 0 } }
    25.12 21:45:57.125 megad1: 
    25.12 21:45:57.126 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=32&cmd=get
    25.12 21:45:57.133 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:45:57.134 megad1:  body: temp:1.62
    25.12 21:45:57.135 IH: get [ { id: '32', value: '1.62' } ]
    set { ST_SEWERAGE3: { aval: 1.62, err: 0 } }
    25.12 21:45:57.327 megad1: 
    25.12 21:45:57.328 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=33&cmd=list
    25.12 21:45:57.387 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:45:57.387 megad1:  body: ff48a6701605:4.12;ff779e701604:2.06
    25.12 21:45:57.390 IH: get [ { id: '33_ff48a6701605', value: '4.12' },
      { id: '33_ff779e701604', value: '2.06' } ]
    set { ST_SEWERAGE4: { aval: 4.12, err: 0 },
      ST_SEWERAGE5: { aval: 2.06, err: 0 } }
    25.12 21:46:56.907 megad1: 
    25.12 21:46:56.908 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=30&cmd=get
    25.12 21:46:56.915 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:46:56.916 megad1:  body: temp:4.62
    25.12 21:46:57.109 megad1: 
    25.12 21:46:57.110 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=31&cmd=get
    25.12 21:46:57.117 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:46:57.118 megad1:  body: temp:3.18
    25.12 21:46:57.118 IH: get [ { id: '31', value: '3.18' } ]
    set { ST_SEWERAGE2: { aval: 3.18, err: 0 } }
    25.12 21:46:57.310 megad1: 
    25.12 21:46:57.310 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=32&cmd=get
    25.12 21:46:57.317 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:46:57.318 megad1:  body: temp:1.62
    25.12 21:46:57.319 IH: get [ { id: '32', value: '1.62' } ]
    set { ST_SEWERAGE3: { aval: 1.62, err: 0 } }
    25.12 21:46:57.511 megad1: 
    25.12 21:46:57.511 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=33&cmd=list
    25.12 21:46:57.571 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:46:57.571 megad1:  body: ff48a6701605:4.12;ff779e701604:2.06
    25.12 21:46:57.573 IH: get [ { id: '33_ff48a6701605', value: '4.12' },
      { id: '33_ff779e701604', value: '2.06' } ]
    set { ST_SEWERAGE4: { aval: 4.12, err: 0 },
      ST_SEWERAGE5: { aval: 2.06, err: 0 } }
    25.12 21:47:57.090 megad1: 
    25.12 21:47:57.092 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=30&cmd=get
    25.12 21:47:57.097 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:47:57.098 megad1:  body: temp:4.56
    25.12 21:47:57.292 megad1: 
    25.12 21:47:57.292 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=31&cmd=get
    25.12 21:47:57.300 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:47:57.300 megad1:  body: temp:3.18
    25.12 21:47:57.301 IH: get [ { id: '31', value: '3.18' } ]
    set { ST_SEWERAGE2: { aval: 3.18, err: 0 } }
    25.12 21:47:57.492 megad1: 
    25.12 21:47:57.493 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=32&cmd=get
    25.12 21:47:57.500 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:47:57.501 megad1:  body: temp:1.62
    25.12 21:47:57.501 IH: get [ { id: '32', value: '1.62' } ]
    set { ST_SEWERAGE3: { aval: 1.62, err: 0 } }
    25.12 21:47:57.694 megad1: 
    25.12 21:47:57.694 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=33&cmd=list
    25.12 21:47:57.754 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:47:57.755 megad1:  body: ff48a6701605:4.12;ff779e701604:2.06
    25.12 21:47:57.756 IH: get [ { id: '33_ff48a6701605', value: '4.12' },
      { id: '33_ff779e701604', value: '2.06' } ]
    set { ST_SEWERAGE4: { aval: 4.12, err: 0 },
      ST_SEWERAGE5: { aval: 2.06, err: 0 } }
    25.12 21:48:57.273 megad1: 
    25.12 21:48:57.273 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=30&cmd=get
    25.12 21:48:57.281 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:48:57.281 megad1:  body: temp:4.56
    25.12 21:48:57.285 IH: get [ { id: '30', value: '4.60' } ]
    set { ST_SEWERAGE1: { aval: 4.6, err: 0 } }
    25.12 21:48:57.474 megad1: 
    25.12 21:48:57.475 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=31&cmd=get
    25.12 21:48:57.482 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:48:57.483 megad1:  body: temp:3.18
    25.12 21:48:57.484 IH: get [ { id: '31', value: '3.18' } ]
    set { ST_SEWERAGE2: { aval: 3.18, err: 0 } }
    25.12 21:48:57.676 megad1: 
    25.12 21:48:57.676 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=32&cmd=get
    25.12 21:48:57.683 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:48:57.684 megad1:  body: temp:1.62
    25.12 21:48:57.685 IH: get [ { id: '32', value: '1.62' } ]
    set { ST_SEWERAGE3: { aval: 1.62, err: 0 } }
    25.12 21:48:57.877 megad1: 
    25.12 21:48:57.877 megad1: localhost => 192.168.11.21 HTTP GET /sec/?pt=33&cmd=list
    25.12 21:48:57.936 megad1: localhost <= 192.168.11.21  response: statusCode=200 contentType = text/html
    25.12 21:48:57.937 megad1:  body: ff48a6701605:4.12;ff779e701604:2.06
    25.12 21:48:57.938 IH: get [ { id: '33_ff48a6701605', value: '4.12' },
      { id: '33_ff779e701604', value: '2.06' } ]
    set { ST_SEWERAGE4: { aval: 4.12, err: 0 },
      ST_SEWERAGE5: { aval: 2.06, err: 0 } }
    

    Но есть нюанс...вот такая функция для DSen->1WBUS вроде работает, поскольку ошибочных значений на графиках нет совсем, и датчики в ошибку не вываливаются:

    function (val, depo)
    {  if(val > 100) return; //Проверяем значение - если ошибочное то выходим
       else return val;        //Иначе возвращаем значение
    }
    

    Функция усреднения такая:

    function (val, depo)
    {  var result;
    
       if (!depo.res) depo.res = [];
       depo.res.push(val);
    
       if (depo.res.length < 5) //Нужны еще измерения, значение не возвращаем
       return;
       else
       { depo.res.sort();
         result = ((depo.res[1] + depo.res[2] + depo.res[3]) / 3).toFixed(2);
       }
    
       depo.res = []; //Перед следующими измерениями сбрасываем массив
       return result; //Возвращаем значение
    }
    

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