Skip to content

Commit d70b0ff

Browse files
committed
Initial commit
0 parents  commit d70b0ff

11 files changed

Lines changed: 4230 additions & 0 deletions

File tree

.dockerignore

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# --- Python & App ---
2+
__pycache__/
3+
*.py[cod]
4+
venv/
5+
.env
6+
.cache/
7+
.local/
8+
9+
# --- Datenbank & Modelle ---
10+
# Wir ignorieren die Datenbank und das ML-Modell
11+
*.db
12+
*.sqlite3
13+
*.pkl
14+
15+
# --- Logs & Temporäres ---
16+
*.log
17+
.sudo_as_admin_successful
18+
19+
# --- Systemdateien (Bash & SSH) ---
20+
# Diese Dateien gehören zu deinem Server-User, nicht zum Projekt!
21+
.bash_history
22+
.bash_logout
23+
.bashrc
24+
.profile
25+
.ssh/
26+
.git
27+
.github
28+
.gitignore
29+
.dockerignore
30+
.gitconfig
31+
32+
# --- OS spezifisch ---
33+
.DS_Store
34+
Thumbs.db

.env.example

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Beispiel-Konfiguration
2+
ADMIN_PASS=dein_passwort
3+
LATITUDE=52.5200
4+
LONGITUDE=13.4050
5+
MQTT_BROKER_URL=192.168.178.xxx
6+
MQTT_BROKER_PORT=1883
7+
MQTT_USERNAME=dein_mqtt_user
8+
MQTT_PASSWORD=dein_mqtt_passwort

.github/workflows/ci.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
name: Balkonkraftwerk CI
2+
3+
# Wann soll die Action laufen? Bei jedem Push auf den main-Branch
4+
on:
5+
push:
6+
branches:
7+
- main
8+
9+
jobs:
10+
test-code:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
# 1. Holt deinen Code von GitHub in den Test-Server
15+
- name: Code auschecken
16+
uses: actions/checkout@v4
17+
18+
# 2. Installiert Python 3.11
19+
- name: Python einrichten
20+
uses: actions/setup-python@v5
21+
with:
22+
python-version: '3.11'
23+
cache: 'pip' # Macht zukünftige Durchläufe viel schneller!
24+
25+
# 3. Installiert deine requirements.txt
26+
- name: Abhängigkeiten installieren
27+
run: |
28+
python -m pip install --upgrade pip
29+
pip install -r requirements.txt
30+
31+
# 4. Ein einfacher Syntax-Check (kompiliert die app.py testweise)
32+
- name: Python Syntax Check
33+
run: |
34+
python -m py_compile app.py

.gitignore

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# --- Python & App ---
2+
__pycache__/
3+
*.py[cod]
4+
venv/
5+
.env
6+
.cache/
7+
.local/
8+
9+
# --- Datenbank & Modelle ---
10+
# Wir ignorieren die Datenbank und das ML-Modell
11+
*.db
12+
*.sqlite3
13+
*.pkl
14+
15+
# --- Logs & Temporäres ---
16+
*.log
17+
.sudo_as_admin_successful
18+
19+
# --- Systemdateien (Bash & SSH) ---
20+
# Diese Dateien gehören zu deinem Server-User, nicht zum Projekt!
21+
.bash_history
22+
.bash_logout
23+
.bashrc
24+
.profile
25+
.ssh/
26+
27+
# --- Git spezifisch ---
28+
.gitconfig
29+
30+
# --- OS spezifisch ---
31+
.DS_Store
32+
Thumbs.db

