

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

# 更新资产模型、组件模型和接口
<a name="update-asset-models"></a>

使用 Amazon IoT SiteWise 控制台或 API 更新资产模型、组件模型或接口。

您无法更改现有属性的类型或数据类型，或现有指标的窗口。您也无法将模型的类型从资产模型更改为组件模型或接口，或者反之亦然。

**重要**  
如果您从资产模型或组件模型中移除某个属性，则 Amazon IoT SiteWise 会删除该属性之前的所有数据。对于组件模型，这会影响**使用该组件模型的所有资产模型**，因此，请特别注意了解更改可能会应用到的范围。
如果从资产模型中移除层次结构定义，则 Amazon IoT SiteWise 取消关联该层次结构中的所有资产。

更新资产模型时，基于该模型的每个资产都会反映您对基础模型所做的任何更改。在更改传播之前，每个资产都具有 `UPDATING` 状态。您必须等待这些资产恢复到 `ACTIVE` 状态，然后才能与它们进行交互。在此期间，更新的资产模型的状态将为 `PROPAGATING`。

更新组件模型时，包含该组件模型的每个资产模型都会反映所作出的更改。如前一段所述，在对组件模型的更改完成传播之前，每个受影响的资产模型都会先处于 `UPDATING` 状态，然后在更新其关联资产时变为 `PROPAGATING` 状态。您必须等待这些资产模型恢复到 `ACTIVE` 状态，然后才能与它们进行交互。在此期间，更新后的组件模型的状态将为 `PROPAGATING`。

有关更多信息，请参阅 [资产和模型状态](asset-and-model-states.md)。

