建立偵測器模型 - AWS IoT Events

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

建立偵測器模型

在本主題中,您將使用狀態定義偵測器模型 (設備或製程的模型)。

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

在您的狀態中,您還可以定義事件,這些事件可以在檢測器進入或退出該狀態或收到輸入時(這些被稱為OnEnterOnExitOnInput事件)時運行操作。只有當事件的條件邏輯評估為時,動作才會執行true

建立偵測器模型
  1. 已為您建立第一個偵測器狀態。要修改它,請在主編輯空間中選擇帶有標籤狀態 _1 的圓。

  2. 在 [狀] 窗格中,輸入 [市/縣] 名稱 OnEnter,然後選擇 [新增事件]。

  3. 在 [新增 OnEnter 事件] 頁面上,輸入事件名稱事件條件。在此範例中,enter true 表示在輸入狀態時始終啟動事件。

  4. 事件動作下,選擇新增動作。

  5. 在「事件動作」 下,執行下列操作:

    1. 選擇設置變量

    2. 對於「變數」作業,選擇「指派值」。

    3. 變數名稱中,輸入要設定的變數名稱。

    4. 在「變數值」中,輸入值 0 (零)。

  6. 選擇儲存

    像您定義的變量一樣,可以在檢測器模型中的任何事件中設置(給定一個值)。只有在偵測器到達狀態並執行定義或設定動作之後,才能參考變數的值 (例如,在事件的條件式邏輯中)。

  7. 在 [狀] 窗格中,選擇 [狀態] 旁邊的 [X] 以返回 [偵測器] 模型調色盤

  8. 若要建立第二個偵測器狀態,請在「偵測器」模型調色盤中選擇「狀態,然後將其拖曳至主編輯空間。這會建立一個標題為的狀態untitled_state_1

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

  10. 按一下並將箭頭從第一個狀態拖曳到第二個狀態。會顯示從第一個狀態到第二個狀態 (標示為「未命名」) 的直接線。

  11. 選取「未命名」的線條。在轉換事件窗格中,輸入事件名稱事件觸發邏輯

  12. 在「轉換」事件窗格中,選擇「新增動作」。

  13. 在 [新增轉場事件動作] 窗格上,選擇 [新增動作]。

  14. 針對 [選擇動作],選擇 [設定變數]。

    1. 對於「變數」作業,選擇「指派值」。

    2. 在「變數名稱」中,輸入變數的名稱。

    3. 對於指定值,請輸入值,例如:$variable.pressureThresholdBreached + 3

    4. 選擇儲存

  15. 選取未標題為 _state_1 的第二個狀態。

  16. 在 [狀] 窗格中,輸入 [狀態] 名稱,並在 [輸入時] 選擇 [新增事件]。

  17. 在 [新增 OnEnter 事件] 頁面上,輸入事件名稱事件條件。選擇新增動作

  18. 針對 [選擇動作],選擇 [傳送 SNS 訊息]。

    1. 對於 SNS 主題,請輸入您的 Amazon SNS 主題的目標 ARN。

    2. 選擇儲存

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

    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
    2. 對於 OnInput,選擇新增事件,然後輸入並儲存下列事件資訊。

      Event name: Pressure Okay Event condition: $input.PressureInput.sensorData.pressure <= 70 Event actions: Set variable: Variable operation: Decrement Variable name: pressureThresholdBreached
    3. 對於 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
  20. 暫停在第二狀態(危險)。狀態的圓周上會出現一個箭頭

  21. 按一下並將箭頭從第二個狀態拖曳到第一個狀態。隨即出現帶有標籤「未命名」的直線。

  22. 選擇「無標題」行,然後在「轉移」事件窗格中,使用下列資訊輸入「事件名稱」和「事件觸發器」邏輯

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

    如需有關為何測試觸發器邏輯中的$input值和$variable值的詳細資訊,請參閱中的變數值可用性項目偵測器型號限制和限制

  23. 選取 [開] 狀態。默認情況下,此狀態是在您創建檢測器模型時創建的)。在「開始」窗格中,選擇「目的地」狀態 (例如,「正常」)。

  24. 接下來,配置檢測器模型以監聽輸入。在右上角,選擇「發佈」。

  25. 在 [發行偵測器模型] 頁面上,執行下列動作。

    1. 輸入偵測器型號名稱說明角色名稱。此角色是為您建立的。

    2. 選擇為每個唯一索引鍵值建立偵測器。若要建立和使用您自己的「角色」,請按照中的步驟操作,設定的權限 AWS IoT Events並在此處將其輸入為「角色」。

  26. 對於「偵測器」建立金鑰,請選擇您先前定義之輸入的其中一個屬性名稱。您選擇作為檢測器創建密鑰的屬性必須存在於每個消息輸入中,並且對於發送消息的每個設備都必須是唯一的。本範例使用 motorid 屬性。

  27. 選擇 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" } } }