Как я могу сделать следующий пример с Fiware-Perseo-fe - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь выполнить следующий пример:

Я создал две сущности в orionCB.

  • service = test
  • subservice = /подтест

    {    
    "id":"sensor1",    
    "type":"sensor",    
    "id_accumulator":"accumulator1",    
    "typeEvent": 1 //can be 1 or 0    
    }
    
    {    
    "id":"accumulator1",    
    "type":"accumulator",    
    "used":132,    
    "free":83,    
    "total":215    
    }
    

Правила должны быть такими:

1.- если typeEvent равен 1, используемый атрибут будет равен плюс 1, а свободный атрибут будет меньше 1

2.- если typeEvent равно 0, используемый атрибут будет меньше 1, а свободный атрибут будет равен плюс 1

возможно ли это сделать с помощью правила и подписки perseo?

Дополнительная информация:

после выполнения правил результат будет:

-----> typeEvent:1    
{    
"id":"accumulator1",    
"type":"accumulator",    
"used":133,    
"free":82,    
"total":215,    
}

---> typeEvent:0    
{    
"id":"accumulator1",    
"type":"accumulator",    
"used":131,    
"free":84,    
"total":215    
}

1 Ответ

0 голосов
/ 24 октября 2018

В настоящее время брокер контекста не позволяет напрямую увеличивать атрибут.

Я думаю, что вы можете использовать некоторое правило win: time, чтобы попытаться управлять этим делом, но я вижу, что сохранение согласованности в сущностях «аккумулятор »в реальном времени, вероятно, будет довольно сложным.

Чтобы решить этот вопрос, используя только Perseo, возможно, ключ состоит в том, чтобы использовать комбинацию правил и подписок, которые позволяют увеличивать и уменьшать атрибуты объекта-аккумулятора.

1. Прежде всего нам нужно подписать Perseo на все атрибуты typeEvent:

POST для OrionCB_URL / v2 / subscription:

   {
     “description”: “Notify Perseo when typeEvent changes”,
     “subject”: {
       “entities”: [
         {
           “idPattern”: “.*“,
           “type”: “sensor”
         }
       ],
       “condition”: {
         “attrs”: [
           “typeEvent”
         ]
       }
     },
     “notification”: {
       “http”: {
         “url”: “<perseoHost>/notices”
       },
       “attrs”: [
         “typeEvent”,
         “id”,
         “id_accumulator”
       ]
     },
     “expires”: “2019-06-30T14:00:00.00Z”
   }
Затем мы создадим правило, которое добавляет атрибут в аккумулятор, чтобы указать необходимость его обновления каждый раз, когда датчик изменяет значение своего атрибута typeEvent:

POST to PERSEO_URL / rules:

   {
      “name”:“changeInAcumulator”,
      “text”:“select \“changeInAcumulator\” as ruleName, ev.id_accumulator? as id_accumulator, ev.typeEvent? as typeEvent from pattern [every ev=iotEvent(type=\“sensor\“)]“,
      “action”:{
         “type”:“update”,
         “parameters”:{
             “id”:“${id_accumulator}“,
             “type”:“accumulator”,
             “attributes”: [
                   {
                   “name”:“action”,
                   “value”:“${typeEvent}”
                   }
             ]
         }
      }
   }
Мы подписываем Perseo на изменения, которые происходят в этом новом атрибуте 'action' для всех сущностей типа аккумулятора.

POST to OrionCB_URL / v2 / subscriptions:

{
     “description”: “Notify Perseo when accumulator changes”,
     “subject”: {
       “entities”: [
         {
           “idPattern”: “.*“,
           “type”: “accumulator”
         }
       ],
       “condition”: {
         “attrs”: [
           “action”
         ]
       }
     },
     “notification”: {
       “http”: {
         “url”: “http://host.docker.internal:9090/notices”
       },
       “attrs”: [
         “id”,
         “free”,
         “used”,
         “action”
       ]
     },
     “expires”: “2019-06-30T14:00:00.00Z”
   }
Мы создаем новое правило в Perseo, которое управляет уведомлениями о новом аккумуляторе, и модифицируем сущность аккумулятора, основываясь на значении атрибута 'action', который содержит последнее значение 'typeEvent', измененное первым правилом.

POST to PERSEO_URL / rules:

{
      “name”:“updateAcumulator”,
      “text”:“select \“updateAcumulator\” as ruleName, ev.id? as id, case cast(cast(ev.action?,String),float) when 1 then cast(cast(ev.free?,String),float)-1 else cast(cast(ev.free?,String),float)+1 end as free, case cast(cast(ev.action?,String),float) when 1 then cast(cast(ev.used?,String),float)+1 else cast(cast(ev.used?,String),float)-1 end as used from pattern [every ev=iotEvent(type=\“accumulator\“)]“,
      “action”:{
         “type”:“update”,
         “parameters”:{
             “id”:“${id}“,
             “type”:“accumulator”,
             “attributes”: [
                   {
                   “name”:“free”,
                   “value”:“${free}”
                   },
                   {
                   “name”:“used”,
                   “value”:“${used}”
                   } (editado)
             ]
         }
      }
   }

Я надеюсь, что помог с этим ответом.

...