beri_pisi.PHP

<?php // POVEZAVA Z BAZO // Database connection parameters $host = "localhost"; // Database host $port = "5432"; // Database port (default is 5432) $dbname = "tekmovanje"; // Database name $user = "postgres"; // Database username $password = "root"; // Database password // Create a connection string $conn_string = "host=$host port=$port dbname=$dbname user=$user password=$password"; // Establish a connection to the PostgreSQL database $dbconn = pg_connect($conn_string); // Check if the connection was successful if (!$dbconn) { echo "Error: Unable to connect to the database.\n"; } else { echo "Connection to the database was successful!\n"; } // DATA V JSON // URLs of the APIs $apiUrl1 = "http://192.168.0.138/rpc/Switch.GetStatus?id=0"; $apiUrl2 = "https://api-drzavno-test.scv.si/api/tarifa"; // Function to fetch data from an API function fetchDataFromApi($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return json_decode($response, true); // Decode JSON response to an associative array } // Fetch data from both APIs $data1 = fetchDataFromApi($apiUrl1); $data2 = fetchDataFromApi($apiUrl2); if ($data1) { $apower = $data1['apower']; // Replace 'key1' with the actual key for the first piece of info $voltage = $data1['voltage']; // Replace 'key2' with the actual key for the second piece of info $current = $data1['current']; // Replace 'key3' with the actual key for the third piece of info $skupna_en = $data1['aenergy']['total']; } // Extract specific information from the second API response if ($data2) { $datum = $data2['datum']; // Replace 'key1' with the actual key for the first piece of info $ura = $data2['ura']; // Replace 'key2' with the actual key for the second piece of info $tarifa = $data2['tarifa']; // Replace 'key3' with the actual key for the third piece of info } // SQL // energy_by_minute $energy_by_minute = (($apower / 1000) * (1/60)); $sql = "insert into shelly_data(energija_zadnje_minute) values($energy_by_minute)"; // Prepare the SQL INSERT statement with placeholders $sql = "INSERT INTO shelly_data (datum, ura, tarifa, napetost, tok, moc, skupna_energija, energija_zadnje_minute, timestamp) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, NOW())"; // Prepare the statement $result = pg_prepare($dbconn, "insert_query", $sql); // Check if the preparation was successful if (!$result) { echo "Error: Unable to prepare the SQL statement.\n"; } else { // Execute the prepared statement with the extracted data $result = pg_execute($dbconn, "insert_query", array($datum, $ura, $tarifa, $voltage, $current, $apower, $skupna_en, $energy_by_minute)); // Check if the execution was successful if ($result) { echo "Data inserted successfully!\n"; } else { echo "Error: Unable to insert data into the database.\n"; } } // Close the database connection pg_close($dbconn); ?>

branje_shranjevanje.php

<?php $servername = "tekmovanje"; $username = "postgres"; $password = "root"; // Create connection $conn = new mysqli($servername, $username, $password); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } echo "Connected successfully"; ?>

get_data_1h.php

