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



  • @Alex_Jet, ОЧЕНЬ изобретательно и креативно 👍 👍 👍
    И вполне рабочая схема:
    Сформировать команду на основе фразы -> передать команду -> установить слушателя для устройства.
    А когда устройство переключится (сработает слушатель) - отрапортовать о выполнении.

    Единственное тонкое место здесь - если устройство по какой-то причине не ответит, то сценарий зависнет.
    Потому что, устанавливая слушателя, мы оставляем сценарий запущенным. Он ждет события, и не выходит.
    Обычно, параллельно со слушателями, целесообразно устанавливать таймер, чтобы сценарий все же завершился. Типа "не шмогла" 🙂

    Почему в конкретном случае не срабатывает - нужно смотреть. В скрипте garland_porch и garland_garage не определены. Но Вы говорите, что команда на включение уходит, то есть идете по ветке garland_house. Можно посмотреть параллельно в отладчике плагина - что приходит в ответ на команду.
    Но таймер нужен в любом случае: если устанавливается слушатель - нужно предусмотреть и другой выход.



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

    В скрипте garland_porch и garland_garage не определены. Но Вы говорите, что команда на включение уходит, то есть идете по ветке garland_house. Можно посмотреть параллельно в отладчике плагина - что приходит в ответ на команду.
    Но таймер нужен в любом случае: если устанавливается слушатель - нужно предусмотреть и другой выход.

    Да, я иду по ветке garland_house (определение фраз очень точное!). В отладчике плагина megad - действительно не додумался посмотреть......и сейчас понял, что там нечего смотреть! Поскольку управление WS281x хоть и нативное, но одностороннее! Как итог - ответа от контроллера нет, а плагин ждет его. Хотя!!! Опять же - я управляю всего лишь актуатором и косвенно самой лентой. А актуатор в свою очередь завязан на сценарий управления и плагин megad тут не причем! То есть здесь нет отклика именно от актуатора. Мне кажется, что Вы сами можете воспроизвести такую ситуацию.

    С таймером согласен - это "байпас" сценария, правда пока не могу придумать логику чтобы было все по взрослому (если завис слушатель, то сказать "Не смогла", а если не завис, то не говорить "Не смогла"...).

    Сам сценарий еще далек от завершения...знаю как все оптимизировать, но пока не хватает времени. Особенно нет времени разобраться и сделать хороший плагин (двухсторонний обмен по соккету) и чтобы информацию с него можно было обрабатывать в сценарии. А так - уже очень привыкли всей семьей к голосовому управлению))



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

    То есть здесь нет отклика именно от актуатора.

    Если у Вас актуатор виртуальный, то проверьте, что по команде переключается состояние актуатора.

    С таймером согласен - это "байпас" сценария, правда пока не могу придумать логику чтобы было все по взрослому (если завис слушатель, то сказать "Не смогла", а если не завис, то не говорить "Не смогла"...).

    Если не завис, то все OK, сценарий у Вас сразу выходит. То есть говорить ничего не придется.
    Цель таймера - страховка слушателей. При добавлении слушателя просто всегда добавлять таймер (на время отклика*2, например) и по таймеру выходить.

    А так - уже очень привыкли всей семьей к голосовому управлению))

    Да, к хорошему быстро привыкаешь :).



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

    сли у Вас актуатор виртуальный, то проверьте, что по команде переключается состояние актуатора.

    Так я это вижу как в отладчике сценария (ACTORA_GARLAND1_01 on), так и визуально (RGB-лента начинает работать). То же при выключении. Вы не пробовали сымитировать ситуацию?



  • Коллеги, помимо вышеописанного)) Решил ребенка немного научить программировать! А когда это все сразу можно применить на практике - это вообще здорово и особенно увлекает ребенка)))
    Однако я предпочитаю кодить, а ему это просто не реально поскольку только научился немного читать))) поэтому решил начать с объектно-ориентированного программирования, то есть с блок-схем. Начали изучать с нуля. И вот когда сценарий уже стал немного более сложным я сам не смог понять как мне сделать - чтобы или по окончании таймера или по выключению актуатора выключить свет с помощью блока ALL.
    Блок-схема.png

    И да, кстати, считаю что название блоков нужно как-то привести к их названию в дереве. Например, если блок 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, Добрый день!
    Для проверки статуса нужно добавить желтый блок .
    Он добавляется с вкладки Операции : Свойство устройства
    Затем для этого блока выбираете устройство и свойство:
    ex3.png

    В результате логика такая: когда выключится 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); // В конце - разблокировали
    

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

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



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



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



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



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



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


Log in to reply