シナリオ: デジタル・ツイン・モデルへのJSONスキーマ検証の追加

カスタムOracle DTDL検証拡張を使用して、JSONスキーマ・データ検証ルールをデジタル・ツイン・モデルのデバイス・ペイロードに適用します。

デジタル・ツイン・モデルの@contextにdtmi:com:oracle:dtdl:extension:validation;1を含めて、検証が必要なコンテンツにValidatedコタイプを追加します。サポートされている検証プロパティを使用して、受信値を制約します。次の例では、数値、文字列、配列およびオブジェクト・フィールド検証を示します。

サポートされている検証プロパティ・ルールの完全なリストは、DTMI検証拡張機能リファレンスを参照してください。

始める前に

必要な権限があり、OCI CLIが構成されていることを確認します。詳細は、「前提条件」、Internet of Things (IoT)プラットフォームのポリシー詳細および複雑な入力のためのJSONファイルの使用を参照してください。

このシナリオのコード・スニペットの理解

次のコード・スニペットは、DTDL v3に基づくデジタル・ツイン・モデルの例であり、カスタムOracle検証拡張の使用方法を示しています。

ステップ1: デジタル・ツイン・モデルの@contextでの検証拡張の定義

デジタル・ツイン・モデルがDTDL仕様v3を使用していることを示す、必要なデジタル・ツイン・モデル・コンテキスト: dtmi:dtdl:context;3

検証拡張を定義するには、デジタル・ツイン・モデルの作成またはデジタル・ツイン・モデルの更新時に、検証拡張を@contextのDTMI URI値に追加します。デジタル・ツイン・モデルは、これらの検証ブロックを読み取って、受信デバイス・データに検証ルールを適用します。検証ルールに失敗したデータはすべて拒否されます。正規化データおよび拒否データは、IoTデータベース・スキーマ内にあります。

{
  "@context": [
    "dtmi:dtdl:context;3",
    "dtmi:com:oracle:dtdl:extension:validation;1"
  ],
  ...
  }

ステップ2: デジタル・ツイン・モデルの要素へのvalidationプロパティの追加

デジタル・ツイン・モデルでは、JSONスキーマ検証仕様を使用して、収集データの検証に検証プロパティを追加します。
  • 文字列や整数などのプリミティブ・プロパティの場合、検証制約は、プロパティまたはテレメトリ定義内のスキーマ・フィールドの横に兄弟プロパティとして追加されます。
  • 配列の場合、検証はminItemsやuniqueItemsなどの配列自体に適用され、配列スキーマの兄弟として定義されます。一方、値の範囲や文字列パターンなどの各要素に適用される制約は、elementSchemaの兄弟プロパティとして配列スキーマ内に配置されます。

次のコード・スニペットをデジタル・ツイン・モデルの例として使用します。サポートされている検証プロパティおよびルールの完全なリストは、DTMI検証拡張機能リファレンスを参照してください。

デジタルツインモデルの例: オプションのセンサーヘルスフィールド

センサーは、最初の正常な読み取りの前にそのステータスを報告することがあります。このモデルでは、読取りが成功するまでlastSuccessTimeを省略できます。ヘルス・オブジェクトには、引き続きerrorCount、staleおよびstateが必要です。

{
  "@context": [
    "dtmi:dtdl:context;3",
    "dtmi:com:oracle:dtdl:extension:validation;1"
  ],
  "@id": "dtmi:com:example:SensorHealth;1",
  "@type": "Interface",
  "displayName": "Sensor Health",
  "contents": [
    {
      "@type": ["Telemetry", "Validated"],
      "name": "health",
      "schema": {
        "@type": "Object",
        "fields": [
          { "name": "errorCount", "schema": "integer" },
          { "name": "lastSuccessTime", "schema": "dateTime" },
          { "name": "stale", "schema": "boolean" },
          { "name": "state", "schema": "string" }
        ],
        "required": ["errorCount", "stale", "state"]
      }
    }
  ]
}

次のhealth値は、オプションのフィールドを省略し、オブジェクトのフィールド要件を満たします。デジタル・ツイン・アダプタを使用して、デバイス・ペイロードをこのコンテンツにマップします。

{
  "errorCount": 0,
  "stale": true,
  "state": "initializing"
}

読取りに成功すると、値にlastSuccessTimeを含めることができます。

{
  "errorCount": 0,
  "lastSuccessTime": "2026-09-24T12:00:00Z",
  "stale": false,
  "state": "ready"
}

stateを省略すると、requiredにリストされているため、この要件は失敗します。"lastSuccessTime": nullの送信は、そのフィールドを省略する代わりにはなりません。オブジェクト・スキーマからrequiredプロパティを削除すると、宣言された4つのフィールドがすべて再度必要になります。

