Вся дальнейшая писанина - это мое сугубо личное восприятие данного аспекта. Информация изложенная ниже не претендует на 100% достоверность, но на данный момент я думаю, что она недалека от истины.И так давайте попробуем дать определение понятию flow(далее сценарий).Сценарий - это инструмент Athom Homey (далее AH), который позволяет нам с вами заставить наш умный дом (далее УД), анализировать состояния. Проверять условия и совершать действительно "умные" действия, которые зависят от множества факторов и могут выполняться как поодиночке, так и группами.Теперь давайте попробуем вспомнить как выглядит интерфейс написания сценария в AH и разделим его на три части.
Итак, наши три части:
- СОБЫТИЕ
- УСЛОВИЕ
- ДЕЙСТВИЕ
СОБЫТИЕ (Event/Trigger)
Событие - это то, что случается или происходит в экосистеме нашего УД и запускает наш сценарий. Более понятно объяснить, что такое событие помогут примеры.
- Изменилась температура на кухне.
- Включился свет в коридоре.
- Сработала сигнализация.
- Обнаружена протечка в ванной.
- Нажата кнопка.
Каждый сценарий может содержать только ОДНО событие которое и активирует данный сценарий (вообще сценарий может активировать не только событие, но и другой сценарий, но об этом поговорим позже).
УСЛОВИЕ
Условие - это обстоятельство от которого зависит какая ветка действий будет выполнена, основная или альтернативная. Также условие пожалуй самая сложная для новичков часть сценария, поэтому на данной теме остановимся поподробнее.Весь блок условий, который состоит из основного и альтернативных блоков условий, может давать только один результат ИСТИНА или ЛОЖЬ. Если после блока условий мы имеем ИСТИНУ, то выполнится основной блок действий, если ЛОЖЬ, то альтернативный.Блок условий может состоять из одного блока основных условий и множества блоков альтернативных условий, а также вообще быть пустым.В свою очередь каждый из блоков условий может содержать от одного до нескольких условий.Каждый из основных и альтернативных блоков на выходе дает ИСТИНУ или ЛОЖЬ, а их совокупность окончательный результат всего блока условий.Основной блок условий имеет заголовок (...and...), а альтернативный заголовок (...or...).Каждый из блоков условий содержит в себе условия. Если все условия выполняются, то на выходе данного блока будет ИСТИНА. Если хоть одно из условий не выполняется, то на выходе блока будет ЛОЖЬ. Если основной блок условий ИСТИНА ИЛИ хоть один из альтернативных блоков ИСТИНА, то весь блок на выходе даст ИСТИНУ. Если все блоки условий пусты, то результат тоже будет ИСТИНА. Если основной блок условий дает ЛОЖЬ, а альтернативных блоков нет или они все дают ЛОЖЬ, то на выходе мы получим ЛОЖЬ. Проще всего для понимания отталкиваться от значения ЛОЖЬ. Весь блок даст значение ЛОЖЬ только в двух случаях:
- Есть только основной блок и он ЛОЖЬ.
- Все блоки ЛОЖЬ.
Итак, примеры в картинках.
За условия возьмем люстры в гостиной, кухне и спальне. (Все люстры включены).
ИСТИНА
ЛОЖЬ
Зачем же вообще нужны альтернативные блоки условий? Вот вам пример.Допустим вы хотите включать вентилятор в ванной, если в ванной зажгли свет. В основном блоке условий вы проверяете горит ли в ванной свет и, если это ИСТИНА, включаете вентилятор. Но например, вы также хотите, чтобы вентилятор в ванной включался при повышении влажности независимо от того, есть ли в ванной свет или нет. И вот тут вы задаете альтернативное условие проверки уровня влажности и, если оно - ИСТИНА, то вентилятор включается в любом случае. В данном примере стоит абстрагироваться от того, что же является событием для запуска нашего сценария и какие блоки выполнения существуют. Главное в этом примере - это понимание того как работают блоки условий.Условия могут быть как простыми, так и очень сложными (с использованием математических и логических операций, меток и переменных).
ДЕЙСТВИЕ
Действие - это собственно и есть то, чего мы пытались добиться нашим сценарием (включить свет или опустить экран проектора). Блок действий делится на основной и альтернативный (может отсутствовать).
Основной блок действий выполняется если блок условий вернул ИСТИНУ, а альтернативный если получена ЛОЖЬ. Например в блок условий мы поставили проверку датчика движения и, если движение есть, то включаем свет, а если нет - то выключаем.Хочу напомнить, что ни один сценарий не начнет ничего проверять и выполнять, пока его не запустит СОБЫТИЕ или другой сценарий.Любой блок действий может содержать одно или несколько действий. Следует отметить, что гарантировать порядок выполнения действий одного блока не может никто. Единственное, что можно гарантировать, так это порядок запуска действий на исполнение. Это связано с тем, что каждое действие запускается на исполнение в отдельном потоке (в нашем понимании - это многозадачность). Действие запущенное на исполнение первым не всегда выполнится раньше действия запущенного вторым или третьим. Однако инструменты нашего сценария позволяют нам запускать действие с отсрочкой выполнения, тем самым мы можем искусственно задавать порядок выполнения запуская действия, которые должны выполниться с отсрочкой.
Как вы видите в правом верхнем углу карточки есть часики, нажав на которые вы можете установить отсрочку выполнения.Однако, отсрочка выполнения не отменяет действие, даже если сценарий, из которого оно было вызвано, запустился заново и данная ветка действий по условию не выполнилась. То есть, все действия, которые были запущены, обязательно выполнятся без каких либо исключений.В заключение первой части - пример самого простого сценария.
Часть вторая. Сценарии для кофейников.
Итак, надеюсь первая часть получилась не очень сумбурной и сложной для понимания. Во второй части будут не совсем структурированные данные о том, что может понадобиться для написания более сложных сценариев. В общем, все о чем я вспомню пока пишу данную статью, тут и появится.
Метки (Tags)
МЕТКИ - Характеристики наших умных устройств. Располагаются они в верхней части меню сценариев.
Очень часто в написании сценариев нам необходимо получать данные с устройств, и не просто приблизительную информацию о том больше ли 20 градусов температура в спальне, а конкретное значение этой самой температуры. Это, например, может понадобится для сценария "Состояние дома". Вот тут нам на помощь и приходят метки. Метки можно использовать в любых полях условий и действий куда их можно перетащить мышкой. Во вкладке меток вы сможете найти все ваши устройства и некоторые системные параметры (дата, время и пр.), которые вы сможете использовать в своих сценариях.
Создание сложных сценариев
Для расширение стандартных возможностей сценариев могут использоваться дополнительные плагины, такие как:
Virtual Devices - создание виртуальных устройств.Better Logic - расширение логических операций.CountDown - создание таймеров.Telegram Bot - прием и отправка сообщений в Telegram.HomeKit - к сценариям не имеет ни какого отношения, но не мог же я не написать про столь полезный плагин для нашего умного дома. )))
Здесь указаны самые полезные плагины, которые существенно расширяют возможности написания сценариев.
ЗАПУСК СЦЕНАРИЕВ ИЗ ДРУГИХ СЦЕНАРИЕВ
Как и было обещано выше, расскажу вам о том, как запускать сценарии из других сценариев.Для чего это может понадобиться? Вот например, вы написали сценарий по условию которого у вас должен выполниться альтернативный блок действий, но вам, в силу обстоятельств, нужно опять выполнить проверку и разделить этот блок на два блока выполнения, и вот тут без дополнительного сценария не обойтись. Допустим данный сценарий мы назовем Дополнительный сценарий
Далее данный сценарий создается по обычным правилам.Теперь в нашем сценарии, в котором нам необходимо создать дополнительные условия поверки альтернативного(можно и основного) блока выполнения, мы используем следующий вызов.
Вот таким хитрым действием мы можем создать дополнительную ветку условий (if then else). Наша дополнительная ветка условий взята в скобки в следующей строке.
if... then... else (if...then... else...)
Так как эта часть уже не для новичков, то я позволил себе немного программистских штуковин.
ВРЕДНЫЕ СОВЕТЫ
Итак подходят к концу мои мысли, а если точнее утомился писать. Столько букв давно себе не позволял. В заключении хотелось дать пару советов.Не преумножайте сущности без необходимости. Старайтесь писать простые сценарии или вообще их не писать, если можно обойтись аппаратными средствами модулей УД.Берегите свои устройства и старайтесь развязывать их гальванически. То есть используйте дополнительные реле. И пусть они горят от нагрузки, зато ваши бесценные фибары не будут залипать и прослужат вам дольше. Написав сложный сценарий подождите недельку, а потом удалите его и напишите заново. Скорее всего у вас получится короче и быстрее.Не будте "бяками", соберитесь и тоже напишите статейку ради "общего дела". А теперь вишенка на торте (гнилая) ))).Давайте представим себе самый простой сценарий управление освещением на базе датчика движения.У вас получилось так как на картинке?
Если да, то вы молодец, но не супер молодец. Всегда думайте о том, что происходит в экосистеме. А вдруг, на момент когда должно произойти действие, оно уже не нужно? То есть, датчик движения должен погасить свет, а он уже не горит (вы вручную его выключили). Зачем тогда забивать радиоканал лишними сигналами на выключение. Не поленитесь сделать проверку на необходимость выполнения действия.
Вот такая небольшая модификация позволит вам снизить нагрузку на вашу сеть (z-wave или zigbee).
С вами был Я. И да прибудет с вами сила.
До новых встреч. Хотя скорее всего их будет не много, уж больно лениво писать. )
Очень нужная статья, спасибо за этот нелёгкий труд ;)
Огромнейшее спасибо за статью!!!
Очень понравилась статья
Отличная статейка, подобного мануала очень и очень не хватало в эко системе УД. Спасибо за статью!!!
Спасибо.
круто большое спасибо
доступно и лаконично
Отлично, очень жду побольше примеров использования сложных flow, наверняка нынешние 3 Flow как сделать из датчика движения датчик присутствия можно было в 2 а то и один Flow уложить.
На вскидку пока ничего в голову не приходит. Ваш кейс достаточно удачный. Если придумаю что-нибудь то напишу.
спасибо большое! Есть пожелание от новичка, побольше примеров ваших слов. »Для чего это может понадобиться? Вот например, вы написали сценарий по условию которого у вас должен выполниться альтернативный блок действий, но вам, в силу обстоятельств, нужно опять выполнить проверку и разделить этот блок на два блока выполнения, и вот тут без дополнительного сценария не обойтись.» распишите плиз на простом жизненном примере.
тоже самое, покажите сценарий, чтобы можно было проверить себя все ли правильно понял.
Допустим вы хотите включать вентилятор в ванной, если в ванной зажгли свет. В основном блоке условий вы проверяете горит ли в ванной свет и, если это ИСТИНА, включаете вентилятор. Но например, вы также хотите, чтобы вентилятор в ванной включался при повышении влажности независимо от того, есть ли в ванной свет или нет. И вот тут вы задаете альтернативное условие проверки уровня влажности и, если оно - ИСТИНА, то вентилятор включается в любом случае. В данном примере стоит абстрагироваться от того, что же является событием для запуска нашего сценария и какие блоки выполнения существуют. Главное в этом примере - это понимание того как работают блоки условий.
Статья супер! Хочется ещё побольше примеров работы готовых сценариев. Вот например, датчик движения и датчик двери, как их объединить чтобы без облома полежать в ванной не особо двигаясь? Была статья на основе только открытия закрытия двери, но что делать если дверь закрывают редко?
Поставьте задачу. Например: я зашел, датчик сработал свет включился, потом ... и тд. Опишите весь процесс вашего лежания в ванной (без фото только) =))
вот кстати вопрос про flow - его всегда запускает событие из первой колонки. А если запускать одно флоу из другого как происходит? Минуя событие и сразу проверка условий или прямо сразу к действию?
Если например flow начало исполнятся - сработало событие, проверилось условие и перешло к действию которое с отсрочкой по таймеру, его может тормознуть другое flow или уже безвозвратно?
Я это так вижу (может кто что добавит)
Датчик двери сработал и нет света = включить свет на (например 600 секунд)
Появилось движение = включить свет на (например 600 секунд)
После срабатывания открытия двери в течение 30-60 секунд дверь закрылась и есть срабатывание датчика движения = включить свет на (например 600 секунд)
Проверить в последние 200 секунд срабатывал ли датчик движения, если да = свет больше не выключать до момента срабатывания датчика открытия двери.
Мне кажется вы все усложняете. В вашем случае не лучше ли будет включать свет по датчику движения, выключать по отсутствию движения но при условии что дверь не закрыли. Правда в этом случае если вы вышли из ванной и закрыли дверь пока свет не погас он будет гореть вечно.
И еще не очень понятно от какого момента начать отсчитывать 200 сек.
Поветрите свою ситуацию с разных сторон. Представьте, что дверь может быт как открыта, так и закрыта на моменте начала действий и, что вы можете находится в ванне при закрытой двери и не разу не пошевелится или наоборот.
Если вы поймете, что есть два варианта, то скорее всего, что то можно будет написать. Если же вариантов больше то лучше даже не пытаться, скорее всего всегда найдутся варианты противоречия сценариев и их все равно придется ограничивать правилами например: всегда закрывать дверь когда моешься и никогда если нет.
Вообще лучше брать за правило, что в решении одной проблемы не должно быть больше 3-х сценариев.
А тут мы имеем:
1) Сработал датчик движения
2) Движение закончилось
3) Открыл дверь
4) Закрыл дверь
5) Таймер закончился 600 сек.
6) Срабатывал ли в последние 200 сек.
7) Прошло ли 30-60 сек.
Три таймера, переменная для хранения состояния наличия движения в последние 200 сек, и куча сценариев это не путь к победе.
Мне кажется вы все усложняете. В вашем случае не лучше ли будет включать свет по датчику движения, выключать по отсутствию движения но при условии что дверь не закрыли. Правда в этом случае если вы вышли из ванной и закрыли дверь пока свет не погас он будет гореть вечно.
И еще не очень понятно от какого момента начать отсчитывать 200 сек.
Поветрите свою ситуацию с разных сторон. Представьте, что дверь может быт как открыта, так и закрыта на моменте начала действий и, что вы можете находится в ванне при закрытой двери и не разу не пошевелится или наоборот.
Если вы поймете, что есть два варианта, то скорее всего, что то можно будет написать. Если же вариантов больше то лучше даже не пытаться, скорее всего всегда найдутся варианты противоречия сценариев и их все равно придется ограничивать правилами например: всегда закрывать дверь когда моешься и никогда если нет.
Вообще лучше брать за правило, что в решении одной проблемы не должно быть больше 3-х сценариев.
А тут мы имеем:
1) Сработал датчик движения
2) Движение закончилось
3) Открыл дверь
4) Закрыл дверь
5) Таймер закончился 600 сек.
6) Срабатывал ли в последние 200 сек.
7) Прошло ли 30-60 сек.
Три таймера, переменная для хранения состояния наличия движения в последние 200 сек, и куча сценариев это не путь к победе.
молодец!
Спасибо за статью!
Подскажите, может кому попадалось, видел а найти не могу.
Как сделать "умную" подсветку колобка, сейчас всё как то банально работает, с заходом солнца звук и свет выключается, с восходом включается, кроме звука, мне он не нужен. А хочется как то плавное затухание, как темнеет плавно так и яркость уменьшается и так же наоборот.