配置 AWS IoT SiteWise 规则操作 - AWS IoT SiteWise

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置 AWS IoT SiteWise 规则操作

AWS IoT SiteWise 规则操作将启动规则的MQTT消息中的数据发送到中的资产属性 AWS IoT SiteWise。您可以同时将多个数据条目上传到不同的资产属性,以便在一条消息中发送设备所有传感器的更新。您还可以为每个数据条目一次上传多个数据点。

注意

当您 AWS IoT SiteWise 使用规则操作向发送数据时,您的数据必须满足BatchPutAssetPropertyValue操作的所有要求。例如,您的数据的时间戳不能早于当前 Unix 纪元时间 7 天。有关更多信息,请参阅使用提取数据。 AWS IoT SiteWise API

对于规则操作中的每个数据条目,您可以标识资产属性,并为该资产属性指定每个数据点的时间戳、质量和值。规则操作要求所有参数均为字符串。

要在条目中标识资产属性,可以指定以下项之一:

  • 资产 ID (assetId) 和 属性 ID (propertyId),这是您要将数据发送到的资产属性的值。您可以使用查找资产 ID 和财产 ID AWS IoT SiteWise 控制台。如果您知道资产 ID,则可以使用 to call AWS CLI DescribeAsset来查找资产 ID。

  • 属性别名 (propertyAlias),这是一个数据流别名(例如,/company/windfarm/3/turbine/7/temperature)。要使用此选项,您必须首先设置资产属性的别名。要了解如何设置属性别名,请参阅将工业数据流映射到资产属性

对于每个条目中的时间戳,请使用您的设备报告的时间戳或提供的时间戳。 AWS IoT Core时间戳有两个参数:

  • 时间(以秒为单位)(timeInSeconds) – 传感器或设备报告数据的 Unix 纪元时间(以秒为单位)。

  • 偏移量(以纳秒为单位)(offsetInNanos) –(可选)以秒为单位的时间的纳秒偏移量。

重要

如果您的时间戳是一个字符串、包含小数部分或不是以秒为单位,则 AWS IoT SiteWise 会拒绝该请求。您必须将时间戳转换为秒和纳秒偏移量。使用 AWS IoT 规则引擎的功能来转换时间戳。有关更多信息,请参阅下列内容:

在执行计算、调用函数以及从消息负载中提取值的操作中,您可以为多个参数使用替换模板。有关更多信息,请参阅 AWS IoT 开发人员指南中的替换模板

注意

由于替换模板中的表达式与 SELECT 语句分开评估,因此您不能使用替换模板来引用使用 AS 子句创建的别名。除了支持的函数和运算符之外,您只能引用原始负载中存在的信息。

获取未报告准确时间的设备的时间戳

如果您的传感器或设备未报告准确的时间数据,请使用 time stamp () 从 AWS IoT 规则引擎获取当前 Unix 纪元时间。此函数以毫秒为单位输出时间,因此您必须将值转换为以秒为单位的时间,并将偏移量转换为以纳秒为单位。为此,请使用以下转换:

  • 对于 时间 (以秒为单位) (timeInSeconds),使用 ${floor(timestamp() / 1E3)} 将时间从毫秒转换为秒。

  • 对于 偏移量 (以纳秒为单位) (offsetInNanos),使用 ${(timestamp() % 1E3) * 1E6} 计算时间戳的纳秒偏移量。

转换字符串格式的时间戳

