物联网事件——从输入计算移动平均数

0

【以下的问题经过翻译处理】 你好,我在 IoT Events 中构建了一个检测器模型,它从环境传感器获取输入数据,如果传感器值超过阈值,则会通过 Lambda 发送电子邮件警报。然后设置一个计时器,如果传感器值在 24 小时后继续超过阈值,则会重新发送电子邮件警报。这个解决方案很简单并且效果很好。然而,问题在于传感器输入值可能会急剧上升。这可能会导致误报,因为在发送第一封电子邮件后,传感器输入值可能会迅速回落到阈值以下。

我想创建一个移动平均计算,回顾一段预定义的时间并计算环境传感器输入的平均值。例如,计算过去 12 小时内传感器值的平均值。如果移动平均值高于阈值,则发送初始电子邮件警报。是否可以在 IoT Events 中计算这样的移动平均值?

正如我提到的,电子邮件警报由 Lambda 函数生成,IoT 事件模型由 IoT 核心规则触发。

谢谢!

profile picture
专家
已提问 5 个月前7 查看次数
1 回答
0

【以下的回答经过翻译处理】 嗨。虽然有可能实现,但这可能不是最好的解决方案。IoT Events没有一个很好的机制来存储N个样本的缓冲区,以计算N周期移动平均值。您可以使用setVariable动作和非常复杂的检测模型来实现它。相反,我建议您涉及其他AWS服务来预处理原始输入,或者建议您使用其他低通滤波技术,例如[指数平滑](https://en.wikipedia.org/wiki/Exponential_smoothing)。

指数平滑法仅需要当前输入和上一平滑值,因此在IoT Events中实现起来非常容易。您还可以考虑去抖动、某种异常值拒绝或各种变体或组合。

[HVAC示例](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-examples-hvac.html)似乎非常适合您的用例,并采用指数平滑(与异常/离群值拒绝结合使用):

{
  “eventName”:“calculateAverage”,
  “condition”:“$ input.temperatureInput.sensorData.temperature < $ variable.anomalousHigh && $ input.temperatureInput.sensorData.temperature > $ variable.anomalousLow”,
  “actions”:[
  {
    “setVariable”:{
    “variableName”:“averageTemperature”,
    “value”:“((($ variable.averageTemperature *($ variable.sensorCount-1))+ $ input.temperatureInput.sensorData.temperature)/ $ variable.sensorCount)”
    }
  }
  ]
}

在这种情况下,平滑常数为1 / $ variable.sensorCount。当然,您可以使用不同的平滑常数来调整您的过滤需求。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则