Compare commits

...

8 Commits

Author SHA1 Message Date
9f72a69347 Change some styling. Fix undefined array_key in functions and show overview values in yearly view.
Some checks failed
Build power-consumtion image / Build-and-release-image (push) Failing after 22s
2025-10-15 17:56:51 +02:00
46e24640b5 Remove usage of old grype version.
All checks were successful
Build power-consumtion image / Build-and-release-image (push) Successful in 58s
2025-09-15 09:35:30 +00:00
81629ebfeb Fix errors for first of month.
Some checks failed
Build power-consumtion image / Build-and-release-image (push) Failing after 1m53s
2025-06-03 11:47:32 +02:00
71d02abbd5 Fix errors for first of month.
All checks were successful
Build power-consumtion image / Build-and-release-image (push) Successful in 1m19s
2025-06-03 11:34:18 +02:00
839c428ce6 Test networking mode.
All checks were successful
Build power-consumtion image / Build-and-release-image (push) Successful in 1m29s
2025-05-06 09:14:28 +00:00
f9c9121975 Use new registry url for base image.
All checks were successful
Build power-consumtion image / Build-and-release-image (push) Successful in 2m51s
2025-05-05 08:26:39 +00:00
2a097e4f69 Schedule to 1am and use new build-push action.
Some checks failed
Build power-consumtion image / Build-and-release-image (push) Failing after 24s
2025-04-30 07:59:21 +00:00
86e5a4d2b8 Add logins for several registries and push to local registry.
All checks were successful
Build power-consumtion image / Build-and-release-image (push) Successful in 1m33s
2025-04-01 12:07:20 +02:00
7 changed files with 77 additions and 21 deletions

View File

@@ -5,7 +5,7 @@ on:
branches: [ master ] branches: [ master ]
schedule: schedule:
# Run every Sunday at midnight # Run every Sunday at midnight
- cron: '0 0 * * 0' - cron: '1 0 * * 0'
env: env:
IMAGE: /home/power-consumption IMAGE: /home/power-consumption
@@ -21,13 +21,29 @@ jobs:
steps: steps:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2 uses: docker/setup-buildx-action@v2
with:
buildkitd-flags: '--allow-insecure-entitlement network.host'
driver-opts: network=host
- name: Log into registry - name: Login to Docker Hub
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: ${{ secrets.REGISTRY_URL }} username: ${{ vars.DOCKERHUB_USER }}
username: ${{ secrets.REGISTRY_USER }} password: ${{ vars.DOCKERHUB_TOKEN }}
password: ${{ secrets.REGISTRY_PASS }}
- name: Log into CS registry
uses: docker/login-action@v3
with:
registry: ${{ vars.CS_REGISTRY_URL }}
username: ${{ vars.CS_REGISTRY_USER }}
password: ${{ vars.CS_REGISTRY_PASS }}
- name: Log into local registry
uses: docker/login-action@v3
with:
registry: ${{ vars.LOCAL_REGISTRY_URL }}
username: ${{ vars.LOCAL_REGISTRY_USER }}
password: ${{ vars.LOCAL_REGISTRY_PASS }}
- name: Extract Docker metadata - name: Extract Docker metadata
id: meta id: meta
@@ -36,24 +52,25 @@ jobs:
images: ${{ secrets.REGISTRY_URL }}${{ env.IMAGE }} images: ${{ secrets.REGISTRY_URL }}${{ env.IMAGE }}
- name: Build and push Docker image - name: Build and push Docker image
uses: docker/build-push-action@v4 uses: docker/build-push-action@v6
env: env:
ACTIONS_RUNTIME_TOKEN: '' ACTIONS_RUNTIME_TOKEN: ''
with: with:
tags: ${{ secrets.REGISTRY_URL }}${{ env.IMAGE }}:latest allow: network.host
network: host
tags: ${{ vars.LOCAL_REGISTRY_URL }}${{ env.IMAGE }}:latest
push: true push: true
- name: Scan image - name: Scan image
uses: anchore/scan-action@v6 uses: anchore/scan-action@v6
id: scan id: scan
with: with:
image: ${{ secrets.REGISTRY_URL }}${{ env.IMAGE }}:latest image: ${{ vars.LOCAL_REGISTRY_URL }}${{ env.IMAGE }}:latest
fail-build: false fail-build: false
output-format: table output-format: table
severity-cutoff: critical severity-cutoff: critical
registry-username: ${{ secrets.REGISTRY_USER }} registry-username: ${{ vars.LOCAL_REGISTRY_USER }}
registry-password: ${{ secrets.REGISTRY_PASS }} registry-password: ${{ vars.LOCAL_REGISTRY_PASS }}
grype-version: 'v0.90.0'
- name: Inspect file - name: Inspect file
run: cat ${{ steps.scan.outputs.table }} run: cat ${{ steps.scan.outputs.table }}

