В настоящее время брокер контекста не позволяет напрямую увеличивать атрибут.
Я думаю, что вы можете использовать некоторое правило 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)
]
}
}
}
Я надеюсь, что помог с этим ответом.