MySQL -> PHP -> Highcharts, problem att få till rätt format

Generella mjukvarufrågor som inte är beroende av vilket operativsystem som körs skall ställas i denna kategori
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
hellgun
Tar hemautomation på allvar
Inlägg: 76
Blev medlem: 22 apr 2010, 12:16

MySQL -> PHP -> Highcharts, problem att få till rätt format

Inlägg av hellgun »

Jag vill presentera min MySQL-data mha Highcharts och har fått det att funka litegrann men har problem att få till rätt format när data hämtas från MySQL, byggs ihop i PHP-skript och ska skickas vidare.

Jag vill ha data i följande format:
[{"name":"Golvv\u00e4rme","data":[[1380578400000,3.9],[1380664800000,4.5]]},{"name":"V\u00e4rmepump","data":[[1380578400000,3.3],[1380664800000,4.4]]}]
Dvs med hakparanteser. Men hur jag än bär mig åt så blir det dubbelfnuttar inblandade:
[{"name":"Golvv\u00e4rme","data":["1380578400000,3.9","1380664800000,4.5"]},{"name":"V\u00e4rmepump","data":["1380578400000,3.3","1380664800000,4.4"]}]
Här är ett exempel på hur jag hämtar data och bygger ihop arrayer:

Kod: Markera allt

<?php
$con = mysql_connect("localhost","user","pwd");

if (!$con) {
  die('Could not connect: ' . mysql_error());
}

mysql_select_db("db", $con);

$sql = mysql_query("select UNIX_TIMESTAMP(concat(datum, ' 00:00:00'))*1000 datum, llvp, gv from elforbrukning_dygn where datum between '".$_GET["dateStart"]."' and '".$_GET["dateEnd"]."'");

$series1 = array();
$series1['name'] = 'Golvvärme';

$series2 = array();
$series2['name'] = 'Värmepump';

while($r = mysql_fetch_array($sql)) {
    $series1['data'][] = $r['datum'].",".$r['gv'];
    $series2['data'][] = $r['datum'].",".$r['llvp'];
}

$result = array();
array_push($result,$series1);
array_push($result,$series2);

print json_encode($result, JSON_NUMERIC_CHECK);

mysql_close($con);
?>
Jag har även provat att trycka in hakparenteser direkt i SQL-satsen men dubbelfnuttarna kommer ändå till:

Kod: Markera allt

<?php
$con = mysql_connect("localhost","user","pwd");

if (!$con) {
  die('Could not connect: ' . mysql_error());
}

mysql_select_db("db", $con);

$sql = mysql_query("select concat('[', UNIX_TIMESTAMP(concat(datum, ' 00:00:00'))*1000, ',', llvp, ']') llvp, concat('[', UNIX_TIMESTAMP(concat(datum, ' 00:00:00'))*1000, ',', gv, ']') gv from elforbrukning_dygn where datum between '".$_GET["dateStart"]."' and '".$_GET["dateEnd"]."'");

$series1 = array();
$series1['name'] = 'Golvvärme';

$series2 = array();
$series2['name'] = 'Värmepump';

while($r = mysql_fetch_array($sql)) {
    $series1['data'][] = $r['gv'];
    $series2['data'][] = $r['llvp'];
}

$result = array();
array_push($result,$series1);
array_push($result,$series2);

print json_encode($result, JSON_NUMERIC_CHECK);

mysql_close($con);
?>
[{"name":"Golvv\u00e4rme","data":["[1380578400000,3.9]","[1380664800000,4.5]"]},{"name":"V\u00e4rmepump","data":["[1380578400000,3.3]","[1380664800000,4.4]"]}]
Har ni några sköna tips?
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: MySQL -> PHP -> Highcharts, problem att få till rätt for

Inlägg av flyvert »

Hej

Har datat strukturerat på ett lite annat sätt i min databas (alla sensorer i samma tabell, separerade med sensorid, propertyid samt aggregate som anger om det är råvärde, medelvärde, max, min, etc man vill åt å till sist period som anger sampleintervallet på värdet, t.ex. 1 minut, 1 timme, 1 dag, 1 vecka, 1 månad, 1 år) men så här ser mitt generella "lässensor" skript ut som jag anropar från Java där jag använder Flot för att rita ut kurvorna, etc.

Skriptet hämtar även namn på sensorna, enheter, etc (därav de två SQL satserna) men den intressanta bitarna har jag markerat i blått.

pi@Raspberry /var/www $ more readsensor.php
<?php

$sensorid = $_GET['sensor'];
$property = $_GET['property'];
$aggregate = $_GET['aggregate'];
$period = $_GET['period'];
$scope = $_GET['scope'];
$color = $_GET['color'];
$axis = $_GET['axis'];
$type = $_GET['type'];
$nolabel = $_GET['nolabel'];
$towatt = $_GET['towatt'];