これにより、他のヘルス情報を必須にしながら、読取りが成功したタイムスタンプの発明を回避できます。ルールについては、「必須およびオプションのオブジェクトフィールド」を参照してください。

デジタル・ツイン・モデル・スニペット: オプションでネストされたオブジェクト

このスキーマは、検証拡張を持つモデル内でValidatedコタイプを持つコンテンツに使用します。外部オブジェクトにはstatusが必要ですが、locationを省略できます。locationが存在する場合、そのリストにはsiteおよびbuildingが必要です。roomはオプションのままです。

{
  "@type": "Object",
  "fields": [
    { "name": "status", "schema": "string" },
    {
      "name": "location",
      "schema": {
        "@type": "Object",
        "fields": [
          { "name": "site", "schema": "string" },
          { "name": "building", "schema": "string" },
          { "name": "room", "schema": "string" }
        ],
        "required": ["site", "building"]
      }
    }
  ],
  "required": ["status"]
}

値は、ネストされたオブジェクト全体を省略できます。

{"status": "ready"}

または、ネストされたObjectをオプション・ルームなしで指定できます。

{
  "status": "ready",
  "location": { "site": "example-campus", "building": "A" }
}

buildingのない指定された場所は、ネストされた要件を満たしていません。外部オブジェクトにフィールドをリストしても、ネストされたオブジェクト内のフィールドは制御されません。配列要素およびマップ値のオブジェクトは、この同じ独立検証ルールに従います。

デジタルツインモデルスニペット: 数値検証によるテレメトリ

デジタルツインモデルのこのコードスニペットは、950.0から1050.0までのセンサーからの圧力を有効にする方法を示し、0.1の倍数である必要があります。

{
  "@context": [
    "dtmi:dtdl:context;3",
    "dtmi:com:oracle:dtdl:extension:validation;1"
  ],
  "@id": "dtmi:com:example:Sensor;1",
  "@type": "Interface",
  "displayName": "Example Sensor",
  "contents": [
    {
      "@type": ["Telemetry", "Validated"],
      "name": "pressure",
      "schema": "double",
      "displayName": "Pressure",
      "minimum": 950.0,
      "maximum": 1050.0,
      "multipleOf": 0.1
    }
  ]
  }

デジタル・ツイン・モデル・スニペット: 文字列パターン検証

この例では、特定の文字列パターンに従ってシリアル番号を検証します。この例では、文字列パターンは、受信シリアル番号値が一致する必要がある正規表現です。シリアル番号の値は「SN- 」で始まり、その後に4から8文字の大文字(A-Z)または数字(0-9)が続く必要があり、次の前後に何も許可されません。

"pattern": "^SN-[A-Z0-9]{4,8}$"
{
  "@type": ["Property", "Validated"],
  "name": "serialNumber",
  "schema": "string",
  "pattern": "^SN-[A-Z0-9]{4,8}$"
  }

デジタル・ツイン・モデル・スニペット: 要素制約を使用した配列検証

アラーム・コードは、100から900までの整数の配列である必要があります。配列には少なくとも1つ、5つ以下の項目が含まれ、すべての項目が一意である必要があります。
{
  "@type": ["Property", "Validated"],
  "name": "alarmCodes",
  "schema": {
    "@type": "Array",
    "elementSchema": "integer",
      "minimum": 100,
      "maximum": 900
  },
  "minItems": 1,
  "maxItems": 5,
  "uniqueItems": true
}

デジタルツインモデルスニペット: 明示的検証による倍精度テレメトリ

この例では、値が二重整数である必要があり、-50.0から150.0までの範囲内にあることが検証されます。
{
  "@type": ["Telemetry", "Validated"],
  "name": "temperature_double",
  "schema": "double",
  "minimum": -50.0,
  "maximum": 150.0
}

デジタルツインモデルスニペット: 明示的検証による単精度テレメトリ

この例では、値がfloatである必要があり、値が-50.0から150.0までの指定された範囲内にあることが検証されます。
{
  "@type": ["Telemetry", "Validated"],
  "name": "temperature_float",
  "schema": "float",
  "minimum": -50.0,
  "maximum": 150.0
}

デジタル・ツイン・モデル・スニペット: タイプ、範囲およびステップ検証によるテレメトリ

この例では、値がdouble、整数、および0から360の度、および0.1の増分であることを検証します。

{
  "@type": ["Telemetry", "Validated"],
  "name": "angle",
  "schema": "double",
  "minimum": 0.0,
  "maximum": 360.0,
  "multipleOf": 0.1
}