

支援終止通知：2026 年 5 月 20 日， AWS 將終止對 的支援 AWS IoT Events。2026 年 5 月 20 日之後，您將無法再存取 AWS IoT Events 主控台或 AWS IoT Events 資源。如需詳細資訊，請參閱[AWS IoT Events 終止支援](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-end-of-support.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 中建立偵測器模型 AWS IoT Events
<a name="iotevents-detector-model"></a>

在本主題中，您會使用 *狀態*定義*偵測器模型* （設備或程序的模型）。

對於每個狀態，您定義條件式 （布林值） 邏輯，評估傳入輸入以偵測重大事件。偵測到事件時，它會變更狀態並可以啟動其他動作。這些事件稱為轉換事件。

在您的狀態中，您也可以定義每當偵測器進入或退出該狀態，或收到輸入 （這些稱為 `OnEnter`、 `OnExit`和 `OnInput`事件） 時，可執行動作的事件。只有在事件的條件式邏輯評估為 時，才會執行動作`true`。

**建立偵測器模型**

1. 第一個偵測器狀態已為您建立。若要修改，請在主要編輯空間中選取帶有標籤 **State\$11** 的圓圈。

1. 在**狀態**窗格中，輸入**狀態名稱**和 **OnEnter**，選擇**新增事件**。

1. 在**新增 OnEnter 事件**頁面上，輸入**事件名稱**和**事件條件**。在此範例中，輸入 `true`表示進入 狀態時一律會啟動事件。

1. 在**事件動作**下，選擇**新增動作**。

1. 在**事件動作**下，執行下列動作：

   1. 選取**設定變數**

   1.  針對**變數操作**，選擇**指派值**。

   1. 針對**變數名稱**，輸入要設定的變數名稱。

   1. 針對**變數值**，輸入值 **0**（零）。

1. 選擇**儲存**。

   如同您定義的變數，變數可以在偵測器模型的任何事件中設定 （提供值）。只有在偵測器達到 狀態並執行定義或設定的動作之後，才能參考變數的值 （例如，在事件的條件式邏輯中）。

1. 在**狀態**窗格中，選擇**狀態**旁邊的 **X**，以返回**偵測器模型調色盤**。

1. 若要建立第二個偵測器狀態，請在**偵測器模型調色盤**中，選擇**狀態**並將其拖曳至主要編輯空間。這會建立名為 的狀態`untitled_state_1`。

1. 在第一個狀態 (**正常**) 上暫停。狀態的圓周上會出現箭頭。

1. 按一下並將箭頭從第一個狀態拖曳至第二個狀態。從第一個狀態到第二個狀態 （標記**無標題） 的**導向線隨即出現。

1. 選取**無標題**行。在**轉換事件**窗格中，輸入**事件名稱**和**事件觸發邏輯**。

1. 在**轉換事件**窗格中，選擇**新增動作**。

1. 在**新增轉換事件動作**窗格中，選擇**新增動作**。

1.  針對**選擇動作**，選擇**設定變數**。

   1. 針對**變數操作**，選擇**指派值**。

   1. 針對**變數名稱**，輸入變數的名稱。

   1. 針對**指派值**，輸入值，例如： `$variable.pressureThresholdBreached + 3`

   1. 選擇**儲存**。

1. 選取第二個狀態 **untitled\$1state\$11**。

1. 在**狀態**窗格中，輸入**狀態名稱**，然後在**輸入時**選擇**新增事件**。

1. 在**新增 OnEnter 事件**頁面上，輸入**事件名稱**和**事件條件**。選擇**新增動作**。

1. 針對**選擇動作**，選擇**傳送 SNS 訊息**。

   1. 針對 **SNS 主題**，輸入 Amazon SNS 主題的目標 ARN。

   1. 選擇**儲存**。

1. 繼續在範例中新增事件。

   1. 針對 **OnInput**，選擇**新增事件**，然後輸入並儲存下列事件資訊。

      ```
        Event name: Overpressurized
        Event condition: $input.PressureInput.sensorData.pressure > 70
        Event actions:
          Set variable:
            Variable operation: Assign value
            Variable name: pressureThresholdBreached
            Assign value: 3
      ```

   1. 針對 **OnInput**，選擇**新增事件**，然後輸入並儲存下列事件資訊。

      ```
        Event name: Pressure Okay
        Event condition: $input.PressureInput.sensorData.pressure <= 70
        Event actions:
          Set variable:
            Variable operation: Decrement
            Variable name: pressureThresholdBreached
      ```

   1. 針對 **OnExit**，選擇**新增事件**，然後使用您建立之 Amazon SNS 主題的 ARN 輸入並儲存下列事件資訊。

      ```
        Event name: Normal Pressure Restored
        Event condition: true
        Event actions:
          Send SNS message: 
            Target arn: arn:aws:sns:us-east-1:123456789012:pressureClearedAction
      ```

1. 在第二個狀態 (**危險） **``上暫停。狀態的圓周上會出現箭頭

1. 按一下並將箭頭從第二個狀態拖曳到第一個狀態。帶有標籤 **Untitled** 的導向行隨即出現。

1. 選擇**無標題**行，然後在**轉換事件**窗格中，使用下列資訊輸入**事件名稱**和**事件觸發邏輯**。

   ```
   {
     Event name: BackToNormal
     Event trigger logic: $input.PressureInput.sensorData.pressure <= 70 && $variable.pressureThresholdBreached <= 0
   }
   ```

   如需有關為什麼我們在觸發邏輯中測試 `$input` 值和 `$variable`值的詳細資訊，請參閱 中變數值可用性的項目[AWS IoT Events 偵測器模型限制](iotevents-restrictions-detector-model.md)。

1. 選取**啟動**狀態。根據預設，此狀態會在您建立偵測器模型時建立）。在**開始**窗格中，選擇**目的地狀態 **（例如，**正常**)。

1. 接著，將偵測器模型設定為接聽輸入。在右上角，選擇**發佈**。

1. 在**發佈偵測器模型**頁面上，執行下列動作。

   1.  輸入**偵測器模型名稱**、**描述**和**角色**的名稱。此角色是為您建立的。

   1. **為每個唯一的索引鍵值選擇建立偵測器**。若要建立和使用您自己的**角色**，請遵循中的步驟，[設定 的許可 AWS IoT Events](iotevents-permissions.md)並將其輸入為此處**的角色**。

1. 針對**偵測器建立金鑰**，選擇您先前定義之輸入其中一個屬性的名稱。您選擇做為偵測器建立金鑰的屬性必須存在於每個訊息輸入中，而且對於每個傳送訊息的裝置必須是唯一的。此範例使用 **motorid** 屬性。

1. 選擇 **Save and Publish (儲存並發佈)**。

**注意**  
為指定偵測器模型建立的唯一偵測器數量是根據傳送的輸入訊息。建立偵測器模型時，會從輸入屬性中選取金鑰。此金鑰決定要使用的偵測器執行個體。如果之前沒有看到金鑰 （針對此偵測器模型），則會建立新的偵測器執行個體。如果之前已看到金鑰，我們會使用與此金鑰值對應的現有偵測器執行個體。

您可以重新建立或更新偵測器模型定義的備份副本 （以 JSON 表示），或使用 作為範本來建立另一個偵測器模型。

您可以從 主控台或使用下列 CLI 命令來執行此操作。如有必要，請變更偵測器模型的名稱，以符合您在上一個步驟中發佈偵測器模型時使用的名稱。

```
aws iotevents describe-detector-model  --detector-model-name motorDetectorModel > motorDetectorModel.json 
```

這會建立具有類似以下內容之內容的檔案 (`motorDetectorModel.json`)。

```
{
    "detectorModel": {
        "detectorModelConfiguration": {
            "status": "ACTIVE", 
            "lastUpdateTime": 1552072424.212, 
            "roleArn": "arn:aws:iam::123456789012:role/IoTEventsRole", 
            "creationTime": 1552072424.212, 
            "detectorModelArn": "arn:aws:iotevents:us-west-2:123456789012:detectorModel/motorDetectorModel", 
            "key": "motorid", 
            "detectorModelName": "motorDetectorModel", 
            "detectorModelVersion": "1"
        }, 
        "detectorModelDefinition": {
            "states": [
                {
                    "onInput": {
                        "transitionEvents": [
                            {
                                "eventName": "Overpressurized", 
                                "actions": [
                                    {
                                        "setVariable": {
                                            "variableName": "pressureThresholdBreached", 
                                            "value": "$variable.pressureThresholdBreached + 3"
                                        }
                                    }
                                ], 
                                "condition": "$input.PressureInput.sensorData.pressure > 70", 
                                "nextState": "Dangerous"
                            }
                        ], 
                        "events": []
                    }, 
                    "stateName": "Normal", 
                    "onEnter": {
                        "events": [
                            {
                                "eventName": "init", 
                                "actions": [
                                    {
                                        "setVariable": {
                                            "variableName": "pressureThresholdBreached", 
                                            "value": "0"
                                        }
                                    }
                                ], 
                                "condition": "true"
                            }
                        ]
                    }, 
                    "onExit": {
                        "events": []
                    }
                }, 
                {
                    "onInput": {
                        "transitionEvents": [
                            {
                                "eventName": "Back to Normal", 
                                "actions": [], 
                                "condition": "$variable.pressureThresholdBreached <= 1 && $input.PressureInput.sensorData.pressure <= 70", 
                                "nextState": "Normal"
                            }
                        ], 
                        "events": [
                            {
                                "eventName": "Overpressurized", 
                                "actions": [
                                    {
                                        "setVariable": {
                                            "variableName": "pressureThresholdBreached", 
                                            "value": "3"
                                        }
                                    }
                                ], 
                                "condition": "$input.PressureInput.sensorData.pressure > 70"
                            }, 
                            {
                                "eventName": "Pressure Okay", 
                                "actions": [
                                    {
                                        "setVariable": {
                                            "variableName": "pressureThresholdBreached", 
                                            "value": "$variable.pressureThresholdBreached - 1"
                                        }
                                    }
                                ], 
                                "condition": "$input.PressureInput.sensorData.pressure <= 70"
                            }
                        ]
                    }, 
                    "stateName": "Dangerous", 
                    "onEnter": {
                        "events": [
                            {
                                "eventName": "Pressure Threshold Breached", 
                                "actions": [
                                    {
                                        "sns": {
                                            "targetArn": "arn:aws:sns:us-west-2:123456789012:MyIoTButtonSNSTopic"
                                        }
                                    }
                                ], 
                                "condition": "$variable.pressureThresholdBreached > 1"
                            }
                        ]
                    }, 
                    "onExit": {
                        "events": [
                            {
                                "eventName": "Normal Pressure Restored", 
                                "actions": [
                                    {
                                        "sns": {
                                            "targetArn": "arn:aws:sns:us-west-2:123456789012:IoTVirtualButtonTopic"
                                        }
                                    }
                                ], 
                                "condition": "true"
                            }
                        ]
                    }
                }
            ], 
            "initialStateName": "Normal"
        }
    }
}
```