Gut, jetzt geht es an die Darstellung mit dem Browser. Dazu werden erst einmal die Highcharts Java Script Bibliotheken benötigt. Die Bibliotheken für den nicht kommerziellen Einsatz gibt es unter http://www.highcharts.com/download. Nachdem das Paket heruntergeladen und entpackt wurde, wird alles, was im Verzeichnis "js" des Highcharts Paketes liegt auf den Raspberry unter "js/lib" im Webverzeichnis abgelegt.

Der Inhalt sollte dann wie folgt aussehen (die Dateien steelseries-min.js und tween-min.js gehören zu den Steelseries Gauges):

mypywws@rcweb /var/www/js/lib $ ls
adapters
highcharts-3d.src.js
highcharts.js
highcharts-more.src.js
modules
themes
highcharts-3d.js
highcharts-all.js
highcharts-more.js
highcharts.src.js
steelseries-min.js
tween-min.js

Damit die Highcharts verwendet werden können, benötigen wir jetzt eine Java Script Datei mit dem Namen "24hrsChart.js", welche im Verzeichnis "js" abgelegt wird. Der Inhalt der Datei sieht wie folgt aus:

$(function () {
	var chart, options, rawRealtime, interval,
		// countdown timer, 60 secs/1 min
		count = 60,

		// 120 = 2 hours at 1 minute per data point
		numDisplayRecs = 24,
		
		// Returns a UTC date value from date & time strings
		getDate = function (strDate, strTime) {
			var d = strDate.split(dateDelimiter),
				t = strTime.split(timeDelimiter);
			return Date.UTC('20' + d[2], +d[1] - 1, d[0], t[0], t[1], t[2]);
		};
		
    $(document).ready(function () {
        // define the chart options
        temp_opts = { chart: { renderTo: 'canvas_temp' },
			        credits: { enabled: false },
					title: { text: 'Verlauf, 24 Stunden', y: 10, margin: 20 },
					subtitle: { text: null },
					xAxis: { type: 'datetime', maxPadding: 0, minPadding: 0, dateTimeLabelFormats: { millisecond: '%H:%M:%S', second: '%H:%M:%S', minute: '%H:%M', hour: '%H:%M' }	},
					yAxis: [ { // y axis 0 
								title: { text: 'Temperatur (°C)' },

								opposite: true,
								min: -20,
								max: 40
								}, 
							{ // y axis 1
								title: { text: 'Luftdruck (hPa)' },
								opposite: true,
								min: 970,
								max: 1040,
								labels: {
									formatter: function () {
										return this.value.toFixed(1);
									}
								}
							}, 
							{ // y axis 2
								title: { text: 'Regen (mm)' },
								min: 0,
								minRange: 1
							}, 
							{ // y axis 3 
								title: { text: 'Luftfeuchte (%)' },
								max: 100
							},
							{ // y axis 4 
								title: { text: 'Taupunkt (°C)' },

								opposite: true,
								min: -20,
								max: 40
							}

							],

					legend: {
						align: 'left',
						verticalAlign: 'top',
						y: 5,
						floating: true,
						borderWidth: 0
					},

					plotOptions: {
						series: {
							cursor: 'pointer',
							marker: { enabled: false }
						}
					},

            series: [
				{
					name: 'Temperatur',
					type: 'spline',
					data: [],
					yAxis: 0,
					tooltip: { valueSuffix: ' °C' }
                }, 
				{
					name: 'Luftdruck',
					type: 'spline',
					data: [],
					yAxis: 1,
					tooltip: { valueSuffix: ' hPa' }
                }, 
				{
					name: 'Regen',
					type: 'area',
					data: [],
					yAxis: 2,
					tooltip: { valueSuffix: ' mm' },
					color: 'rgba(100,200,255,0.8)',
					fillColor: {
                        linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1},
                        stops: [
                            [0, 'rgba(10,100,255,0.3)'],
                            [1, 'rgba(2,0,0,0)']
                        ]
					}
                }, 
				{
					name: 'Luftfeuchte',
					type: 'spline',
					data: [],
					yAxis: 3,
					tooltip: { valueSuffix: ' %' }
                }, 
				{
					name: 'Taupunkt',
					type: 'spline',
					data: [],
					yAxis: 4,
					tooltip: { valueSuffix: ' °C' }

                }
            ]
        }; // end temp_opts

       wind_opts = { chart: { renderTo: 'canvas_wind' },
			        credits: { enabled: false },
					title: { text: 'Wind, 24 Stunden Verlauf', y: 10, margin: 20 },
					subtitle: { text: null },
					xAxis: { type: 'datetime', maxPadding: 0, minPadding: 0, dateTimeLabelFormats: { millisecond: '%H:%M:%S', second: '%H:%M:%S', minute: '%H:%M', hour: '%H:%M' }	},
					yAxis: [ { // right y axis 0 
								title: { text: 'Wind (km/h)' },
								min: 0,
								max: 60
								}, 
							{ // right y axis 0 
								title: { text: 'Boeen (km/h)' },

								opposite: true,
								min: 0,
								max: 60
							}
							],

					legend: {
						align: 'left',
						verticalAlign: 'top',
						y: 5,
						floating: true,
						borderWidth: 0
					},

					plotOptions: {
						series: {
							cursor: 'pointer',
							marker: { enabled: false }
						}
					},
            series: [
				{
					name: 'Wind',
					type: 'spline',
					data: [],
					yAxis: 0,
					tooltip: { valueSuffix: ' km/h' }
                }, 
				{
					name: 'Böen',
					type: 'spline',
					data: [],
					yAxis: 1,
					tooltip: { valueSuffix: ' km/h' }
                }
            ]
        }; // end wind_opts

       wind_dir_opts = { chart: { renderTo: 'canvas_wind_dir', type: 'scatter' },
			        credits: { enabled: false },
					title: { text: 'Windrichtung, 24 Stunden Verlauf', y: 10, margin: 20 },
					subtitle: { text: null },
					xAxis: { type: 'datetime', maxPadding: 0, minPadding: 0, dateTimeLabelFormats: { millisecond: '%H:%M:%S', second: '%H:%M:%S', minute: '%H:%M', hour: '%H:%M' }	},
					yAxis: [ { // right y axis 0 
								title: { text: 'Richtung' },
								min: 0,
								max: 360
								}
							],
					legend: {
						align: 'left',
						verticalAlign: 'top',
						y: 5,
						floating: true,
						borderWidth: 0
					},
            plotOptions: {
                scatter: {
                    marker: {
                        radius: 5,
                        states: {
                            hover: {
                                enabled: true,
                                lineColor: 'rgb(100,100,100)'
                            }
                        }
                    },
                    states: {
                        hover: {
                            marker: {
                                enabled: false
                            }
                        }
                    },
                    tooltip: {
                        headerFormat: '<b>{series.name}</b><br>',
                        pointFormat: '{point.y}'
                    }
                }
            },
            series: [
				{
					name: 'Wind',
					data: [],
					yAxis: 0,
					tooltip: { valueSuffix: ' °' }
                }
            ]
        }; // end wind_dir_opts

		// Fetch the 'historic' realtime data from the server using a PHP call
        $.ajax({
			// Use the 'webtag' names of the fields to pull back
            url: './php-scripts/realtimeLogParser24hrs.php?count=' + numDisplayRecs + '&temp_out&hum_out&dew_point&rel_pressure&rain&wind_ave&wind_gust&wind_dir&wind_dir_text',
            datatype: "json",
            success: function (resp) {
				// pre-load the log data
				temp_opts.series[0].data = resp.temp_out;
				temp_opts.series[1].data = resp.rel_pressure;
				temp_opts.series[2].data = resp.rain;
				temp_opts.series[3].data = resp.hum_out;
				temp_opts.series[4].data = resp.dew_point;
				
				// draw the chart
                chart = new Highcharts.Chart(temp_opts);

				// wind speed series
				wind_opts.series[0].data = resp.wind_ave;
				wind_opts.series[1].data = resp.wind_gust;

				// draw wind speed chart
                chart = new Highcharts.Chart(wind_opts);

				// wind dir series
				wind_dir_opts.series[0].data = resp.wind_dir;

				// draw wind speed chart
                chart = new Highcharts.Chart(wind_dir_opts);
            }

        }); // end ajax()

		// fetch some more data every count interval
		interval = setInterval(function () { getRealtime(); }, count * 1000);
    }); // end document ready()
});

