Выражения и синтаксис логики IF/THEN
Основы выражений
Узел логики IF/THEN использует язык выражений IoT Logic ГМ Телематика, основанный на Java Expression Language (JEXL). Для корректной работы узла все выражения должны возвращать булево значение (true/false).
Вычисление выражений: выражения вычисляются слева направо, и вы можете использовать круглые скобки, чтобы управлять порядком выполнения операций.
Пример базового синтаксиса:
condition1 && (condition2 || condition3 > condition4)
Доступные операторы
Операторы сравнения
Оператор | Описание |
|---|---|
| Проверяет, равны ли два операнда. Если операнды имеют разные типы, JEXL по возможности преобразует их к одному типу |
| Проверяет неравенство двух операндов. Возвращает true, если операнды не равны |
| Проверяет, что левый операнд меньше правого операнда |
| Проверяет, что левый операнд меньше или равен правому операнду |
| Проверяет, что левый операнд больше правого операнда |
| Проверяет, что левый операнд больше или равен правому операнду |
Логические операторы
Оператор | Описание |
|---|---|
| Логическое AND — проверяет, истинны ли оба условия. Возвращает true, если оба условия истинны |
| Логическое OR — проверяет истинность хотя бы одного из двух условий |
| Логическое NOT — преобразует результат условия в противоположное значение |
Операторы сопоставления с шаблоном
Оператор | Описание |
|---|---|
| Проверяет, входит ли значение левого операнда в множество правого операнда. Для строк проверяет соответствие шаблону регулярного выражения |
| Проверяет, не входит ли значение левого операнда в множество правого операнда. Для строк проверяет несоответствие шаблону регулярного выражения |
| Проверяет, начинается ли строковый левый операнд со строкового правого операнда |
| Проверяет, что строковый левый операнд не начинается со строкового правого операнда |
| Проверяет, заканчивается ли строковый левый операнд строковым правым операндом |
| Проверяет, что строковый левый операнд не заканчивается строковым правым операндом |
Примеры выражений
Примеры основных условий
Проверка равенства
value('lock_state', 0, 'valid') == 'sealed'
door_state_2 == 0
Проверка неравенства
value('lock_state', 1, 'valid') != 'unknown'
avl_io_221 != null
Числовые сравнения
value('humidity', 1, 'all') < 80
value('humidity', 1, 'all') <= 80
value('humidity', 0, 'valid') > 80
value('humidity', 0, 'valid') >= 80
Мониторинг температуры
value('temperature', 0, 'valid') > 75
Это выражение срабатывает, когда температура превышает 75 градусов, и полезно для предупреждений о перегреве.
Обнаружение превышения скорости
value('speed', 0, 'valid') > 80
Это выражение определяет, когда транспортные средства превышают ограничение скорости в 80 км/ч.
Мониторинг состояния устройства
value('battery_voltage', 0, 'valid') < 11.5
Это выражение выявляет состояние низкого заряда аккумулятора, требующее внимания при обслуживании.
Предупреждения по уровню топлива
value('fuel_level', 0, 'valid') < 20
Это выражение определяет, когда уровень топлива падает ниже 20 %, что позволяет заранее выполнить дозаправку.
Примеры логических операторов
И операции :
value('temperature', 0, 'valid') > 15 && value('humidity', 0, 'valid') > 80
value('temperature', 0, 'valid') > 15 and value('humidity', 0, 'valid') > 80
Операции ИЛИ:
temperature < 10 || humidity > 80
temperature < 10 or humidity > 80
НЕ операции :
!condition
not condition
Примеры сопоставления с шаблоном
Принадлежность множеству
value('lock_state', 0, 'valid') =~ ['locked','unlocked']
value('driver_name', 0, 'valid') !~ ['John', 'Steve']
Сопоставление строк с шаблоном
driver_id =^ 'cc6f8216'
driver_id !^ 'cc6f8216'
value('engine_hours', 0, 'valid') =$ '1000'
value('driver_id', 0, 'valid') !$ '8b38851c3c68'
Примеры сложных многоусловных выражений
Предупреждение о превышении скорости в нерабочее время
value('speed', 0, 'valid') > 60 && (value('current_hour', 0, 'valid') >= 18 || value('current_hour', 0, 'valid') <= 6)
Это сочетает контроль скорости с условиями по времени для усиленного контроля безопасности в ночные смены.
Комплексная диагностика устройства
value('gps_satellites', 0, 'valid') >= 4 && value('battery_voltage', 0, 'valid') > 11.5 && value('signal_strength', 0, 'valid') > -80
Это выражение одновременно проверяет несколько параметров состояния устройства, чтобы обеспечить надёжную работу.
Мониторинг безопасности водителя
value('harsh_braking', 0, 'valid') == true && value('driver_identified', 0, 'valid') == false
Это выражение определяет небезопасное поведение при вождении, когда водитель не был корректно идентифицирован в системе.
Планирование технического обслуживания оборудования
value('engine_hours', 0, 'valid') > 250 && value('last_maintenance', 0, 'valid') > 30
Это выражение запускает предупреждения о необходимости обслуживания, когда моточасы превышают пороговые значения, а обслуживание просрочено.
Контроль соответствия температурному диапазону
value('cargo_temperature', 0, 'valid') < -18 || value('cargo_temperature', 0, 'valid') > 4
Это выражение определяет случаи, когда температура охлаждаемого груза выходит за пределы допустимого диапазона.
Сложность выражений и скобки
Вы можете создавать сложные выражения, объединяя несколько условий и используя скобки для управления порядком вычисления:
Сложная проверка безопасности
!driver_identified && (vibration_active || speed > 3)
Проверка оборудования по нескольким параметрам
(value('oil_pressure', 0, 'valid') < 20 || value('coolant_temp', 0, 'valid') > 95) && value('engine_running', 0, 'valid') == true
Сценарии обработки ошибок
Сценарий | Результат | Путь потока | Значение атрибута |
|---|---|---|---|
Выражение вычисляется как true | Успешно | Соединение THEN | true |
Выражение вычисляется как false | Успешно | Соединение ELSE | false |
Используемый атрибут имеет значение null | Считается как false | Соединение ELSE | false |
Синтаксическая ошибка в выражении | Считается как false | Соединение ELSE | null |
Используемый атрибут не существует | Считается как false | Соединение ELSE | null |
Практические примеры использования
Мониторинг температуры автопарка
Бизнес-требование: контролировать рефрижераторные транспортные средства, чтобы обеспечивать соответствие температуры груза установленным требованиям
value('cargo_temperature', 0, 'valid') > 4 || value('cargo_temperature', 0, 'valid') < -18
Ветка THEN: отправка немедленных уведомлений диспетчеру, журналирование нарушений соответствия, запуск корректирующих действий
Ветка ELSE: продолжение обычной обработки для температур, соответствующих норме, обновление статусных панелей
Контроль качества вождения
Бизнес-требование: выявлять небезопасное вождение в часы активной смены
value('harsh_acceleration', 0, 'valid') == true && value('shift_active', 0, 'valid') == true
Ветка THEN: формирование отчётов для обучения водителя, отправка уведомлений по безопасности, журналирование инцидентов
Ветка ELSE: обработка данных о нормальном поведении при вождении, обновление показателей эффективности
Контроль посещения геозон
Бизнес-требование: обеспечивать эксплуатацию транспортных средств только в разрешённых зонах в рабочее время
(value('latitude', 0, 'valid') < 40.7489 || value('latitude', 0, 'valid') > 40.7589) && value('business_hours', 0, 'valid') == true
Ветка THEN: формирование уведомлений о нахождении в неразрешённой зоне, уведомление службы безопасности, журналирование нарушений
Ветка ELSE: продолжение обычного журналирования операций, обновление отслеживания местоположения