データ値の計算方法

このドキュメントの他のトピックでは、プラットフォームにデータを挿入する方法と、そのデータを照会および変更する方法について説明しました。しかし、これらのデータ値に基づいて自動計算を行う最良の方法は何ですか?その起源と計算の性質に基づいてデータを計算するさまざまな方法があります。

デバイスからのデータに基づく計算

デバイスからの測定レポートから得られるデータの場合、IoT Agents は、報告されたデータに基づいて計算式を表現するメカニズムを提供します。デバイスがプラットフォームにプロビジョニングされ、システムに直接報告される値の定義とともに、デバイスが送信した値を組み合わせて式を定義することができます。

次の例は、廃液コンテナを表すタンク・エンティティのプロビジョニングを示しています。タンクの実体は、タンクの総重量を報告する構造のセンサと、充填レベルを測定するもう一つのものと、タンクの四角底の寸法が既知であり、2m×4mに等しいものです。現在格納されている廃液の密度を計算する式が用意されています。

POST /iot/devices
Content-Type: application/json
Fiware-service: smartown
Fiware-servicepath: /wastecontainers

{
  "devices": [
    {
      "device_id": "t5867934",
      "protocol": "IoTA-UL",
      "entity_name": "WasteTank8",
      "entity_type": "Device",
      "attributes": [
        {
          "object_id": "l",
          "name": "level",
          "type": "meter"
        },
        {
          "object_id": "w",
          "name": "weight",
          "type": "kilogram"
        },
        {
          "name": "density",
          "type": "kilogram/meter^3",
          "expression": "${@weight / (@level * 2 * 4)}"
        }
      ]
    }
  ]
}

次のようなコンテナからの測定レポート :

POST /iot/d?k=801230BJKL23Y9090DSFL123HJK09H324HV8732&i=t5867934
Content-Type: text/plain

l|22|w|78

次の Context Broker のエンティティ(NGSIv1) に引き上げます

  {
     "type": "Device",
     "isPattern": "false",
     "id": "WasteTank8",
     "attributes": [
       {
         "name": "level",
         "type": "meter",
         "value": "1"
       },
       {
         "name": "weight",
         "type": "kilogram",
         "value": "24"
       },
       {
         "name": "density",
         "type": "kilogram/meter^3",
         "value": "3"
       }
     ]
  }

NGSIv2形式の同じエンティティでは :

  {
     "type": "Device",
     "id": "WasteTank8",
     "level": {
         "type": "meter",
         "value": "1"
     },
     "weight": {
         "type": "kilogram",
         "value": "24"
     },
     "density": {
         "type": "kilogram/meter^3",
         "value": "3"
     }
  }

Expression Languageで使用できる操作と機能の完全なセットについては、仕様を参照してください。

コンテキスト・エンティティのデータに基づく計算

デバイスからではなく外部システムからのデータ値の場合、およびそれらの値を計算するコンテキスト情報のソースが複数の場合は、CEP を使用して計算の一部を行うことができます。

CEPは、サブスクリプションに設定されているように、構成可能な属性セットを通知し、デバイスが送信したものより多くのフィールドを使用できる通知を受け取ります。通知メカニズムを使用すると、属性の前の値をメタデータ previousValue (通知のメタデータを参照) として送信できます。例として、座標と計測時間を定期的に送信するエンティティについて考えることができます。フィールド velocity を更新するルールによって平均速度を計算することができます。

簡単にするために、以前の値を着信通知の値としていますが、それらは、x0 に代わりev.x__metadata__previousValue を取ることができます。y0t0 についても同じです。メタデータとオブジェクト値を参照ください。

ルールは次のようになります :

{
    "name": "rule_velocity",
    "text": "select *, \"rule_velocity\" as ruleName, Math.hypot(cast(cast(ev.x1?,String),float)-cast(cast(ev.x0?,String),float),cast(cast(ev.y1?,String),float)-cast(cast(ev.y0?,String),float))/(cast(cast(ev.t1?, String), float)-cast(cast(ev.t0?,String), float)) as velocity  from pattern [every ev=iotEvent()]",
    "action": {
        "type": "update",
        "parameters": {
            "attributes": [
                {
                    "name": "velocity",
                    "value": "${velocity}",
                    "type": "Number"
                }
            ]
        }
    }
}

