Сценарии - новая версия API
-
Коллеги! Прошу помощи, что называется нужна "помощь друга". Есть два мультисценария - один привожу тут, у другого - другое название и вместо const act, используется const heat (это отдельная история зачем нужно два одинаковых сценария):
> const act = Device("ActorD", "Актюатор ТП", [ > {"name":"hist", "note":"Гистерезис включения/отключения актюатора, °C", "type":"number", "val":0.15} > ]); > > const dt = Device("SensorA", "Датчик температуры"); > > const script = { > ust_min: 0, > ust_max: 0, > > check() { > //Определение уставок > this.ust_min = dt.defval - act.hist; > this.ust_max = dt.defval + act.hist/2; > //Проверка основных условий > return act.auto && ( !act.dval&&(dt.aval <= this.ust_min) || act.dval&&(dt.aval >= this.ust_max) ); > }, > > start() { > let zone = dt.name.replace("Температура в зоне","Зона"); > > if(!act.dval) { > this.do(act, "aon"); > this.log(zone+ " (" +dt.aval+ ") <= Ust (" +this.ust_min+ "), Act = " +act.dval); //((act.dval == 1) ? "On" : "Off") > } > else { > this.do(act, "aoff"); > this.log(zone+ " (" +dt.aval+ ") >= Ust (" +this.ust_max+ "), Act = " +act.dval); > } > > this.log(act.name+ " = " + act.dval); > } > }; >
В общем на одном сценарии сейчас (код приведен выше) в тестовом режиме работают актюаторы на коллекторах ТП, на другом в реальном времени работают насосы рециркуляции этих коллекторов, которые управляются теми же самыми датчиками температуры… и у меня от лога (см. в конце скрипта this.log) возникает когнитивный диссонанс...:
Журнал_Когнитивный_диссонанс.png
Вот подскажите почему во втором случае при "сработке" датчика температуры Heat = 0 (или Насос ТП1 = 0)??? При этом на мнемосхеме насос включается и если проверить состояние насоса отдельным скриптом:
> const motion = Device("PUMP1"); > > script({ > start() { > if (motion.isOn()) this.log(motion.name+ " = On"); > if (motion.isOff()) this.log(motion.name+ " = Off"); > } > }); > ````, > > то "Насос ТП1 = On"! Как такое может быть? Что я упускаю? Нужно учитывать, что после выполнения команды действие не происходит мгновенно, если только это не виртуальное устройство. Сценарий отправляет команду, но состояние переключится только после feedback-а от железа Поэтому насос в следующей строке после команды просто еще не успел переключиться
-
Нужно учитывать, что после выполнения команды действие не происходит мгновенно, если только это не виртуальное устройство. Сценарий отправляет команду, но состояние переключится только после feedback-а от железа
Поэтому насос в следующей строке после команды просто еще не успел переключиться
Все понял. Спасибо! Как раз так и получается - актюаторы не привязаны к каналам контроллеров, а насосы привязаны. А как в таком случае можно узнать состояние насоса? Сделать опрос по таймеру
или как-то в зависимости от feedback контроллера?
-
Все понял. Спасибо! Как раз так и получается - актюаторы не привязаны к каналам контроллеров, а насосы привязаны. А как в таком случае можно узнать состояние насоса? Сделать опрос по таймеру
или как-то в зависимости от feedback контроллера?
Можно добавить таймер с каким-то адекватным оборудованию интервалом
Можно добавить слушателя, который сработает, когда устройство переключится:
this.addListener(act, ‘onAct’); … }, onAct() { if (this.isChanged(act,’value’)) … // переключилась основное значение (а не авто, например) ... // Здесь уже новое состояние
Можно и то и другое - например,
-
в onAct при нормальном переключении - сбросить таймер (или завершить сценарий this.exit())
-
по таймеру - если переключения не произошло - сделать что-то еще (повторно включить, отправить сообщение и т д)
Все зависит от задачи
Если устанавливаете слушателя - нужно обязательно предусмотреть точку завершения сценария this.exit();
-
-
Ещё другой вопрос - в новой версии API не предусмотрен "вызов" экрана с нужной мнемосхемой на терминалах, на которых открыт веб-интерфейс системы? Нужно для реализации того же видеодомофона, например, видеоалерта, отображения мнемосхемы системы, в которой произошла авария и т.д.
Ну и push-вызовы были бы полезны, но это вероятно только для мобильного нативного приложения, которое находится постоянно в работе в фоне. До его доработки, как я понимаю, ещё далеко.
-
Ещё другой вопрос - в новой версии API не предусмотрен "вызов" экрана с нужной мнемосхемой на терминалах, на которых открыт веб-интерфейса системы? Нужно для реализации того же видеодомофона, например, видеоалерта, отображения мнемосхемв системы в которой произошла авария и т.д.
Да, это тема интересная. Видеоалерты мы планируем сделать.
Переключение экрана по команде из сценария? Здесь есть вопросы…
Выдавать на все терминалы? Не всегда это нужно в текущий момент. И разграничение доступа опять же.
Возможно, лучшее решение - всплывающий алерт, а с него уже переход.
Всплывающие алерты есть у нас в Scada, наверно добавим их и в Pro
-
Да, это тема интересная. Видеоалерты мы планируем сделать.
Переключение экрана по команде из сценария? Здесь есть вопросы… Выдавать на все терминалы?
Ок, у Вас же по сути на терминале крутится js-клиент, который имеет связь через сокеты с сервером. И вероятно клиентам сервер присваивает какой-то id (не знаю точно поскольку не освоил сокеты), по нему можно определять на каком терминале сейчас веб-страница активна и куда надо отправить данные. В общем я себе концепцию представляю, но поскольку знаний по фреймворкам недостаточно, то не знаю как это реализуется в коде.
@intrapro:Возможно, лучшее решение - всплывающий алерт, а с него уже переход.
Всплывающие алерты есть у нас в Scada, наверно добавим их и в Pro
Было бы хорошо попробовать как это работает. А карты тоже по сути для Scads сейчас или что с ними можно делать в Pro?
-
Ок, у Вас же по сути на терминале крутится js-клиент, который имеет связь через сокеты с сервером. И вероятно клиентам сервер присваивает какой-то id (не знаю точно поскольку не освоил сокеты), по нему можно определять на каком терминале сейчас веб-страница активна и куда надо отправить данные.
Да, вы правы, сервер знает о подключенных активных клиентах.
В этом и вопрос - переключать экран для всех клиентов? Не всегда это хорошо. Хотя для домашнего применения может и можно …
Команду для всплывающего алерта добавим в API, по срокам не скажу, но будет.
А карты тоже по сути для Scads сейчас или что с ними можно делать в Pro?
Сейчас на картах возможно размещение устройств и элементов для индикации и последующей навигации (переходов по объектом)
Если вы про геолокацию, ее нет
-
Да, вы правы, сервер знает о подключенных активных клиентах.
В этом и вопрос - переключать экран для всех клиентов? Не всегда это хорошо.
Да согласен, но если сервер знает о подключенных клиентах, то значит можно адресовать "сообщение" конкретному клиенту? Либо всем, если нужно. Но для этого нужен api.
@intrapro:Команду для всплывающего алерта добавим в API, по срокам не скажу, но будет.
Это хорошо. Интересно как это выглядит - виджет, размещаемый на экране? А алерты формируются из тех же сценариев?
@intrapro:Сейчас на картах возможно размещение устройств и элементов для индикации и последующей навигации (переходов по объектом)
Если вы про геолокацию, ее нет
Про геолокация понятно что это примерно 2020 год:), если не позже. В общем Роскосмос… :lol:
Интересует именно что можно сейчас сделать с картой применимо к частному домохозяйству.
-
Это хорошо. Интересно как это выглядит - виджет, размещаемый на экране? А алерты формируются из тех же сценариев?
Да. Всплывающее окно с текстом. Параметры визуализации настраиваются: "Визуализация" -> "Всплывающие окна"
Интересует именно что можно сейчас сделать с картой применимо к частному домохозяйству.
Получается что ничего
-
Добрый день!
Подскажите пожалуйста как примерно будет выглядеть сценарий если при изменении состояния триггера необходимо послать команду через http://192.168…. ?
Послать на MegaD или абстрактный get запрос?
-
Добрый день!
Подскажите пожалуйста как примерно будет выглядеть сценарий если при изменении состояния триггера необходимо послать команду через http://192.168…. ?
Послать на MegaD или абстрактный get запрос?
Если абстрактный, то
const trigger = Device("DEVICE_xx"); startOnChange( trigger); script({ start() { require("http").get(`http://192.168.0.xx/......${ trigger.value}...` ); } });
Если на MegaD, то
const trigger = Device("DEVICE_xx"); startOnChange( trigger); script({ start() { this.pluginCommand({unit:'megad1', command:'/sec/?cmd=7:1;p10;7:0'}); } });
Для MegaD нужен плагин версии не менее 1.1.8
-
-
Нет. Пока не планировали. Хотя подумаем.
-
Подскажите - хочу сделать эмуляцию показаний датчика температуры по изменению показаний реального датчика температуры. Но что-то где-то я делаю не так:
/** * @name Эмуляция изменения температуры * @desc * @version 4 */ const sen_master = Device("SensorA", "Сенсор_Мастер"); const sen_slave = Device("SensorA", "Сенсор_Ведомый"); startOnChange(sen_master.isChanged(value)); script({ start() { sen_slave.setValue(sen_master.value + 0.1); } });
И еще момент - почему в "Запуск для устройств" нельзя удалить часть устройств (чтобы они не принимали участие в сценарии)?
И еще на вашем сайте справа в дереве можно добавить ссылку на примеры скриптов с новым API?
-
Подскажите - хочу сделать эмуляцию показаний датчика температуры по изменению показаний реального датчика температуры. Но что-то где-то я делаю не так:
> /** > * @name Эмуляция изменения температуры > * @desc > * @version 4 > */ > > const sen_master = Device("SensorA", "Сенсор_Мастер"); > const sen_slave = Device("SensorA", "Сенсор_Ведомый"); > > startOnChange(sen_master.isChanged(value)); > > script({ > start() { > sen_slave.setValue(sen_master.value + 0.1); > } > }); >
Первым параметром должно быть устройство
startOnChange(sen_master, sen_master.isChanged(value));
И датчику нельзя напрямую присваивать значение, только через assign
this.assign(sen_slave, 'value', sen_master.value + 0.1);
И еще момент - почему в "Запуск для устройств" нельзя удалить часть устройств (чтобы они не принимали участие в сценарии)?
Если устройство не участвует - нужно удалить строки Device. Таблица "Запуск для устройств" строится по ним
-
Первым параметром должно быть устройство
> startOnChange(sen_master, sen_master.isChanged(value)); >
Ок, буду знать (правда value пришлось удалить, поскольку скрипты переходили в STOP после запуска и была ошибка "value is not defined"). Это только для аналоговых датчиков или для всех так?
И датчику нельзя напрямую присваивать значение, только через assign
this.assign(sen_slave, 'value', sen_master.value + 0.1);
Думал, что setValue сделано специально для этого. Выходит что это только для цифровых/аналоговых актюаторов?
Если устройство не участвует - нужно удалить строки Device. Таблица "Запуск для устройств" строится по ним
Я понимаю, что таблица строится по ним. Но чем чревато то что мы не выберем какое-то устройство?
-
Первым параметром должно быть устройство
> > startOnChange(sen_master, sen_master.isChanged(value)); > >
Ок, буду знать (правда value пришлось удалить, поскольку скрипты переходили в STOP после запуска и была ошибка "value is not defined"). Это только для аналоговых датчиков или для всех так?
Упс, нужны еще кавычки (имя свойства)
startOnChange(sen_master, sen_master.isChanged('value'));
И датчику нельзя напрямую присваивать значение, только через assign
this.assign(sen_slave, 'value', sen_master.value + 0.1);
Думал, что setValue сделано специально для этого. Выходит что это только для цифровых/аналоговых актюаторов?Да, это команда set для актуаторов. Смысл в том, что датчик сам себе не может значение установить.
dimmer.setValue(15) - диммер устанавливает новую яркость, все это проходит через каналы
но
this.assign(temp, 'value', 15); - сценарий (this) устанавливает датчику новую температуру принудительно, связь с железом игнорируется
Если устройство не участвует - нужно удалить строки Device. Таблица "Запуск для устройств" строится по ним
Я понимаю, что таблица строится по ним. Но чем чревато то что мы не выберем какое-то устройство?
В сценарии будет не определен объект, это приведет к ошибке сценария
-
Упс, нужны еще кавычки (имя свойства)
> startOnChange(sen_master, sen_master.isChanged('value')); >
Все равно где-то какой-то косяк! Прописал:
startOnChange(sen_master, sen_master.isChanged("value"));
Но при запуске в ошибках мне пишет - sen_master.isChanged is not a function и, соответственно, принимает состояние STOP.
-
Все равно где-то какой-то косяк! Прописал:
> startOnChange(sen_master, sen_master.isChanged("value")); >
Но при запуске в ошибках мне пишет - sen_master.isChanged is not a function и, соответственно, принимает состояние STOP.
Да, действительно, косяк isChanged тоже (как assign) не является методом устройства, а является методом сценария.
"Метод позволяет определить, явилось ли устройство триггером сценария при текущем запуске: this.isChanged(device)
Возвращает true, если запуск сценария произошел по событию устройства device"
startOnChange(sen_master,this.isChanged(sen_master));
Это сработает, но особого смысла в вашем случае не имеет, так так триггер у вас один.
"Также бывает полезно узнать, какое конкретно свойство изменилось. Для этого нужно передать имя свойства в качестве второго параметра: this.isChanged(temp, ‘value’)" А этот вариант при вызове из startOnChange не работает, только внутри сценария
Подумаем, как это переделать
-
Все равно где-то какой-то косяк! Прописал:
> > startOnChange(sen_master, sen_master.isChanged("value")); > >
Но при запуске в ошибках мне пишет - sen_master.isChanged is not a function и, соответственно, принимает состояние STOP.
Да, действительно, косяк isChanged тоже (как assign) не является методом устройства, а является методом сценария.
> startOnChange(sen_master,this.isChanged(sen_master)); >
Это сработает, но особого смысла в вашем случае не имеет, так так триггер у вас один.
Подумаем, как это переделать
Вроде хотели сделать API легче и понятнее, а в чем-то получилось усложнение… раньше можно было указать только const dt = DeviceT(...).