View File

@@ -1,4 +1,4 @@
FROM cs-git.ddnss.de/docker/nginx-fpm-8-4 FROM gitea.fam-steinle.de/docker/nginx-fpm-8-4
ENV SERVE_PATH=/public ENV SERVE_PATH=/public

View File

@@ -106,14 +106,15 @@ function get_grid_feed_by_month(mysqli $db, string $table_aggregation, string $t
$price_result = $db->query($price_query); $price_result = $db->query($price_query);
$price = []; $price = [];
while ($row = $price_result->fetch_assoc()) { while ($price_row = $price_result->fetch_assoc()) {
$price[$row['year'] . '-' . str_pad($row['month'], 2, '0', STR_PAD_LEFT)] = $row['price']; $price[$price_row['year'] . '-' . str_pad($price_row['month'], 2, '0', STR_PAD_LEFT)] = $price_row['price'];
} }
$grid_feed_by_month = []; $grid_feed_by_month = [];
while ($row = $feed_result->fetch_assoc()) { while ($row = $feed_result->fetch_assoc()) {
$grid_feed_by_month[$row['year'] . '-' . str_pad($row['month'], 2, '0', STR_PAD_LEFT)] = $row['SUM(grid_feed)'] * $price[$row['year'] . '-' . str_pad($row['month'], 2, '0', STR_PAD_LEFT)] / 100000; $key = $row['year'] . '-' . str_pad($row['month'], 2, '0', STR_PAD_LEFT);
$price[$key] = $price[$key] ?? 0;
$grid_feed_by_month[$key] = $row['SUM(grid_feed)'] * $price[$key] / 100000;
} }
return $grid_feed_by_month; return $grid_feed_by_month;

View File

@@ -47,6 +47,7 @@ button, .button {
color: rgb(0, 0, 0); color: rgb(0, 0, 0);
font-size: 1.3rem; font-size: 1.3rem;
padding: 8px 0; padding: 8px 0;
cursor: pointer;
} }
#chart-container { #chart-container {

View File

@@ -45,9 +45,11 @@ $chosen_date_time = new DateTime($chosen_date);
if ($dates['first'] < $chosen_date_time) { if ($dates['first'] < $chosen_date_time) {
echo "<button type='button' onclick='submit_form(\"" . $chosen_date_time->modify('-1 month')->format('Y-m') . "\")'><</button>"; echo "<button type='button' onclick='submit_form(\"" . $chosen_date_time->modify('-1 month')->format('Y-m') . "\")'><</button>";
} else { } else {
$chosen_date_time->modify('-1 month');
echo '<span></span>'; echo '<span></span>';
} }
echo '<span style="text-align: center">' . $chosen_date_time->modify('+1 month')->format('Y-m') . '</span>'; $chosen_date_time->modify('+1 month');
echo '<span style="text-align: center">' . $chosen_date_time->format('Y-m') . '</span>';
if ($dates['last'] > $chosen_date_time->modify('+1 month')) { if ($dates['last'] > $chosen_date_time->modify('+1 month')) {
echo "<button type='button' onclick='submit_form(\"" . $chosen_date_time->format('Y-m') . "\")'>></button>"; echo "<button type='button' onclick='submit_form(\"" . $chosen_date_time->format('Y-m') . "\")'>></button>";
} else { } else {

View File

@@ -45,11 +45,11 @@ $chosen_date_time = new DateTime($chosen_date);
<title>Consumption values</title> <title>Consumption values</title>
<link rel="stylesheet" href="/css/layout.css"/> <link rel="stylesheet" href="/css/layout.css"/>
</head> </head>
<body> <body style="max-width: 1000px; align-self: center; margin: 0 auto;">
<form id="date_form" style="align-self: center; width: 500px; display: grid; grid-template-columns: 20% 20% 20% 20% 20%; gap: 10px;" action="/production.php" method="post"> <form id="date_form" style="display: grid; grid-template-columns: 20% 20% 20% 20% 20%; gap: 10px;" action="/production.php" method="post">
<?php <?php
if ($dates['first'] < $chosen_date_time) { if ($dates['first'] < $chosen_date_time) {
echo "<button type='button' onclick='submit_form(\"" . $chosen_date_time->modify('-1 month')->format('Y-m') . "\")'><</button>"; echo "<button type='button' onclick='submit_form(\"" . $chosen_date_time->modify('-1 month')->format('Y-m') . "\")'><</button>\n";
} else { } else {
echo '<span></span>'; echo '<span></span>';
} }
@@ -66,7 +66,7 @@ $chosen_date_time = new DateTime($chosen_date);
</form> </form>
<form action="production.php" method="post" <form action="production.php" method="post"
style="display: grid; grid-template-columns: 15% 12% 10% 10% 12%; gap: 2px 10px; margin-top: 10px; font-size: 1.3rem;"> style="display: grid; grid-template-columns: 20% 20% 20% 20% 20%; gap: 2px 10px; margin-top: 10px; font-size: 1.3rem; border-top: 2px solid gray; padding-top: 20px;">
<?php <?php
foreach ($production_values as $daily_production) { foreach ($production_values as $daily_production) {
?> ?>

View File

@@ -11,6 +11,10 @@ $chosen_year = (isset($_POST['year'])) ? $_POST['year'] : date('Y');
$years = get_years($local_db, $table_aggregation); $years = get_years($local_db, $table_aggregation);
$values = get_year_values($local_db, $table_aggregation, $chosen_year); $values = get_year_values($local_db, $table_aggregation, $chosen_year);
$aggregation = get_year_aggregation($local_db, $table_aggregation, $chosen_year);
$year_production = get_year_production($local_db, $table_production, $chosen_year);
$grid_feed_by_month = get_grid_feed_by_month($local_db, $table_aggregation, $table_production, $chosen_year);
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">
@@ -41,6 +45,37 @@ $values = get_year_values($local_db, $table_aggregation, $chosen_year);
<a class="button" href="production.php">Werte</a> <a class="button" href="production.php">Werte</a>
<input type="hidden" name="year" id="year" value=""/> <input type="hidden" name="year" id="year" value=""/>
</form> </form>
<div style="display: grid; grid-template-columns: 5% 15% 15%; gap: 2px 10px; margin-top: 5px; border-top: 2px solid gray; padding-top: 5px;">
<span class="color"></span>
<label><b>Messung</b></label>
<span><b>Jahr</b></span>
<span class="color color-1"></span>
<label>Verbrauch</label>
<span><?php echo number_format($aggregation['meter_consumption'], 1, ',', '.'); ?> KWh</span>
<span class="color color-2"></span>
<label>Berechnet</label>
<span><?php echo number_format($aggregation['power_sensor'], 1, ',', '.'); ?> KWh</span>
<span class="color color-3"></span>
<label>Einspeisung</label>
<span><?php echo number_format($aggregation['grid_feed'], 1, ',', '.'); ?> KWh</span>
<span class="color color-4"></span>
<label>Produktion</label>
<span><?php echo number_format($year_production['eg'] + $year_production['og'], 1, ',', '.'); ?> KWh</span>
<span class="color"></span>
<label><b>Ersparnis</b></label>
<span><b><?php echo number_format(($year_production['eg_price'] + $year_production['og_price'] - array_sum($grid_feed_by_month)), 2, ',', '.'); ?> €</b></span>
<span class="color"></span>
<label><b>Eigenverbrauch</b></label>
<span><b><?php echo number_format(100 - $aggregation['grid_feed'] * 100 / ($year_production['eg'] + $year_production['og']), 2, ',', '.'); ?> %</b></span>
</div>
<div id="chart-container"> <div id="chart-container">
<canvas id="chart"></canvas> <canvas id="chart"></canvas>
</div> </div>