Understand where your energy goes.
Local-first energy intelligence for solar production, grid flow and household consumption.
Live telemetry. Clear context. No cloud dependency required.
Solar → Grid → Household → Energy Intelligence
EnergyRadar is an experimental desktop application for understanding a local energy system without turning raw inverter telemetry into unsupported claims.
| Plattform | Download | Status |
|---|---|---|
| Windows x64 | EnergyRadar-Windows-x64.zip | verifiziert |
| macOS Intel | EnergyRadar-macOS-Intel.zip | verifiziert |
Prüfsummen (SHA-256) · Alle Releases
Ein nativer Apple-Silicon-Build wird erst angeboten, wenn er separat getestet und verifiziert wurde. Die Intel-App kann auf Apple Silicon über Rosetta 2 ausgeführt werden.
Doppelklick → EnergyRadar öffnet sich → alles läuft
Die Anwendung selbst ist unverändert: ein kleiner Flask‑Server
(energyradar/app.py) mit Collector, Decision‑Engine und SQLite‑Storage.
Neu ist nur der native Wrapper energyradar/desktop.py: er startet den
bestehenden Server still auf 127.0.0.1 (freier Port) und zeigt ihn in einem
nativen Fenster über pywebview. Kein
Electron, kein zusätzlicher Browser – pywebview nutzt die Systemkomponente
(WKWebView auf macOS, WebView2 auf Windows). Das ist die leichteste Lösung,
die die vorhandene Architektur vollständig erhält.
EnergyRadar benötigt Python 3.10 oder neuer und wurde in diesem Audit mit
Python 3.14.6 validiert. Die verfügbaren Umgebungsvariablen sind mit sicheren
Platzhaltern in .env.example dokumentiert; .env-Dateien
werden nicht automatisch geladen.
Reine Web‑Ansicht im Browser (wie bisher):
cd energyradar
pip install -r requirements.txt
ENERGYRADAR_DEMO=1 python app.py # Demo-Daten, ohne Wechselrichter
# → http://127.0.0.1:5000Natives Fenster testen (ohne Build):
cd energyradar
pip install -r requirements.txt
ENERGYRADAR_DEMO=1 python desktop.py # öffnet das App-FensterIm Live-Modus kann die Fronius-Anlage direkt in der App über ihre private IP-Adresse oder einen lokalen Hostnamen verbunden werden. EnergyRadar testet die Verbindung vor dem Speichern und akzeptiert über die Oberfläche nur Ziele im lokalen beziehungsweise privaten Netzwerk. Ohne Konfiguration zeigt die App „Keine Datenquelle eingerichtet“ und führt keinen Geräte- oder Netzwerkaufruf aus.
Die Einstellung liegt ausschließlich im Benutzerprofil als
data-source.json: unter Windows in %LOCALAPPDATA%\EnergyRadar\, unter macOS
in ~/Library/Application Support/EnergyRadar/. FRONIUS_URL bleibt als
expliziter Operator-Override verfügbar und hat Vorrang vor der lokal
gespeicherten Einstellung; ein aktiver Override kann in der App weder geändert
noch entfernt werden.
Windows, macOS und GitHub Actions verwenden denselben kanonischen Build:
desktop_web.py
→ packaging/EnergyRadar.spec
→ python tools/build.py
Vor dem Desktop-Build werden das React-Frontend, die Python-Abhängigkeiten und die Tests vorbereitet:
Push-Location frontend/react-ui
npm.cmd ci
npm.cmd run lint
npm.cmd run build
Pop-Location
python -m pip install -r energyradar/requirements.txt -r requirements-build.txt
python -m pytest tests/ -v
python tools/build.pyUnter macOS werden python3, npm und dieselben Schritte verwendet. Die
Kompatibilitätswrapper build_windows.ps1 und build_macos.sh delegieren
ausschließlich an tools/build.py.
Ergebnisse:
- Windows:
dist/EnergyRadar/EnergyRadar.exe - macOS:
dist/EnergyRadar.app
Kein Cross‑Compile: Das
.applässt sich nur auf einem Mac bauen, die.exenur auf Windows – PyInstaller baut nie für ein fremdes Betriebssystem.
Der einzige Desktop-Buildworkflow .github/workflows/build.yml
läuft für Pull Requests, main, release/**, manuelle Starts und v*-Tags.
Windows und macOS führen dieselbe React-/Test-/PyInstaller-Kette aus und laden
die Ergebnisse als Artefakte hoch:
- EnergyRadar-windows – der lauffähige Ordner mit
EnergyRadar.exe - EnergyRadar-macos – die gepackte
EnergyRadar.app(x86_64; läuft nativ auf Intel-Macs und per Rosetta 2 auf Apple Silicon)
Warum
macos-15-intel? PyInstaller baut für die Architektur des Runners. Der Intel-Runner erzeugt die bewusst angebotene x86_64-App.
Herunterladbar im jeweiligen Workflow‑Lauf unter Actions → Artifacts. Keine
Secrets nötig. Manuell startbar über Run workflow. Ein v*-Tag erzeugt nur
geprüfte Build-Artefakte. Die öffentliche Veröffentlichung erfolgt getrennt
über den manuellen Release-Workflow und sein geschütztes Environment-Gate.
- Start: Zuerst erscheint ein kleiner Splash („EnergyRadar wird gestartet …“), während Flask still im Hintergrund hochfährt – kein leeres weißes Fenster. Danach öffnet sich das Hauptfenster. Kein Konsolenfenster, keine URL.
- Fenster: Titel „EnergyRadar“, Standardgröße 980×900, veränderbar, Mindestgröße 420×640. Position und Größe werden gemerkt. macOS‑Dark‑Mode wird unterstützt (die Oberfläche folgt dem System).
- Menü: „Über EnergyRadar“ (zeigt die Version) und „Beenden“.
- Beenden: ⌘Q (macOS) bzw. Alt+F4 (Windows) oder Fenster schließen stoppt den Server, gibt den Port frei und beendet alle Hintergrund‑Threads sauber – keine verwaisten Prozesse.
- Fehlerfall: Kann der Server nicht starten, erscheint ein freundlicher Hinweis im Fenster (kein Traceback): „EnergyRadar konnte nicht gestartet werden. Bitte starten Sie die Anwendung neu.“
In der gepackten App wird ins beschreibbare Benutzerverzeichnis geschrieben (das Bundle selbst bleibt unangetastet):
| Plattform | Ort |
|---|---|
| macOS | ~/Library/Application Support/EnergyRadar/ |
| Windows | %LOCALAPPDATA%\EnergyRadar\ |
Dort liegen database/energy.db, energyradar.log, window.json und – falls
in der App eingerichtet – data-source.json.
Im Entwicklungsmodus bleibt alles wie bisher im Projektordner.
Haushaltsmesswerte, lokale Gerätekonfiguration, Logs, Bytecode und virtuelle Umgebungen sind von Git ausgeschlossen und dürfen nicht committed werden.
static/energy-state.js ist die einzige Präsentationsschicht zwischen
Rohtelemetrie und UI. Sie publiziert unveränderliche Snapshots mit:
phase,production,trend,connectionundsource- einem faktenbasierten
assessment - zentralen
appearance-Tokens für Akzent und Diagramme
app.js reicht API-Werte über updateTelemetry(...) hinein. Energy Presence,
Verbindungsstatus und Farbakzente abonnieren denselben State und enthalten keine
eigenen Leistungsschwellen. Reduced Motion folgt ausschließlich der
Betriebssystemeinstellung prefers-reduced-motion. Aussagen über
Wetter, zukünftige Peaks, Batterien oder Geräte werden ohne entsprechende
Datenquelle nicht erzeugt.
desktop_web.py ← einziger Desktop-Einstiegspunkt
packaging/EnergyRadar.spec ← einzige PyInstaller-Konfiguration
tools/build.py ← kanonischer lokaler und CI-Build
frontend/react-ui/ ← React-/TypeScript-Oberfläche
energyradar/ ← Domain-, Daten- und Bridge-Module
.github/workflows/build.yml ← einziger Desktop-Buildworkflow
.github/workflows/release.yml ← getrennte, manuelle Veröffentlichung
© 2026 Florian Hoffarth. Alle Rechte vorbehalten.
Die Oberfläche verwendet Geist (Geist Sans und Geist Mono, Version 1.7.2),
lizenziert unter der SIL Open Font License 1.1. Die Schriftdateien liegen lokal
im Repository; der unveränderte Lizenztext steht in
frontend/react-ui/src/assets/fonts/GEIST-LICENSE.txt, Herkunft und Version
sind in frontend/react-ui/src/assets/fonts/README.md dokumentiert.
Lizenzen weiterer Abhängigkeiten bleiben unberührt und gelten unverändert gemäß den jeweiligen Projekten.