シミュレーション構成ファイル¶
FIWARE Device Simulatorのコマンドラインツールの説明で説明したように、シミュレーションは、-c オプションを使用してコマンドライン・ツールに渡される、構成ファイルによって記述されます。
シミュレーション構成ファイルは、実行するシミュレーションの特性を詳述する JSON 形式のテキストファイルです。
次に、その形状を垣間見るためのシミュレーション設定ファイルの例を示します。その後、プロパティとオプションが適切に詳細に示されます。
{
"domain": {
"service": "theService",
"subservice": "/theSubService"
},
"contextBroker": {
"protocol": "https",
"host": "localhost",
"port": 1026,
"ngsiVersion": "1.0"
},
"authentication": {
"provider": "keystone",
"protocol": "https",
"host": "localhost",
"port": 5001,
"user": "theUser",
"password": "thePassword",
"retry": {
"times": 10,
"interval": 1000
}
},
"iota": {
"ultralight": {
"api_key": "1ifhm6o0kp4ew7fi377mpyc3c",
"http": {
"protocol": "http",
"host": "localhost",
"port": 8085
},
"mqtt": {
"protocol": "mqtt",
"host": "localhost",
"port": 1883,
"user": "mqttUser",
"password": "mqttPassword"
}
},
"json": {
"api_key": "83ut64ib3gzs6km6izubjyenu",
"http": {
"protocol": "http",
"host": "localhost",
"port": 8185
},
"mqtt": {
"protocol": "mqtt",
"host": "localhost",
"port": 1883,
"user": "mqttUser",
"password": "mqttPassword"
}
}
},
"entities": [{
"schedule": "once",
"entity_name": "EntityName1",
"entity_type": "EntityType1",
"active": [{
"name": "active1",
"type": "date",
"value": "date-increment-interpolator({\"origin\": \"now\", \"increment\": 3600})"
}],
"staticAttributes": [{
"name": "static1",
"type": "string",
"value": "Value of static1"
}]
}, {
"schedule": {
"start": "2016-10-19T10:00:00Z",
"end": "2016-10-19T11:00:00Z",
"rule": "*/5 * * * * *"
},
"entity_name": "EntityName2",
"entity_type": "EntityType2",
"active": [{
"name": "active1",
"type": "geo:json",
"value": "multiline-position-interpolator({\"coordinates\": [[-6.2683868408203125,36.48948933214638],[-6.257915496826172,36.46478162030615],[-6.252079010009766,36.461744374732085],[-6.2162017822265625,36.456774079889286]],\"speed\": {\"value\": 30,\"units\": \"km/h\"},\"time\": {\"from\": 10,\"to\": 22}})"
}, {
"schedule": "*/1 * * * * *",
"name": "active2",
"type": "number",
"value": "time-linear-interpolator({\"spec\": [[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]], \"return\": {\"type\": \"float\"}})"
}],
"staticAttributes": [{
"name": "static1",
"type": "string",
"value": "Value of static1"
}]
}, {
"count": "3",
"entity_type": "EntityType3",
"schedule": "*/1 * * * * *",
"active": [{
"name": "active1",
"type": "number",
"value": "time-random-linear-interpolator({\"spec\": [[0,0],[20,random(25,45)],[21,random(50,75)],[22,100],[24,0]], \"return\": {\"type\": \"float\"}})"
}, {
"schedule": "*/5 * * * * *",
"name": "active2",
"type": "number",
"value": "time-step-after-interpolator([[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]])"
}],
"staticAttributes": [{
"name": "static1",
"type": "percentage",
"value": "time-step-before-interpolator([[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]])"
}, {
"name": "static2",
"type": "status",
"value": "text-rotation-interpolator({\"units\": \"seconds\", \"text\": [[0,\"PENDING\"],[15,\"REQUESTED\"],[30,[[50,\"COMPLETED\"],[50,\"ERROR\"]]],[45,\"REMOVED\"]]})"
}]
}],
"devices": [{
"schedule": "once",
"protocol": "UltraLight::HTTP",
"device_id": "DeviceId1",
"attributes": [{
"object_id": "a1",
"value": "date-increment-interpolator({\"origin\": \"now\", \"increment\": 3600})"
}]
}, {
"schedule": "*/5 * * * * *",
"protocol": "UltraLight::JSON",
"device_id": "DeviceId2",
"api_key": "1ifdjdo0kkd7w77du77mpjd78",
"attributes": [{
"object_id": "a1",
"value": "multiline-bearing-interpolator({\"coordinates\": [[-6.2683868408203125,36.48948933214638],[-6.257915496826172,36.46478162030615],[-6.252079010009766,36.461744374732085],[-6.2162017822265625,36.456774079889286]],\"speed\": {\"value\": 30,\"units\": \"km/h\"},\"time\": {\"from\": 10,\"to\": 22}})"
}, {
"schedule": "*/1 * * * * *",
"object_id": "a2",
"value": "time-linear-interpolator({\"spec\": [[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]], \"return\": {\"type\": \"integer\", \"rounding\": \"ceil\"}})"
}]
}, {
"count": "5",
"schedule": "*/1 * * * * *",
"entity_type": "DeviceType3",
"protocol": "UltraLight::MQTT",
"api_key": "ag235jdo0kkhd367du77mpgs54",
"attributes": [{
"object_id": "a1",
"value": "time-random-linear-interpolator({\"spec\": [[0,0],[20,random(25,45)],[21,random(50,75)],[22,100],[24,0]], \"return\": {\"type\": \"integer\", \"rounding\": \"ceil\"}})"
}, {
"schedule": "*/5 * * * * *",
"object_id": "a2",
"value": "time-step-after-interpolator([[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]])"
}]
}]
}
シミュレーション構成ファイルは、次の JSON プロパティまたはエントリを受け入れます :
- exports: FIWARE Device Simulationは、テキストをシミュレーション構成ファイルに繰り返さないようにして、ファイルの編集を容易にするテンプレートメカニズムを提供します。このテンプレートのメカニズムについての詳細は、シミュレーション構成ファイルで使用される残りのプロパティの説明の直後にあります
- globals: グローバル状態変数とそれらの初期値を含むオブジェクトは、その仕様にかかわらず、
attribute-function-interpolatorの実行の間に共有されます。このプロパティは、以下に詳述するattribute-function-interpolatorに関連しており、そのセクションに到達するとはるかに明確になります - require: シミュレーションを実行する前に NPM パッケージの名前および/またはパスの配列が必要です。このプロパティは、
attribute-function-interpolatorインターポレータに関連しており、以下に詳述するexternalプロパティ内のcollectorエントリにも関係しています。これにより、require()これらのNPMパッケージを、これらのattribute-function-interpolatorインターポレータおよびコレクタに関連付けられたコードで直接入れることが可能になります。 - domain: リクエストに使用するサービスおよびサブサービス、つまり、サービスパスに関する情報が含まれます。エンティティがシミュレーション設定に含まれている場合は必須です。下記を参照してください
- service: リクエストで使用するサービス
- subservice: リクエストで使用するサブサービス。つまり、サービスパス
- contextBroker: データが格納される Context Broker に関する情報が含まれます。
entitiesがシミュレーション設定(以下を参照)に含まれ、subscriber設定情報が含まれていない場合(以下を参照)は必須です- protocol: Context Broker がリクエストを送信することを期待しているプロトコル。または、具体的にはContext Broker API へのアクセスを保護する PEP
- host: Context Broker が実行されているホスト・マシン名または IP アドレス。または、具体的にはContext Broker API へのアクセスを保護する PEP
- port: Context Broker のホスト・マシンが API リクエストをリスンしているポート。または、具体的には、Context Broker API へのアクセスを保護する PEP
- ngsiVersion: Context Broker に送信されるリクエストで使用される NGSI バージョン。現在、バージョン
1.0と2.0がサポートされています
- subscriber: データが通知されるサブスクライバに関する情報が含まれます。
entitiesがシミュレーション設定(以下を参照)に含まれており、contextBrokerの設定情報が含まれていない場合は必須です。contextBrokerとsubscriber設定情報を含める場合は、contextBrokerがサブスクライバに優先し、通知は設定されたサブスクライバに送信されません- protocol: サブスクライバが通知リクエストを送信することを期待しているプロトコル
- host: サブスクライバが実行されているホストのマシン名または IP アドレス
- port: サブスクライバのホスト・マシンが通知リクエストを待機しているポート
- path: サブスクライバのホスト・マシンが通知リクエストを待機しているパス
- ngsiVersion: サブスクライバに送信される通知リクエストで使用される NGSI バージョン。現在のところ、バージョン
1.0のみがサポートされています
- authentication: Context Broker のリクエストにトークンを含めるための Identity Service に関する情報が含まれています。オプション。認証トークンは、
authentication情報が含まれている場合にのみリクエストされます- provider: 認証トークンをリクエストする Identity Service プロバイダ。設定可能な値は、テレフォニカIoTプラットフォームのトークンをリクエストする
keystoneおよび、FIWARE Lab cloud infrastructure のトークンをリクエストするfiware-lab()です - protocol: Identity Service がリクエストを送信することを期待しているプロトコル
- host: Identity Service が実行されているホスト・マシンまたは IP
- port: Identity Service がリクエストをリスンするポート
- user: 提供されたサービスとサブサービスの認可トークン・リクエストで使用されるユーザです
- password: 提供されたサービスとサブサービスに対する許可トークン・リクエストで使用されるパスワード
- retry: 認証トークンをリクエストするときにエラーが発生した場合のリトライ・メカニズム。
async.retry()関数に基づいています。これは、次のプロパティを含むオブジェクトです- times: シミュレーションをやめて終了するまでの試行回数。
retryプロパティが含まれている場合は必須です - interval: リトライ間の待機時間。ミリ秒単位。
retryプロパティが含まれている場合は必須です
- times: シミュレーションをやめて終了するまでの試行回数。
- provider: 認証トークンをリクエストする Identity Service プロバイダ。設定可能な値は、テレフォニカIoTプラットフォームのトークンをリクエストする
- iota: デバイスの更新に使用される IoT Agents に関する情報が含まれます。デバイスを記述する
devicesプロパティがシミュレーション設定に含まれている場合は必須です-
ultralight: Ultra Light IoT Agents の構成に関する情報が含まれています。UltraLight デバイス (
UltraLight::で始まるprotocolプロパティ) を記述するdevicesプロパティがシミュレーション設定に含まれている場合は必須です- api_key: ローカルレベルで API キーが指定されていない Ultra Light デバイスを更新するときに使用する API キー。下記を参照してください。ローカルレベルで API キーが指定されていない Ultra Light デバイスが少なくとも1つ含まれている場合は必須です
- http: UltraLight プロトコル用の HTTP バインディングの設定に関する情報が含まれています。UltraLight HTTPデバイス(
protocolプロパティがUltraLight::HTTP)、または Ultra Light JSON デバイス(protocolプロパティがUltraLight::JSON)を記述するdevicesプロパティがシミュレーション設定に含まれている場合は、必須です- protocol: UltraLight HTTP IoT Agent がリクエストの送信を期待しているプロトコル
- host: UltraLight HTTP IoT Agent がリクエストをリスンするホスト・マシン
- port: Ultra Light HTTP IoT Agent がリクエストをリスンするポート
-
mqtt: Ultra Light プロトコル用の MQTT バインディングの構成に関する情報が含まれています。UltraLight MQTTデバイスを記述する
devicesプロパティ(protocolプロパティがUltraLight::MQTT) がシミュレーション構成に含まれている場合は必須です- protocol: 使用されるトランスポートプロトコル。可能な値は次のとおりです :
mqtt,mqtts,tcp,tls,ws,wss - host: Ultra Light MQTT IoT Agent がリクエストをリスンするホスト・マシン
-
port: Ultra Light MQTT IoT Agent がリクエストをリスンするポート
-
user: MQTT 認証通信に使用するユーザ。オプション
- password: MQTT 認証通信に使用するパスワード。オプション
- json: JSON IoT Agent の設定に関する情報が含まれています。UltraLightデバイスを記述する
devicesプロパティ(JSON::で始まるprotocolプロパティ)がシミュレーション設定に含まれている場合は必須です- api_key: API キーがローカルレベルで指定されていない JSON デバイスを更新するときに使用される API キー。下記を参照してください。ローカルレベルで API キーが指定されていない JSON デバイスが少なくとも1つ含まれている場合は必須です
- json: JSON IoT Agent の設定に関する情報が含まれています。UltraLightデバイスを記述する
- protocol: 使用されるトランスポートプロトコル。可能な値は次のとおりです :
-
http: JSON プロトコルの HTTP バインディングの設定に関する情報が含まれています。JSON HTTPデバイスを記述する
devicesプロパティ(protocolプロパティがJSON::HTTP)がシミュレーション設定に含まれている場合は必須です- protocol: JSON HTTP IoT Agent がリクエストを送信することを期待しているプロトコル
- host: JSON HTTP IoT Agent がリクエストをリスンするホスト・マシン
- port: JSON HTTP IoT Agent がリクエストをリスンするポート
- mqtt: JSON プロトコル用の MQTT バインディングの設定に関する情報が含まれています。JSON MQTT デバイスを記述する
devicesプロパティ(protocolプロパティがJSON::MQTT)がシミュレーション設定に含まれている場合は必須です- protocol: プロトコル : 使用されるトランスポートプロトコル。可能な値は次のとおりです。
mqtt,mqtts,tcp,tls,ws,wss- host: JSON MQTT IoT Agent がリクエストをリスンするホスト・マシン
- port: JSON MQTT IoT Agent がリクエストをリスンするポート
- user: MQTT 認証通信に使用するユーザ。オプション
- password: MQTT 認証通信に使用するパスワード。オプション
- protocol: プロトコル : 使用されるトランスポートプロトコル。可能な値は次のとおりです。
- entities: 具体的なシミュレーション中に更新されるエンティティに関する情報
- schedule: エンティティの更新をスケジュールするための Cron 形式のスケジュール(https://www.npmjs.com/package/node-schedule#cron-style-scheduling による)。例えば :
*/5 * * * * *は、5秒ごとにスケジュール情報がないエンティティの属性を更新します。0 0 0 * * *は、毎月の最初の日の00:00にスケジュール情報がないエンティティの属性を更新します。cron スタイルのスケジュールを扱うための非常に便利なツールは http://crontab.guru/ にあります。onceは、シミュレーションの開始時に一度だけエンティティの更新を強制します。schedule属性は、プロパティは、次のようなスケジュールの開始日と終了日を含むオブジェクトも受け入れます :"schedule": {"start": "2016-10-19T10:47:00Z", "end": "2016-10-19T11:47:00Z", "rule": "*/5 * * * * *"}。以前のscheduleは2016-10-19T10:47:00Zから2016-10-19T11:47:00Zまで有効です - entity_name: エンティティの名前。
countが提供されている場合は、entity_nameを指定しないでください - count: シミュレーションおよび更新するエンティティの数。例えば、
count属性として 3 の値が提供されている場合、<entity_type>:1,<entity_type>:2および<entity_type>:3という名前の3つのエンティティは、<entity_type>をその提供された値に置き換えて、アクティブおよびスタティック属性シミュレーション仕様に従って、作成して更新されます - entity_type: エンティティのタイプ
- active :
scheduleまたは 主要エンティティのscheduleと、提供されたvalueに従って更新される属性のリスト
- schedule: エンティティの更新をスケジュールするための Cron 形式のスケジュール(https://www.npmjs.com/package/node-schedule#cron-style-scheduling による)。例えば :
- schedule: この属性を更新するスケジュール。上記のエンティティ・レベルの
scheduleプロパティを参照してください。これはオプションのプロパティです。指定されていない場合は、エンティティレベルのscheduleプロパティが使用されます - name: 属性の名前
- type: 属性のタイプ
-
value: 属性の値。これは、FIWARE Device Simulator tool に柔軟性とリアリティを提供するプロパティです。これは、FIWARE Device Simulator tool が最終的な値を生成するために使用する、スタティックな値(
123のような数字、the attribute valueのようなテキスト、[1, 2, 3]のような配列、{"key": "value"}のようなJSONオブジェクトなど)、インターポレータ関数(補間関数)の仕様などを受け入れます。サポートされているインターポレータ関数の仕様は次のとおりです :date-increment-interpolator: UTC 形式の日付を返します。一方、2つのプロパティを含む JSON オブジェクトを受け取ります : 1)origin: 日付がインクリメントされるときの日付、または値が補間される現在の日付のnowと、2)increment: 起点をインクリメントする秒数。たとえば、次のような日付インクリメント補間仕様として、{\"origin\": \"now\", \"increment\": 86400}は、現在の時間を86400秒で増分します。これは、補間値の更新がリクエストされたときで1日です。たとえば、date-increment-interpolatorを使用する属性値の例は、ate-increment-interpolator({\"origin\": \"now\", \"increment\": 2592000})ですmultiline-position-interpolator: 座標を含むPointタイプの GeoJSON ジオメトリとして、現在のDecimal hours のモバイル・オブジェクトの現在の位置をデフォルトで返します。戻り値は、returnプロパティをgeo:pointに設定するgeo:pointとして取得することもできます。 これに関して、以下の特性を含むオブジェクトをとります:coordinates: ポイントの配列、これはポイントの経度と緯度に対応する2要素配列の配列です。このポイント間の接続によって、モバイル・オブジェクトが移動するラインまたはルートが決定されます。これは円形または円形ではないルートです。この場合、モバイル・オブジェクトは終点に達すると最初からルートを開始しますspeed: 以下のプロパティを含むオブジェクト :value: モバイル・オブジェクトが移動する速度に対応する数units: 速度の単位に対応する文字列。有効な値は、km/h(時間当たりのキロメータ) とmi/h(時間当たりのマイル) です
time: 以下のプロパティを含むオブジェクト :from: モバイル・オブジェクトが移動する decimal hours に対応する数字。現在の decimal hours がfromの前にある場合、補間された位置が開始点になりますto: モバイル・オブジェクトが移動するまでの [decimal hours に対応する数。現在のdecimal hours がtoの後にある場合、移動距離はこの decimal hours まで計算されます
return: 次のいずれかの値を含む文字列 : GeoJSON ポイントとして補間値を取得するためのgeo:jsonです。これがデフォルトの動作です。または、補間された値をgeo:pointとして取得するためのgeo:pointです。これは、GeoJSON ポイント値の座標配列を文字列として返しますmultiline-position-interpolatorを使用した属性値の例を次に示します :"multiline-position-interpolator({\"coordinates\": [[-6.2683868408203125,36.48948933214638],[-6.257915496826172,36.46478162030615],[-6.252079010009766,36.461744374732085],[-6.2162017822265625,36.456774079889286]],\"speed\": {\"value\": 30,\"units\": \"km/h\"},\"time\": {\"from\": 10,\"to\": 22}})".
multiline-bearing-interpolator:coordinatesを含むPointタイプの GeoJSON ジオメトリとして、現在の decimal hour のモバイル・オブジェクトの位置のベアリングをデフォルトで返します。これに関して、以下の特性を含むオブジェクトをとります :coordinates: ポイントの配列、これはポイントの経度と緯度に対応する2要素配列の配列です。このポイント間の接続によって、モバイル・オブジェクトが移動するラインまたはルートが決定されます。これは円形または円形ではないルートです。この場合、モバイル・オブジェクトは終点に達すると最初からルートを開始しますspeed: 以下のプロパティを含むオブジェクト :value: モバイル・オブジェクトが移動する速度に対応する数units: 速度の単位に対応する文字列。有効な値は、km/h(時間当たりのキロメータ) とmi/h(時間当たりのマイル) です
time: 以下のプロパティを含むオブジェクト :from: モバイル・オブジェクトが移動する decimal hours に対応する数字。現在の decimal hours がfromの前にある場合、補間された位置が開始点になりますto: モバイル・オブジェクトが移動するまでの decimal hours に対応する数。現在のdecimal hours がtoの後にある場合、移動距離はこの decimal hours まで計算されます
- たとえば、
multiline-bearing-interpolatorを使用した属性値の例を次に示します :"multiline-bearing-interpolator({\"coordinates\": [[-6.2683868408203125,36.48948933214638],[-6.257915496826172,36.46478162030615],[-6.252079010009766,36.461744374732085],[-6.2162017822265625,36.456774079889286]],\"speed\": {\"value\": 30,\"units\": \"km/h\"},\"time\": {\"from\": 10,\"to\": 22}})".
time-linear-interpolator: 設定に応じて浮動小数点数または整数値を返します。一方、次のプロパティを含むオブジェクトを受け入れます :spec: 日の decimal hours と指定された値に対応する2要素の配列の配列。例えば、次のような時間線形インターポレータ仕様です : 補間された値が00:00時にリクエストされたとき、[[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]]は、0を返します。補間された値が20:00' 時にリクエストされたときは、'0.25' です。x 軸の [decimal hours](https://en.wikipedia.org/wiki/Decimal_time#Decimal_hours) として、補間された値が0から20までのリニア補間に従って10:00時に要求されたときは、'0.125’です。これは、任意の日の利用可能な [decimal hours](https://en.wikipedia.org/wiki/Decimal_time#Decimal_hours) に応じて、x軸の0および24の値を提供するtime-linear-interpolator`が通常指定されるためですreturn: 以下のプロパティを含むオブジェクトです :type: インターポレータの戻り値のタイプ。次のいずれかの値を取ることができます :floatまたは、integerrounding: タイプがintegerの場合、丸めメカニズムも指定する必要があります。次のいずれかの値を取ることができます :ceil,floorまたはround
time-linear-interpolatorを使用する可能性のある属性値 :"time-linear-interpolator({\"spec\": [[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]], \"return\": {\"type\": \"integer\", \"rounding\": \"ceil\"}})".- このインターポレータはリニアなもの (より具体的には linear-interpolator パッケージ に依存) です。開始時(0,1,2 等)または 終了時(22, 23, 24)が見つからない場合、その動作は期待されたものではない可能性があります。具体的な例を見てみましょう:
time-linear-interpolator({\"spec\": [[8,0],[12,100],[22,0]], \"return\": {\"type\": \"float\"}})。この場合、0 から 8 までの decimal hours のリニア自然値が負(直線的に)であるため、decimal hours の 8 から 12 の値は 0 から 100 (直線的に)になり、decimal hours の 12 から 22 の値は 100 から 0 (直線的に) になり、そして、また、decimal hours は 22 から 24 までは負 (直線的に) になります
-
time-random-linear-interpolator: 設定に応じて浮動小数点数または整数値を返します。一方、次のプロパティを含むオブジェクトを受け入れます :spec: 日の decimal hours と指定された値に対応する2要素の配列の配列- 配列の最初の要素には
random()ディレクティブが含まれています。例えば、以下のようなランダム時間リニア・インターポレータの仕様です :[[random(0,1),0],[random(23,24),100]]はtime-linear-interpolatorとして動作し、このインターポレータが呼び出されるたびに、ランダムな部分が具体的なランダム decimal hours の値に置き換えられます。例えば、前のインターポレータの後続の呼び出しは、以下time-linear-interpolatorのように振舞うことになるかもしれません :[0.410237338161096,0],[23.268972319317982,100]],[0.192138821585104,0],[23.442964296089485,100]],[0.223540030419827,0],[23.614114402793348,100]], などtime-random-linear-interpolatorを使用する属性値の例は :"random-time-linear-interpolator({\"spec\": [[random(12,13),0],[random(20,21),100]], \"return\": {\"type\": \"integer\", \"rounding\": \"ceil\"}})".- このインターポレータはリニアなもの (より具体的には linear-interpolator パッケージ に依存) です。開始時刻(0,1,2など) または、終了時刻(22,23,24) のエントリの一部が不足している場合、その動作は期待されたものではない可能性があります。 具体的な例を見てみましょう:
random-time-linear-interpolator({\"spec\": [[random(12,13),10],[random(20,21),100]], \"return\": {\"type\": \"float\"}})。この場合、0 から 12 までの decimal hours のリニアな性質値のために、負の値を含む10未満 (直線的に、12 の decimal hours を超えてもよい乱数係数を含む) になります。13 から 20までの decimal hours の値は 0 から 100 の間になります(リニアであり、ランダム性係数によれば、それは 13 より前で 20 decimal hours を超える可能性があります)。21 から 24の decimal hours は 100 より大きくなります (リニアであり、ランダム性係数によれば、21 decimal hours 以下になる可能性があります)
- 配列の第2要素または指定された値には、
random()ディレクティブが含まれています。例えば、以下のような時間ランダム・リニア・インターポレータの仕様です:補間値が00:00時にリクエストされた場合、[[0,0],[20,random(0.25,0.50)],[24,1]]は0を返し、補間値が20:00時にリクエストされた場合は、0.25より大きく、0.50より小さい乱数を返し、00:00時と20:00時との間の時間にリクエストされた場合、前のy軸値間の対応する補間値を返します。これは、time-random-linear-interpolatorは、通常、任意の日の利用可能な decimal hoursに応じて、x 軸の 0 および 24 値の値を提供するように指定されるためですtime-random-linear-interpolatorを使用する可能性のある属性値は、"time-random-linear-interpolator({\"spec\": [[0,0],[20,random(25,45)],[21,random(50,75)],[22,100],[24,0]], \"return\": {\"type\": \"integer\", \"rounding\": \"ceil\"}})".- このインターポレータはリニアなもの (より具体的には linear-interpolator パッケージ に依存) なので、開始時(0,1,2 等)、または終了時(22, 23, 24)が見つからない場合、その動作は期待されたものではない可能性があります。具体的な例を見てみましょう :
"time-random-linear-interpolator({\"spec\": [[8,random(0,10)],[12,random(90,100)],[22,random(0,10)]], \"return\": {\"type\": \"float\"}})"。この場合、0 から 8までの decimal hours のリニアな性質値のために、負の値を含む 10 未満(リニアに乱数係数を含みます)になります。8 から12 の decimal hours の値は 0 から 100 の間になります(リニアにもランダム性係数による)。12 から 22 の decimal hours の値は 100 と 0 の間になります(リニアにもランダム性係数による)。そして、22 から 24 の decimal hours の値は、負の値も含めて10未満(リニアにもランダム性係数による)になります
- この
random()ディレクティブは、配列指定の最初の要素、2番目の要素、または両方で使用できます。この場合、動作は結合されたものです。したがって、"time-random-linear-interpolator({\"spec\": [[random(0,1),0],[20,random(25,45)],[random(21,22),random(50,75)],[22,100],[24,0]], \"return\": {\"type\": \"integer\", \"rounding\": \"ceil\"}})"は、完全に有効なtime-random-linear-interpolatorです
- 配列の最初の要素には
return: 以下のプロパティを含むオブジェクトです :type: インターポレータの戻り値の型。次のいずれかの値を取ることができます :floatまたは、integerrounding: タイプがintegerの場合、丸めメカニズムも指定する必要があります。次のいずれかの値を取ることができます :ceil,floorまたはround
-
time-step-after-interpolator: 浮動小数点数を返します。一方、1日の decimal hours とその指定された値に対応する2要素配列の配列を受け取ります。例えば、次のようなインターポレータ指定後のタイムステップは :[[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]]は、補間値が00:00時にリクエストされた場合は0を返し、補間値が20:00時にリクエストされた場合は0.25を返し、00:00時と20:00時の間の任意の時刻に補間値がリクエストされた場合は0を返します ("step-after" と呼ばれていることに注目してください)。time-step-after-interpolatorが、任意の日の利用可能な [decimal hours](https://en.wikipedia.org/wiki/Decimal_time#Decimal_hours) に応じて x 軸の 0 および 24 値の値を指定することが一般的に指定されている理由です。time-step-after-interpolatorを使用して受け入れられる属性値の例は :time-step-before-interpolator([[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]])` time-step-before-interpolator:float値を返します。 一方、1日の decimal hours とその指定された値に対応する2要素配列の配列を受け取ります。たとえば、次のようなインターポレータ指定の前の時間ステップ :[[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]]は、補間値が00:00時にリクエストされた場合は0を返し、補間値が20:00時にリクエストされた場合は0.25を返し、補間値が00:00時と20:00時の間の任意の時刻に要求された場合は0.25を返します("step-after" と呼ばれていることに注目してください)。time-step-before-interpolatorが、任意の日の利用可能な decimal hours に応じて、x 軸の 0 および 24 値の値を指定することが一般的に指定されている理由です。time-step-before-interpolatorを使用して受け入れられる属性値の例は :time-step-before-interpolator([[0,0],[20,0.25],[21,0.50],[22,0.75],[23,1],[24,1]])text-rotation-interpolator: 可能性のある値のセットから文字列を返し、それらの確率的な出現をサポートします。一方、次のプロパティを含むオブジェクトを受け入れます :units: これは、以下で説明するテキスト・プロパティに影響を与える文字列です。 次の値を受け入れます : 'seconds', 'minutes', 'hours', 'days' (day of the week), 'dates' (day of the month), 'months'と 'yearstext: これは2要素配列の配列です。最初の要素は、unitsプロパティに従って、seconds(0〜59),minutes(0〜59),hours(0〜23),days(0〜6), 'dates' (1〜31),months(0〜11) とyears(通年)、現在の日付と時刻に指定されたテキストが返されます。2番目の要素は、返されるテキストに対応する文字列または2要素配列の配列です。この2番目の2要素配列の最初の要素は、配列の2番目の要素として指定されたテキストの出現確率 (0〜100) です。 最初の要素配列の追加は 100 でなければなりませんtext-rotation-interpolatorを使用して可能な属性値は次のとおりです :"text-rotation-interpolator({\"units\": \"seconds\", \"text\": [[0,\"PENDING\"],[15,\"REQUESTED\"],[30,[[50,\"COMPLETED\"],[50,\"ERROR\"]]],[45,\"REMOVED\"]]})". たとえば、このテキストの回転補間指定に従って、現在の秒が 0 から 15 の間であれば、PENDING値を返します.15 から 30 の間であればREQUESTED値を返し、30 から 45 の間であれば、50%の確率でCOMPLETED値、50%の確率でERROR値を返します
-
attribute-function-interpolator: いくつかの Javascript コードの評価結果を返します。このコードには、 Context Broker に格納されているエンティティの属性値への参照が含まれる場合があります。このインターポレータは、評価するために JavaScript コードで文字列 (適切にエスケープされた) を受け入れます。この Javascript コードでは、エンティティの属性値への参照は、次の表記を使用して含めることができます :${{<entity-id>:#:<entity-type>}{<attribute-name>}},<entity-id>,<entity-type>, および<attribute-name>を具体的な値で置き換えます。エンティティのタイプ指定(例 ::#:セパレータを含む:#:<entity-type>)はオプションであり省略することができることに注意してください。この場合、エンティティと Context Broker からの対応する属性値の取得時にエンティティ・タイプは考慮されませんattribute-function-interpolatorを使用した属性値の例は、次のとおりです :"attribute-function-interpolator(${{Entity:001}{active:001}} + Math.pow(${{Entity:002}{active:001}},2))".attribute-function-interpolatorに組み込まれた高度な機能は、評価するために Javascript コード内に直接requireパッケージ化する可能性があります。明らかに、エンティティ属性の参照に関連するすべての機能も、この場合サポートされています。それを使用するには、次の手順に従ってください:- シミュレーション構成ファイルに
requireプロパティを組み込んで、attribute-function-interpolatorのいずれかで使用する NPM パッケージの名前および/またはパスを含む配列にその値を設定します。これらのパッケージは、シミュレーションを実行する前に必要となり、それらを使用するattribute-function-interpolatorコードで利用可能になります。たとえば、"require": ["postfix-calculate"]です - コードの評価結果は、
module.exportsプロパティに割り当てられます。これは、この機能がこの制限を課すevalNPM package に依存しているためです
- シミュレーション構成ファイルに
attribute-function-interpolatorのこの高度なモードを使用して受け入れられた属性値は次のとおりです :"attribute-function-interpolator(var postfixCalculate = require('postfix-calculate'); module.exports = postfixCalculate('${{Entity:001}{active:001}} 1 +');)"。ここで、評価の結果(これはmodule.exportsに割り当てられた値)は、postfix-calculateNPM 機能に従って、Entity:001エンティティのactive:001属性の値に 1 を加算した結果になります- 時には、早送りシミュレーションの場合(主に以下の早送りシミュレーションの詳細について)、シミュレーション日付にアクセスすることが有用な場合があります。そのために、Javascript の
Dateオブジェクトのように動作するSimulationDateというオブジェクトを、attribute-function-interpolatorの JavaScript コードに注入しますが、"points" をシミュレーションの日時に置き換えると、これは新しいSimulationDate()であり、現在のシミュレーションの現在のDateを返します。SimulationDateオブジェクトは、コード評価の結果をmodule.exportsプロパティに代入する場合にのみ利用可能であることに注意することが重要です - 現在のシミュレーション時間にアクセスする可能性を使用する可能性のある属性値は、次のとおりです :
"attribute-function-interpolator(module.exports = new SimulationDate())"、評価の結果(これはmodule.exportsに割り当てられた値)が現在のシミュレーション日付になります -
同じ仕様(これは同じ JavaScript コードで評価します)で。
attribute-function-interpolatorの実行の間で状態を維持したい場合は、次のガイドラインに従って実行できます :attribute-function-interpolator Javascriptコードに次のようなコメントを挿入します :/* state: statefulVariable1 = 5, statefulVariable2 = {\"prop1\": \"value1\"}, statefulVariable3 */、これは、stateタグとして、インターポレータが状態として維持する変数のリストが続きます。このリストは、これらの変数に=文字の後に値が含まれるようにコードに挿入するために使用されるか、Javascript コードの最初の実行に値が割り当てられていない場合は、nullです- 評価結果を
module.exports.resultプロパティの値として返します module.exports.stateプロパティに割り当てられたオブジェクトのプロパティとして、インターポレータの実行の間に状態を維持すべき変数を返します
-
同じ仕様(これはあなたの Javascript コード) を共有するすべての
attribute-function-interpolatorが同じ状態を共有することに注意することが重要です。これを望んでいない場合は、追加の;やコメントの追加など、コードの実行に影響を与えることなく、何らかの形で仕様を少し変更するだけです attribute-function-interpolatorインターポレータ実行の間で状態を維持する可能性を使用する属性値の例は :"attribute-function-interpolator(/* state: counter = 1 */ module.exports = { result: ${{Entity:001}{active:001}} + counter, state: { counter: ++counter }};)"、この評価の結果(これはmodule.exports.resultに割り当てられた値)は、Entity:001エンティティのactive:001属性の値に、インターポレータが実行された時間に等しい増分を加算した結果となります- 最後に重要なのは、異なる
attribute-function-interpolatorの間で状態を共有する可能性を組み込んだことで、これは、別の関連する JavaScript コードを有するattribute-function-interpolatorです(それが同じであれば、前述のように同じattribute-function-interpolatorのすべてのインスタンスの間で状態を"locally"に共有することができるからです)。仕様や関連するJavascriptコードに関係なく、別のattribute-function-interpolatorの間で状態を共有するには、次の手順に従います :- シミュレーション構成の
globalsプロパティのグローバル状態変数に初期値を割り当てます。例 :"globals": { "globalVar1": 1, "globalVar2": 2}。このステップはオプションであり、その必要性は特定のattribute-function-interpolatorJavascript コードに依存しますが、明らかに宣言されていない変数にはアクセスしないでください - この変数は、シミュレーションのすべての 'attribute-function-interpolator' インスタンスで使用できるようになります。上記のステップ 1 で有効な変数名(
global-var-1など)を使用しない場合は、global変数を介して変数にアクセスする必要があることに注意してください。これは有効ではないglobal-var-1変数名の代わりにglobal.global-var-1を使用します - 評価結果を
module.exports.resultプロパティの値として返します - 値を更新したいグローバル状態変数を、
module.exports.state.globalsに割り当てられたオブジェクトのプロパティとして返します。グローバル変数はそれに応じて更新され、実行される次のattribute-function-interpolatorに渡されます
- シミュレーション構成の
attribute-function-interpolatorインスタンス間のグローバルな状態を維持する可能性を持つ可能な属性値(それらに含まれる JavaScript コードに関係なく) :"attribute-function-interpolator(module.exports = { result: ${{Entity:001}{active:001}} + globalVar1, state: { globals: { globalVar1: ++globalVar1 } }};)"、評価の結果(これはmodule.exports.resultに割り当てられた値) は、Entity:001エンティティのactive:001属性の値にglobalVar1グローバル状態変数の値に等しい増分を加算した結果になります。それは、1 でインクリメントされ、attribute-function-interpolatorインターポレータの次の 実行にインクリメントされて渡されます- 上記のガイドラインに従って、グローバル状態変数と、ローカル状態変数(これは、同じ仕様または関連付けられた
attribute-function-interpolatorインスタンスの間にあることに注意することが重要です Javascriptコード)は上記のガイドラインに従って組み合わせることができます。これは、attribute-function-interpolatorがグローバル状態変数と同じ名前のローカル状態変数を使用する場合、ローカル変数は保存され、適用されます attribute-function-interpolatorインターポレータの実行の間で、ローカル及びグローバル状態を維持する可能性を使用して受け入れられた属性値は :"attribute-function-interpolator(/* state: counter = 1 */ module.exports = { result: ${{Entity:001}{active:001}} + counter + globalVar1, state: { counter: ++counter, globals: { globalVar1: ++globalVar1 } } };)"、評価の結果(これはmodule.exports.resultに割り当てられた値)は、Entity:001エンティティのactive:001属性の値にインターポレータが実行された回数に等しい増分と、globalVar1状態変数の値とを加算した結果です。 一方、Javascript コードの評価を終了する前に、1 で全体的にインクリメントされます- 注:
deasyncNode パッケージに、エンティティ属性の参照と組み合わせて、attribute-function-interpolatorを使用する早送りシミュレーションを中断すると思われる、問題があります。これは、${{<entityId>}{<attributeName>}}がセグメンテーション・フォールトエラーを引き起こしています。この問題を回避するワークアラウンドは、参照する必要のある属性の値を更新し、その値を他のattribute-function-interpolatorインスタンスからアクセスできるグローバル状態変数に割り当てる、グローバル状態変数の使用です * metadata: 更新時の属性に関連付けるメタデータ情報の配列。各メタデータ配列エントリは、3つのプロパティを含むオブジェクトです * name: メタデータ名 * type: メタデータ・タイプ * value: メタデータ値。任意のメタデータの値として、インターポレータを含む属性(上記に詳述)のために可能なすべての許容値を用いることができる- staticAttributes: エンティティのすべての更新に含まれる属性のリスト。静的属性は、主に1つの注釈で説明したアクティブな属性と同じscheduleです。エンティティの更新のスケジュールとその属性はschedule、アクティブな属性レベルのプロパティまたはエンティティで指定されたプロパティによって決まるため、プロパティは含まれませんレベル。staticAttributesは、利用可能なインターポレータのいずれかをそのvalueプロパティとして使用することができるが、通常、固定値を含み、任意のタイプの補間を含まない
- external: Context Broker インスタンスへのデータのロード、変換、および登録を行う外部ソースに関する情報。
externalプロパティには、次のサブ・プロパティが含まれます :- body: オプション。データを取得するために外部ソースに送信されるリクエストに含まれるボディ
- collector: 必須。この
collectorプロパティには、外部ソースから読み込まれたデータを配列の配列に変換するために使用される JavaScript コードが含まれます。各配列には、更新または通知される属性に対応する Javascript オブジェクトが含まれます。これは、attr-001と呼ばれるテキスト属性を含む1つのエンティティのみが更新または通知されることを望む場合、collectorコードは、[[{name: 'attr-001', type: "Text", value: "Some text value"}]]のような配列の配列を返すべきです。複数の属性の配列が返された場合は、返された配列のそれぞれに返される属性を含む一連のリクエストが送信されます。collectorは、attribute-function-interpolator補間器の場合と同様に、以前にrequireプロパティで宣言しているrequire()NPM パッケージであり、その結果(配列の配列)を返すことでmodule.exports変数に代入する必要があります。external変数は、外部エンドポイントに対して行われたリクエストの結果を伴う、追加のresponseサブ・プロパティで拡張された具体的なエンティティのシミュレーション構成のexternalプロパティのコンテンツを含む、collectorプロパティ Javascript コードに注入されます。コレクタ・プロパティの値の例を次に示します :"var csvParse = require('csv-parse/lib/sync'); var data = external.response.body; var csvDataIndex = data.indexOf('\"Fecha y hora oficial'); var csvData = data.substring(csvDataIndex); var parsedCSVData = csvParse(csvData, {columns: true}); function getDate(dateString) { return new Date(dateString.substring(6,10), dateString.substring(3,5), dateString.substring(0,2), dateString.substring(11,13), dateString.substring(14));} var dateObserved = getDate(parsedCSVData[0]['Fecha y hora oficial']); module.exports = [[{name: 'dateObserved', type: 'DateTime', value: dateObserved}, {name: 'dateModified', type: 'DateTime', value: dateObserved}, {name: 'temperatura', type: 'Number', value: parsedCSVData[0]['Temperatura (�C)']}, {name: 'vientoVelocidad', type: 'Number', value: parsedCSVData[0]['Velocidad del viento (km/h)']}]];" - headers: オプション。外部ソースリクエストに追加されるヘッダを含むオブジェクト。可能な
headersプロパティは次のとおりです :"headers": { "Cache-Control": "no-cache", "Content-Type": "application/json", "Accept": "application/json" } - json: オプション。
requestNPM パッケージで使用されているのと同じセマンティクスのブール値。これは :trueの場合、1)bodyは、JSON-serializable オブジェクトでなければなりません。2)Content-type: application/jsonヘッダーが自動的にリクエストに追加されます。3) レスポンス・ボディが JSON として解析されます - method: 必須。外部ソース・エンドポイントに対して行われたリクエストで使用される HTTP メソッド。許容値 :
GETおよびPOST - retry: オプション。外部ソースからデータをリクエストするときにエラーが発生した場合に適用されるポリシーをリトライします。リトライ回数を設定する
timesプロパティ(デフォルト値は5)と、リトライ間の遅延をミリ秒単位で設定する追加のintervalプロパティ(デフォルト値は0)を含むオブジェクトです - url: 必須です。外部データのリクエストを送信する URL。この
urlエントリは日付テンプレートを受け入れ、最終的な URL を動的に作成することができます。受け入れられるurlプロパティは以下の通りです :"url": "http://www.aemet.es/es/eltiempo/observacion/ultimosdatos_6156X_datos-horarios.csv?k=and&l=6156X&datos=det&w=0&f=temperatura&x=h24"。サポートされている日付テンプレートには、次のものが含まれています(ここれらのテンプレートは、1つの具体的なURLになります){YY}: このテンプレートは、現在の年の最後の2桁で置き換えられます。たとえば、2017の場合、"http://www.example.com/{YY}"値のurlは、"http://www.example.com/17"として生成されます{YYYY}: このテンプレートは、現在の年に対応するすべての桁で置き換えられます。たとえば、2017の場合、"http://www.example.com/{YY}"値のurlは、"http://www.example.com/2017"として生成されます{MM}: このテンプレートは、必要に応じて、最初の0を含む、、現在の月に対応する2桁の数字で置き換えられます。たとえば、6月の場合、"http://www.example.com/{MM}"の値のrulは、"http://www.example.com/06"として生成されます{M*}@en: このテンプレートは、現在の月の名前全体を英語の大文字で置換します。たとえば、6月の場合、"http://www.example.com/{M*}@en"値のurlは、"http://www.example.com/JUNE"として生成されます{M*}@es: このテンプレートは、現在の月の名前全体をスペイン語の大文字で置き換えられます。たとえば、6月の場合、"http://www.example.com/{M*}@es"値のurlは、"http://www.example.com/JUNIO"として生成されます{m*}@en: このテンプレートは、現在の月の名前全体を英語の小文字に置き換えます。たとえば、6月の場合、"http://www.example.com/{m*}@en"値のurlは、"http://www.example.com/june"として生成されます{m*}@es: このテンプレートは、現在の月の名前全体をスペイン語の小文字に置き換えられます。たとえば、6月の場合、"http://www.example.com/{m*}@es"値のurlは、"http://www.example.com/junio"として生成されます{MMM}@en: このテンプレートは、現在の月の最初の3文字を英語の大文字で置き換えられます。たとえば、6月の場合、"http://www.example.com/{MMM}@en"値のurlは、"http://www.example.com/JUN"として生成されます{MMM}@es: このテンプレートは、現在の月の最初の3文字をスペイン語の大文字で置き換えられます。たとえば、6月の場合、"http://www.example.com/{MMM}@es"値のurlは、"http://www.example.com/JUN"として生成されます{mmm}@en: このテンプレートは、現在の月の最初の3文字を英語の小文字で置き換えられます。たとえば、6月の場合、"http://www.example.com/{mmm}@en"値のurlは、"http://www.example.com/jun"として生成されます{mmm}@es: このテンプレートは、現在の月の最初の3文字をスペイン語の小文字で置き換えられます。たとえば、6月の場合、"http://www.example.com/{mmm}@es"値のurlは、"http://www.example.com/jun"として生成されます{DD}: このテンプレートは、必要に応じて、最初の0を含む現在の日付で置き換えられます。たとえば、5日目の場合、"http://www.example.com/{DD}"値のurlは、"http://www.example.com/05"として生成されます{DD-1}: このテンプレートは、当月の前日に置き換えられます。必要に応じて、最初は0が入ります。たとえば、5日目の場合、"http://www.example.com/{DD}"値のurlは、"http://www.example.com/04"として生成されます{D*}@en: このテンプレートは、英語での現在の曜日の全体名で置き換えられます。たとえば、水曜日の場合、"http://www.example.com/{D*}@en"の値urlは、"http://www.example.com/WEDNESDAY"として生成されます{D*}@es: このテンプレートは、スペイン語での現在の曜日の全体名で置き換えられます。たとえば、水曜日の場合、"http://www.example.com/{D*}@es"の値urlは、"http://www.example.com/MIÉRCOLES"として生成されます{DDD}@en: このテンプレートは、英語の大文字での現在の曜日の名前の最初の文字に置き換えられます。たとえば、水曜日の場合、"http://www.example.com/{DDD}@en"の値urlは、"http://www.example.com/WED"として生成されます{DDD}@es: このテンプレートは、スペイン語の大文字での現在の曜日の名前の最初の文字に置き換えられます。たとえば、水曜日の場合、"http://www.example.com/{DDD}@es"の値urlは、"http://www.example.com/MIÉ"として生成されます{ddd}@en: このテンプレートは、英語の小文字での現在の曜日の名前の最初の文字に置き換えられます。たとえば、水曜日の場合、"http://www.example.com/{ddd}@en"の値urlは、"http://www.example.com/wed"として生成されます{ddd}@es: このテンプレートは、スペイン語の小文字での現在の曜日の名前の最初の文字に置き換えられます。たとえば、水曜日の場合、"http://www.example.com/{ddd}@es"の値urlは、"http://www.example.com/mié"として生成されます{hh}: このテンプレートは、24時間形式の現在の時間で置き換えられ、必要に応じて最初は0が入ります。たとえば、午後10時の場合、"http://www.example.com/{hh}"の値urlは、"http://www.example.com/22"として生成されます{mm}: このテンプレートは、現在の分で置き換えられ、必要に応じて最初は0が入ります。たとえば、午後10時05分の場合、"http://www.example.com/{mm}"の値urlは、"http://www.example.com/05"として生成されます{hh}: このテンプレートは、現在の秒数で置き換えられ、必要に応じて最初は0が入ります。たとえば、10:05:09 PMの場合、"http://www.example.com/{ss}"の値urlは、"http://www.example.com/09"として生成されます
- devices: この具体的なシミュレーション中に更新されるデバイスに関する情報。
devicesのエントリは、以下の変更を加えた上記のentitiesのエントリとまったく同じです :entity_nameの代わりにdevice_idを指定する必要があります。countプロパティが使用されている場合、device_idプロパティはcountプロパティの説明で前述したようにentity_nameと同様に設定されますprotocolプロパティは、デバイス・プロトコルを指定しなければなりません。受け入れられる値は :UltraLight::HTTP,UltraLight::MQTT,JSON::HTTP,JSON::MQTTentity_typeプロパティを指定する必要はありませんapi_keyプロパティは、デバイス属性を更新するときに使用する API キーを指定して設定する必要がありますactiveとstaticAttributesプロパティの代わりに、attributesプロパティには、更新される属性の配列の指定を含むする必要があります。attributesレベルで :nameプロパティを指定する必要はありません。代わりに、object_idは属性オブジェクト (short) 識別子を指定して設定する必要がありますtypeプロパティは指定する必要がありません- 前述のすべてのインターポレータを
valueに使用することができます
-
シミュレーション設定ファイル内の同じテキストを何度も何度も繰り返すことを避けるため、また主にテンプレートの編集を容易にするため、テンプレート・メカニズムが組み込まれています。このテンプレートメカニズムにより、imports() ディレクティブをシミュレーション構成の JSON ファイルの任意のプロパティの値として使用できます。シミュレーションを開始する前の予備プロセスとして、これらの `imports()' ディレクティブはすべて解決され、具体的な値に置き換えられます。
このimports()ディレクティブの仕組みを例で見てみましょう。次のテンプレートは、テンプレート機構を使用した有効なシミュレーション構成ファイルです。
{
"exports": {
"contextBroker_NGSIv1": {
"protocol": "https",
"host": "1.2.3.4",
"port": 1026,
"ngsiVersion": "1.0"
},
"every 5 seconds": "*/5 * * * * *",
"autoincrement_1": "attribute-function-interpolator(${{Entity:001}{active:001}} + 1)",
},
"domain": {
"service": "service",
"subservice": "subservice"
},
"contextBroker": "import(contextBroker_NGSIv1)",
"authentication": "import(authentication)",
"entities": [
{
"schedule": "import(every 5 seconds)",
"entity_name": "Entity:001",
"entity_type": "Entity",
"active": [
{
"name": "active:001",
"type": "Number",
"value": "import(autoincrement_1)"
}
]
}
]
}
例えば、import ディレクティブ : import(contextBroker_NGSIv1), import(every 5 seconds), import(autoincrement_1) は、シミュレーション設定ファイルの exports プロパティで宣言された対応する値で置き換えられます。インポート(認証)は、exports で宣言されていないので、FIWARE Device Simulator アプリケーションのルートからの authentication.json ファイルとして必要になります。
これは require(${FIWARE_Device_Simulator_Root_Path}/authentication.json) と同じです
最近、条件設定されたインポートをサポートするために、シミュレーション構成ファイルの特定の部分にコンテンツをインポートするための以前の予備的なサポートが拡張されました。この場合、インポートのために満足しなければならない条件を課すことが可能です。 条件付きインポートの形式は次のとおりです :
"<template-name>": [
{
"condition": "${{<entity-property-1>==<regular-expression-1>}}",
"content": "the-content-to-import-a-string-in-this-case"
},
{
"condition": "${{<entity-property-2>==<regular-expression-2>}{<attribute-property-2>==<regular-expression-2>}}",
"content": "the-content-to-import-a-string-in-this-case"
}
]
ご覧のように、テンプレートは condition と content プロパティを含むオブジェクトの配列になることができます。この場合、インポートは、<entity-property-1> == <regular-expression-1> 条件を満たすエンティティ内に import() ディレクティブが現れる場合にのみ行われます(これは、<entity-property1->値が <regular-expression-1> を満たします)。OR は、<entity-property-2>==<regular-expression-2> 条件(これは、<entity-property-2> 値が <regular-expression-2> を満たします)を満たすエンティティ内で、<attribute-property-2>==<regular-expression-2> 条件を満たす属性の内部に現れます(これは、attribute-property-2> 値が <regular-expression-2> を満たします)。
それを具体的な例で見てみましょう。次のようなシミュレーション構成ファイルを検討してください :
{
"exports": {
"every 5 seconds": "*/5 * * * * *",
"parking from 6 to 22": "text-rotation-interpolator({\"units\": \"hours\", \"text\": [[0,\"closed\"],[6,[[40,\"free\"],[60,\"occupied\"]]],[19,[[80,\"free\"],[20,\"occupied\"]]],[22,\"closed\"]]})",
"now": "date-increment-interpolator({\"origin\": \"now\", \"increment\": 0})",
"entity-type": [
{
"content": "ParkingSpot",
"condition": "${{entity_name==pe-moraleja-01-group-0[0-9]:0[0-9]}}"
}
],
"attribute-type-1": [
{
"content": "Text",
"condition": "${{entity_name==pe-moraleja-01-group-02:0[0-9]}}"
},
{
"content": "DateTime",
"condition": "${{entity_name==pe-moraleja-01-group-01:0[0-9]}{name==dateModifie[a-z]}}"
}
]
},
...
"entities": [
{
"schedule": "import(every 5 seconds)",
"entity_name": "pe-moraleja-01-group-01:01",
"entity_type": "import(entity-type)",
"active": [
{
"name": "status",
"type": "Text",
"value": "import(parking from 6 to 22)"
},
{
"name": "dateModified",
"type": "import(attribute-type-1)",
"value": "import(now)"
}
]
},
{
"schedule": "import(every 5 seconds)",
"entity_name": "pe-moraleja-01-group-02:01",
"entity_type": "import(entity-type)",
"active": [
{
"name": "status",
"type": "import(attribute-type-1)",
"value": "import(parking from 6 to 22)"
},
{
"name": "dateModified",
"type": "DateTime",
"value": "import(now)"
}
]
}
]
...
}
インポートを解決したら、シミュレーション設定ファイルは次のようになります :
{
...
"entities": [
{
"schedule": "*/5 * * * * *", // -> IMPORTED
"entity_name": "pe-moraleja-01-group-01:01",
"entity_type": "ParkingSpot", // -> IMPORTED
"active": [
{
"name": "status",
"type": "Text",
"value": "text-rotation-interpolator({\"units\": \"hours\", \"text\": [[0,\"closed\"],[6,[[40,\"free\"],[60,\"occupied\"]]],[19,[[80,\"free\"],[20,\"occupied\"]]],[22,\"closed\"]]})" // -> IMPORTED
},
{
"name": "dateModified",
"type": "DateTime", // -> IMPORTED
"value": "date-increment-interpolator({\"origin\": \"now\", \"increment\": 0})" // -> IMPORTED
}
]
},
{
"schedule": "*/5 * * * * *", // -> IMPORTED
"entity_name": "pe-moraleja-01-group-02:01",
"entity_type": "ParkingSpot", // -> IMPORTED
"active": [
{
"name": "status",
"type": "Text", // -> IMPORTED
"value": "text-rotation-interpolator({\"units\": \"hours\", \"text\": [[0,\"closed\"],[6,[[40,\"free\"],[60,\"occupied\"]]],[19,[[80,\"free\"],[20,\"occupied\"]]],[22,\"closed\"]]})" // -> IMPORTED
},
{
"name": "dateModified",
"type": "DateTime",
"value": "date-increment-interpolator({\"origin\": \"now\", \"increment\": 0})" // -> IMPORTED
}
]
}
]
...
}
テキスト・インポートの場合と同様に、条件付きインポートは、シミュレーション構成ファイルのエクスポート・プロパティ、またはインポート可能な外部 JSON ファイルで宣言できます。
明らかに、import ディレクティブが、exports プロパティ、または外部 JSON ファイルで宣言されていないテンプレートを参照している場合、エラーがスローされ、シミュレーションは実行されません。一方、すべての置換が正常に行われ、結果のシミュレーション設定ファイルが有効であれば、シミュレーションが実行されます。
FIWARE Device Simulator のコマンドラインツール、fiwareDeviceSimulatorCLI には、今、説明したインポート・メカニズムのサポートが含まれていますが、入力シミュレーション構成ファイルを解決されたインポートを含む出力構成ファイルに変換する、インポート・メカニズム用の特定のコマンドラインツール、fiwareDeviceSimulatorTranspilerCLI も含まれています。両方のコマンドラインツールの詳細については、Command line tools のセクションを参照してください。
最後に、./examples ディレクトリには、さまざまなシナリオをシミュレートするために使用されるシミュレーション設定ファイルの実際の例がいくつか含まれています。