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



  • Выяснил один момент - параметрам актуаторов/датчиков нельзя присваивать в качестве name значение "log"! Иначе при чтении значения данного параметра отобразиться лишь [object Object],[object Object],[object Object],[object Object]...

    Вопрос в другом - как актуатору или датчику из сценария присвоить значение ошибки, чтобы на его значке в вебе отображался индикатор аварии (восклицательный знак в красном треугольнике)? Задача - есть индикатор (актуатор дискретный) постановки на охрану. При его включении (on) проверяем какие значения имеют глобальные константы, если они не в норме, то индикатор выключаем (off) и показываем на нем ошибку.



  • Участник @Alex_Jet написал в Сценарии - новая версия API:

    @intrapro, это просто жесть...я думал что Ваш "блокли" уже имеет достаточный функционал...

    Там до сих пор нет арифметики!!!!
    И при сложной структуре блоков часть выпадает, и не выполняется в скрипте.

    Поэтому учить ребенка придется с синтаксиса. 😞



  • @intrapro, по global переменным сценариев. Можно сделать чтобы значение 0 отображалось как 0, а не "-"? Не хватает возможности описания переменных.



  • Подскажите как можно заблокировать кнопку актора на екране от нажатия во время работы сценария или блокировать по таймеру



  • Участник @Alex_Jet написал в Сценарии - новая версия API:

    Выяснил один момент - параметрам актуаторов/датчиков нельзя присваивать в качестве name значение "log"! Иначе при чтении значения данного параметра отобразиться лишь [object Object],[object Object],[object Object],[object Object]...

    Да, все верно. Каждое устройство имеет свойство log - массив записей журнала.

    Вопрос в другом - как актуатору или датчику из сценария присвоить значение ошибки, чтобы на его значке в вебе отображался индикатор аварии (восклицательный знак в красном треугольнике)? Задача - есть индикатор (актуатор дискретный) постановки на охрану. При его включении (on) проверяем какие значения имеют глобальные константы, если они не в норме, то индикатор выключаем (off) и показываем на нем ошибку.

    Ошибка устройства - это свойство "error". Можно использовать assign.

       if (<ваше условие>) {
              this.assign(sensor, 'error', 0);
       } else {
              this.assign(sensor, 'error', 1);    
       }  
    

    Только надо иметь в виду, что такое прокатит только с виртуальным устройством (в Вашем случае индикатор ведь виртуальный?). Если устройство связано с каналом, то при поступлении данных с канала ошибка будет сброшена.



  • Участник @amgstone написал в Сценарии - новая версия API:

    Подскажите как можно заблокировать кнопку актора на екране от нажатия во время работы сценария или блокировать по таймеру

    Можно использовать команду устройства setBlk

    actor1.setBlk(1); // В начале работы - заблокировали
    // ...
    actor1.setBlk(0); // В конце - разблокировали
    

    Хотя в документации написано, что работает только для сенсоров 🙂 , для актуаторов тоже работает. Нужно только установить флаг: Устройство может быть заблокировано
     actor_blk.png

    При попытке переключить будет всплывающее окно с сообщением, что устройство заблокировано и управление запрещено.



  • @intrapro не совсем так, нужно: нажимаю на актор и пока скрипт не отработал что бы на нажатия на актор не реагировало пока не отработает скрипт.



  • @intrapro, да, он виртуальный! Спасибо, буду понимать что это свойство устройства. А, кстати, у устройства есть 4 индикатора - error, auto...и еще 2. Этими двумя как-то можно рулить?



  • @Alex_Jet Да, это блокировка (свойство blk, операция setBlk) и setpoint - его наверно уже используете



  • @intrapro, для комплиментарности синтаксиса надо сделать actor.setError(0)/actor.setError(1)!



  • Таймер - суть локальная для сценария?
    Т.е можно ли из одного сценария сбросить таймер запущеный в другом сценарии?



  • Пользователь @alesle написал в Сценарии - новая версия API:

    Таймер - суть локальная для сценария?

    Да, верно. Сценарии друг от друга изолированы, таймеры существуют только внутри конкретного сценария

    Т.е можно ли из одного сценария сбросить таймер запущеный в другом сценарии?

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

    Вариант 1. Вместе с основным таймером запустить короткий таймер (1 сек, 0.5 сек), который проверяет какое-то условие, и если нужно - сбрасывает основной таймер (или завершает сценарий)

       start() {
              // что-то делаем   
              // взводим основной таймер на минуту 
              this.startTimer("T1", 60, "onT1");   
             
             // взводим доп таймер на секунду 
             this.startTimer("T2", 1, "onT2");      
      },
    
      onT2() {
           // Что-то проверяем - например общую (глобальную) переменную, которую взведет другой сценарий
          if (global.myFlag)  {
            this.exit();  // Выходим, при этом все таймеры этого сценария сбрасываются
          } else {     
             this.startTimer("T2", 1, "onT2"); // иначе взводим доп таймер заново 
          }      
      },
      onT1() {
             // Основной таймер продержался - что-то делаем....
            this.exit(); // завершаем сценарий
       }      
    }
    

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

    Вариант 3. Если доп. устройство добавлять не хочется, можно добавить дополнительный параметр существующему устройству, слушать события этого устройства, в слушателе проверять, что изменился именно этот параметр:

    if (this.isChanged(dev1, 'myflag', 1)  {
        this.stopTimer("T1");
        //  Не забывать завершать сценарий, так как при наличии слушателя сам он не завершится
        this.exit();
    }
    


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



  • @amgstone, на мнемосхеме можно просто создать элемент "Кнопка" (Button) и в свойствах у нее выбрать - запуск сценария. Однако этот элемент будет отображаться только на мнемосхеме, поскольку в нативном мобильном приложении сейчас отображаются только устройства. Поэтому вам лучше создать устройство на основе "Актуатор универсальный дискретный", вынести его на мнемосхему, в свойствах переключения выбрать Toggle, а в сценарии прописать startOnChange(константа актуатора), чтобы он запускался по каждому изменению состояния актуатора.



  • @Alex_Jet первый вариант сам пробовал но не подошол, кнопка не устройство, а от Toggle то что надо)))). Спасибо!!!



  • В одном из сценариев не могу избавиться от варнинга:
    2554c8a4-7f9e-472c-842a-7dcd38992c69-image.png
    причем если строку закомментировать, то варнинг перейдет на следующую, а если вставить кусок кода выше, то, соответственно поднимется вверх))) При всем этом сценарий работает правильно. Что с этим можно сделать?



  • @homa
    Я ничего не делал. У меня также есть сценарии, где выдает такую же ошибку. Работает и работает, видимо есть ограничение по длине кода.



  • создал сценарий на блок схеме, но в плагине voicecontrol он не видим alt text



  • @amgstone, чтобы он был видим из плагина в нем не должно быть триггера.



  • @Alex_Jet так и сделал, но не удобно делать 2 сценария на одно действие, с тригером и без тригера.


Log in to reply