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;