<?php // Konfiguracija za povezavo s PostgreSQL $dbHost = 'localhost'; // Naslov strežnika PostgreSQL $dbName = 'tekmovanje'; // Ime baze $dbUser = 'postgres'; // Uporabniško ime za bazo $dbPass = 'root'; // Geslo za bazo try { // Povezava s PostgreSQL $conn = new PDO("pgsql:host=$dbHost;dbname=$dbName", $dbUser , $dbPass); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // SQL poizvedba za pridobivanje podatkov za zadnjih 15 minut $sql = " SELECT ROUND(SUM(energija_zadnje_minute), 4) AS skupna_energija_kWh, ROUND(AVG(moc::numeric), 4) AS povprecna_moc_W, ROUND(SUM((moc * tarifa) / 60000)::numeric, 6) AS omreznina_1h FROM shelly_data WHERE timestamp >= NOW() - INTERVAL '60 minutes'; "; // Izvedba poizvedbe $stmt = $conn->query($sql); $data = $stmt->fetch(PDO::FETCH_ASSOC); // Uporabimo fetch(), ker pričakujemo eno vrstico rezultatov // Preverimo, ali so podatki prisotni (bolj robusten pogoj) if (!empty($data['skupna_energija_kWh']) || !empty($data['povprecna_moc_W']) || !empty($data['omreznina_1h'])) { // Prikaži vse vrstice rezultata (za odpravljanje napak) while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { var_dump($row); } } else { echo "<p>Ni podatkov za zadnjo uro.</p>"; } $skupna_energija = floatval($data['skupna_energija_kwh']); $povprecna_moc = floatval($data['povprecna_moc_w']); $omreznina = floatval($data['omreznina_1h']); // Preverimo, ali so podatki prisotni in jih izpišemo if (!empty($data)) { echo "<h2>Podatki za zadnjo uro</h2>"; echo "<style> body { font-family: Calibri, Tahoma, Verdana, sans-serif; } table { width: 600px; align: center; border-collapse: collapse; margin: 20px 0; font-family: Calibri, Tahoma, Verdana, sans-serif; font-size: 1.2em; } table, th, td { border: 1px solid #ccc; } th { background-color: #c0d5fc; /* Modra barva za naslovno vrstico */ color: black; /* barva besedila */ font-weight: bold; /* Poudarjeno besedilo */ padding: 10px; text-align: center; } td { background-color: #d2f7c3; /* Rahlo zelena barva za celice */ padding: 10px; text-align: center; } </style>"; echo "<table>"; echo "<tr><th>Skupna energija (kWh)</th><th>Povprečna moč (W)</th><th>Omrežnina (EUR)</th></tr>"; echo "<tr>"; echo "<td>" . $skupna_energija . "</td>"; echo "<td>" . $povprecna_moc . "</td>"; echo "<td>" . $omreznina . "</td>"; echo "</tr>"; echo "</table>"; } else { echo "<p>Ni podatkov za zadnjih 15 minut.</p>"; } } catch (PDOException $e) { echo "Napaka pri povezavi ali poizvedbi: " . $e->getMessage(); $conn = null; } ?>

get_data_15min.php

<?php // Konfiguracija za povezavo s PostgreSQL $dbHost = 'localhost'; // Naslov strežnika PostgreSQL $dbName = 'tekmovanje'; // Ime baze $dbUser = 'postgres'; // Uporabniško ime za bazo $dbPass = 'root'; // Geslo za bazo try { // Povezava s PostgreSQL $conn = new PDO("pgsql:host=$dbHost;dbname=$dbName", $dbUser , $dbPass); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // SQL poizvedba za pridobivanje podatkov za zadnjih 15 minut $sql = " SELECT ROUND(SUM(energija_zadnje_minute)::numeric, 4) AS skupna_energija_kWh, ROUND(AVG(moc::numeric), 4) AS povprecna_moc_W, ROUND(SUM((moc * tarifa) / 60000.0)::numeric, 6) AS omreznina_15min FROM shelly_data WHERE timestamp >= NOW() - INTERVAL '15 minutes'; "; // Izvedba poizvedbe $stmt = $conn->query($sql); $data = $stmt->fetch(PDO::FETCH_ASSOC); // Uporabimo fetch(), ker pričakujemo eno vrstico rezultatov /* // kontrola var_dump($data); */ // Preverimo, ali so podatki prisotni (bolj robusten pogoj) if (!empty($data['skupna_energija_kWh']) || !empty($data['povprecna_moc_W']) || !empty($data['omreznina_15min'])) { // Prikaži vse vrstice rezultata (za odpravljanje napak) while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { var_dump($row); } } else { echo "<p>Ni podatkov za zadnjih 15 minut.</p>"; } $skupna_energija = floatval($data['skupna_energija_kwh']); $povprecna_moc = floatval($data['povprecna_moc_w']); $omreznina = floatval($data['omreznina_15min']); // Preverimo, ali so podatki prisotni in jih izpišemo if (!empty($data)) { echo "<h2>Podatki za zadnjih 15 minut</h2>"; echo "<style> body { font-family: Calibri, Tahoma, Verdana, sans-serif; } table { width: 600px; align: center; border-collapse: collapse; margin: 20px 0; font-family: Calibri, Tahoma, Verdana, sans-serif; font-size: 1.2em; } table, th, td { border: 1px solid #ccc; } th { background-color: #c0d5fc; /* Modra barva za naslovno vrstico */ color: black; /* barva besedila */ font-weight: bold; /* Poudarjeno besedilo */ padding: 10px; text-align: center; } td { background-color: #faedd2; /* Rahlo rumena barva za celice */ padding: 10px; text-align: center; } </style>"; echo "<table>"; echo "<tr><th>Skupna energija (kWh)</th><th>Povprečna moč (W)</th><th>Omrežnina (EUR)</th></tr>"; echo "<tr>"; echo "<td>" . $skupna_energija . "</td>"; echo "<td>" . $povprecna_moc . "</td>"; echo "<td>" . $omreznina . "</td>"; echo "</tr>"; echo "</table>"; } else { echo "<p>Ni podatkov za zadnjih 15 minut.</p>"; } } catch (PDOException $e) { echo "Napaka pri povezavi ali poizvedbi: " . $e->getMessage(); $conn = null; } ?>

