配置 Amazon IoT SiteWise 规则操作 - Amazon IoT SiteWise
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

配置 Amazon IoT SiteWise 规则操作

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

注意

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

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

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

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

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

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

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

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

重要

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

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

注意

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

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

如果您的传感器或设备未报告准确的时间数据,请使用 time stamp () 从 Amazon 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 函数支持高达毫秒精度的时间戳字符串。要转换精度为微秒或纳秒的字符串,请配置规则调 Amazon Lambda 用的函数以将时间戳转换为数值。有关更多信息,请参阅 转换纳秒精度的时间戳字符串

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

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

注意

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

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

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

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

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

    • — 添加 Amazon 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 输入 ISO 8601 格式的时间戳字符串。 NumPy

      注意

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

  2. 为规则配置 Amazon 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}

    对于每个参数,将区域和账户 ID 替换为您的地区和 Amazon 账户 ID。如果您为 Lambda 函数使用了不同的名称,请相应更改。

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

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

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

注意

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

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

示例规则配置

本节包含使用 Amazon IoT SiteWise 操作创建规则的示例规则配置。

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

以下示例创建了一个规则,其 Amazon 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() 确定时间的示例规则操作

以下示例创建了一个规则,其 Amazon IoT SiteWise 操作通过 ID 标识资产属性,并使用 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" }

规则操作问题排查

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