Things Cloudのドメインモデル
次の図は、IoTのデバイスやアセットの関連性を示しています。
-
インベントリ は、デバイス、構成、接続など、関連するすべてのマスターデータを保存します。関連するすべてのアセットと構造情報も含んでいます(車両、機械、ビルなど)。
-
メジャーメント は、センサーが生成した数値データ(気温など)、またはデバイス情報をもとに生成された数値データ(デバイスの使用可否など)を含んでいます。
-
イベント は、ドアセンサーのトリガーなど、センサーネットワークから抽出した他のリアルタイム情報を含みます。イベントを元に、ユーザーやシステムオペレーターが行動を起こすことを要請する アラーム を発生させることもできます(停電など)。さらに、セキュリティ監視のイベントは 監査ログ として保存されます。
-
オペレーションは、実行または処理のためにデバイスに送信されるデータに関連します。例えば、電力メーターのスイッチの変更オペレーション、クレジットカード情報の自動販売機への送信オペレーションなどが該当します。
Things Cloud の最も優れたアーキテクチャは、一般のデバイスやセンサーに対応する標準化された表現を定義しており、また、この表現を柔軟に拡張・改良できる設計としていることです。Things Cloud は気温センサー、スマートメーター、トラッカーなど多くの定義済み表現を持っており、ローカルのカスタマイズに適合する多くのオプションがあります。
これにより、さまざまな Web 構成やメーカーのさまざまなデバイスの特殊事例に合わせて、カスタマイズされた基盤のセンサーネットワークと接続デバイスから独立して IoT アプリケーションが作成できます。
フラグメント
Things Cloud ドメインモデル内のすべてのオブジェクトを柔軟に拡張・変更できる鍵となる概念が「フラグメント」です。
フラグメントの概念を理解するために、たとえば異なるベンダーの電力量計を記述したいと想像してください。メーターの種類によっては、リレーが搭載されていたり、単相または三相を計測できるものもあります。これらの特徴は、それぞれのフラグメントを保存することで識別されます。
{
"id": "47035",
"type": "elstermetering_AS220",
"lastUpdated": "2010-11-13T18:28:36.000Z",
"c8y_Position": {
"alt": 67,
"lng": 6.15173,
"lat": 51.211977
},
"c8y_ThreePhaseElectricitySensor": {},
"c8y_Relay": {
"state": "CLOSED"
}
}
この例では、c8y_ThreePhaseElectricitySensor
フラグメントが三相電力量計を示しています。さらに、このデバイスにはリレーが含まれており、電源のオン・オフ制御に使用できます。
このアプローチにより、デバイスのモデリングでは、センサーや制御機能などの基本的な要素をフラグメントとして表現し、デバイス全体をセンサーや制御機能、そして場合によっては独自要素の組み合わせとして表現できます。
このアプローチはまた、汎用的なアプリケーションコンポーネントの開発を可能にします。たとえば、マネージドオブジェクトに位置情報フラグメント(c8y_Position
)が含まれていれば、地図上に配置できます。リレー(c8y_Relay
)があれば、下記のようなデバイス制御コマンドで電源のオン・オフが可能です。
フラグメントやマネージドオブジェクトの構造について詳しくは、フラグメントライブラリ を参照してください。
データモデル設計時には、以下の点に注意してください。
- 単一フラグメントのサイズや長さには制限はありませんが、インベントリコレクション内の単一マネージドオブジェクトエントリとしては、JSONドキュメント全体のサイズが16MiBを超えてはいけません。1MiB未満に収めることを推奨します。
- アセット階層を設計する際には、サブアセットが 1000 未満の小グループを使用してください。アセット階層内の各サブアイテムは親アイテム内に参照レコードを作成するため、上記のJSONドキュメントサイズの推奨を考慮してください。
- フラグメント内に要素の配列を含める場合、そのコレクションの長さは1kエレメント未満にしてください。
- ルートレベルでマネージドオブジェクトにフラグメントを追加するごとに、そのアイテムのクエリ時に一定の遅延が発生します。クエリのパフォーマンスが重要な場合は、カスタムフラグメントを選択した単一のフラグメント内に入れ子で格納し、ルートフラグメント数を効果的に制限することを推奨します。例:
{
"id": "47035",
"type": "elstermetering_AS220",
"lastUpdated": "2010-11-13T18:28:36.000Z",
"c8y_ThreePhaseElectricitySensor": {},
"c8y_DeviceMetrics": {
"c8y_ConnectionMetrics": {
"failures": 0,
"successful": 1403,
"total": 1403
},
"c8y_Alarms": {
"requested": 100,
"successful": 100
},
"c8y_Measurements": {
"requested": 1303,
"successful": 1303
}
},
"c8y_DeviceMetricsConfiguration": {
"deviceRepresentationUpdateIntervalCron": "0 22 * * *",
"monitorApi": [
"measurements",
"alarms"
]
}
}
フラグメントの命名規則
フラグメントは、異なる関係者がフラグメント情報を提供する際の衝突を避けるため、Javaなどのプログラミング言語と同様に命名規則を使用します。
上記の例では、c8y_Position
は “c8y”(「Cumulocity」の略)、アンダースコア、“Position” で構成され、標準フラグメント群を形成しています。フラグメントの定義は フラグメントライブラリ に記載されています。
. , * [ ] ( ) @ $ / '
は使用できません。Things Cloud では、データの保存にドキュメント指向のアプローチを採用しています。オブジェクトの特性はオブジェクトデータを含むドキュメントから判断でき、明示的に別途メタデータモデルを設定・管理する必要はありません。ただし、アプリケーションは独自のメタデータを追加し、インベントリに値を保存することができます。たとえば、自動販売機アプリケーションは、インベントリ内で多様な自動販売機タイプのスロット構成情報をメタデータとして管理できます。
以下では上記概念をひとつひとつ詳細に、例を上げて説明していきたいと思います。Things Cloud の REST APIフォーマットとして使用する例を示します。別のプログラミング言語での使用については、Things Cloud OpenAPI仕様 内の該当サンプルを参照してください。