Сценарии - новая версия API
-
Участник @amgstone написал в Сценарии - новая версия API:
Подскажите как можно заблокировать кнопку актора на екране от нажатия во время работы сценария или блокировать по таймеру
Можно использовать команду устройства setBlk
actor1.setBlk(1); // В начале работы - заблокировали // ... actor1.setBlk(0); // В конце - разблокировали
Хотя в документации написано, что работает только для сенсоров , для актуаторов тоже работает. Нужно только установить флаг: Устройство может быть заблокировано
При попытке переключить будет всплывающее окно с сообщением, что устройство заблокировано и управление запрещено.
-
@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 то что надо)))). Спасибо!!!
-
В одном из сценариев не могу избавиться от варнинга:
причем если строку закомментировать, то варнинг перейдет на следующую, а если вставить кусок кода выше, то, соответственно поднимется вверх))) При всем этом сценарий работает правильно. Что с этим можно сделать?
-
@homa
Я ничего не делал. У меня также есть сценарии, где выдает такую же ошибку. Работает и работает, видимо есть ограничение по длине кода.
-
создал сценарий на блок схеме, но в плагине voicecontrol он не видим
-
@amgstone, чтобы он был видим из плагина в нем не должно быть триггера.
-
@Alex_Jet так и сделал, но не удобно делать 2 сценария на одно действие, с тригером и без тригера.
-
@amgstone, это ограничения блок-схем на данный момент. Выше представители intraHouse писали, что их технологии не успевают за детьми)))
-
Подскажите в сценарии как то можна вернуть в предыдущее состояние устройство?
-
У меня проблема, которую я не могу осознать.
Мультисценарий
script({ start(step) { step = Number(step); let newvalue = step; ActUst.setValue(newvalue); } });
И кнопка с дополнительным параметром, запускающим суенарий.
Если дополнительный параметр положительный - все работает.
Если отрицательный - нет.
Отладчик скрипта пишет, что значение актуатору присвоено, а в устройствах оно не меняется.Актуатор по модбасу присоединен к параметру контроллера "температура антизамерзания". Этот параметр содержит значение температуры на улице, ниже которой насос в контуре станет постоянно включенным. Если выше включается/выключается по необходимости, если ниже - всегда гоняет жижу, чтобы не замерзла. Такая функция.
Соответственно, значение может быть от -25 до +5.
Но на 0 и выше скриптом назначается, а на любое отрицательное - нет.Решил сделать другой мультисценарий.
Просто строкуActUst.setValue(-25)
Ошибок нет. Но этот сценарий не отображается в меню "параметры" у кнопки. Перезагрузка IH не помогла.
Если назначаю отрицательное значение напрямую на контроллере - они считываются по модбас, и отображаются в IH. Наоборот - только положительные.
Что за магия?
-
Если управлять этим же скриптом актуатором, не подключенным к модбас, все работает.
-
@Erik, добрый день
Возможно, назначается не тот тип переменной при записи по modbus отрицательных чисел. Посмотрите в отладчике плагина в момент передачи команды на запись. Там должны быть сообщения:Command ..... received. Data: .... // Потом WRITE: unitId =..., FC = 6, address =....