**Topics**
+ [更新资产模型、组件模型或接口（控制台）](#update-asset-model-console)
+ [更新资产模型、组件模型或接口 (Amazon CLI)](#update-asset-model-cli)

## 更新资产模型、组件模型或接口（控制台）
<a name="update-asset-model-console"></a>

您可以使用 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. 在 **编辑模型** 页面上，执行以下任何操作：
   + 在 **模型详细信息** 中，更改模型的 **名称**。
   + 更改任何 **属性定义**。您无法更改现有属性的 **数据类型**。有关更多信息，请参阅 [定义静态数据（属性）](attributes.md)。
   + 更改任何 **测量值定义**。您无法更改现有测量值的 **数据类型**。有关更多信息，请参阅 [定义来自设备的数据流（测量值）](measurements.md)。
   + 更改任何 **转换定义**。有关更多信息，请参阅 [转换数据（转换）](transforms.md)。
   + 更改任何 **指标定义**。您无法更改现有指标的 **时间间隔**。有关更多信息，请参阅 [聚合来自属性和其他资产（指标）的数据](metrics.md)。
   + （仅限资产模型）更改任何**层次结构定义**。您无法更改现有层次结构的 **层次结构模型**。有关更多信息，请参阅 [定义资产模型层次结构](define-asset-hierarchies.md)。

1. 选择 **Save**。

**注意**  
 如果自您上次打开**编辑模型**页面以来，其他用户成功更新了资产模型，则在控制台中发出的更新请求将被拒绝。控制台会提示用户**刷新****编辑模型**页面，以获取更新后的模型。您必须重新进行更新，然后重试保存。有关更多信息，请参阅[对资产模型写入进行乐观锁定](opt-locking-for-model.md)。

## 更新资产模型、组件模型或接口 (Amazon CLI)
<a name="update-asset-model-cli"></a>

使用 Amazon Command Line Interface (Amazon CLI) 更新资产模型、组件模型或接口。

使用 [UpdateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html)API 更新资产模型、组件模型或接口的名称、描述和属性。仅对于资产模型，您可以更新层次结构。对于接口，您可以更新属性和层次结构。指定以下参数：
+ `assetModelId` – 资产的 ID。这是 UUID 格式的实际 ID，或者 `externalId:myExternalId`（如果有）。有关更多信息，请参阅《Amazon IoT SiteWise 用户指南》**中的 [使用外部引用对象 IDs](object-ids.md#external-id-references)。

指定有效载荷中更新的模型。要了解资产模型或组件模型的预期格式，请参阅[在中创建资产模型 Amazon IoT SiteWise](create-asset-models.md)。

**警告**  
[UpdateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html)API 会使用您在有效载荷中提供的模型覆盖现有模型。为避免删除模型的属性或层次结构，您必须在更新的模型负载中包含它们的 IDs 和定义。要了解如何查询模型的现有结构，请参阅[DescribeAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_DescribeAssetModel.html)操作。

**注意**  
通过以下过程只能更新 `AWS/ALARM` 类型的复合模型。如果要更新`CUSTOM`复合模型，请[UpdateAssetModelCompositeModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_UpdateAssetModelCompositeModel.html)改用。有关更多信息，请参阅 [更新自定义复合模型（组件）](update-custom-composite-models.md)。

**要更新资产模型或组件模型（Amazon CLI），请执行以下步骤：**

1. 运行以下命令以检索现有模型定义。*asset-model-id*替换为要更新的资产模型或组件模型的 ID 或外部 ID。

   ```
   aws iotsitewise describe-asset-model --asset-model-id asset-model-id
   ```

   上面的命令会返回与模型的最新版本相对应的模型定义。

    对于资产模型处于 `FAILED` 状态的用例，请检索与其活动版本相对应的有效模型定义，以构建您的更新请求。有关详细信息，请参阅 [资产模型版本](model-active-version.md)。运行以下命令以检索活动模型定义：

   ```
   aws iotsitewise describe-asset-model --asset-model-id asset-model-id --asset-model-version ACTIVE 
   ```

   此操作将返回包含模型详细信息的响应。该响应具有以下结构。

   ```
   {
       "assetModelId": "String",
       "assetModelArn": "String",
       "assetModelName": "String",
       "assetModelDescription": "String",
       "assetModelProperties": Array of AssetModelProperty,
       "assetModelHierarchies": Array of AssetModelHierarchyDefinition,
       "assetModelCompositeModels": Array of AssetModelCompositeModel,
       "assetModelCompositeModelSummaries": Array of AssetModelCompositeModelSummary,
       "assetModelCreationDate": "String",
       "assetModelLastUpdateDate": "String",
       "assetModelStatus": {
         "state": "String",
         "error": {
           "code": "String",
           "message": "String"
         },
       "assetModelType": "String"
       },
       "assetModelVersion": "String",
       "eTag": "String"
   }
   ```

   有关更多信息，请参阅 [DescribeAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_DescribeAssetModel.html) 操作。

1. 创建一个名为 `update-asset-model.json` 的文件，并将上一命令的响应复制到该文件中。

1. 从 `update-asset-model.json` 中的 JSON 对象中删除以下键/值对：
   + `assetModelId`
   + `assetModelArn`
   + `assetModelCompositeModelSummaries`
   + `assetModelCreationDate`
   + `assetModelLastUpdateDate`
   + `assetModelStatus`
   + `assetModelType`
   + `assetModelVersion`
   + `eTag`

   该[UpdateAssetModel](https://docs.amazonaws.cn/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html)操作需要具有以下结构的有效负载：

   ```
   {
     "assetModelName": "String",
     "assetModelDescription": "String",
     "assetModelProperties": Array of AssetModelProperty,
     "assetModelHierarchies": Array of AssetModelHierarchyDefinition,
     "assetModelCompositeModels": Array of AssetModelCompositeModel
   }
   ```

1. 在 `update-asset-model.json` 中，执行以下任何操作：
   + 更改资产模型的名称 (`assetModelName`)。
   + 更改、添加或删除资产模型的描述 (`assetModelDescription`)。
   + 更改、添加或删除资产模型的任何属性 (`assetModelProperties`)。您无法更改现有属性的 `dataType` 或现有指标的 `window`。有关更多信息，请参阅 [定义数据属性](asset-properties.md)。
   + 更改、添加或删除资产模型的任何层次结构 (`assetModelHierarchies`)。您无法更改现有层次结构的 `childAssetModelId`。有关更多信息，请参阅 [定义资产模型层次结构](define-asset-hierarchies.md)。

1. 运行以下命令，使用存储在 `update-asset-model.json` 中的定义更新资产模型。*asset-model-id*替换为资产模型的 ID：

   ```
   aws iotsitewise update-asset-model \
     --asset-model-id asset-model-id \
     --cli-input-json file://model-payload.json
   ```

**重要**  
 当多个用户同时更新一个资产模型时，一个用户所作的更改可能会无意中被另一个用户覆盖。为防止出现这种情况，您必须定义一个有条件的更新请求。请参阅[对资产模型写入进行乐观锁定](opt-locking-for-model.md)。