そして、次のような通知 :

{
    "subscriptionId": "51c04a21d714fb3b37d7d5a7",
    "originator": "localhost",
    "contextResponses": [
        {
            "contextElement": {
                "attributes": [
                    {
                        "name": "x1",
                        "type": "number",
                        "value": "10"
                    },
                    {
                        "name": "y1",
                        "type": "number",
                        "value": "0"
                    },
                    {
                        "name": "x0",
                        "type": "number",
                        "value": "0"
                    },
                    {
                        "name": "y0",
                        "type": "number",
                        "value": "0"
                    },
                    {
                        "name": "t1",
                        "type": "number",
                        "value": "5"
                    },
                    {
                        "name": "t0",
                        "type": "number",
                        "value": "0"
                    }
                ],
                "type": "BloodMeter",
                "isPattern": "false",
                "id": "bloodm1"
            },
            "statusCode": {
                "code": "200",
                "reasonPhrase": "OK"
            }
        }
    ]
}

更新アクションが生成されます :

{  
   "contextElements": [  
      {  
         "isPattern": "false",
         "id": "bloodm1",
         "attributes": [  
            {  
               "name": "velocity",
               "value": "2",
               "type": "Number"
            }
         ],
         "type": "BloodMeter"
      }
   ],
   "updateAction": "APPEND"
}

それは、使っていたどんな大きさでもフィールド velocity を 2(10/5) に設定しました。

java.lang.Math のすべての関数は、EPL式で使用できます。

履歴値に基づく統計計算

計算したいデータ値が履歴値に基づく統計情報である場合は、短期履歴 (Short Term Historic) を使用することができます。このコンポーネントは、コンテキスト・エンティティの履歴情報を格納し、格納されたデータに対する統計的な計算を検索するために使用できます :

STH コンポーネントは、特定のエンティティ属性の時間的推移に関する統計を計算することができます。これを行うには、この推移をコンポーネントに時間通りに通知する2つの方法があります :

  1. Cygnus コンポーネントを経由し、Context Broker インスタンスにサブスクライブ
  2. STH コンポーネント自体を経由し、直接、Context Broker インスタンスにサブスクライブ

STH がエンティティ属性値の変更の通知を受け取ると、以下の情報を計算して提供することができます :

  • 数値属性値 :
  • 平均
  • 標準偏差
  • 分散
  • 最大
  • 最小
  • テキスト属性値 :
  • 出現回数

これは、以下のような異なる解像度や時間枠のためのものです :

  • 時間

前の例に関して、STH は以下のような統計情報を提供することができます :

  1. 昨年の月の解像度で、WasteTank8 エンティティの最大の `weight' 属性値は何月ですか? STH コンポーネントに次 ような GET リクエストを送信します:

    http://<sth-component>:<sth-port>/STH/v1/contextEntities/type/Entity/id/WasteTank8/attributes/weight?aggrMethod=max&aggrPeriod=month&dateFrom=2015-01-01T00:00:00&dateTo=2015-12-31T23:59:59

  2. 先週の時間の解像度で、WasteTank8 エンティティ の 平均 level 属性値は何時間ですか? STH コンポーネントに次のような GET リクエストを送信します:

    http://<sth-component>:<sth-port>/STH/v1/contextEntities/type/Entity/id/WasteTank8/attributes/level?aggrMethod=sum&aggrPeriod=hour&dateFrom=2016-11-07T00:00:00&dateTo=2016-11-13T23:59:59

  3. 過去3日間の時また分の解像度で WasteTank8 エンティティの density 属性値の標準偏差は何時または何分ですか? STH コンポーネントに次のような GET リクエストを送信します:

    http://<sth-component>:<sth-port>/STH/v1/contextEntities/type/Entity/id/WasteTank8/attributes/density?aggrMethod=sum2&aggrPeriod=minute&dateFrom=2016-11-14T00:00:00&dateTo=2016-11-16T23:59:59

STHコンポーネントとそれが提供するすべての機能についての詳細は、ReadTheDocsのSTHドキュメント を参照してください。