Die Datei beruht wieder auf dem Code von sandaysoft und wurde nur von mir entsprechend meinen Anforderungen angepasst.

Im letzten Schritt muss noch die Datei "24hrsChart.php" erstellt werden, welche vom Browser aufgerufen wird. Diese stellt dann das Gerüst der angezeigten Seite dar und lädt die Highcharts Darstellung. Die Datei "24hrsChart.php" wird im Doc Root des Webserver, ebenso wie die "index.php" abgelegt. Durch Eingabe der URL "http://<Name des raspberies oder dessen IP-Adresse>/24hrsChart.php" wird diese dann aufgerufen. Hier nun der Inhalt der PHP Datei:

<!DOCTYPE HTML>
<html>
<!--
  Realtime Cumulus Highcart
  Mark Crossley 2012
  v1.0 - 29 Nov 2012
-->
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta name="description" content="Meine Wetterstation"/>
	<meta name="keywords" content="aktuelles wetter"/>
	<title>Meine Wetterstation</title>
	<meta http-equiv="pragma" content="no-cache" />
	<meta http-equiv="expires" content="-1" />
	<meta http-equiv="Cache-control" content="no-cache" />

    <link rel="stylesheet" type="text/css" href="/./css/highslide.css" />
    <link rel="stylesheet" href="/./css/template.css" type="text/css" />

