Сценарии - новая версия API
-
Участник @intrapro написал в Сценарии - новая версия API:
сли у Вас актуатор виртуальный, то проверьте, что по команде переключается состояние актуатора.
Так я это вижу как в отладчике сценария (ACTORA_GARLAND1_01 on), так и визуально (RGB-лента начинает работать). То же при выключении. Вы не пробовали сымитировать ситуацию?
-
Коллеги, помимо вышеописанного)) Решил ребенка немного научить программировать! А когда это все сразу можно применить на практике - это вообще здорово и особенно увлекает ребенка)))
Однако я предпочитаю кодить, а ему это просто не реально поскольку только научился немного читать))) поэтому решил начать с объектно-ориентированного программирования, то есть с блок-схем. Начали изучать с нуля. И вот когда сценарий уже стал немного более сложным я сам не смог понять как мне сделать - чтобы или по окончании таймера или по выключению актуатора выключить свет с помощью блока ALL.
И да, кстати, считаю что название блоков нужно как-то привести к их названию в дереве. Например, если блок ACTION, то в дереве должен называться "Действие", либо наоборот - раз в дереве "Команда устройства", то название блока - COMMAND. Если Команда группе устройств, то COMMAND_ALL.
Update: к OFF актуатора ACTOR_DIMA подключил еще один такой же блок ALL OFF (как на скриншоте выше) - вижу, что скрипт верный, все условия есть. Но почему-то в отладчике нет сработки ACTOR_DIMA при его принудительном выключении через веб!!! Соответственно, лампы не отключаются... В чем может быть проблема?
-
Добрый день, подскажите как в блок-схеме проверить статус устройства, actor в каком положении 0,1...?
-
@Alex_Jet, Добрый день!
К сожалению, пока в блоках такая задача не реализуется, не успевают наши технологии за ребенком
Причина - через блоки не генерируется код для слушателя (addListener)Красный блок - это триггер запуска, проверка isOn/isOff происходит в функции start.
Потом взводится таймер, в этот период выключение лампы обработано не будет, так как сценарий остался активным, но слушателей в нем нет.
Выход - сделать отдельный сценарий: при выключении ACTOR_DIMA => сделать ALL OFF
Но надо иметь в виду, что первый сценарий тоже сделает свою работу, когда таймер досчитает до конца.
-
@amgstone, Добрый день!
Для проверки статуса нужно добавить желтый блок .
Он добавляется с вкладки Операции : Свойство устройства
Затем для этого блока выбираете устройство и свойство:
В результате логика такая: когда выключится LAMP_1_1 (красный блок - триггер), и при этом LAMP2 (желтый блок) включена , то сделать то-то
-
@intrapro, это просто жесть...я думал что Ваш "блокли" уже имеет достаточный функционал раз многие пользователи используют блок-схемы))) Делать два сценария для простой задачи управления светом - это слишком...
-
Выяснил один момент - параметрам актуаторов/датчиков нельзя присваивать в качестве 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); // В конце - разблокировали
Хотя в документации написано, что работает только для сенсоров , для актуаторов тоже работает. Нужно только установить флаг: Устройство может быть заблокировано
При попытке переключить будет всплывающее окно с сообщением, что устройство заблокировано и управление запрещено.
-
@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(константа актуатора), чтобы он запускался по каждому изменению состояния актуатора.