get_data.php

<?php // Konfiguracija za povezavo s PostgreSQL $dbHost = 'localhost'; // Naslov strežnika PostgreSQL $dbName = 'tekmovanje'; // Ime baze $dbUser = 'postgres'; // Uporabniško ime za bazo $dbPass = 'root'; // Geslo za bazo try { // Povezava s PostgreSQL $conn = new PDO("pgsql:host=$dbHost;dbname=$dbName", $dbUser , $dbPass); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // SQL poizvedba za pridobivanje podatkov za zadnjih 15 minut $sql = " SELECT ura, moc, energija_zadnje_minute FROM shelly_data WHERE timestamp >= NOW() - INTERVAL '15 minutes' ORDER BY ura ASC LIMIT 15; "; // Izvedba poizvedbe $stmt = $conn->query($sql); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // Debug izpis za preverjanje podatkov if (empty($data)) { echo "Ni podatkov za zadnjih 15 minut."; exit; } // Priprava podatkov za Chart.js $labels = []; $mocData = []; $energijaData = []; foreach ($data as $row) { $labels[] = $row['ura']; // Čas na X-osi $mocData[] = $row['moc']; // Moč na Y-osi $energijaData[] = $row['energija_zadnje_minute']; // Energija na Y-osi } // Pretvorba v JSON za Chart.js $jsonData = json_encode([ 'labels' => $labels, 'moc' => $mocData, 'energija' => $energijaData ]); // Izhod za Chart.js header('Content-Type: application/json'); echo $jsonData; } catch (PDOException $e) { echo "Napaka pri povezavi ali poizvedbi: " . $e->getMessage(); } $conn = null; ?>

get_data1.php

<?php // Konfiguracija za povezavo s PostgreSQL $dbHost = 'localhost'; // Naslov strežnika PostgreSQL $dbName = 'tekmovanje'; // Ime baze $dbUser = 'postgres'; // Uporabniško ime za bazo $dbPass = 'root'; // Geslo za bazo try { // Povezava s PostgreSQL $conn = new PDO("pgsql:host=$dbHost;dbname=$dbName", $dbUser , $dbPass); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // SQL poizvedba za pridobivanje podatkov za zadnjih 15 minut $sql = " SELECT ura, moc, energija_zadnje_minute FROM shelly_data WHERE timestamp >= NOW() - INTERVAL '1 hour' ORDER BY ura ASC LIMIT 60; "; // Izvedba poizvedbe $stmt = $conn->query($sql); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // Debug izpis za preverjanje podatkov if (empty($data)) { echo "Ni podatkov za zadnjo uro."; exit; } // Priprava podatkov za Chart.js $labels = []; $mocData = []; $energijaData = []; foreach ($data as $row) { $labels[] = $row['ura']; // Čas na X-osi $mocData[] = $row['moc']; // Moč na Y-osi $energijaData[] = $row['energija_zadnje_minute']; // Energija na Y-osi } // Pretvorba v JSON za Chart.js $jsonData = json_encode([ 'labels' => $labels, 'moc' => $mocData, 'energija' => $energijaData ]); // Izhod za Chart.js header('Content-Type: application/json'); echo $jsonData; } catch (PDOException $e) { echo "Napaka pri povezavi ali poizvedbi: " . $e->getMessage(); } $conn = null; ?>

izpisi_vse.php

