この記事では、Azure Digital Twins データを使用して、Azure Maps から屋内マップに表示される情報を更新する方法について説明します。 Azure Digital Twins は、IoT デバイスの関係性グラフを保存し、異なるエンドポイントにデバイス データをルーティングするため、マップ上の情報オーバーレイを更新するのに最適なサービスとなっています。
このガイドの内容は次のとおりです。
- Azure Functions の関数にツイン更新イベントを送信するように Azure Digital Twins インスタンスを構成 する。
- Azure Maps の屋内地図のフィーチャ状態セットを更新するための関数を作成する。
- Azure Digital Twins のグラフにマップ ID とフィーチャーステートセット ID を格納する。
始めましょう
このセクションでは、この記事で紹介する情報の背景を説明します。
前提条件
この記事を読み進める前に、Azure Digital Twins と Azure Maps の各リソースを設定することから始めてください。
- Azure Digital Twins の場合: エンド ツー エンド ソリューションの接続 に関するページの手順に従って、サンプル ツイン グラフとシミュレートされたデータ フローを使用して Azure Digital Twins インスタンスを設定します。
- この記事では、そのソリューションを別のエンドポイントとルートで拡張します。 また、そのチュートリアルの関数アプリに別の関数を追加します。
- Azure Maps の場合: Creator を使用して屋内マップを作成し 、 機能ステートセットを使用して Azure Maps 屋内マップを作成する方法に関するページの手順に従います。
- 地物ステートセットは、部屋や機器などのデータセットの地物に割り当てられる動的プロパティ(ステート)の集合です。 上記の Azure Maps の手順では、「フィーチャーステートセット」にはマップに表示される部屋の状態が格納されています。
- Azure Maps サブスクリプション キー、フィーチャー ステートセット ID、およびmapConfigurationが必要です。
トポロジ
次の図は、このチュートリアルの屋内マップの統合要素が、より大きなエンドツーエンドの Azure Digital Twins シナリオに該当する場所を示しています。
Azure Digital Twins のツイン更新通知をルートする
ツインの状態が更新されるたびに、Azure Digital Twins インスタンスでツイン更新イベントを生成できます。 上記でリンクされた Azure Digital Twins Connect のエンド ツー エンド ソリューション では、温度計を使用して部屋のツインにアタッチされた温度属性を更新するシナリオについて説明します。 このチュートリアルでは、このソリューションを拡張して、ツインからの更新通知を Azure 関数にサブスクライブし、その関数を使ってマップを更新する方法を説明します。
このパターンでは、IoT デバイスではなく、部屋のツインから直接読み取りを行います。これにより、マッピング ロジックを更新しなくても、基になるデータ ソースを温度に合わせて柔軟に変更することができます。 たとえば、複数の温度計を追加したり、別の部屋と温度計を共有するようにこの部屋を設定したりすることができます。これらはすべて、マップ ロジックを更新せずに行うことができます。
まず、すべてのツイン更新イベントを Event Grid トピックに転送するために、Azure Digital Twins でルートを作成します。
以下の CLI コマンドを使用して、Azure Digital Twins インスタンスからイベントを受信する、Event Grid トピックを作成します。
az eventgrid topic create --resource-group <your-resource-group-name> --name <your-topic-name> --___location <region>
以下の CLI コマンドを使用して、Event Grid トピックを Azure Digital Twins にリンクするエンドポイントを作成します。
az dt endpoint create eventgrid --endpoint-name <Event-Grid-endpoint-name> --eventgrid-resource-group <Event-Grid-resource-group-name> --eventgrid-topic <your-Event-Grid-topic-name> --dt-name <your-Azure-Digital-Twins-instance-name>
以下の CLI コマンドを使用して、ツイン更新イベントをお使いのエンドポイントに送信するためのルートを Azure Digital Twins に作成します。 このコマンドの Azure Digital Twins インスタンス名のプレースホルダーには、フレンドリ名またはホスト名を使用すると、パフォーマンスを向上させることができます。
注
Cloud Shell には現在、
az dt route
、az dt model
、az dt twin
の各コマンド グループに影響する既知の問題があります。解決するには、コマンドを実行する前に Cloud Shell で
az login
を実行するか、Cloud Shell ではなく ローカル CLI を 使用します。 この詳細については、 Azure Digital Twins の既知の問題に関するページを参照してください。az dt route create --dt-name <your-Azure-Digital-Twins-instance-hostname-or-name> --endpoint-name <Event-Grid-endpoint-name> --route-name <my-route> --filter "type = 'Microsoft.DigitalTwins.Twin.Update'"
イベントを取得してマップを更新する Azure 関数を作成する
このセクションでは、Event Grid トピックに送信されたイベントをリッスンする関数を作成します。 この関数は、これらの更新通知を読み取り、対応する更新を Azure Maps 地物状態セットに送信し、1 つの部屋の温度を更新します。
Azure Digital Twins チュートリアルの 前提条件では、Azure Functions Azure Digital Twins を格納する関数アプリを作成しました。 次に、 Event Grid によってトリガーされる新しい Azure 関数を関数 アプリ内に作成します。
関数コードを次のコードに置き換えます。 これにより、空間のツインに対する更新のみが除外され、更新された温度が読み取られ、その情報が Azure Maps に送信されるようになります。
using System;
using System.Threading.Tasks;
using System.Net.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Azure.Messaging.EventGrid;
namespace updateMaps
{
public static class ProcessDTUpdatetoMaps
{
// Read maps credentials from application settings on function startup
private static string statesetID = Environment.GetEnvironmentVariable("statesetID");
private static string subscriptionKey = Environment.GetEnvironmentVariable("subscription-key");
private static HttpClient httpClient = new HttpClient();
[FunctionName("ProcessDTUpdatetoMaps")]
public static async Task Run([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
{
JObject message = (JObject)JsonConvert.DeserializeObject(eventGridEvent.Data.ToString());
log.LogInformation($"Reading event from twinID: {eventGridEvent.Subject}: {eventGridEvent.EventType}: {message["data"]}");
//Parse updates to "space" twins
if (message["data"]["modelId"].ToString() == "dtmi:contosocom:DigitalTwins:Space;1")
{
// Set the ID of the room to be updated in your map.
// Replace this line with your logic for retrieving featureID.
string featureID = "UNIT103";
// Iterate through the properties that have changed
foreach (var operation in message["data"]["patch"])
{
if (operation["op"].ToString() == "replace" && operation["path"].ToString() == "/Temperature")
{
// Update the maps feature stateset
var postcontent = new JObject(
new JProperty(
"States",
new JArray(
new JObject(
new JProperty("keyName", "temperature"),
new JProperty("value", operation["value"].ToString()),
new JProperty("eventTimestamp", DateTime.UtcNow.ToString("s"))))));
var response = await httpClient.PutAsync(
$"https://us.atlas.microsoft.com/featurestatesets/{statesetID}/featureStates/{featureID}?api-version=2.0&subscription-key={subscriptionKey}",
new StringContent(postcontent.ToString()));
log.LogInformation(await response.Content.ReadAsStringAsync());
}
}
}
}
}
}
関数アプリで 2 つの環境変数を設定する必要があります。 1 つは Azure Maps のプライマリ サブスクリプション キーで、1 つは Azure Maps のステートセット ID です。
az functionapp config appsettings set --name <your-function-app-name> --resource-group <your-resource-group> --settings "subscription-key=<your-Azure-Maps-primary-subscription-key>"
az functionapp config appsettings set --name <your-function-app-name> --resource-group <your-resource-group> --settings "statesetID=<your-Azure-Maps-stateset-ID>"
マップにライブ更新を表示する
ライブ更新温度を表示するには、以下の手順に従います。
- Azure Digital Twins Connect のエンド ツー エンド ソリューションから DeviceSimulator プロジェクトを実行して、シミュレートされた IoT データの送信を開始します。 このプロセスの手順は、「シミュレーションの 構成と実行」 セクションにあります。
-
Azure Maps Indoor モジュールを使用して、Azure Maps Creator で作成された屋内マップをレンダリングします。
- サンプルの屋内マップ HTML ファイルを 例: カスタム スタイル: WebSDK でのマップ構成の使用 (プレビュー) からコピーします。
- ローカル HTML ファイルの サブスクリプション キー、 mapConfiguration、 statesetID、 リージョン を実際の値に置き換えます。
- ブラウザーでそのファイルを開きます。
どちらのサンプルでも、互換性のある範囲で温度が送信されるので、マップには約 30 秒ごとに 121 号室の更新の色が表示されるはずです。
Azure Digital Twins にマップ情報を格納する
これでマップ情報を更新するためのハードコードされたソリューションが完成したので、Azure Digital Twins のグラフを使用して、屋内マップの更新に必要なすべての情報を格納できます。 この情報には、各マップと場所の状態セット ID、マップ サブスクリプション ID、および地物 ID がそれぞれ含まれます。
この特定の例のソリューションには、各トップレベルの空間に状態セットIDとマップサブスクリプションID属性を設定するための更新、および各部屋に機能IDを設定するための更新が含まれます。 ツイン グラフを初期化するときにこれらの値を 1 回設定し、ツインの更新イベントごとにそれらの値に対してクエリを実行する必要があります。
ご自分のトポロジの構成によっては、これら 3 つの属性を、マップの細分性に関連付けてさまざまなレベルで格納できます。
次のステップ
ツイン グラフの情報の管理、アップグレード、および取得について詳しくは、以下の参照情報をご覧ください。