1

如何在 perseo 规则中使用带有时间窗的模式?我按照EsperTech 教程的指示尝试了许多不同的组合,但是,每次我将其发布到 perseo 时,它们都没有成功。时间窗口的任何示例以及如何在该时间段内获得任何值(例如温度)的平均值都将受到高度赞赏。相信我,在询问之前我已经做了很多努力;)对我来说,一个有效的查询如下:

select *,\"temperature_range_XX-YY\" as ruleName, *, ev.temperature? as Temperature, ev.id? as Id, ev.datetime? as DateTime, ev.cid? as CID, current_timestamp as TS from pattern [every ev=iotEvent(cast(cast(temperature?,String),float)>XX or cast(cast(temperature?,String),float)<YY and type=\"sensors\")]

当然,这个查询只返回 XX 和 YY 范围之外的任何温度。我需要的是在特定时间温度超出范围时发出警报,以及在那段时间内所有值的平均值是多少。

4

1 回答 1

1

要获得平均值,您可以avg()在 select 子句中使用 de 函数。

以下规则对我有用:

{
   "name":"calculate_avg",
   "text":"select *, avg(cast(cast(ev.NO2?,String),float)) as mediaNO2, ev.id? as id, \"calculate_avg\" as ruleName from pattern [every ev=iotEvent(type=\"AirQualityObserved\")].win:time(1 minute) group by ev.id?",
   "action":{
      "type":"update",
      "parameters":{
          "id":"${id}",
          "type":"AirQualityAveraged",
          "attributes": [
                {
                "name":"average",
                "value":"${mediaNO2}"
                }
          ]
      }
   }
}

我想说你的规则应该类似于:

"text":"select *,\"temperature_range_XX-YY\" as ruleName, *, avg(cast(cast(ev.temperature?, String), float)) as Temperature, ev.id? as Id, ev.datetime? as DateTime, ev.cid? as CID, current_timestamp as TS from pattern [every ev=iotEvent(cast(cast(temperature?,String),float)>XX or cast(cast(temperature?,String),float)<YY and type=\"sensors\")].win:time(1 minute)"
于 2018-06-21T10:28:42.140 回答