Na avonden proberen geef ik toch bijna de hoop op... Ik hoop dat jullie me kunnen helpen.

Ik heb een mysql tabel die elke 10 seconden van nieuwe gegevens wordt voorzien. Van een van de kolommen wil ik de waarde weergegeven in een teller op basis van Highcharts.

Bij de supportpagina heb ik al wat gevonden over live gegevens maar dat is voornamelijk voor lijn grafieken. De teller heeft steeds maar 1 waarde nodig die elke 10 seconden geupdate moet worden en geen reeks waar steeds een waarde bij komt. Ik heb nu de volgende code:

[code lang=html]
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Highcharts Example</title>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">

var chart

/**
* Request data from the server, add it to the graph and set a timeout
* to request again
*/
function requestData() {
$.ajax({
url: 'live-server-data.php',
success: function(point) {
var series = chart.series[0],
shift = series.data.length > 20; // shift if the series is
// longer than 20

// add the point
chart.series[0].addPoint(point, true, shift);

// call it again after one second
setTimeout(requestData, 1000);
},
cache: false
});
}

$(function () {

$('#container').highcharts({

chart: {
type: 'gauge',
events:{load: requestData},
plotBackgroundColor: null,
plotBackgroundImage: null,
plotBorderWidth: 0,
plotShadow: false
},

title: {
text: 'Speedometer'
},

pane: {
startAngle: -150,
endAngle: 150,
background: [{
backgroundColor: {
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
stops: [
[0, '#FFF'],
[1, '#333']
]
},
borderWidth: 0,
outerRadius: '109%'
}, {
backgroundColor: {
linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
stops: [
[0, '#333'],
[1, '#FFF']
]
},
borderWidth: 1,
outerRadius: '107%'
}, {
// default background
}, {
backgroundColor: '#DDD',
borderWidth: 0,
outerRadius: '105%',
innerRadius: '103%'
}]
},

// the value axis
yAxis: {
min: 0,
max: 200,

minorTickInterval: 'auto',
minorTickWidth: 1,
minorTickLength: 10,
minorTickPosition: 'inside',
minorTickColor: '#666',

tickPixelInterval: 30,
tickWidth: 2,
tickPosition: 'inside',
tickLength: 10,
tickColor: '#666',
labels: {
step: 2,
rotation: 'auto'
},
title: {
text: 'km/h'
},
plotBands: [{
from: 0,
to: 120,
color: '#55BF3B' // green
}, {
from: 120,
to: 160,
color: '#DDDF0D' // yellow
}, {
from: 160,
to: 200,
color: '#DF5353' // red
}]
},

series: [{
name: 'Speed',
data: [80],
tooltip: {
valueSuffix: ' km/h'
}
}]

},
// Add some life
function (chart) {
if (!chart.renderer.forExport) {
setInterval(function () {
var point = chart.series[0].points[0],
newVal,
inc = Math.round((Math.random() - 0.5) * 20);

newVal = point.y + inc;
if (newVal < 0 || newVal > 200) {
newVal = point.y - inc;
}

point.update(newVal);

}, 3000);
}
});
});
</script>
</head>
<body>

<script src="hightcharts/js/highcharts.js"></script>
<script src="hightcharts/js/highcharts-more.js"></script>
<script src="hightcharts/js/modules/exporting.js"></script>

<div id="container" style="min-width: 310px; max-width: 400px; height: 300px; margin: 0 auto"></div>

</body>
</html>
[/code]
Mijn live-server-data.php geeft bv: {"p1_current_power_in":"0.940","time":1381781571000}.

Wie kan me op weg helpen?

