ファイル コンテンツ

このページでは、Manufacturing Data Engine(MDE)のパッケージにある各構成パッケージ フォルダの内容について説明します。

MDE は、各構成パッケージ フォルダに構成オブジェクトごとに 1 つの JSON ファイルがあることを想定しています。2 つのバケットを作成する場合は、2 つの別々のファイルが必要です。ファイル名は無視されます。ただし、作成する構成オブジェクト名でファイルに名前を付けることをおすすめします。各オブジェクトの実際の JSON スキーマは、作成する構成エンティティのタイプによって異なりますが、対応する API レスポンスの JSON スキーマと一致します。

構成パッケージをさらに整理するには、特定のフィールドの下にファイルに埋め込む他の JSON ファイルを参照できます。たとえば、次の JSON は、スキーマが別の JSON ファイルで定義されているスキーマを持つ MDE バケットを指定します。これにより、構成パッケージの全体的な読みやすさと保守性が向上します。


{
  "type": "TAG",
  "name": "second-tag-bucket",
  "attributes": {
    "instanceOverwriteMode": "true"
  },
  "versions": [
    {
      "version": 1,
      "schema": "'{{schemas/generic-schema.json}}'",
      "provider": "local",
    }
  ]
}

別のファイルを参照するには、既存のファイルに含める必要があるファイルの相対パスを含む {{relative-path/file.json}} ディレクティブを使用します。MDE はファイルを解決し、参照ディレクティブを含むフィールドの値として JSON コンテンツを含めます。前の例の schema フィールドの値には、ファイルの内容と一致する JSON サブオブジェクトが埋め込まれます。

特定のオブジェクトについては、JSON コンテンツを文字列として埋め込む必要があります。たとえば、バケット オブジェクトの schema フィールドでは、バケット スキーマを文字列として埋め込む必要があります。この場合、参照ディレクティブは一重引用符 ' で囲む必要があります。これにより、MDE は内容を未処理の文字列として埋め込むよう指示されます。参照ディレクティブは '{{relative-path/file.json}}' になります。

参照されるファイルは任意のディレクトリに配置できます。整理のために、さまざまなディレクトリを作成することもできます。たとえば、前の例の schemas というディレクトリは、共通のファイルをグループ化するための任意のフォルダ構造です。埋め込むことができるファイルの種類は、Whistle スクリプトの場合は JSON または WSTL です。

各 MDE エンティティの構成例を次に示します。

バケット

このセクションでは、MDE バケットの構成例を示します。


{
  "type": "TAG",
  "name": "second-tag-bucket",
  "attributes": {
    "instanceOverwriteMode": "true"
  },
  "versions": [
    {
      "version": 1,
      "schema": "'{{schemas/generic-schema.json}}'",
      "provider": "local"
    }
  ]
}


取り込み仕様

このセクションでは、MDE 取り込み仕様の構成例を示します。


{
    "name": "csv-full-ingestion-specification",
    "source": "CSV",
    "folderName": "test-csv-folder",
    "separator": ",",
    "skipRows": 10,
    "headers": {
        "headerNames": {
            "names": [
                "one",
                "two",
                "three"
            ]
        }
    },
    "insertMetadata": true,
    "disabled": false
}

メッセージ クラス

このセクションでは、MDE メッセージ クラスの構成例を示します。


{
  "name": "default-numeric-message-class",
  "priority": 970,
  "expression": "#root.event['value'] instanceof T(Number) && #root.event['timestamp'] != null && #root.event['tagName'] != null && #root.event['cluster'] == null"
}

メタデータ インスタンス

このセクションでは、MDE メタデータ インスタンスの構成例を示します。


{
    "bucketReference": {
        "bucketName": "default-tag-bucket",
        "bucketType": "TAG",
        "version": 1
    },
    "naturalKey": "cloud-natural-key",
    "instance": {
        "site": "simulated-site",
        "factory": "test-factory"
    }
}

パーサー

このセクションでは、MDE パーサーの構成例を示します。


{
  "name": "default-numeric-parser",
  "messageClassName": "default-numeric-message-class",
  "typeReference": {
    "name": "default-numeric-type",
    "version": 1
  },
  "disabled": false,
  "script": "'{{scripts/parser-script.wstl}}'"
}

タイプ

このセクションでは、MDE タイプの構成例を示します。


{
  "archetype": "NUMERIC_DATA_SERIES",
  "name": "default-numeric-type",
  "disabled": false,
  "versions": [
    {
      "version": 1,
      "dataSchema": "",
      "storageSpecs": [
        {
          "sink": "PUBSUB_PROTO",
          "disabled": true,
          "materializeCloudMetadata": false
        },
        {
          "sink": "BIG_QUERY",
          "disabled": false,
          "materializeCloudMetadata": true
        },
        {
          "sink": "GCS",
          "disabled": false,
          "materializeCloudMetadata": false
        },
        {
          "sink": "PUBSUB_JSON",
          "disabled": true,
          "materializeCloudMetadata": false
        },
        {
          "sink": "BIG_TABLE",
          "disabled": false,
          "materializeCloudMetadata": false
        }
      ],
      "metadataBuckets": [
        {
          "bucketName": "default-record-bucket",
          "version": 1,
          "required": false
        },
        {
          "bucketName": "second-tag-bucket",
          "version": 1,
          "required": false
        },
        {
          "bucketName": "default-tag-bucket",
          "version": 1,
          "required": false
        }
      ],
      "transformations": [
        {
          "window": {
            "id": "10-minutes-window",
            "durationMinutes": 10,
            "valueExpression": "#message['data']['numeric'].toString()"
          }
        },
        {
          "eventChange": {
            "keyExpression": "#message['tagName']",
            "valueExpression": "#message['data']['numeric'].toString()"
          }
        }
      ]
    }
  ]
}