将homewizard数据上传到cosm

时间:2013-04-28 19:12:37

标签: json rest upload cosm xively

今天我发现了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?

1 个答案:

答案 0 :(得分:1)

简单方法

从给定的JSON数据中,取response数组的一个元素:

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

将此数据映射到Cosm数据模型意味着a feed update具有以下格式:

{
  "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请求发送到 http://api.cosm.com/v2/feeds/:feed_id(将:feed_id替换为您通过Cosm网站创建的Feed的ID)。< / p>

您可以通过几种略微不同的方式实现重新映射,但这似乎是最简单的开始。我已经测试了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请求中将此信息发送至the datastream endpoint,并且您最终只会对您的问题中提供的数据发出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 <,时区可能很重要。 / em>无论您身在何处,设备时间都是本地的。)