1

我正在尝试执行以下示例:

我在 orionCB 中创建了两个实体。

  • 服务=测试
  • 子服务=/子测试

    {    
    "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,used 属性将加 1,free 属性将减 1

2.- 如果 typeEvent 为 0,used 属性将减 1,free 属性将加 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    
}
4

1 回答 1

1

目前上下文代理不允许直接增加属性。

我认为您可以使用一些 win: time 规则来尝试管理这种情况,但我发现实时保持实体“累加器”中的一致性可能会非常复杂。

要仅使用 Perseo 解决这个问题,也许关键是使用允许增加和减少累加器实体属性的规则和订阅的组合。

1.首先我们需要为 Perseo 订阅所有 typeEvent 属性:

发布到 OrionCB_URL/v2/subscriptions:

   {
     “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”
   }
  1. 然后,我们现在创建一个规则,在累加器中添加一个属性,以指示每次传感器更改其 typeEvent 属性的值时都需要更新它:

发布到 PERSEO_URL/规则:

   {
      “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}”
                   }
             ]
         }
      }
   }
  1. 我们为 Perseo 订阅所有累加器类型实体的新属性“action”中发生的更改。

发布到 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”
   }
  1. 我们在 Perseo 中创建一个新规则,用于管理新的累加器通知,并根据“action”属性的值修改累加器实体,该属性包含由第一条规则更改的最后一个“typeEvent”值。

发布到 PERSEO_URL/规则:

{
      “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)
             ]
         }
      }
   }

我希望我对这个回复有所帮助。

于 2018-10-24T19:53:02.403 回答