今天我发现了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?
答案 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
你可以实现类似的东西:
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>无论您身在何处,设备时间都是本地的。)