0
Under review

Связь скрипта проекта Сервера и проекта Графики

olegdax 3 months ago updated by Vladimir Ovchinnikov 2 months ago 9

Добрый день.

Есть проект сервера UMC (с KNX драйвером) и проект графики (iPad).

Необходимо по некоторым событиям в KNX обрабатывать действия на сервере, результат отправлять в других переменных в KNX и отображать на панели.

Например, реализовать термостат (простейший) - считывать значение температуры от датчика (из драйвера), сравнивать с пороговым значением, в зависимости от результата записывать состояние реле вентилятора (в драйвер) и менять цвет кнопки на панели.

Получается примерно такой скрипт:

IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value)
{
 switch (name) {
  case "Drivers.iRidium Server.KNX IP Router.Температура":
    temp = value;
    if (temp > 30) {
      IR.GetDevice("iRidium Server").Set("KNX IP Router.Вентилятор", 1);
      IR.GetPage("Page1").GetItem("Label1").GetState(0).FillColor = color1;
    } else if (temp_server < 30) {
      IR.GetDevice("iRidium Server").Set("KNX IP Router.Вентилятор", 0);
      IR.GetPage("Page1").GetItem("Label1").GetState(0).FillColor = color2;
    }
    break;
 }
});
IR.SubscribeTagChange("Drivers.iRidium Server.KNX IP Router.Температура");


Если запускать его в проекте графики, то всё работает. Но когда iPad с графикой "засыпает", эта логика перестает работать.

Если перенести скрипт в проект сервера, то логика будет работать всё время, но как в тогда обеспечить связь  панелью (когда она "проснется")?

Under review

Добрый день.

Сервер может определять подключение панели по событию EVENT_ACCEPT. Если панель заснула, то сервер должен увидеть событие EVENT_RELEASE. Вы хотите с сервера отправлять данные на панель или панель должна инициировать запрос к серверу после пробуждения?

да, я хочу данные с сервера отправлять на панель (когда она активна). Как это можно осуществить? Через какие-нибудь глобальные переменные? 

Когда панель заснула и пробудилась, некоторые состояния уже могли поменяться..

Добрый день.

Если это произвольные данные, то создайте виртуальные фидбэки в серверном проекте, синхронизируйте панельный проект с серверным и по событию EVENT_ACCEPT отправляйте в виртуальные фидбэки значения. Отправить можно число или строку. Если у вас JSON, то преобразуйте его в строку перед отправкой. На панели получайте значение виртуального фидбэка в драйвере iRidium Server и используйте.

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

Спасибо!

А возможно вызвать из скрипта панели функцию скрипта сервера? Или для этого нужно отслеживать состояние виртуальной переменной?

Добрый день.

Лучше делать это через виртуальные каналы/фидбэки. Напрямую вызвать скрипт на сервере нельзя с панели.

Создал в серверном проекте Virtual переменные, например, Tag c именем Tag1 и Channel с именем Channel1.

В проекте панели на Project Device Panel они отображаются как Drivers -> iRidium Server -> Virtual -> Commands (или Feedback)

1) Как обратиться к этим переменным из скрипта проекта панели? А именно записать значение -


IR.SetVariable("Drivers.iRidium Server.Tag1", 12345);


Так?

2) и как отслеживать изменение Virtual переменной (из проекта сервера, например)? Так?


IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value)
{
switch (name) {
  case "Drivers.iRidium Server.Channel1":
  IR.Log(name + ": "+value);

  break;
}
});

IR.SubscribeTagChange("Drivers.iRidium Server.Channel1");

 

Добрый день.

С панели нужно отправлять значение через драйвер iRidium Server.

Отслеживать можно через EVENT_TAG_CHANGE или EVENT_GLOBAL_TAG_CHANGE.

Пример во вложениях.

Block.sirpz

Set.irpz

Спасибо.

Переменные в списке Commands и Feedback должны быть одинаковыми? Или для передачи данных от сервера к панели можно создать только переменную в Feedback (она же Tag на сервере), например tag_1? А для передачи от панели к серверу только Commands (Channels на сервере), например channel_2?

Имя виртуального канала должно совпадать с именем виртуального фидбэка, это нужно для шлюзования. Имя в этой паре может быть любое.