Ochsner Warmtepomp – Data opslaan met PHP (MySQL)
Dit voorbeeld laat zien hoe je de CSV bestanden van de Ochsner warmtepomp web2com interface download met PHP met gebruik van cURL en daarna kan opslaan in een MySQL database.
Dit is getest met een Ochsner warmtepomp versie: Site: 2.08 / Device: 2.07
In dit voorbeeld breiden we het script van de Ochsner warmtepomp CSV opslag uit.
Ik begin meestal met het maken van een PHP “instellingen” bestandje die we in elk PHP script kunnen aanroepen, zodat als er iets wijzigd…bijvoobeeld de database of warmtepomp gegevens, je dit niet in alle bestanden hoeft te wijzigen.
1) Maak een bestand aan genaamd instellingen.php met deze inhoud:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // Database instellingen (MySQL) $database_adres = 'localhost'; $database_login_naam = 'root'; $database_login_wachtwoord = ''; $database_naam = "ochsner"; // Warmtepomp instellingen $warmtepomp_adres = 'http of ip'; $warmtepomp_poort = '8000'; $warmtepomp_login_naam = ''; $warmtepomp_login_wachtwoord = ''; ?> |
Wijzig de variabelen voor je eigen situatie en sla het bestand op.
2) Nu moet er een database aangemaakt worden met een tabel waarin we de gegevens van de warmtepomp kunnen opslaan maak een bestand aan genaamd warmtepomp_db.php met deze 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 |
<?php // ------------------------------------------------------------------------------ // Dit is een script voor het aanmaken van een MySQL database met PHP MySQLi // voor de Ochsner warmtepomp. // 2014-12-08 door Sebastiaan Ebeltjes. // ------------------------------------------------------------------------------ // Dit is een voorbeeld bestand voor het aanmaken van MySQL databases met PHP MySQLi // Let op!, dit script verwijderd geen gegevens!, als je databases wilt leegmaken, dan moet je zelf actie ondernemen. // Inladen van de instellingen. include 'instellingen.php'; // Maak connectie met de database. echo "* Connectie met de database..."; $dbcon = mysqli_connect($database_adres, $database_login_naam, $database_login_wachtwoord); // Is de connectie gelukt?, zo niet...geef een foutmelding en sluit het script! if (mysqli_connect_errno()) { echo "fout!: " . mysqli_connect_error() . "<br>"; // Eindig het script. exit; } else { echo "succes!<br>"; } // Maak een database. echo "- Aanmaken van database ' " . $database_naam . " '..."; $sql = "CREATE DATABASE " . $database_naam; if (mysqli_query($dbcon, $sql)) { echo "succes!<br>"; } else { echo "fout: " . mysqli_error($dbcon) . "<br>"; } // We kunnen niet zo maar tabellen aanmaken, we moeten eerst de database selecteren! mysqli_query($dbcon, "USE " . $database_naam); // Tabellen aanmaken. // UNIX_TIME - Linux timestamp / max. 9 cijfers > INT // DY - Datum Jaar / max. 4 cijfers > SMALLINT UNSIGNED // DM - Datum Maand / max. 2 cijfers > TINYINT UNSIGNED // DD - Datum Dag / max. 2 cijfers > TINYINT UNSIGNED // TH - Tijd Uur / max. 2 cijfers > TINYINT UNSIGNED // TM - Tijd Minuut / max. 2 cijfers > TINYINT UNSIGNED // TS - Tijd Seconde / max. 2 cijfers > TINYINT UNSIGNED // TEMP_TQA - (00:70) Actual temperature TQA / max. lengte = 2 en heeft 1 decimaal > FLOAT(3,1) // TEMP_TQE - (00:71) Actual temperature TQE / max. lengte = 2 en heeft 1 decimaal > FLOAT(3,1) // OC - (02:80) Operating cycles / max. 4 cijfers > SMALLINT UNSIGNED // OH - (02:81) Operating hours / max. 4 cijfers > SMALLINT UNSIGNED // TEMP_OUT - (00:00) Outdoor temperature / max. lengte = 2 en heeft 1 decimaal > FLOAT(3,1) // TEMP_OUT_AV - (02:20) Outdoor temperature average value / max. lengte = 2 en heeft 1 decimaal > FLOAT(3,1) // TEMP_ROOM - (00:01) Actual room temperature / max. lengte = 2 en heeft 1 decimaal > FLOAT(3,1) // TEMP_ROOM_SETPOINT - (01:01) Setpoint room temperature / max. lengte = 2 en heeft 1 decimaal > FLOAT(3,1) // TEMP_CIRFLOW_AH - (00:02) Actual heating circuit flowtemperature / max. lengte = 2 en heeft 1 decimaal > FLOAT(3,1) // HUM_REL - (00:58) Relative humidity / max. 2 cijfers > TINYINT UNSIGNED $tabelnaam = "warmtepomp"; $sql="CREATE TABLE " . $tabelnaam . "( UNIX_TIME INT, DY SMALLINT UNSIGNED, DM TINYINT UNSIGNED, DD TINYINT UNSIGNED, TH TINYINT UNSIGNED, TM TINYINT UNSIGNED, TS TINYINT UNSIGNED, TEMP_TQA FLOAT(3,1), TEMP_TQE FLOAT(3,1), OC SMALLINT UNSIGNED, OH SMALLINT UNSIGNED, TEMP_OUT FLOAT(3,1), TEMP_OUT_AV FLOAT(3,1), TEMP_ROOM FLOAT(3,1), TEMP_ROOM_SETPOINT FLOAT(3,1), TEMP_FLOW_AHC FLOAT(3,1), HUM_REL TINYINT UNSIGNED )"; // Query uitvoeren. echo "- Aanmaken tabel ' " . $tabelnaam . " '..."; if (mysqli_query($dbcon, $sql)) { echo "succes!<br>"; } else { echo "fout: " . mysqli_error($dbcon) . "<br>"; } // Om zoek- en selectiefunties te kunnen gebruiken moet er een "uniek" nummer per regel aangemaakt worden. mysqli_query($dbcon, "ALTER TABLE " . $tabelnaam . " ADD COLUMN ID INT AUTO_INCREMENT PRIMARY KEY FIRST"); // Sluit de MySQL verbinding. mysqli_close($dbcon); echo "<br><br>-- Einde! --"; ?> |
Maak de database aan door het bestand warmtepomp_db.php te starten via de browser, de output zal er zo uit zien:
1 2 3 4 5 6 |
* Connectie met de database...succes! - Aanmaken van database ' climalevel '...succes! - Aanmaken tabel ' warmtepomp '...succes! -- Einde! -- |
Nu is de database en de tabel gemaakt, je kan dit controleren met phpMyAdmin:
3) Nu kunnen we een PHP bestand maken dat de gegevens download in CSV formaat en daarna opslaat in de database met het commando op de URL opslag=database, maak een bestand aan genaamd warmtepomp.php met deze inhoud:
Ps. ik heb de opmerkingen in de code gezet, zodat je kan zien wat elk stukje precies doet.
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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
<?php // ------------------------------------------------------------------------------ // Dit is een script voor het downloaden van de opgeslagen gegevens en waarden in // CSV formaat van een Ochsner warmtepomp via de web2com interface naar een folder. // Daarna kunnen de gegevens opgeslagen worden in een MySQL database met: // 1) Via een HTTP URL (webbrowser) // 1) De gewenste datum moet opgegeven worden met: // 1) datum=vandaag // 2) datum=gisteren // 3) datum=yyyy-mm-dd // Voorbeeld: http://website.com/warmtepomp.php?datum=vandaag // 2) Om op te slaan naar de MySQL database met het commando: opslag=database. // Voorbeeld: http://website.com/warmtepomp.php?datum=vandaag&opslag=database // 2) Via de commandolijn // 1) De gewenste datum moet opgegeven worden met: // 1) vandaag // 2) gisteren // 3) yyyy-mm-dd // Voorbeeld: php pad/naar/warmtepomp.php vandaag // 2) Om op te slaan naar de MySQL database met het commando: database. // Voorbeeld: php pad/naar/warmtepomp.php vandaag database // // Om het padnaam voor de cron weer te geven in een browser gebruik // 'warmtepomp.php?cron=pad' // // Ochsner warmtepomp web2com versie: Site: 2.08 / Device: 2.07 // 2014-12-17 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. $folder_naam = "warmtepomp"; // Kijk of er een specifieke datum is 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. // // Geef het absolute pad weer met cron=pad // PHP_SAPI == "cli", wanneer gestart via de commandline zelf. // PHP_SAPI == "cgi-fcgi", wanneer het script gestart wordt via een cronjob. if (PHP_SAPI == "cli" OR PHP_SAPI == "cgi-fcgi") { // Dit PHP script is gestart via de commandolijn. if ($argv[1] == "") { // Geen datum opgegeven. echo "De datum is niet opgegeven! (gebruik: vandaag / gisteren / yyyy-mm-dd)"; exit; } elseif ($argv[1] == "vandaag") { // Gebruik de datum van vandaag. $datum_iso = date("Y") . '-' . date("m") . '-' . date("d"); } elseif ($argv[1] == "gisteren") { // De datum van gisteren. $unix_time = mktime(0, 0, 0, date("m"), date("d"), date("Y")); $dag_terug = strtotime('-1 day', $unix_time); $datum_iso = date('Y-m-d', $dag_terug); } else { // De datum die is opgegeven. $datum_iso = $argv[1]; } } else { // Dit PHP script is gestart via de HTTP URL (browser). // laat padnaam zien van het script (voor cron job. if ($_GET['cron'] == "pad") { echo "Het script pad voor de CRON job:<br><br>"; echo "php " . __FILE__; exit; } if ($_GET['datum'] == "") { // er is geen datum opgegeven echo "De datum is niet opgegeven!<br><br>"; echo "De gewenste datum moet opgegeven worden met:<br>"; echo "1) datum=vandaag<br>"; echo "2) datum=gisteren<br>"; echo "3) datum=yyyy-mm-dd<br>"; exit; } elseif ($_GET['datum'] == "vandaag") { // Gebruik de datum van vandaag. $datum_iso = date("Y") . '-' . date("m") . '-' . date("d"); } elseif ($_GET['datum'] == "gisteren") { // De datum van gisteren. $unix_time = mktime(0, 0, 0, date("m"), date("d"), date("Y")); $dag_terug = strtotime('-1 day', $unix_time); $datum_iso = date('Y-m-d', $dag_terug); } else { // De datum die is opgegeven. $datum_iso = $_GET['datum']; } } // Bestand downloaden met PHP cURL. echo "* Connectie maken met de warmtepomp...<br>"; echo "- download gegevens van datum ' " . $datum_iso . " '..."; // cURL initialiseren. $curlcon = curl_init(); // cURL opties instellen. curl_setopt($curlcon, CURLOPT_URL, 'http://' . $warmtepomp_adres . ':' . $warmtepomp_poort . '/' . $datum_iso . '.csv?file=mmc:/datalog/' . $datum_iso . '.csv&MIME=text/csv'); curl_setopt($curlcon, CURLOPT_RETURNTRANSFER, true); curl_setopt($curlcon, CURLAUTH_BASIC, true); curl_setopt($curlcon, CURLOPT_USERPWD, $warmtepomp_login_naam . ':' . $warmtepomp_login_wachtwoord); // De inhoud van de "webpagina" in een variabele stoppen. $inhoud = curl_exec($curlcon); // Kijk of de verbinding goed gelukt is (HTTP 200) // $httpcode = 200 > verbinding is succesvol. // $httpcode = 404 > pagina niet gevonden. // etc. $httpcode = curl_getinfo($curlcon, CURLINFO_HTTP_CODE); if ($httpcode == "200") { echo "succes!<br>"; } else { echo "fout!, HTTP code: " . $httpcode . "<br>"; // Eindig het script. exit; } // Sluit de CURL verbinding. curl_close($curlcon); echo "- maak een folder aan genaamd ' warmtepomp '..."; // Maak een folder aan "warmtepomp" 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 "warmtepomp" zelf aan. // Controleer of de folder "warmtepomp" bestaat. if (file_exists("warmtepomp")) { // 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("warmtepomp", 0777, true)) { // de folder kan niet gemaakt worden die("fout!, kan de folder ' warmtepomp ' niet maken...<br>"); // Eindig het script. exit; } else { echo "succes!<br>"; } } // Gegevens opslaan in een bestand. echo "- sla de gegevens op in bestand ' warmtepomp\\" . $datum_iso . ".csv '..."; // Open een bestand voor het wegschrijven van de gegevens (bestand word overschreven). $bestand = fopen("warmtepomp/" . $datum_iso . ".csv", "w"); if (fwrite($bestand, $inhoud) === FALSE) { echo "fout!, het bestand kan niet aangemaakt worden!<br>"; } else { echo "succes!<br>"; } // Sluit de connectie met het bestand. fclose($bestand); // Kijk of de gebruiker aangeeft dat gegevens naar de database moeten worden geschreven via: // 1) de HTTP URL (opslag=database). // 2) Commandolijn $argv[1]. if ($_GET['opslag'] == "database" OR $argv[2] == "database") { // Lokale instellingen $tabelnaam = "warmtepomp"; // Maak connectie met de database. echo "* 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()) { echo "fout!: " . mysqli_connect_error() . "<br>"; // Eindig het script. exit; } else { echo "succes!<br>"; } echo "- Gegevens wegschrijven naar de database..."; // open het CSV bestand en lees deze in. if (($bestand = fopen("warmtepomp/" . $datum_iso . ".csv", "r")) !== FALSE) { $vlag = true; // Zet een vlag om zo de eerste lijn van het CSV bestand over te slaan. $regelteller = 0; // Een teller om het aantal toegevoegde database regels te tellen. while (($data = fgetcsv($bestand, 0, ";")) !== FALSE) { // Vlag om eerste lijn over te slaan. if ($vlag) { $vlag = false; continue; } // "explodeer" datum en tijd data in kolom 2 $data[1] en kolom 3 $data[2] // Opbouw $data[1] = 03.12.2014 list($DD, $DM, $DY) = explode('.', $data[1]); // Opbouw $data[2] = 1:39:08 list($TH, $TM, $TS) = explode(':', $data[2]); // Controleer of de regel al bestaat in de MySQL database, we maken hierbij gebruik van een // kolom met unieke data: UNIX_TIME. $query = mysqli_query($dbcon, "SELECT 1 FROM warmtepomp WHERE UNIX_TIME='" . $data[0] . "'"); // Als er een regel met deze waarde al bestaat dan is de variabele > 0. // Als de regel niet gevonden is, dan is de variabele 0 if (mysqli_num_rows($query) == 0) { // Deze regel bestaat nog niet, we kunnen gegevens wegschrijven naar de tabel. // LET OP: de komma's in de CSV moeten worden omgezet naar punten voor opslag in de database! mysqli_query($dbcon, "INSERT INTO " . $tabelnaam . " (UNIX_TIME, DY, DM, DD, TH, TM, TS, TEMP_TQA, TEMP_TQE, OC, OH, TEMP_OUT, TEMP_OUT_AV, TEMP_ROOM, TEMP_ROOM_SETPOINT, TEMP_FLOW_AHC, HUM_REL) VALUES (" .$data[0].", " .$DY.", " .$DM.", " .$DD.", " .$TH.", " .$TM.", " .$TS.", " .str_replace(",", ".", $data[3]).", " .str_replace(",", ".", $data[4]).", " .$data[5].", " .$data[6].", " .str_replace(",", ".", $data[7]).", " .str_replace(",", ".", $data[8]).", " .str_replace(",", ".", $data[9]).", " .str_replace(",", ".", $data[10]).", " .str_replace(",", ".", $data[11]).", " .$data[12].")" ); $regelteller = $regelteller + 1; } } // Sluit de connectie met het bestand. fclose($bestand); } echo "voltooid!<br>"; echo "> Aantal nieuwe regels toegevoegd: " . $regelteller . "<br>"; // Sluit de database connectie. mysqli_close($dbcon); } echo "<br><br>-- Einde! --"; ?> |
Gegevens wegschrijven via de URL HTTP (browser)
Als je nu het script start vanuit je browser, met bijvoorbeeld: http://[IP ADRES]/warmtepomp.php?datum=vandaag voor de gegevens van vandaag, datum=gisteren voor de gegevens van gisteren, of http://[IP ADRES]/warmtepomp.php?datum=YYYY-MM-DD voor een specifieke datum, dan zou het resultaat er zo uit moeten zien:
1 2 3 4 5 6 7 |
* Connectie maken met de warmtepomp... - download gegevens van datum ' 2014-12-02 '...succes! - maak een folder aan genaamd ' warmtepomp '...succes! - sla de gegevens op in bestand ' warmtepomp\2014-12-02.csv '...succes! -- Einde! -- |
De download is nu compleet, het bestandje is weggeschreven.
Opslaan naar MysQL database.
Wil je meteen doorschrijven naar de database, dan kan je de url optie “opslag=database” gebruiken:
http://[IP ADRES]/warmtepomp.php?datum=gisteren&opslag=database
De output in de browser ziet er dan zo uit:
1 2 3 4 5 6 7 8 9 10 |
* Connectie maken met de warmtepomp... - download gegevens van datum ' 2014-12-03 '...succes! - maak een folder aan genaamd ' warmtepomp '...de folder is aanwezig! - sla de gegevens op in bestand ' warmtepomp\2014-12-03.csv '...succes! * Connectie met de database...succes! - Gegevens wegschrijven naar de database...voltooid! > Aantal nieuwe regels toegevoegd: 96 -- Einde! -- |
Gegevens wegschrijven via de commandolijn (i.c.m. Taakplanner / Cronjob)
Je kan het script ook starten via de commandolijn, met bijvoorbeeld: php pad/naar/warmtepomp.php vandaag voor de gegevens van vandaag, gisteren voor de gegevens van gisteren, of php /pad/naar/warmtepomp.php YYYY-MM-DD voor een specifieke datum, de download is compleet, het bestandje is weggeschreven.
Opslaan naar MysQL database.
Wil je meteen doorschrijven naar de database, dan kan je de optie “database” gebruiken (deze moet altijd achter de datum):
php /pad/naar/warmtepomp.php gisteren database
Via PHPMyAdmin kan je controleren en zien of alle data goed weggeschreven wordt:
[#/scripts/ochsner_warmtepomp_mysql” ]