シナリオ: 正規化されたIoTデータのモニター、コマンドの送信および電子メール・アラート
Node-REDで正規化されたOCI IoTデータをデキューし、ボイラー圧力がしきい値を超えた場合にリセット・コマンドを送信し、コマンド・ステータスをポーリングして、成功、失敗またはタイムアウトの電子メール・アラートを公開します。
このシナリオを使用して、OCI IoTによってすでに受信されているデータを監視し、条件が満たされたときにアクションを実行します。
フローは正規化されたデータをデキューし、ボイラー圧力が100を超えるとリセット・コマンドを送信し、IoTデータベースのコマンド・ステータスをポーリングします。最終結果は、通知ノードに進みます。非最終結果は5秒の遅延をループし、コマンドステータスを再度照会します。
このシナリオでは、IoTデータはすでにOCI IoT内にあるため、Flow Runtimeは、アプリケーションがIoTデータベースに直接アクセスする必要なく、軽量なイベント・プロセッサとして機能します。このパターンは、アラート、チケットの作成、ダウンストリーム通知およびその他の操作自動化に適応できます。
開始する前に、一般的なシナリオ設定を完了してください。
タスク
前提条件
- OCI通知トピックとそのOCID。
- 関連する通知およびデジタル・ツインのコマンド・インボーク・ポリシーを含むフロー・ランタイム・リソース・プリンシパル構成。
フロー・ランタイム・リソース・プリンシパルがシナリオ・トピックにメッセージを公開できるように、通知ポリシーを追加します。
Allow dynamic-group <flow-runtime-dynamic-group> to {ONS_TOPIC_PUBLISH} in compartment <notification-topic-compartment>リソース・プリンシパルがコマンドをリクエストできるように、デジタル・ツイン・コマンド・インボーク・ポリシーを追加します。
Allow dynamic-group <flow-runtime-dynamic-group> to {IOT_DIGITAL_TWIN_INSTANCE_COMMAND_INVOKE} in compartment <iot-domain-compartment> - デキュー・ノードおよびSQLノードで使用可能なIoTドメイン・データベース接続。
- 一般的なデジタル・ツイン・インスタンスの設定が完了したときに記録されるゲートウェイ外部キーおよびデバイス・パスワード。この例では、ゲートウェイの外部キーとして
fr-guide-gw-01を使用します。 - フローによってモニターされるボイラのデジタル・ツイン・インスタンスのOCIDsおよび外部キー。
- リセットの成功を検証するために、
boilers/<external-key>/command/resetでリクエストを受信し、boilers/<external-key>/command/responseでレスポンスを返すデバイス側のコマンド・ハンドラ。
ステップ1: モニタリング・フロー・ランタイムの作成
ステップ2: 監視およびコマンドNode-REDフローの構成
ステップ3: Eメール・サブスクライブの作成
ステップ4: コマンド・リクエスト・エンドポイントのサブスクライブ
ステップ5: 高ボイラー圧力メッセージの生成
ゲートウェイ外部キーをデバイス・ユーザー名として使用し、ゲートウェイ・デバイス・パスワードをパスワードとして使用します。
<domain-short-id-from-device-host>、<region>および<gateway-device-password>を環境の値に置き換えます。curl -i -X POST \ -u "fr-guide-gw-01:<gateway-device-password>" \ -H "Content-Type: application/json" \ "https://<domain-short-id-from-device-host>.device.iot.<region>.oci.oraclecloud.com/boilers/fr-guide-boiler-01" \ -d '{ "temperature": 83, "pressure": 102 }'同じゲートウェイ認証MQTT接続を使用して、次の設定で高圧ボイラー・メッセージをパブリッシュします。
フィールド 値 トピック boilers/fr-guide-boiler-01QoS 1ペイロード・型 JSON { "temperature": 83, "pressure": 102 }
ステップ6: コマンド・レスポンスを送信する
ステップ7: ポーリング・フローおよび電子メール通知の検証
セキュリティの考慮事項
フロー・ランタイム・リソース・プリンシパルを使用して、承認済通知トピックにのみ公開し、承認済デジタル・ツイン・インスタンスでのみコマンドを起動します。通知およびコマンド・ペイロードを受信者に必要な操作フィールドに制限し、IoTドメインのデータベース接続、キュー・サブスクライバおよびコマンド・レスポンス・データを保護します。
トラブルシューティング
- キュー名、サブスクライバ、JSONペイロード・タイプ、待機値、
2のバッチ・サイズおよびIoTドメイン・データベース接続を確認します。 - デバッグ・ノードを使用して、正規化されたレコードが
digitalTwinInstanceId、contentPath、valueおよびtimeObservedを公開することを確認します。 boilerExternalKeyMapに、正確なボイラー・デジタル・ツインOCIDsおよび一致するデジタル・ツイン・インスタンスの外部キーのみが含まれていることを確認します。HVAC圧力レコードは、OCIDsがマップされていないため無視されます。外部キーを検索するには、デジタル・ツインのインスタンス詳細の取得を参照するか、外部キーを変更するには、デジタル・ツイン・インスタンスの更新を参照してください。- IoT送信コマンド・ノードがリソース・プリンシパル構成を使用し、
msg.digitalTwinOcid、msg.requestEndpointおよびmsg.responseEndpointを受信し、「レスポンスの待機」が選択されていることを確認します。 - フローがコマンドを送信する前に、ゲートウェイMQTTクライアントが接続されたまま、正確なリクエスト・エンドポイントにサブスクライブしていることを確認します。アクティブなサブスクライバがない場合、コマンドは
DELIVERY_STATUSをREFUSEDに設定してただちに終了します。 - デバイス側のコマンド・ハンドラがリクエスト・エンドポイントをリスニングし、レスポンス期間が期限切れになる前にその結果をレスポンス・エンドポイントにパブリッシュすることを確認します。
- 「コマンド・ステータスの初期化ポーリング」で、最初の遅延の前に
msg.pollDeadlineおよびmsg.pollCountが設定されていることを確認します。 - SQLノードが行を返さない場合は、IoT送信コマンド・ノードの後に
msg.rawCommandDataRecordIdが存在し、recordIdバインド変数にマップされていることを確認します。期限が切れる前に、Check Command Statusの出力2から行がない状態が続く必要があります。 - 「コマンド・ステータスの確認」の出力1が「フォーマット・ボイラー・コマンド結果通知」に接続され、出力2が「ステータス・チェックの前に待機」に接続されていることを確認します。
- リセットが失敗と報告された場合は、
RAW_COMMAND_DATAのDELIVERY_STATUS、RESET_RESULTおよびTIME_FINISHEDを調べます。最終的なステータスは、COMPLETED、REJECTED、REFUSED、EXPIRED、BAD_RESPONSEおよびNOT_RESPONDEDです。 - フローで
POLL_TIMEOUTがレポートされた場合は、遅延ノードが5秒を使用し、コマンドが70秒の期限より前に最終ステータスに達していないことを確認します。 - 「通知」トピックのOCID、リソース・プリンシパル構成、メッセージの公開権限およびアクティブな電子メール・サブスクリプションを確認します。
詳細は、「IoTフロー・ランタイムのトラブルシューティング」および「フロー・ランタイムFAQ」を参照してください。
FAQ
- 電子メール・サブスクリプションがアクティブである必要があるのはなぜですか。
- OCI通知では、状態が「保留中」の間はアラートが電子メール・サブスクリプションに配信されません。フローをテストする前に、確認リンクに従ってください。
- フローが5秒ごとにコマンド・ステータスを問い合せるのはなぜですか。
- 短い遅延により、フローは完全な応答ウィンドウを待たずに、最終的なコマンドステータスを検出できます。最終以外の結果は、遅延ノードにループして戻され、再度問い合せられます。
- なぜ投票期限は70秒?
- コマンド・レスポンス期間は
PT1Mです。この追加10秒により、フローがPOLL_TIMEOUTをレポートする前に、OCI IoTで最終的なデータベース更新を適用できます。 - このフローはどのキュー・レコードを評価しますか。
- フローは、
<domain-short-id>__IOT.NORMALIZED_DATAからJSONレコードをデキューします。pressureイベントは、デジタル・ツインOCIDがboilerExternalKeyMapに存在する場合にのみ評価されるため、HVAC圧力レコードおよびマップされていないボイラー・レコードは無視されます。 - 通知によってリセットが成功したのはいつですか。
- リセットが成功するのは、
DELIVERY_STATUSがCOMPLETEDで、レスポンスJSONにreset: SUCCESSが含まれている場合のみです。その他の最終結果ではリセット失敗通知が使用され、期限内に最終結果がない場合にはタイムアウト通知が使用されます。 - コマンドが
REFUSEDで終了したのはなぜですか。 - フローがコマンドを送信したときに、ゲートウェイMQTTクライアントが接続されておらず、正確なコマンド・リクエスト・エンドポイントにアクティブにサブスクライブされていました。フローをトリガーする前に、
boilers/fr-guide-boiler-01/command/resetをサブスクライブします。 - Live-ingestionシナリオを使用してテスト・データを生成できますか。
- はい。このシナリオは、IoTデバイス・ホスト・トピック
boilers/fr-guide-boiler-01に直接公開されます。かわりにライブ・ブローカ取込みフローを実行したままにする場合は、同じペイロードをパブリック・ブローカ上のsource/boilers/fr-guide-boiler-01に公開します。