[アドカレ2025] AWS IoT SiteWiseのモデルの違いについてのあれこれ

はじめに

ハッピーホリデ~~~~~~!!🥳🥳🥳🎉🎉🎉

こんにちは、omkです。
いよいよ待ちに待ったクリスマス・イブですね。
折角のクリスマスではありますが、今日に向けて開発していたIoT機器が完成しなかったのでクリスマスとはまったく関係ないIoT SiteWiseの話をします。
ベリー謝罪シマス。

SiteWiseではデータをモデル化して、実際の設備・機器をモデルに当てはめてアセットとして管理します。
ここでメインで使うのが「アセットモデル」なのですが、その他にも「アセットモデルインターフェイス」と「コンポーネントモデル」が存在しています。
今回はこれらの使い分けや使い方の説明をしていきます。

使い分け

アセットモデル

アセットモデルはSiteWiseのベースとなるモデルで、設備・機器をモデル化したものです。
たとえば機器Aという機器があったとして、工場内でこの機器Aが複数台稼働している場合に、
この機器Aで管理したいデータをモデル化して実際のデータはモデルから作成したアセットに持たせます。
プログラミングでいうとクラスとインスタンスの関係ですね。

階層で言うとこういうイメージかいね。

工場A
┣ 機器A(モデルA、アセットA1)
┃  ┣ 温度
┃  ┗ 回転数
┗ 機器A(モデルA、アセットA2)
   ┣ 温度
   ┗ 回転数

これの機器Aと機器A内のプロパティをアセットモデルでモデル化するイメージです。
また、このときに工場Aもモデル化しておき、親モデルとして配下に機器Aの子モデルを紐づけます。
そしてモデルから実際のアセットをそれぞれ作成し、工場Aと機器Aのアセット間を階層付けます。

親アセットでは子アセットのメトリクスを参照できるため、この例では工場全体の機器Aの情報を集計して管理したりも出来ます。

アセットモデルインターフェイス

アセットモデルインターフェイスをイメージする上で以下のドキュメントが非常に参考になります。
https://docs.aws.amazon.com/iot-sitewise/latest/userguide/model-interfaces.html

複数の設備・機器に共通するプロパティをまとめて管理し、アセットモデルにマッピングすることでアセットモデルの柔軟性を保ちつつ、共通プロパティの設定や更新を簡単にするものです。
以下の類似の機器AB間で共通するプロパティとして稼働時間がある場合にこれをインターフェイスで共通化してアセットモデルにマッピング出来ます。

こんなイメージです。

工場A
┣ 機器A(モデルA、アセットA1)
┃  ┣ 温度
┃  ┣ 回転数1
┃  ┗ 稼働時間★
┣ 機器A(モデルA、アセットA1)
┃  ┣ 温度
┃  ┣ 回転数1
┃  ┗ 稼働時間★
┗ 機器(モデルB、アセットB1)
   ┣ 温度
   ┣ 回転数1
   ┣ 回転数2
   ┗ 稼働時間★

コンポーネントモデル

コンポーネントモデルは以下のリンクが参考になります。
https://docs.aws.amazon.com/ja_jp/iot-sitewise/latest/userguide/custom-composite-models.html#component-based-custom-composite-models

設備・機器に取り付けた共通パーツのようなイメージで例えばモーターなどが複数付いている場合にこれを共通化してモデル化出来ます。
アセットモデルではこれを参照してプロパティを設定出来ます。

こんなイメージです。

工場A
┣ 機器A(モデルA、アセットA1)
┃  ┣ 温度
┃  ┣ モーターA★
┃  ┃  ┗回転数★
┃  ┗ 稼働時間
┣ 機器A(モデルA、アセットA1)
┃  ┣ 温度
┃  ┣ モーターA★
┃  ┃  ┗回転数★
┃  ┗ 稼働時間
┗ 機器(モデルB、アセットB1)
   ┣ 温度
   ┣ モーターA★
   ┃  ┗回転数★
   ┣ モーターB★
   ┃  ┗回転数★
   ┗ 稼働時間

実際の使い方としてはインターフェイスはアセットモデルの拡張で、コンポーネントモデルはアセットモデルの階層に近いような印象を受けます。

やってみた

過去にEC2の負荷状況を管理するSiteWise環境を作成したのでこれを流用して検証してみます。

AWS IoT SiteWise Monitorのダッシュボードでアラームを可視化!!(後)

こんな環境があります。

Clients
┗  ClientA
┃  ┣ CPU_USAGE
┃  ┣ MEM_USAGE
┃  ┗ SWAP_USAGE
┃
┗ ClientB
   ┣ CPU_USAGE
   ┣ MEM_USAGE
   ┗ SWAP_USAGE

まずはインターフェイスを設定していきます。
マシンのスペックに依存せずに共通する事項としてマシンの起動時間(running_time)をインターフェイスで設定します。

Clients
┣ ClientA
┃  ┣ CPU_USAGE
┃  ┣ MEM_USAGE
┃  ┣ SWAP_USAGE
┃ ┗ RUNNING_TIME★
┃
┗ ClientB
   ┣ CPU_USAGE
   ┣ MEM_USAGE
   ┣ SWAP_USAGE
  ┗ RUNNING_TIME★

アセットモデルと同様の方法でインターフェイスを作成し、対象のアセットモデルにインターフェイスをマッピングします。

今回は新規にアセットモデルにプロパティを作成し、インターフェイスのプロパティとマッピングをしました。
あとはストリームのデータと紐づければデータがみられるようになりました。

今は亡きSiteWise Monitorから通常のアセットプロパティと同様の見え方で見られることを確認しました。
APIから参照してみたところ実際にアセットプロパティとして扱われているようでした。

↓一部のみ抽出

