Ochsner Warmtepomp – Grafiek TQE (MySQL / CSV)
Dit voobeeld laat zien hoe je vanuit een MySQL database een CSV bestand schrijft voor een grafiek met amCharts, het gaat hier om de laagste TQE waarde van een gegeven datum in de database.
Wat heb je nodig?
1) MySQL database gevuld met data van dit script voor de wamtepomp.
2) amCharts
Waarom eerst naar CSV?
Het script is gemaakt om standaard 365 dagen terug te gaan in de tijd vanaf de datum van vandaag, de query kan hier 20 a 30 seconden over doen (op een Synology NAS) voordat alle gegevens bekend zijn, dit komt omdat het script de database moet doorlezen, welteverstaan 365 dagen x 96 regels = 35040 regels, dit duurt even, daarom is het mogelijk om dit script ook in een CRON te zetten vlak na het wegzetten van de warmtepompgegevens. Op deze maier wordt de grafiek direct getoont en hoeft de gebruiker niet eerst te wachten.
Hoe werkt het?
Onderstaand script leest de gegevens uit de MySQL database waarin de warmtepompgegevens staan, het leest de ca 96 regels van een dag door en gaat dan steeds een dag terug (standaard 365 dagen, anders het opgegevens aantal), het script zet de laagste TQE waarde weg in een CSV bestand ‘\data\warmtepomp_tqe’ (punt-komma gescheiden):
Kolom 1 = Datum in YYYY-MM-DD
Kolom 2 = Getal (laagste waarde TQE van deze datum)
Bijvoorbeeld voor 20 dagen aan gegevens: warmtepomp_tqe.php?dagen=20
Krijg je dit in je browser te zien:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
- maak een folder aan genaamd ' data '...de folder is aanwezig! - sla de gegevens op in bestand ' data\warmtepomp_tqe.csv '...succes! Opgeslagen CSV gegevens: (rood = geen gegevens beschikbaar en zijn NIET opgeslagen!) 2014-12-02;10.2 2014-12-03;9.8 2014-12-04;8.9 2014-12-05;9.6 2014-12-06;9.4 2014-12-07;8.9 2014-12-08;9.1 2014-12-09;8.7 2014-12-10;8.8 2014-12-11;8.8 2014-12-12;8.9 2014-12-13;8.6 2014-12-14;8.6 2014-12-15;8.6 2014-12-16;8.4 2014-12-17;8.4 2014-12-18;8.8 2014-12-19;8.2 2014-12-20;8.3 2014-12-21;8.3 > Aantal regels weggeschreven: 20 -- Einde! -- |
en de CSV in ‘data\warmtepomp_tqe.csv’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
2014-12-02;10.2 2014-12-03;9.8 2014-12-04;8.9 2014-12-05;9.6 2014-12-06;9.4 2014-12-07;8.9 2014-12-08;9.1 2014-12-09;8.7 2014-12-10;8.8 2014-12-11;8.8 2014-12-12;8.9 2014-12-13;8.6 2014-12-14;8.6 2014-12-15;8.6 2014-12-16;8.4 2014-12-17;8.4 2014-12-18;8.8 2014-12-19;8.2 2014-12-20;8.3 2014-12-21;8.3 |
Taakplanner (CRON)
Zet het aanroepen van dit script in de taakplanner (bijvoorbeeld van een Synology) om zo altijd over de laatste 365 dagen de actuele gegevens weg te schrijven naar het CSV bestand:
Voorbeeld van de Warmtepomp CRONs:
Cron 1 > 00:15 > php /volume1/web/boeke/warmtepomp.php gisteren database
Cron 2 > 00:20 > php /volume1/web/boeke/warmtepomp_tqe.php
Het ‘warmtepomp_tqe.php’ script (ik heb commentaar regels tussen het script gezet)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
<?php // ------------------------------------------------------------------------------ // Dit is een voorbeeld script voor het uitlezen van de minimale waarde TQE // uit een kolom van een (MySQL) database waarin Ochsner Wamtepomp gegevens staan. // // De gegevens worden opgeslagen in een TEMP folder als CSV bestand. // // Formaat CSV bestand: // [KOLOM 1] ; [KOLOM2] // YYYY-MM-DD ; TQE waarde (laagste van de dag) // // Het aantal historiedagen kan ingesteld worden met dagen=[n] // Voorbeeld: warmtepomp_tqe.php?dagen=20 (voor 20 dagen) // // Minimaal 1 dag en Maximaal 365 dagen. // LET OP: 365 dagen kan even duren (voor een synology). // // 2014-12-20 door Sebastiaan Ebeltjes. // ------------------------------------------------------------------------------ // Verander het pad naar de folder waar dit script in draait, doe je dit niet dan pakt // bijvoorbeeld de synology NAS '/volume1/homes/admin/' om bestanden in aan te maken. chdir(dirname(__FILE__)); // Inladen van de instellingen. include 'instellingen.php'; // Lokale instellingen. $tabelnaam = "warmtepomp"; $csv_divider = ";"; // Kijk of er een specifiek aantal 'historie' dagen zijn opgegeven via de URL of commandolijn. // Om de juiste variabelen te achterhalen moeten we eerst vaststellen of het // script gestart is via de browser of commandolijn. if (PHP_SAPI == "cli" OR PHP_SAPI == "cgi-fcgi") { // Dit PHP script is gestart via de commandolijn. if ($argv[1] == "") { // Geen aantal historie dagen opgegeven. $aantal_historie_dagen = 365; } else { // Het aantal historie dagen dat is opgegeven. $aantal_historie_dagen = $argv[1]; } } else { // Dit PHP script is gestart via de HTTP URL (browser). if ($_GET['dagen'] == "") { // Geen aantal historie dagen opgegeven. $aantal_historie_dagen = 365; } else { // Het aantal historie dagen dat is opgegeven. $aantal_historie_dagen = $_GET['dagen']; } } // Let op: historie dagen mag niet kleiner zijn dan 0, anders loopt de FOR loop oneindig door! if ($aantal_historie_dagen <=0) { $aantal_historie_dagen = 0; } // Een getal groter dan 365 is niet wenselijk! if ($aantal_historie_dagen >=365) { $aantal_historie_dagen = 365; } echo "- maak een folder aan genaamd ' data '..."; // Maak een folder aan "data" als de nog niet bestaat. // LET OP!: Je hebt wel de juiste rechten nodig om een folder aan te maken vanuit PHP, // gebruik CHMOD 0777 op de webfolder of maak de folder "data" zelf aan. // Controleer of de folder "data" bestaat. if (file_exists("data")) { // De folder bestaat, we hoeven niets te doen! echo "de folder is aanwezig!<br>"; } else { // De folder bestaat niet, we maken de folder aan. if (!mkdir("data", 0777, true)) { // De folder kan niet gemaakt worden die("fout!, kan de folder ' data ' niet maken...<br>"); // Eindig het script. exit; } else { echo "succes!<br>"; } } // Gegevens opslaan in een bestand. echo "- sla de gegevens op in bestand ' data\\warmtepomp_tqe.csv '..."; // Open een bestand voor het wegschrijven van de gegevens (bestand word overschreven). $bestand = fopen("data/warmtepomp_tqe.csv", "w"); if (fwrite($bestand, "") === FALSE) { echo "fout!, het bestand kan niet aangemaakt worden!<br>"; exit; } else { echo "succes!<br>"; } // Maak connectie met de database. $dbcon = mysqli_connect($database_adres, $database_login_naam, $database_login_wachtwoord, $database_naam); // Is de connectie gelukt?, zo niet...geef een foutmelding en sluit het script! if (mysqli_connect_errno()) { exit; } echo "<br>Opgeslagen CSV gegevens:<br>"; echo "(rood = geen gegevens beschikbaar en zijn NIET opgeslagen!)<br>"; $regelteller = 0; // Een teller om het aantal weggeschreven CSV regels te tellen. // Een loop voor het aantal dagen, te tellen naar 0. for ($i = $aantal_historie_dagen; $i > 0; $i--) { // Maak een Linux format tijd $unix_time = mktime(0, 0, 0, date("m"), date("d"), date("Y")); $vorige_dag = strtotime('-' . $i . ' day', $unix_time); $datum_iso = date('Y-m-d', $vorige_dag); // Explodeer datum in 3 variabelen. list($DY, $DM, $DD) = explode('-', $datum_iso); // Haal de laagste waarde TQE per dag op uit de database. $query=" SELECT MIN(TEMP_TQE) AS TEMP_TQE_MIN FROM " . $tabelnaam . " WHERE DY = " . $DY . " AND DM = " . $DM . " AND DD = " . $DD . " "; // Voer de query uit. $data = mysqli_query($dbcon, $query); // Zet het resultaat van de gevevens in een array. $resultaat = mysqli_fetch_assoc($data); // Zet de laagste waarde TQE uit de gegevens (resultaat) in een variabele. $TEMP_TQE_MIN = $resultaat['TEMP_TQE_MIN']; // Als we een waarde hebben dan deze wegschrijven naar het CSV bestand. if ($TEMP_TQE_MIN > 0) { fwrite($bestand, $datum_iso . $csv_divider . $TEMP_TQE_MIN . "\n"); echo "<a style='color:#000000'> " . $datum_iso . ";" . $TEMP_TQE_MIN . "</a><br>"; $regelteller = $regelteller + 1; } else { // Geen waarde gevonden, sla deze dag over (anders vallen er gaten bijvoorbeeld in een grafiek) echo "<b><a style='color:#FF0000'> " . $datum_iso . ";" . $TEMP_TQE_MIN . "</a></b><br>"; } } echo "<br> > Aantal regels weggeschreven: " . $regelteller . "<br>"; // Sluit de connectie met het bestand. fclose($bestand); // Sluit de Database verbinding mysqli_close($dbcon); echo "<br><br>-- Einde! --"; ?> |
TQE Grafiek
We gaan nu verder met de grafiek om het gegenereerde CSV bestand ‘data\warmtepomp_tqe.csv’ uit te lezen, we gebruiken hiervoor amCharts, ik heb een tutorial hier geschreven om CSV bestanden in te laden en naar de grafiek te “drukken”, maak een bestand aan ‘warmtepomp_tqe_grafiek.php‘ met de inhoud:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>TQE waarden warmtepomp</title> <script src="libs/amcharts/amcharts.js" type="text/javascript"></script> <script src="libs/amcharts/serial.js" type="text/javascript"></script> <script type="text/javascript"> var chartData = []; var chart = AmCharts.makeChart("chartdiv", { type: "serial", pathToImages: "libs/amcharts/images/", dataProvider: chartData, categoryField: "datum", categoryAxis: { parseDates: true, gridAlpha: 0.15, minorGridEnabled: true, axisColor: "#DADADA", title: "Datum" }, titles: [{ size: 15, text: "TQE waarden warmtepomp" }], valueAxes: [{ title: "Brontemperatuur in graden °C", axisAlpha: 0.2, id: "v1" }], graphs: [{ title: "TQE", id: "g1", valueAxis: "v1", valueField: "waarde", bullet: "round", bulletBorderColor: "#FFFFFF", bulletBorderAlpha: 1, lineThickness: 3, lineColor: "#b5030d", negativeLineColor: "#0352b5", balloonText: "[[category]]<br><b><span style='font-size:14px;'>[[value]] °C</span></b>" }], chartCursor: { fullWidth:true, cursorAlpha:0.1 }, chartScrollbar: { scrollbarHeight: 40, color: "#FFFFFF", autoGridCount: true, graph: "g1" }, mouseWheelZoomEnabled:true }); chart.addListener("dataUpdated", zoomChart); chart.dataDateFormat = "YYYY-MM-DD"; function loadCSV(file) { var request; if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari request = new XMLHttpRequest(); } else { // code for IE6, IE5 request = new ActiveXObject('Microsoft.XMLHTTP'); } request.open('GET', file, false); request.send(); parseCSV(request.responseText); } function parseCSV(data){ // Vervang UNIX nieuwe lijn karakters. data = data.replace (/\r\n/g, "\n"); // Vervang MAC nieuwe lijn karakters. data = data.replace (/\r/g, "\n"); // Splijt data in rijen. var rows = data.split("\n"); // Loop door alle rijen heen. for (var i = 0; i < rows.length; i++) { // Sla lege regels over. if (rows[i]) { // Splijt rij naar kolommen doormiddel van de onderbrekings karakter. var column = rows[i].split(";"); // De kolom is nu een array. // Het 1e deel is de Datum. var datum = column[0]; // Het 2e deel is een variabele (getal). var waarde = column[1]; // Maak een object met al deze variabelen. var dataObject = { datum: datum, waarde: waarde }; // Voeg het object toe aan de chartData array chartData.push(dataObject); } } } loadCSV("data/warmtepomp_tqe.csv"); chart.validateData(); function zoomChart() { // Verschillende zoom methoden kunnen worden gebruikt o.a.: zoomToIndexes, zoomToDates, zoomToCategoryValues chart.zoomToIndexes(chartData.length - 40, chartData.length - 1); } </script> </head> <body> <div id="chartdiv" style="width: 100%; height: 500px;"></div> </body> </html> |
Als je nu via de browser het php bestand opent krijg je de grafiek te zien:
[#/scripts/ochsner_warmtepomp_tqe_grafiek” ]