シンプルなアプローチ
指定された 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デバイスの時刻がローカルの場所である場合、タイムゾーンを設定することが重要になる場合があります)。世界)。