

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

# 为创建资产模型、组件模型和接口 Amazon IoT SiteWise
创建 模型

Amazon IoT SiteWise 资产模型、组件模型和接口可推动工业数据的标准化。资产模型定义了整体资产，例如风力涡轮机或生产线。组件模型表示构成资产的各个组件，例如叶片、发电机或传感器。接口强制执行不同资产模型的标准。通过创建这些模型，您可以以反映工业设备在现实世界中的关系和层次结构的方式组织和结构化您的资产数据，从而使其更易于监控、分析和维护。

资产模型或组件模型包含名称、描述、资产属性，以及（可选）将属性组合在一起或引用子装配件的组件模型的自定义复合模型。

在中 Amazon IoT SiteWise，您可以创建资产模型、组件模型和接口，以表示工业资产及其组件的结构和属性。
+ 使用**资产模型**创建资产。除了上面列出的特征外，资产模型还可以包含定义资产之间关系的层次结构定义。
+ **组件模型**表示资产模型或其他组件模型中的子装配件。创建组件模型时，您可以在资产模型和其他组件模型中添加对该组件模型的引用。但是，您无法直接从组件模型创建资源。
+ **接口**在不同的资产模型中强制执行标准。接口定义了资产模型必须实现的通用属性、指标和层次结构。您不能直接从界面创建资产，但它们有助于确保相似资产类型之间的一致性。

创建资产模型或组件模型后，您可以为其创建自定义复合模型，以将属性组合在一起或引用现有的组件模型。您还可以将接口链接到资产模型以强制标准化。

有关如何创建资产模型、组件模型和接口的详细信息，请参阅以下各节。

**Topics**
+ [

# 在中创建资产模型 Amazon IoT SiteWise
](create-asset-models.md)
+ [

# 创建组件模型
](create-component-models.md)
+ [

# 定义数据属性
](asset-properties.md)
+ [

# 创建自定义复合模型（组件）
](create-custom-composite-models.md)

# 在中创建资产模型 Amazon IoT SiteWise


Amazon IoT SiteWise 资产模型推动工业数据的标准化。资产模型包含名称、描述、资产属性和资产层次结构定义。例如，您可以使用温度、每分钟旋转次数 (RPM) 和功率属性来定义风力涡轮机模型。然后，可以使用净功率输出属性和风力涡轮机层次结构定义来定义风电场模型。

**注意**  
我们建议您从最低级别的节点开始对运营进行建模。例如，在创建风电场模型之前创建风力涡轮机模型。资产层次结构定义包含对现有资产模型的引用。通过这种方法，您可以在创建模型时定义资产层次结构。
资产模型无法包含其他资产模型。如果必须定义一个可以在另一个模型中作为子装配件引用的模型，则应改为创建一个组件--> 模型。有关更多信息，请参阅 [创建组件模型](create-component-models.md)。

以下各节介绍如何使用 Amazon IoT SiteWise 控制台或 API 创建资产模型。以及可用于创建模型的不同类型的资产属性和资产层次结构。

