Expressions - Amazon IoT Events
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Expressions

Amazon IoT Events提供了在创建和更新检测器模型时指定值的多种方法。您可以使用表达式指定文字值,或者Amazon IoT Events可以在指定特定值之前对表达式进行评估。

Syntax

您可以使用文字、运算符、函数、引用和替代模板,以及Amazon IoT Events表达式。

Literals

  • 整数

  • 小数

  • 字符串

  • Boolean

Operators

一元
  • 不(布尔值):!

  • 不(按位):~

  • 减号(算术):-

字符串
  • 联接:+

    两个操作数必须是字符串。字符串文字必须用单引号 (') 引起来。

    例如:'my' + 'string'->'mystring'

算术
  • 补充:+

    两个操作数必须是数字。

  • 减法:-

  • 除:/

    除法的结果是四舍五入整数值,除非至少有一个操作数(除数或股息)是十进制值。

  • 乘法:*

按位(整数)
  • 或者:|

    例如:13 | 5->13

  • 和:&

    例如:13 & 5->5

  • XOR:^

    例如:13 ^ 5->8

  • 不是:~

    例如:~13->-14

Boolean
  • 小于:<

  • 小于或等于:<=

  • 等于:==

  • 不等于:!=

  • 大于或等于:>=

  • 大于:>

  • 和:&&

  • 或者:||

    注意

    当一个子表达式||包含未定义的数据,则该子表达式被视为false

圆括号

您可以使用括号对表达式中的术语进行分组。

Functions

内置函数
timeout("timer-name")

评估为true如果指定的计时器已经过去。替换”定时器名称”,并带有您定义的计时器的名称,用引号显示。在事件操作中,您可以定义一个计时器,然后启动计时器、重置计时器或清除之前定义的计时器。请参阅字段detectorModelDefinition.states.onInput|onEnter|onExit.events.actions.setTimer.timerName

在一种状态下设置的计时器可以在不同的状态下引用。在进入引用计时器的状态之前,您必须访问创建计时器的状态。

例如,检测器模型有两种状态:“已检查温度” 和 “已记录”。您创建了处于 “温度检查” 状态的计时器。您必须先访问 “温度检查” 状态,然后才能使用处于 “记录已记录” 状态的计时器。

为了确保准确性,应设置计时器的最短时间为 60 秒。

注意

timeout()返回true只有在实际计时器过期后第一次检查并返回false此后.

convert(type, expression)

计算为转换为指定类型的表达式的值。这些区域有:type值必须为StringBoolean,或者Decimal。使用其中一个关键字或计算为包含关键字的字符串的表达式。只有以下转换成功并返回有效值:

  • 布尔-> 字符串

    返回字符串"true"或者"false"

  • 十进制-> 字符串

  • 字符串-> 布尔

  • 字符串-> 十进制

    指定的字符串必须是十进制数的有效表示形式,或者convert()失败。

如果convert()不返回有效值,则它是一部分的表达式也是无效的。此结算等同于false并且不会触发actions或转换到nextState指定为表达式发生的事件的一部分。

isNull(expression)

评估为true如果表达式返回 null。例如,如果输入MyInput接收消息{ "a": null },则以下表达式的计算结算为true,但isUndefined($input.MyInput.a)评估为false

isNull($input.MyInput.a)
isUndefined(expression)

评估为true如果表达式未定义。例如,如果输入MyInput接收消息{ "a": null },则以下表达式的计算结算为false,但isNull($input.MyInput.a)评估为true

isUndefined($input.MyInput.a)
triggerType("type")

这些区域有:type值可以是"Message"或者"Timer"。评估为true如果计时器已过期,如下例所示,则正在评估它出现的事件条件。

triggerType("Timer")

或者收到了输入消息。

triggerType("Message")
currentInput("input")

评估为true如果由于收到了指定的输入消息而正在对其显示的事件条件进行评估。例如,如果输入Command接收消息{ "value": "Abort" },则以下表达式的计算结算为true

currentInput("Command")

使用此函数验证是否正在评估条件,因为已收到特定输入且计时器尚未过期,如以下表达式所示。

currentInput("Command") && $input.Command.value == "Abort"
字符串匹配函数
startsWith(expression1, expression2)

评估为true如果第一个字符串表达式以第二个字符串表达式开头。例如,如果输入MyInput接收消息{ "status": "offline"},则以下表达式的计算结算为true

startsWith($input.MyInput.status, "off")

这两个表达式的计算结算为字符串值。如果任一表达式不计算为字符串值,则函数的结果是未定义的。不执行任何转换。

endsWith(expression1, expression2)

评估为true如果第一个字符串表达式以第二个字符串表达式结尾。例如,如果输入MyInput接收消息{ "status": "offline" },则以下表达式的计算结算为true

endsWith($input.MyInput.status, "line")

这两个表达式的计算结算为字符串值。如果任一表达式不计算为字符串值,则函数的结果是未定义的。不执行任何转换。

contains(expression1, expression2)

评估为true如果第一个字符串表达式包含第二个字符串表达式。例如,如果输入MyInput接收消息{ "status": "offline" },则以下表达式的计算结算为true

contains($input.MyInput.value, "fli")

这两个表达式的计算结算为字符串值。如果任一表达式不计算为字符串值,则函数的结果是未定义的。不执行任何转换。

按位整数操作函数
bitor(expression1, expression2)

计算整数表达式的按位 OR(对整数的相应位执行二进制 OR 运算)。例如,如果输入MyInput接收消息{ "value1": 13, "value2": 5 },则以下表达式的计算结算为13

bitor($input.MyInput.value1, $input.MyInput.value2)

两个表达式都必须计算为整数值。如果任一表达式不计算为整数值,则函数的结果是未定义的。不执行任何转换。

bitand(expression1, expression2)

计算整数表达式的按位 AND(对整数的相应位执行二进制 AND 运算)。例如,如果输入MyInput接收消息{ "value1": 13, "value2": 5 },则以下表达式的计算结算为5

bitand($input.MyInput.value1, $input.MyInput.value2)

两个表达式都必须计算为整数值。如果任一表达式不计算为整数值,则函数的结果是未定义的。不执行任何转换。

bitxor(expression1, expression2)

计算整数表达式的按位异或(二进制异或运算在整数的相应位上执行)。例如,如果输入MyInput接收消息{ "value1": 13, "value2": 5 },则以下表达式的计算结算为8

bitxor($input.MyInput.value1, $input.MyInput.value2)

两个表达式都必须计算为整数值。如果任一表达式不计算为整数值,则函数的结果是未定义的。不执行任何转换。

bitnot(expression)

计算整数表达式的按位 NOT(对整数的位执行二进制 NOT 运算)。例如,如果输入MyInput接收消息{ "value": 13 },则以下表达式的计算结算为-14

bitnot($input.MyInput.value)

两个表达式都必须计算为整数值。如果任一表达式不计算为整数值,则函数的结果是未定义的。不执行任何转换。

References

输入

$input.input-name.path-to-data

input-name是您使用CreateInputaction.

例如,如果您有一个名为TemperatureInput您为其定义inputDefinition.attributes.jsonPath条目时,这些值可能会显示在以下可用字段中。

{ "temperature": 78.5, "date": 2018-10-03T16:09:09Z }

要引用temperature字段中,使用以下命令:

$input.TemperatureInput.temperature

对于值为数组的字段,您可以使用[n]。例如,给定以下值:

{ "temperatures": [ 78.4, 77.9, 78.8 ], "date": 2018-10-03T16:09:09Z }

78.8可以通过以下命令引用。

$input.TemperatureInput.temperatures[2]
Variables

$variable.variable-name

这些区域有:variable-name是一个变量,您使用CreateDetectorModelaction.

例如,如果您有名为TechnicianID你使用detectorDefinition.states.onInputEvents.actions.setVariable.variableName,您可以使用以下命令引用最近给予变量的(字符串)值。

$variable.TechnicianID

您只能使用setVariableaction. 不能为表达式中的变量指定值。变量无法取消设置。例如,您不能将其赋值null

注意

在使用不遵循(正则表达式)模式的标识符的引用中[a-zA-Z][a-zA-Z0-9_]*,则必须将这些标识符用反引号(`)。例如,对名为MyInput的字段名为_value必须将此字段指定为$input.MyInput.`_value`

在表达式中使用引用时,请检查以下内容:

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

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

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

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

    例如,下面的timeout("time-name")函数需要一个带双引号的字符串作为参数。如果将引用用于定时器名称值,则必须引用带双引号的字符串。

    timeout("timer-name")
    注意

    对于convert(type, expression)函数,如果您使用type值,则引用的评估结果必须是StringDecimal,或者Boolean

Amazon IoT Events表达式支持整数、十进制、字符串和布尔数据类型。下表提供了不兼容的类型对的列表。

不兼容的类型对

整数、字符串

整数、布尔值

小数、字符串

小数、布尔值

字符串、布尔值

替换模板

'${expression}'

这些区域有:${}将字符串标识为插值字符串。这些区域有:expression可以是任意Amazon IoT Events表达式。这包括运算符、函数和引用。

例如,您使用了集变量操作操作来定义变量。这些区域有:variableNameSensorID,以及value10。您可以创建以下替代模板。

替换模板 结果字符串
'${'Sensor ' + $variable.SensorID}'

"Sensor 10"

'Sensor ' + '${$variable.SensorID + 1}'

"Sensor 11"

'Sensor 10: ${$variable.SensorID == 10}'

"Sensor 10: true"

'{\"sensor\":\"${$variable.SensorID + 1}\"}'

"{\"sensor"\:\"11\"}"

'{\"sensor\":${$variable.SensorID + 1}}'

"{\"sensor\":11}"