QueryPropertyHistory サービスの使用
QueryPropertyHistory サービスは、値ストリームに対して、指定されたソース Thing の各プロパティ (記録済みのプロパティ) で指定された時刻範囲内にある値をクエリーします。このサービスは各プロパティについて ValueStream.queryValueStreamEntries を呼び出した後、これらの値を結果セット内にマージします。
QueryPropertyHistory は、Thing の各ログプロパティをクエリーした後、個々のデータセットを 1 つの大きなデータセットに結合することによって作成されたデータセットを返します。個々のデータセット内のタイムスタンプごとに "行" が作成されます。そのタイムスタンプで記録された値がある場合、その値がデータセットの行に入力されます。記録された値がない場合、そのプロパティの最後に記録された値が使用されます。ログプロパティがない場合、そのエントリは空白のままになります。この結合プロセスによって、指定されたプロパティの重複する値がタイムスタンプに基づいて除去されます。
指定したプロパティの実際に記録されている値を取得するには、QueryPropertyHistory サービス (QueryIntegerPropertyHistory など) を使用する必要があります。これらのサービスを使用して、データが実際にはパージされていることを確認できます。このサービスの働きについて理解するため、いくつかのサンプルのシナリオを以下に示します。
サンプルのシナリオ
シナリオ 1: 3 つの行を指定しているが、QueryPropertyHistory で 9 つ返される
3 つのプロパティの記録に値ストリームが使用されています。各プロパティに 3 つの異なるエントリがすでに存在します。このため、入力されているデータポイントの総数は 9 になります。
maxItems パラメータを 3 に設定してこの値ストリームに対して QueryPropertyHistory が呼び出された場合、代わりに 9 つのデータ行が返されます。maxItems が 3 に設定されたので、QueryPropertyHistory は各プロパティに対して 3 回ずつクエリーしています。各プロパティに 3 つのデータエントリがあったので、返されるアイテムの最大数は 9 行になります。
シナリオ 2: このタイムスタンプでデータがあることがわかっているが、空のインフォテーブルが返される
値が値ストリームに入力されたときに ThingWorx によって自動的に生成されるタイムスタンプを使用しない場合、Edge デバイスからの独自のカスタムタイムスタンプを記録できますが、以下の動作について考慮する必要があります。
setPropertyVTQ を使用する代わりにこのカスタムタイムスタンプ列を使用してクエリーするとどうなるか?
QueryPropertyHistory サービスは Thing が使用している値ストリームにアクセスし、startDateendDateoldestFirstmaxRows パラメータに基づいて初期結果セットを取得します。
startDateendDate を空白のままにした場合、動的に生成されたタイムスタンププロパティはクエリーで考慮されず、値ストリーム内の最も新しく追加されたプロパティ値または最も古いプロパティ値から maxRows 個 (500 など) が取得されます。新しい値から取得されるか古い値から取得されるかは oldestFirst ブールパラメータによって決まります。oldestFirst が false に設定されている場合、返された結果セットには、各プロパティの最も新しく入力された 500 個のプロパティ値が含まれます。このため、3 つのプロパティそれぞれに 500 個以上の値が記録されている場合、初期データセットには 1500 行含まれます。
ポストプロセスはどうなるか?
未使用のパラメータとして、query パラメータがあります。このパラメータにはポストプロセスが適用されます。つまり、値ストリームに対する最初のクエリーが完了した後、最初の結果セットが返されます。これに query パラメータが適用されてフィルタされ、必要なデータのみが返されます。
問題?
独自に作成したカスタムタイムスタンププロパティでクエリーすることにしたが、返された最初の結果セットにクエリーで調べている時刻が含まれていない場合、何も見つからず、空のインフォテーブルが返されます。
ソリューション
この問題を完全に回避するには、setPropertyVTQ サービスを使用して、独自のタイムスタンプの値を値ストリームに入力します。これによって、値が値ストリームに入力された正確な時間を表す自動生成されたタイムスタンプの値が上書きされます。この後、query パラメータの代わりに startDate および endDate パラメータを使用して日付でクエリーでき、タイムスタンプでクエリーすることによってデータが失われることがなくなります。