**Topics**
+ [

## 创建资产模型（控制台）
](#create-asset-model-console)
+ [

## 创建资产模型（Amazon CLI）
](#create-asset-model-cli)
+ [

## 资产模型示例
](#asset-model-examples)
+ [

# 定义资产模型层次结构
](define-asset-hierarchies.md)

## 创建资产模型（控制台）


您可以使用 Amazon IoT SiteWise 控制台创建资产模型。 Amazon IoT SiteWise 控制台提供各种功能，例如公式 auto 补全，可以帮助您定义有效的资产模型。

**创建资产模型（控制台）**

1. <a name="sitewise-open-console"></a>导航至 [Amazon IoT SiteWise 控制台](https://console.amazonaws.cn/iotsitewise/)。

1. <a name="sitewise-choose-models"></a>在导航窗格中，选择**模型**。

1. 选择 “**创建资产模型**”。

1. 在 **创建模型** 页面上，执行以下操作：

   1. 为资产模型输入 **名称**，例如 **Wind Turbine** 或 **Wind Turbine Model**。此名称对于您账户在此区域的所有模型都必须是唯一的。

   1. （可选）为模型添加**外部 ID**。这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。

   1. （可选）为模型添加 **测量值定义**。测量值代表来自您的设备的数据流。有关更多信息，请参阅 [定义来自设备的数据流（测量值）](measurements.md)。

   1. （可选）为模型添加 **转换定义**。转换是将数据从一种表单映射到另一种表单的公式。有关更多信息，请参阅 [转换数据（转换）](transforms.md)。

   1. （可选）为模型添加 **指标定义**。指标是按时间间隔汇总数据的公式。指标可以从关联资产的指标中输入数据，这样您可以计算统计信息，从而提供对整个操作或部分操作的见解。有关更多信息，请参阅 [聚合来自属性和其他资产（指标）的数据](metrics.md)。

   1. （可选）为模型添加 **层次结构定义**。层次结构是资产之间的关系。有关更多信息，请参阅 [定义资产模型层次结构](define-asset-hierarchies.md)。

   1. （可选）为资产模型添加标签。有关更多信息，请参阅 [标记您的 Amazon IoT SiteWise 资源](tag-resources.md)。

   1. 选择**创建模型**。

   创建资产模型时， Amazon IoT SiteWise 控制台会导航到新模型的页面。在此页面上，您可以查看模型的 **状态**，最初为 **创建**。此页面会自动更新，因此您可以等待模型的状态更新。
**注意**  
复杂模型的资产模型创建流程最多可能需要几分钟时间。在资产模型状态为**活动**后，您可以使用资产模型创建资产。有关更多信息，请参阅 [资产和模型状态](asset-and-model-states.md)。

## 创建资产模型（Amazon CLI）


您可以使用 Amazon Command Line Interface (Amazon CLI) 来创建资产模型。

使用 [CreateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_CreateAssetModel.html) 操作创建具有属性和层次结构的资产模型。此操作需要具有以下结构的负载。

```
{
  "assetModelType": "ASSET_MODEL",
  "assetModelName": "String",
  "assetModelDescription": "String",
  "assetModelProperties": Array of AssetModelProperty,
  "assetModelHierarchies": Array of AssetModelHierarchyDefinition
}
```

**要创建资产模型（Amazon CLI），请执行以下操作：**

1. 创建一个名为 `asset-model-payload.json` 的文件，然后将以下 JSON 对象复制到该文件中。

   ```
   {
     "assetModelType": "ASSET_MODEL",
     "assetModelName": "",
     "assetModelDescription": "",
     "assetModelProperties": [
   
     ],
     "assetModelHierarchies": [
   
     ],
     "assetModelCompositeModels": [
   
     ]
   }
   ```

1. 使用首选的 JSON 文本编辑器编辑 `asset-model-payload.json` 文件的以下内容：

   1. 输入资产模型的名称 (`assetModelName`)，如 **Wind Turbine** 或 **Wind Turbine Model**。此名称对于您账户在此 Amazon Web Services 区域的所有资产模型和组件模型都必须是唯一的。

   1. （可选）输入该资产模型的外部 ID（`assetModelExternalId`）。这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。

   1. （可选）输入资产模型的说明（`assetModelDescription`），或删除 `assetModelDescription` 键/值对。

   1. （可选）定义模型的资产属性 (`assetModelProperties`)。有关更多信息，请参阅 [定义数据属性](asset-properties.md)。

   1. （可选）定义模型的资产层次结构 (`assetModelHierarchies`)。有关更多信息，请参阅 [定义资产模型层次结构](define-asset-hierarchies.md)。

   1. （可选）为资产模型添加标签（`tags`）。有关更多信息，请参阅 [标记您的 Amazon IoT SiteWise 资源](tag-resources.md)。

1. 运行以下命令，根据 JSON 文件中的定义创建资产模型。

   ```
   aws iotsitewise create-asset-model --cli-input-json file://asset-model-payload.json
   ```

   此操作将返回包含您在创建资产时引用的 `assetModelId` 的响应。响应中还包含模型的状态（`assetModelStatus.state`），最初为 `CREATING`。在传播更改之前，资产模型的状态为 `CREATING`。
**注意**  
复杂模型的资产模型创建流程最多可能需要几分钟时间。要检查资产模型的当前状态，请[DescribeAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_DescribeAssetModel.html)通过指定`assetModelId`。在资产模型状态为 `ACTIVE` 后，您可以使用资产模型创建资产。有关更多信息，请参阅 [资产和模型状态](asset-and-model-states.md)。

1. （可选）为您的资产模型创建自定义复合模型。借助自定义复合模型，您可以在模型内对属性进行分组，也可以通过引用组件模型来包含子装配件。有关更多信息，请参阅 [创建自定义复合模型（组件）](create-custom-composite-models.md)。

## 资产模型示例


本节包含资产模型定义示例，您可以使用这些示例使用 Amazon CLI 和创建资产模型 Amazon IoT SiteWise SDKs。这些资产模型代表风力涡轮机和风电场。风力涡轮机资产会摄取原始传感器数据并计算功率和平均风速等值。风电场资产计算诸如风电场中所有风力涡轮机的总功率之类的值。

**Topics**
+ [

### 风力涡轮机资产模型
](#example-wind-turbine)
+ [

### 风电场资产模型
](#example-wind-farm)

### 风力涡轮机资产模型


以下资产模型表示风电场中的涡轮机。风力涡轮机摄取传感器数据来计算功率和平均风速等值。

**注意**  
此示例模型类似于 Amazon IoT SiteWise 演示中的风力涡轮机模型。有关更多信息，请参阅 [使用演 Amazon IoT SiteWise 示](getting-started-demo.md)。

```
{
  "assetModelType": "ASSET_MODEL",
  "assetModelName": "Wind Turbine Asset Model",
  "assetModelDescription": "Represents a turbine in a wind farm.",
  "assetModelProperties": [
    {
      "name": "Location",
      "dataType": "STRING",
      "type": {
        "attribute": {
          "defaultValue": "Renton"
        }
      }
    },
    {
      "name": "Make",
      "dataType": "STRING",
      "type": {
        "attribute": {
          "defaultValue": "Amazon"
        }
      }
    },
    {
      "name": "Model",
      "dataType": "INTEGER",
      "type": {
        "attribute": {
          "defaultValue": "500"
        }
      }
    },
    {
      "name": "Torque (KiloNewton Meter)",
      "dataType": "DOUBLE",
      "unit": "kNm",
      "type": {
        "measurement": {}
      }
    },
    {
      "name": "Wind Direction",
      "dataType": "DOUBLE",
      "unit": "Degrees",
      "type": {
        "measurement": {}
      }
    },
    {
      "name": "RotationsPerMinute",
      "dataType": "DOUBLE",
      "unit": "RPM",
      "type": {
        "measurement": {}
      }
    },
    {
      "name": "Wind Speed",
      "dataType": "DOUBLE",
      "unit": "m/s",
      "type": {
        "measurement": {}
      }
    },
    {
      "name": "RotationsPerSecond",
      "dataType": "DOUBLE",
      "unit": "RPS",
      "type": {
        "transform": {
          "expression": "rpm / 60",
          "variables": [
            {
              "name": "rpm",
              "value": {
                "propertyId": "RotationsPerMinute"
              }
            }
          ]
        }
      }
    },
    {
      "name": "Overdrive State",
      "dataType": "DOUBLE",
      "type": {
        "transform": {
          "expression": "gte(torque, 3)",
          "variables": [
            {
              "name": "torque",
              "value": {
                "propertyId": "Torque (KiloNewton Meter)"
              }
            }
          ]
        }
      }
    },
    {
      "name": "Average Power",
      "dataType": "DOUBLE",
      "unit": "Watts",
      "type": {
        "metric": {
          "expression": "avg(torque) * avg(rps) * 2 * 3.14",
          "variables": [
            {
              "name": "torque",
              "value": {
                "propertyId": "Torque (Newton Meter)"
              }
            },
            {
              "name": "rps",
              "value": {
                "propertyId": "RotationsPerSecond"
              }
            }
          ],
          "window": {
            "tumbling": {
              "interval": "5m"
            }
          }
        }
      }
    },
    {
      "name": "Average Wind Speed",
      "dataType": "DOUBLE",
      "unit": "m/s",
      "type": {
        "metric": {
          "expression": "avg(windspeed)",
          "variables": [
            {
              "name": "windspeed",
              "value": {
                "propertyId": "Wind Speed"
              }
            }
          ],
          "window": {
            "tumbling": {
              "interval": "5m"
            }
          }
        }
      }
    },
    {
      "name": "Torque (Newton Meter)",
      "dataType": "DOUBLE",
      "unit": "Nm",
      "type": {
        "transform": {
          "expression": "knm * 1000",
          "variables": [
            {
              "name": "knm",
              "value": {
                "propertyId": "Torque (KiloNewton Meter)"
              }
            }
          ]
        }
      }
    },
    {
      "name": "Overdrive State Time",
      "dataType": "DOUBLE",
      "unit": "Seconds",
      "type": {
        "metric": {
          "expression": "statetime(overdrive_state)",
          "variables": [
            {
              "name": "overdrive_state",
              "value": {
                "propertyId": "Overdrive State"
              }
            }
          ],
          "window": {
            "tumbling": {
              "interval": "5m"
            }
          }
        }
      }
    }
  ],
  "assetModelHierarchies": []
}
```

### 风电场资产模型


以下资产模型表示由多台风力涡轮机组成的风电场。该资产模型定义了风力涡轮机模型的[层次结构](define-asset-hierarchies.md)。这使风电场能够根据风电场中所有风力涡轮机的数据计算值（例如平均功率）。

**注意**  
此示例模型类似于 Amazon IoT SiteWise 演示中的风力发电场模型。有关更多信息，请参阅 [使用演 Amazon IoT SiteWise 示](getting-started-demo.md)。

此资产模型依赖于[风力涡轮机资产模型](#example-wind-turbine)。将 `propertyId` 和 `childAssetModelId` 值替换为现有风力涡轮机资产模型中的对应值。

```
{
  "assetModelName": "Wind Farm Asset Model",
  "assetModelDescription": "Represents a wind farm.",
  "assetModelProperties": [
    {
      "name": "Code",
      "dataType": "INTEGER",
      "type": {
        "attribute": {
          "defaultValue": "300"
        }
      }
    },
    {
      "name": "Location",
      "dataType": "STRING",
      "type": {
        "attribute": {
          "defaultValue": "Renton"
        }
      }
    },
    {
      "name": "Reliability Manager",
      "dataType": "STRING",
      "type": {
        "attribute": {
          "defaultValue": "Mary Major"
        }
      }
    },
    {
      "name": "Total Overdrive State Time",
      "dataType": "DOUBLE",
      "unit": "seconds",
      "type": {
        "metric": {
          "expression": "sum(overdrive_state_time)",
          "variables": [
            {
              "name": "overdrive_state_time",
              "value": {
                "propertyId": "ID of Overdrive State Time property in Wind Turbine Asset Model",
                "hierarchyId": "Turbine Asset Model"
              }
            }
          ],
          "window": {
            "tumbling": {
              "interval": "5m"
            }
          }
        }
      }
    },
    {
      "name": "Total Average Power",
      "dataType": "DOUBLE",
      "unit": "Watts",
      "type": {
        "metric": {
          "expression": "sum(turbine_avg_power)",
          "variables": [
            {
              "name": "turbine_avg_power",
              "value": {
                "propertyId": "ID of Average Power property in Wind Turbine Asset Model",
                "hierarchyId": "Turbine Asset Model"
              }
            }
          ],
          "window": {
            "tumbling": {
              "interval": "5m"
            }
          }
        }
      }
    }
  ],
  "assetModelHierarchies": [
    {
      "name": "Turbine Asset Model",
      "childAssetModelId": "ID of Wind Turbine Asset Model"
    }
  ]
}
```

# 定义资产模型层次结构


您可以定义资产模型层次结构，以便在工业运营中的资产模型之间创建逻辑关联。例如，您可以定义由陆上和海上风电场组成的风电场。陆上风电场包含涡轮机和陆上位置。海上风电场包含涡轮机和海上位置。

![\[Amazon IoT SiteWise 资产模型之间的风电场层次结构。\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/asset-model-hierarchies.png)


当您通过层次将子资产模型与父资产模型关联时，父资产模型的指标可以从子资产模式的指标输入数据。您可以使用资产模型层次结构和指标来计算统计信息，从而提供对整个操作或部分操作的见解。有关更多信息，请参阅 [聚合来自属性和其他资产（指标）的数据](metrics.md)。

每个层次结构定义父资产模型和子资产模型之间的关系。在父资产模型中，您可以为同一个子资产模型定义多个层次结构。例如，如果您的风电场中有两种不同类型的风力涡轮机，其中所有风力涡轮机都由相同的资产模型表示，则可以为每种类型定义一个层次结构。然后，您可以在风电场模型中定义指标，以计算每种风力涡轮机的独立和组合统计数据。

一个父资产模型可以与多个子资产模型相关联。例如，如果您的陆上风电场和海上风电场由两种不同的资产模型表示，则可以将这些资产模型与相同的父风电场资产模型关联起来。

子资产模型也可以与多个父资产模型相关联。例如，如果您有两种不同类型的风电场，其中所有风力涡轮机都由相同的资产模型表示，则可以将风力涡轮机资产模型与不同的风电场资产模型相关联。

**注意**  
定义资产模型层次结构时，子资产模型必须是 `ACTIVE` 或具有之前的 `ACTIVE` 版本。有关更多信息，请参阅 [资产和模型状态](asset-and-model-states.md)。

定义分层资产模型并创建资产后，您可以关联资产以完成父子关系。有关更多信息，请参阅[在中为资产模型创建资产 Amazon IoT SiteWise](create-assets.md)和[关联资产和取消关联资产](add-associated-assets.md)。

**Topics**
+ [

## 定义资产模型层次结构（控制台）
](#define-asset-hierarchies-console)
+ [

## 定义资产层次结构（Amazon CLI）
](#define-asset-hierarchies-cli)

## 定义资产模型层次结构（控制台）


在 Amazon IoT SiteWise 控制台中为资产模型定义层次结构时，需要指定以下参数：
+ **层次结构名称** – 层次结构的名称，如 **Wind Turbines**。
+ **层次模型** – 子资产模型。
+ **层次结构外部 ID**（可选）- 这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。

有关更多信息，请参阅 [创建资产模型（控制台）](create-asset-models.md#create-asset-model-console)。

## 定义资产层次结构（Amazon CLI）


使用 Amazon IoT SiteWise API 为资产模型定义层次结构时，需要指定以下参数：
+ `name` – 层次结构的名称，如 **Wind Turbines**。
+ `childAssetModelId` – 层次结构的子资产模型的 ID 或外部 ID。您可以使用该[ListAssetModels](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_ListAssetModels.html)操作来查找现有资产模型的 ID。

**Example 层次结构定义示例**  
以下示例演示一个表示风电场与风力涡轮机的关系的资产模型层次结构。此对象就是一个示例[AssetModelHierarchy](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_AssetModelHierarchy.html)。有关更多信息，请参阅 [创建资产模型（Amazon CLI）](create-asset-models.md#create-asset-model-cli)。  

```
{
  ...
  "assetModelHierarchies": [
    {
      "name": "Wind Turbines",
      "childAssetModelId": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE"
    },
  ]
}
```

# 创建组件模型
创建组件模型

使用 Amazon IoT SiteWise 组件模型定义子组件，您可以从资产模型或其他组件模型中引用这些子组件。这样，您就可以在多个其他模型中重复使用组件的定义，也可以在同一个模型中多次重复使用该组件的定义。

定义组件模型的过程与定义资产模型非常相似。与资产模型一样，组件模型也有名称、描述和资产属性。但是，组件模型不能包含资产层次结构定义，因为组件模型本身不能直接用于创建资产。组件模型也无法定义警报。

例如，您可以使用电机温度、编码器温度和绝缘电阻属性为伺服电机定义组件。然后，您可以为包含伺服电机的设备（例如数控机床）定义资产模型。

**注意**  
我们建议您从最低级别的节点开始对运营进行建模。例如，在创建数控机床的资产模型之前，先创建伺服电机组件。资产模型包含对现有组件模型的引用。
您无法直接从组件模型创建资源。要创建使用您的组件的资产，您必须为该资产创建资产模型。然后，为其创建引用您的组件的自定义复合模型。有关创建资产模型的更多信息，请参阅[在中创建资产模型 Amazon IoT SiteWise](create-asset-models.md)。有关创建自定义复合模型的更多信息，请参阅[创建自定义复合模型（组件）](create-custom-composite-models.md)。

以下各节介绍如何使用 Amazon IoT SiteWise API 创建组件模型。

**Topics**
+ [

## 创建组件模型（Amazon CLI）
](#create-component-model-cli)
+ [

## 示例组件模型
](#component-model-example)

## 创建组件模型（Amazon CLI）


您可以使用 Amazon Command Line Interface (Amazon CLI) 来创建组件模型。

使用[CreateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_CreateAssetModel.html)操作创建具有属性的组件模型。此操作需要具有以下结构的有效载荷：

```
{
  "assetModelType": "COMPONENT_MODEL",
  "assetModelName": "String",
  "assetModelDescription": "String",
  "assetModelProperties": Array of AssetModelProperty,
}
```

**要创建组件模型（Amazon CLI），请执行以下步骤：**

1. 创建一个名为 `component-model-payload.json` 的文件，然后将以下 JSON 对象复制到该文件中：

   ```
   {
     "assetModelType": "COMPONENT_MODEL",
     "assetModelName": "",
     "assetModelDescription": "",
     "assetModelProperties": [
   
     ]
   }
   ```

1. 使用首选的 JSON 文本编辑器编辑 `component-model-payload.json` 文件的以下内容：

   1. 为组件模型输入一个名称（`assetModelName`），如 **Servo Motor** 或 **Servo Motor Model**。此名称对于您账户在此 Amazon Web Services 区域的所有资产模型和组件模型都必须是唯一的。

   1. （可选）为组件模型输入一个外部 ID（`assetModelExternalId`）。这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。

   1. （可选）输入资产模型的说明（`assetModelDescription`），或删除 `assetModelDescription` 键/值对。

   1. （可选）定义组件模型的资产属性（`assetModelProperties`）。有关更多信息，请参阅 [定义数据属性](asset-properties.md)。

   1. （可选）为资产模型添加标签（`tags`）。有关更多信息，请参阅 [标记您的 Amazon IoT SiteWise 资源](tag-resources.md)。

1. 运行以下命令，根据 JSON 文件中的定义创建组件模型。

   ```
   aws iotsitewise create-asset-model --cli-input-json file://component-model-payload.json
   ```

   该操作会返回一个响应，其中包含您在资产模型或其他组件模型中添加对组件模型的引用时所引用的 `assetModelId`。响应中还包含模型的状态（`assetModelStatus.state`），最初为 `CREATING`。在传播更改之前，组件模型的状态为 `CREATING`。
**注意**  
复杂模型的组件模型创建流程最多可能需要几分钟时间。要检查组件模型的当前状态，请[DescribeAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_DescribeAssetModel.html)通过指定`assetModelId`。组件模型状态变为 `ACTIVE` 后，您可以在资产模型或其他组件模型中添加对该组件模型的引用。有关更多信息，请参阅 [资产和模型状态](asset-and-model-states.md)。

1. （可选）为您的组件模型创建自定义复合模型。借助自定义复合模型，您可以在模型内对属性进行分组，也可以通过引用其他组件模型来包含子装配件。有关更多信息，请参阅 [创建自定义复合模型（组件）](create-custom-composite-models.md)。

## 示例组件模型


本节包含一个组件模型定义示例，您可以使用该示例创建带有 Amazon CLI 和的组件模型 Amazon IoT SiteWise SDKs。此组件模型表示可以在其他设备（例如数控机床）中使用的伺服电机。

**Topics**
+ [

### 伺服电机组件模型
](#example-servo-motor)

### 伺服电机组件模型


以下组件模型表示可在数控机床等设备中使用的伺服电机。伺服电机提供各种测量值，例如温度和电阻。这些测量值可用作从引用伺服电机组件模型的资产模型创建的资产的属性。

```
{
    "assetModelName": "ServoMotor",
    "assetModelType": "COMPONENT_MODEL",
    "assetModelProperties": [
        {
            "dataType": "DOUBLE",
            "name": "Servo Motor Temperature",
            "type": {
            "measurement": {}
            },
            "unit": "Celsius"
        },
        {
            "dataType": "DOUBLE",
            "name": "Spindle speed",
            "type": {
            "measurement": {}
            },
            "unit": "rpm"
        }
    ]
}
```

# 定义数据属性


*资产属性*是每个资产中包含资产数据的结构。资产属性可以是以下任一类型：
+ **属性** – 通常为静态的资产特征，如设备制造商或地理区域。有关更多信息，请参阅 [定义静态数据（属性）](attributes.md)。
+ **测量值** – 资产的原始设备的传感器数据流，如时间戳转速值或以摄氏度为单位的时间戳温度值。测量值由数据流别名定义。有关更多信息，请参阅 [定义来自设备的数据流（测量值）](measurements.md)。
+ **转换** – 资源转换后的时间序列值，如以华氏度为单位的时间戳温度值。转换由表达式和随该表达式一起使用的变量定义。有关更多信息，请参阅 [转换数据（转换）](transforms.md)。
+ **指标** – 在指定时间间隔内聚合的资产数据，如每小时平均温度。指示由时间间隔、表达式和随该表达式一起使用的变量定义。指标表达式可以输入关联资产的指标属性，这样您就可以计算出代表您的操作或操作子集的指标。有关更多信息，请参阅 [聚合来自属性和其他资产（指标）的数据](metrics.md)。

有关更多信息，请参阅 [在中创建资产模型 Amazon IoT SiteWise](create-asset-models.md)。

有关如何使用测量值、转换和指标计算整体设备效率 (OEE) 的示例，请参阅[计算 OEE Amazon IoT SiteWise](calculate-oee.md)。

**Topics**
+ [

# 定义静态数据（属性）
](attributes.md)
+ [

# 定义来自设备的数据流（测量值）
](measurements.md)
+ [

# 转换数据（转换）
](transforms.md)
+ [

# 聚合来自属性和其他资产（指标）的数据
](metrics.md)
+ [

# 使用公式表达式
](formula-expressions.md)

# 定义静态数据（属性）
定义静态数据

*资产属性*表示通常为静态的信息，如设备制造商或地理位置。您从资产模型创建的每个资产都包含该模型的属性。

**Topics**
+ [

## 定义属性（控制台）
](#define-attributes-console)
+ [

## 定义属性（Amazon CLI）
](#define-attributes-cli)

## 定义属性（控制台）


在 Amazon IoT SiteWise 控制台中为资产模型定义属性时，需要指定以下参数：
+ <a name="asset-property-name-console"></a>**名称** – 属性的名称。
+ **默认值** – （可选）此属性的默认值。根据模型创建的资产具有此属性值。有关如何覆盖从模型创建的资产中的默认值的更多信息，请参阅[更新属性值](update-attribute-values.md)。
+ <a name="asset-property-data-type-console"></a>**数据类型** – 属性的数据类型，如以下类型之一：
  + **字符串** – 最多 1024 字节的字符串。
  + **整数** – 有符号的 32 位整数，范围是 [-2,147,483,648, 2,147,483,647]。
  + **双精度** – 具有 [-10^100, 10^100] 范围和 IEEE 754 双精度的浮点数。
  + **布尔值** – `true` 或 `false`。
+ **外部 ID** -（可选）这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。

有关更多信息，请参阅 [创建资产模型（控制台）](create-asset-models.md#create-asset-model-console)。

## 定义属性（Amazon CLI）


使用 Amazon IoT SiteWise API 为资产模型定义属性时，需要指定以下参数：
+ <a name="asset-property-name-cli"></a>`name` – 属性的名称。
+ `defaultValue` – （可选）此属性的默认值。根据模型创建的资产具有此属性值。有关如何覆盖从模型创建的资产中的默认值的更多信息，请参阅[更新属性值](update-attribute-values.md)。
+ <a name="asset-property-data-type-cli"></a>`dataType` – 属性的数据类型，如以下类型之一：
  + `STRING` – 最多 1024 字节的字符串。
  + `INTEGER` – 有符号的 32 位整数，范围是 [-2,147,483,648, 2,147,483,647]。
  + `DOUBLE` – 具有 [-10^100, 10^100] 范围和 IEEE 754 双精度的浮点数。
  + `BOOLEAN` – `true` 或 `false`。
+ `externalId` -（可选）这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。

**Example 属性定义示例**  
以下示例演示一个表示具有默认值的资产型号的属性。此对象是包含[属[AssetModelProperty](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_AssetModelProperty.html)](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_Attribute.html)性的示例。您可以将此对象指定为 [CreateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_CreateAssetModel.html) 请求负载的一部分，以创建属性特性。有关更多信息，请参阅 [创建资产模型（Amazon CLI）](create-asset-models.md#create-asset-model-cli)。  

```
{
...
"assetModelProperties": [
{
  "name": "Model number",
  "dataType": "STRING",
  "type": {
    "attribute": {
      "defaultValue": "BLT123"
    }
  }
}
],
...
}
```

# 定义来自设备的数据流（测量值）
定义来自设备的数据流（测量值）

*测量值*表示设备的原始传感器数据流，如带有时间戳的温度值或带有时间戳的每分钟转数 (RPM) 值。

**Topics**
+ [

## 定义测量值（控制台）
](#define-measurements-console)
+ [

## 定义测量值（Amazon CLI）
](#define-measurements-cli)

## 定义测量值（控制台）


在 Amazon IoT SiteWise 控制台中为资产模型定义测量值时，需要指定以下参数：
+ <a name="asset-property-name-console"></a>**名称** – 属性的名称。
+ <a name="asset-property-unit-console"></a>**单位** – （可选）属性的科学单位，例如毫米或摄氏度。
+ <a name="asset-property-data-type-console"></a>**数据类型** – 属性的数据类型，如以下类型之一：
  + **字符串** – 最多 1024 字节的字符串。
  + **整数** – 有符号的 32 位整数，范围是 [-2,147,483,648, 2,147,483,647]。
  + **双精度** – 具有 [-10^100, 10^100] 范围和 IEEE 754 双精度的浮点数。
  + **布尔值** – `true` 或 `false`。
+ **外部 ID** -（可选）这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。

有关更多信息，请参阅 [创建资产模型（控制台）](create-asset-models.md#create-asset-model-console)。

## 定义测量值（Amazon CLI）


使用 Amazon IoT SiteWise API 定义资产模型的衡量标准时，需要指定以下参数：
+ <a name="asset-property-name-cli"></a>`name` – 属性的名称。
+ <a name="asset-property-data-type-cli"></a>`dataType` – 属性的数据类型，如以下类型之一：
  + `STRING` – 最多 1024 字节的字符串。
  + `INTEGER` – 有符号的 32 位整数，范围是 [-2,147,483,648, 2,147,483,647]。
  + `DOUBLE` – 具有 [-10^100, 10^100] 范围和 IEEE 754 双精度的浮点数。
  + `BOOLEAN` – `true` 或 `false`。
+ <a name="asset-property-unit-cli"></a>`unit` – （可选）属性的科学单位，例如毫米或摄氏度。
+ `externalId` -（可选）这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。

**Example 测量值定义示例**  
以下示例演示一个表示资产温度传感器读数的测量值。此对象是包含[测量值[AssetModelProperty](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_AssetModelProperty.html)](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_Measurement.html)的示例。您可以将此对象指定为 [CreateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_CreateAssetModel.html) 请求负载的一部分，以创建测量值属性。有关更多信息，请参阅 [创建资产模型（Amazon CLI）](create-asset-models.md#create-asset-model-cli)。  
在定义资产模型时，[测量值](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_Measurement.html)结构为空结构，因为您以后将每个资产配置为使用唯一的设备数据流。有关如何将资产的测量值属性连接到设备的传感器数据流的更多信息，请参阅[管理数据流 Amazon IoT SiteWise](manage-data-streams.md)。  

```
{
      ...
      "assetModelProperties": [
      {
          "name": "Temperature C",
          "dataType": "DOUBLE",
          "type": {
              "measurement": {}
          },
          "unit": "Celsius"
      }
  ],
      ...
}
```

# 转换数据（转换）
转换数据（转换）

*转换*是将资产属性的数据点从一种形式映射到另一种形式的数学表达式。转换表达式由资产属性变量、文字、运算符和函数组成。变换后的数据点与输入数据点有关 one-to-one系。 Amazon IoT SiteWise 每当任何输入属性接收到新的数据点时，都会计算一个新的转换数据点。

**注意**  
对于具有相同时间戳的属性更新，输出值可能会被来自其他传入属性的更新所覆盖。

例如，如果您的资产具有以摄氏度为单位的名为 `Temperature_C` 的温度测量流，您可以使用公式 `Temperature_F = 9/5 * Temperature_C + 32` 将每个数据点转换为华氏度。每次在`Temperature_C`测量流中 Amazon IoT SiteWise 接收到一个数据点时，相应的`Temperature_F`值将在几秒钟内计算出来，并作为`Temperature_F`属性提供。

如果您的转换包含多个变量，则较早到达的数据点会立即启动计算。举一个例子，其中零件制造商使用转换来监控产品质量。制造商根据零件类型使用不同的标准，使用以下测量值来表示过程：
+ `Part_Number` - 用于标识零件类型的字符串。
+ `Good_Count` - 一个整数，如果零件符合标准，则该整数将增加 1。
+ `Bad_Count` - 一个整数，如果零件不符合标准，则该整数会增加 1。

制造商还创建了一个等于 ` if(eq(Part_Number, "BLT123") and (Bad_Count / (Good_Count + Bad_Count) > 0.1), "Caution", "Normal")` 的转换 `Quality_Monitor`。

此转换可监控为特定零件类型生产的不良零件的百分比。如果部件号为， BLT123 且不良部件的百分比超过 10% (0.1)，则转换将返回`"Caution"`。否则，转换将返回 `"Normal"`。

**注意**  
如果 `Part_Number` 在其他测量之前收到新的数据点，则 `Quality_Monitor` 转换将使用新 `Part_Number` 值和最新的 `Good_Count` 和 `Bad_Count` 值。为避免错误，请在下次制造运行之前重置 `Good_Count` 和 `Bad_Count`。
如果您只想在所有变量都收到新的数据点后才计算表达式，请使用[指标](metrics.md)。

**Topics**
+ [

## 定义转换（控制台）
](#define-transforms-console)
+ [

## 定义转换（Amazon CLI）
](#define-transform-cli)

## 定义转换（控制台）


在 Amazon IoT SiteWise 控制台中为资产模型定义转换时，需要指定以下参数：
+ <a name="asset-property-name-console"></a>**名称** – 属性的名称。
+ <a name="asset-property-unit-console"></a>**单位** – （可选）属性的科学单位，例如毫米或摄氏度。
+ **数据类型** - 转换的数据类型，可以是**双**精度或 **字符串**。
+ **外部 ID** -（可选）这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。
+ **公式** – 转换表达式。转换表达式不能使用聚合函数或时间函数。要打开自动完成特征，则开始键入或按向下箭头键。有关更多信息，请参阅 [使用公式表达式](formula-expressions.md)。
**重要**  <a name="transform-input-rules"></a>
转换可以输入整型、双精度、布尔或字符串类型的属性。布尔值转换为 `0`（假）和 `1`（真）。  
转换必须输入一个或多个非特性属性。每次输入非特性属性接收新数据点时， Amazon IoT SiteWise 都会计算一个新的转换数据点。新属性值不会启动转换更新。资产属性数据 API 操作的请求速率同样适用于转换计算结果。  
<a name="formula-output-rules"></a>公式表达式只能输出双精度值或字符串值。嵌套表达式可以输出其他数据类型，例如字符串，但整个公式的计算结果必须为数字或字符串。您可以使用 [jp 函数](expression-string-functions.md#jp-definition)将字符串转换为数字。布尔值必须为 1（真）或 0（假）。有关更多信息，请参阅 [未定义值、无限值和溢出值](expression-tutorials.md#undefined-values)。

有关更多信息，请参阅 [创建资产模型（控制台）](create-asset-models.md#create-asset-model-console)。

## 定义转换（Amazon CLI）


使用 Amazon IoT SiteWise API 为资产模型定义转换时，需要指定以下参数：
+ <a name="asset-property-name-cli"></a>`name` – 属性的名称。
+ <a name="asset-property-unit-cli"></a>`unit` – （可选）属性的科学单位，例如毫米或摄氏度。
+ `dataType` – 转换的数据类型，必须为 `DOUBLE` 或`STRING`。
+ `externalId` -（可选）这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。
+ `expression` – 转换表达式。转换表达式不能使用聚合函数或时间函数。有关更多信息，请参阅 [使用公式表达式](formula-expressions.md)。
+ `variables` – 定义要在表达式中使用的资产的其他属性的变量列表。每个变量结构包含一个在表达式中使用的简单名称，以及一个指定哪个属性与该变量关联的 `value` 结构。`value` 结构包含以下信息：
  + `propertyId` – 要从中输入值的属性的 ID。您可以使用属性的名称而不是其 ID。
**重要**  <a name="transform-input-rules"></a>
转换可以输入整型、双精度、布尔或字符串类型的属性。布尔值转换为 `0`（假）和 `1`（真）。  
转换必须输入一个或多个非特性属性。每次输入非特性属性接收新数据点时， Amazon IoT SiteWise 都会计算一个新的转换数据点。新属性值不会启动转换更新。资产属性数据 API 操作的请求速率同样适用于转换计算结果。  
<a name="formula-output-rules"></a>公式表达式只能输出双精度值或字符串值。嵌套表达式可以输出其他数据类型，例如字符串，但整个公式的计算结果必须为数字或字符串。您可以使用 [jp 函数](expression-string-functions.md#jp-definition)将字符串转换为数字。布尔值必须为 1（真）或 0（假）。有关更多信息，请参阅 [未定义值、无限值和溢出值](expression-tutorials.md#undefined-values)。

**Example 转换定义**  
以下示例演示了将资产的温度测量数据从摄氏度转换为华氏度的转换属性。此对象是包含[变换[AssetModelProperty](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_AssetModelProperty.html)](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_Transform.html)的示例。您可以将此对象指定为 [CreateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_CreateAssetModel.html) 请求负载的一部分，以创建转换属性。有关更多信息，请参阅 [创建资产模型（Amazon CLI）](create-asset-models.md#create-asset-model-cli)。  

```
{
...
"assetModelProperties": [
...
{
  "name": "Temperature F",
  "dataType": "DOUBLE",
  "type": {
    "transform": {
      "expression": "9/5 * temp_c + 32",
      "variables": [
        {
          "name": "temp_c",
          "value": {
            "propertyId": "Temperature C"
          }
        }
      ]
    }
  },
  "unit": "Fahrenheit"
}
],
...
}
```

**Example 包含三个变量的转换定义**  
以下示例演示了一个变换属性，如果超过 10% 的 BLT123 部件不符合标准，则该属性会返回警告消息 (`"Caution"`)。否则，它将返回一条信息消息 (`"Normal"`)。  

```
{
...
"assetModelProperties": [
...
{
"name": "Quality_Monitor",
"dataType": "STRING",
"type": {
    "transform": {
        "expression": "if(eq(Part_Number,"BLT123") and (Bad_Count / (Good_Count + Bad_Count) > 0.1), "Caution", "Normal")",
        "variables": [
            {
                "name": "Part_Number",
                "value": {
                    "propertyId": "Part Number"
                }
            },
            {
                "name": "Good_Count",
                "value": {
                    "propertyId": "Good Count"
                }
            },
            {
                "name": "Bad_Count",
                "value": {
                    "propertyId": "Bad Count"
                }
            }
        ]
    }
}
}
...
}
```

# 聚合来自属性和其他资产（指标）的数据
聚合数据（指标）

指标是使用聚合函数处理所有输入数据点并按指定时间间隔输出单个数据点的数学表达式。例如，指标可以从温度数据流计算每小时平均温度。

指标可以从关联资产的指标中输入数据，这样您可以计算统计信息，从而提供对整个操作或部分操作的见解。例如，指标可以计算风电场中所有风力涡轮机的每小时平均温度。有关如何定义资产之间的关联的更多信息，请参阅[定义资产模型层次结构](define-asset-hierarchies.md)。

指标也可以输入来自其他属性的数据，而无需在每个时间间隔内聚合数据。如果您在公式中指定了[属性](attributes.md)，则 Amazon IoT SiteWise 在计算公式时会使用该属性的[最新](expression-temporal-functions.md#latest-definition)值。如果您在公式中指定指标，则 Amazon IoT SiteWise 使用[最后](expression-temporal-functions.md#last-definition)一个值作为计算公式的时间间隔。这意味着您可以定义 `OEE = Availability * Quality * Performance` 这样的指标，其中 `Availability`、`Quality` 和 `Performance` 都是同一资产模型上的其他指标。

Amazon IoT SiteWise 还会自动计算所有资产属性的一组基本聚合指标。要降低计算成本，您可以使用这些聚合，而不是为基本计算定义自定义指标。有关更多信息，请参阅 [在中查询资产属性聚合 Amazon IoT SiteWise](aggregates.md)。

**Topics**
+ [

## 定义指标（控制台）
](#define-metrics-console)
+ [

## 定义指标（Amazon CLI）
](#define-metrics-cli)

## 定义指标（控制台）


在 Amazon IoT SiteWise 控制台中为资产模型定义指标时，需要指定以下参数：
+ <a name="asset-property-name-console"></a>**名称** – 属性的名称。
+ **数据类型** - 转换的数据类型，可以是**双**精度或 **字符串**。
+ **外部 ID** -（可选）这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。
+ **公式** – 指标表达式。指标表达式可以使用[聚合函数](expression-aggregation-functions.md)从属性中输入层次结构中所有关联资产的数据。开始键入或按向下箭头键以打开自动完成功能。有关更多信息，请参阅 [使用公式表达式](formula-expressions.md)。
**重要**  <a name="metric-input-rules"></a>
指标只能输入整型、双精度、布尔或字符串类型的属性。布尔值转换为 `0`（假）和 `1`（真）。  
如果您在指标表达式中定义任何指标输入变量，这些输入必须与输出指标具有同一个时间间隔。  
<a name="formula-output-rules"></a>公式表达式只能输出双精度值或字符串值。嵌套表达式可以输出其他数据类型，例如字符串，但整个公式的计算结果必须为数字或字符串。您可以使用 [jp 函数](expression-string-functions.md#jp-definition)将字符串转换为数字。布尔值必须为 1（真）或 0（假）。有关更多信息，请参阅 [未定义值、无限值和溢出值](expression-tutorials.md#undefined-values)。
+ **时间间隔** – 时间间隔指标。<a name="metric-window-info"></a>Amazon IoT SiteWise 支持以下滚动窗口时间间隔，其中每个间隔在前一个间隔结束时开始：
  + **1 分钟** – <a name="metric-window-1m"></a>1 分钟，在每分钟结束时计算（凌晨 12:00:00、凌晨 12:01:00、凌晨 12:02:00，依此类推）。
  + **5 分钟** – <a name="metric-window-5m"></a>5 分钟，在每 5 分钟结束时计算，从整点开始（中午 12:00:00、中午 12:05:00、中午 12:10:00，依此类推）。
  + **15 分钟** – <a name="metric-window-15m"></a>15 分钟，在每 15 分钟结束时计算，从整点开始（凌晨 12:00:00、凌晨 12:15:00、凌晨 12:30:00，依此类推）。
  + **1 小时** – <a name="metric-window-1h"></a>1 小时（60 分钟），在每小时结束时计算，采用 UTC 格式（凌晨 12:00:00、凌晨 01:00:00、凌晨 02:00:00，依此类推）。
  + **1 天** – <a name="metric-window-1d"></a>1 天（24 小时），在每天结束时计算，采用 UTC 格式（星期一凌晨 12:00:00、星期二凌晨 12:00:00，依此类推）。
  + **1 周** – <a name="metric-window-1w"></a>1 周（7 天），在每个星期日结束时计算，采用 UTC 格式（每个星期一凌晨 12:00:00）。
  + **自定义间隔** - 您可以输入一分钟到一周之间的任何时间间隔。
+ **偏移日期** - 或者，聚合数据的参考日期。
+ **偏移时间** - 或者，聚合数据的参考时间。偏移时间必须介于 00:00:00 和 23:59:59 之间。
+ **偏移时区** - 或者，偏移的时区。如果未指定，默认偏移时区为通用协调时间 (UTC)。请参阅以下支持的时区。

### 支持的时区

+ (UTC\$1 00:00) 协调世界时间
+ (UTC\$1 01:00) 欧洲中部时间
+ (UTC\$1 02:00) 东欧
+ (UTC03\$1:00) 东非时间
+ (UTC\$1 04:00) 近东时间
+ (UTC\$1 05:00) 巴基斯坦拉合尔时间
+ (UTC\$1 05:30) 印度标准时间
+ 孟加拉国标准时间
+ (UTC\$1 07:00) 越南标准时间
+ (UTC\$1 08:00) 中国台北时间
+ (UTC\$1 09:00) 日本标准时间
+ (UTC\$1 09:30) 澳大利亚中部时间
+ (UTC\$1 10:00) 澳大利亚东部时间
+ (UTC\$1 11:00) 所罗门标准时间
+ (UTC\$112:00) 新西兰标准时间
+ (UTC-11:00) 中途岛时间
+ (UTC-10:00) 夏威夷标准时间
+ (UTC-09:00) 阿拉斯加标准时间
+ (UTC-08:00) 太平洋标准时间
+ (UTC-07:00) 凤凰城标准时间
+ (UTC-06:00) 中部标准时间
+ (UTC-05:00) 东部标准时间
+ (UTC-04:00) 波多黎各和美属维尔京群岛时间
+ (UTC-03:00) 阿根廷标准时间
+ (UTC-02:00) 南乔治亚时间
+ (UTC-01:00) 中非时间

**Example 带偏移量的自定义时间间隔（控制台）**  
以下示例向您展示如何定义 12 小时的时间间隔，偏移时间为 2021 年 2 月 20 日下午 6:30:30（太平洋标准时间）。  

**使用偏移量定义自定义间隔**

1. 对于 **时间间隔**，选择**自定义间隔**。

1. 对于 **时间间隔**，执行以下操作之一：
   + 输入 **12**，然后选择 **小时**。
   + 输入 **720**，然后选择 **分钟**。
   + 输入 **43200**，然后选择 **秒**。
**重要**  
无论单位如何，**时间间隔**都必须为整数。

1. 对于 **偏移日期**，选择 **2021 年 2 月 20 日**。

1. 对于 **偏移时间**，输入 **18:30:30**。

1. 对于 **偏移时区**，选择 **(UTC-08:00**) 太平洋标准时间。
如果您在 2021 年 7 月 1 日下午 06:30:30（太平洋标准时间）或之前创建指标，您将在 2021 年 7 月 1 日下午 06:30:30（太平洋标准时间）获得第一个聚合结果。第二个聚合结果将在 2021 年 7 月 2 日上午 06:30:30（太平洋标准时间）获得，依此类推。

## 定义指标（Amazon CLI）


使用 Amazon IoT SiteWise API 为资产模型定义指标时，需要指定以下参数：
+ <a name="asset-property-name-cli"></a>`name` – 属性的名称。
+ `dataType` – 指标的数据类型，必须为 `DOUBLE` 或`STRING`。
+ `externalId` -（可选）这是用户定义的 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。
+ `expression` – 指标表达式。指标表达式可以使用[聚合函数](expression-aggregation-functions.md)从属性中输入层次结构中所有关联资产的数据。有关更多信息，请参阅 [使用公式表达式](formula-expressions.md)。
+ `window` – 指标翻滚窗口的时间间隔和偏移量，其中每个间隔从前一个间隔结束时开始：
  + `interval` – 滚动窗口的时间间隔。间隔时间必须介于 1 分钟和 1 周之间。
  + `offsets` – 翻滚窗口的偏移。

  有关更多信息，请参阅《Amazon IoT SiteWise API Reference》**中的 [TumblingWindow](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_TumblingWindow.html)。  
**Example 带有偏移量 (Amazon CLI) 的自定义时间间隔**  

  以下示例向您展示如何定义 12 小时的时间间隔，偏移时间为 2021 年 2 月 20 日下午 06:30:30（太平洋标准时间）。

  ```
  {
      "window": {
          "tumbling": {
              "interval": "12h",
              "offset": " 2021-07-23T18:30:30-08"
          }
      }
  }
  ```

  如果您在 2021 年 7 月 1 日下午 06:30:30（太平洋标准时间）或之前创建指标，您将在 2021 年 7 月 1 日下午 06:30:30（太平洋标准时间）获得第一个聚合结果。第二个聚合结果将在 2021 年 7 月 2 日上午 06:30:30（太平洋标准时间）获得，依此类推。
+ `variables` – 定义要在表达式中使用的资产或子资产的其他属性的变量列表。每个变量结构包含一个在表达式中使用的简单名称，以及一个指定哪个属性与该变量关联的 `value` 结构。`value` 结构包含以下信息：
  + `propertyId` – 从中提取值的属性的 ID。如果属性是在当前模型中定义的（而不是在层次结构的模型中定义的），您可以使用属性的名称而不是其 ID。
  + `hierarchyId` – （可选）从中查询属性的子资产的层次结构的 ID。您可以使用层次结构定义的名称而不是其 ID。如果省略此值，则会在当前模型中 Amazon IoT SiteWise 找到该属性。
**重要**  <a name="metric-input-rules"></a>
指标只能输入整型、双精度、布尔或字符串类型的属性。布尔值转换为 `0`（假）和 `1`（真）。  
如果您在指标表达式中定义任何指标输入变量，这些输入必须与输出指标具有同一个时间间隔。  
<a name="formula-output-rules"></a>公式表达式只能输出双精度值或字符串值。嵌套表达式可以输出其他数据类型，例如字符串，但整个公式的计算结果必须为数字或字符串。您可以使用 [jp 函数](expression-string-functions.md#jp-definition)将字符串转换为数字。布尔值必须为 1（真）或 0（假）。有关更多信息，请参阅 [未定义值、无限值和溢出值](expression-tutorials.md#undefined-values)。
+ <a name="asset-property-unit-cli"></a>`unit` – （可选）属性的科学单位，例如毫米或摄氏度。

**Example 指标定义示例**  
以下示例演示一个指标属性，该属性可聚合资产的温度测量值数据，以计算每小时最高温度（以华氏度为单位）。此对象是包含[指标[AssetModelProperty](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_AssetModelProperty.html)](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_Metric.html)的示例。您可以将此对象指定为 [CreateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_CreateAssetModel.html) 请求负载的一部分，以创建指标属性。有关更多信息，请参阅 [创建资产模型（Amazon CLI）](create-asset-models.md#create-asset-model-cli)。  

```
{
      ...
      "assetModelProperties": [
      ...
      {
        "name": "Max temperature",
        "dataType": "DOUBLE",
        "type": {
          "metric": {
            "expression": "max(temp_f)",
            "variables": [
              {
                "name": "temp_f",
                "value": {
                  "propertyId": "Temperature F"
                }
              }
            ],
            "window": {
              "tumbling": {
                "interval": "1h"
              }
            }
          }
        },
        "unit": "Fahrenheit"
      }
    ],
    ...
}
```

**Example 输入关联资产数据的指标定义示例**  
以下示例演示了一个指标属性，该属性汇总了多台风力涡轮机的平均功率数据，以计算风电场的总平均功率。此对象是包含[指标[AssetModelProperty](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_AssetModelProperty.html)](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_Metric.html)的示例。您可以将此对象指定为 [CreateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_CreateAssetModel.html) 请求负载的一部分，以创建指标属性。  

```
{
      ...
      "assetModelProperties": [
      ...
      {
          "name": "Total Average Power",
          "dataType": "DOUBLE",
          "type": {
            "metric": {
              "expression": "avg(power)",
              "variables": [
                {
                  "name": "power",
                  "value": {
                    "propertyId": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
                    "hierarchyId": "Turbine Asset Model"
                  }
                }
              ],
              "window": {
                "tumbling": {
                  "interval": "5m"
                }
              }
            }
        },
        "unit": "kWh"
      }
    ],
    ...
}
```

# 使用公式表达式


通过使用公式表达式，您可以定义数学函数以转换和聚合原始工业数据，从而深入了解您的运营情况。公式表达式结合使用文字、运算符、函数和变量来处理数据。有关如何定义使用公式表达式的资产属性的更多信息，请参阅[转换数据（转换）](transforms.md)和[聚合来自属性和其他资产（指标）的数据](metrics.md)。转换和指标是公式属性。

**Topics**
+ [

# 在公式表达式中使用变量
](expression-variables.md)
+ [

# 在公式表达式中使用文字
](expression-literals.md)
+ [

# 在公式表达式中使用运算符
](expression-operators.md)
+ [

# 在公式表达式中使用常量
](expression-constants.md)
+ [

# 在公式表达式中使用函数
](expression-functions.md)
+ [

# 公式表达式教程
](expression-tutorials.md)

# 在公式表达式中使用变量
使用变量

变量表示公式表达式中的 Amazon IoT SiteWise 资产属性。使用变量在表达式中输入来自其他资产属性的值，以便您可以处理来自常量属性（[属性](attributes.md)）、原始数据流（[测量](measurements.md)）和其他公式属性的数据。

变量可以表示来自同一资产模型或关联子资产模型的资产属性。只有指标公式才能输入子资产模型中的变量。

您可以在控制台和 API 中使用不同的名称来识别变量。
+ **Amazon IoT SiteWise 控制台**-在表达式中使用资产属性名称作为变量。
+ **Amazon IoT SiteWise API (Amazon CLI, Amazon SDKs)**-使用[ExpressionVariable](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_ExpressionVariable.html)结构定义变量，该结构需要变量名和对资产属性的引用。变量名称可包含大小写字母、数字和下划线。然后，使用变量名在表达式中引用资产属性。

变量名称区分大小写。

有关更多信息，请参阅[定义转换](transforms.md)和[定义指标](metrics.md)。

## 使用变量来引用属性


变量的*值*定义了它所引用的属性。 Amazon IoT SiteWise 提供了不同的方式来实现这一目的。
+ **按属性 ID：**您可以指定属性的唯一 ID（UUID）来对其进行标识。
+ **按名称：**如果该属性属于同一资产模型，则可以在属性 ID 字段中指定其名称。
+ **按路径：**变量值可以通过其*路径*来引用属性。有关更多信息，请参阅 [使用路径来引用自定义复合模型属性](custom-composite-models.md#property-paths)。

**注意**  
 Amazon IoT SiteWise 控制台不支持变量。它们由 Amazon IoT SiteWise API 使用，包括 Amazon Command Line Interface Amazon CLI) 和 Amazon SDKs。

 您在响应中收到的变量 Amazon IoT SiteWise 包含有关该值的完整信息，包括 ID 和路径。

 但是，当您将变量传递到时 Amazon IoT SiteWise （例如，在 “创建” 或 “更新” 调用中），您只需要指定其中一个即可。例如，如果您指定路径，则无需提供 ID。

# 在公式表达式中使用文字
使用文字

Amazon IoT SiteWise 支持在表达式和公式中使用文字。文字是表示特定数据类型的固定值。在中 Amazon IoT SiteWise，您可以在公式表达式中定义数字和字符串文字。文字可以在各种环境中使用，包括数据转换、警报条件和可视化计算。


+ <a name="number-literal-definition"></a>**数字**

  使用数字和科学记数法来定义整数和双精度。您可以使用 [E 记数法](https://en.wikipedia.org/wiki/Scientific_notation#E_notation)来表示带有科学记数法的数字。

  示例：`1`、`2.0`、`.9`、`-23.1`、`7.89e3`、`3.4E-5`
+ <a name="string-literal-definition"></a>**字符串**

  使用 `'`（引号）和 `"`（双引号）字符来定义字符串。起点和结尾的报价类型必须匹配。要对与您用来声明字符串的引号相匹配的引号进行转义，请将该引号字符包含两次。这是 Amazon IoT SiteWise 字符串中唯一的转义字符。

  示例：`'active'`、`"inactive"`、`'{"temp": 52}'`、`"{""temp"": ""high""}"`。

# 在公式表达式中使用运算符
使用运算符

您可以在公式表达式中使用以下常见的运算符。


| 运算符 | 说明 | 
| --- | --- | 
|  `+`  |  如果两个操作数都是数字，则此运算符将左右操作数相加。 如果任一操作数是字符串，则此运算符将左右操作数连接为字符串。例如，表达式的 `1 + 2 + " is three"` 计算结果为 `"3 is three"`。连接字符串最多可以包含 1024个字符。如果字符串超过 1024 个字符，则 Amazon IoT SiteWise 不会为该计算输出数据点。  | 
|  `-`  |  从左侧操作数中减去右侧操作数。 <a name="operator-numbers-only"></a>只能将此运算符与数字操作数一起使用。  | 
|  `/`  |  左侧操作数除以右侧操作数。 <a name="operator-numbers-only"></a>只能将此运算符与数字操作数一起使用。  | 
|  `*`  |  将左右操作数相乘。 <a name="operator-numbers-only"></a>只能将此运算符与数字操作数一起使用。  | 
|  `^`  |  将左操作数作为右操作数的幂（指数）。 <a name="operator-numbers-only"></a>只能将此运算符与数字操作数一起使用。  | 
|  `%`  |  返回左侧操作数除以右侧操作数得到的余数。结果具有与左侧操作数相同的符号。此行为不同于 modulo 操作。 <a name="operator-numbers-only"></a>只能将此运算符与数字操作数一起使用。  | 
|  `x < y`  |  如果 `x` 小于 `y`，则返回 `1`，否则，返回 `0`。  | 
|  `x > y`  |  如果 `x` 大于 `y`，则返回 `1`，否则，返回 `0`。  | 
|  `x <= y`  |  如果 `x` 小于或等于 `y`，则返回 `1`，否则，返回 `0`。  | 
|  `x >= y`  |  如果 `x` 大于或等于 `y`，则返回 `1`，否则，返回 `0`。  | 
|  `x == y`  |  如果 `x` 等于 `y`，则返回 `1`，否则，返回 `0`。  | 
|  `x != y`  |  如果 `x` 不等于 `y`，则返回 `1`，否则，返回 `0`。  | 
|  `!x`  |  如果 `x` 等于 `0`（假），则返回 `1`，否则，返回 `0`。 如果出现以下情况，则 `x` 的计算结果为假： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-operators.html)  | 
|  `x and y`  |  如果 `x` 的计算结果为 `0`（假），则返回 `0`。否则，返回 `y` 的计算结果。 如果出现以下情况，则 `x` 或 `y` 的计算结果为假： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-operators.html)  | 
|  `x or y`  |  如果 `x` 等于 `1`（真），则返回 `1`。否则，返回 `y` 的计算结果。 如果出现以下情况，则 `x` 或 `y` 的计算结果为假： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-operators.html)  | 
|  `not x`  |  如果 `x` 等于 `0`（假），则返回 `1`，否则，返回 `0`。 如果出现以下情况，则 `x` 的计算结果为假： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-operators.html)  | 
|   `[]` `s[index]`  |  返回字符串 `s` 索引 `index` 上的字符。这等同于 Python 中的索引语法。 

**Example 示例**  
+ `"Hello!"[1]` 返回 `e`。
+ `"Hello!"[-2]` 返回 `o`。  | 
|   `[]` `s[start:end:step]`  |  返回字符串 `s` 的片段。这等同于 Python 中的切片语法。此运算符具有以下参数： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-operators.html) 您可以省略 `step` 参数以使用其默认值。例如，`s[1:4:1]` 等同于 `s[1:4]`。 参数必须是整数或 [无](expression-constants.md#none-definition) 常量。如果指定`none`，则 Amazon IoT SiteWise 使用该参数的默认值。 

**Example 示例**  
+ `"Hello!"[1:4]` 返回 `"ell"`。
+ `"Hello!"[:2]` 返回 `"He"`。
+ `"Hello!"[3:]` 返回 `"lo!"`。
+ `"Hello!"[:-4]` 返回 `"He"`。
+ `"Hello!"[::2]` 返回 `"Hlo"`。
+ `"Hello!"[::-1]` 返回 `"!olleH"`。  | 

# 在公式表达式中使用常量
使用常量

在中 Amazon IoT SiteWise，您可以在表达式和公式中使用常量来表示固定值或预定义参数。常量可以在各种环境中使用，例如数据转换、警报条件或可视化计算。通过使用常量，您可以简化表达式，使其更具可读性和可维护性。

您可以在表达式中使用以下常见的数学常数。所有常量均不区分大小写。

**注意**  
如果定义的变量与常量同名，则该变量会覆盖该常量。


| 常量 | 说明 | 
| --- | --- | 
|  `pi`  |  数字 pi (`π`)：`3.141592653589793`  | 
|  `e`  |  数字 e：`2.718281828459045`  | 
|  `true`  |  等同于数字 1。在中 Amazon IoT SiteWise，布尔值转换为其等效数字。  | 
|  `false`  |  等同于数字 0。在中 Amazon IoT SiteWise，布尔值转换为其等效数字。  | 
|   `none`  |  等同于无值。您可以使用此常量将任何内容输出为[条件表达式](expression-conditional-functions.md)的结果。  | 

# 在公式表达式中使用函数
使用函数

您可以使用以下函数对公式表达式中的数据进行操作。

转换和指标支持不同的功能。下表显示了哪些类型的函数与每种类型的公式属性兼容。

**注意**  
一个公式表达式中最多可以包含 10 个函数。


| 函数类型 | 转换 | 指标 | 
| --- | --- | --- | 
|  [在公式表达式中使用常用函数](expression-common-functions.md)  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  | 
|  [在公式表达式中使用比较函数](expression-comparison-functions.md)  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  | 
|  [在公式表达式中使用条件函数](expression-conditional-functions.md)  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  | 
|  [在公式表达式中使用字符串函数](expression-string-functions.md)  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  | 
|  [在公式表达式中使用聚合函数](expression-aggregation-functions.md)  |  <a name="polaris-no-para"></a>![\[A red circle with the letter x for no.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-no.png)没有  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  | 
|  [在公式表达式中使用时间函数](expression-temporal-functions.md)  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  | 
|  [在公式表达式中使用日期和时间函数](expression-date-and-time-functions.md)  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  |  <a name="polaris-yes-para"></a>![\[A green circle with a checkmark for yes.\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/icon-yes.png) 是  | 

## 函数语法


您可以使用以下语法来创建函数：

常规语法  
在常规语法中，函数名称后面是带有零个或多个参数的圆括号。  
`function_name(argument1, argument2, argument3, ...)`。例如，使用常规语法的函数可能看起来像 `log(x)` 和 `contains(s, substring)`。

统一函数调用语法 (UFCS)  
UFCS 允许您在面向对象编程中使用方法调用的语法来调用函数。在 UFCS 中，第一个参数后面跟着点 (`.`)，然后是函数名和括号内的其余参数（如果有）。  
`argument1.function_name(argument2, argument3, ...)`。例如，带有 UFCS 的函数可能看起来像 `x.log()` 和 `s.contains(substring)`。  
您也可以使用 UFCS 来链接后续函数。 Amazon IoT SiteWise 使用当前函数的计算结果作为下一个函数的第一个参数。  
例如，您可以使用 `message.jp('$.status').lower().contains('fail')`，而不使用 `contains(lower(jp(message, '$.status')),'fail')`。  
有关更多信息，请参阅 [D Programming Language](https://tour.dlang.org/tour/en/gems/uniform-function-call-syntax-ufcs) 页面。

**注意**  
您可以将 UFCS 用于所有 Amazon IoT SiteWise 功能。  
Amazon IoT SiteWise 函数不区分大小写。例如，可以互换使用 `lower(s)` 和 `Lower(s)`。

# 在公式表达式中使用常用函数
使用常用函数

在[转换](transforms.md)和[指标](metrics.md)中，您可以使用以下函数来计算转换和指标中的常见数学函数。


| 函数 | 说明 | 
| --- | --- | 
|  `abs(x)`  |  返回 `x` 的绝对值。  | 
|  `acos(x)`  |  返回 `x` 的反余弦值。  | 
|  `asin(x)`  |  返回 `x` 的反正弦值。  | 
|  `atan(x)`  |  返回 `x` 的反正切值。  | 
|  `cbrt(x)`  |  返回 `x` 的立方根。  | 
|  `ceil(x)`  |  返回大于 `x` 的最接近整数。  | 
|  `cos(x)`  |  返回 `x` 的余弦值。  | 
|  `cosh(x)`  |  返回 `x` 的双曲余弦值。  | 
|  `cot(x)`  |  返回 `x` 的余切值。  | 
|  `exp(x)`  |  返回 `e` 的 `x` 次幂。  | 
|  `expm1(x)`  |  返回 `exp(x) - 1`。对于较小的 `exp(x) - 1` 值，使用此函数可以更准确地计算 `x`。  | 
|  `floor(x)`  |  返回小于 `x` 的最接近整数。  | 
|  `log(x)`  |  返回 `x` 的 `loge`（以 `e` 为底）。  | 
|  `log10(x)`  |  返回 `x` 的 `log10`（以 `10` 为底）。  | 
|  `log1p(x)`  |  返回 `log(1 + x)`。对于较小的 `log(1 + x)` 值，使用此函数可以更准确地计算 `x`。  | 
|  `log2(x)`  |  返回 `x` 的 `log2`（以 `2` 为底）。  | 
|  `pow(x, y)`  |  返回 `x` 的 `y` 次幂。这等同于 `x ^ y`。  | 
|  `signum(x)`  |  返回 `x` 的符号（`-1` 表示负输入，`0` 表示零输入，`+1` 表示正输入）。  | 
|  `sin(x)`  |  返回 `x` 的正弦值。  | 
|  `sinh(x)`  |  返回 `x` 的双曲正弦值。  | 
|  `sqrt(x)`  |  返回 `x` 的平方根。  | 
|  `tan(x)`  |  返回 `x` 的正切值。  | 
|  `tanh(x)`  |  返回 `x` 的双曲正切值。  | 

# 在公式表达式中使用比较函数
使用比较函数

在[变换](transforms.md)和[指标](metrics.md)中，您可以使用以下比较函数来比较两个值并输出`1`（真）或`0`（假）。 Amazon IoT SiteWise 按字[典顺序比较](https://en.wikipedia.org/wiki/Lexicographic_order)字符串。


| 函数 | 说明 | 
| --- | --- | 
|  `gt(x, y)`  |  如果 `x` 大于 `y`，则返回 `1`，否则，返回 `0` (`x > y`)。 <a name="comparison-function-incompatible-types"></a>如果 `x` 和 `y` 的类型不兼容，例如数字和字符串，则此函数不返回值。  | 
|  `gte(x, y)`  |  如果 `x` 大于或等于 `y`，则返回 `1`，否则，返回 `0` (`x ≥ y`)。 <a name="comparison-function-relative-tolerance"></a>Amazon IoT SiteWise 如果参数在相对容差范围内，则认为它们是相等的`1E-9`。其行为类似于 Python 中的 [isclose](https://docs.python.org/3/library/math.html#math.isclose) 函数。 <a name="comparison-function-incompatible-types"></a>如果 `x` 和 `y` 的类型不兼容，例如数字和字符串，则此函数不返回值。  | 
|  `eq(x, y)`  |  如果 `x` 等于 `y`，则返回 `1`，否则，返回 `0` (`x == y`)。 <a name="comparison-function-relative-tolerance"></a>Amazon IoT SiteWise 如果参数在相对容差范围内，则认为它们是相等的`1E-9`。其行为类似于 Python 中的 [isclose](https://docs.python.org/3/library/math.html#math.isclose) 函数。 <a name="comparison-function-incompatible-types"></a>如果 `x` 和 `y` 的类型不兼容，例如数字和字符串，则此函数不返回值。  | 
|  `lt(x, y)`  |  如果 `x` 小于 `y`，则返回 `1`，否则，返回 `0` (`x < y`)。 <a name="comparison-function-incompatible-types"></a>如果 `x` 和 `y` 的类型不兼容，例如数字和字符串，则此函数不返回值。  | 
|  `lte(x, y)`  |  如果 `x` 小于或等于 `y`，则返回 `1`，否则，返回 `0` (`x ≤ y`)。 <a name="comparison-function-relative-tolerance"></a>Amazon IoT SiteWise 如果参数在相对容差范围内，则认为它们是相等的`1E-9`。其行为类似于 Python 中的 [isclose](https://docs.python.org/3/library/math.html#math.isclose) 函数。 <a name="comparison-function-incompatible-types"></a>如果 `x` 和 `y` 的类型不兼容，例如数字和字符串，则此函数不返回值。  | 
|  `isnan(x)`  |  如果 `x` 等于 `NaN`，则返回 `1`，否则，返回 `0`。 如果 `x` 是字符串，则此函数不返回值。  | 

# 在公式表达式中使用条件函数
使用条件函数

在[转换](transforms.md)和[指标](metrics.md)中，您可以使用以下函数来检查条件并返回不同的结果，无论该条件的计算结果为真还是假。


| 函数 | 说明 | 
| --- | --- | 
|   `if(condition, result_if_true, result_if_false)`  |  计算 `condition`，如果条件计算结果为真，则返回 `result_if_true`，如果条件计算结果为 `false`，则返回 `result_if_false`。 `condition` 必须是数字。此函数将 `0` 和一个空字符串视为 `false`，其他所有内容（包括 `NaN`）都视为 `true`。布尔值转换为 `0`（假）和 `1`（真）。 您可以从此函数返回 [无 常量](expression-constants.md#none-definition)，以丢弃特定条件的输出。这意味着您可以筛选出不符合条件的数据点。有关更多信息，请参阅 [筛选数据点](expression-tutorials.md#filter-data)。 

**Example 示例**  
+ `if(0, x, y)` 返回变量 `y`。
+ `if(5, x, y)` 返回变量 `x`。
+ 如果变量 `temp` 大于 `300`，则 `if(gt(temp, 300), x, y)` 返回变量 `x`。
+ 如果 `if(gt(temp, 300), temp, none)` 大于或等于 `300`，则返回变量 `temp`，如果 `temp` 小于 `300`，则返回 `none`（无值）。 我们建议您将 UFCS 用于嵌套条件函数，其中一个或多个参数是条件函数。您可以使用 `if(condition, result_if_true)` 计算条件和 `elif(condition, result_if_true, result_if_false)` 计算其他条件。 例如，您可以使用 `if(condition1, result1_if_true).elif(condition2, result2_if_true, result2_if_false)`，而不使用 `if(condition1, result1_if_true, if(condition2, result2_if_true, result2_if_false))`。 您还可以链接其他中间条件函数。例如，您可以使用 `if(condition1, result1_if_true).elif(condition2, result2_if_true).elif(condition3, result3_if_true, result3_if_false)` 而不是嵌套多个 `if` 语句，例如 `if(condition1, result1_if_true, if(condition2, result2_if_true, if(condition3, result3_if_true result3_if_false)))`。  您必须将 `elif(condition, result_if_true, result_if_false)`与 UFCS 一起使用。   | 

# 在公式表达式中使用字符串函数
使用字符串函数

在[转换](transforms.md)和[指标](metrics.md)中，您可以使用以下函数对字符串进行操作。有关更多信息，请参阅 [在公式中使用字符串](expression-tutorials.md#use-strings-in-formulas)。

**重要**  
<a name="formula-output-rules"></a>公式表达式只能输出双精度值或字符串值。嵌套表达式可以输出其他数据类型，例如字符串，但整个公式的计算结果必须为数字或字符串。您可以使用 [jp 函数](#jp-definition)将字符串转换为数字。布尔值必须为 1（真）或 0（假）。有关更多信息，请参阅 [未定义值、无限值和溢出值](expression-tutorials.md#undefined-values)。


| 函数 | 说明 | 
| --- | --- | 
|  `len(s)`  |  返回字符串 `s` 的长度。  | 
|  `find(s, substring)`  |  返回字符串 `substring` 中字符串 `s` 的索引。  | 
|  `contains(s, substring)`  |  如果字符串 `s` 包含字符串 `substring`，则返回 `1`，否则，返回 `0`。  | 
|  `upper(s)`  |  以大写形式返回字符串 `s`。  | 
|  `lower(s)`  |  以小写形式返回字符串 `s`。  | 
|   `jp(s, json_path)`  |  `s`使用[JsonPath](https://github.com/json-path/JsonPath)表达式计算字符串`json_path`并返回结果。 请使用该函数执行以下操作： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-string-functions.html) 要从 JSON 结构中提取字符串值并将其作为数字返回，必须使用多个嵌套 `jp` 函数。外部 `jp` 函数从 JSON 结构中提取字符串，内部 `jp` 函数将字符串转换为数字。 该字符串 `json_path` 必须包含一个字符串文字。这意味着 `json_path` 不能是计算结果为字符串的表达式。 

**Example 示例**  
+ `jp('{"status":"active","value":15}', '$.value')` 返回 `15`。
+ `jp('{"measurement":{"reading":25,"confidence":0.95}}', '$.measurement.reading')` 返回 `25`。
+ `jp('[2,8,23]', '$[2]')` 返回 `23`。
+ `jp('{"values":[3,6,7]}', '$.values[1]')` 返回 `6`。
+ `jp('111', '$')` 返回 `111`。
+ `jp(jp('{"measurement":{"reading":25,"confidence":"0.95"}}', '$.measurement.confidence'), '$')` 返回 `0.95`。  | 
|  `join(s0, s1, s2, s3, ...)`  |  返回带有一个分隔符的串联字符串。此函数使用第一个输入字符串作为分隔符，并将剩余的输入字符串连接在一起。其行为类似于 Java 中的[连接（CharSequence 分隔符， CharSequence... 元素）](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#join-java.lang.CharSequence-java.lang.CharSequence...-)函数。 

**Example 示例**  
+ `join("-", "aa", "bb", "cc")` 返回 `aa-bb-cc`  | 
|  `format(expression: "format")` 或 `format("format", expression)`  |  返回指定格式的字符串。此函数将 `expression` 求值，然后以指定格式返回该值。其行为类似于 Java 中的 [format(String format, Object... args)](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#format-java.lang.String-java.lang.Object...-) 函数。有关支持的格式的更多信息，请参阅 *Java 平台标准版 7 API 规范*中的[类格式化程序](https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html)下的转换。 

**Example 示例**  
+ `format(100+1: "d")` 返回字符串，`101`。
+ `format("The result is %d", 100+1)` 返回字符串，`The result is 101`。  | 
|  `f'expression'`  |  返回一个连接的字符串。使用此格式化函数，您可以使用简单的表达式来连接和格式化字符串。这些函数可能包含嵌套表达式。可以使用 `{}`（大括号）对表达式进行插值。这与 Python 中的[格式化字符串字面值](https://docs.python.org/3/reference/lexical_analysis.html#f-strings)类似。 

**Example 示例**  
+ `f'abc{1+2: "f"}d'` 返回 `abc3.000000d`。要计算此示例表达式，请执行以下操作：

  1. `format(1+2: "f")` 返回浮点数 `3.000000`。

  1. `join('', "abc", 1+2, 'd')` 返回字符串，`abc3.000000d`。

  您也可以用以下方式编写表达式：`join('', "abc", format(1+2: "f"), 'd')`。  | 

# 在公式表达式中使用聚合函数
使用聚合函数

仅在[指标](metrics.md)中，您可以使用以下函数以聚合每个时间间隔的输入值，并计算单个输出值。聚合函数可以从关联资产聚合数据。

聚合函数参数可以是[变量](expression-variables.md)、[数字文字](expression-literals.md#number-literal-definition)、[时间函数](expression-temporal-functions.md)、嵌套表达式或聚合函数。公式 `max(latest(x), latest(y), latest(z))` 使用聚合函数作为参数，并返回 `x`、`y`、和 `z` 属性的最大当前值。

可以在聚合函数中使用嵌套表达式。当您使用嵌套表达式时，以下规则将适用：
+ 每个参数都只能有一个变量。  
**Example**  

  例如，支持 `avg(x*(x-1))` 和 `sum(x/2 )/avg(y^2 )`。

  例如，不支持 `min(x/y)`。
+ 每个参数可以有多级嵌套表达式。  
**Example**  

  例如，支持 `sum(avg(x^2 )/2)`。
+ 不同的参数可以有不同的变量。  
**Example**  

  例如，支持 `sum(x/2, y*2)`。

**注意**  
如果您的表达式包含测量值，则 Amazon IoT SiteWise 使用当前时间间隔内测量值的最后一个值来计算聚合。
如果您的表达式包含属性，则 Amazon IoT SiteWise 使用属性的最新值来计算聚合。


| 函数 | 说明 | 
| --- | --- | 
|  `avg(x0, ..., xn)`  |  返回给定变量在当前时间间隔内的平均值。 <a name="aggregation-function-no-output"></a>仅当给定变量在当前时间间隔内至少有一个数据点时，此函数才会输出数据点。  | 
|   `sum(x0, ..., xn)`  |  返回给定变量在当前时间间隔内的值总和。 <a name="aggregation-function-no-output"></a>仅当给定变量在当前时间间隔内至少有一个数据点时，此函数才会输出数据点。  | 
|  `min(x0, ..., xn)`  |  返回给定变量在当前时间间隔内的最小值。 <a name="aggregation-function-no-output"></a>仅当给定变量在当前时间间隔内至少有一个数据点时，此函数才会输出数据点。  | 
|  `max(x0, ..., xn)`  |  返回给定变量在当前时间间隔内的最大值。 <a name="aggregation-function-no-output"></a>仅当给定变量在当前时间间隔内至少有一个数据点时，此函数才会输出数据点。  | 
|  `count(x0, ..., xn)`  |  返回给定变量在当前时间间隔内的数据点总数。有关如何计算满足条件的数据点数量的更多信息，请参阅[计算与条件匹配的数据点](expression-tutorials.md#count-filtered-data)。 <a name="aggregation-function-always-output"></a>此函数会计算每个时间间隔的数据点。  | 
| `stdev(x0, ..., xn)` | 返回给定变量在当前时间间隔内的标准差。 仅当给定变量在当前时间间隔内至少有一个数据点时，此函数才会输出数据点。  | 

# 在公式表达式中使用时间函数
使用时间函数

使用时间函数根据数据点的时间戳返回值。

## 在指标中使用时间函数


仅在[指标](metrics.md)中，您可以使用以下函数，这些函数根据数据点的时间戳返回值。

时态函数参数必须是来自本地资产模型或嵌套表达式的属性。这意味着您不能在时态函数中使用子资源模型中的属性。

可以在时态函数中使用嵌套表达式。当您使用嵌套表达式时，以下规则将适用：
+ 每个参数都只能有一个变量。

  例如，支持 `latest( t*9/5 + 32 )`。
+ 参数不能是聚合函数。

  例如，不支持 `first( sum(x) )`。


| 函数 | 说明 | 
| --- | --- | 
|  `first(x)`  |  返回给定变量在当前时间间隔内具有最早时间戳的值。  | 
|   `last(x)` |  返回给定变量在当前时间间隔内具有最晚时间戳的值。  | 
|  `earliest(x)`  |  返回给定变量在当前时间间隔开始之前的最后一个值。 如果输入属性在其历史记录中具有至少一个数据点，则此函数将计算每个时间间隔的数据点。有关详细信息，请参阅 [time-range-defintion](#time-range-def)。  | 
|   `latest(x)` |  返回给定变量在当前时间间隔结束之前具有最晚时间戳的最后一个值。 如果输入属性在其历史记录中具有至少一个数据点，则此函数将计算每个时间间隔的数据点。有关详细信息，请参阅 [time-range-defintion](#time-range-def)。  | 
|   `statetime(x)`  |  返回给定变量在当前时间间隔内为正值的时间（以秒为单位）。您可以使用[比较函数](expression-comparison-functions.md)创建转换属性，以供 `statetime` 函数使用。 例如，如果 `Idle` 属性为 `0` 或 `1`，您可以使用以下表达式计算每个时间间隔的闲置时间：`IdleTime = statetime(Idle)`。有关更多信息，请参阅 [statetime 使用情景示例](#statetime-example)。 此函数不支持将指标属性作为输入变量。 如果输入属性在其历史记录中具有至少一个数据点，则此函数将计算每个时间间隔的数据点。  | 
|   `TimeWeightedAvg(x, [interpolation])`  | 返回输入数据的平均值，使用点之间的时间间隔进行加权。有关计算和间隔的详细信息，请参阅[时间加权函数参数](#timeweighted-parameter)。可选参数 `interpolaton` 必须是字符串常量：[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-temporal-functions.html) | 
|   `TimeWeightedStDev(x, [algo])`  |  返回输入数据的标准差，使用点之间的时间间隔进行加权。 有关计算和间隔的详细信息，请参阅[时间加权函数参数](#timeweighted-parameter)。  该计算使用上次观测到的向前结转计算算法计算数据点之间的间隔。在这种方法中，数据点是作为最后一个观测值计算的，直到下一个输入数据点的时间戳。权重计算为数据点或窗口边界之间的时间间隔（以秒为单位）。 可选参数 `algo` 必须是字符串常量： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-temporal-functions.html) 以下公式用于计算，其中： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-temporal-functions.html) 总体标准差方程： ![\[总体标准差方程。\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/timeweightedstdev1.png) 频率标准差方程： ![\[频率标准差方程。\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/timeweighted-frequency-stdev.png)  | 

下图显示了如何相对于当前时间间隔 Amazon IoT SiteWise 计算时间函数`first``last``earliest``latest`、、和。

![\[Amazon IoT SiteWise 时间函数根据数据点的时间戳返回数据点。\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/images/sitewise-temporal-functions.png)
<a name="time-range-def"></a>

**注意**  
`first(x)`, `last(x)` 的时间范围是 (当前窗口开始, 当前窗口结束]。
`latest(x)` 的时间范围是 (起始时间, 当前窗口结束]。
`earliest(x)` 的时间范围是 (起始时间, 上一窗口结束]。

** 时间加权函数参数**

为聚合窗口计算的时间加权函数会考虑以下因素：
+ 窗口内的数据点
+ 数据点之间的时间间隔
+ 窗口前的最后一个数据点
+ 窗口之后的第一个数据点（对于某些算法）

**术语：**
+ **不良数据点** - 任何质量不佳或非数字值的数据点。在窗口结果计算中不考虑这一点。
+ **不良间隔** - 不良数据点之后的间隔。第一个已知数据点之前的间隔也被视为不良间隔。
+ **良好数据点** - 任何具有良好质量和数值的数据点。

**注意**  
Amazon IoT SiteWise 仅在计算变换和指标时才消耗`GOOD`质量数据。它会忽略 `UNCERTAIN` 和 `BAD` 数据点。
第一个已知数据点之前的间隔被视为**不良间隔**。请参阅[公式表达式教程](expression-tutorials.md)了解更多信息。

最后一个已知数据点之后的间隔无限期地持续下去，影响所有后续窗口。当新的数据点到达时，该函数会重新计算间隔。

按照上述规则，将计算聚合窗口结果并仅限于窗口边界。默认情况下，只有当整个窗口都是**良好间隔**时，该函数才会发送窗口结果。

如果窗口**良好间隔**小于窗口长度，则该函数不会发送窗口。

当影响窗口结果的数据点发生变化时，即使数据点在窗口之外，该函数也会重新计算窗口。

如果输入属性的历史记录中至少有一个数据点，并且计算已启动，则该函数计算每个时间间隔的时间加权聚合函数。

**Example statetime 使用情景示例**  
考虑这样一个使用情景示例，您有一个具有以下属性的资产：  
+ `Idle` – 一个为 `0` 或 `1` 的测量值。当该值为时 `1`，机器处于空闲状态。
+ `Idle Time` – 一个指标，该指标使用 `statetime(Idle)` 公式计算机器在每分钟内处于空闲状态的时间（以秒为单位）。
`Idle` 属性具有以下数据点。  


|  |  |  |  |  |  | 
| --- |--- |--- |--- |--- |--- |
| Timestamp | 2:00:00 PM | 2:00:30 PM | 2:01:15 PM | 2:02:45 PM | 2:04:00 PM | 
| Idle | 0 | 1 | 1 | 0 | 0 | 
Amazon IoT SiteWise 根据的值每分钟计算一次`Idle Time`属性`Idle`。此计算完成后，`Idle Time` 属性将具有以下数据点。  


|  |  |  |  |  |  | 
| --- |--- |--- |--- |--- |--- |
| Timestamp | 2:00:00 PM | 2:01:00 PM | 2:02:00 PM | 2:03:00 PM | 2:04:00 PM | 
| Idle Time | 不适用 | 30 | 60 | 45 | 0 | 
Amazon IoT SiteWise 在每分钟结束`Idle Time`时执行以下计算。  
+ At 2:00 PM (for 1:59 PM to 2:00 PM)
  + 在 2:00 PM 之前没有 `Idle` 数据，因此计算不会得出任何数据点。
+ At 2:01 PM (for 2:00 PM to 2:01 PM)
  + 在 2:00:00 PM，机器处于活动状态（`Idle` 为 `0`）。
  + 在 2:00:30 PM，机器处于空闲状态（`Idle` 为 `1`）。
  + `Idle` 在 2:01:00 PM 的时间间隔结束之前没有再次变化，因此 `Idle Time` 是 30 秒。
+ At 2:02 PM (for 2:01 PM to 2:02 PM)
  + 在 2:01:00 PM，机器处于空闲状态（基于 2:00:30 PM 的上一个数据点）。
  + 在 2:01:15 PM，机器仍处于空闲状态。
  + `Idle` 在 2:02:00 PM 的时间间隔结束之前没有再次变化，因此 `Idle Time` 是 60 秒。
+ At 2:03 PM (for 2:02 PM to 2:03 PM)
  + 在 2:02:00 PM，机器处于空闲状态（基于 2:01:15 PM 的上一个数据点）。
  + 在 2:02:45 PM，机器处于活动状态。
  + `Idle` 在 2:03:00 PM 的时间间隔结束之前没有再次变化，因此 `Idle Time` 是 45 秒。
+ At 2:04 PM (for 2:03 PM to 2:04 PM)
  + 在 2:03:00 PM，机器处于活动状态（基于 2:02:45 PM 的上一个数据点）。
  + `Idle` 在 2:04:00 PM 的时间间隔结束之前没有再次变化，因此 `Idle Time` 是 0 秒。

**Example 示例 TimeWeightedAvg 和 TimeWeightedStDev 场景**  
下表提供了这些一分钟窗口指标的示例输入和输出：`Avg(x), TimeWeightedAvg(x), TimeWeightedAvg(x, "linear"), stDev(x), timeWeightedStDev(x), timeWeightedStDev(x, 'p')`。  
一分钟聚合窗口的示例输入：  
这些数据点的质量为 `GOOD`。


|  |  | 
| --- |--- |
| 03:00:00 | 4.0 | 
| 03:01:00 | 2.0 | 
| 03:01:10 | 8.0 | 
| 03:01:50 | 20.0 | 
| 03:02:00 | 14.0 | 
| 03:02:05 | 10.0 | 
| 03:02:10 | 3.0 | 
| 03:02:30 | 20.0 | 
| 03:03:30 | 0.0 | 
汇总结果输出：  
无 – 未生成此窗口的结果。


| 时间 | `Avg(x)` | `TimeWeightedAvg(x)` | `TimeWeightedAvg(X, "linear")` | `stDev(X)` | `timeWeightedStDev(x)` | `timeWeightedStDev(x, 'p')` | 
| --- | --- | --- | --- | --- | --- | --- | 
| 3:00:00 | 4 | 无 | 无 | 0 | 无 | 无 | 
| 3:01:00 | 2 | 4 | 3 | 0 | 0 | 0 | 
| 3:02:00 | 14 | 9 | 13 | 6 | 5.430610041581775 | 5.385164807134504 | 
| 3:03:00 | 11 | 13 | 12.875 | 8.54400374531753 | 7.724054437220943 | 7.659416862050705 | 
| 3:04:00 | 0 | 10 | 2.5 | 0 | 10.084389681792215 | 10 | 
| 3:05:00 | 无 | 0 | 0 | 无 | 0 | 0 | 

## 在转换中使用时间函数


仅在[转换](transforms.md)中，您可以使用 `pretrigger()` 函数在启动当前转换计算的属性更新之前，检索变量的 `GOOD` 质量值。

以一个制造商 Amazon IoT SiteWise 用来监控机器状态的例子为例。制造商使用以下测量值和转换来表示过程：
+ 测量值，`current_state`，可以是 0 或 1。
  + 如果本机处于清洁状态，则 `current_state` 等于 1。
  + 如果计算机处于制造状态，则 `current_state` 等于 0。
+ 转换，`cleaning_state_duration`，等于 `if(pretrigger(current_state) == 1, timestamp(current_state) - timestamp(pretrigger(current_state)), none)`。此转换以 Unix 纪元格式返回机器处于清洁状态的时间（以秒为单位）。有关更多信息，请参阅 [在公式表达式中使用条件函数](expression-conditional-functions.md) [时间戳（）](expression-date-and-time-functions.md) 函数。

如果机器处于清洁状态的时间超过预期，制造商可能会对机器进行调查。

您也可以在多变量转换中使用 `pretrigger()` 函数。例如，您有两个名为 `x` 和 `y` 的测量值和一个等于 `x + y + pretrigger(y)` 的转换 `z`。下表显示了 `x`、`y` 和 `z` 从上午 9:00 到 9:15 的值。

**注意**  
此示例假设测量值按时间顺序到达。例如，上午 09:00 `x` 的值在上午 09:05 `x` 的值之前到达。
如果上午 9:05 的数据点在上午 9:00 的数据点之前到达，则 `z` 不会在上午 9:05 进行计算。
如果上午 9:05 `x` 的值在上午 09:00 `x` 的值之前到达，并且 `y` 的值按时间顺序到达，则 `z` 在上午 9:05 等于 `22 = 20 + 1 + 1`。


|  | 09:00 AM | 09:05 AM | 09:10 AM | 09:15 AM | 
| --- | --- | --- | --- | --- | 
|  `x`  |  10  |  20  |    |  30  | 
|  `y`  |  1  |  2  |  3  |    | 
|  `z = x + y + pretrigger(y)`  |  `y` 在上午 09:00 之前没有收到任何数据点。因此，`z` 不是在上午 09:00 计算的。  |  23 = 20 \$1 2 \$1 1 `pretrigger(y)` 等于 1。  |  25 = 20 \$1 3 \$1 2 `x` 没有收到新的数据点。`pretrigger(y)` 等于 2。  |  36 = 30 \$1 3 \$1 3 `y` 没有收到新的数据点。因此，在上午 09:15 `pretrigger(y)` 等于 3。  | 

# 在公式表达式中使用日期和时间函数
使用日期和时间函数

在[转换](transforms.md)和[指标](metrics.md)中，您可以通过以下方式使用日期和时间函数：
+ 以 UTC 或本地时区检索数据点的当前时间戳。
+ 使用参数（例如`year`、`month` 和 `day_of_month`）构造时间戳。
+ 使用 `unix_time` 参数提取一个时间段，例如年或月。


| 函数 | 说明 | 
| --- | --- | 
|  `now()`  |  采用 Unix 纪元时间格式返回当前日期和时间（以秒为单位）。  | 
|  `timestamp()`  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-date-and-time-functions.html)  | 
|  `mktime(time_zone, year, month, day_of_month, hour, minute, second)`  |  返回 Unix 纪元时间格式的输入时间（以秒为单位）。 使用此函数存在以下要求： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-date-and-time-functions.html) 使用此函数存在以下限制： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-date-and-time-functions.html) 示例： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-date-and-time-functions.html)  | 
|  `localtime(unix_time, time_zone)`  |  从 Unix 时间返回指定时区中的某年、一个月中的某天、一周中的某天、一年中的某天、小时、分钟或秒。 使用此函数存在以下要求： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-date-and-time-functions.html) 响应示例：`2007-12-03T10:15:30+01:00[Europe/Paris]` `localtime(unix_time, time_zone)` 不是一个独立的函数。`year()`、`mon()`、`mday`、`wday()`、`yday()`、`hour()`、`minute()` 和 `sec()` 函数采用 `localtime(unix_time, time_zone)` 作为参数。 示例： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot-sitewise/latest/userguide/expression-date-and-time-functions.html)  | 
|  `year(localtime(unix_time, time_zone)`  |  返回 `localtime(unix_time, time_zone)` 的年份。  | 
|  `mon(localtime(unix_time, time_zone))`  |  返回 `localtime(unix_time, time_zone)` 的月份。  | 
|  `mday(localtime(unix_time, time_zone))`  |  返回 `localtime(unix_time, time_zone)` 一个月中的某天。  | 
|  `wday(localtime(unix_time, time_zone))`  |  返回 `localtime(unix_time, time_zone)` 一周中的某天。  | 
|  `yday(localtime(unix_time, time_zone))`  |  返回 `localtime(unix_time, time_zone)` 一年中的某天。  | 
|  `hour(localtime(unix_time, time_zone))`  |  返回 `localtime(unix_time, time_zone)` 的某小时。  | 
|  `minute(localtime(unix_time, time_zone))`  |  返回 `localtime(unix_time, time_zone)` 的某分钟。  | 
|  `sec(localtime(unix_time, time_zone))`  |  返回 `localtime(unix_time, time_zone)` 的某秒。  | 

## 支持的时区格式


您可以通过以下方式指定时区参数：
+ 时区偏移量 - 指定 `'Z'` 表示 UTC 或偏移量（`'+2'` 或 `'-5'`）。
+ 偏移量 IDs -将时区缩写和偏移量合并。例如，`'GMT+2'` 和 `'UTC-01:00'`。时区缩写必须仅包含三个字母。
+ 基于区域 IDs -例如，`'Etc/GMT+12'`和`'Pacific/Pago_Pago'`。

### 支持的时区缩写


日期和时间函数支持以下三个字母的时区缩写：
+ 美国东部标准时间 (EST) - -05:00
+ 美国夏威夷时间 (HST) - -10:00
+ 北美山区时间 (MST) - -07:00
+ ACT - 澳大利亚/达尔文
+ AET - 澳大利亚/悉尼
+ AGT-America/Argentina/Buenos \$1Aires
+ ART - 非洲/开罗
+ AST - 美洲/安克雷奇
+ BET - 美洲/圣保罗
+ BST - 亚洲/达卡
+ CAT - 非洲/哈拉雷
+ CET - 欧洲/巴黎
+ CNT - 美洲/圣约翰斯
+ CST - 美洲/芝加哥
+ CTT- Asia/Shanghai 
+ EAT - 非洲/亚的斯亚贝巴
+ IET-America/Indiana/Indianapolis
+ IST - 亚洲/加尔各答
+ JST - 亚洲/东京
+ MIT - 太平洋/阿皮亚
+ NET - 亚洲/埃里温
+ NST - 太平洋/奥克兰
+ PLT - 亚洲/卡拉奇
+ PRT - 美洲/波多黎各
+ America/Los\$1Angeles
+ SST - 太平洋/瓜达尔卡纳尔岛
+ VST - 亚洲/胡志明市

### 支持的基于区域 IDs


日期和时间函数支持以下基于区域的函数 IDs，按其与 UTC\$1 00:00 的关系进行组织：
+ Etc/GMT\$112 (UTC-12:00)
+ 太平洋/帕果帕果 (UTC-11:00)
+ 太平洋/萨摩亚 (UTC-11:00)
+ 太平洋/纽埃岛 (UTC-11:00)
+ 美国/萨摩亚 (UTC-11:00)
+ Etc/GMT\$111 (UTC-11:00)
+ 太平洋/中途岛 (UTC-11:00)
+ 太平洋/檀香山 (UTC-10:00)
+ 太平洋/拉罗汤加岛 (UTC-10:00)
+ 太平洋/塔希提岛 (UTC-10:00)
+ 太平洋/约翰斯顿岛 (UTC-10:00)
+ 美国/夏威夷 (UTC-10:00)
+ Systemv/ HST10 (UTC-10:00)
+ Etc/GMT\$110 (UTC-10:00)
+ 太平洋/马克萨斯群岛 (UTC-09:30)
+ Etc/GMT\$19 (UTC-09:00)
+ 太平洋/甘比尔 (UTC-09:00)
+ 美国/阿特卡 (UTC-09:00)
+ Systemv/ YST9 (UTC-09:00)
+ 美洲/埃达克岛 (UTC-09:00)
+ 美国/阿留申 (UTC-09:00)
+ Etc/GMT\$18 (UTC-08:00)
+ 美国/阿拉斯加 (UTC-08:00)
+ 美洲/朱诺 (UTC-08:00)
+ 美洲/梅特拉卡特拉 (UTC-08:00)
+ 美洲/亚库塔特 (UTC-08:00)
+ 太平洋/皮特凯恩岛 (UTC-08:00)
+ 美洲/锡特卡 (UTC-08:00)
+ 美洲/安克雷奇 (UTC-08:00)
+ Systemv/ PST8 (世界标准时间 08:00)
+ 美洲/诺姆 (UTC-08:00)
+ Systemv/ YST9 YDT (UTC-08:00)
+ 加拿大/育空地区 (UTC-07:00)
+ 美国/太平洋-新 (UTC-07:00)
+ Etc/GMT\$17 (UTC-07:00)
+ 美国/亚利桑那州 (UTC-07:00)
+ 美国/道森克里克 (UTC-07:00)
+ 加拿大/太平洋地区 (UTC-07:00)
+ PST8太平洋夏令时 (UTC-07:00)
+ Systemv/ MST7 (UTC-07:00)
+ 美洲/道森 (UTC-07:00)
+ 墨西哥/ BajaNorte (世界标准时间 07:00)
+ 美洲/蒂华纳 (UTC-07:00)
+ 美洲/克雷斯顿 (UTC-07:00)
+ 美洲/埃莫西约 (UTC-07:00)
+ 美洲/圣伊莎贝尔 (UTC-07:00)
+ 美洲/温哥华 (UTC-07:00)
+ 美洲/恩塞纳达 (UTC-07:00)
+ 美洲/凤凰城 (UTC-07:00)
+ 美洲/怀特霍斯 (UTC-07:00)
+ 美洲/纳尔逊堡 (UTC-07:00)
+ Systemv/ PST8 PDT (UTC-07:00)
+ 美洲/洛杉矶 (UTC-07:00)
+ 美国/太平洋地区 (UTC-07:00)
+ 美洲/萨尔瓦多 (UTC-06:00)
+ 美洲/危地马拉 (UTC-06:00)
+ 美洲/伯利兹 (UTC-06:00)
+ 美洲/马那瓜 (UTC-06:00)
+ 美洲/特古西加尔巴 (UTC-06:00)
+ Etc/GMT\$16 (UTC-06:00)
+ 太平洋/复活节岛 (UTC-06:00)
+ 墨西哥/ BajaSur (世界标准时间 06:00)
+ 美洲/里贾纳 (UTC-06:00)
+ 美洲/丹佛 (UTC-06:00)
+ 太平洋/加拉帕戈斯群岛 (UTC-06:00)
+ 美洲/耶洛奈夫 (UTC-06:00)
+ 美洲/斯威夫特卡伦特 (UTC-06:00)
+ 美洲/伊努维克 (UTC-06:00)
+ 美洲/马萨特兰 (UTC-06:00)
+ 美洲/博伊西 (UTC-06:00)
+ 美洲/哥斯达黎加 (UTC-06:00)
+ MST7MDT (世界标准时间 06:00)
+ Systemv/ CST6 (世界标准时间 06:00)
+ 美洲/奇瓦瓦州 (UTC-06:00)
+ 美洲/奥吉纳加 (UTC-06:00)
+ 智利/ EasterIsland (世界标准时间 06:00)
+ 美国/山区 (UTC-06:00)
+ 美洲/埃德蒙顿 (UTC-06:00)
+ 加拿大/山区 (UTC-06:00)
+ 美洲/剑桥湾 (UTC-06:00)
+ 纳瓦霍 (UTC-06:00)
+ Systemv/ MST7 MDT (UTC-06:00)
+ 加拿大/萨斯喀彻温省 (UTC-06:00)
+ 美洲/希普罗克 (UTC-06:00)
+ 美洲/巴拿马 (UTC-05:00)
+ 美洲/芝加哥 (UTC-05:00)
+ 美洲/埃鲁内佩 (UTC-05:00)
+ Etc/GMT\$15 (UTC-05:00)
+ 墨西哥/整体 (UTC-05:00)
+ 美洲/阿克里港 (UTC-05:00)
+ 美洲/瓜亚基尔 (UTC-05:00)
+ 美洲/兰京海口 (UTC-05:00)
+ 美国/中部 (UTC-05:00)
+ 美洲/雷尼河 (UTC-05:00)
+ America/Indiana/Knox(世界标准时间 05:00)
+ America/North\$1Dakota/Beulah(世界标准时间 05:00)
+ 美洲/蒙特雷 (UTC-05:00)
+ 美洲/牙买加 (UTC-05:00)
+ 美洲阿蒂科肯 (UTC-05:00)
+ 美洲/科勒尔港 (UTC-05:00)
+ America/North\$1Dakota/Center(世界标准时间 05:00)
+ 美洲/开曼群岛 (UTC-05:00)
+ America/Indiana/Tell\$1City (世界标准时间 05:00)
+ 美洲/墨西哥城 (UTC-05:00)
+ 美洲/马塔莫罗斯 (UTC-05:00)
+ CST6中部夏令时间 (UTC-05:00)
+ 美洲/诺克斯县 (UTC-05:00)
+ 美洲/波哥大 (UTC-05:00)
+ 美洲/梅诺米尼 (UTC-05:00)
+ 美洲/雷索卢特 (UTC-05:00)
+ Systemv/ EST5 (UTC-05:00)
+ 加拿大/中部 (UTC-05:00)
+ 巴西/阿克里州 (UTC-05:00)
+ 美洲/坎昆 (UTC-05:00)
+ 美洲/利马 (UTC-05:00)
+ 美洲/Bahia\$1Banderas (UTC-05:00)
+ 美国/印第安纳-斯塔克 (UTC-05:00)
+ 美洲/里奥布朗库 (UTC-05:00)
+ Systemv/ CST6 CDT (UTC-05:00)
+ 牙买加 (UTC-05:00)
+ 美洲/梅里达 (UTC-05:00)
+ America/North\$1Dakota/New\$1Salem (世界标准时间 05:00)
+ 美洲/温尼伯 (UTC-05:00)
+ 美洲/库亚巴 (UTC-04:00)
+ 美洲/马里戈特 (UTC-04:00)
+ America/Indiana/Petersburg(世界标准时间 04:00)
+ 智利/大陆 (UTC-04:00)
+ 美洲/大特克岛 (UTC-04:00)
+ 古巴 (UTC-04:00)
+ Etc/GMT\$14 (UTC-04:00)
+ 美洲/马瑙斯 (UTC-04:00)
+ 美洲/韦恩堡 (UTC-04:00)
+ 美洲/圣托马斯 (UTC-04:00)
+ 美洲/安圭拉 (UTC-04:00)
+ 美洲/哈瓦那 (UTC-04:00)
+ 美国/密歇根州 (UTC-04:00)
+ 美洲/巴巴多斯 (UTC-04:00)
+ 美洲/路易斯维尔 (UTC-04:00)
+ 美洲/库拉索 (UTC-04:00)
+ 美洲/圭亚那 (UTC-04:00)
+ 美洲/马提尼克岛 (UTC-04:00)
+ 美洲/波多黎各 (UTC-04:00)
+ 美洲/西班牙港 (UTC-04:00)
+ Systemv/ AST4 (UTC-04:00)
+ America/Indiana/Vevay(世界标准时间 04:00)
+ America/Indiana/Vincennes(世界标准时间 04:00)
+ 美洲/克拉伦代克 (UTC-04:00)
+ 美洲/安提瓜 (UTC-04:00)
+ 美洲/印第安纳波利斯 (UTC-04:00)
+ 美洲/伊卡卢伊特 (UTC-04:00)
+ 美洲/圣文森特 (UTC-04:00)
+ America/Kentucky/Louisville(世界标准时间 04:00)
+ 美洲/多米尼加 (UTC-04:00)
+ 美洲/亚松森 (UTC-04:00)
+ EST5美国东部时间（世界标准时间 04:00）
+ 美洲/拿骚 (UTC-04:00)
+ America/Kentucky/Monticello(世界标准时间 04:00)
+ 巴西/西部 (UTC-04:00)
+ 美洲/阿鲁巴 (UTC-04:00)
+ America/Indiana/Indianapolis(世界标准时间 04:00)
+ 美洲/圣地亚哥 (UTC-04:00)
+ 美洲/拉巴斯 (UTC-04:00)
+ 美洲/桑德贝 (UTC-04:00)
+ America/Indiana/Marengo(世界标准时间 04:00)
+ 美洲/巴朗克萨伯隆 (UTC-04:00)
+ 美洲/圣多明哥 (UTC-04:00)
+ 美国/东部 (UTC-04:00)
+ 加拿大/东部 (UTC-04:00)
+ America/ Port-au-Prince (世界标准时间 04:00)
+ 美洲/圣巴泰勒米 (UTC-04:00)
+ 美洲/尼皮贡 (UTC-04:00)
+ 美国/印第安纳州东部 (UTC-04:00)
+ 美洲/圣露西亚 (UTC-04:00)
+ 美洲/蒙特塞拉特 (UTC-04:00)
+ 美洲/Lower\$1Princes (UTC-04:00)
+ 美洲/底特律 (UTC-04:00)
+ 美洲/托尔托拉 (UTC-04:00)
+ 美洲/波多韦 (UTC-04:00)
+ 美洲/大坎普 (UTC-04:00)
+ 美洲/弗吉尼亚 (UTC-04:00)
+ 美洲/潘纳通 (UTC-04:00)
+ 美洲/蒙特利尔 (UTC-04:00)
+ America/Indiana/Winamac(世界标准时间 04:00)
+ 美洲/博阿维斯塔 (UTC-04:00)
+ 美洲/格林纳达 (UTC-04:00)
+ 美洲/纽约 (UTC-04:00)
+ 美洲/圣基茨 (UTC-04:00)
+ 美洲/加拉加斯 (UTC-04:00)
+ 美洲/瓜德罗普岛 (UTC-04:00)
+ 美洲/多伦多 (UTC-04:00)
+ Systemv/ EST5 美国东部时间 (UTC-04:00)
+ America/Argentina/Catamarca(世界标准时间 03:00)
+ 加拿大/大西洋地区 (UTC-03:00)
+ America/Argentina/Cordoba(世界标准时间 03:00)
+ 美洲/阿拉瓜伊纳 (UTC-03:00)
+ America/Argentina/Salta(世界标准时间 03:00)
+ Etc/GMT\$13 (UTC-03:00)
+ 美洲/蒙得维的亚 (UTC-03:00)
+ 巴西/东部 (UTC-03:00)
+ America/Argentina/Mendoza(世界标准时间 03:00)
+ America/Argentina/Rio\$1Gallegos (世界标准时间 03:00)
+ 美洲/卡塔马卡 (UTC-03:00)
+ 美洲/科尔多瓦 (UTC-03:00)
+ 美洲/圣保罗 (UTC-03:00)
+ America/Argentina/Jujuy(世界标准时间 03:00)
+ 美洲/卡宴 (UTC-03:00)
+ 美洲/累西腓市 (UTC-03:00)
+ 美洲/布宜诺斯艾利斯 (UTC-03:00)
+ 美洲/帕拉马里博 (UTC-03:00)
+ 美洲/蒙克顿 (UTC-03:00)
+ 美洲/门多萨 (UTC-03:00)
+ 美洲/圣塔伦 (UTC-03:00)
+ 大西洋/百慕大 (UTC-03:00)
+ 美洲/马塞约 (UTC-03:00)
+ 大西洋/斯坦利（UTC-03:00）
+ 美洲/哈利法克斯 (UTC-03:00)
+ 南极洲/罗瑟拉 (UTC-03:00)
+ America/Argentina/San\$1Luis (世界标准时间 03:00)
+ America/Argentina/Ushuaia(世界标准时间 03:00)
+ 南极洲/帕尔默 (UTC-03:00)
+ 美洲/蓬塔阿雷纳斯 (UTC-03:00)
+ 美洲/格莱斯贝 (UTC-03:00)
+ 美洲/福塔雷萨 (UTC-03:00)
+ 美洲/图勒岛 (UTC-03:00)
+ America/Argentina/La\$1Rioja (世界标准时间 03:00)
+ 美洲/贝伦 (UTC-03:00)
+ 美洲/胡胡伊 (UTC-03:00)
+ 美洲/巴伊亚 (UTC-03:00)
+ 美洲/古斯湾 (UTC-03:00)
+ America/Argentina/San\$1Juan (世界标准时间 03:00)
+ America/Argentina/ComodRivadavia(世界标准时间 03:00)
+ America/Argentina/Tucuman(世界标准时间 03:00)
+ 美洲/罗萨里奥 (UTC-03:00)
+ Systemv/ AST4 ADT (UTC-03:00)
+ America/Argentina/Buenos\$1Aires (世界标准时间 03:00)
+ 美洲/圣约翰斯 (UTC-02:30)
+ 加拿大/纽芬兰 (UTC-02:30)
+ 美洲/密克隆群岛 (UTC-02:00)
+ Etc/GMT\$12 (UTC-02:00)
+ 美洲/戈特霍布 (UTC-02:00)
+ 美洲/诺罗尼亚 (UTC-02:00)
+ 巴西/ DeNoronha (世界标准时间 02:00)
+ 大西洋/南乔治亚岛 (UTC-02:00)
+ Etc/GMT\$11 (UTC-01:00)
+ 大西洋/佛得角 (UTC-01:00)
+ 太平洋/基里巴斯圣诞岛 (UTC\$114:00)
+ Etc/GMT-14 (UTC\$114:00)
+ 太平洋/法考福环礁 (UTC\$113:00)
+ 太平洋/恩德伯里 (UTC\$113:00)
+ 太平洋/阿皮亚 (UTC\$113:00)
+ 太平洋/汤加塔布 (UTC\$113:00)
+ Etc/GMT-13 (UTC\$113:00)
+ NZ-CHAT (UTC\$112:45)
+ 太平洋/查塔姆群岛 (UTC\$112:45)
+ 太平洋/夸贾林 (UTC\$112:00)
+ 南极洲/（世界标准时间\$1 12 McMurdo :00）
+ 太平洋/瓦利斯 (UTC\$112:00)
+ 太平洋/斐济 (UTC\$112:00)
+ 太平洋/富纳富提 (UTC\$112:00)
+ 太平洋/瑙鲁 (UTC\$112:00)
+ 夸贾林岛 (UTC\$1 12:00)
+ 新西兰 (UTC\$112:00)
+ 太平洋/威克岛 (UTC\$112:00)
+ 南极洲/南极 (UTC\$1 12:00)
+ 太平洋/塔拉瓦 (UTC\$112:00)
+ 太平洋/奥克兰 (UTC\$112:00)
+ 亚洲/堪察加半岛 (UTC\$112:00)
+ Etc/GMT-12 (UTC\$112:00)
+ 亚洲/阿纳德尔 (UTC\$112:00)
+ 太平洋/马朱罗 (UTC\$112:00)
+ 太平洋/波纳佩岛 (UTC\$111:00)
+ 太平洋/布干维尔 (UTC\$111:00)
+ 南极洲/麦格理 (UTC\$111:00)
+ 太平洋/波纳佩岛 (UTC\$111:00)
+ 太平洋/埃法特岛 (UTC\$111:00)
+ 太平洋/诺福克 (UTC\$111:00)
+ 亚洲/马加丹 (UTC\$111:00)
+ 太平洋/科斯雷 (UTC\$111:00)
+ 亚洲/萨哈林 (UTC\$111:00)
+ 太平洋/努美阿 (UTC\$111:00)
+ Etc/GMT-11 (UTC\$111:00)
+ 亚洲/Srednekolymsk (UTC\$111:00)
+ 太平洋/瓜达尔卡纳尔岛 (UTC\$111:00)
+ 澳大利亚/豪勋爵 (UTC\$1 10:30)
+ 澳大利亚/LHI (UTC\$110:30)
+ 澳大利亚/霍巴特 (UTC\$110:00)
+ 太平洋/雅浦岛 (UTC\$110:00)
+ 澳大利亚/塔斯马尼亚州 (UTC\$110:00)
+ 太平洋/莫尔兹比港 (UTC\$110:00)
+ 澳大利亚/澳大利亚首都直辖区 (UTC\$110:00)
+ 澳大利亚/维多利亚州 (UTC\$110:00)
+ 太平洋/楚克岛 (UTC\$110:00)
+ 澳大利亚/昆士兰州 (UTC\$110:00)
+ 澳大利亚/堪培拉 (UTC\$110:00)
+ 澳大利亚/居里 (UTC\$110:00)
+ 太平洋/关岛 (UTC\$110:00)
+ 太平洋/特鲁克岛 (UTC\$110:00)
+ 澳大利亚/新南威尔士州 (UTC\$110:00)
+ 亚洲/符拉迪沃斯托克 (UTC\$110:00)
+ 太平洋/塞班岛 (UTC\$110:00)
+ 南极洲/杜DUrville 蒙特（世界标准时间\$1 10:00）
+ 澳大利亚/悉尼（世界标准时间\$1 10:00）
+ 澳大利亚/布里斯班 (UTC\$110:00)
+ Etc/GMT-10 (UTC\$110:00)
+ 亚洲/乌斯季挪拉 (UTC\$110:00)
+ 澳大利亚/墨尔本 (UTC\$110:00)
+ 澳大利亚/利达曼 (UTC\$110:00)
+ 澳大利亚/北部 (UTC\$109:30)
+ 澳大利亚/Yancowinna (UTC\$1 09:30)
+ 澳大利亚/阿德莱德 (UTC\$109:30)
+ 澳大利亚/布罗肯希尔 (UTC\$1 09:30)
+ 澳大利亚/南部 (UTC\$109:30)
+ 澳大利亚/达尔文 (UTC\$109:30)
+ Etc/GMT-9 (UTC\$109:00)
+ 太平洋/帕劳 (UTC\$109:00)
+ 亚洲/赤塔 (UTC\$109:00)
+ 亚洲/帝力 (UTC\$109:00)
+ 亚洲/查亚普拉 (UTC\$109:00)
+ 亚洲/雅库茨克 (UTC\$109:00)
+ 亚洲/平壤 (UTC\$109:00)
+ 韩国 (UTC\$109:00)
+ 亚洲/首尔 (UTC\$109:00)
+ 亚洲/汉德加 (UTC\$1 09:00)
+ 日本 (UTC\$109:00)
+ 亚洲/东京 (UTC\$109:00)
+ 澳大利亚/尤克拉 (UTC\$1 08:45)
+ 亚洲/古晋 (UTC\$108:00)
+ 亚洲/重庆 (UTC\$108:00)
+ Etc/GMT-8 (UTC\$108:00)
+ 澳大利亚/珀斯 (UTC\$108:00)
+ 亚洲/澳门 (UTC\$108:00)
+ 亚洲/澳门 (UTC\$108:00)
+ 亚洲/乔巴山 (UTC\$108:00)
+ 亚洲/上海 (UTC\$108:00)
+ 南极洲/凯西 (UTC\$1 08:00)
+ 亚洲/乌兰巴托 (UTC\$1 08:00)
+ 亚洲/重庆 (UTC\$108:00)
+ 亚洲/乌兰巴托 (UTC\$108:00)
+ 亚洲/台北 (UTC\$108:00)
+ 亚洲/马尼拉 (UTC\$108:00)
+ 中国 (UTC\$108:00)
+ 亚洲/乌戎潘当 (UTC\$1 08:00)
+ 亚洲/哈尔滨 (UTC\$108:00)
+ 新加坡 (UTC\$108:00)
+ 亚洲/文莱 (UTC\$108:00)
+ 澳大利亚/西部 (UTC\$108:00)
+ 亚洲/香港 (UTC\$1 08:00)
+ 亚洲/望加锡 (UTC\$108:00)
+ 中国香港 (UTC\$108:00)
+ 亚洲/吉隆坡 (UTC\$1 08:00)
+ 亚洲/伊尔库茨克 (UTC\$108:00)
+ 亚洲/新加坡 (UTC\$108:00)
+ 亚洲/坤甸 (UTC\$1 07:00)
+ Etc/GMT-7 (UTC\$107:00)
+ 亚洲/金边 (UTC\$107:00)
+ 亚洲/新西伯利亚 (UTC\$107:00)
+ 南极洲/戴维斯 (UTC\$107:00)
+ 亚洲/托木斯克 (UTC\$1 07:00)
+ 亚洲/雅加达 (UTC\$107:00)
+ 亚洲/巴尔瑙尔 (UTC\$107:00)
+ 印度洋/圣诞岛 (UTC\$107:00)
+ 亚洲/胡志明市 (UTC\$107:00)
+ 亚洲/科布多 (UTC\$1 07:00)
+ 亚洲/曼谷 (UTC\$107:00)
+ 亚洲/万象 (UTC\$107:00)
+ 亚洲/新库兹涅茨克 (UTC\$107:00)
+ 亚洲/克拉斯诺亚尔斯克 (UTC\$1 07:00)
+ 亚洲/西贡 (UTC\$107:00)
+ 亚洲/仰光 (UTC\$106:30)
+ 亚洲/仰光 (UTC\$106:30)
+ 印度洋/科科斯群岛 (UTC\$106:30)
+ 亚洲/喀什 (UTC\$106:00)
+ Etc/GMT-6 (UTC\$106:00)
+ 亚洲/阿拉木图 (UTC\$106:00)
+ 亚洲/达卡 (UTC\$106:00)
+ 亚洲/鄂木斯克 (UTC\$106:00)
+ 亚洲/达卡 (UTC\$106:00)
+ 印度洋/查戈斯群岛 (UTC\$106:00)
+ 亚洲/Qyzylorda (UTC\$106:00)
+ 亚洲/比什凯克 (UTC\$106:00)
+ 南极洲/东方站（UTC\$1 06:00）
+ 亚洲/乌鲁木齐 (UTC\$106:00)
+ 亚洲/廷布 (UTC\$106:00)
+ 亚洲/廷布 (UTC\$106:00)
+ 亚洲/加德满都 (UTC\$105:45)
+ 亚洲/加德满都 (UTC\$105:45)
+ 亚洲/加尔各答 (UTC\$105:30)
+ 亚洲/科伦坡 (UTC\$105:30)
+ 亚洲/加尔各答 (UTC\$105:30)
+ 亚洲/阿克套 (UTC\$1 05:00)
+ Etc/GMT-5 (UTC\$105:00)
+ 亚洲/撒马尔罕 (UTC\$105:00)
+ 亚洲/卡拉奇 (UTC\$105:00)
+ 亚洲/叶卡捷琳堡 (UTC\$105:00)
+ 亚洲/杜尚别 (UTC\$105:00)
+ 印度洋/马尔代夫 (UTC\$105:00)
+ 亚洲/Oral (UTC\$1 05:00)
+ 亚洲/塔什干 (UTC\$105:00)
+ 南极洲/莫森 (UTC\$105:00)
+ 亚洲/阿克托比 (UTC\$1 05:00)
+ 亚洲/阿什哈巴德 (UTC\$105:00)
+ 亚洲/阿什哈巴德 (UTC\$1 05:00)
+ 亚洲/阿特劳 (UTC\$105:00)
+ 印度洋/凯尔盖朗岛 (UTC\$1 05:00)
+ 伊朗 (UTC\$104:30)
+ 亚洲/德黑兰 (UTC\$104:30)
+ 亚洲/喀布尔 (UTC\$104:30)
+ 亚洲/埃里温 (UTC\$104:00)
+ Etc/GMT-4 (UTC\$104:00)
+ Etc/GMT-4 (UTC\$104:00)
+ 亚洲/迪拜 (UTC\$104:00)
+ 印度洋/留尼汪岛 (UTC\$104:00)
+ 欧洲/萨拉托夫 (UTC\$1 04:00)
+ 欧洲/萨马拉 (UTC\$104:00)
+ 印度洋/马埃岛 (UTC\$104:00)
+ 亚洲/巴库 (UTC\$104:00)
+ 亚洲/马斯喀特 (UTC\$104:00)
+ 欧洲/伏尔加格勒 (UTC\$1 04:00)
+ 欧洲/阿斯特拉罕 (UTC\$104:00)
+ 亚洲/第比利斯 (UTC\$104:00)
+ 欧洲/乌里扬诺夫斯克 (UTC\$1 04:00)
+ 亚洲/亚丁 (UTC\$103:00)
+ 非洲/内罗毕 (UTC\$103:00)
+ 欧洲/伊斯坦布尔 (UTC\$103:00)
+ Etc/GMT-3 (UTC\$103:00)
+ 欧洲/扎波罗热 (UTC\$103:00)
+ 以色列 (UTC\$103:00)
+ 印度洋/科摩罗 (UTC\$103:00)
+ 南极洲/昭和 (UTC\$103:00)
+ 非洲/摩加迪沙 (UTC\$103:00)
+ 欧洲/布加勒斯特 (UTC\$103:00)
+ 非洲/阿斯马拉 (UTC\$103:00)
+ 欧洲/玛丽港 (UTC\$1 03:00)
+ 亚洲/伊斯坦布尔 (UTC\$103:00)
+ 欧洲/蒂拉斯波尔 (UTC\$1 03:00)
+ 欧洲/莫斯科 (UTC\$103:00)
+ 欧洲/基希讷乌 (UTC\$103:00)
+ 欧洲/赫尔辛基 (UTC\$103:00)
+ 亚洲/贝鲁特 (UTC\$103:00)
+ 亚洲/特拉维夫 (UTC\$1 03:00)
+ 非洲/吉布提 (UTC\$103:00)
+ 欧洲/辛菲罗波尔 (UTC\$103:00)
+ 欧洲/索非亚 (UTC\$103:00)
+ 亚洲/加沙 (UTC\$103:00)
+ 非洲/阿斯马拉 (UTC\$103:00)
+ 欧洲/里加 (UTC\$103:00)
+ 亚洲/巴格达 (UTC\$103:00)
+ 亚洲/大马士革 (UTC\$103:00)
+ 非洲/达累斯萨拉姆 (UTC\$1 03:00)
+ 非洲/亚的斯亚贝巴 (UTC\$1 03:00)
+ 欧洲/乌日哥罗德 (UTC\$1 03:00)
+ 亚洲/耶路撒冷 (UTC\$103:00)
+ 亚洲/利雅得 (UTC\$103:00)
+ 亚洲/科威特 (UTC\$103:00)
+ 欧洲/基洛夫 (UTC\$103:00)
+ 非洲/坎帕拉 (UTC\$103:00)
+ 欧洲/明斯克 (UTC\$103:00)
+ 亚洲/卡塔尔 (UTC\$103:00)
+ 欧洲/基辅 (UTC\$103:00)
+ 亚洲/巴林 (UTC\$103:00)
+ 欧洲/维尔纽斯 (UTC\$103:00)
+ 印度洋/塔那那利佛 (UTC\$103:00)
+ 印度洋/马约特岛 (UTC\$103:00)
+ 欧洲/塔林 (UTC\$103:00)
+ 土耳其 (UTC\$103:00)
+ 非洲/朱巴 (UTC\$103:00)
+ 亚洲/尼科西亚 (UTC\$103:00)
+ 亚洲/法马古斯塔 (UTC\$103:00)
+ W-SU (UTC\$103:00)
+ EET (UTC\$103:00)
+ 亚洲/希伯伦 (UTC\$103:00)
+ 亚洲/安曼 (UTC\$103:00)
+ 欧洲/尼科西亚 (UTC\$103:00)
+ 欧洲/雅典 (UTC\$103:00)
+ 非洲/开罗 (UTC\$102:00)
+ 非洲/姆巴巴内 (UTC\$102:00)
+ 欧洲/布鲁塞尔 (UTC\$102:00)
+ 欧洲/华沙 (UTC\$102:00)
+ CET (UTC\$102:00)
+ 欧洲/卢森堡 (UTC\$102:00)
+ Etc/GMT-2 (UTC\$102:00)
+ 利比亚 (UTC\$102:00)
+ 非洲/基加利 (UTC\$102:00)
+ 非洲/的黎波里 (UTC\$1 02:00)
+ 欧洲/加里宁格勒 (UTC\$1 02:00)
+ 非洲/温得和克 (UTC\$102:00)
+ 欧洲/马耳他 (UTC\$102:00)
+ 欧洲/布辛根 (UTC\$102:00)
+ 
+ 欧洲/斯科普里 (UTC\$1 02:00)
+ 欧洲/萨拉热窝 (UTC\$1 02:00)
+ 欧洲/罗马 (UTC\$102:00)
+ 欧洲/苏黎世 (UTC\$102:00)
+ 欧洲/直布罗陀 (UTC\$102:00)
+ 非洲/卢本巴希 (UTC\$102:00)
+ 欧洲/瓦杜兹 (UTC\$102:00)
+ 欧洲/卢布尔雅那 (UTC\$1 02:00)
+ 欧洲/柏林 (UTC\$102:00)
+ 欧洲/斯德哥尔摩 (UTC\$102:00)
+ 欧洲/布达佩斯 (UTC\$102:00)
+ 欧洲/萨格勒布 (UTC\$102:00)
+ 欧洲地区（巴黎）(UTC\$102:00)
+ 非洲/休达 (UTC\$102:00)
+ 欧洲/布拉格 (UTC\$102:00)
+ 南极洲/巨魔 (UTC\$1 02:00)
+ 非洲/哈博罗内 (UTC\$102:00)
+ 欧洲/哥本哈根 (UTC\$102:00)
+ 欧洲/维也纳 (UTC\$102:00)
+ 欧洲/地拉那 (UTC\$102:00)
+ MET (UTC\$102:00)
+ 欧洲/阿姆斯特丹 (UTC\$102:00)
+ 非洲/马普托 (UTC\$102:00)
+ 欧洲/圣马力诺 (UTC\$1 02:00)
+ 波兰 (UTC\$102:00)
+ 欧洲/安道尔 (UTC\$102:00)
+ 欧洲/奥斯陆 (UTC\$102:00)
+ 欧洲/波德戈里察 (UTC\$102:00)
+ 非洲/布琼布拉 (UTC\$102:00)
+ 大西洋/扬马延岛 (UTC\$102:00)
+ 非洲/马塞卢 (UTC\$102:00)
+ 欧洲/马德里 (UTC\$102:00)
+ 非洲/布兰太尔 (UTC\$102:00)
+ 非洲/卢萨卡 (UTC\$102:00)
+ 非洲/哈拉雷 (UTC\$102:00)
+ 非洲/喀土穆 (UTC\$102:00)
+ 非洲/约翰内斯堡 (UTC\$102:00)
+ 欧洲/贝尔格莱德 (UTC\$1 02:00)
+ 欧洲/布拉迪斯拉发 (UTC\$102:00)
+ 北极洲/朗伊尔城 (UTC\$102:00)
+ 埃及 (UTC\$102:00)
+ 欧洲/梵蒂冈 (UTC\$102:00)）
+ 欧洲/摩纳哥 (UTC\$102:00)
+ 欧洲/伦敦 (UTC\$101:00)
+ Etc/GMT-1 (UTC\$101:00)
+ 欧洲/泽西岛 (UTC\$101:00)
+ 欧洲/根西岛 (UTC\$101:00)
+ 欧洲/马恩岛 (UTC\$1 01:00)
+ 非洲/突尼斯 (UTC\$101:00)
+ 非洲/马拉博 (UTC\$101:00)
+ GB-Eire (UTC\$101:00)
+ 非洲/拉各斯 (UTC\$101:00)
+ 非洲/阿尔及尔 (UTC\$101:00)
+ GB (UTC\$101:00)
+ 葡萄牙 (UTC\$101:00)
+ 非洲/圣多美 (UTC\$1 01:00)
+ 非洲/恩贾梅纳 (UTC\$101:00)
+ 大西洋/法罗群岛 (UTC\$1 01:00)
+ 爱尔兰 (UTC\$1 01:00)
+ 大西洋/法罗群岛 (UTC\$101:00)
+ 欧洲/都柏林 (UTC\$101:00)
+ 非洲/利伯维尔 (UTC\$101:00)
+ 非洲/埃丰阿莱耶 (UTC\$1 01:00)
+ 非洲/埃丰阿莱耶 (UTC\$1 01:00)
+ 非洲/杜阿拉 (UTC\$101:00)
+ 非洲/布拉柴维尔 (UTC\$101:00)
+ 非洲/新港 (UTC\$1 01:00)
+ 大西洋/马德拉 (UTC\$101:00)
+ 欧洲/里斯本 (UTC\$101:00)
+ 大西洋/加那利 (UTC\$101:00)
+ 非洲/卡萨布兰卡 (UTC\$101:00)
+ 欧洲/贝尔法斯特 (UTC\$101:00)
+ 非洲/罗安达 (UTC\$1 01:00)
+ 非洲/金沙萨 (UTC\$101:00)
+ 非洲/班吉 (UTC\$101:00)
+ WET (UTC\$101:00)
+ 非洲/尼亚美（UTC\$1 01:00）
+ GMT (UTC\$100:00)
+ Etc/GMT-0 (UTC\$100:00)
+ 大西洋/圣海伦娜 (UTC\$1 00:00)
+ Etc/GMT\$10 (UTC\$100:00)
+ 非洲/班珠尔 (UTC\$100:00)
+ Etc/GMT (UTC\$100:00)
+ 非洲/弗里敦 (UTC\$100:00)
+ 非洲/巴马科 (UTC\$100:00)
+ 非洲/科纳克里 (UTC\$100:00)
+ 通用 (UTC\$100:00)
+ 非洲/努瓦克肖特 (UTC\$100:00)
+ UTC (UTC\$100:00)
+ Etc/通用 (UTC\$100:00)
+ 大西洋/亚速尔群岛 (UTC\$100:00)
+ 非洲/阿比让 (UTC\$100:00)
+ 非洲/阿克拉 (UTC\$100:00)
+ Etc/UCT (UTC\$100:00)
+ GMT0 (UTC\$1 00:00)
+ 祖鲁 (UTC\$1 00:00) 祖鲁 (UTC\$1 00:00)
+ 非洲/瓦加杜古 (UTC\$100:00)
+ 大西洋/雷克雅未克 (UTC\$100:00)
+ Etc/祖鲁 (UTC\$100:00)
+ 冰岛 (UTC\$100:00)
+ 非洲/洛美 (UTC\$100:00)
+ 格林威治 (UTC\$100:00)
+ 等/ GMT0 (UTC\$1 00:00)
+ 美洲/丹马港 (UTC\$1 00:00)
+ 非洲/达喀尔 (UTC\$100:00)
+ 非洲/比绍 (UTC\$100:00)
+ Etc/格林威治 (UTC\$100:00)
+ 非洲/廷巴克图 (UTC\$100:00)
+ UCT (UTC\$100:00)
+ 非洲/蒙罗维亚 (UTC\$100:00)
+ Etc/UTC (UTC\$100:00)

# 公式表达式教程


您可以按照这些教程在 Amazon IoT SiteWise中使用公式表达式。

**Topics**
+ [

## 在公式中使用字符串
](#use-strings-in-formulas)
+ [

## 筛选数据点
](#filter-data)
+ [

## 计算与条件匹配的数据点
](#count-filtered-data)
+ [

## 公式中的最新数据
](#late-data)
+ [

## 公式中的数据质量
](#data-quality)
+ [

## 未定义值、无限值和溢出值
](#undefined-values)

## 在公式中使用字符串


您可以对公式表达式中的字符串进行操作。您也可以从引用属性和测量属性的变量中输入字符串。

**重要**  
<a name="formula-output-rules"></a>公式表达式只能输出双精度值或字符串值。嵌套表达式可以输出其他数据类型，例如字符串，但整个公式的计算结果必须为数字或字符串。您可以使用 [jp 函数](expression-string-functions.md#jp-definition)将字符串转换为数字。布尔值必须为 1（真）或 0（假）。有关更多信息，请参阅 [未定义值、无限值和溢出值](#undefined-values)。

Amazon IoT SiteWise 提供了可用于对字符串进行操作的以下公式表达式功能：
+ [字符串文字](expression-literals.md#string-literal-definition)
+ [索引运算符](expression-operators.md#index-operator-definition) (`s[index]`)
+ [切片运算符](expression-operators.md#slice-operator-definition) (`s[start:end:step]`)
+ [比较函数](expression-comparison-functions.md)，您可以使用它按[字典顺序](https://en.wikipedia.org/wiki/Lexicographic_order)比较字符串
+ [字符串函数](expression-string-functions.md)，包括可以解析序列化的 JSON 对象并将字符串转换为数字的 `jp` 函数

## 筛选数据点


您可以使用 [if 函数](expression-conditional-functions.md#if-definition)筛选出不符合条件的数据点。`if` 函数计算条件并返回 `true` 和 `false` 结果的不同值。您可以使用 [无 常量](expression-constants.md#none-definition)`if` 函数的一个案例的输出，以丢弃该案例的数据点。

**筛选出与条件匹配的数据点**
+ 创建一个转换，该转换使用 `if` 函数定义一个条件，该条件检查条件是否满足，并以 `result_if_true` 或 `result_if_false` 值的形式返回 `none`。

**Example 示例：过滤掉水未沸腾的数据点**  
考虑您在其中有一个测量值的场景 `temp_c`，它提供水在机器中的温度（以摄氏度为单位）。您可以定义以下转换来过滤掉水未沸腾的数据点：  
+ 转换：`boiling_temps = if(gte(temp_c, 100), temp_c, none)` – 如果温度大于或等于 100 摄氏度，则返回温度，否则不返回任何数据点。

## 计算与条件匹配的数据点


您可以使用[比较函数](expression-comparison-functions.md)和 [求和](expression-aggregation-functions.md#sum-definition) 来计算条件为真的数据点的数量。

**计算与条件匹配的数据点**

1. 创建一个使用比较函数在另一个属性上定义筛选条件的转换。

1. 创建一个汇总满足该条件的数据点的指标。

**Example 示例：计算水沸腾的数据点数量**  
考虑您在其中有一个测量值的场景 `temp_c`，它提供水在机器中的温度（以摄氏度为单位）。您可以定义以下转换和指标属性来计算水沸腾的数据点数量：  
+ 转换：`is_boiling = gte(temp_c, 100)` – 如果温度大于或等于 100 摄氏度，则计算结果为返回 `1`，否则计算结果为返回 `0`。
+ 指标：`boiling_count = sum(is_boiling)` – 返回水沸腾的数据点数量。

## 公式中的最新数据


Amazon IoT SiteWise 支持延迟摄取最长 7 天的数据。当 Amazon IoT SiteWise 收到延迟数据时，它会重新计算过去窗口中输入延迟数据的任何指标的现有值。这些重新计算会产生数据处理费用。

**注意**  
在 Amazon IoT SiteWise 计算输入后期数据的属性时，它使用每个属性的当前公式表达式。

在 Amazon IoT SiteWise 重新计算某个指标的过去窗口后，它将替换该窗口的先前值。如果您为该指标启用了通知，则 Amazon IoT SiteWise 还会发出属性值通知。这意味着，您可以对您以前收到了通知的相同属性和时间戳收到新属性值更新通知。如果应用程序或数据湖使用属性值通知，则必须使用新值更新上一个值，以便其数据准确无误。

## 公式中的数据质量


在中 Amazon IoT SiteWise，每个数据点都有一个质量代码，可以是以下代码之一：
+ `GOOD` – 数据不受任何问题的影响。
+ `BAD` – 数据受传感器故障等问题的影响。
+ `UNCERTAIN` – 数据受传感器不准确等问题的影响。

Amazon IoT SiteWise 在计算变换和指标时仅消耗`GOOD`质量数据。 Amazon IoT SiteWise 仅输出成功计算所需的`GOOD`质量数据。如果计算不成功，则 Amazon IoT SiteWise 不会为该计算输出数据点。如果计算生成未定义值、无限值或溢出值，则会发生这种情况。

有关如何查询数据和按数据质量筛选的更多信息，请参阅[从中查询数据 Amazon IoT SiteWise](query-industrial-data.md)。

## 未定义值、无限值和溢出值


某些公式表达式（例如`x / 0``sqrt(-1)`、或`log(0)`）会计算在实数系统中未定义的值、无限值或超出所 Amazon IoT SiteWise支持的范围。当资产属性的表达式计算未定义、无限或溢出值时， Amazon IoT SiteWise 不会为该计算输出数据点。

Amazon IoT SiteWise 如果将非数值作为公式表达式的结果进行计算，也不会输出数据点。这意味着，如果您定义了一个计算字符串、数组或 [无 常量](expression-constants.md#none-definition)的公式，则 Amazon IoT SiteWise 不会为该计算输出数据点。

**Example 示例**  
以下每个公式表达式生成的值都 Amazon IoT SiteWise 不能表示为数字。 Amazon IoT SiteWise 在计算这些公式表达式时不输出数据点。  
+ `x / 0` 未定义。
+ `log(0)` 未定义。
+ `sqrt(-1)` 在实数系统中未定义。
+ `"hello" + " world"` 是一个字符串。
+ `jp('{"values":[3,6,7]}', '$.values')` 是一个数组。
+ 当 `temp` 小于 `300` 时，`if(gte(temp, 300), temp, none)` 等于 `none`。

# 创建自定义复合模型（组件）
创建自定义复合模型（组件）

自定义复合模型或组件（如果您使用的是控制台）为您的资产模型和组件模型提供了另一种组织方式。您可以使用它们，通过对属性进行分组或引用其他模型来构建模型。有关使用自定义复合模型的更多信息，请参阅[自定义复合模型（组件）](custom-composite-models.md)。

您可以在现有资产模型或组件模型中创建自定义复合模型。自定义复合模型分为两类。要对模型中的相关属性进行分组，可以创建**内联**自定义复合模型。要在资产模型或组件模型中引用组件模型，可以创建**component-model-based**自定义复合模型。

以下各节介绍如何使用 Amazon IoT SiteWise API 创建自定义复合模型。

**Topics**
+ [

## 创建内联组件（控制台）
](#create-inline-component-console)
+ [

## 创建内联自定义复合模型（Amazon CLI）
](#create-inline-composite-models-cli)
+ [

## 创建组 component-model-based件（控制台）
](#create-component-console)
+ [

## 创建 component-model-based自定义复合模型 (Amazon CLI)
](#create-component-based-composite-model-cli)

## 创建内联组件（控制台）


您可以使用 Amazon IoT SiteWise 控制台创建定义其自身属性的内联组件。

**注意**  
由于这是一个*内联*组件，因此，这些属性仅适用于当前的资产模型，不会共享到其他任何位置。  
如果您需要生成一个可重复使用的模型（例如，在多个资产模型之间共享，或者在一个资产模型中包含多个实例），则应改为基于组件模型创建一个组件。有关详细信息，请参阅下一节。

**要创建组件（控制台），请执行以下步骤：**

1. <a name="sitewise-open-console"></a>导航至 [Amazon IoT SiteWise 控制台](https://console.amazonaws.cn/iotsitewise/)。

1. <a name="sitewise-choose-models"></a>在导航窗格中，选择**模型**。

1. 选择要为其添加组件的资产模型。

1. 在**属性**选项卡上，选择**组件**。

1. 选择**创建组件**。

1. 在**创建组件**页面上，执行以下操作：

   1. 为组件输入一个**名称**，例如 **ServoMotor** 或 **ServoMotor Model**。此名称对于您账户在此区域的所有组件都必须是唯一的。

   1. （可选）为模型添加 **属性定义**。属性表示很少更改的信息。有关更多信息，请参阅 [定义静态数据（属性）](attributes.md)。

   1. （可选）为模型添加 **测量值定义**。测量值代表来自您的设备的数据流。有关更多信息，请参阅 [定义来自设备的数据流（测量值）](measurements.md)。

   1. （可选）为模型添加 **转换定义**。转换是将数据从一种表单映射到另一种表单的公式。有关更多信息，请参阅 [转换数据（转换）](transforms.md)。

   1. （可选）为模型添加 **指标定义**。指标是按时间间隔汇总数据的公式。指标可以从关联资产的指标中输入数据，这样您可以计算统计信息，从而提供对整个操作或部分操作的见解。有关更多信息，请参阅 [聚合来自属性和其他资产（指标）的数据](metrics.md)。

   1. 选择**创建组件**。

## 创建内联自定义复合模型（Amazon CLI）


您可以使用 Amazon Command Line Interface (Amazon CLI) 来创建定义其自身属性的内联自定义复合模型。

使用[CreateAssetModelCompositeModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_CreateAssetModelCompositeModel.html)操作创建具有属性的内联模型。此操作需要具有以下结构的负载。

**注意**  
由于这是一个*内联*复合组件，因此，这些属性仅适用于当前的资产模型，不会共享到其他任何位置。之所以称其为“内联”，是因为它没有为 `composedAssetModelId` 字段提供值。  
如果您需要生成可重复使用的模型（例如，在多个资产模型之间共享，或者在一个资产模型中包含多个实例），则应改为创建*component-model-based*复合模型。有关详细信息，请参阅下一节。

```
{
    "assetModelCompositeModelName": "CNCLathe_ServoMotorA",
    "assetModelCompositeModelType": "CUSTOM",
    "assetModelCompositeModelProperties": [
        {
            "dataType": "DOUBLE",
            "name": "Servo Motor Temperature",
            "type": {
            "measurement": {}
            },
            "unit": "Celsius"
        },
        {
            "dataType": "DOUBLE",
            "name": "Spindle speed",
            "type": {
            "measurement": {}
            },
            "unit": "rpm"
        }
    ]
}
```

## 创建组 component-model-based件（控制台）


您可以使用 Amazon IoT SiteWise 控制台基于组件模型创建组件。

**创建组 component-model-based件（控制台）**

1. <a name="sitewise-open-console"></a>导航至 [Amazon IoT SiteWise 控制台](https://console.amazonaws.cn/iotsitewise/)。

1. <a name="sitewise-choose-models"></a>在导航窗格中，选择**模型**。

1. 选择要为其添加组件的资产模型。

1. 在**属性**选项卡上，选择**组件**。

1. 选择**创建组件**。

1. 在**创建组件**页面上，执行以下操作：

   1. 选择要作为组件基础的组件模型。

   1. 为组件输入一个**名称**，例如 **ServoMotor** 或 **ServoMotor Model**。此名称对于您账户在此区域的所有组件都必须是唯一的。

   1. 选择**创建组件**。

## 创建 component-model-based自定义复合模型 (Amazon CLI)


您可以使用在 Amazon CLI 资产模型中创建 component-model-based自定义复合模型。 component-model-based自定义复合模型是对已在其他地方定义的组件模型的引用。

使用[CreateAssetModelCompositeModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_CreateAssetModelCompositeModel.html)操作创建 component-model-based自定义复合模型。此操作需要具有以下结构的负载。

**注意**  
在此示例中，`composedAssetModelId` 的值是现有组件模型的资产模型 ID 或外部 ID。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。有关如何创建组件模型的示例，请参阅[创建组件模型（Amazon CLI）](create-component-models.md#create-component-model-cli)。

```
{
    "assetModelCompositeModelName": "CNCLathe_ServoMotorA",
    "assetModelCompositeModelType": "CUSTOM",
    "composedAssetModelId": component model ID
]
```

由于它只是一个参考，因此 component-model-based自定义复合模型除了名称之外没有自己的属性。

如果要将同一组件的多个实例添加到资产模型中（例如，具有多个伺服电动机的数控机床），则可以添加多个 component-model-based自定义复合模型，每个模型都有自己的名称，但所有模型的引用都相同`composedAssetModelId`。

您可以将组件嵌套在其他组件中。为此，您可以向其中一个组件模型添加 component-model-based复合模型，如本示例所示。