Сценарии - новая версия API



  • @Alex_Jet:

    Ещё другой вопрос - в новой версии API не предусмотрен "вызов" экрана с нужной мнемосхемой на терминалах, на которых открыт веб-интерфейса системы? Нужно для реализации того же видеодомофона, например, видеоалерта, отображения мнемосхемв системы в которой произошла авария и т.д.

    Да, это тема интересная. Видеоалерты мы планируем сделать.

    Переключение экрана по команде из сценария? Здесь есть вопросы…

    Выдавать на все терминалы? Не всегда это нужно в текущий момент. И разграничение доступа опять же.

    Возможно, лучшее решение - всплывающий алерт, а с него уже переход.

    Всплывающие алерты есть у нас в Scada, наверно добавим их и в Pro



  • @intrapro:

    Да, это тема интересная. Видеоалерты мы планируем сделать.

    Переключение экрана по команде из сценария? Здесь есть вопросы… Выдавать на все терминалы?

    Ок, у Вас же по сути на терминале крутится js-клиент, который имеет связь через сокеты с сервером. И вероятно клиентам сервер присваивает какой-то id (не знаю точно поскольку не освоил сокеты), по нему можно определять на каком терминале сейчас веб-страница активна и куда надо отправить данные. В общем я себе концепцию представляю, но поскольку знаний по фреймворкам недостаточно, то не знаю как это реализуется в коде.
    @intrapro:

    Возможно, лучшее решение - всплывающий алерт, а с него уже переход.

    Всплывающие алерты есть у нас в Scada, наверно добавим их и в Pro

    Было бы хорошо попробовать как это работает. А карты тоже по сути для Scads сейчас или что с ними можно делать в Pro?



  • @Alex_Jet:

    Ок, у Вас же по сути на терминале крутится js-клиент, который имеет связь через сокеты с сервером. И вероятно клиентам сервер присваивает какой-то id (не знаю точно поскольку не освоил сокеты), по нему можно определять на каком терминале сейчас веб-страница активна и куда надо отправить данные.

    Да, вы правы, сервер знает о подключенных активных клиентах.

    В этом и вопрос - переключать экран для всех клиентов? Не всегда это хорошо. Хотя для домашнего применения может и можно …

    Команду для всплывающего алерта добавим в API, по срокам не скажу, но будет.

    @Alex_Jet:

    А карты тоже по сути для Scads сейчас или что с ними можно делать в Pro?

    Сейчас на картах возможно размещение устройств и элементов для индикации и последующей навигации (переходов по объектом)

    Если вы про геолокацию, ее нет 🙂



  • @intrapro:

    Да, вы правы, сервер знает о подключенных активных клиентах.

    В этом и вопрос - переключать экран для всех клиентов? Не всегда это хорошо.

    Да согласен, но если сервер знает о подключенных клиентах, то значит можно адресовать "сообщение" конкретному клиенту? Либо всем, если нужно. Но для этого нужен api.
    @intrapro:

    Команду для всплывающего алерта добавим в API, по срокам не скажу, но будет.

    Это хорошо. Интересно как это выглядит - виджет, размещаемый на экране? А алерты формируются из тех же сценариев?
    @intrapro:

    Сейчас на картах возможно размещение устройств и элементов для индикации и последующей навигации (переходов по объектом)

    Если вы про геолокацию, ее нет 🙂

    Про геолокация понятно что это примерно 2020 год:), если не позже. В общем Роскосмос… :lol:

    Интересует именно что можно сейчас сделать с картой применимо к частному домохозяйству.



  • @Alex_Jet:

    Это хорошо. Интересно как это выглядит - виджет, размещаемый на экране? А алерты формируются из тех же сценариев?

    Да. Всплывающее окно с текстом. Параметры визуализации настраиваются: "Визуализация" -> "Всплывающие окна"

    @Alex_Jet:

    Интересует именно что можно сейчас сделать с картой применимо к частному домохозяйству.

    Получается что ничего 😞



  • Добрый день!

    Подскажите пожалуйста как примерно будет выглядеть сценарий если при изменении состояния триггера необходимо послать команду через http://192.168…. ?



  • @sergeyygr:

    Добрый день!

    Подскажите пожалуйста как примерно будет выглядеть сценарий если при изменении состояния триггера необходимо послать команду через http://192.168…. ?

    Послать на MegaD или абстрактный get запрос?



  • @intrapro:

    @sergeyygr:

    Добрый день!

    Подскажите пожалуйста как примерно будет выглядеть сценарий если при изменении состояния триггера необходимо послать команду через 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



  • @intrapro:

    @intrapro:

    @sergeyygr:

    Добрый день!

    Подскажите пожалуйста как примерно будет выглядеть сценарий если при изменении состояния триггера необходимо послать команду через 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

    Спасибо!



  • @sergeyygr:

    @intrapro:

    @intrapro:

    Послать на 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

    Спасибо!

    А require("http").get в конструкторе есть? Чего то не нашел(



  • @sergeyygr:

    А require("http").get в конструкторе есть? Чего то не нашел(

    В блок-схемах? Там нет.



  • @intrahouse:

    @sergeyygr:

    А require("http").get в конструкторе есть? Чего то не нашел(

    В блок-схемах? Там нет.

    А будет?



  • Нет. Пока не планировали. Хотя подумаем.



  • Подскажите - хочу сделать эмуляцию показаний датчика температуры по изменению показаний реального датчика температуры. Но что-то где-то я делаю не так:

    /** 
    * @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?



  • @Alex_Jet:

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

    > /** 
    > * @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);

    @Alex_Jet:

    И еще момент - почему в "Запуск для устройств" нельзя удалить часть устройств (чтобы они не принимали участие в сценарии)?

    Если устройство не участвует - нужно удалить строки Device. Таблица "Запуск для устройств" строится по ним



  • @intrapro:

    Первым параметром должно быть устройство

    > startOnChange(sen_master, sen_master.isChanged(value));
    > 
    

    Ок, буду знать (правда value пришлось удалить, поскольку скрипты переходили в STOP после запуска и была ошибка "value is not defined"). Это только для аналоговых датчиков или для всех так?

    @intrapro:

    И датчику нельзя напрямую присваивать значение, только через assign

    this.assign(sen_slave, 'value', sen_master.value + 0.1);

    Думал, что setValue сделано специально для этого. Выходит что это только для цифровых/аналоговых актюаторов?

    @intrapro:

    Если устройство не участвует - нужно удалить строки Device. Таблица "Запуск для устройств" строится по ним

    Я понимаю, что таблица строится по ним. Но чем чревато то что мы не выберем какое-то устройство?



  • @Alex_Jet:

    @intrapro:

    Первым параметром должно быть устройство

    > > startOnChange(sen_master, sen_master.isChanged(value));
    > > 
    

    Ок, буду знать (правда value пришлось удалить, поскольку скрипты переходили в STOP после запуска и была ошибка "value is not defined"). Это только для аналоговых датчиков или для всех так?

    Упс, нужны еще кавычки (имя свойства)

    startOnChange(sen_master, sen_master.isChanged('value'));
    
    

    @Alex_Jet:

    @intrapro:

    И датчику нельзя напрямую присваивать значение, только через assign

    this.assign(sen_slave, 'value', sen_master.value + 0.1);
    Думал, что setValue сделано специально для этого. Выходит что это только для цифровых/аналоговых актюаторов?

    Да, это команда set для актуаторов. Смысл в том, что датчик сам себе не может значение установить.

    dimmer.setValue(15) - диммер устанавливает новую яркость, все это проходит через каналы

    но

    this.assign(temp, 'value', 15); - сценарий (this) устанавливает датчику новую температуру принудительно, связь с железом игнорируется

    @Alex_Jet:

    @intrapro:

    Если устройство не участвует - нужно удалить строки Device. Таблица "Запуск для устройств" строится по ним

    Я понимаю, что таблица строится по ним. Но чем чревато то что мы не выберем какое-то устройство?

    В сценарии будет не определен объект, это приведет к ошибке сценария



  • @intrapro:

    Упс, нужны еще кавычки (имя свойства)

    > startOnChange(sen_master, sen_master.isChanged('value'));
    > 
    

    Все равно где-то какой-то косяк! Прописал:

    startOnChange(sen_master, sen_master.isChanged("value"));
    
    

    Но при запуске в ошибках мне пишет - sen_master.isChanged is not a function и, соответственно, принимает состояние STOP.



  • @Alex_Jet:

    Все равно где-то какой-то косяк! Прописал:

    > 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 не работает, только внутри сценария

    Подумаем, как это переделать



  • @intrapro:

    @Alex_Jet:

    Все равно где-то какой-то косяк! Прописал:

    > > 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(...).


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