Рассмотрим решение следующей практической задачи:
Необходимо CAT событие, которое пингует хост (например, 10.56.74.110) каждую минуту. Реакция, если хост перестал отвечать, РАЗОВО - отправляется SMS сообщение. Дальше хост продолжает не отвечать, но SMS не отправляются. А как только хост снова начинает пинговаться, то снова разово отправляется SMS сообщение.
Решение
Такую задачу можно решить через CAT события. Единственный момент - потребуется два события. Одно будет пинговать хост и срабатывать если PING провален. А другое (второе) - будет пинговать тот же хост, но срабатывать в случае успеха.
Задача несколько усложняется тем что реакция на изменение состояния хоста (отправка SMS) должна выполняться единоразово только в момент смены состояния, а не при каждом PING запросе (удачном или неудачном).
К счастью, в системе CAT предусмотрены дополнительные условия для событий. Например, можно использовать значение пользовательской переменной VAR как дополнительное условие. Причем, события CAT могут менять значение этих переменных "на лету", тем самым влияя (управляя) работой друг друга.
Сделаем следующим образом - для первого события установим дополнительное условие срабатывания в виде значения пользовательской переменной VAR_1 (например, должна быть меньше 1). Для второго события - аналогично используем переменную VAR_2 (тоже должна быть меньше 1). Если PING будет неудачным (в работе первое событие), то отправляем соответствующее SMS и изменяем значение VAR_1, например, на 10 (так что бы оно было больше 1).
При следующих запусках этого события (если хост недоступен) реакция отрабатывать не будет, т.к. более не выполняется дополнительное условие по VAR_1 (т.е. событие заблокировало само себя).
Дополнительно при первом срабатывании этого события сбрасываем значение переменной VAR_2 в ноль. Эта переменная управляет работой второго события CAT. Тем самым мы разблокируем его работу. В итоге, SMS станут отправляться только в случае ИЗМЕНЕНИЯ доступности хоста по PING.
CAT ID | Основное условие срабатывания | Дополнительное условие срабатывания | Основная реакция (выполнять только при изменении статуса пингуемого хоста) | Дополнительные действия |
1 | PING провален | VAR_1 < 1 | Отправка SMS | VAR_1 = 10 VAR_2 = 0 |
2 | PING OK | VAR_2 < 1 | Отправка SMS | VAR_2 = 10 VAR_1 = 0 |
CAT программирование
В WEB интерфейсе переходим в раздел CAT. Добавляем первое CAT событие по PING.
Указываем IP хоста, который будем пинговать. А так же указываем, что это событие должно срабатывать в случае провала операции PING (хост не ответил).
В секции дополнительных условий указываем что событие должно срабатывать только в том случае, если пользовательская переменная VAR_1 меньше 1 (по умолчанию, переменные равны нулю после старта платы).
Секцию квот пропускаем. В секции реакции задаем список Ke-команд, которые должны выполниться при срабатывании события.
$KE,SMS,SND,1,C,PING_ALARM
$KE,VAR,1,SET,10
$KE,VAR,2,SET,0
С помощью команды $KE,SMS,SND отправляем SMS с текстом PING_ALARM на первый номер в базе "белых" телефонных номеров модуля. С помощью команды $KE,VAR устанавливаем VAR_1 = 10, VAR_2 = 0.
Подробнее о работе с GSM можно познакомиться в статьях:
Laurent-5G: Автоматика GSM. Часть 1
Laurent-5G: Управление по SMS с обратной связью
Добавляем текстовое имя событию для собственного удобства.
CAT событие появляется в списке (пока что оно выключено).
По аналогии добавим еще одно событие по PING, которое будет пинговать тот же IP, но срабатывать в случае успеха.
Дополнительное условие - пользовательская переменная VAR_2 должна быть меньше 1 (если будет больше - реакция по событию не будет выполнена даже если PING был успешным).
Похожий список Ke-команд в качестве реакции. На этот раз переменной VAR_2 ставим значение 10 (т.е. большее 1) и сбрасываем VAR_1 в ноль. Теперь (если событие сработает), то VAR_2 заблокирует повторную отправку SMS пока не сработает 1-ое CAT событие.
$KE,SMS,SND,1,C,PING_RESTORED
$KE,VAR,2,SET,10
$KE,VAR,1,SET,0
Оба события добавлены. Пора их включить. Можно включить каждое отдельной "кнопочкой" расположенной в секции Статус таблицы CAT событий. А можно одной общей в шапке списка (см. иллюстрацию ниже).
Предположим, что хост сейчас доступен. В начале работы обе переменные VAR_1 и VAR_2 равны нулю. Раз в минуту запускается проверка PING обоими событиями. Первое не сработает, т.к. PING будет удачным. Но сработает 2-ое событие. Мы получим SMS а так же изменим состояния переменных VAR так что 2-ое CAT событие заблокировало само себя и разблокировало 1-ое событие. Во время последующей проверки PING SMS отправляться не будет т.к. VAR_2 сейчас равно 10 (что больше чем условие VAR_2 меньше 1) указанное для второго события.
Предположим, что хост теперь не доступен. В этом случае, сработает 1-ое событие т.к. PING будет провален а VAR_1 сейчас равен 0. Мы получим SMS о том что произошла проблема. Но последующие запуски PING не будут приводить к повторным отправкам SMS т.к. мы заблокировали их через условие по переменной VAR_1 которая после отправки SMS стала равна 10. И так будет длиться до тех пор пока связь не восстановится снова и не сработает 2-ое CAT событие.