このチュートリアルでは、コンテキスト・データを CrateDB データベースに保存す るために使用される、Generic Enabler である FIWARE QuantumLeap について紹 介します。このチュートリアルでは 、以前のチュートリアルで接続し た IoT センサを有効にし、それらのセンサからの測定値をデータベースに保存します。 このようなデータの時間ベースの集計を取得するには、QuantumLeap クエリAPIを 使用するか、CrateDB HTTP エンドポイントに直接接続します。 結果は、グラフまたは Grafana 時系列分析ツールを介して視覚化されます。
このチュートリアルでは、全体で cUrl コマンドを使用してい ますが、 Postman documentation も利用できます。
詳細 (クリックして拡大)
- 時系列データの永続化とクエリ (CrateDB)
- アーキテクチャ
- 前提条件
- 起動
- QuantumLeap を介して FIWARE を CrateDB データベースに接続
- CrateDB データベース・サーバの設定
- QuantumLeap の設定
- Grafana の設定
- サブスクリプションのセットアップ
- 時系列データ・クエリ (QuantumLeap API)
- QuantumLeap API - 最初の N個の サンプリング値のリスト
- QuantumLeap API - N 個のサンプリング値をオフセットでリスト
- QuantumLeap API - 最新のN個のサンプリングされた値のリスト
- QuantumLeap API - 期間別にグループ化された値の合計をリスト
- QuantumLeap API - 期間別にグループ化された最小値をリスト
- QuantumLeap API - ある期間の最大値のリスト
- QuantumLeap API - ポイント付近のデバイスの最新の N 個のサンプル値をリスト
- QuantumLeap API - エリア内のデバイスの最新の N 個のサンプル値をリスト
- 時系列データ・クエリ (CrateDB API)
- プログラミングによる時系列データへのアクセス
- 次のステップ
"Forever is composed of nows."
— Emily Dickinson
以前のチュートリアルでは 、履歴コンテキスト・データを MySQL や PostgreSQL などのデータベースに永続化する 方法を示しました。さらに 、Short Term Historic のチュートリアルでは、MongoDB データベースを使用して履歴コンテキスト・データ を永続化およびクエリするための STH-Comet Generic Enabler を導入しま した。
FIWARE QuantumLeap は 、CrateDB 時系列データベースへのデータ永続性のために特別に作成された代替 Generic Enabler であり、STH-Comet に 代わるものです。
CrateDB は、Internet of Things で使用するために設計された分 散 SQL DBMS です。1 秒間に多数のデータ・ポイントを取り込むことができ、リアルタイ ムでクエリすることができます。このデータベースは、地理空間データや時系列データな どの複雑なクエリの実行用に設計されています。この履歴データを取得することで、グラ フやダッシュボードを作成し、時間の経過とともに傾向を表示することができます。
違いの概要を以下に示します :
| QuantumLeap | STH-Comet |
|---|---|
| 通知のための NGSI v2 インタフェースを提供します | 通知のための NGSI v1 インタフェースを提供します |
| データを CrateDB データベースに保存します | データを MongoDB データベースに保存します |
| クエリ用に独自の HTTP エンドポイントを提供しますが、CrateDB にクエリすることもできます | クエリ用に独自の HTTP エンドポイントを提供します。MongoDB データベースに直接アクセスすることはできません |
| QuantumLeap は複雑なデータクエリを提供します (CrateDB のおかげで) | STH-Comet は限定された一連のクエリを提供しています |
| CrateDB は、NoSQL ストレージの上に構築されたスケーラブルな分散 SQL DBMS です | MongoDB は、ドキュメント・ベースの NoSQL データベースです |
| QuantumLeap の API は、ここにある OpenAPI でドキュメント化されています | STH-Comet は、ここにあるドキュメントで説明されています |
基盤となるデータベースエンジンの相違点の詳細は 、こちらを参照してください 。
時系列データ分析を適切に使用するかどうかは、ユースケースと受け取るデータ測定の信 頼性によって異なります。時系列データ分析を使用すると、次のような質問に答えること ができます。
- 一定期間内のデバイスの最大測定値はどれくらいでしたか?
- 一定期間内のデバイスの平均測定値はどれくらいでしたか?
- 一定期間内にデバイスから送信された測定値の合計はどれくらいですか?
また、個々のデータポイントの重要性を減らして、スムージングによって外れ値を除外す るために使用することもできます。
Grafana は、このチュートリアルで使用する時系列解析ツール 用のオープンソースソフトウェアです。これは、CrateDB を含む様々な時系列データ ベースと統合されています。Apache License 2.0 のライセンスで利用可能です。詳細は 、https://grafana.com/ をご覧ください。
このチュートリアルの目的のために、一連のダミー IoT デバイスが作成され、Context
Broker に接続されます。使用しているアーキテクチャとプロトコルの詳細は
、IoT Sensors チュートリアルに
あります。各デバイスの状態は、次の UltraLight デバイス・モニタの Web ページで確
認できます : http://localhost:3000/device/monitor
QuantumLeap がデータの集計を開始すると、各デバイスの履歴の状態は、デバイス履
歴の Web ページに表示されます :
http://localhost:3000/device/history/urn:ngsi-ld:Store:001
このアプリケーションは 、以前のチュートリアル で作成 したコンポーネントとダミー IoT デバイスをベースにしています 。Orion Context Broker,IoT Agent for Ultralight 2.0 および QuantumLeap の 3 つの FIWARE コンポーネントを使用します。
したがって、全体的なアーキテクチャは次の要素で構成されます :
-
FIWARE Generic Enablers :
- FIWARE Orion Context Broker は、NGSI を使 用してリクエストを受信します
- FIWARE IoT Agent for Ultralight 2.0 は、Ultralight 2.0 形式のダミー IoT デバイスからノース・バウンドの測定値 を受信し、Context Broker の NGSI リクエス トに変換してコンテキスト・エンティティの状態を変更します
- FIWARE QuantumLeap は コンテキストの変更をサブスクライブし、CrateDB データベースに永続化し ます
-
MongoDB データベース :
- Orion Context Broker が、データ・エンティティ、サブスクリプション、 レジストレーションなどのコンテキスト・データ情報を保持するために使用しま す
- デバイスの URLs や Keys などのデバイス情報を保持するために IoT Agent によって使用されます
-
CrateDB データベース:
- 時間ベースの履歴コンテキスト・データを保持するデータシンクとして使用され ます
- 時間ベースのデータクエリを解釈する HTTP エンドポイントを提供します
-
コンテキストプロバイダ : - HTTP 上で動作する Ultralight 2.0 プロトコルを使用して、 ダミー IoT デバイスの セットとして機能する Web サーバです。 - このチュートリアルでは、 コンテキスト・プロバイダの NGSI proxy は使用しません
要素間のすべての対話は HTTP リクエストによって開始されるため、エンティティはコン テナ化され、公開されたポートから実行されます。
全体的なアーキテクチャを以下に示します :
物事を単純にするために、両方のコンポーネントが Docker を使用して実行されます。Docker は、さまざまコンポーネントをそれぞれの環境に 分離することを可能にするコンテナ・テクノロジです。
- Docker Windows にインストールするには 、こちらの手順に従ってくださ い
- Docker Mac にインストールするには 、こちらの手順に従ってください
- Docker Linux にインストールするには 、こちらの手順に従ってください
Docker Compose は、マルチコンテナ Docker アプリケーションを定義して実行する ためのツールです 。YAML file ファイルは、アプリケーションのために必要なサービスを構成するために使用します。つ まり、すべてのコンテナ・サービスは 1 つのコマンドで呼び出すことができます 。Docker Compose は、デフォルトで Docker for Windows と Docker for Mac の一部と してインストールされますが、Linux ユーザ はここに記載されている手順に従う必要 があります。
次のコマンドを使用して、現在の Docker バージョンと Docker Compose バージ ョンを確認できます :
docker-compose -v
docker versionDocker バージョン 18.03 以降と Docker Compose 1.21 以上を使用していることを確認 し、必要に応じてアップグレードしてください。
シンプルな bash スクリプトを使用してサービスを開始します。Windows ユーザは cygwin をダウンロードして、Windows 上の Linux ディスト リビューションと同様のコマンドライン機能を提供する必要があります。
開始する前に、必要な Docker イメージをローカルで取得または構築しておく必要があり ます。リポジトリを複製し、以下のコマンドを実行して必要なイメージを作成してくださ い :
git clone git@github.com:FIWARE/tutorials.Time-Series-Data.git
cd tutorials.Time-Series-Data
./services createその後、リポジトリ内で提供される services Bash スクリプトを実行することによって、コマンドラインからすべてのサービスを初期 化することができます :
./services startℹ️ 注: クリーンアップをやり直したい場合は、次のコマンド を使用して再起動することができます :
./services stop
この設定では、QuantumLeap は、ポート 8868 上の NGSI v2 通知を待ち受け、履
歴データを CrateDB に永続化します。CrateDB は、ポート 4200 を使用して
アクセスでき、直接クエリすることも、Grafana 分析ツールに接続することもできます。
コンテキスト・データを提供するシステムの残りの部分は、以前のチュートリアルで説明
しています。
crate-db:
image: crate:3.1.2
hostname: crate-db
ports:
- "4200:4200"
- "4300:4300"
command: crate -Clicense.enterprise=false -Cauth.host_based.enabled=false -Ccluster.name=democluster -Chttp.cors.enabled=true -Chttp.cors.allow-origin="*" quantumleap:
image: smartsdk/quantumleap
hostname: quantumleap
ports:
- "8668:8668"
depends_on:
- cratedb
environment:
- CRATE_HOST=cratedbgrafana:
image: grafana/grafana
depends_on:
- cratedb
ports:
- "3003:3000"
environment:
- GF_INSTALL_PLUGINS=crate-datasource,grafana-clock-panel,grafana-worldmap-panelquantumleap コンテナは、1つのポートで待機しています:
- QuantumLeap のポートの操作 - ポート
8668サービスは、Orion Context Broker からの通知をリッスンするポートで、ここからユーザはデータをクエリできます。
CRATE_HOST 環境変数は、データが永続化される場所を定義します。
cratedb コンテナは、2つのポートでリッスンしています:
- Admin UI は、ポート
4200で利用できます - トランスポートプロトコルは、ポート
4300で利用できます
grafana コンテナは、内部ポート 3000 を外部ポート 3003 に接続しています。こ
れは Grafana UI が通常はポート 3000 で使用できるためですが、このポートは ダミ
ー IoT デバイスの UI によって既に取得されているため、別のポートに移動しています
。Grafana 環境変数は、Grafana
のドキュメントに記述され
ています。この設定により、チュートリアルの後半で CrateDB データベースに接続
できるようになります。
このチュートリアルでは、コンテキストが定期的に更新されるシステムを監視する必要が
あります。ダミー IoT センサを使用してこれを行うことができます
。http://localhost:3000/device/monitor でデバイス・モニタのページを開き、ス
マート・ドアのロックを解除し、スマート・ランプをオンにします。これは、ドロ
ップ・ダウン・リストから適切なコマンドを選択し、send ボタンを押すことによって
行うことができます。デバイスからの測定の流れは、同じページに表示されます :
動的コンテキスト・システムが起動したら、コンテキストの変更を直接 QuantumLeap
に通知する必要があります。予想通り、これは Orion Context Broker のサブスクリ
プション・メカニズムを使用して行われます。QuantumLeap は、NGSI v2 通知を直接
受け入れるため、attrsFormat=legacy 属性は不要です。
サブスクリプションについては、次のサブセクションで説明します。サブスクリプション の詳細については、以前のチュートリアルや QuantumLeap のドキュメントの サブスクリプション・セクション を参照してください。
モーション・センサの変化率は、現実世界の事象によって引き起こされます。結果を 集約するためには、すべてのイベントを受け取る必要があります。
これは、Orion Context Broker の /v2/subscription エンドポイントに POST リ
クエストをすることで行われます。
fiware-serviceとfiware-servicepathヘッダは、サブスクリプションをフィ ルタリングして、接続された IoT センサからの測定値のみをリッスンためにするた めに使用されます- リクエストのボディの
idPatternは、すべてのモーション・センサのデータ 変更を QuantumLeap に通知されるようにします notificationURL は、公開されたポートと一致する必要があります
metadata 属性により、CrateDB データベース内の time_index 列が
、CrateDB 自体のレコードの作成時間を使用するのではなく、Orion Context
Broker が使用する MongoDB データベース内のデータと一致することが保証されま
す。
curl -iX POST \
'http://localhost:1026/v2/subscriptions/' \
-H 'Content-Type: application/json' \
-H 'fiware-service: openiot' \
-H 'fiware-servicepath: /' \
-d '{
"description": "description": "Notify QuantumLeap of count changes of any Motion Sensor",
"subject": {
"entities": [
{
"idPattern": "Motion.*"
}
],
"condition": {
"attrs": [
"count"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"count"
],
"metadata": ["dateCreated", "dateModified"]
},
"throttling": 1
}'スマート・ランプの明るさは常に変化していますので、最小値や最大値、変化率など の関連する統計値を計算するために値をサンプリングするだけです。
これは、Orion Context Broker の /v2/subscription エンドポイントに POST リ
クエストを行い、リクエストのボディに throttling 属性 を含めることによって行わ
れます。
fiware-serviceとfiware-servicepathヘッダは、サブスクリプションをフィ ルタリングして、接続された IoT センサからの測定値のみをリッスンためにするた めに使用されます- リクエストのボディの
idPatternは、すべてのモーション・センサのデータ 変更を QuantumLeap に通知されるようにします notificationURL は、公開されたポートと一致する必要がありますthrottling値は、変更がサンプリングされる割合を定義します
metadata 属性により、CrateDB データベース内の time_index 列が
、CrateDB 自体のレコードの作成時間を使用するのではなく、Orion Context
Broker が使用する MongoDB データベース内のデータと一致することが保証されま
す。
curl -iX POST \
'http://localhost:1026/v2/subscriptions/' \
-H 'Content-Type: application/json' \
-H 'fiware-service: openiot' \
-H 'fiware-servicepath: /' \
-d '{
"description": "Notify QuantumLeap on luminosity changes on any Lamp",
"subject": {
"entities": [
{
"idPattern": "Lamp.*"
}
],
"condition": {
"attrs": [
"luminosity"
]
}
},
"notification": {
"http": {
"url": "http://quantumleap:8668/v2/notify"
},
"attrs": [
"luminosity", "location"
],
"metadata": ["dateCreated", "dateModified"]
},
"throttling": 1
}'何かをする前に、:one: と :two: のステップで作成したサブスクリプションを チェックしてください (すなわち、それぞれが少なくとも1つの通知が送信されたか)
curl -X GET \
'http://localhost:1026/v2/subscriptions/' \
-H 'fiware-service: openiot' \
-H 'fiware-servicepath: /'[
{
"id": "5be07427be9a2d09cf677f08",
"description": "Notify QuantumLeap of count changes of any Motion Sensor",
"status": "active",
"subject": { ...ETC },
"notification": {
"timesSent": 6,
"lastNotification": "2018-09-02T08:36:04.00Z",
"attrs": ["count"],
"attrsFormat": "normalized",
"http": { "url": "http://quantumleap:8668/v2/notify" },
"lastSuccess": "2018-09-02T08:36:04.00Z"
},
"throttling": 1
},
{
"id": "5be07427be9a2d09cf677f09",
"description": "Notify QuantumLeap on luminosity changes on any Lamp",
"status": "active",
"subject": { ...ETC },
"notification": {
"timesSent": 4,
"lastNotification": "2018-09-02T08:36:00.00Z",
"attrs": ["luminosity"],
"attrsFormat": "normalized",
"http": { "url": "http://quantumleap:8668/v2/notify" },
"lastSuccess": "2018-09-02T08:36:01.00Z"
},
"throttling": 1
}
]QuantumLeapは、CrateDB バックエンドをラッピングする API を提供し、
複数のタイプのクエリを実行することもできます。API のドキュメントは
こちらです。
バージョンに注意してください。quantumleap コンテナへのアクセス権がある場合
(例えば、localhost で実行中、またはポート・フォワーディングしている)、
http://localhost:8668/v2/ui を介して API をナビゲートできます。
さて、QuantumLeap が永続的な値であることを確認するために、最初のクエリを
始めましょう。この例は、Lamp:001 から、最初にサンプリングされた
3つの luminosity 値を示しています。
Fiware-Service と Fiware-ServicePath ヘッダの使用に注意してください。
これらは、マルチテナント・シナリオでこのようなヘッダを使用してデータを
強制的にプッシュする場合にのみ必要です。これらのヘッダを追加しないと、
データが返されません。
curl -X GET \
'http://localhost:8668/v2/entities/Lamp:001/attrs/luminosity?=3&limit=3' \
-H 'Accept: application/json' \
-H 'Fiware-Service: openiot' \
-H 'Fiware-ServicePath: /'{
"data": {
"attrName": "luminosity",
"entityId": "Lamp:001",
"index": [
"2018-10-29T14:27:26",
"2018-10-29T14:27:28",
"2018-10-29T14:27:29"
],
"index": ["2018-10-29T14:27:26", "2018-10-29T14:27:28", "2018-10-29T14:27:29
"values": [2000, 1991, 1998]
}
}この例は、Motion:001 の 4番目、5番目および6番目のサンプリングされた count 値を示しています。
curl -X GET \
'http://localhost:8668/v2/entities/Motion:001/attrs/count?offset=3&limit=3' \
-H 'Accept: application/json' \
-H 'Fiware-Service: openiot' \
-H 'Fiware-ServicePath: /'{
"data": {
"attrName": "count",
"entityId": "Motion:001",
"index": [
"2018-10-29T14:23:53.804000",
"2018-10-29T14:23:54.812000",
"2018-10-29T14:24:00.849000"
],
"index": ["2018-10-29T14:23:53.804000", "2018-10-29T14:23:54.812000", "2018-10-29T14:24:00.849000"],
"values": [0, 1, 0]
}
}この例は、Motion:001 の最新の3個のサンプリングされた count 値を示しています。
curl -X GET \
'http://localhost:8668/v2/entities/Motion:001/attrs/count?lastN=3' \
-H 'Accept: application/json' \
-H 'Fiware-Service: openiot' \
-H 'Fiware-ServicePath: /'{
"data": {
"attrName": "count",
"entityId": "Motion:001",
"index": [
"2018-10-29T15:03:45.113000",
"2018-10-29T15:03:46.118000",
"2018-10-29T15:03:47.111000"
],
"index": ["2018-10-29T15:03:45.113000", "2018-10-29T15:03:46.118000", "2018-10-29T15:03:47.111000"],
"values": [1, 0, 1]
}
}この例では、Motion:001 の1分ごとの最後の3個の合計 count 値を示しています。
QuantumLeap バージョン >= 0.4.1 以上が必要です。次のような単純な GET でバージョンを確認することができます :
curl -X GET \
'http://localhost:8668/v2/version' \
-H 'Accept: application/json'curl -X GET \
'http://localhost:8668/v2/entities/Motion:001/attrs/count?aggrMethod=count&aggrPeriod=minute&lastN=3' \
-H 'Accept: application/json' \
-H 'Fiware-Service: openiot' \
-H 'Fiware-ServicePath: /'{
"data": {
"attrName": "count",
"entityId": "Motion:001",
"index": [
"2018-10-29T15:03:00.000000",
"2018-10-29T15:04:00.000000",
"2018-10-29T15:05:00.000000"
],
"index": ["2018-10-29T15:03:00.000000", "2018-10-29T15:04:00.000000", "2018-10-29T15:05:00.000000"],
"values": [21, 10, 11]
}
}この例では、1分ごとの Lamp:001 からの最小 luminosity 値を示しています。
QuantumLeap バージョン >= 0.4.1 以上が必要です。次のような単純な GET でバージョンを確認することができます :
curl -X GET \ 'http://localhost:8668/v2/version' \ -H 'Accept: application/json'
curl -X GET \
'http://localhost:8668/v2/entities/Lamp:001/attrs/luminosity?aggrMethod=min&aggrPeriod=minute&lastN=3' \
-H 'Accept: application/json' \
-H 'Fiware-Service: openiot' \
-H 'Fiware-ServicePath: /'{
"data": {
"attrName": "count",
"entityId": "Motion:001",
"index": [
"2018-10-29T15:03:00.000000",
"2018-10-29T15:04:00.000000",
"2018-10-29T15:05:00.000000"
],
"index": ["2018-10-29T15:03:00.000000", "2018-10-29T15:04:00.000000", "2018-10-29T15:05:00.000000"],
"values": [1720, 1878, 1443]
}
}この例では、2018-06-27T09:00:00 から 2018-06-30T23:59:59 までの間に
発生した、Lamp:001 の最大の luminosity 値を示しています。
curl -X GET \
'http://localhost:8668/v2/entities/Lamp:001/attrs/luminosity?aggrMethod=max&fromDate=2018-06-27T09:00:00&toDate=2018-06-30T23:59:59' \
-H 'Accept: application/json' \
-H 'Fiware-Service: openiot' \
-H 'Fiware-ServicePath: /'{
"data": {
"attrName": "luminosity",
"entityId": "Lamp:001",
"index": [],
"values": [1753]
}
}この例は、
52°33'16.9"N 13°23'55.0"E (Bornholmer Straße 65, Berlin, Germany)
から半径5km以内にある最新の4つのサンプリングされたランプの luminosity
値を示しています。デバイス・モニタのページで利用可能なすべてのランプをつけると、
Lamp:001 と Lamp:004 のデータを見ることができるはずです。
ℹ️ 注: 地理的クエリは、 NGSI v2 仕様 の地理的クエリのセクションに詳述されている完全なクエリのセットを実装する、 QuantumLeap のバージョン
0.5からのみ利用可能です。
curl -X GET \
'http://localhost:8668/v2/types/Lamp/attrs/luminosity?lastN=4&georel=near;maxDistance:5000&geometry=point&coords=52.5547,13.3986' \
-H 'Accept: application/json' \
-H 'Fiware-Service: openiot' \
-H 'Fiware-ServicePath: /'{
"data": {
"attrName": "luminosity",
"entities": [
{
"entityId": "Lamp:001",
"index": ["2018-12-13T16:35:58.284", "2018-12-13T16:36:58.216"],
"values": [999, 999]
},
{
"entityId": "Lamp:004",
"index": ["2018-12-13T16:35:04.351", "2018-12-13T16:36:04.282"],
"values": [948, 948]
}
],
"entityType": "Lamp"
}
}この例は、
52°33'16.9"N 13°23'55.0"E (Bornholmer Straße 65, Berlin, Germany)
を中心とする一辺 200 m の正方形の内側にあるランプの最新の4つのサンプリング
された luminosity 値を示しています。デバイス・モニタのページで利用可能な
すべてのランプをつけたとしても、Lamp:001 のデータだけを見るべきです。
ℹ️ 注: 地理的クエリは、 NGSI v2 仕様 の地理的クエリのセクションに詳述されている完全なクエリのセットを実装する、 QuantumLeap のバージョン
0.5からのみ利用可能です。
curl -X GET \
'http://localhost:8668/v2/types/Lamp/attrs/luminosity?lastN=4&georel=coveredBy&geometry=polygon&coords=52.5537,13.3996;52.5557,13.3996;52.5557,13.3976;52.5537,13.3976;52.5537,13.3996' \
-H 'Accept: application/json' \
-H 'Fiware-Service: openiot' \
-H 'Fiware-ServicePath: /'{
"data": {
"attrName": "luminosity",
"entities": [
{
"entityId": "Lamp:001",
"index": [
"2018-12-13T17:08:56.041",
"2018-12-13T17:09:55.976",
"2018-12-13T17:10:55.907",
"2018-12-13T17:11:55.833"
],
"values": [999, 999, 999, 999]
}
],
"entityType": "Lamp"
}
}CrateDB は、SQL クエリを送信するために使用できる
HTTP エンドポイントを
提供します。エンドポイントは、<servername:port>/_sql 下でアクセス可能です。
SQL ステートメントは POST リクエストの本体として JSON 形式で送信されます。ここで
、SQL ステートメントは stmt 属性の値です。
CrateDB にクエリするときと、QuantumLeap にするとき? 経験則として、QuantumLeap で常に作業することを好む理由は 次のとおりです。
- あなたの経験は Orion のような FIWARE NGSI API に近いでしょう
- あなたのアプリケーションは、CrateDB の仕様や QuantumLeap の実装の 詳細に結びつくことはありません
- QuantumLeap は他のバックエンドにも簡単に拡張でき、あなたのアプリは フリーで互換性を得ることができます
- デプロイメントが配布されている場合は、データベースのポートを外部に 公開する必要はありません
QuantumLeap で実行したいクエリがサポートされていないことが確かな場合は、 CrateDB でクエリする必要がありますが、開発チームが認識できるように QuantumLeap の GitHub リポジトリ で、issue をオープンしてください。
データが永続化されているかどうかを確認する別の方法は、table_schema が
作成されたことをチェックすることです。 次のように、CrateDB
HTTP エンドポイントにリクエストすることでこれを行うことができます:
curl -iX POST \
'http://localhost:4200/_sql' \
-H 'Content-Type: application/json' \
-d '{"stmt":"SHOW SCHEMAS"}'{
"cols": ["table_schema"],
"rows": [["doc"], ["information_schema"], ["sys"], ["mtopeniot"], ["pg_catalog"]],
"rowcount": 5,
"duration": 10.5146
}スキーマ名は、mt プレフィックスとそれに続く、小文字の fiware-service ヘッダ
で構成されます。IoT Agent は、FIWARE-Service ヘッダ openiot を使用して、
ダミー IoT デバイスから測定値を転送します。これらは mtopeniot スキーマの下に
保持されています。
mtopeniot が存在しない場合は、QuantumLeap のサブスクリプションが正しく設定
されていません。サブスクリプションが存在し、データを正しい場所に送信するように設
定されていることを確認します。
QuantumLeap は、エンティティ型に基づいて CrateDB データベース内の別のテ
ーブルにデータを永続化します。テーブル名は、et プレフィックスとエンティティ型
の名前を小文字にして形成されます。
curl -X POST \
'http://localhost:4200/_sql' \
-H 'Content-Type: application/json' \
-d '{"stmt":"SHOW TABLES"}'{
"cols": ["table_schema", "table_name"],
"rows": [["mtopeniot", "etmotion"], ["mtopeniot", "etlamp"]],
"rowcount": 2,
"duration": 14.2762
}レスポンスは、モーション・センサのデータとスマート・ランプのデータの両方 がデータベースに保持されていることを示します。
SQL 文は ORDER BY と LIMIT を使用してデータをソートします。
詳細は、CrateDB
のドキュメントを
参照してください。
curl -iX POST \
'http://localhost:4200/_sql' \
-H 'Content-Type: application/json' \
-d '{"stmt":"SELECT * FROM mtopeniot.etlamp WHERE entity_id = '\''Lamp:001'\'' ORDER BY time_index ASC LIMIT 3"}'{
"cols": ["entity_id", "entity_type", "fiware_servicepath", "luminosity", "time_index"],
"rows": [
["Lamp:001", "Lamp", "/", 1750, 1530262765000],
["Lamp:001", "Lamp", "/", 1507, 1530262770000],
["Lamp:001", "Lamp", "/", 1390, 1530262775000]
],
"rowcount": 3,
"duration": 21.8338
}SQL 文は、OFFSET 句を使用して必要な行を取り出します。詳細は、CrateDB
のドキュメントを
参照してください。
curl -iX POST \
'http://localhost:4200/_sql' \
-H 'Content-Type: application/json' \
-d '{"stmt":"SELECT * FROM mtopeniot.etmotion WHERE entity_id = '\''Motion:001'\'' order by time_index ASC LIMIT 3 OFFSET 3"}'{
"cols": ["count", "entity_id", "entity_type", "fiware_servicepath", "time_index"],
"rows": [
[0, "Motion:001", "Motion", "/", 1530262791452],
[1, "Motion:001", "Motion", "/", 1530262792469],
[0, "Motion:001", "Motion", "/", 1530262793472]
],
"rowcount": 3,
"duration": 54.215
}SQL 文は、最後の N 行を取り出すために LIMIT 節と結合された
、ORDER BY ... DESC 節を使用します。詳細は
、CrateDBのドキュメントを
参照してください。
curl -iX POST \
'http://localhost:4200/_sql' \
-H 'Content-Type: application/json' \
-d '{"stmt":"SELECT * FROM mtopeniot.etmotion WHERE entity_id = '\''Motion:001'\'' ORDER BY time_index DESC LIMIT 3"}'{
"cols": ["count", "entity_id", "entity_type", "fiware_servicepath", "time_index"],
"rows": [
[0, "Motion:001", "Motion", "/", 1530263896550],
[1, "Motion:001", "Motion", "/", 1530263894491],
[0, "Motion:001", "Motion", "/", 1530263892483]
],
"rowcount": 3,
"duration": 18.591
}SQL 文は、SUM 関数と GROUP BY 句を使用して関連するデータを取得します。
CrateDB は、タイムスタンプを切り捨ててグループ化できるデータに変換するための
一連
の日時関数を
提供しています。
curl -iX POST \
'http://localhost:4200/_sql' \
-H 'Content-Type: application/json' \
-d '{"stmt":"SELECT DATE_FORMAT (DATE_TRUNC ('\''minute'\'', time_index)) AS minute, SUM (count) AS sum FROM mtopeniot.etmotion WHERE entity_id = '\''Motion:001'\'' GROUP BY minute LIMIT 3"}'{
"cols": ["minute", "sum"],
"rows": [
["2018-06-29T09:17:00.000000Z", 12],
["2018-06-29T09:34:00.000000Z", 10],
["2018-06-29T09:08:00.000000Z", 11],
["2018-06-29T09:40:00.000000Z", 3],
...etc
],
"rowcount": 42,
"duration": 22.9832
}SQL 文は、MIN 関数と GROUP BY 句を使用して関連するデータを取得します。
CrateDB は、タイムスタンプを切り捨ててグループ化できるデータに変換するための
一連の
日時関数を
提供しています。
curl -iX POST \
'http://localhost:4200/_sql' \
-H 'Content-Type: application/json' \
-d '{"stmt":"SELECT DATE_FORMAT (DATE_TRUNC ('\''minute'\'', time_index)) AS minute, MIN (luminosity) AS min FROM mtopeniot.etlamp WHERE entity_id = '\''Lamp:001'\'' GROUP BY minute"}'{
"cols": ["minute", "min"],
"rows": [
["2018-06-29T09:34:00.000000Z", 1516],
["2018-06-29T09:17:00.000000Z", 1831],
["2018-06-29T09:40:00.000000Z", 1768],
["2018-06-29T09:08:00.000000Z", 1868],
...etc
],
"rowcount": 40,
"duration": 13.1854
}SQL 文は、MAX関数と WHERE 句を使用して関連するデータを取得します
。CrateDB は、さまざまな方法でデータをアグリゲーションするため、一連の
アグリゲーション関数
を提供しています。
curl -iX POST \
'http://localhost:4200/_sql' \
-H 'Content-Type: application/json' \
-d '{"stmt":"SELECT MAX(luminosity) AS max FROM mtopeniot.etlamp WHERE entity_id = '\''Lamp:001'\'' and time_index >= '\''2018-06-27T09:00:00'\'' and time_index < '\''2018-06-30T23:59:59'\''"}'{
"cols": ["max"],
"rows": [[1753]],
"rowcount": 1,
"duration": 26.7215
}指定された時系列の JSON レスポンスが取得されると、生のデータを表示することはエン ドユーザにとってほとんど役に立たちません。これは、棒グラフ、折れ線グラフ、または テーブル・リストに表示するために操作する必要があります。これは、グラフィカルなツ ールではないため、QuantumLeap のドメイン内にはありませんが 、Wirecloud や Knowage などのマッシュアップやダッシュボード・コンポーネントに任せることができます。
また、コーディング環境に適したサード・パーティのグラフ作成ツール
(chartjs など) を使用して、検索して表示することもでき
ます。この例は
、Git Repository
の history コントローラ内にあります。
基本的な処理は、検索と属性マッピングの 2 つのステップで構成されています。サンプ ルコードは以下のとおりです :
function readCrateLampLuminosity(id, aggMethod) {
return new Promise(function(resolve, reject) {
const sqlStatement =
"SELECT DATE_FORMAT (DATE_TRUNC ('minute', time_index)) AS minute, " +
aggMethod +
"(luminosity) AS " +
aggMethod +
" FROM mtopeniot.etlamp WHERE entity_id = 'Lamp:" +
id +
"' GROUP BY minute ORDER BY minute";
const options = {
method: "POST",
url: crateUrl,
headers: { "Content-Type": "application/json" },
body: { stmt: sqlStatement },
json: true
};
request(options, (error, response, body) => {
return error ? reject(error) : resolve(body);
});
});
}function crateToTimeSeries(crateResponse, aggMethod, hexColor) {
const data = [];
const labels = [];
const color = [];
if (crateResponse && crateResponse.rows && crateResponse.rows.length > 0) {
_.forEach(crateResponse.rows, element => {
const date = moment(element[0]);
data.push({ t: date, y: element[1] });
labels.push(date.format("HH:mm"));
color.push(hexColor);
});
}
return {
labels,
data,
color
};
}変更されたデータは、フロント・エンドに渡され、サード・パーティのグラフ作成ツール
によって処理されます。結果は次のとおりです :
http://localhost:3000/device/history/urn:ngsi-ld:Store:001
CrateDB は、QuantumLeap の時系列データ・シンクとして選択されています。
他の多くのメリットの中でも、
Grafana 時系列分析ツールとシームレスに統合されています。
Grafana を使用して、アグリゲートされたセンサ・データを表示することができます。
ここでダッシュボードを構築する
ための完全なチュートリアルを見つけることができます。次の簡単な手順では、ランプの
luminosity データのグラフを接続して表示する方法をまとめています。
docker-compose ファイルは Grafana UI のインスタンスをポート 3003 でリッスン
しているので、ログイン・ページは次の場所にあります:
http://localhost:3003/login。デフォルトのユーザー名は admin で、デフォルトの
パスワードは admin です。
ログイン後、データソースは、http://localhost:3003/datasources において、次の値
で設定する必要があります:
-
Name Lamp
-
Type Crate
-
URL
http://cratedb:4200 -
Access Server (デフォルト)
-
Schema mtopeniot
-
Table etlamp
-
Time column time_index
Save をクリックすると、Data Source added メッセージが返されます j
新しいダッシュボードを表示するには、+ ボタンをクリックして New Dashboard
を選択するか、直接 http://localhost:3003/dashboard/new?orgId=1 に移動します。
その後、Graph ダッシュボード・タイプを選択します。
ダッシュボードを設定するには、Panel title をクリックし、ドロップ・ダウンリストか ら edit を選択します。
太字のテキストの次の値は、グラフ作成ウィザードに配置する必要があります :
- Data Source Lamp (以前に作成したデータソースから選択)
- FROM mtopeniot.etlamp WHERE entity_id = Lamp:001
- Select Min luminosity
- Group By time Interval Minute Format as Time Series
最終結果は以下の通りです :
高度な機能を追加することで、アプリケーションに複雑さを加える方法を知りたいですか ?このシリーズ の他のチュートリアルを読むことで見 つけることができます
MIT © 2018-2019 FIWARE Foundation e.V.








