Плагин MegaD



  • @gis, написал тут. Коллеги, можно вас поправлю - от контроллера приходит GET-запрос (часть HTTP-протокола) с UID ключа, а не php (это такой язык программирования)... в частности у меня приходит вот такой запрос:

    /mod_megad.php?pt=35&ib=123456789ABC
    

    Здесь mod_megad.php - это часть url, который прописан в контроллере (ссылка Config, поле Script). У меня так сложилось исторически, поскольку раньше все контроллеры взаимодействовали с самописной системой управления на основе php/js.



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

    @gis, написал тут.

    @Alex_Jet - спасибо огромное, всегда очень помогают ваши сообщения!
    Хорошо было бы, если бы разработчики добавили обработку GET-запросов от ключей и меток в самом плагине, чтобы присваивался идентификатор ключа/метки аналоговому датчику (устройству). Тогда их просто можно будет использовать в диаграммах сценариев, не изучая для этого js и создавая сценарии с использованием этого языка.



  • @gis, я обсуждал это вместе с разработчиками, но пришли к выводу что сценарии - это очень гибко! А так, тоже хотел чтобы ID ключа передавался, например, аналоговому датчику. Но опять же - где хранить ID ключей и как их сравнивать с нужными? - только в сценарии.
    Ну и хочу добавить, что если вы не знаете Pascal/C/PHP и подобные языки, то JS довольно легко освоить. Ну а с системой, написанной на основе фреймворка Node.js, грех это не сделать, особенно если вы не просто пользователь системы, а ее администратор:)



  • Добрый день!
    Нужно проверить, но присвоить id ключа аналоговому датчику, полагаю, получится:

    1. Создать канал с id='IB1' (любой строковый id) типа AI, привязать к нему датчик
    2. В расширениях прописать:
      Входящее: pt=35&ib=*
      Установить состояние каналов: IB1=%ib%

    В сценарии нужно сравнивать с разрешенными ключами + сбрасывать значение после обработки.

    Решение,которое предлагает @Alex_Jet с вызовом сценария при поступлении сообщения от контроллера, лично мне нравится больше по нескольким причинам:

    1. Запуск сценария жестко связан с получением сообщения от контроллера (то есть с моментом прикладывания ключа).
    2. Список допустимых ключей в одном месте
    3. Нет лишних устройств


  • Уважаемые разработчики. В своем проекте использую несколько контроллеров MegaD-2561. Использую несколько датчиков с i2c интерфейсов. Все работает прекрасно. Задумал подключить к контроллеру Ардуину и управлять ею через i2c API. Однако Andrey_B предлагает для этого библиотеку на РНР. Собственно вопрос. Можно ли как-то послать байт через контроллер на устройство с определенным адресом по протоколу i2c.



  • @int144, так у контроллера есть API для I2C! Собственно от него отталкиваетесь, а на контроллер из iH можно послать что угодно! Например, функция для отправки команд на ленту WS:

        //Функция формирования данных для ленты WS2818
        SendDataToWS2818(plugin, channel, cmd, chip) {
          this.pluginCommand({unit: plugin, command: '/sec/?pt=' +channel+ '&ws=' +cmd+ '&chip=' +chip});
        }
    

    В случае с I2C можно сделать такую функцию:

    SendDataToMegaD(plugin, cmd, data) {
          this.pluginCommand({unit: plugin, command: '/sec/?pt=35&scl=34&i2c_' +cmd+ '=' +data});
        }
    

    Таким образом, чтобы дать команду на отправку данных нужно в скрипте указать:

    script({
      plugin: 'megad1',
      cmd: '',
      data: '',
        
      start() {
        //Инициализация
        this.cmd = 'cmd';
        this.data = 1;
        SendDataToMegaD(this.plugin, this.cmd, this.data);
        
        //Старт
        this.cmd = 'cmd';
        this.data = 2;
        SendDataToMegaD(this.plugin, this.cmd, this.data);
        
        //Отправка данных в hex-виде
        this.cmd = 'send';
        this.data = 80;
        SendDataToMegaD(this.plugin, this.cmd, this.data);
        
        //и т.д.
      } 
    });
    


  • @Alex_Jet , спасибо за быстрый и развернутый ответ. Но у меня есть некотрые сомнения. Вашу функцию управления лентой я видел. Но ее управление поддерживается прошивкой контроллера. Достаточно в http запросе присвоить правильное значение и лента работает. При использовании i2c API в запросе фигурирует "i2c_send=". Эта функция есть в библиотке Andrey_B. Она распределяет данные на адрес и направление передачи, кажется. Поэтому я и засомневался. А Вы не пробовали таким образом передавать данные i2c устройствам, не поддерживаемым прошивкой?



  • @int144, нет, у меня особенных I2C девайсов нет, которые не поддерживаются прошивкой.
    Я же вам привел как минимум половину цикла работы с шиной - инициализация, старт, передача данных! Вы обратите внимание на входные аргументы. Все это можно переписать/объединить в одну большую функцию отправки-приема данных. Думаю, вы это сами сможете сделать, поскольку у меня нет времени на эти эксперименты и эксперименты ни к чему.



  • @Alex_Jet , прошу прощения, что туплю, буду пробовать. Еще раз большое спасибо



  • Здравствуйте! устройство megad-2w (3 шт.). При формировании запроса плагин выдает в дебагере:
    localhost => 192.168.0.14 HTTP GET /sec/?cmd=32A:0&adr=92af39000000.
    а в инcтрукции написано что запрос должен быть : /sec/?cmd=32A:0&addr=92af39000000 (с двумя d);



  • @ted, интересно! У меня тоже выдает так:

    16.01 20:15:36.436 megad1: localhost => 192.168.11.21 HTTP GET /sec/?cmd=35A:1&adr=9a2938000000
    

    При этом канал включается и выключается!!! Хотя в описании написано так - Если к шине подключено несколько модулей, то для включения или выключения всех каналы "А" или "B" всех модулей достаточно исключить из запроса параметр "addr".
    Поэтому раз в команде есть adr, то контроллер его просто не видит...в итоге дает команду общую. А у меня на шине висит всего лишь один MegaD-2W



  • @ted
    Добрый день!
    Да, действительно 😞 Поправили

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



  • У устройства megaD есть режим термостат. Как сделать управление этим режимом.
    Screenshot_3.jpg

    То есть изменять значение в этом режиме по нажатию кнопки. Вверх добавить температуру вниз убавить. Ну и с вашего примера сценария управления тёплыми полами осталось управление.

    Screenshot_2.jpg



  • @cd1room, MegaD сделана так, чтобы без участия сервера с помощью контроллера можно было автономно выполнять какие-либо действия (включение света, управление термостатом и т.п.). Опять же - только в том случае если сервер отключен (по питанию, отсоединен патчкорд) или он по http не отвечает контроллеру! Поэтому все локальные функции контроллера - фактически являются байпасом сервера!
    Считаю, что сервером намного удобнее рулить теми или иными вещами. Например, реализовать тот же термостат используя любой датчик контроллера и любой выход контроллера.
    Хотя функционал "удаленного" изменения уставки термостата заложен его создателем, но не вижу смысла его применения когда для УД используется сервер.
    Вот элементарный мультисценарий, который завязан на уставки температурных датчиков:

    const heater = Device("ActorD", "Нагреватель");
      
    const dt = Device("SensorA", "Датчик температуры", [
      {"name":"hist", "note":"Гистерезис включения/отключения нагревателя, °C", "type":"number", "val":0.15}
      ]);
    const dt_ext = Device("SensorA", "Датчик уличной температуры");
    const dt_ext_rez  = Device("SensorA", "Датчик уличной температуры (резервный)");
    
    startOnChange(dt);
    
    script({
        ust_min: 0,
        ust_max: 0,
        text: "",
        sensor_ext: '',
    
        check() {
          //Определение уставок
          this.ust_min = dt.setpoint - dt.getParam("hist");
          this.ust_max = dt.setpoint + dt.getParam("hist");
          
          //Проверка работоспособности датчика уличной температуры
          //При его неисправности - работаем по резервному датчику
          if(!dt_ext.isError()) this.sensor_ext = dt_ext;
          else this.sensor_ext = dt_ext_rez;
    
          //Проверка основных условий
          return heater.auto && ( heater.isOff()&&(dt.value <= this.ust_min)&&(this.sensor_ext.value < this.sensor_ext.setpoint) || heater.isOn()&&(dt.value >= this.ust_max) );
        },
        
        start() {
          if(heater.isOff()) heater.turnOnSaveAuto();
          else heater.turnOffSaveAuto();
        }
    });
    

    Поле ввода гистерезиса отображается в боковой панели устройства датчика температуры. Датчики уличной температуры используются чтобы не расходовать ресурсы когда на улице жарко, но вы можете сами отредактировать этот сценарий.



  • @intrapro спасибо !



  • @intrapro, очень хочу чтобы вы учли мои выкладки по тем же DS2413 в этом посте. А также допилили чтобы в каналах плагина OFF-состояние для каналов DS2413 отображалось 0, а не "-" как сейчас. И да, почему-то по этим каналам нет "онлайн"данных в столбце "Значение с канала".



  • @Alex_Jet, конечно, мы имеем в виду ваши замечания и предложения!
    Но в данный момент, как Вы знаете, доработка плагинов заморожена. Исправляем только баги, как в предыдущем случае, или функционал, без которого не обойтись.
    Новая версия плагина будет использовать новое API сервера и иерархическую модель каналов.

    И да, почему-то по этим каналам нет "онлайн"данных в столбце "Значение с канала".

    Вот это не понятно. То есть в устройство данные приходят, а в каналах не отображаются?



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

    Вот это не понятно. То есть в устройство данные приходят, а в каналах не отображаются?

    Да, именно так. Включаю канал, но 1 в столбце не появляется (появится только если переключиться на Отладчик/Расширения/Манифест и обратно на Каналы). Выключаю - то же самое, но при этом когда выключено отображается "-".
    Раз все снова будет переписываться (не знал о ваших дальнейших планах по плагинам, ожидаю только пятерку), то можем это считать не критичным багом.



  • @Alex_Jet Тогда как второй вопрос. Как можно по нажатию кнопки добавлять или убавлять температуру как на картинке выше? Нет ли у вас примера?



  • @cd1room, читаем тут. Надо сделать кнопку (button) в веб-интерфейсе, чтобы при нажатии на нее срабатывал выбранный сценарий с параметрами, например, {"ip":"192.168.11.11","act":"up"}

    Создать сценарий с таким кодом (не проверял, написал только что):

    script({
      //Параметры управления
      unit: "megad1",
      port: 24,
      temp: 20,
      max: 50,
      min: 10,
      step: 1,
    
      start(param) {
        const obj = JSON.parse(param);
           
        //Формирование команд управления
        if(obj.ip == "192.168.11.11") {
          if(obj.act == "up") {
            if(this.temp < this.max) this.temp = this.temp + this.step;
            else this.temp = this.max;
          }
          if(obj.act == "down") {
           if(this.temp > this.min) this.temp = this.temp - this.step;
           else this.temp = this.min;
          }
        }
    
        //Отправка команды плагину HTTP
        this.SendCommandToMegaD();
      },
      
      SendCommandToMegaD() {
        this.pluginCommand({unit: this.unit, command: "/sec/?pt=" +this.port+ "&misc=" +this.temp});
      }
    });
    

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