'assetProperties': [
    {
        'id': 'af807223-a556-4c30-b6b6-44c74ee3e4b2', 
        'name': 'running_time', 
        'alias': '/Clients/Client_A/RUNNING_TIME', 
        'notification': {
            'topic': '$aws/sitewise/asset-models/9e2df005-08b9-401b-8bfe-426762f70fd5/assets/cf73bc7f-6d06-4ba8-afde-bae6d8cad036/properties/af807223-a556-4c30-b6b6-44c74ee3e4b2', 
            'state': 'DISABLED'
        }, 
        'dataType': 'DOUBLE', 
        'unit': 'second', 
        'path': [
            {
                'id': 'cf73bc7f-6d06-4ba8-afde-bae6d8cad036', 
                'name': 'Client_A'
            }, 
            {
                'id': 'af807223-a556-4c30-b6b6-44c74ee3e4b2', 
                'name': 'running_time'
            }
        ]
    }, 
    {
        'id': '2dfc3f0f-f53b-48ce-8f6a-91b676e2e73f',
        'name': 'MEM_USAGE',
        'alias': '/Clients/Client_A/MEM_USAGE', 
        'notification': {
            'topic': '$aws/sitewise/asset-models/9e2df005-08b9-401b-8bfe-426762f70fd5/assets/cf73bc7f-6d06-4ba8-afde-bae6d8cad036/properties/2dfc3f0f-f53b-48ce-8f6a-91b676e2e73f', 
            'state': 'ENABLED'
        }, 
        'dataType': 'DOUBLE', 
        'unit': '%', 
        'path': [
            {
                'id': 'cf73bc7f-6d06-4ba8-afde-bae6d8cad036', 
                'name': 'Client_A'
            }, 
            {
                'id': '2dfc3f0f-f53b-48ce-8f6a-91b676e2e73f', 
                'name': 'MEM_USAGE'
            }
        ]
    },

これでインターフェイスを使用出来るようになりました。
実際にこれが活きるケースでいうと測定とかメトリクスが複数あってメトリクスで複雑な計算が含まれているパターンかなと思いました。

次にコンポーネントモデルを試していきます。

CPUの使用率をCPU全体で取得するのをやめてコアごとに管理したいと唐突に思い立ちましたので、コンポーネントで表現してみます。
CPUによってコア数が異なることからコアに対してコンポーネントを作成してコア数だけ各アセットモデルに割り当てます。

Clients
┣ ClientA
┃  ┣ cpu_core1★
┃  ┃  ┗ CPU_USAGE★
┃  ┣ cpu_core2★
┃  ┃  ┗ CPU_USAGE★
┃  ┣ MEM_USAGE
┃  ┣ SWAP_USAGE
┃ ┗ RUNNING_TIME
┃
┗ ClientB
   ┣ cpu_core1★
   ┃  ┗ CPU_USAGE★
   ┣ cpu_core2★
   ┃  ┗ CPU_USAGE★
   ┣ MEM_USAGE
   ┣ SWAP_USAGE
  ┗ RUNNING_TIME

コンポーネント作成。

アセット側にも設定。

ではSiteWise Monitorで確認してみまデータ表示されてないーーー!!

APIから確認したところ「AssetCompositeModelSummaries」という項目でパスだけが取れました。アセットプロパティとは別の扱いみたいです。

'assetCompositeModelSummaries': [
    {
        'id': 'f346c28f-d8c6-4159-9845-bf7c46485184', 
        'name': 'cpu_core1', 
        'type': 'CUSTOM', 
        'path': [
            {
                'id': 'cf73bc7f-6d06-4ba8-afde-bae6d8cad036', 
                'name': 'Client_A'
            }, 
            {
                'id': 'f346c28f-d8c6-4159-9845-bf7c46485184', 
                'name': 'cpu_core1'
            }
        ]
    }, 
    {
        'id': '8683296e-84c1-49a5-8b8a-0decf3ca7bb7', 
        'name': 'cpu_core2', 
        'type': 'CUSTOM', 
        'path': [
            {
                'id': 'cf73bc7f-6d06-4ba8-afde-bae6d8cad036', 
                'name': 'Client_A'
            }, 
            {
                'id': '8683296e-84c1-49a5-8b8a-0decf3ca7bb7', 
                'name': 'cpu_core2'
            }
        ]
    }
]

どうやらメトリクスとして利用するのが正解な模様……

コンポーネント側でメトリクスを定義。

アセットモデル側でコンポーネントのメトリクスを参照したメトリクスを作成。

でました。

APIからもメトリクスがプロパティとして取得出来ています。

{
  'id': 'd2992bff-79e4-4c13-aad5-0426b222a9cb', 
  'name': 'AVG_CPU_USAGE', 
  'notification': {
    'topic': '$aws/sitewise/asset-models/9e2df005-08b9-401b-8bfe-426762f70fd5/assets/cf73bc7f-6d06-4ba8-afde-bae6d8cad036/properties/d2992bff-79e4-4c13-aad5-0426b222a9cb', 
    'state': 'DISABLED'}, 
    'dataType': 'DOUBLE', 
    'unit': '%', 
    'path': [
      {
        'id': 'cf73bc7f-6d06-4ba8-afde-bae6d8cad036', 
        'name': 'Client_A'
      }, 
      {
        'id': 'd2992bff-79e4-4c13-aad5-0426b222a9cb', 
        'name': 'AVG_CPU_USAGE'
      }
    ]
  }
}

ついでに親アセットで集計。

いい感じに可視化できましたね。

おわりに

SiteWiseを利用するにあたって一番重要なのが階層構造の表現だと思っています。
階層を効率よく表現するためにこういった機能も活用していきたいですね。

明日は今年のアドカレ最後を締めくくる記事になります。

それでは、さようなら~~👋

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA