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

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

表达式

Amazon IoT Events 提供了多种在创建和更新探测器模型时指定值的方法。您可以使用表达式来指定文字值,也Amazon IoT Events可以在指定特定值之前对表达式求值。

语法

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

文本

  • 整数

  • 十进制

  • 字符串

  • 布尔值

运算符

一元运算
  • 非运算(布尔):!

  • 非运算(按位):~

  • 减号(算术):-

字符串
  • 联接:+

    两个操作数都必须是字符串。字符串文本必须括在单引号 (') 内。

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

算术
  • 加 (+)

    两个操作数都必须是数字。

  • 减 :-

  • 除:/

    除法结果为四舍五入的整数值,除非操作数(除数或被除数)中至少有一个是小数值。

  • 乘:*

按位(整数)
  • 或:|

    例如:13 | 5 -> 13

  • 与:&

    例如:13 & 5 -> 5

  • 异或:^

    例如:13 ^ 5 -> 8

  • 非:~

    例如:~13 -> -14

布尔值
  • 小于:<

  • 小于或等于:<=

  • 等于:==

  • 不等于:!=

  • 大于或等于:>=

  • 大于:>

  • 与:&&

  • 或:||

    注意

    || 的子表达式包含未定义的数据时,该子表达式将被视为 false

圆括号

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

函数

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

如果指定的计时器已过,则计算为 true。将 "timer-name" 替换为您定义的计时器名称(用引号表示)。在事件操作中,您可以定义计时器,然后启动计时器、重置计时器或清除先前定义的计时器。参见字段 detectorModelDefinition.states.onInput|onEnter|onExit.events.actions.setTimer.timerName

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

例如,探测器模型有两种状态:TemperatureChecked 和 Recordupdated。您创建了一个处于 TemperatureChecked 状态的计时器。必须先访问 TemperatureChecked 状态,然后才能使用处于 RecorduPdated 状态的计时器。

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

注意

timeout() 仅在计时器实际到期后首次检查时返回 true,之后返回 false

convert(type, expression)

计算为转换为指定类型的表达式的值。类型 值必须为 StringBooleanDecimal。使用其中一个关键字或计算为包含该关键字的字符串的表达式。只有以下转换成功并返回有效值:

  • 布尔值 -> 字符串

    返回字符串 "true""false"

  • 小数值 -> 字符串

  • 字符串-> 布尔值

  • 字符串-> 小数值

    指定的字符串必须是小数值的有效表示形式,否则 convert() 将失败。

如果 convert() 未返回有效值,则它所属的表达式也无效。此结果等同于 false 且不会触发 actions 或过渡到作为表达式发生的事件的一部分而指定的 nextState

isNull(expression)

在表达式返回为空时计算 true。例如,如果输入 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")

类型 值可以是 "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)

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

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

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

bitand(expression1, expression2)

计算整数表达式的按位与(对整数的相应位执行二进制与运算)。例如,如果输入 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)

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

bitnot($input.MyInput.value)

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

参考

输入

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

input-name 是您使用 CreateInput 操作来创建的输入。

例如,如果您有一个名为 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 是您使用 createDetectorModel 操作来定义的变量。

例如,如果您使用定义了一个名为 TechnicianID 的变量(您使用 detectorDefinition.states.onInputEvents.actions.setVariable.variableName 定义了该变量),则可以使用以下命令引用最近赋予该变量的(字符串)值。

$variable.TechnicianID

只能使用 setVariable 操作来设置变量的值。不能为表达式中的变量赋值。变量不能被取消设置。例如,您不能为其分配值 null

注意

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

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

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

    例如,在以下表达式中,整数 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

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

不兼容的类型对

整数、字符串

整数、布尔值

小数值、字符串

小数值、布尔值

字符串、布尔值

替换模板

'${expression}'

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

例如,您使用了 setVariableAction 操作来定义变量。variableNameSensorIDvalue10。您可以创建以下替换模板。

替换模板 结果字符串
'${'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}"