Category: ремонт

Category was added automatically. Read all entries about "ремонт".

Сценарии, начало.

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

  Итак, выбираем в меню 'Настройка сценариев'.


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


Создаем группу.
  Изначальное состояние группы - заблокировано, это означает, что контроллер не будет выполнять сценарии внутри этой группы. Рекомендую снять галку только после описания всех сценариев группы.
Объединение сценариев в группы имеет больше тематический характер, хотя есть и особенность, ведь группу можно включать и отключать(а также можно создать сценарий который будет выполнятся при этих действиях).
Этим можно воспользоваться, к примеру, занести в группу 'Сигнализация' все сценарии отвечающие за контроль дверей и прочее. Ну или скажем создать группу содержащую сценарии имеющие отношение ко временам года(хотя в самих сценариях можно указать периоды работы, например определенные месяцы).
  На этой форме, как и на предыдущей, есть кнопки стандартных действий: добавить, удалить, редактировать, обновить и клонировать. Последняя позволяет быстро сделать копию сценария.
  Также, внизу формы, есть кнопка 'Активировать изменения'. Эта кнопка передает все ваши текущие наработки в данной группе на сервер(или контроллер). До нажатия этой кнопки все изменения хранятся только на данной форме.


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

Создаем сценарий.
  Стандартный заголовок, опять же галка 'заблокировать', имя и комментарий(который можно не заполнять).
Далее идут блоки:
1) Причина запуска - описывает причину запуска, т.е. при каких условиях контроллер приступит к анализу данного сценария.
2) Внешние факторы - по сути это дополнительные условия, которые могут влиять на выполнение сценария, например отменить его анализ или заставить контроллер проигнорировать другие условия(например период действия).
3) Период действия - по сути, это фильтр, позволяет указывать когда разрешать дальнейший анализ сценария.
4) Условие - здесь мы можем задать различные условия на базе показаний от устройств, которые также повлияют на дальнейший анализ сценария.
5) Информирование - а это уже исполнительная часть, ее выполнит контроллер только если предыдущие условия это позволили. Здесь мы можем сказать системе что сообщать и куда сообщать.
6) Управление - тоже исполнительная часть, заключительная. Здесь мы можем указать различные действия, например послать команду конечному исполнительному устройству, или запустить другой сценарий на другом контроллере, или выполнить внешний скрипт на машине где запущен контроллер.


  Теперь детально:
Причина запуска:
1) Запуск группы сценариев - будет запущен при снятии галки 'заблокировать' данной группы. Это полезно, если необходимо при включении группы выполнять ряд действий, например послать всем устройствам управления команду 'вкл'.
2) Только системный вызов - означает что данный сценарий может запустить только другой сценарий.
3) В назначенное время - можно указать время(часы и минуты) когда требуется запустить сценарий, при этом можно указать время для повторного запуска. Контроллер будет выполнять повторы, скажем если было задано время запуска 00:00 с повтором каждый час, а текущее время создания данного сценария скажем 13:45. Т.е. запуск будет выполнен в 14:00, 15:00 и .т.д.


4) Обновление показания устройств - анализ сценария будет запущен когда обновятся данные показаний участвующих в анализе(блок 'Условие')
5) Нажатие виртуальной кнопки - в конструкторе(редактор проекта) можно добавить виртуальную кнопку. Здесь можно описать эту кнопку, таким образом можно запускать сценарий нажатием кнопки устройства в клиенте.


6) Написана/произнесена фраза - запуск осуществляется когда с точки управления(Телеграм, Алиса и прочее) поступает фраза. Здесь выполняется ее анализ. Также можно задать фразу которую получит пользователь в ответ.


7) Случайно - запуск сценария осуществляется случайно, проверка раз в минуту, здесь требуется указать вероятность(1/100 - вероятность 1 раз в 100 минут) т.е. для вероятности раз в две минуты нужно указать 50/100 или 1/2.


8) События от устройств - некоторые устройства могут посылать специальные события, по которым контроллер запускает сценарий.


9) Смена состояния контроллера - здесь речь о соединении с сервером, можно запускать сценарий при успешно
установленном соединении или при недоступности сервера. Также можно указать время ожидания.


10) Смена состояния устройства - аналогично предыдущему, но здесь также можно определять перезагрузку для некоторых устройств.


11) Остановка группы сценариев - аналогично первому пункту, но здесь срабатывает сценарий когда мы ставим галку 'заблокировать'

Внешние факторы
  Сейчас здесь только один элемент - Блокиратор, он похож на причину запуска - нажатие виртуальной кнопки. Создаем в конструкторе устройство с кнопками, здесь его указываем и указываем необходимую кнопку. При включенной кнопке анализ сценария будет продолжен. Этот функционал еще сырой и будет немного переделан.


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