Dockerfile

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# 1. Basis-Image (Python 3.11 schlank)
2+
FROM python:3.11-slim
3+
4+
# 2. Arbeitsverzeichnis im Container
5+
WORKDIR /app
6+
7+
# 3. System-Abhängigkeiten (für ML-Pakete oft nötig)
8+
RUN apt-get update && apt-get install -y --no-install-recommends \
9+
build-essential \
10+
&& rm -rf /var/lib/apt/lists/*
11+
12+
# 4. Abhängigkeiten kopieren und installieren
13+
COPY requirements.txt .
14+
RUN pip install --no-cache-dir -r requirements.txt
15+
16+
# 5. Den Rest der App kopieren
17+
# Dank .dockerignore landen DB und .env nicht hier drin
18+
COPY . .
19+
20+
# 6. Port freigeben (Flask Standard)
21+
EXPOSE 5000
22+
23+
# 7. Startbefehl
24+
CMD ["python", "app.py"]

README.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# ☀️ Balkonkraftwerk Analytics
2+
3+
Ein intelligentes, lokal gehostetes Dashboard zur Überwachung, Analyse und Vorhersage von Balkonkraftwerken. Dieses Projekt kombiniert Echtzeit-MQTT-Daten (kompatibel mit AhoyDTU / OpenDTU) mit modernem Machine Learning (Scikit-Learn), um nicht nur historische Daten zu visualisieren, sondern auch präzise, wetterbasierte Leistungsprognosen zu erstellen.
4+
5+
## ✨ Features
6+
7+
* **📡 Echtzeit-Monitoring:** Empfängt sekündliche Updates des Wechselrichters via MQTT (Leistung, Strom, Spannung, Temperatur).
8+
* **🧠 KI-gestützter Forecast:** * Nutzt **Quantil-Regression** (GradientBoosting) zur Berechnung eines 80%-Konfidenzintervalls für die erwartete Tagesproduktion.
9+
* **SHAP-Integration (Erklärbare KI):** Das System zeigt im Tooltip genau an, *warum* eine bestimmte Vorhersage getroffen wurde (z. B. "Wolkenbedeckung senkt den Ertrag um X Watt").
10+
* **📊 Interaktive Visualisierungen (Chart.js):**
11+
* **Dynamisches Donut-Chart:** Zeigt die DC-Leistung pro Panel. Durch Antippen/Hovern ändert sich die zentrale Anzeige.
12+
* **Hourly Heatmap:** Visualisiert historische Erträge auf Stundenbasis für jeden Monat.
13+
* **Live-Metriken:** Automatische Berechnung von kWh, Ersparnis (EUR) und Spitzenwerten.
14+
* **🌦 Automatische Wetterdaten:** Integriert die kostenlose Open-Meteo API für aktuelle Bewölkung und stündliche Prognosen.
15+
* **💾 Leichtgewichtig & Lokal:** Kein Cloud-Zwang. Speicherung erfolgt in einer lokalen SQLite-Datenbank (`solar_data.db`). Automatisches Training des ML-Modells im Hintergrund.
16+
17+
## 🛠 Tech Stack
18+
19+
* **Backend:** Python 3.11, Flask, Flask-MQTT
20+
* **Machine Learning:** Scikit-Learn (RandomForest, GradientBoosting), SHAP, Pandas, Numpy
21+
* **Frontend:** HTML5, CSS3 (CSS Variables für konsistentes Theming), Vanilla JavaScript (ES6)
22+
* **Charts & Icons:** Chart.js (inkl. datalabels-Plugin), Phosphor Icons
23+
* **Datenbank:** SQLite3
24+
25+
## 📂 Projektstruktur
26+
27+
\`\`\`text
28+
/
29+
├── app.py # Hauptanwendung (Flask Backend, MQTT, ML-Logik)
30+
├── requirements.txt # Python-Abhängigkeiten
31+
├── .env # (Nicht in Git) Deine geheimen Zugangsdaten
32+
├── .env.example # Vorlage für Umgebungsvariablen
33+
├── .gitignore # Schützt sensible Daten vor dem Upload
34+
├── pv_model.pkl # (Wird automatisch generiert) Trainiertes ML-Modell
35+
├── solar_data.db # (Wird automatisch generiert) SQLite Datenbank
36+
├── static/
37+
│ ├── css/
38+
│ │ └── style.css # Dashboard Styling
39+
│ └── js/
40+
│ └── script.js # Frontend Logik (API-Calls, Chart.js)
41+
└── templates/
42+
└── index.html # Dashboard HTML-Template
43+
\`\`\`
44+
45+
## 🚀 Installation & Setup
46+
47+
### 1. Repository klonen
48+
\`\`\`bash
49+
git clone https://github.com/DEIN_USERNAME/DEIN_REPO.git
50+
cd DEIN_REPO
51+
\`\`\`
52+
53+
### 2. Virtuelle Umgebung & Abhängigkeiten
54+
Es wird empfohlen, eine virtuelle Python-Umgebung zu nutzen:
55+
\`\`\`bash
56+
python -m venv venv
57+
source venv/bin/activate # Unter Windows: venv\Scripts\activate
58+
pip install -r requirements.txt
59+
\`\`\`
60+
61+
### 3. Umgebungsvariablen (.env) konfigurieren
62+
Kopiere die Vorlage und trage deine spezifischen Daten ein:
63+
\`\`\`bash
64+
cp .env.example .env
65+
\`\`\`
66+
Öffne die `.env` Datei und passe folgende Werte an:
67+
* `ADMIN_PASS`: (Optional für zukünftige Admin-Routen)
68+
* `LATITUDE` / `LONGITUDE`: Deine Standortkoordinaten (für Open-Meteo Vorhersagen).
69+
* `MQTT_BROKER_URL`, `MQTT_USERNAME`, `MQTT_PASSWORD`: Deine MQTT-Broker Daten.
70+
71+
*(Hinweis: Das System lauscht standardmäßig auf `inverter/+/status`, `inverter/+/ch0/P` etc. Stelle sicher, dass dein Wechselrichter/deine DTU diese Topics sendet).*
72+
73+
### 4. Anwendung starten
74+
\`\`\`bash
75+
python app.py
76+
\`\`\`
77+
Die Datenbank (`solar_data.db`) wird beim ersten Start automatisch mit dem korrekten Schema initialisiert.
78+
Das Dashboard ist nun unter `http://localhost:5000` erreichbar.
79+
80+
## ⚙️ Automatisierung (Hintergrund-Tasks)
81+
82+
Das Backend nutzt das `schedule` Modul in einem separaten Thread, um:
83+
* **Stündlich:** Die Durchschnittsdaten der letzten Stunde in die Heatmap-Tabelle (`data`) zu schreiben und das Machine-Learning-Modell (`pv_model.pkl`) mit den neuesten Daten neu zu trainieren.
84+
* **Um Mitternacht:** Die Tagesstatistik (Tagesertrag, Max-Werte, Ersparnis) zu berechnen und in die Tabelle `daily_stats` zu aggregieren.
85+
86+
## 🤝 Mitwirken (Contributing)
87+
88+
Pull Requests sind herzlich willkommen. Für größere Änderungen öffne bitte zuerst ein Issue, um zu diskutieren, was du ändern möchtest.
89+
90+
1. Forke das Projekt
91+
2. Erstelle deinen Feature Branch (`git checkout -b feature/AmazingFeature`)
92+
3. Commit deine Änderungen (`git commit -m 'Add some AmazingFeature'`)
93+
4. Push auf den Branch (`git push origin feature/AmazingFeature`)
94+
5. Öffne einen Pull Request
95+
96+
## 📄 Lizenz
97+
98+
Dieses Projekt ist unter der MIT-Lizenz lizenziert. Weitere Details findest du in der Datei `LICENSE`.

0 commit comments

Comments
 (0)