Создать операцию с CEP, используя пользовательский фрагмент

Я пытаюсь написать собственное правило CEP, которое создает операцию для агента, чтобы собрать измерение, которое вызвало запуск правила. Правило CEP выглядит так:

insert into CreateOperation
select
  OperationStatus.PENDING as status,
  "5345" as deviceId,
  {
    "c8y_GetData", {
        "name": "get measurement data",
        "measurementID": measurementEvent.measurement.id.value,
        "measurementType": measurementEvent.measurement.type
    }
  } as fragments
from MeasurementCreated measurementEvent
where measurementEvent.measurement.type = "c8y_TemperatureMeasurement";

Когда я использую простые строки для полей measureEvent.measurement... (например,"testString"), правило работает. Но эти строки вызывают ошибки при вводе, как в этом примере. Изменение ":" на "," как в примерах из документации, заставляет правило работать, но результат

"name",
"get measurement data",
"measurementID",
"176438",
"measurementType",
"c8y_TemperatureMeasurement"

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

1 ответ

Решение

Параметр фрагментов в CEL не является объектом. Это список ключа / значения, где ключ является JSONPath. Все разделено запятыми (я знаю, это выглядит странно). Фигурные скобки в Esper на самом деле указывают на массив, а не на объект.

Ваше заявление должно выглядеть так:

insert into CreateOperation
select
  "5345" as deviceId,
  {
    "c8y_GetData.name", "get measurement data",
    "c8y_GetData.measurementID", measurementEvent.measurement.id.value,
    "c8y_GetData.measurementType", measurementEvent.measurement.type
  } as fragments
from MeasurementCreated measurementEvent
where measurementEvent.measurement.type = "c8y_TemperatureMeasurement";

Также обратите внимание, что я отбросил строку с OperationStatus. На POST операции вы не можете установить статус. Это будет автоматически в состоянии ОЖИДАНИЯ. Только на PUT вы можете изменить это. Сохранение строки приведет к ошибке в API при попытке POST.

Другие вопросы по тегам