Ze geven een duidelijk voorbeeld op jsfiddle.net.
Onderin staat: function (chart) {

Deze functie zorgt er voor dat de naald in de demo wat gaat bewegen. Dit deel moet je dus vervangen voor een eigen functie die via een ajax call de nieuwe waarde ophaalt. Dan verwacht deze meter een waarde tussen 0 en 200. In jouw voorbeeld krijg je een waarde van 0.940 terug, bijna niets dus op een schaal van 200. Daarom heb ik in onderstaand voorbeeld de waarde van jouw server maar met 25 vermenigvuldigd. Daar zul zelf nog een betere oplossing voor moeten bedenken.


<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/highcharts-more.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>
<script>
$(function () {

    $('#container').highcharts({

        chart: {
            type: 'gauge',
            plotBackgroundColor: null,
            plotBackgroundImage: null,
            plotBorderWidth: 0,
            plotShadow: false
        },

        title: {
            text: 'Speedometer'
        },

        pane: {
            startAngle: -150,
            endAngle: 150,
            background: [{
                backgroundColor: {
                    linearGradient: {
                        x1: 0,
                        y1: 0,
                        x2: 0,
                        y2: 1
                    },
                    stops: [
                        [0, '#FFF'],
                        [1, '#333']
                    ]
                },
                borderWidth: 0,
                outerRadius: '109%'
            }, {
                backgroundColor: {
                    linearGradient: {
                        x1: 0,
                        y1: 0,
                        x2: 0,
                        y2: 1
                    },
                    stops: [
                        [0, '#333'],
                        [1, '#FFF']
                    ]
                },
                borderWidth: 1,
                outerRadius: '107%'
            }, {
                // default background
            }, {
                backgroundColor: '#DDD',
                borderWidth: 0,
                outerRadius: '105%',
                innerRadius: '103%'
            }]
        },

        // the value axis
        yAxis: {
            min: 0,
            max: 200,

            minorTickInterval: 'auto',
            minorTickWidth: 1,
            minorTickLength: 10,
            minorTickPosition: 'inside',
            minorTickColor: '#666',

            tickPixelInterval: 30,
            tickWidth: 2,
            tickPosition: 'inside',
            tickLength: 10,
            tickColor: '#666',
            labels: {
                step: 2,
                rotation: 'auto'
            },
            title: {
                text: 'km/h'
            },
            plotBands: [{
                from: 0,
                to: 120,
                color: '#55BF3B' // green
            }, {
                from: 120,
                to: 160,
                color: '#DDDF0D' // yellow
            }, {
                from: 160,
                to: 200,
                color: '#DF5353' // red
            }]
        },

        series: [{
            name: 'Speed',
            data: [80],
            tooltip: {
                valueSuffix: ' km/h'
            }
        }]

    },
    // Add some life
    function (chart) {
        if (!chart.renderer.forExport) {
            setInterval(function () {
                $.ajax({
                    url: "live-server-data.php",
                }).done(function(data) {
                    var point = chart.series[0].points[0];
                    point.update(data.p1_current_power_in * 25);
                });
            }, 3000);
        }
    });
});
</script>
</head>

<body>
<div id="container" style="min-width: 310px; max-width: 400px; height: 300px; margin: 0 auto"></div>
</body>
</html>
Ik had het voorbeeld in jsfiddle.net gezien maar het lukte niet om de juiste code bij function (chart) te krijgen zodat e.e.a. ging werken. Omdat ik het al tig keer had geprobeerd, was ik met een schone lei begonnen en had ik in bovenstaande code de layout van de gauge nog niet aangepast. Het moet een gauge worden welke mijn huidige stroomverbruik moet weergeven. Ik heb nu de maximale waarde van de gauge op 8000 Watt gezet. De p1_current_power_in is in kilowatt dus deze vermenigvuldig ik met 1000. Dit werkt nu prima. Bedankt voor de hulp!

Maar nu:
Elke 10 seconden wordt er een regel aan mijn database toegevoegd en door de interval van de functie op 3000 te zetten loop ik maximaal 3 seconden achter op de werkelijkheid. Maar als ik de pagina laad begint de gauge op 0 (de waarde welke ik bij "data: [0]" invul. En dan pas na 3 seconden wordt deze bijgewerkt. Hoe zorg ik er voor dat bij het laden van de pagina de waarde al opgevraagd wordt uit de database en wordt weergegeven?

Ik heb nu de volgende code:

<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>Highcharts Example</title>

		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
		<script type="text/javascript">

$(function () {
	
    $('#container').highcharts({
	
	    chart: {
	        type: 'gauge',
	        plotBackgroundColor: null,
	        plotBackgroundImage: null,
	        plotBorderWidth: 0,
	        plotShadow: false
	    },
	    
	    title: {
	        text: 'Stroomverbruik'
	    },
	    
	    pane: {
	        startAngle: -150,
	        endAngle: 150,
	        background: [{
	            backgroundColor: {
	                linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
	                stops: [
	                    [0, '#FFF'],
	                    [1, '#333']
	                ]
	            },
	            borderWidth: 0,
	            outerRadius: '109%'
	        }, {
	            backgroundColor: {
	                linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
	                stops: [
	                    [0, '#333'],
	                    [1, '#FFF']
	                ]
	            },
	            borderWidth: 1,
	            outerRadius: '107%'
	        }, {
	            // default background
	        }, {
	            backgroundColor: '#DDD',
	            borderWidth: 0,
	            outerRadius: '105%',
	            innerRadius: '103%'
	        }]
	    },
	       
	    // the value axis
	    yAxis: {
	        min: 0,
	        max: 8000,
	        
	        minorTickInterval: 'auto',
	        minorTickWidth: 1,
	        minorTickLength: 10,
	        minorTickPosition: 'inside',
	        minorTickColor: '#666',
	
	        tickPixelInterval: 30,
	        tickWidth: 2,
	        tickPosition: 'inside',
	        tickLength: 10,
	        tickColor: '#666',
	        labels: {
	            step: 2,
	            rotation: 'auto'
	        },
	        title: {
	            text: 'Watt'
	        },
	        plotBands: [{
	            from: 0,
	            to: 1500,
	            color: '#55BF3B' // green
	        }, {
	            from: 1500,
	            to: 3000,
	            color: '#DDDF0D' // yellow
	        }, {
	            from: 3000,
	            to: 8000,
	            color: '#DF5353' // red
	        }]        
	    },
	
	    series: [{
	        name: 'Huidig verbruik',
	        data: [0]
	    }]
	
	}, 
    // Add some life
    function (chart) {
        if (!chart.renderer.forExport) {
            setInterval(function () {
                $.ajax({
                    url: "live-server-data.php",
                }).done(function(data) {
                    var point = chart.series[0].points[0];
                    point.update(data.p1_current_power_in*1000);
                });
            }, 3000);
        }
    });
});
		</script>
	</head>
	<body>
    
<script src="hightcharts/js/highcharts.js"></script>
<script src="hightcharts/js/highcharts-more.js"></script>
<script src="hightcharts/js/modules/exporting.js"></script>

<div id="container" style="min-width: 310px; max-width: 400px; height: 300px; margin: 0 auto"></div>

	</body>
</html>

Het mooiste zou zijn om je hele bestand op te slaan als een php bestand. (misschien heb je dat al)
dan kun je regel 99

            data: [0]

vervangen door

            data: [<?php echo $waarde; ?> ]

waarbij $waarde natuurlijk het energieverbruik is van dat moment



[size=xsmall]Toevoeging op 22/10/2013 23:26:54:[/size]

NOU DIE [ /CODE ] moet er uit
Dat ik daar zelf niet opgekomen ben... Ik zat al te zoeken naar javascript met document.ready etc. Bedankt!
Heren,

Dit topic is al een tijdje afgerond, maar ik heb een probleempje wat hier erg op lijkt; de waarde die ik in de MySQL database ophaal, wordt niet overgenomen door de gauge.

Hieronder mijn codes;

gauge_data.php;

<title>Laatste wattage</title>
<?php
// Start MySQL Connection
    include('dbconnect.php');
if (!$dbh) {die('Could not connect: ' . mysql_error());}
  
//identify last row
$count=mysql_num_rows(mysql_query("SELECT * FROM kWh_meter")); //gives number of rows
$result = mysql_query("SELECT * FROM kWh_meter LIMIT ". ($count-1).", 1"); //gives number of last row

//get data
echo ("{");
echo ("\"");
echo ("Huidige_stroom");
echo ("\"");
echo (":");
echo ("\"");
while($row = mysql_fetch_array($result)) {echo  $row['Watt'];} //finds Watt value of last row
echo ("\"");
echo ("}");

mysql_close($con);
?>


Deze php geeft nu in een webbrowser een enkele regel die er als volgt uit ziet;
{"Huidige_stroom":"686"}


Dan de html van de gauge zelf;

<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>Huidige wattage</title>

		<script type="text/javascript" 
		src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        
				<script type="text/javascript">
$(function () {

    $('#container').highcharts({

        chart: {
            type: 'gauge',
            plotBackgroundColor: null,
            plotBackgroundImage: null,
            plotBorderWidth: 0,
            plotShadow: false
        },

        title: {
            text: 'Huidige wattage'
        },

        pane: {
            startAngle: -150,
            endAngle: 150,
            background: [{
                backgroundColor: {
                    linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
                    stops: [
                        [0, '#FFF'],
                        [1, '#333']
                    ]
                },
                borderWidth: 0,
                outerRadius: '109%'
            }, {
                backgroundColor: {
                    linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
                    stops: [
                        [0, '#333'],
                        [1, '#FFF']
                    ]
                },
                borderWidth: 1,
                outerRadius: '107%'
            }, {
                // default background
            }, {
                backgroundColor: '#DDD',
                borderWidth: 0,
                outerRadius: '105%',
                innerRadius: '103%'
            }]
        },

        // the value axis
        yAxis: {
            min: 0,
            max: 8000,

            minorTickInterval: 'auto',
            minorTickWidth: 1,
            minorTickLength: 10,
            minorTickPosition: 'inside',
            minorTickColor: '#666',

            tickPixelInterval: 30,
            tickWidth: 2,
            tickPosition: 'inside',
            tickLength: 10,
            tickColor: '#666',
            labels: {
                step: 2,
                rotation: 'auto'
            },
            title: {
                text: 'Watt'
            },
            plotBands: [{
                from: 0,
                to: 1500,
                color: '#55BF3B' // green
            }, {
                from: 1500,
                to: 3000,
                color: '#DDDF0D' // yellow
            }, {
                from: 3000,
                to: 8000,
                color: '#DF5353' // red
            }]
        },

        series: [{
            name: 'Wattage',
            data: [ 1 ],
			
           // tooltip: {valueSuffix: ' Watt'}
        }]
    },
        // Add some life
        function (chart) {
            if (!chart.renderer.forExport) {
                setInterval(function () {
					
					$.ajax({
						url: "gauge_data.php",
					}).done (function(data) {
						var point = chart.series[0].points[0];
						point.update(data.Huidige_stroom);
					});
                }, 3000);
            }
        });
});
		</script>
	</head>
	<body>

<script src="/js/highcharts.js"></script>
<script src="/js/highcharts-more.js"></script>
<script src="/js/modules/exporting.js"></script>

<div id="container" style="min-width: 310px; max-width: 400px; height: 300px; margin: 0 auto"></div>

	</body>
</html>



Wat ik zie; de naald blijft op de beginwaarde (1) staan. De waarde van de php wordt dus niet overgenomen.

Heb overigens geen opleiding / training gehad in html etc. Ik google mijn weg hierdoorheen, maar na 2 weken puzzelen, blijft ik hierop hangen. Een helpende hand wordt erg gewaardeerd.

Alvast dank voor reacties.

mvg,
Danny
Twee puntjes die misschien je probleem zouden kunnen oplossen:


{"Huidige_stroom":"686"}


Hier staat 686 tussen quotes en wordt het gezien als een brok tekst. En met tekst kun je niet rekenen.
Probeer het eens op deze manier:


{"Huidige_stroom":686}


Verder mist gauge_data.php een header() waarmee je de browser laat weten dat je JSON data retourneert.
Tevens hoort er geen enkele HTML in te staan. dus ook niet de <title></title> tag.

gauge_data.php:
<?php

// laat de browsers weten dat we JSON data terugsturen
header('Content-Type: application/json');

// Start MySQL Connection
include('dbconnect.php');
if (!$dbh) {
echo '{"status":"failure","error":"' . mysql_error() . '"}'; // geef ook foutmeldingen terug in JSON
exit;
}

//identify last row

$count = mysql_num_rows(mysql_query("SELECT * FROM kWh_meter")); //gives number of rows
$result = mysql_query("SELECT * FROM kWh_meter LIMIT ". ($count-1).", 1"); //gives number of last row

if(!$result)
{
echo '{"status":"failure","error":"query mislukt"}';
exit;
}

// omdat er maar één rij opgevraagd wordt is een IF logischer dan een WHILE
if($row = mysql_fetch_array($result)) {
echo '{"status":"success","Huidige_stroom":' . $row['Watt'] . '}';
exit;
}

echo '{"status":"failure","error":"Geen informatie gevonden. (tabel kWh_meter is leeg?)"}';
?>

[size=xsmall]Toevoeging op 04/07/2015 11:52:40:[/size]

Verander dit:

$.ajax({
	url: "gauge_data.php",
}).done (function(data) {
	var point = chart.series[0].points[0];
	point.update(data.Huidige_stroom);
});


naar dit:

$.ajax({
	url: "gauge_data.php",
}).done (function(data) {
	if(data.status == "success") {
		var point = chart.series[0].points[0];
		point.update(data.Huidige_stroom);
	} else {
		alert(data.error);
	}
});

Een while() na een query met LIMIT 1 => Niet logisch.
<?php
//identify last row
$count=mysql_num_rows(mysql_query("SELECT * FROM kWh_meter")); //gives number of rows
$result = mysql_query("SELECT * FROM kWh_meter LIMIT ". ($count-1).", 1"); //gives number of last row
?>


I LOLed.

Als je je tabel een auto_increment kolom heeft (of had gegeven) en het feit dat je alleen de kolom "Watt" lijkt te gebruiken, kun je volstaan met:

SELECT Watt
FROM kWh_meter
ORDER BY <je_auto_increment_kolom> DESC
LIMIT 1
Allen super bedankt voor jullie snelle en inhoudelijk goede reactie!
Het werkt nu als een zonnetje.

De meeste codes heb ik bij elkaar gegoogled, wellicht daardoor niet helemaal logisch of onnodige code.

Reageren