Things Cloudのドメインモデル

次の図は、IoTのデバイスやアセットの関連性を示しています。

Domain model

  • インベントリ は、デバイス、構成、接続など、関連するすべてのマスターデータを保存します。関連するすべてのアセットと構造情報も含んでいます(車両、機械、ビルなど)。

  • メジャーメント は、センサーが生成した数値データ(気温など)、またはデバイス情報をもとに生成された数値データ(デバイスの使用可否など)を含んでいます。

  • イベント は、ドアセンサーのトリガーなど、センサーネットワークから抽出した他のリアルタイム情報を含みます。イベントを元に、ユーザーやシステムオペレーターが行動を起こすことを要請する アラーム を発生させることもできます(停電など)。さらに、セキュリティ監視のイベントは 監査ログ として保存されます。

  • オペレーションは、実行または処理のためにデバイスに送信されるデータに関連します。例えば、電力メーターのスイッチの変更オペレーション、クレジットカード情報の自動販売機への送信オペレーションなどが該当します。

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)があれば、下記のようなデバイス制御コマンドで電源のオン・オフが可能です。

フラグメントやマネージドオブジェクトの構造について詳しくは、フラグメントライブラリ を参照してください。

備考

データモデル設計時には、以下の点に注意してください。

  1. 単一フラグメントのサイズや長さには制限はありませんが、インベントリコレクション内の単一マネージドオブジェクトエントリとしては、JSONドキュメント全体のサイズが16MiBを超えてはいけません。1MiB未満に収めることを推奨します。
  2. アセット階層を設計する際には、サブアセットが 1000 未満の小グループを使用してください。アセット階層内の各サブアイテムは親アイテム内に参照レコードを作成するため、上記のJSONドキュメントサイズの推奨を考慮してください。
  3. フラグメント内に要素の配列を含める場合、そのコレクションの長さは1kエレメント未満にしてください。
  4. ルートレベルでマネージドオブジェクトにフラグメントを追加するごとに、そのアイテムのクエリ時に一定の遅延が発生します。クエリのパフォーマンスが重要な場合は、カスタムフラグメントを選択した単一のフラグメント内に入れ子で格納し、ルートフラグメント数を効果的に制限することを推奨します。例:
{
    "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仕様 内の該当サンプルを参照してください。

インベントリ

マネージドオブジェクト

インベントリではIoTソリューションに関連するデバイスや管理アセット情報を保存することができます。これらを マネージドオブジェクト と呼びます。

マネージドオブジェクトは、スマート電力メーター、ホームオートメーション ゲートウェイ、GPS デバイスなどの「スマートオブジェクト」である場合があります。または、センサーが設置されている部屋や GPS デバイスが搭載されている車など、監視したいアセットである場合もあります。

下記のJSONコードは、インベントリ内のマネージドオブジェクトの最も簡単な例、単純なスイッチになります。

{
    "id": "47635",
    "name": "Smart switch",
    "type": "ge_45609",
    "c8y_Relay": {
        "state" : "OPEN"
    }
}

インベントリに保存されたアセットの他の例として、スイッチが備え付けられている部屋を考えてみましょう(以下の子アセットリファレンスの managedObject の参照しているプロパティと、スイッチの idプロパティを比較してみましょう)。

{
    "id": "59436",
    "type": "resortenergymgmt_Room",
    "name": "Sauna room",
    "childAssets": {
        "references" : [
            {
                "managedObject": {
                    "id": "47635"
                }
            }
        ]
    },
    "resortenergymgmt_RoomProperty": {
		"size": 56
    }
}

マネージドオブジェクトには、一般的に次の要素で構成されています。

  • オブジェクトを参照する一意の識別子
  • オブジェクトの名前
  • マネージドオブジェクトの最も具体的なタイプ
  • オブジェクトの最終更新時間
  • 特定の意味を持つフラグメント(例:c8y_IsDevice
  • 追加のカスタムフラグメント。

オブジェクトの識別

インベントリにある各マネージドオブジェクトはそれぞれ Things Cloud によって作成された一意でグローバルな ID(識別子)を持っています。

このID(識別子)は、ネットワークの再構築やハードウェア部品の変更に関係なく、常にオブジェクトに残ります。

アイデンティティサービス

アプリケーションを複数の ID(識別子)から保護するために、Things Cloud には、1 つのアセットが外部で使用する ID(識別子)をすべて登録し、これらすべてをアプリケーションが使用する単一のグローバル ID(識別子)へマッピングする識別サービスが提供されています。

このサービスは、(外部 ID の登録をするため)エージェントおよび、(外部 ID のマップをグローバル ID へ変更するため)デバイスの再編成や変更を伴うビジネスプロセスによって使用されます。

例えば、とある家のスマートメーターが不良品だとします。そして、この家に別のメーター番号を持った新たなスマートメーターを導入するとします。この不良メーターと新メーターの交換は業務上では識別サービスの顧客に関連するアセットタグとメーター番号の変更のみで可能となるのです。その後、すでに収集されたデータも新しく読み込まれるデータも適切な顧客に関連付けられます。

詳細は、Things Cloud OpenAPI仕様 の Identity API を参照してください。

オブジェクト階層

インベントリモデルは、次の2つのデフォルト階層に対応しています:通信階層(“childDevices”)とアセット階層(“childAssets”)

通信階層はデバイスが通信上どのように IoT プラットフォームに接続されているか追跡することができます。エージェントはセンサーネットワークを Things Cloud に接続します。そして、多くの場合ゲートウェイ装置やモデムを介してセンサーネットワークと通信します。逆に、ゲートウェイはセンサーネットワークにあるセンサーや制御装置などのデバイスと接続します。この典型的な通信階層を下の図に示します。

例の通信階層

アセット階層は、IoTデバイスによりリモート監視や操作されているアセットを構成します。

例えば、建築管理のアセット階層には、部屋が含まれたビルがあるとします。ビルは Things Cloud と接続しているゲートウェイと関連付けられ、部屋はセンサーや制御装置と関連付けられます。この階層例は、下図を参照してください。

例のアセット階層

階層の子オブジェクト

上記の2つの階層は階層内の子を追加および削除するための手法を提供する インベントリ インターフェース とクライアント ライブラリに対応しています。階層自体は、クライアント アプリケーションで規定されます。通信階層はエージェントによって構築され、アセット階層はアプリケーションにより追加されます。

なお、オブジェクト階層は必ずしもツリー構造である必要はありません。1 つのアセットが複数の親アセットの子になってもかまいません。これにより、アプリケーションで稼動グループやバーチャルネットワークなどユーザー定義のオブジェクトグループを追加できます。さらに、フラグメントを使えば、アプリケーションは任意の別の階層構造を定義することも可能です。

オブジェクトライフサイクル

前述の識別および階層メカニズムは、ほとんどのビジネスプロセスに適応できる非常に柔軟なデバイスライフサイクルアプローチを形成します。デバイスが初めて電源をオンにすると、最初はシステムに接続されておらず、アセットにもリンクされていません。通信階層でエージェントにデバイスをリンクする(おそらくゲートウェイを介して間接的に)ことで、デバイスが接続されていることを示します。接続されているデバイスのみがリモートで制御できます。アセット階層を使用してデバイスをアセットにリンクさせることは、そのデバイスが物理的にインストールされたことを示すために使用できます。

接続を切断してアンインストールしたデバイスは必ずしも廃棄または無効化されて、システムから削除するとは限りません。デバイスが倉庫に返品され後日別の場所で再利用されるかもしれません。デバイスのデータやデバイス情報を維持されるかどうかは、業務プロセスや事例によって決まります。物理的にデバイスをインベントリから削除するということは、関連データをすべて失うことになります。これは古いデータのクリーンアップの場合でのみ必要でしょう。切断したデバイスのデータを維持したい場合は、デバイスの識別マッピングを識別サービスから削除します。新デバイスが古いデバイスと入れ替わる場合、新しいグローバル ID が作成されます。

エージェントを構築する際、デバイス ライフサイクルをきちんと表記することが重要です。例えば、デバイスと接続しているエージェントは、デバイスが通信できなくなったときにインベントリのデバイス情報を自動的に削除できると仮定してはなりません。同様に、CRM システムと連携しているエージェントは、CRM システムから削除されたデバイスを削除できると仮定してはなりません。

詳細情報

インベントリの操作に関する詳細については、Things Cloud OpenAPI仕様 の Inventory API を参照してください。

イベント

イベントは、Things Cloudを通じてリアルタイム情報を送信するために使用されます。

イベントには、次の3つのタイプがあります。

  • 基本のイベントは、何かが起きたことを通知します。例えば、スイッチのオン/オフでイベントがトリガーされます。
  • アラームは、人手の対応が必要なイベントです。例えば、メーター改ざんを検知したり、冷蔵庫内温度が閾値を超えて調節が必要になった場合などです。
  • 監査ログは、セキュリティに関連した監査に必要なデータを保存します。例えば、ユーザーがゲートウェイにログインする度に監査ログを生成します。

イベントには(命名規則に従った)特定のタイプ(type)、イベントの発生した時間(time)、イベントの内容(text)が含まれます。イベントは、インベントリ内の source で表されるマネージドオブジェクトを含みます。以下がイベント表現の一例になります。

{
    "type": "c8y_LocationUpdate",
    "time": "2010-11-13T18:28:36.000Z",
    "text": "位置が更新されました",
    "source": {
        "id": "47634"
    },
    "c8y_Position": {
        "alt": 67,
        "lng": 6.15173,
        "lat": 51.211977
    }
}

イベントは、マネージドオブジェクトと同様に拡張が可能です。この例ではオブジェクトの情報を通知するだけでなく、新しいオブジェクトの位置を c8y_Position というフラグメントで追加しています。

監査ログは、イベントに次のプロパティを追加したものです。

  • アクティビティを実行したユーザーのユーザー名
  • アクティビティを実行したアプリケーション
  • 実行されたアクティビティ
  • 重大度

以下は監査ログの構成例です。

{
    "type": "c8y_SecurityEvent",
    "time": "2010-11-13T18:28:36.000Z",
    "text": "ゲートウェイのログインに失敗しました",
    "source": {
        "id": "47633"
    },
    "user": "skywalker",
    "application": "Resort energy management",
    "activity": "login",
    "severity": "MINOR"
}

アラームは、イベントに次のプロパティを追加したものです。

  • アラームがアクティブかクリアされたかを示すステータス
  • アラームが最終更新されたタイムスタンプ
  • 重大度の種類(クリティカル/メジャー/マイナー/警告)
  • 監査ログ形式のイベントへの変更履歴

以下はクリアされたアラーム例です。

{
    "count": 1,
    "creationTime": "2020-03-19T12:16:31.586Z",
    "id": "20200301",
    "severity": "MAJOR",
    "source": {
        "id": "251982",
        "name": "My tracking device"
    },
    "status": "CLEARED",
    "text": "必要な間隔内にデバイスからデータを受信しませんでした",
    "time": "2020-03-19T00:00:00.000Z",
    "type": "c8y_UnavailabilityAlarm"
}

詳細情報については、Things Cloud OpenAPI仕様内のEventsAlarmsAuditsで確認できます。

メジャーメント

メジャーメントは、センサーより定期的に取得されるデータや統計を表します。

メジャーメントには計測された時間、メジャーメントを特定するID、フラグメントリストが含まれます。以下はメジャーメントの一例です。

{
  "source": {
    "id": "251982"
  },
  "time": "2020-03-19T12:03:27.845Z",
  "type": "c8y_ElectricityMeasurement",
    "c8y_ThreePhaseElectricityMeasurement": {
        "A+": { "value": 435, "unit": "kWh" },
        "A-": { "value": 23, "unit": "kWh" },
        "P+": { "value": 657, "unit": "W" },
        "P-": { "value": 0, "unit": "W" },
        "A+:1": { "value": 123, "unit": "kWh" },
        "A-:1": { "value": 2, "unit": "kWh" }
    }
}

インベントリモデルと同様に、特定デバイスの特性を識別するためにフラグメントが使われています。各メジャーメントフラグメントは、プロパティとして実際のメジャーメント(シリーズとも呼ばれる)を保持するオブジェクトです。プロパティ名はメジャーメント名に対応し、以下の2つのプロパティを含みます。

  • value: 各シリーズで必須となる、個々のメジャーメントを表す数値
  • unit: メジャーメントに関連付けられている単位

上記の例は、三相電力メーターが異なる電気相ごとに測定値を送信するものです。メジャーメントフラグメントは、個々の測定値名(例:「A+」や「A-」)をメジャーメントの実際の数値と単位にマッピングします。

valueやunitに加え、測定値にはアプリケーションで必要となる様々な追加情報を保持できます。ただし、詳細なカスタム属性をメジャーメント内で使用することは避けてください。代わりに、イベントドメインモデルの利用を推奨します。

詳細情報については、Things Cloud OpenAPI仕様の Measurements を参照してください。

オペレーション

Things Cloud では、デバイスのリモート制御や管理が行えます。

例:

  • デバイス制御:スイッチの設定、熱量制御など
  • デバイス設定:料金表をスマートメーターに設定するなど
  • デバイス保守:ゲートウェイに新しいファームウェアのダウンロードとインストールをリクエストするなど

Things Cloudでは、これらのユースケースは オペレーション をデバイスに送信することで実施されています。

以下は、ID “42” のリレーの状態を “OPEN” に設定するためのオペレーション(一部)です。

{
    "deviceId": "42",
    "c8y_Relay": {
        "state": "OPEN"
    }
}

他のタイプのデータと同様、オペレーションもアプリケーション開発を単純化させるために標準化されています(下記参照)。例えば、スイッチの設定はどんなメーカーのスイッチでも同じものを使用するようにします。

オペレーションは、インベントリモデルのフラグメントと同じように定義されます(上記参照)。ゆえに、同様の拡張概念が適用できます。標準オペレーションと異なるベンダー独自拡張を定義することができます。Things Cloud はこのような独自拡張は拒否せず、変更も行いません。

デバイスにオペレーションを送信する

Things Cloud は信頼性のあるキューイング機構により、どんなネットワーク内でも安全にオペレーションをデバイスへ送信できます。このキューイング機構はどんな IoT ネットワーク規制やセキュリティ条件でも機能します。

  • デバイスの多くは常時利用できない、信頼性の低い、低帯域ネットワークに接続されています。例えば、あるデバイスは一日一度コマンド取得のために、ネットワークへ接続されるかもしれません。そのため、Things Cloud は非同期でデバイスと通信します。

  • デバイスプロトコルは、安全なオンライン通信用に設計されていないことがよくあります。NATネットワーク、ファイアウォール、Web プロキシを通過できなかったり、パブリックネットワークに対応したセキュリティに欠けているものが多くあります。このような場合でも、Things Cloudはデバイスを https クライアントとして接続できるようにします。

  • インターネットを介して、モバイルデバイスにアクセスできない場合もあります。Things Cloud は、これらのデバイスにオペレーションを送信できる push 技術を提供します。

アプリケーションからデバイスからオペレーションを送信するには、下図のようにいくつかのステップを踏む必要があります。例えば、あるユーザーがアプリケーションからリモート制御オペレーション(再起動など)を発信するとします。まずアプリケーションは、Things Cloud でオペレーションを作成します(“ステップ 1”)。Things Cloud は、このオペレーションを実施するためにキューイングし、すぐに制御をアプリケーションに返します。

このデバイスを管轄するエージェントは、ある時点でデバイスにこのオペレーションをリクエストします(“ステップ 2”)。これは Things Cloud の push メカニズムですぐに行われるかもしれませんし、定期的なスケジュールとして予約されるかもしれません。

エージェントは、管理しているデバイスに対してオペレーションを実行します(“ステップ 3”)。そして実行結果を Things Cloud に更新します(“ステップ 4”)。エージェントが管理するデバイスは、エージェントの直接または間接な子(“childDevices”)です。

最後に、アプリケーションはオペレーション結果を問い合わせできます(“ステップ 5”)。監査ログは、デバイス制御オペレーションを実行する初期リクエスト時と、オペレーションが実際に実行された確認の両方で生成されます。

デバイス制御アーキテクチャ

オペレーションをデバイスへ送信する際、通信に問題が起きた場合、エージェントはアラームを発生させる必要があります。

時には、オペレーションのデバイス送信時とそのレスポンスの受信時の間に、ある程度遅延が起こる場合があります。このシステムでは、保守機能に対しエラーが報告されない限り、送信が成功したと仮定します。

信頼性のあるオペレーションを構築

オペレーションはできる限り、常に冪等性を持って構築されるべきです。冪等性とは、何度オペレーションを走らせても同じ結果となること意味します。

例えば、スイッチをある特定の状態にするオペレーションは冪等性があります。スイッチを「オン」にするオペレーションを何度走らせても、結果は「オン」のままだからです。しかし、スイッチを切り替える(変更する)オペレーションは冪等性ではありません。その結果は、オペレーションが奇数回または偶数回実行されたかどうかによって異なります。

詳細については、Things Cloud OpenAPI仕様内の Device control API を参照してください。

まとめ

Things Cloudは、次のIoTシステムの管理・制御モデルを提供します。

  • インベントリ内にIoTデバイス、ネットワークとアセットの一元参照
  • デバイスの構成
  • センサー装置の読み込み
  • 制御オペレーション
  • リアルタイムイベントの制御

このモデルは、デバイスベンダー間の相違を吸収することを意図しています。さらに、多種多様なデバイスやアプリケーションの特殊機能をカバーする拡張性を備えています。