<?php $dbHost = 'localhost'; // Naslov strežnika PostgreSQL $dbName = 'tekmovanje'; // Ime baze $dbUser = 'postgres'; // Uporabniško ime za bazo $dbPass = 'root'; // Geslo za bazo try { // Povezava s PostgreSQL $conn = new PDO("pgsql:host=$dbHost;dbname=$dbName", $dbUser , $dbPass); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // SQL poizvedba za pridobivanje vseh podatkov $sql = "SELECT * FROM shelly_data order by timestamp desc;"; // Izvedba poizvedbe $stmt = $conn->query($sql); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // Pridobite vse rezultate if (!empty($data)) { echo "<h2>Podatki iz tabele shelly_data</h2>"; echo "<style> body { font-family: Calibri, Tahoma, Verdana, sans-serif; } table { width: 600px; align: center; border-collapse: collapse; margin: 20px 0; font-family: Calibri, Tahoma, Verdana, sans-serif; font-size: 1.2em; } table, th, td { border: 1px solid #ccc; } th { background-color: #c0d5fc; /* Modra barva za naslovno vrstico */ color: black; /* Barva besedila */ font-weight: bold; /* Poudarjeno besedilo */ padding: 10px; text-align: center; } td { background-color: #d2f7c3; /* Rahlo zelena barva za celice */ padding: 10px; text-align: center; } </style>"; echo "<table>"; echo "<tr><th>id</th><th>datum</th><th>ura</th><th>tarifa</th><th>napetost</th><th>tok</th><th>moc</th><th>skupna energija</th><th>minuta</th><th>timestamp</th></tr>"; // Iterirajte skozi vse podatke in jih izpišite foreach ($data as $row) { echo "<tr>"; echo "<td>" . htmlspecialchars($row['id']) . "</td>"; echo "<td>" . htmlspecialchars($row['datum']) . "</td>"; echo "<td>" . htmlspecialchars($row['ura']) . "</td>"; echo "<td>" . htmlspecialchars($row['tarifa']) . "</td>"; echo "<td>" . htmlspecialchars($row['napetost']) . "</td>"; echo "<td>" . htmlspecialchars($row['tok']) . "</td>"; echo "<td>" . htmlspecialchars($row['moc']) . "</td>"; echo "<td>" . htmlspecialchars($row['skupna_energija']) . "</td>"; echo "<td>" . htmlspecialchars($row['energija_zadnje_minute']) . "</td>"; echo "<td>" . htmlspecialchars($row['timestamp']) . "</td>"; echo "</tr>"; } echo "</table>"; } else { echo "<p>Ni podatkov v tabeli.</p>"; } } catch (PDOException $e) { echo "Napaka pri povezavi ali poizvedbi: " . $e->getMessage(); } $conn = null; ?>

Prikaz_podatkov2.php