</head>
<body>
	<div id="page">

		<div id="charts">
			<!-- Stick the chart in here -->
			<div id="canvas_wind" style="min-width: 400px; width: 740px; height: 400px; margin-top: 5px; margin-left: 2px; margin-right: 2px;"></div>
			<div id="canvas_wind_dir" style="min-width: 400px; width: 740px; height: 400px; margin-top: 5px; margin-left: 2px; margin-right: 2px;"></div>
			<div id="canvas_temp" style="min-width: 400px; width: 740px; height: 400px; margin-top: 5px; margin-left: 2px; margin-right: 2px;"></div>
		</div>
	
	</div>
	
    <!-- JQuery script -->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>

    <!-- Basic Highcharts script -->
    <script src="/./js/lib/highcharts.js"></script>
    <!-- Add some 'styling' -->
    <script src="/./js/lib/themes/grid.js"></script>

    <!-- Additional files for the Highslide popup effect -->
    <script src="http://www.highcharts.com/highslide/highslide-full.min.js"></script>
    <script src="http://www.highcharts.com/highslide/highslide.config.js"></script>

	<script src="/./js/24hrsChart.js"></script>

</body>
</html>

Ach ja, auch hier gibt es eine CSS Datei. Dies lässt sich direkt von "http://www.highcharts.com/highslide/highslide.css" herunterladen oder direkt wie folgt referenzieren:

<link rel="stylesheet" type="text/css" href="http://www.highcharts.com/highslide/highslide.css" />

Hinweis für "Offline User" (d. h. Nutzer welche die Wetterdaten auch ohne externe Internetverbindung nutzen möchten, z. B. auf einem Boot):

Wenn eine Bibliothek oder Datei über eine CDN oder einen externen Link eingebunden wird, dann muss dies für den offline Betrieb aufgelöst werden. Dazu den referenzierten Inhalt über den Browser aufrufen, bzw. mit Rechtsklick und "Speichern unter" herunterladen. Dann die entsprechende Datei auf dem Raspberry im Webverzeichnis ablegen und anschliessend die Referenz auf die lokale Datei setzen.


Viel Spaß noch beim Nachbauen!