探测器模型分析和诊断信息 - Amazon IoT Events
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

探测器模型分析和诊断信息

探测器模型分析收集以下诊断信息:

  • 级别 - 分析结果的严重性级别。根据严重性级别,分析结果分为三大类:

    • 信息 (INFO) - 信息结果告诉您探测器模型中的一个重要字段。这类结果通常不需要立即采取行动。

    • 警告 (WARNING) - 警告结果会提请特别注意可能会导致探测器模型出现问题的字段。我们建议您在生产环境中使用探测器模型之前,先查看警告并采取必要的行动。否则,探测器模型可能无法按预期工作。

    • 错误 (ERROR - 错误结果会通知您探测器模型中发现的问题。当您尝试发布探测器模型时, Amazon IoT Events 会自动执行这组分析。在发布探测器模型之前,必须修复所有错误。

  • 位置 - 包含可用于在探测器模型中定位可供分析结果引用的字段的信息。位置通常包括状态名称、过渡事件名称、事件名称和表达式(例如 in state TemperatureCheck in onEnter in event Init in action setVariable)。

  • 类型 - 分析结果的类型。分析类型分为以下几类:

    • supported-actions— Amazon IoT Events 可以在检测到指定事件或过渡事件时调用操作。您可以定义内置操作以使用计时器或设置变量,或者将数据发送到其他 Amazon 服务。在 Amazon 提供服务的 Amazon 区域,您必须指定适用于其他 Amazon 服务的操作。

    • service-limits— 服务配额,也称为限制,是您的 Amazon 账户中服务资源或操作的最大或最小数量。除非另有说明,否则,每个配额都特定于区域。根据您的业务需求,您可以更新探测器模型以避免遇到限制或申请增加配额。您可以请求增加某些配额,但其他一些配额无法增加。有关更多信息,请参阅 配额

  • structure — 探测器模型必须具有所有必需的组件,例如状态,并遵循 Amazon IoT Events 支持的结构。探测器模型必须至少具有一种状态和一个能评估输入数据以检测重要事件的条件。当检测到事件时,探测器模型会过渡到下一个状态并可以调用操作。这些事件称为过渡事件。过渡事件必须引导下一个要进入的状态。

  • expression-syntax— Amazon IoT Events 提供了多种在创建和更新探测器模型时指定值的方法。您可以在表达式中使用文字、运算符、函数、引用和替代模板。您可以使用表达式来指定文字值,也 Amazon IoT Events 可以在指定特定值之前对表达式求值。您的表达式必须遵循所需的语法。有关更多信息,请参阅 表达式

    中的探测器模型表达式 Amazon IoT Events 可以引用特定的数据或资源。

    • data-type— Amazon IoT Events 支持整数、小数值、字符串和布尔数据类型。如果 Amazon IoT Events 可以在表达式求值期间自动将一种数据类型的数据转换为另一种数据类型,则这些数据类型是兼容的。

      注意
      • 整数和小数值是唯一受 Amazon IoT Events支持的兼容数据类型。

      • Amazon IoT Events 无法计算算术表达式,因为 Amazon IoT Events 无法将整数转换为字符串。

    • referenced-data — 必须先定义探测器模型中引用的数据,然后才能使用这些数据。例如,如果要向 DynamoDB 表发送数据,则必须先定义一个引用表名的变量,然后才能在表达式 ($variable.TableName) 中使用该变量。

    • referenced-resource — 探测器模型使用的资源必须可用。您必须先定义资源,然后才能使用它们。例如,您要创建探测器模型以监控温室的温度。必须先定义一个输入 ($input.TemperatureInput),将传入的温度数据路由到探测器模型,然后才能使用 $input.TemperatureInput.sensorData.temperature 来引用温度。

请参阅以下部分,对错误进行故障排除,并通过对探测器模型的分析找到可能的解决方案。

探测器模型错误消息故障排除

上述类型错误提供有关探测器模型的诊断信息,并与您可能检索到的消息相对应。使用这些消息和建议的解决方案来排除探测器模型的错误。

Location

包含 Location 相关信息的分析结果对应以下错误消息:

  • 消息 - 包含有关分析结果的其他信息。这可以是信息、警告或错误消息。

    如果您指定的操作 Amazon IoT Events 当前不支持,则可能会收到此错误消息。有关受支持的操作列表,请参阅支持的操作

supported-actions

包含 supported‐actions 相关信息的分析结果对应以下错误消息:

  • 消息:操作定义中存在无效的操作类型:action-definition

    如果您指定的操作 Amazon IoT Events 当前不支持,则可能会收到此错误消息。有关受支持的操作列表,请参阅支持的操作

  • 消息: DetectorModel 定义有aws-service操作,但区域名称不支持该aws-service服务。

    如果您指定的操作受支持,但该操作在您当前的地区不可用 Amazon IoT Events,则您可能会收到此错误消息。当您尝试向该地区不可用的 Amazon 服务发送数据时,可能会发生这种情况。您还必须为两者 Amazon IoT Events 以及您正在使用的 Amazon 服务选择相同的区域。

service-limits

包含 service‐limits 相关信息的分析结果对应以下错误消息:

  • 消息:负载中允许的内容表达式超过了状态 state-name 中事件 event-namecontent-expression-size 字节限制。

    如果操作负载的内容表达式大于 1024 字节,则可能会收到此错误消息。负载的内容表达式大小最多可为 1024 字节。

  • 消息:探测器模型定义中允许的状态数超过了 states-per-detector-model 限制。

    如果您的探测器模型的状态超过 20 个,则可能会收到此错误消息。探测器模型最多可拥有 20 个状态。

  • 消息:计时器 timer-name 的持续时间应至少为 minimum-timer-duration 秒。

    如果计时器的持续时间少于 60 秒,则可能会收到此错误消息。我们建议计时器的持续时间应在 60 到 31622400 秒之间。如果您指定计时器持续时间的表达式,则持续时间表达式的计算结果向下舍入为最接近的整数。

  • 消息:每个事件允许的操作数量超过了探测器模型定义中的 actions-per-event 限制

    如果事件的操作超过 10 个,您可能会收到此错误消息。对于探测器模型中的每个事件,最多可有 10 个操作。

  • 消息:每个状态允许的过渡事件数量超过了探测器模型定义中的 transition-events-per-state 限制。

    如果一个状态有超过 20 个过渡事件,则可能会收到此错误消息。探测器模型中的每个状态最多可拥有 20 个过渡事件。

  • 消息:每个状态允许的事件数超过了探测器模型定义中的 events-per-state 限制

    如果一个状态有超过 20 个事件,您可能会收到此错误消息。探测器模型中的每个状态最多可拥有 20 个事件。

  • 消息:可以与单个输入关联的最大探测器模型数量可能已超过限制。输入 input-name 用于 detector-models-per-input 探测器模型路由。

    如果您尝试将输入路由到超过 10 个探测器模型,则可能会收到此警告消息。您最多可以将 10 个不同的探测器模型与单个探测器模型相关联。

structure

包含 structure 相关信息的分析结果对应以下错误消息:

  • 消息:操作可能只定义了一种类型,但发现了具有 number-of-types 类型的操作。请分成单独的操作。

    如果您使用 API 操作来创建或更新探测器模型,在单个字段中指定了两个或多个操作,则可能会收到此错误消息。您可以定义一组 Action 对象。确保将每个操作定义为一个单独的对象。

  • 消息: TransitionEvent过渡事件名称将转换为不存在的状态名称

    如果找 Amazon IoT Events 不到过渡事件引用的下一个状态,则可能会收到此错误消息。确保定义了下一个状态并输入了正确的状态名称。

  • 消息: DetectorModelDefinition 有一个共享的州名:找到的状态名称重复了状态数。

    如果您对一个或多个状态使用相同的名称,则可能会收到此错误消息。确保为探测器模型中的每个状态指定唯一的名称。状态名称必须具有 1-128 个字符。有效字符:a-z、A-Z、0-9、_(下划线)和 -(连字符)。

  • 消息:定义的 initialStateName 初始状态名称与定义的状态不对应。

    如果初始状态名称不正确,您可能会收到此错误消息。在输入到达之前,探测器模型将保持初始(开始)状态。输入到达后,探测器模型会立即过渡到下一个状态。确保初始状态名称是已定义状态的名称,并且您输入了正确的名称。

  • 消息:探测器模型定义必须在一个条件中使用至少一个输入。

    如果您未在条件中指定输入,则可能会收到此错误。您必须在至少一个条件下使用至少一个输入。否则, Amazon IoT Events 不评估传入的数据。

  • 消息:只能在中设置秒数和持续时间表达式。 SetTimer

    如果您为计时器同时使用 secondsdurationExpression,则可能会收到此错误消息。请确保使用 secondsdurationExpression 作为 SetTimerAction 的参数。有关更多信息,请参阅 Amazon IoT Events API 参考中的SetTimer操作

  • 消息:探测器模型中的操作无法访问。检查启动操作的条件。

    如果探测器模型中的某个操作无法访问,则该事件的条件评估为 false。检查包含操作的事件的条件,确保其计算结果为 true。当事件的条件计算为 true 时,操作应变得可访问。

  • 消息:正在读取输入属性,但这可能是由计时器过期引起的。

    当出现以下任一情况时,可以读取输入属性的值:

    • 已收到新的输入值。

    • 当探测器中的计时器已过期。

    为确保仅在收到输入的新值时才对输入属性进行评估,请在条件中包括对 triggerType(“Message”) 函数的调用,如下所示:

    探测器模型中正在评估的原始条件:

    if ($input.HeartBeat.status == “OFFLINE”)

    类似于以下内容:

    if ( triggerType("MESSAGE") && $input.HeartBeat.status == “OFFLINE”)

    其中,对 triggerType(“Message”) 函数的调用是在条件中提供的初始输入之前进行的。通过使用这种技术,triggerType("Message") 函数的计算结果将为 true 并满足接收新输入值的条件。有关 triggerType 函数用法的更多信息,请在Amazon IoT Events 《开发人员指南》的 “表达式” 部分中搜索 triggerType

  • 消息:您的探测器模型中的状态无法访问。检查会导致过渡到所需状态的条件。

    如果探测器模型中的某个状态不可达,则导致传入过渡到该状态的条件评估为 false。检查探测器模型中传入的过渡到该不可达状态的条件是否评估为 true,这样所需的状态就可变为可访问。

  • 消息:计时器即将到期可能会导致发送意外数量的消息。

    为防止您的探测器模型因计时器已过期而进入发送意外数量的消息的无限状态,请考虑在探测器模型的条件下使用对 triggerType("Message") 函数的调用,如下所示:

    探测器模型中正在评估的原始条件:

    if (timeout("awake"))

    会转化为类似于以下内容的条件:

    if (triggerType("MESSAGE") && timeout("awake"))

    其中,对 triggerType(“Message”) 函数的调用是在条件中提供的初始输入之前进行的。

    此更改可防止在探测器中启动计时器操作,从而防止发送无限循环的消息。有关如何在探测器中使用计时器操作的更多信息,请参阅《Amazon IoT Events 开发者指南》的 “使用内置操作” 页面

expression-syntax

包含 expression‐syntax 相关信息的分析结果对应以下错误消息:

  • 消息 :您的负载表达式 {expression} 无效。定义的负载类型为 JSON,因此您必须指定 Amazon IoT Events 一个计算结果为字符串的表达式。

    如果指定的负载类型为 JSON,则 Amazon IoT Events 首先检查服务是否可以将您的表达式计算为字符串。计算结果不得为布尔值或数字。如果验证不成功,您可能会收到此错误。

  • 消息:SetVariableAction.value 必须是表达式。无法解析值“variable-value

    您可以使用 SetVariableAction 来定义具有 namevalue 的变量。value 可以是字符串、数字或布尔值。您也可以为 value 指定表达式。有关更多信息,请参阅 Amazon IoT Events API 参考中的SetVariable操作

  • 消息:我们无法解析您对 DynamoDB 操作的属性 (attribute-name) 的表达式。使用正确的语法输入表达式。

    必须对 DynamoDBAction. 替换模板中的所有参数使用表达式。有关更多信息,请参阅Amazon IoT Events API 参考中的DynamoDBAction

  • 消息:我们无法解析你对 DynamoDBv2 操作的 tableName 的表达式。使用正确的语法输入表达式。

    DynamoDBv2Action 中的 tableName 必须是字符串。必须使用 tableName 的表达式。这些表达式接受文字、运算符、函数、引用和替代模板。有关更多信息,请参阅Amazon IoT Events API 参考中的DynamoDBv2Action

  • 消息:我们无法将您的表达式评估为有效的 JSON。DynamoDBv2 操作仅支持 JSON 负载类型。

    DynamoDBv2 的负载类型必须为 JSON。确保它 Amazon IoT Events 可以将您的内容表达式评估为有效的 JSON。有关更多信息,请参阅Amazon IoT Events API 参考中的DynamoDBv2Action

  • 消息:我们无法解析 action-type 的负载的内容表达式。输入语法正确的内容表达式。

    内容表达式可以包含字符串 ('string')、变量 ($variable.variable-name)、输入值($input.input-name.path-to-datum)、字符串连接以及包含 ${}的字符串。

  • 消息:自定义负载必须为非空。

    如果您为操作选择了自定义负载,但没有在 Amazon IoT Events 控制台中输入内容表达式,则可能会收到此错误消息。如果选择自定义负载,则必须在自定义负载下输入内容表达式。有关更多信息,请参阅《Amazon IoT Events API 参考》中的有效负载‭

  • 消息:无法解析计时器'timer-name'的持续时间'duration-expression'。

    计时器持续时间表达式的计算结果必须是介于 60—31622400 之间的值。持续时间的计算结果向下舍入为最接近的整数。

  • 消息:无法解析 action-name 的表达 ‘expression'

    如果指定操作的表达式语法不正确,则可能会收到此消息。请确保使用正确的语法输入表达式。有关更多信息,请参阅 语法

  • 消息:无法解析 IotSitewiseActionfieldName 必须在表达式中使用正确的语法。

    如果 Amazon IoT Events 无法解析您的 Field IotSitewiseActionNam e,则可能会收到此错误。确保 fieldName 使用 Amazon IoT Events 可以解析的表达式。有关更多信息,请参阅 Amazon IoT Events API 参考IotSiteWiseAction中的。

data-type

包含 data‐type 相关信息的分析结果对应以下错误消息:

  • 消息:计时器 timer-name 的持续时间表达式 duration-expression 无效,它必须返回一个数字。

    如果 Amazon IoT Events 无法将计时器的持续时间表达式计算为数字,则可能会收到此错误消息。确保您的 durationExpression 可转换为数字。不支持其他数据类型,例如布尔值。

  • 消息:表达式 condition-expression 不是有效的条件表达式。

    如果 Amazon IoT Events 无法将您的condition-expression值计算为布尔值,则可能会收到此错误消息。布尔值必须为 TRUEFALSE。确保您的条件表达式可以转换为布尔值。如果结果不是布尔值,则它等同于 FALSE 且不会调用操作或过渡到事件中指定的 nextState

  • 消息:在以下表达式中找到了不兼容的数据类型 [ [inferred-types] 供参考:expression

    解决方案:探测器模型中所有具有相同输入属性或变量的表达式都必须引用相同的数据类型。

    使用以下信息解决此问题:

    • 当您将引用值作为一个或多个运算符的操作数时,确保您引用的所有数据类型均兼容。

      例如,在以下表达式中,整数 2==&& 运算符的操作数。为确保操作数兼容,$variable.testVariable + 1$variable.testVariable必须引用整数或小数。

      此外,整数 1 是运算符+的操作数。因此,$variable.testVariable 必须引用整数或小数。

      ‘$variable.testVariable + 1 == 2 && $variable.testVariable’
    • 当您使用引用作为传递给函数的自变量时,请确保该函数支持您引用的数据类型。

      例如,以下 timeout("time-name") 函数需要带有双引号的字符串作为自变量。如果您使用 timer-name 值的引用,则必须使用双引号引用字符串。

      timeout("timer-name")
      注意

      对于convert(type, expression)函数,如果您引用类型值,则您引用的计算结果必须是StringDecimalBoolean

    有关更多信息,请参阅 参考

  • 消息:不兼容的数据类型 [inferred-types] 用于引用。这可能会导致运行时系统错误。

    如果同一个输入属性或变量的两个表达式引用了两种数据类型,则可能会收到此警告消息。确保同一输入属性或变量的表达式在探测器模型中引用相同的数据类型。

referenced-data

包含 referenced‐data 相关信息的分析结果对应以下错误消息:

  • 消息:检测到损坏的计时器:计时器 timer-name 用于表达式中,但从未设置。

    如果您使用未设置的计时器,则可能会收到此错误消息。在表达式中使用计时器之前,必须先设置计时器。另外,请确保输入正确的计时器名称。

  • 消息:检测到变量损坏:变量 variable-name 用于表达式中,但从未设置。

    如果您使用未设置的变量,则可能会收到此错误消息。在表达式中使用变量之前,必须先对变量进行设置。另外,请确保输入了正确的变量名称。

  • 消息:检测到变量损坏:变量在设置为值之前在表达式中使用。

    必须先为每个变量赋一个值,然后才能在表达式中对变量进行求值。每次使用前都要设置变量的值,以便可以检索其值。另外,请确保输入了正确的变量名称。

referenced-resource

包含 referenced‐resource 相关信息的分析结果对应以下错误消息:

  • 消息:探测器模型定义包含对不存在的输入的引用。

    如果您使用表达式来引用不存在的输入,则可能会收到此错误消息。确保您的表达式引用现有的输入并输入正确的输入名称。如果没有输入,请创建一个输入。

  • 消息:探测器模型定义包含无效 InputName:输入名称

    如果您的探测器模型包含无效的输入名称,则可能会收到此错误消息。确保输入了正确的输入名称。输入名称必须具有 1-128 个字符。有效字符:a-z、A-Z、0-9、_(下划线)和 -(连字符)。