今天我发现了Cosm,我正在尝试上传一些数据作为测试。
我有一个设备(叫做http://www.homewizard.nl/),我用它来远程控制开关,读取天气和能源数据。
从设备读取数据是使用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?
发布于 2013-04-28 21:04:33
简单方法
从给定的JSON数据中,获取response数组的一个元素:
{ "t": "2013-04-27 01:40", "ws": 2.2, "gu": 0.0, "dir": 45}将此数据映射到Cosm数据模型意味着采用以下格式的http://cosm.com/docs/v2/feed/update.html:
{
"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 (用通过Cosm网站创建的提要的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请求中向http://cosm.com/docs/v2/datastream/发送此请求,最后只对问题中给出的数据发出3次请求:
PUT http://api.cosm.com/v2/feeds/:feed_id/datastreams/wsPUT http://api.cosm.com/v2/feeds/:feed_id/datastreams/guPUT http://api.cosm.com/v2/feeds/:feed_id/datastreams/dirJavaScript实例
您可以实现类似于此的内容:
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设备时间是本地的,则设置时区可能很重要)。
https://stackoverflow.com/questions/16266687
复制相似问题