2

今日、私は Cosm を発見し、テストとしていくつかのデータをアップロードしようとしています。

私はデバイス ( HomeWizardと呼ばれます) を持っており、それを使用してスイッチをリモートで制御し、天気とエネルギーのデータを読み取ります。

デバイスからのデータの読み取りは、HTTP と JSON を使用して行われます。

このデータを読み取り、cosm に送信したいと思います。

デバイスに風速計のデータをクエリすると、次のように表示されます。

{"status": "ok",
 "version": "2.352",
 "request": {"route": "/wind" },
 "response": [
   { "t": "2013-04-27 00:10", "ws": 0.8, "gu": 1.6, "dir": 157},
   { "t": "2013-04-27 00:25", "ws": 0.8, "gu": 1.6, "dir": 112},
   { "t": "2013-04-27 00:40", "ws": 0.9, "gu": 3.0, "dir": 112},
   { "t": "2013-04-27 00:55", "ws": 1.7, "gu": 2.7, "dir": 90},
   { "t": "2013-04-27 01:10", "ws": 1.1, "gu": 0.0, "dir": 90},
   { "t": "2013-04-27 01:25", "ws": 1.9, "gu": 0.0, "dir": 180},
   { "t": "2013-04-27 01:40", "ws": 2.2, "gu": 0.0, "dir": 45},
   { "t": "2013-04-27 01:55", "ws": 2.0, "gu": 3.0, "dir": 112},
   { "t": "2013-04-27 02:10", "ws": 2.0, "gu": 0.0, "dir": 90},
   { "t": "2013-04-27 02:25", "ws": 2.0, "gu": 3.0, "dir": 135},
   { "t": "2013-04-27 02:40", "ws": 2.4, "gu": 2.0, "dir": 67}
  ]
}

このデータをアップロードするには ID を使用する必要があることは理解していますが、この出力には ID がありません。上記のデータを Cosm にアップロードして使用するにはどうすればよいですか?

4

1 に答える 1

1

シンプルなアプローチ

指定された JSON データから、response配列の要素の 1 つを取得します。

{ "t": "2013-04-27 01:40", "ws": 2.2, "gu": 0.0, "dir": 45}

このデータを Cosm データ モデルにマッピングすると、次の形式のフィード更新が行われます。

{
  "version":"1.0.0",
  "datastreams" : [
  {
    "current_value" : "2.2",
    "at": "2013-04-27 01:40",
    "id" : "ws"
  },
  {
    "current_value" : "2.2",
    "at": "2013-04-27 01:40",
    "id" : "gu"
  },
  {
    "current_value" : "45",
    "at": "2013-04-27 01:40",
    "id" : "dir"
  }
 ]
}

これは、PUTリクエストで送信できます ( Cosm Web サイトで作成したフィードの ID にhttp://api.cosm.com/v2/feeds/:feed_id置き換え:feed_idます) 。

少し異なるいくつかの方法で再マッピングを実装できますが、これが最初は最も簡単に思えます。JSON のサンプル スニペットをテストしたところ、Cosm が正確に解析するタイムスタンプとまったく同じ形式ではないにもかかわらず、動作します。

responseしたがって、配列内の各項目を反復処理し、上記と同じ方法で再マップする必要があります。まず、これを試してみてください。

より効率的なアプローチ

上記の単純な方法では、Cosm に送信される要求が非常に多くなる可能性があります。これらのリクエストは 3 つのデータストリームを更新するため、わずか 3 つのリクエストで実行できます。

{
  "version":"1.0.0",
   "datapoints" : [
    { "value" : "-3.33", "at": "2013-04-28 21:40" },
    { "value" : "-3.31", "at": "2013-04-28 21:41" },
    { "value" : "-3.29", "at": "2013-04-28 21:42" },
    { "value" : "-3.27", "at": "2013-04-28 21:43" },
    { "value" : "-3.25", "at": "2013-04-28 21:44" },
    { "value" : "-3.23", "at": "2013-04-28 21:45" },
    { "value" : "-3.25", "at": "2013-04-28 21:46" },
    { "value" : "-3.27", "at": "2013-04-28 21:47" },
    { "value" : "-3.29", "at": "2013-04-28 21:48" },
    { "value" : "-3.33", "at": "2013-04-28 21:49" }
  ]
}

PUTこれをリクエストでデータストリームエンドポイントに送信する必要があり、質問で指定されたデータに対して 3 つのリクエストのみを行うことになります。

  • PUT http://api.cosm.com/v2/feeds/:feed_id/datastreams/ws
  • PUT http://api.cosm.com/v2/feeds/:feed_id/datastreams/gu
  • PUT http://api.cosm.com/v2/feeds/:feed_id/datastreams/dir

JavaScript の例

次のようなものを実装できます。

var data_from_homewizard = {
 "status": "ok",
 "version": "2.352",
 "request": {"route": "/wind" },
 "response": [
   { "t": "2013-04-27 00:10", "ws": 0.8, "gu": 1.6, "dir": 157},
   { "t": "2013-04-27 00:25", "ws": 0.8, "gu": 1.6, "dir": 112},
   { "t": "2013-04-27 00:40", "ws": 0.9, "gu": 3.0, "dir": 112},
   { "t": "2013-04-27 00:55", "ws": 1.7, "gu": 2.7, "dir": 90},
   { "t": "2013-04-27 01:10", "ws": 1.1, "gu": 0.0, "dir": 90},
   { "t": "2013-04-27 01:25", "ws": 1.9, "gu": 0.0, "dir": 180},
   { "t": "2013-04-27 01:40", "ws": 2.2, "gu": 0.0, "dir": 45},
   { "t": "2013-04-27 01:55", "ws": 2.0, "gu": 3.0, "dir": 112},
   { "t": "2013-04-27 02:10", "ws": 2.0, "gu": 0.0, "dir": 90},
   { "t": "2013-04-27 02:25", "ws": 2.0, "gu": 3.0, "dir": 135},
   { "t": "2013-04-27 02:40", "ws": 2.4, "gu": 2.0, "dir": 67}
  ]
}

var ws_datapoints = [];
data_from_homewizard.response.forEach(function (i) {
  ws_datapoints.push({ at: i.t, value: i.ws });
});

var gu_datapoints = [];
data_from_homewizard.response.forEach(function (i) {
  gu_datapoints.push({ at: i.t, value: i.gu });
});

var dir_datapoints = [];
data_from_homewizard.response.forEach(function (i) {
  dir_datapoints.push({ at: i.t, value: i.dir });
});

かなり読みやすいはずですが、ネストされたループを書きたくなるでしょう。そして、この特定のケースでは、ブラウザーで実行したくないと思います。疑似コードを使用する代わりに、アルゴリズムを説明するのが最も簡単だと思われる JavaScript を使用しました (実際に試すこともできます)。

また、タイムスタンプ形式をISO 8601に調整することも検討する必要があります。これは、Cosm がデータポイントのタイムスタンプを正しく保存するために必要な形式であるためです (たとえば、HomeWizardデバイスの時刻がローカルの場所である場合、タイムゾーンを設定することが重要になる場合があります)。世界)。

于 2013-04-28T21:04:33.467 に答える