无法在highstock上绘制多个系列的数据

时间:2013-07-18 06:54:28

标签: mysql json highstock

有一个个人温度监控器项目,将家中不同房间的所有温度记录到一个mysql数据库中,前几天我遇到了highstock / chart并且一直在玩它,但我似乎无法让它与多个工作系列数据。

如何将数据记录到表中;

datetime< - (例如; 2013-07-18 15:52:26)每个位置的每个传感器的时间会有所不同

位置< - 6(休息室,厨房,餐厅,室外,主人,备用)

温度< - (例如12.34)

mysql中的记录是什么样的; 2013-07-18 15:52:26 / master / 12.34

我已经设法让它全部用于数据集,但我不确定我需要做什么以及最好的方法是如何格式化json和mysql查询以便highcharts可以读取json / mysq数据并在一个图表上绘制ALL 6个位置的温度数据。

完整代码;主要的高档图表文件。 http://pastebin.com/XWkThfc8这是从mysql数据库生成JSON的文件。 http://pastebin.com/RXBFr24P

这是使用上述查询的一组数据目前的样子.... [1374593356000,17.31],[1374593427000,17.25],[1374593497000,17.31],[1374593567000,17.31],[1374593638000, 17.31],[1374593708000,17.25],[1374593778000,17.25],[1374593849000,17.25],[1374593919000,17.25],[1374593989000,17.25],[1374594060000,17.25],[1374594130000,17.25] ....等< / p>

And here is what it currently looks like with one set of data plotted

所以我的问题是;

改变这一点的最佳方法是什么,以便绘制所有数据,此时它似乎不起作用;

mysql_select_db("mqtt", $con);

$return_arr = array();

$fetch = mysql_query("SELECT timeof, message FROM temperatures WHERE DATE(timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE() AND locationmap = 'master'");
$i=0;
while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
$rows[$i]=array(strtotime($row[timeof])*1000 ,(float)$row[message]);
$i++;
}

echo json_encode($rows);

我假设需要多种数据集才能采用这种格式。

[{名称: '厨房',DAT一个:[[日期,温度],[日期,温度],[日期,温度]]},{名称: '休息室',DAT一个:[[日期,温度],[日期,温度],[日期,温度]]}]

不确定如何更改我的查询,以便为所有位置提取数据,然后对其进行正确编码。

UPDATE-1

最新代码,

$return_arr = array();

$fetch = mysql_query("SELECT timeof, locationmap AS location, message AS temp FROM temperatures WHERE DATE(timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND CURDATE() ORDER BY location, timeof ASC");
$i=0;
while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
$rows[$i]=array(strtotime($row[timeof])*1000 ,(float)$row[temp],$row[location]);
$i++;
}

echo json_encode($rows);   

但是它没有返回上面提到的正确格式。

它是这样的。 (显然有1000个人参加。)

[1375272426000,22.63,"cupboard"],[1375272496000,22.69,"cupboard"],[1375272566000,22.75,"cupboard"],[1375272637000,22.75,"cupboard"],[1375272707000,22.69,"cupboard"],[1375272777000,22.63,"cupboard"],[1375106429000,17.69,"kitchen"],[1375106500000,17.69,"kitchen"],[1375106570000,17.63,"kitchen"],[1375106640000,17.63,"kitchen"],[1375106711000,17.63,"kitchen"],[1375106781000,17.63,"kitchen"],[1375106851000,17.63,"kitchen"],[1375106921000,17.56,"kitchen"],[1375106992000,17.56,"kitchen"],[1375107062000,17.56,"kitchen"],[1375107132000,17.56,"kitchen"],[1375107203000,17.56,"kitchen"],[1375107273000,17.5,"kitchen"],[1375107343000,17.5,"kitchen"],[1375107413000,17.5,"kitchen"]

我认为我的查询现在是正确的!??只需要一些json输出的帮助!

UPDATE-2 thx到highcharts论坛,这是我需要JSON的格式,只需要一些php / mysql方面的帮助......

[{
  name: 'kitchen',
  data: [
    [time, value],
    [time, value]
  ]
}, {
  name: 'attic',
  data: [
    [time, value],
    [time, value]
  ]
}]

UPDATE-3 得到它使用多个系列数据,没有放心我不得不多次调用我的json php脚本,已经把这两个文件放在GIST上给任何有类似问题的人。

http://i.imgur.com/PzcTCGg.png

https://gist.github.com/matbor/8854385 https://gist.github.com/matbor/8853902

3 个答案:

答案 0 :(得分:1)

是的,它应该采用您所包含的格式,更多的日期应该是时间戳(milisceonds中的时间)和临时需求数值。

答案 1 :(得分:1)

我认为最好的方法是遵循“比较演示”并使您的PHP代码只生成一个数组,具体取决于指定房间的url参数:

json.php?room=attic
json.php?room=cupboard

您只输出房间的数据

然后,它的高端产品调用单独的php文件:

names = ['attic', 'cupboard', '...'],

$.each(names, function(i, name) {

    $.getJSON('jsonp.php?room='+ name.toLowerCase() +'-c.json&callback=?',  function(data) {
...

但说实话,我仍在寻找避免多个http调用/ sql查询的方法:-)特别是对于[date1,value1,value1,value3],[date2,value1,value1,value3]等数据。 ..

答案 2 :(得分:0)

我已经使用这个项目大约6个月了,以为我会分享一些别人可能会觉得有用的小窍门。
一切运行得非常好,我有5个树莓派将温度数据记录到CentOS服务器上的MYSQL数据库中,但是突然间它就坏了。该页面根本不会显示任何内容,但是在Firefox开发人员工具控制台的“网络”选项卡下,我可以看到5个数据库查询中的3个导致500个内部服务器错误。
由于我没有进行任何修改,这似乎很奇怪,并且一些故障排除最终使我进入了httpd error_log。出现php错误,指示最大内存分配已用尽。

  

PHP致命错误:耗尽的134217728字节允许的内存大小   (尝试分配757个字节)在   /var/www/html/temperatures/json_hs_temps.php

我将以下代码行添加到json_hs_temps.php文件中,以将内存从默认的128Mb增加到1Gb。

ini_set('memory_limit', '1024M');

这立即解决了该问题,并且图形再次加载正常。

此外,由于以下时区错误,httpd error_log也出现了大容量(千兆字节)的情况:

  

PHP警告:strtotime():依靠系统的时区设置并不安全。 要求使用date.timezone设置或date_default_timezone_set()函数。如果您使用了这些方法中的任何一种,并且仍然收到此警告,则很可能您拼写了时区标识符。我们暂时选择了时区“ UTC”,但请设置date.timezone以选择您的时区。在第27行的/var/www/html/temperatures/json_hs_temps.php中,引荐网址:http://192.168.178.49/temperatures/index_hs_temps_multi.php

解决方案是将以下代码行添加到json_hs_temps.php文件中以设置时区。

date_default_timezone_set("Australia/Hobart");

我认为使用此代码的其他人可能会遇到这种情况,因此希望对其他人有帮助。