Graph hinzugefügt
This commit is contained in:
parent
b8897ce67c
commit
2f4fa79027
2 changed files with 113 additions and 7 deletions
67
app.py
67
app.py
|
|
@ -1,13 +1,15 @@
|
|||
from pathlib import Path
|
||||
|
||||
from flask import Flask, render_template, request
|
||||
import subprocess
|
||||
import sys
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
from flask import redirect
|
||||
from datetime import datetime
|
||||
|
||||
from urllib.request import urlopen
|
||||
from pathlib import Path
|
||||
from influxdb_client import InfluxDBClient
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
|
@ -40,6 +42,10 @@ with open(config_file, encoding="utf-8") as f:
|
|||
IOBROKER_HOST = config["IOBROKER_HOST"]
|
||||
IOBROKER_PORT = config["IOBROKER_PORT"]
|
||||
IOBROKER_DP = config["IOBROKER_DP"]
|
||||
INFLUX_URL = config["INFLUX_URL"]
|
||||
INFLUX_ORG = config["INFLUX_ORG"]
|
||||
INFLUX_BUCKET = config["INFLUX_BUCKET"]
|
||||
INFLUX_TOKEN = config["INFLUX_TOKEN"]
|
||||
BALANCE_YELLOW_DAY = int(
|
||||
config["BALANCE_YELLOW_DAY"]
|
||||
)
|
||||
|
|
@ -178,8 +184,37 @@ def get_balance_color(balance):
|
|||
return "orange"
|
||||
|
||||
return "green"
|
||||
@app.route("/")
|
||||
|
||||
|
||||
def get_balance_history(days=30):
|
||||
|
||||
client = InfluxDBClient(
|
||||
url=INFLUX_URL,
|
||||
token=INFLUX_TOKEN,
|
||||
org=INFLUX_ORG
|
||||
)
|
||||
|
||||
query = f'''
|
||||
from(bucket: "{INFLUX_BUCKET}")
|
||||
|> range(start: -{days}d)
|
||||
|> filter(fn: (r) => r._measurement == "Kontostand")
|
||||
|> filter(fn: (r) => r._field == "value")
|
||||
'''
|
||||
|
||||
result = client.query_api().query(query)
|
||||
|
||||
history = []
|
||||
|
||||
for table in result:
|
||||
for record in table.records:
|
||||
|
||||
history.append({
|
||||
"date": record.get_time().strftime("%d.%m"),
|
||||
"value": round(record.get_value(), 2)
|
||||
})
|
||||
|
||||
return history
|
||||
@app.route("/")
|
||||
def index():
|
||||
|
||||
(
|
||||
|
|
@ -192,8 +227,14 @@ def index():
|
|||
total_expenses,
|
||||
total_saldo
|
||||
) = get_current_week_data()
|
||||
|
||||
balance = get_balance()
|
||||
balance_color = get_balance_color(balance)
|
||||
|
||||
balance_color = get_balance_color(
|
||||
balance
|
||||
)
|
||||
|
||||
balance_history = get_balance_history()
|
||||
|
||||
return render_template(
|
||||
"index.html",
|
||||
|
|
@ -206,9 +247,21 @@ def index():
|
|||
total_expenses=total_expenses,
|
||||
total_saldo=total_saldo,
|
||||
balance=balance,
|
||||
balance_color = get_balance_color(balance)
|
||||
|
||||
balance_color=balance_color,
|
||||
balance_history=balance_history
|
||||
)
|
||||
@app.route("/test-influx")
|
||||
def test_influx():
|
||||
|
||||
data = get_balance_history()
|
||||
|
||||
return {
|
||||
"count": len(data),
|
||||
"first": data[0] if data else None,
|
||||
"last": data[-1] if data else None
|
||||
}
|
||||
|
||||
|
||||
@app.route("/run/balance", methods=["POST"])
|
||||
def run_balance():
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@
|
|||
href="{{ url_for('static', filename='style.css') }}">
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
|
@ -112,7 +114,15 @@
|
|||
</p>
|
||||
|
||||
</div>
|
||||
<div class="card">
|
||||
|
||||
<h2>
|
||||
Kontostand letzte 30 Tage
|
||||
</h2>
|
||||
|
||||
<canvas id="balanceChart"></canvas>
|
||||
|
||||
</div>
|
||||
<div class="card">
|
||||
|
||||
<h2>
|
||||
|
|
@ -242,6 +252,49 @@ Hintergasse © 2026
|
|||
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
const history = {{ balance_history|tojson }};
|
||||
|
||||
const labels = history.map(item => item.date);
|
||||
const values = history.map(item => item.value);
|
||||
|
||||
new Chart(
|
||||
document.getElementById("balanceChart"),
|
||||
{
|
||||
type: "line",
|
||||
|
||||
data: {
|
||||
labels: labels,
|
||||
|
||||
datasets: [{
|
||||
label: "Kontostand (€)",
|
||||
data: values,
|
||||
tension: 0.3
|
||||
}]
|
||||
},
|
||||
|
||||
options: {
|
||||
responsive: true,
|
||||
|
||||
plugins: {
|
||||
legend: {
|
||||
display: false
|
||||
}
|
||||
},
|
||||
|
||||
scales: {
|
||||
y: {
|
||||
beginAtZero: false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue