次の方法で共有


チュートリアル:エンド ツー エンドのソリューションを構築する

この Azure Digital Twins のチュートリアルでは、サービスの機能を示すエンド ツー エンドのソリューションを構築する方法について説明します。 Azure Digital Twins インスタンスは、環境のライブ データによって駆動される完全なエンド ツー エンドのソリューションを設定するために、デバイスとデータの管理を目的とした他の Azure サービスに接続することができます。

このチュートリアルでは次のことを行います。

  • Azure Digital Twins インスタンスを設定する
  • サンプル ビルディング シナリオを把握し、事前に作成されたコンポーネントをインスタンス化する
  • Azure Functions アプリを使用して、IoT Hub デバイスから、シミュレートしたテレメトリをデジタル ツインのプロパティにルーティングする
  • Azure Functions、エンドポイント、ルートを使用してデジタル ツインの通知を処理することにより、ツイン グラフ全体に変更を反映させる

前提条件

このチュートリアルを開始する前に、次の前提条件から始めてください。

  • Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • このチュートリアルでは、.NET を使用します。 「.NET のダウンロード」から、複数のプラットフォームに対応する最新バージョンの .NET SDK をダウンロードできます。

次に、このセクションの残りの部分を続行して、残りの前提条件を設定します。

サンプル リソースを入手する

このチュートリアルは、C# で記述された Azure Digital Twins のエンドツーエンドのサンプル プロジェクトを使用して進められます。 サンプルのリンクに移動し、タイトルの下にある " [Browse Code](コードの参照) " ボタンを選択して、お使いのマシン上でサンプル プロジェクトを取得します。

これにより、サンプル用の GitHub リポジトリに移動します。[Code](コード) ボタンと、[Download ZIP](ZIP のダウンロード) を選択することによって、.zip 形式でこれをダウンロードできます。

zip としてダウンロードする手順を強調表示した GitHub のデジタル ツインのサンプル リポジトリを示すスクリーンショット。

これにより、.zip フォルダーが digital-twins-samples-main.zip としてお使いのマシンにダウンロードされます。 フォルダーを解凍し、ファイルを抽出します。

Azure Digital Twins インスタンスを準備する

この記事で Azure Digital Twins を操作するには、まず Azure Digital Twins インスタンスとそれを使用するために必要なアクセス許可が必要です。 Azure Digital Twins インスタンスが既に設定されている場合は、そのインスタンスを使用し、次のセクションに進むことができます。 それ以外の場合は、「インスタンスと認証を設定する」の手順に従います。 手順には、各ステップを正常に完了したことを確認するために役立つ情報が含まれています。

インスタンスの設定後、インスタンスのホスト名を書き留めておきます。 ホスト名は Azure portal で確認できます。

Azure CLI の環境を準備する

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

CLI セッションを設定する

CLI で Azure Digital Twins の使用を開始するには、まずログインし、このセッションのサブスクリプションに CLI コンテキストを設定します。 CLI ウィンドウでこれらのコマンドを実行します。

az login
az account set --subscription "<your-Azure-subscription-ID>"

ヒント

上記のコマンドでは、ID の代わりにサブスクリプション名も使用できます。

このサブスクリプションを Azure Digital Twins で初めて使用する場合は、次のコマンドを実行して Azure Digital Twins の名前空間に登録します (それが不明な場合は、以前に実行していたとしても、もう一度実行して問題ありません)。

az provider register --namespace 'Microsoft.DigitalTwins'

次に、Azure CLI に Microsoft Azure IoT 拡張機能を追加して、Azure Digital Twins およびその他の IoT サービスと対話するためのコマンドを有効にします。 このコマンドを実行して、最新バージョンの拡張機能がインストールされていることを確認します。

az extension add --upgrade --name azure-iot

これで、Azure CLI で Azure Digital Twins を使用する準備が整いました。

このことは、az dt --help を実行し、使用できる最上位の Azure Digital Twins コマンドの一覧を表示することで、いつでも確認できます。

サンプル プロジェクトを構成する

次に、Azure Digital Twins インスタンスとやり取りするサンプル クライアント アプリケーションを設定します。

マシン上で、以前に Azure Digital Twins のエンドツーエンド サンプルからダウンロードしたフォルダーに移動します (まだの場合は解凍します)。

そのフォルダー内の digital-twins-samples-main\AdtSampleApp\SampleClientApp に移動し、appsettings.json ファイルを開きます。 この JSON ファイルには、プロジェクトを実行するために必要な構成変数が含まれています。

ファイルの本体で、instanceUrl を Azure Digital Twins インスタンスのホスト名 URL に変更します (以下に示すように、ホスト名の前に https:// を追加します)。

{
  "instanceUrl": "https://<your-Azure-Digital-Twins-instance-host-name>"
}

ファイルを保存して閉じます。

ローカルの Azure 資格情報を設定する

このサンプルでは、ローカル コンピューターで実行された Azure Digital Twins インスタンスに対し、(Azure.Identity ライブラリの) DefaultAzureCredential を使用してユーザーを認証します。 Azure Digital Twins に対してクライアント アプリの認証を行う各種の方法について詳しくは、「アプリ認証コードを作成する」を参照してください。

このサンプルでは、DefaultAzureCredential を使用して、ローカル環境から資格情報が検索されます。たとえば、ローカルの DefaultAzureCredential や Visual Studio または Visual Studio Code での Azure サインインなどです。 このため、サンプルの資格情報を設定するために、これらのメカニズムのいずれかを使用して、Azure にローカルでサインインする必要があります。

Visual Studio または Visual Studio Code を使用してコード サンプルを実行する場合は、Azure Digital Twins インスタンスへのアクセスに使用する Azure 資格情報でそのエディターにサインインしていることを確認してください。 ローカル CLI ウィンドウを使用している場合は、az login コマンドを実行して Azure アカウントにサインインします。 その後、コード サンプルを実行すれば、自動的に認証処理が行われます。

ビルディングのシナリオの概要

このチュートリアルで使用するサンプル プロジェクトは、フロア、部屋、サーモスタット デバイスを含んだ実世界のビルディングのシナリオを表しています。 Azure Digital Twins インスタンスでは、これらのコンポーネントがデジタルで表現されます。ここでは、データの移動を可能にするために、Azure Digital Twins インスタンスを、IoT HubEvent Grid、そして 2 つの Azure Functions に接続しています。

次の図は、このシナリオ全体を表したものです。

最初に、Azure Digital Twins インスタンス (ダイアグラム内のセクション A) を作成し、次にデジタル ツインの中にデバイス テレメトリ データ フロー (矢印 B) を設定して、次にツイン グラフを介したデータ伝達 (矢印 C) を設定します。

さまざまな Azure サービスを介してデバイスと Azure Digital Twins の間を流れるデータが示された完全なビルディング シナリオの図。

このシナリオに取り組むためには、先ほどダウンロードしておいた、あらかじめ作成されたサンプル アプリのコンポーネントとやり取りする必要があります。

ビルディング シナリオの AdtSampleApp サンプル アプリに実装されているコンポーネントは次のとおりです。

  • デバイスの認証
  • .NET (C#) SDK の使用例 (CommandLoop.cs 内で確認可能)
  • Azure Digital Twins API を呼び出すためのコンソール インターフェイス
  • SampleClientApp - サンプル Azure Digital Twins ソリューション
  • SampleFunctionsApp - IoT Hub および Azure Digital Twins のイベントからのデバイス テレメトリに基づいて、Azure Digital Twins グラフを更新する Azure Functions アプリ

事前に作成されたツイン グラフをインスタンス化する

まず、サンプル プロジェクトの AdtSampleApp ソリューションを使用して、エンド ツー エンド シナリオの Azure Digital Twins 部分 (セクション A) を構築します。

Azure Digital Twins インスタンス セクションが強調表示された、完全なビルディング シナリオからの抜粋図。

ローカル環境でコンソール ウィンドウを開き、digital-twins-samples-main\AdtSampleApp\SampleClientApp フォルダーに移動します。 次の dotnet コマンドを使用して SampleClientApp プロジェクトを実行します。

dotnet run

プロジェクトが開始されて認証が実行され、コマンドの待機状態となります。 このコンソールで、次のコマンドを実行して、サンプル Azure Digital Twins ソリューションをインスタンス化します。

重要

Azure Digital Twins インスタンスに既にデジタル ツインとリレーションシップが存在する場合、このコマンドを実行すると、それらは削除されて、サンプル シナリオのツインおよびリレーションシップに置き換えられます。

SetupBuildingScenario

このコマンドでは、Azure Digital Twins インスタンスで 3 つのデジタル ツイン (floor1 という名前のフロア、room21 という名前の部屋、thermostat67 という名前の温度センサー) が作成され、接続された際に一連の確認メッセージが出力されます。 これらのデジタル ツインは、実世界の環境に存在するであろうエンティティを表します。

それらがリレーションシップを介して接続され、以下のツイン グラフが形成されます。 ツイン グラフは、エンティティの相互作用や相互関係を含め、環境を全体として表します。

floor1 に room21 が含まれ、room21 に thermostat67 が含まれていることが示された図。

作成されたツインは、次のコマンドを実行し、接続されている Azure Digital Twins インスタンスに、そこに含まれるすべてのデジタル ツインを照会することで確認できます。

Query

プロジェクトの実行はもう停止してかまいません。 チュートリアルの後半でこのアプリをもう一度使用するので、コンソール ウィンドウはこの場所で開いたままにします。

サンプル関数アプリを設定する

次に、このチュートリアル全体を通してデータを処理する目的で使用される Azure Functions アプリを設定します。 この関数アプリ (SampleFunctionsApp) には、次の 2 つの関数が含まれています。

  • ProcessHubToDTEvents: 受信した IoT Hub データを処理し、それに応じて Azure Digital Twins を更新します。
  • ProcessDTRoutedData: デジタル ツインからのデータを処理し、それに応じて Azure Digital Twins 内の親ツインを更新します。

このセクションでは、事前に作成された関数アプリを公開し、関数アプリが Microsoft Entra ID を割り当てることで Azure Digital Twins にアクセスできることを確認します。

この関数アプリは、ダウンロードしたサンプル プロジェクトの一部であり、digital-twins-samples-main\AdtSampleApp\SampleFunctionsApp フォルダーにあります。

アプリの発行

関数アプリを Azure に発行するには、ストレージ アカウントを作成し、次に Azure に関数アプリを作成し、最後に関数を Azure 関数アプリに発行する必要があります。 このセクションでは、Azure CLI を使用してこれらのアクションを完了します。 各コマンドで、山かっこ内のすべてのプレースホルダーを独自のリソースの詳細に置き換えます。

  1. 次のコマンドを使用して、Azure ストレージ アカウントを作成します。

    az storage account create --name <name-for-new-storage-account> --location <location> --resource-group <resource-group> --sku Standard_LRS
    
  2. 次のコマンドを実行して Azure 関数アプリを作成します。

    az functionapp create --name <name-for-new-function-app> --storage-account <name-of-storage-account-from-previous-step> --functions-version 4 --consumption-plan-location <location> --runtime dotnet-isolated --resource-group <resource-group>
    
  3. 次に、関数を zip で圧縮し、新しい Azure 関数アプリに発行します。

    1. マシン上でコンソール ウィンドウを開き (ローカルの Azure CLI を使用している場合は、同じウィンドウでもかまいません)、ダウンロードしたサンプル プロジェクト内の digital-twins-samples-main\AdtSampleApp\SampleFunctionsApp フォルダーの中に移動します。

    2. コンソールで次のコマンドを実行し、プロジェクトをローカルで発行します。

      dotnet publish -c Release -o publish
      

      このコマンドで、プロジェクトを digital-twins-samples-main\AdtSampleApp\SampleFunctionsApp\publish ディレクトリに発行します。

    3. 任意の方法で、digital-twins-samples-main\AdtSampleApp\SampleFunctionsApp\publish ディレクトリの内部にある、発行されたファイルの zip を作成します。 zip に圧縮したフォルダーに publish.zip と名前を付けます。

      重要

      その zip 形式のフォルダーに、publish フォルダー自体の追加レイヤーが含まれていないことを確認します。 含まれている必要があるのは、publish フォルダー内にあった内容のみです。

      zip の内容がどうなっているかを示す画像を次に示します (.NET のバージョンに応じて変わる可能性があります)。

      publish.zip フォルダーの内容を示す、Windows のエクスプローラーのスクリーンショット。

    最後の手順は、Azure CLI で行います。

  4. Azure CLI で次のコマンドを実行し、発行され zip で圧縮された関数を Azure 関数アプリにデプロイします。

    az functionapp deployment source config-zip --resource-group <resource-group> --name <name-of-your-function-app> --src "<full-path-to-publish.zip>"
    

    ヒント

    Azure CLI をローカルで使用している場合、お使いのマシン上でパスを使用して、コンピューター上の ZIP ファイルに直接アクセスできます。

    Azure Cloud Shell を使用している場合は、コマンドを実行する前に、このボタンを使用して ZIP ファイルを Cloud Shell にアップロードします。

    ファイルをアップロードする方法が強調表示された Azure Cloud Shell のスクリーンショット。

    この場合、ファイルは Cloud Shell ストレージのルート ディレクトリにアップロードされるので、コマンドの --src パラメーターにファイル名を指定して (--src publish.zip のように) 直接参照することができます。

    デプロイが成功すると、状態コード 202 で応答され、新しい関数の詳細を含む JSON オブジェクトが出力されます。 結果にこのフィールドがあることで、デプロイの成功を確認できます。

    "provisioningState": "Succeeded",
    

これで、関数は Azure の関数アプリに発行されます。 次の CLI コマンドを使用して、両方の関数が正常に発行されたことを確認できます。 各コマンドには、リソース グループおよび関数アプリの名前に対するプレースホルダーがあります。 このコマンドは、発行された ProcessDTRoutedDataProcessHubToDTEvents の各関数に関する情報を出力します。

az functionapp function show --resource-group <your-resource-group> --name <your-function-app> --function-name ProcessDTRoutedData
az functionapp function show --resource-group <your-resource-group> --name <your-function-app> --function-name ProcessHubToDTEvents

次に、関数アプリに Azure Digital Twins インスタンスへの適切なアクセス許可を与える必要があります。 このアクセスを次のセクションで構成します。

関数アプリのアクセス許可を構成する

関数アプリが Azure Digital Twins インスタンスにアクセスするには、2 つの設定を行う必要があります。どちらも、Azure CLI を使用して実行できます。

アクセス ロールの割り当て

最初の設定によって、関数アプリに Azure Digital Twins インスタンスの Azure Digital Twins データ所有者ロールが付与されます。 このロールは、インスタンスに対して多くのデータ プレーン アクティビティを実行するすべてのユーザーまたは関数に必要です。 セキュリティとロールの割り当てについては、「Azure Digital Twins ソリューションのセキュリティ」を参照してください。

  1. 次のコマンドを使って、関数のシステム割り当て ID を作成します。 出力には、作成された ID の詳細が表示されます。 次の手順で使用するために、出力の principalId フィールドを書き留めておきます。

    az functionapp identity assign --resource-group <your-resource-group> --name <your-function-app-name>
    
  2. principalId 値を次のコマンドで使用して、関数アプリの ID を Azure Digital Twins インスタンスの Azure Digital Twins Data Owner (Azure Digital Twins データ所有者) ロールに割り当てます。

    az dt role-assignment create --resource-group <your-resource-group> --dt-name <your-Azure-Digital-Twins-instance> --assignee "<principal-ID>" --role "Azure Digital Twins Data Owner"
    

このコマンドを実行すると、作成したロールの割り当てに関する情報が出力されます。 これで関数アプリに、Azure Digital Twins インスタンスのデータへのアクセス許可が付与されました。

アプリケーションの設定を構成する

2 番目の設定では、Azure Digital Twins インスタンスの URL を使用して、関数の環境変数を作成します。 関数コードでは、この変数の値を使用してインスタンスを参照します。 環境変数の詳細については、「お使いの関数アプリの管理」を参照してください。

次のコマンドを実行して、プレースホルダーにリソースの詳細を設定します。

az functionapp config appsettings set --resource-group <your-resource-group> --name <your-function-app-name> --settings "ADT_SERVICE_URL=https://<your-Azure-Digital-Twins-instance-host-name>"

出力は、Azure 関数の設定の一覧です。ここには、ADT_SERVICE_URL というエントリが含まれているはずです。

IoT Hub デバイスからのシミュレートされたテレメトリを処理する

Azure Digital Twins グラフは、実デバイスからのテレメトリによって駆動するように作られています。

このステップでは、IoT Hub に登録されたサーモスタットのシミュレーション デバイスを、Azure Digital Twins におけるサーモスタット デバイスを表すデジタル ツインに接続します。 シミュレートされたデバイスがテレメトリを出力すると、そのデータが Azure 関数 (ProcessHubToDTEvents) に誘導され、そこでデジタル ツインへの対応する更新がトリガーされます。 こうして、デジタル ツインが、実デバイスのデータとの間で常に最新の状態に保たれます。 Azure Digital Twins では、イベント データを別の場所に誘導するプロセスがイベントのルーティングと呼ばれます。

シミュレートされたテレメトリの処理が行われるのは、エンド ツー エンド シナリオのこちらの部分 (矢印 B) です。

Azure Digital Twins の前の要素を示すセクションが強調表示された、完全なビルディング シナリオ図からの抜粋の図。

このデバイス接続を設定するためには、こちらの操作を行う必要があります。

  1. シミュレートされたデバイスを管理する IoT ハブを作成します。
  2. イベント サブスクリプションを設定して IoT ハブを適切な Azure 関数に接続します。
  3. シミュレートされたデバイスを IoT ハブに登録します。
  4. シミュレートされたデバイスを実行してテレメトリを生成します。
  5. Azure Digital Twins にクエリを実行して結果をライブで確認します。

IoT Hub インスタンスを作成する

Azure Digital Twins は、デバイスとそのデータを管理するための Azure サービス、IoT Hub と連携するように設計されています。 このステップでは、このチュートリアルのサンプル デバイスを管理する IoT ハブを設定します。

Azure CLI で、次のコマンドを使用して新しい IoT ハブを作成します。

az iot hub create --name <name-for-your-IoT-hub> --resource-group <your-resource-group> --sku S1

このコマンドからは、作成された IoT ハブについての情報が出力されます。

IoT ハブに付けた名前は保存しておいてください。 これは後で使用します。

IoT ハブを Azure 関数に接続する

次に、先ほど発行した関数アプリの Azure 関数 ProcessHubToDTEvents に IoT ハブを接続します。これで、IoT Hub 内のデバイスから関数へとデータが流れることができ、関数によって Azure Digital Twins が更新されます。

そのためには、Azure 関数をエンドポイントとする "イベント サブスクリプション" を IoT Hub に作成します。 これで、IoT Hub 内で発生したイベントを関数が "サブスクライブ" するようになります。

次の CLI コマンドを使用してイベント サブスクリプションを作成します。 イベント サブスクリプションの名前を入力するためのプレースホルダーだけでなく、サブスクリプション ID、リソース グループ、IoT ハブ名、関数アプリの名前を入力するためのプレースホルダーもあります。

az eventgrid event-subscription create --name <name-for-hub-event-subscription> --event-delivery-schema eventgridschema --source-resource-id /subscriptions/<your-subscription-ID>/resourceGroups/<your-resource-group>/providers/Microsoft.Devices/IotHubs/<your-IoT-hub> --included-event-types Microsoft.Devices.DeviceTelemetry --endpoint-type azurefunction --endpoint /subscriptions/<your-subscription-ID>/resourceGroups/<your-resource-group>/providers/Microsoft.Web/sites/<your-function-app>/functions/ProcessHubToDTEvents

出力には、作成されたイベント サブスクリプションに関する情報が表示されます。 結果の provisioningState 値を確認することで、操作が正常に完了したことを確認できます。

"provisioningState": "Succeeded",

ヒント

コマンドからリソース プロバイダー エラーが返された場合は、サブスクリプションのリソース プロバイダーとして "Microsoft EventGrid" を追加します。 これは、Azure portal でリソース プロバイダーの登録に関するページの手順に従って行うことができます。

シミュレートされたデバイスを IoT Hub に登録する

このセクションでは、IoT Hub におけるデバイスの表現を thermostat67 という ID で作成します。 シミュレートされたデバイスは、この表現に接続されます。このようにして、テレメトリ イベントはデバイスから IoT Hub に送信されます。 IoT ハブは、前の手順でサブスクライブされた Azure 関数がリッスンする場所です。イベントを選択して、処理を続ける準備ができています。

Azure CLI で、IoT Hub にデバイスを作成するには、次のコマンドを使用します。

az iot hub device-identity create --device-id thermostat67 --hub-name <your-IoT-hub-name> --resource-group <your-resource-group>

作成されたデバイスについての情報が出力されます。

シミュレーションを構成して実行する

重要

この記事では、Shared Access Signature (対称キー認証とも呼ばれます) を使用してデバイスを接続する手順について説明します。 この認証方法はテストと評価には便利ですが、X.509 証明書を使用してデバイスを認証する方が安全です。 詳細については、セキュリティのベスト プラクティス > 接続のセキュリティに関するページをご覧ください。

次に、作成した IoT Hub インスタンスにデータを送信するようにデバイス シミュレーターを構成します。

まず、次のコマンドを使って IoT ハブの接続文字列を取得します。 接続文字列の値は HostName= で始まります。

az iot hub connection-string show --hub-name <your-IoT-hub-name>

次に、"デバイスの接続文字列" を次のコマンドで取得します。

az iot hub device-identity connection-string show --device-id thermostat67 --hub-name <your-IoT-hub-name>

次に、ローカル プロジェクトでこれらの値をデバイス シミュレーターのコードに挿入し、この IoT ハブと IoT ハブ デバイスにシミュレーターを接続します。

ローカル マシン上でダウンロードしたサンプル フォルダーに移動し、digital-twins-samples-main\DeviceSimulator\DeviceSimulator フォルダーに移動します。 AzureIoTHub.cs ファイルを編集用に開きます。 次の接続文字列の値は、先ほど収集した値に置き換えてください。

private const string iotHubConnectionString = "<your-hub-connection-string>";
//...
private const string deviceConnectionString = "<your-device-connection-string>";

ファイルを保存します。

ここで、設定したデータ シミュレーションの結果を確認するには、新しいローカル コンソール ウィンドウを開き、digital-twins-samples-main\DeviceSimulator\DeviceSimulator に移動します。

Note

ここで、2 つのコンソール ウィンドウが開いています。1 つは DeviceSimulator\DeviceSimulator フォルダーを開いており、もう 1 つはまだ AdtSampleApp\SampleClientApp フォルダーを開いています。

次の dotnet コマンドを使用して、デバイス シミュレーター プロジェクトを実行します。

dotnet run

プロジェクトの実行が開始され、シミュレートされた温度テレメトリ メッセージの表示が開始されます。 これらのメッセージは IoT Hub に送信され、そこで Azure 関数によって収集されて処理されます。

送信中の温度テレメトリが示されたデバイス シミュレーターのコンソール出力のスクリーンショット。

このコンソールで行うべき作業は他にありませんが、次のステップに取り組む間、コンソールは実行したままにしておいてください。

Azure Digital Twins で結果を確認する

先ほど発行した ProcessHubToDTEvents 関数は、IoT Hub データをリッスンし、Azure Digital Twins API を呼び出して、thermostat67 ツインの Temperature プロパティを更新します。

Azure Digital Twins 側のデータを表示するには、AdtSampleApp\SampleClientApp フォルダーを開いている他のコンソール ウィンドウに切り替えます。 dotnet run を使用して SampleClientApp プロジェクトを実行します。

dotnet run

プロジェクトが実行され、コマンドを受け入れたら、次のコマンドを実行して、デジタル ツイン thermostat67 からレポートされる温度を取得します。

ObserveProperties thermostat67 Temperature

"Azure Digital Twins インスタンスから" のライブ更新された温度が 2 秒ごとにコンソールにログされていることを確認できます。 これらは、データ シミュレーターが生成している値を反映しています (コンソール ウィンドウを横に並べて配置して、値が連携されていることを確認できます)。

Note

デバイスからのデータがツインに伝達されるまでに数秒かかることがあります。 最初のいくつかの温度の測定値は、データが到着し始めるまで 0 と表示される場合があります。

デジタル ツイン thermostat67 からの温度メッセージのログが表示されたコンソール出力のスクリーンショット。

ライブの温度ログが正しく動作していることを確認したら、どちらのプロジェクトも実行を停止してかまいません。 コンソール ウィンドウは、チュートリアルの後半でもう一度使用するので、開いたままにしておきます。

Azure Digital Twins のイベントをグラフ全体に反映させる

このチュートリアルではこれまで、外部のデバイス データから Azure Digital Twins を更新する方法を見てきました。 今度は、ある 1 つのデジタル ツインから Azure Digital Twins グラフ全体に変更を反映させる方法、つまり、サービス内部のデータからツインを更新する方法について見ていきます。

そのために、ここでは ProcessDTRoutedData という Azure 関数を使用して、Thermostat ツインが更新されたときに、接続された Room ツインを更新します。 更新機能が行われるのは、エンド ツー エンド シナリオのこちらの部分 (矢印 C) です。

Azure Digital Twins の後の要素を示すセクションが強調表示された、完全なビルディング シナリオ図からの抜粋図。

このデータ フローを設定するためには、こちらの操作を行う必要があります。

  1. Event Grid トピックを作成する。これにより、Azure サービス間でデータを移動できるようにします
  2. Azure Digital Twins にエンドポイントを 作成する。これは、インスタンスを Event Grid トピックに接続するためのものです
  3. Azure Digital Twins 内にルートを設定する。これで、エンドポイントにツインのプロパティ変更イベントを送信します
  4. Azure 関数を設定する。これで、エンドポイントで Event Grid トピックをリッスンし、そこに送信されるツイン プロパティ変更イベントを受信し、グラフ内の他のツインを適宜更新します

Event Grid トピックを作成する

Event Grid は、Azure サービスからのイベントを Azure 内の別の場所にルーティングして配信できる Azure サービスです。 Event Grid トピックを作成すると、特定のイベントをソースから収集することができ、また、サブスクライバーは、トピックをリッスンすることで、配信されたイベントを受信することができます。

Event Grid トピックを作成するには、Azure CLI から次のコマンドを実行します。

az eventgrid topic create --resource-group <your-resource-group> --name <name-for-your-event-grid-topic> --location <region>

このコマンドからは、作成した Event Grid トピックについての情報が出力されます。 後で使用するため、Event Grid トピックに指定した名前を保存します。

エンドポイントを作成する

次に、Azure Digital Twins に Event Grid エンドポイントを作成します。これにより、インスタンスが Event Grid トピックに接続されます。 下のコマンドを使用して、前の手順の Event Grid トピックの名前と、必要に応じてその他のプレースホルダー フィールドを入力します。

az dt endpoint create eventgrid --dt-name <Azure-Digital-Twins-instance> --eventgrid-resource-group <your-resource-group> --eventgrid-topic <your-event-grid-topic> --endpoint-name <name-for-your-Azure-Digital-Twins-endpoint>

このコマンドからは、作成したエンドポイントについての情報が出力されます。

出力から provisioningState フィールドを見つけ、その値が "Succeeded" になっていることを確認します。

provisioningState が Succeeded のエンドポイントが示された、Azure portal の Cloud Shell におけるエンドポイント クエリ結果のスクリーンショット。

また、エンドポイントがまだ作成されているという意味で、"Provisioning" と表示される場合もあります。 その場合は、数秒待ってから、次のコマンドを実行してエンドポイントの状態を確認します。 provisioningStateが "Succeeded" と表示されるまで繰り返します。

az dt endpoint show --dt-name <your-Azure-Digital-Twins-instance> --endpoint-name <your-Azure-Digital-Twins-endpoint> 

後で使用するため、エンドポイントの名前を保存します。

ルートを作成する

次に、作成した Event Grid エンドポイントにイベントを送信する Azure Digital Twins ルートを作成します。

次の CLI コマンドを使用して、前の手順のエンドポイントの名前と、必要に応じてその他のプレースホルダー フィールドを入力します。 このコマンドを実行すると、ツイン グラフで発生するすべてのイベントが転送されます。

ヒント

フィルターを使用すると、必要に応じてイベントを特定のもののみに制限できます。

az dt route create --dt-name <your-Azure-Digital-Twins-instance> --endpoint-name <your-Azure-Digital-Twins-endpoint> --route-name <name-for-your-Azure-Digital-Twins-route>

このコマンドからは、作成したルートについての情報が出力されます。

Note

エンドポイント (前の手順のもの) は、それらを使用するイベント ルートをセットアップする前に、プロビジョニングを完了している必要があります。 エンドポイントの準備ができていないためにルートの作成が失敗する場合は、数分待ってからやり直してください。

Azure 関数を接続する

次に、先ほど作成した Event Grid トピックに Azure 関数 ProcessDTRoutedData をサブスクライブします。そうすることで、テレメトリ データは thermostat67 ツインから Event Grid トピックを介して関数へと流れることができ、関数が再び Azure Digital Twins に作用して room21 ツインを適宜更新します。

これを行うには、先ほど作成した Event Grid トピックから Azure 関数 ProcessDTRoutedData にデータを送信する Event Grid サブスクリプションを作成します。

次の CLI コマンドを使用してイベント サブスクリプションを作成します。 イベント サブスクリプションの名前を入力するためのプレースホルダーだけでなく、サブスクリプション ID、リソース グループ、Event Grid トピックの名前、関数アプリの名前を入力するためのプレースホルダーもあります。

az eventgrid event-subscription create --name <name-for-topic-event-subscription> --event-delivery-schema eventgridschema --source-resource-id /subscriptions/<your-subscription-ID>/resourceGroups/<your-resource-group>/providers/Microsoft.EventGrid/topics/<your-event-grid-topic> --endpoint-type azurefunction --endpoint /subscriptions/<your-subscription-ID>/resourceGroups/<your-resource-group>/providers/Microsoft.Web/sites/<your-function-app>/functions/ProcessDTRoutedData

シミュレーションを実行して結果を確認する

これで、イベントには、シミュレートされたデバイスから Azure Digital Twins にフローし、必要に応じて、Azure Digital Twins グラフを使用してツインを更新する機能が必要になります。 このセクションでは、デバイス シミュレーターをもう一度実行して、設定したイベント フロー全体を開始し、Azure Digital Twins にクエリを実行してライブの結果を確認します。

DeviceSimulator\DeviceSimulator フォルダーが開いているコンソール ウィンドウに移動し、dotnet run を使用してデバイス シミュレーター プロジェクトを実行します。

初めてデバイス シミュレーターを実行した場合と同様に、プロジェクトの実行が開始され、シミュレートされた温度テレメトリ メッセージが表示されます。 これらのイベントは、前半に設定したフローをたどって thermostat67 ツインを更新した後、後半に設定したフローをたどって room21 ツインを thermostat67 と同じ状態に更新します。

送信中の温度テレメトリが示されたデバイス シミュレーターのコンソール出力のスクリーンショット。

このコンソールで行うべき作業は他にありませんが、次のステップに取り組む間、コンソールは実行したままにしておいてください。

Azure Digital Twins 側のデータを表示するには、AdtSampleApp\SampleClientApp フォルダーを開いている他のコンソール ウィンドウに移動し、dotnet run を使用して SampleClientApp プロジェクトを実行します。

プロジェクトが実行され、コマンドを受け入れたら、次のコマンドを実行して、デジタル ツイン thermostat67 とデジタル ツイン room21 からレポートされる温度を取得します。

ObserveProperties thermostat67 Temperature room21 Temperature

"Azure Digital Twins インスタンスから" のライブ更新された温度が 2 秒ごとにコンソールにログされていることを確認できます。 thermostat67 への変更に合わせて room21 の温度が更新されていることがわかります。

thermostat と room からの温度メッセージのログが示されたコンソール出力のスクリーンショット。

インスタンスからのライブの温度ログが正しく動作していることを確認したら、どちらのプロジェクトも実行を停止してかまいません。 チュートリアルはこれで完了したので、両方のコンソール ウィンドウも閉じてかまいません。

確認

こちらは、このチュートリアルで構築したシナリオの確認です。

  1. Azure Digital Twins インスタンスは、フロア、部屋、サーモスタットをデジタルで表現します (以下の図のセクション A)。
  2. シミュレートされたデバイスのテレメトリが IoT Hub に送信されます。IoT Hub では、Azure 関数 ProcessHubToDTEvents がテレメトリ イベントをリッスンします。 Azure 関数 ProcessHubToDTEvents は、これらのイベント内の情報を使用して、thermostat67 の Temperature プロパティを設定します (図の矢印 B)。
  3. Azure Digital Twins のプロパティ変更イベントが Event Grid トピックにルーティングされます。Event Grid トピックでは、Azure 関数 ProcessDTRoutedData がイベントをリッスンしています。 Azure 関数 ProcessDTRoutedData は、これらのイベント内の情報を使用して、room21 の Temperature プロパティを設定します (図の矢印 C)。

構築シナリオ全体を示す、この記事の最初からの図。

リソースをクリーンアップする

このチュートリアルを終えたら、次に行う作業に応じて、削除するリソースを選択できます。

  • このチュートリアルで作成したリソースがすべて不要である場合、この記事で使用した Azure Digital Twins インスタンスとその他すべてのリソースを az group delete CLI コマンドで削除できます。 そのリソース グループとそこに含まれるすべての Azure リソースが削除されます。

    重要

    リソース グループを削除すると、元に戻すことができません。 リソース グループとそこに含まれるすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。

    Azure Cloud Shell またはローカル CLI ウィンドウを開き、次のコマンドを実行すると、リソース グループとそこに含まれる内容がすべて削除されます。

    az group delete --name <your-resource-group>
    
  • この記事でセットアップした Azure Digital Twins インスタンスは引き続き使用するものの、そのモデル、ツイン、関係の一部または全部をクリアする場合は、az dt という CLI コマンドを使用して、目的の要素を削除することができます。

    この方法では、このチュートリアルで作成した他の Azure リソース (IoT ハブ、Azure Functions アプリなど) は一切削除されません。 これらのリソースは、それぞれの種類に合った適切な dt コマンドを使用して個別に削除できます。

さらに、プロジェクト フォルダーもローカル コンピューターから削除してください。

次のステップ

このチュートリアルでは、デバイスのライブ データによって駆動される Azure Digital Twins を紹介するエンド ツー エンドのシナリオを作成しました。

今度は、次のチュートリアルの概念ドキュメントを参照し、ここで扱った要素についてさらに理解を深めましょう。