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

简单的方法

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

{ "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请求中发送到http://api.cosm.com/v2/feeds/:feed_id(替换:feed_id为您通过 Cosm 网站创建的提要的 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 回答