<!DOCTYPE html> <html lang="sl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vizualizacija podatkov - Enhanced</title> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <style> body { font-family: Calibri, Tahoma, Verdana, sans-serif; background-color: #f4f4f4; margin: 0; padding: 20px; } h1, h2 { text-align: center; color: #333; } p { text-align: center; color: #555; } .chart-container { width: 80%; margin: auto; margin-bottom: 40px; } ul { list-style-type: none; padding: 0; text-align: center; } li { margin: 5px 0; } nav { background-color: #333; color: white; padding: 10px; text-align: center; } nav a { color: white; margin: 0 15px; text-decoration: none; } nav a:hover { text-decoration: underline; } footer { text-align: center; margin-top: 40px; padding: 10px; background-color: #333; color: white; } </style> </head> <body> <h1 style="margin-top: -1px;">Podatki o porabi</h1> <center> <table> <tr> <td style="border:5px black solid"> <?php include("get_data_15min.php"); ?> </td> <td style="border:5px black solid"> <?php include("get_data_1h.php"); ?> </td> </tr> </table> </center> <h2 id="section1">Kako deluje aplikacija?</h2> <p>Aplikacija vsako minuto v podatkovno bazo zapiše podatke o: napetosti, toku, moči, porabljeni energiji prejšnjo minuto... in podatke o trenutno veljavnem časovnem bloku ter tarifi za omrežnino.</p> <p>Te podatke potem prebere in izračuna vrednost za poljubni interval. Tukaj imamo prikazano 15 minutni interval in podatke za zadnjo uro.</p> <div style="display: flex; justify-content: space-between; align-items: flex-start;"> <div style="width: 45%;"> <h2 id="section2">Graf porabe za zadnjih 15 min.</h2> <p>Na spodnjem grafu so prikazani podatki za zadnjih 15 minut:</p> <ul> <li>o odvzeti moči iz omrežja (črta)</li> <li>podatki o porabljeni energiji (stolpci) v Wmin</li> </ul> <div class="chart-container"> <canvas id="myChart"></canvas> </div> </div> <div style="width: 45%;"> <h2 id="section3">Graf porabe za zadnjo uro.</h2> <p>Na spodnjem grafu so prikazani podatki za zadnjo uro:</p> <ul> <li>o odvzeti moči iz omrežja (črta)</li> <li>podatki o porabljeni energiji (stolpci) v Wmin</li> </ul> <div class="chart-container"> <canvas id="myChart1"></canvas> </div> </div> </div> <script> // Pridobivanje podatkov iz PHP skripte fetch('get_data.php') // Ime vaše PHP skripte .then(response => response.json()) .then(data => { // Inicializacija Chart.js const ctx = document.getElementById('myChart').getContext('2d'); const myChart = new Chart(ctx, { type: 'line', // Linijski graf za moč data: { labels: data.labels, // Čas na X-osi datasets: [ { label: 'Moč (W)', data: data.moc, borderColor: 'rgba(66, 135, 245, 1)', backgroundColor: 'rgba(66, 135, 245, 0.2)', yAxisID: 'y', }, { label: 'Energija zadnje minute (Wh)', data: data.energija, borderColor: 'rgba(255, 99, 132, 1)', backgroundColor: 'rgba(235, 64, 52, 0.4)', type: 'bar', // Stolpični graf za energijo yAxisID: 'y1', } ] }, options: { scales: { y: { type: 'linear', display: true, position: 'left', title: { display: true, text: 'Moč (W)' } }, y1: { type: 'linear', display: true, position: 'right', title: { display: true, text: 'Energija (Wmin)' }, grid: { drawOnChartArea: false, // Da se mreža ne prekriva } } } } }); }) .catch(error => console.error('Napaka pri pridobivanju podatkov:', error)); </script> <script> // Pridobivanje podatkov iz PHP skripte fetch('get_data1.php') // Ime vaše PHP skripte .then(response => response.json()) .then(data => { // Inicializacija Chart.js const ctx = document.getElementById('myChart1').getContext('2d'); const myChart1 = new Chart(ctx, { type: 'line', // Linijski graf za moč data: { labels: data.labels, // Čas na X-osi datasets: [ { label: 'Moč (W)', data: data.moc, borderColor: 'rgba(252, 3, 125, 1)', backgroundColor: 'rgba(252, 3, 125, 0.2)', yAxisID: 'y', }, { label: 'Energija zadnje minute (Wh)', data: data.energija, borderColor: 'rgba(181, 125, 5, 1)', backgroundColor: 'rgba(181, 125, 5, 0.4)', type: 'bar', // Stolpični graf za energijo yAxisID: 'y1', } ] }, options: { scales: { y: { type: 'linear', display: true, position: 'left', title: { display: true, text: 'Moč (W)' } }, y1: { type: 'linear', display: true, position: 'right', title: { display: true, text: 'Energija (Wmin)' }, grid: { drawOnChartArea: false, // Da se mreža ne prekriva } } } } }); }) .catch(error => console.error('Napaka pri pridobivanju podatkov:', error)); </script> </body> </html>

Baza.txt

CREATE TABLE shelly_data ( id SERIAL PRIMARY KEY, datum DATE NOT NULL, ura TIME NOT NULL, tarifa FLOAT NOT NULL, napetost FLOAT NOT NULL, tok FLOAT NOT NULL, moc FLOAT , skupna_energija FLOAT , energija_zadnje_minute DECIMAL(10,5), timestamp timestamp ); select * from shelly_data; truncate shelly_data; drop table shelly_data; ALTER SEQUENCE shelly_data_id_seq RESTART WITH 1;