3)  В течении периода(расширенная форма) - здесь используется методика планировки задач в crontab. Мы можем указать время, дату и дни недели в течении которых будет продолжен анализ. Используется логическое и. Т.е. если время или дата или день недели не попадает под условие то анализ будет прерван. В полях день, месяц и год можно использовать разделитель ',' и диапазон(через '-'). При наведении на поле появится подсказка.


  Условие
  Пожалуй это самый сложный блок. В нем два элемента 'По показаниям устройств (логическое 'И')' и 'По показаниям устройств (логическое 'ИЛИ')'. Т.е. для успешного анализа, условия правил внутри блока должны быть или все истинны или истинно хотя бы одно соответственно.
  Далее видим кнопки:
  1) Добавить формулу - используется если нам нужно сделать какое-то вычисление на базе показаний в добавленных правилах или констант.
  2) Разрешает повторное выполнение сценария, если мы получили событие от устройства, даже если сам снимок показаний не изменился. Актуально для таких устройств как инфракрасный датчик для ИК пультов. Он может принять одинаковую последовательность данных, что должно быть интерпретировано как еще одна команда.
  3) Разрешает выполнение сценария при первом показании. После запуска контроллера или изменении в проекте существует ситуация, при которой старого значения показания нет, а оно нужно для анализа сценариев. Т.е. анализ выполняется только при изменении показания, отсутствие старого показания не означает, что само показание изменилось. Включенная кнопка означает, что контроллер будет считать, что показание все же изменилось.
  4) Блокировка частого выполнения сценария. Существует внутренний триггер, который после успешного выполнения сценария защелкивается и не позволяет повторное выполнение до тех пор, пока сценарий не пройдет анализ. Таким образом, к примеру,  Вы не будет получать одно и тоже сообщение каждый раз когда контроллер выполнит один и тот же успешный сценарий. Отключение кнопки отключает анализ триггера.
  5) Кнопки + и -  позволяют добавлять правила и удалять выбранное правило.


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


  После выбора появился элемент списка с нашим устройством и внутренним списком условий. Который состоит из номера, названия показания, условия, значения(может иметь разный вид в зависимости от типа показания и условия) и кнопки '+'. Последующие элементы списка имеет кнопку '-', для удаления текущего элемента. Добавление новых элементов осуществляется кнопкой '+' первого элемента(первый элемент удалить нельзя, но можно удалить элемент верхнего уровня).


  Далее. Здесь мы выбираем нужное показание, указываем условие и значение этого условия(можно также указывать диапазоны и пороги).
  Порог нужен для описания работы еще одного триггера - локального триггера для каждого условия. Работает схоже с триггером описанным ранее. Его задача также не допускать повторной отработки сценария.
Принцип следующий. Он срабатывает, когда значение показания достигло указанного условия, т.е. условие истинно только при первом анализе, даже если при повторном значение также достигло указанного условия. Сброс триггера выполняется только тогда, когда показание отклонилось в обратную сторону с учетом дельты в указанный период.
  Т.е. если мы создали условие на температуру больше 20 с порогом в 1, то триггер будет установлен при температуре больше 20 и снят при температуре меньше(20-1).

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


  Таким образом данный функционал позволяет выстраивать цепочки логического 'И' или 'ИЛИ' с любым набором устройств и с любым набором условий для каждого устройства. А также можно добавлять формулы.


Информирование
1)  Никому - блок просто игнорируется
2)  Только мне - информирование будет выполнено только автору сценария
3)  Группе - информирование будет выполнено только для участников группы(пока не реализовано)
4)  Всем - всем в проекте, кто может получать информирование

  Форма для всех типов выглядит одинаково.
  Верхняя часть элементов:
  1)   Метка - в клиенте будет подсвечено красным показания присутствующие в условиях блока 'Условие'
  2)  Сообщение - сообщение будет выведено посредством клиента.
  3)  Телеграм - сообщение получат все пользователи с точкой входа 'Телеграм'
  4)  Эл. почта - аналогично, но для эл. почты.
  5)  СМС - аналогично, но для смс(пока не реализован шлюз, смс стоят денег)
  6)  Звук - на контроллере будет проигран звуковой файл.


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

Управление
1) Не управлять - игнорируем данный блок
2)  Управлять устройствами - здесь мы можем добавить несколько устройств, команды которых мы планируем выполнить.
3)  Запуск сценариев - аналогично, здесь мы добавляем сценарии, который планируем выполнить.
4)  Остановка сценариев - аналогично для остановки. На данный момент остановка нужна только для проигрывания звукового файла.
5)  Запуск внешнего скрипта - bash команда или файл выполняется на стороне контроллера
6)  Здесь можно выбрать сценарий, который не принадлежит текущему контроллеру. Т.е. текущий сценарий будет проанализирован скажем на контроллере А, а выполнен сценарий на контроллере Б.



Пример использования
  Это тестовый набор сценариев, обычного термореле(теплый пол). Задача - включать обогрев при температуре меньше или равно 35 градусам и выключать при температуре больше либо равно 36 градусам.

Первый, на включение обогрева.


Второй, на выключение обогрева.



  Заключение
  В общих чертах вроде бы все описал. Конечно есть множество деталей. Но не думаю, что на практике они будут иметь большое значение. Разве только в каких-нибудь очень сложных проектах, однако такой подход я считаю не совсем корректным. Если решение сложное, его должно выполнять специализированное, цельное решение(конечное устройство) а не набор из многих.
  И потом, можно было бы сделать скрипты, которые позволили бы реализовывать более гибкие решения,но на текущем этапе я не сталкивался с задачами, которые нельзя было бы описать здесь без скриптов.

update: добавил картинки