switch ($scope)
{
case "1h":
$ts = "time > now() - interval 1 hour";
break;
case "6h":
$ts = "time > now() - interval 6 hour";
break;
case "12h":
$ts = "time > now() - interval 12 hour";
break;
case "1d":
$ts = "time > now() - interval 1 day";
break;
case "1w":
$ts = "time > now() - interval 7 day";
break;
case "1mo":
$ts = "time > now() - interval 31 day";
break;
case "3mo":
$ts = "time > now() - interval 93 day";
break;
case "6mo":
$ts = "time > now() - interval 186 day";
break;
case "1y":
$ts = "time > now() - interval 365 day";
break;
case "10y":
$ts = "time > now() - interval 3650 day";
break;
default:
$ts = "time > now() - interval 1 day";
}

$db = mysql_connect("localhost", "...", "...");
mysql_set_charset("utf8");
mysql_select_db("onewire",$db);

if (empty($towatt))
{
$query = "SELECT UNIX_TIMESTAMP(time)*1000 \"time\", value from data where
sensorid=$sensorid and property=$property and aggregate=$aggregate and period=$
period and $ts order by time";
}
else
{
$query = "SELECT UNIX_TIMESTAMP(time)*1000 \"time\", value*60 \"value\" fr
om data where sensorid=$sensorid and property=$property and aggregate=$aggregate
and period=$period and $ts order by time";
}

$result = @mysql_query ($query);
$arr = array();
while($row = mysql_fetch_object($result))
{
$arr[] = array($row->time*1,$row->value*1);
}


$query2 = "SELECT a.name \"sensor\", b.name \"signal\", b.enhet \"enhet\" FROM sensors a, properties b WHERE a.sensorid=$sensorid an
d b.sensorid=$sensorid and b.propertyid=$property";
$result2 = @mysql_query ($query2);
while($row = mysql_fetch_object($result2))
{
$sensor = $row->sensor;
$signal = $row->signal;
$enhet = $row->enhet;
}

echo "{";
if (empty($nolabel))
{
echo "\n\"label\": \"$sensor - $signal ($enhet)\",";
}
echo "\n\"data\": ";
echo json_encode($arr);

if (!empty($type))
{
switch($type) {
case "points" : echo "\n,\"points\": { \"show\": \"true\" }"; break;
case "bars" : echo "\n,\"bars\": { \"show\": \"true\" }"; break;
default : break;
}
}

if (is_numeric($color))
{
echo ",\n\"color\": $color";
}

if (!empty($axis))
{
echo "\n,\"yaxis\": $axis";
}

echo "\n}\n";

mysql_close();
?>
Om traktorn stjälper; håll i ratten, hoppa ej!
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: MySQL -> PHP -> Highcharts, problem att få till rätt for

Inlägg av flyvert »

PS
Länka gärna in en bild på dina Highcharts - jag utvärderar fn Flot, men är nyfiken om det finns alternativ...
DS

/f
Om traktorn stjälper; håll i ratten, hoppa ej!
hellgun
Tar hemautomation på allvar
Inlägg: 76
Blev medlem: 22 apr 2010, 12:16

Re: MySQL -> PHP -> Highcharts, problem att få till rätt for

Inlägg av hellgun »

Tusen tack flyvert!!!

Mha din kod har jag nu fått till rätt format och tidsaxeln i mina diagram visas rätt. Jag har precis kommit igång så jag har bara ett basalt area-diagram över dygnsvärden för elförbrukning men du kan kolla på det här (tidsintervall anges i URL:en):

http://silvertejp.mine.nu/mysql/dygn.ph ... 2013-10-31
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: MySQL -> PHP -> Highcharts, problem att få till rätt for

Inlägg av flyvert »

hellgun skrev:Tusen tack flyvert!!!

Mha din kod har jag nu fått till rätt format och tidsaxeln i mina diagram visas rätt. Jag har precis kommit igång så jag har bara ett basalt area-diagram över dygnsvärden för elförbrukning men du kan kolla på det här (tidsintervall anges i URL:en):

http://silvertejp.mine.nu/mysql/dygn.ph ... 2013-10-31
Det där såg ju inte så tokigt ut alls!...
... listan över saker jag vill experimentera med blir bara längre o längre. :lol:

Men fn. är utmaningen att rigga en webkamera att fotografera min fjärrvärmedebiteringsdosas display och få till teckentolkning med phpOCR eller något annat så att man kan börja logga debiterad effekt (just nu loggar jag bara värmeväxlartemperaturerna med utanpåliggande sensorer o tillverkar ett beräknat effektuttag med antagandet att flödet i sekundärkretsen är konstant... :? ).

/f
Om traktorn stjälper; håll i ratten, hoppa ej!
Skriv svar