如果您的传感器或设备以字符串格式报告时间数据(例如,2020-03-03T14:57:14.699Z),请使用 t ime_to_epoch(字符串、字符串)。此函数将时间戳和格式模式作为参数输入,并以毫秒为单位输出时间。然后,您必须将时间转换为以秒为单位的时间和以纳秒为单位的偏移量。为此,请使用以下转换:

  • 对于时间(以秒为单位)(timeInSeconds),使用 ${floor(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") / 1E3)} 将时间戳字符串转换为毫秒,然后转换为秒。

  • 对于偏移量(以纳秒为单位)(offsetInNanos),使用 ${(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") % 1E3) * 1E6} 计算时间戳字符串的纳秒偏移量。

注意

time_to_epoch 函数支持高达毫秒精度的时间戳字符串。要转换精度为微秒或纳秒的字符串,请配置规则调 AWS Lambda 用的函数以将时间戳转换为数值。有关更多信息,请参阅 转换纳秒精度的时间戳字符串

转换纳秒精度的时间戳字符串

如果您的设备以精度为纳秒的字符串格式发送时间戳信息(例如 2020-03-03T14:57:14.699728491Z),请使用以下过程配置规则操作。你可以创建一个 AWS Lambda 函数,将时间戳从字符串转换为以秒为单位的时间 (timeInSeconds) 和以 nanos 为单位的偏移量 (offsetInNanos)。然后,在规则操作参数中使用 aws_lambda (functionArn,inputJson) 来调用该 Lambda 函数并在规则中使用输出。

注意

本节包含高级说明(假设您已熟悉如何创建以下资源):

创建解析时间戳字符串的 AWS IoT SiteWise 规则操作
  1. 创建具有以下属性的 Lambda 函数:

    • 函数名称 – 使用描述性函数名称(例如 ConvertNanosecondTimestampFromString)。

    • 运行时 — 使用 Python 3 运行时,例如 Python 3.11 (python3.11)。

    • 权限-创建具有基本 Lambda 权限的角色 () AWS LambdaBasicExecutionRole

    • 图层 — 添加 AWS SDKPandas-Python311 层以供 Lambda 函数使用。numpy

    • 函数代码 – 使用以下函数代码,该函数使用名为 timestamp 的字符串参数,并为该时间戳输出 timeInSecondsoffsetInNanos 值。

      import json import math import numpy # Converts a timestamp string into timeInSeconds and offsetInNanos in Unix epoch time. # The input timestamp string can have up to nanosecond precision. def lambda_handler(event, context): timestamp_str = event['timestamp'] # Parse the timestamp string as nanoseconds since Unix epoch. nanoseconds = numpy.datetime64(timestamp_str, 'ns').item() time_in_seconds = math.floor(nanoseconds / 1E9) # Slice to avoid precision issues. offset_in_nanos = int(str(nanoseconds)[-9:]) return { 'timeInSeconds': time_in_seconds, 'offsetInNanos': offset_in_nanos }

      此 Lambda 函数使用来自 datetime64 输入 ISO8601 格式的时间戳字符串。 NumPy

      注意

      如果您的时间戳字符串不是 ISO 8601 格式,则可以使用定义时间戳格式pandas来实现解决方案。有关更多信息,请参阅 pandas.to_datetime

  2. 为规则配置 AWS IoT SiteWise 操作时,请使用以下替换模板来替换时间(以秒为单位timeInSeconds)和以纳为单位的偏移量offsetInNanos)。这些替换模板假定您的消息负载包含 timestamp 格式的时间戳字符串。该aws_lambda函数的第二个参数使用一个JSON结构,因此您可以根据需要修改以下替换模板。

    • 对于 时间 (以秒为单位) (timeInSeconds),请使用以下替换模板。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).timeInSeconds}
    • 对于以 偏移量 (以纳秒为单位) (offsetInNanos),请使用以下替换模板。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).offsetInNanos}

    对于每个参数,替换 region 以及 account-id 使用您的地区和 AWS 账户 ID。如果您为 Lambda 函数使用了不同的名称,请相应更改。

  3. 授予使用该 AWS IoT 权限调用您的函数的lambda:InvokeFunction权限。有关更多信息,请参阅 aws_lambda (functionArn,)。inputJson

  4. 测试您的规则(例如,使用 AWS IoT MQTT测试客户端),并验证该规则 AWS IoT SiteWise 接收了您发送的数据。

    如果您的规则未按预期工作,请参阅 对 AWS IoT SiteWise 规则操作进行故障排除

注意

此解决方案为每个时间戳字符串调用 Lambda 函数两次。如果您的规则处理各个负载中具有相同时间戳的多个数据点,则可以创建另一个规则来减少 Lambda 函数的调用次数。

为此,请使用重新发布操作创建规则,该操作会调用 Lambda 并发布原始负载,其中时间戳字符串转换为 timeInSecondsoffsetInNanos。然后,创建一个带有规则操作的 AWS IoT SiteWise 规则,以消耗转换后的有效负载。使用这种方法,您可以减少规则调用 Lambda 的次数,但可以增加规则操作的 AWS IoT 运行次数。如果将此解决方案应用于您的使用案例,请考虑每项服务的定价。

示例规则配置

本节包含用于创建带有 AWS IoT SiteWise 操作的规则的示例规则配置。

例 使用属性别名作为消息主题的示例规则操作

以下示例创建了一个规则,其 AWS IoT SiteWise 操作使用主题(通过 topi c ())作为属性别名来标识资产属性。使用此示例定义一条规则,用于将双类型数据采集到所有风力发电场中的所有风力涡轮机。此示例要求您为所有涡轮机资产的属性定义属性别名。您需要定义另一个类似的规则来摄取整数型数据。

aws iot create-topic-rule \ --rule-name SiteWiseWindFarmRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json 中的示例负载包含以下内容。

{ "sql": "SELECT * FROM '/company/windfarm/+/turbine/+/+' WHERE type = 'double'", "description": "Sends data to the wind turbine asset property with the same alias as the topic", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "propertyAlias": "${topic()}", "propertyValues": [ { "timestamp": { "timeInSeconds": "${timeInSeconds}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

使用此规则操作,将以下消息作为采集数据的主题发送到风力涡轮机属性别名(例如/company/windfarm/3/turbine/7/temperature)。

{ "type": "double", "value": "38.3", "timeInSeconds": "1581368533" }
例 使用 timestamp() 确定时间的示例规则操作

以下示例创建了一个规则,其 AWS IoT SiteWise 操作通过标识资产属性IDs并使用 timestamp () 来确定当前时间。

aws iot create-topic-rule \ --rule-name SiteWiseAssetPropertyRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json 中的示例负载包含以下内容。

{ "sql": "SELECT * FROM 'my/asset/property/topic'", "description": "Sends device data to an asset property", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "assetId": "a1b2c3d4-5678-90ab-cdef-22222EXAMPLE", "propertyId": "a1b2c3d4-5678-90ab-cdef-33333EXAMPLE", "propertyValues": [ { "timestamp": { "timeInSeconds": "${floor(timestamp() / 1E3)}", "offsetInNanos": "${(timestamp() % 1E3) * 1E6}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

使用此规则操作,向发送以下消息my/asset/property/topic以获取数据。

{ "type": "double", "value": "38.3" }

规则操作问题排查

要对中的 AWS IoT SiteWise 规则操作进行故障排除 AWS IoT Core,请为您的规则配置 CloudWatch 日志或配置重新发布错误操作。有关更多信息,请参阅 对 AWS IoT SiteWise 规则操作进行故障排除