Skip to content

Repository files navigation

EnergyRadar

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.

⬇ Downloads

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

Architektur in einem Absatz

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.


Entwicklungsmodus

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:5000

Natives Fenster testen (ohne Build):

cd energyradar
pip install -r requirements.txt
ENERGYRADAR_DEMO=1 python desktop.py  # öffnet das App-Fenster

Im 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.


Production Build

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.py

Unter 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 .app lässt sich nur auf einem Mac bauen, die .exe nur auf Windows – PyInstaller baut nie für ein fremdes Betriebssystem.

Automatischer Build (GitHub Actions)

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.


Verhalten der gepackten App

  • 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.“

Wo liegen Daten und Logs?

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.


Energy Intelligence Layer

static/energy-state.js ist die einzige Präsentationsschicht zwischen Rohtelemetrie und UI. Sie publiziert unveränderliche Snapshots mit:

  • phase, production, trend, connection und source
  • 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.


Projektstruktur

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

Urheberrecht und Lizenzen

© 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.

About

Local-first energy intelligence for solar production, grid flow and household consumption.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages