- Überblick
- Hardware & Pin-Belegung
- Installation
- Systemarchitektur
- Erste Inbetriebnahme
- Access Point Modus
- Konfigurationsdateien
- Menüstruktur
- Einstellungen
- Datenansichten
- Steuerungsfunktionen
- Heartbeat-Funktionalität
- Rollladen-Steuerung
- MQTT-Integration
- ioBroker-Integration
- Webserver & Fernsteuerung
- Fehlersuche
- Anhang: Erweiterungsmöglichkeiten
Der ESP32 Solar Monitor ist eine umfassende Lösung zur Visualisierung und Überwachung von Solarsystemen. Diese Version 0.4.3 bietet eine modulare, konfigurierbare Plattform mit einem responsiven Touch-Interface und verschiedenen Detailansichten zur Überwachung aller wichtigen Parameter einer Solaranlage.
Hauptfunktionen:
- Echtzeit-Anzeige von PV-Leistung, Batteriestatus, Netzeinspeisung und Verbrauch
- Berechnung der verbleibenden Zeit bis zum Erreichen bestimmter Batterieladestände
- Benutzerfreundliches Touch-Interface mit Tabs und scrollbarem Menü
- Konfigurierbare MQTT-Verbindung zu Solar Assistant oder anderen Monitoring-Systemen
- Simulationsmodus für Demonstrationszwecke ohne tatsächliche Solaranlage
- NEU: Heartbeat-Funktionalität zur Überwachung der ioBroker-Verbindung
- NEU: Erweiterte Rollladen-Steuerung für bis zu 6 Rollläden
- NEU: Webserver für Fernzugriff und -steuerung
- NEU: Optimierte Benutzeroberfläche mit partiellen Updates
- NEU: Access Point Modus für einfache Erstkonfiguration ohne vorhandenes WLAN
Technische Spezifikationen:
- Hardware: ESP32 mit 2,8" TFT-Display (ILI9341, 320x240) und XPT2046 Touchscreen
- WLAN-Konnektivität für drahtlose Integration
- MQTT-Protokoll zur Datenkommunikation
- SPIFFS-Dateisystem für Konfigurationsdateien
- Freier HEAP-Speicher: ca. 180 KB
- ESP32 Entwicklungsboard
- ILI9341 TFT-Display (320x240)
- XPT2046 Touchscreen-Controller
- Micro-USB-Kabel für Programmierung und Stromversorgung
- MQTT-fähiger Solar Assistant (z.B. Victron GX-Geräte) oder ioBroker
- TFT_MISO: 12
- TFT_MOSI: 13
- TFT_SCLK: 14
- TFT_CS: 15
- TFT_DC: 2
- TFT_RST: 12
- TFT_BL: 21 (Hintergrundbeleuchtung)
- TOUCH_IRQ: 36
- TOUCH_MOSI: 32
- TOUCH_MISO: 39
- TOUCH_CLK: 25
- TOUCH_CS: 33
Der ESP32 Solar Monitor verwendet eine modulare Architektur mit mehreren Manager-Klassen:
- ConfigManager: Verwaltet die Konfigurationsdateien im SPIFFS-Dateisystem
- DataManager: Speichert und verarbeitet die Solardaten
- MenuSystem: Generiert und steuert das UI-Menüsystem
- MqttManager: Kommuniziert mit dem MQTT-Broker
- ViewManager: Rendert die verschiedenen Detailansichten
- IoBrokerManager: Kommuniziert mit ioBroker für Steuerungsfunktionen
- WebServer: Bietet eine Weboberfläche für Fernzugriff und -konfiguration
Diese modulare Struktur ermöglicht eine einfache Erweiterung und Wartung des Codes.
-
Arduino IDE vorbereiten:
- Arduino IDE (Version 1.8.19 oder höher) installieren
- ESP32-Boardunterstützung über den Boardverwalter hinzufügen
- Folgende Bibliotheken installieren:
- TFT_eSPI (Version 2.5.43 oder höher)
- XPT2046_Touchscreen
- ArduinoJson (Version 7.0.0 oder höher)
- PubSubClient
- SPIFFS
- AsyncTCP und ESPAsyncWebServer (für Webserver-Funktionalität)
-
TFT_eSPI konfigurieren:
- In der User_Setup.h der TFT_eSPI-Bibliothek die Pin-Belegung anpassen:
#define TFT_MISO 12 #define TFT_MOSI 13 #define TFT_SCLK 14 #define TFT_CS 15 #define TFT_DC 2 #define TFT_RST 12 #define TOUCH_CS 33
- In der User_Setup.h der TFT_eSPI-Bibliothek die Pin-Belegung anpassen:
-
Firmware hochladen:
- Das Projekt in der Arduino IDE öffnen
- ESP32 über USB anschließen
- Den korrekten Port und das Board (ESP32) auswählen
- "Hochladen" klicken, um die Firmware zu übertragen
-
Dateisystem vorbereiten:
- In der Arduino IDE "ESP32 Sketch Data Upload" Tool verwenden
- Dieses Tool lädt die Konfigurationsdateien (JSON) in den SPIFFS-Speicher des ESP32
Alternativ kann das Projekt auch mit PlatformIO installiert werden:
-
PlatformIO installieren:
- PlatformIO als Erweiterung für Visual Studio Code installieren
-
Projekt konfigurieren:
- Folgende platformio.ini verwenden:
[env:esp32dev] platform = espressif32@^4.4.0 board = esp32dev framework = arduino monitor_speed = 115200 upload_port = COMx ; Anpassen an den eigenen COM-Port upload_speed = 921600 lib_deps = bodmer/TFT_eSPI @ ^2.5.43 PaulStoffregen/XPT2046_Touchscreen bblanchon/ArduinoJson @ ^7.3.1 knolleary/PubSubClient @ ^2.8 me-no-dev/ESP Async WebServer me-no-dev/AsyncTCP build_flags = -D USER_SETUP_LOADED=1 -D LOAD_GLCD=1 -D LOAD_FONT2=1 -D ILI9341_DRIVER -D TFT_WIDTH=240 -D TFT_HEIGHT=320 -D TFT_BL=21 -D TFT_MISO=12 -D TFT_MOSI=13 -D TFT_SCLK=14 -D TFT_CS=15 -D TFT_DC=2 -D TFT_RST=12 -D TOUCH_CS=33
- Folgende platformio.ini verwenden:
-
Firmware hochladen:
- "Build" und "Upload" über PlatformIO ausführen
-
Dateisystem hochladen:
- "Upload Filesystem Image" über PlatformIO ausführen
-
Konfigurationsdateien anpassen:
- Verbinden Sie das Gerät mit dem PC und öffnen Sie die Arduino IDE
- Laden Sie die Konfigurationsdateien in den "data"-Ordner des Projekts
- Passen Sie die Dateien an Ihre Umgebung an
- Laden Sie die Dateien mit dem "ESP32 Sketch Data Upload" Tool hoch
- Alternativ können Sie die Dateien später über die Weboberfläche bearbeiten
-
Gerät starten:
- Nach dem Einschalten prüft der Solar Monitor auf eine gültige WLAN-Konfiguration
- Falls keine gültige Konfiguration vorhanden ist, startet er automatisch im Access Point Modus
- Bei vorhandener Konfiguration verbindet er sich mit dem konfigurierten WLAN
- Anschließend wird eine Verbindung zum MQTT-Broker hergestellt
- Bei erfolgreicher Verbindung werden Daten in Echtzeit angezeigt
- Bei fehlgeschlagener Verbindung wird der Simulationsmodus aktiviert
-
Anzeige prüfen:
- Der Hauptbildschirm zeigt das Menü mit verschiedenen Tabs an
- Die Statusleiste am unteren Bildschirmrand zeigt den Verbindungsstatus
- In der oberen rechten Ecke befindet sich das Heartbeat-Symbol für die ioBroker-Verbindung
-
Webserver testen:
- Verbinden Sie Ihr Gerät (PC, Tablet, Smartphone) mit demselben WLAN
- Öffnen Sie einen Webbrowser und geben Sie die IP-Adresse des ESP32 ein (wird im Display angezeigt)
- Alternativ: http://solarmonitor.local/ (falls mDNS unterstützt wird)
- Sie sollten nun die Weboberfläche des Solar Monitors sehen
-
Verbindungen prüfen:
- Überprüfen Sie in der Systeminfo-Seite die WLAN- und MQTT-Verbindungen
- Stellen Sie sicher, dass die ioBroker-Verbindung aktiv ist (pulsierendes Herz)
Der ESP32 Solar Monitor bietet einen integrierten Access Point (AP) Modus, der automatisch aktiviert wird, wenn keine gültige WLAN-Konfiguration vorhanden ist. Dies erleichtert die Erstkonfiguration erheblich, da keine vorherige Konfigurationsdatei erstellt werden muss.
Der Access Point Modus wird in folgenden Situationen automatisch aktiviert:
- Bei der ersten Inbetriebnahme ohne vorhandene Konfiguration
- Nach einem Zurücksetzen auf Werkseinstellungen
- Wenn die gespeicherte WLAN-Konfiguration ungültig ist oder Standard-Werte enthält
- Nach mehreren fehlgeschlagenen Verbindungsversuchen mit den gespeicherten Daten
-
Access Point finden:
- Nach dem Start des AP-Modus erscheint auf dem Display eine Meldung mit der SSID
- Die SSID lautet: "SolarMonitor-XXXX" (wobei XXXX die letzten 4 Zeichen der MAC-Adresse sind)
- Der AP benötigt kein Passwort für den Zugriff
-
Verbindung herstellen:
- Suchen Sie auf Ihrem Smartphone, Tablet oder Computer nach dem WLAN-Netzwerk
- Verbinden Sie sich mit dem "SolarMonitor-XXXX" Netzwerk
- Nach erfolgreicher Verbindung sollte ein Captive Portal erscheinen
- Falls das Portal nicht automatisch erscheint, öffnen Sie einen Browser und geben Sie die IP-Adresse
192.168.4.1
ein
Das Captive Portal bietet eine benutzerfreundliche Oberfläche zur Konfiguration der WLAN-Verbindung:
-
Netzwerkauswahl:
- Im linken Bereich wird eine Liste der verfügbaren WLAN-Netzwerke angezeigt
- Für jedes Netzwerk werden der Name (SSID) und die Signalstärke angezeigt
- Geschützte Netzwerke werden mit einem Schloss-Symbol gekennzeichnet
-
Netzwerkdetails eingeben:
- Klicken Sie auf ein Netzwerk in der Liste, um es auszuwählen
- Der Name (SSID) wird automatisch ins Formular auf der rechten Seite übernommen
- Geben Sie das Passwort für das ausgewählte WLAN ein
- Klicken Sie auf "Speichern und verbinden"
-
Verbindungsprozess:
- Nach dem Speichern werden die Einstellungen in die Konfigurationsdatei geschrieben
- Der ESP32 startet neu und versucht, eine Verbindung mit den eingegebenen Daten herzustellen
- Während des Neustarts wird eine entsprechende Meldung angezeigt
- Bei erfolgreicher Verbindung wechselt das Gerät in den normalen Betriebsmodus
- Bei fehlgeschlagener Verbindung kehrt das Gerät zum AP-Modus zurück
Während des Access Point Modus zeigt das Display wichtige Informationen:
- Die SSID des Access Points (SolarMonitor-XXXX)
- Die IP-Adresse des Access Points (192.168.4.1)
- Anweisungen zur Verbindung und Konfiguration
- Den aktuellen Status des Captive Portals
Im Access Point Modus wird automatisch der Simulationsmodus aktiviert, um trotz fehlender MQTT-Verbindung Daten anzuzeigen:
- Simulierte Solarleistung mit realistischen Tag-/Nachtschwankungen
- Simulierte Batterieleistung und Ladezustand
- Simulierter Verbrauch und Netzbezug
Dieser Modus ermöglicht es, die Benutzeroberfläche zu testen, auch wenn noch keine Verbindung zur tatsächlichen Solaranlage besteht.
- Der Access Point ist standardmäßig unverschlüsselt, um die Erstkonfiguration zu erleichtern
- Es wird empfohlen, die Konfiguration zügig durchzuführen und den AP-Modus nicht länger als nötig aktiv zu lassen
- Nach erfolgreicher Konfiguration wird der AP-Modus automatisch deaktiviert
- Ein manueller Wechsel zurück in den AP-Modus ist jederzeit über das Einstellungsmenü möglich
-
Problem: Der Access Point erscheint nicht in der WLAN-Liste
- Lösung: Starten Sie den ESP32 neu und warten Sie etwa 30 Sekunden
-
Problem: Captive Portal öffnet sich nicht automatisch
- Lösung: Öffnen Sie manuell einen Browser und navigieren Sie zu
192.168.4.1
- Lösung: Öffnen Sie manuell einen Browser und navigieren Sie zu
-
Problem: Nach dem Speichern der Konfiguration verbindet sich der ESP32 nicht mit dem WLAN
- Lösung 1: Überprüfen Sie das eingegebene Passwort auf Tippfehler
- Lösung 2: Stellen Sie sicher, dass das WLAN 2,4 GHz unterstützt (5 GHz wird nicht unterstützt)
- Lösung 3: Positionieren Sie den ESP32 näher am Router für ein besseres Signal
Der Solar Monitor verwendet drei JSON-Konfigurationsdateien, die im SPIFFS-Speicher gespeichert sind:
- config.json: Enthält grundlegende Einstellungen für WLAN, MQTT, Display und Batterie
- menu.json: Definiert die komplette Menüstruktur mit Tabs und Menüpunkten
- mqtt_topics.json: Konfiguriert die MQTT-Topics für die Datenabfrage
{
"wlan": {
"ssid": "MeinWLAN",
"password": "MeinPasswort"
},
"mqtt": {
"broker": "192.168.1.100",
"port": 1883,
"client_id_prefix": "ESP32SolarMonitor-"
},
"display": {
"type": "micro_usb",
"inverted": false,
"brightness": 100,
"timeout": 600,
"theme": "dark"
},
"touch": {
"min_x": 200,
"max_x": 3700,
"min_y": 240,
"max_y": 3800
},
"battery": {
"capacity_ah": 360,
"nominal_voltage": 51.2,
"target_soc": 80,
"min_soc": 20
},
"simulation_mode": false,
"update_interval": 5000
}
{
"tabs": [
{
"title": "System",
"items": [
{
"name": "Solar Status",
"function": "drawSolarStatus",
"icon": "sun"
},
{
"name": "Batterie Status",
"function": "drawBatteryStatus",
"icon": "battery"
},
...
]
},
{
"title": "Steuerung",
"items": [
{
"name": "Heizung",
"function": "controlHeating",
"icon": "heat"
},
...
]
},
...
]
}
{
"topics": [
{
"name": "battery_soc",
"topic": "solar_assistant/total/battery_state_of_charge/state",
"description": "Batterieladezustand in Prozent",
"unit": "%",
"color": "TFT_YELLOW"
},
{
"name": "load_power",
"topic": "solar_assistant/inverter_1/load_power_essential/state",
"description": "Verbrauchsleistung",
"unit": "W",
"color": "TFT_RED"
},
...
]
}
Der Solar Monitor verfügt über ein Touch-Menüsystem mit mehreren Tabs und Untermenüs. Hier ist die vollständige Menüstruktur im Überblick:
ESP32 Solar Monitor - Umsetzungsstatus der Menüeinträge
├── System Tab
│ ├── Solar Status # VOLLSTÄNDIG IMPLEMENTIERT - Zeigt alle wichtigen Systemparameter in Echtzeit an
│ ├── Batterie Status # VOLLSTÄNDIG IMPLEMENTIERT - Mit Zeitberechnung für Ziel-SOC/Min-SOC und grafischer Darstellung
│ ├── Netzstatus # VOLLSTÄNDIG IMPLEMENTIERT - Mit Flussrichtungsanzeige und Leistungswerten
│ ├── PV Leistung # TEILWEISE IMPLEMENTIERT - Grundfunktionen vorhanden, erweiterte Grafiken in Planung
│ ├── Verbrauch # TEILWEISE IMPLEMENTIERT - Grundanzeige vorhanden, detaillierte Verbrauchsanalyse in Planung
│ ├── Autarkie # TEILWEISE IMPLEMENTIERT - Prozentanzeige funktioniert, historische Darstellung in Planung
│ ├── Tageswerte # PLATZHALTER - Grundstruktur vorhanden, aber noch keine vollständige Implementierung
│ └── Statistik # NEU IN v0.4.3 - Basisfunktionen zur Anzeige historischer Daten implementiert
│
├── Steuerung Tab
│ ├── Heizung # BASISIMPLEMENTIERUNG - Einfache Ein/Aus-Steuerung funktioniert
│ ├── Pool # BASISIMPLEMENTIERUNG - Einfache Ein/Aus-Steuerung funktioniert
│ ├── Garten # PLATZHALTER - Nur UI-Struktur ohne Funktionalität
│ ├── Licht # VOLLSTÄNDIG IMPLEMENTIERT - Mit ioBroker-Integration und Statusrückmeldung
│ ├── Steckdosen # PLATZHALTER - Nur UI-Struktur ohne Funktionalität
│ ├── Lüftung # PLATZHALTER - Nur UI-Struktur ohne Funktionalität
│ ├── Rollladen # VOLLSTÄNDIG IMPLEMENTIERT (NEU IN v0.4.3) - Umfassende Steuerung für bis zu 6 Rolläden
│ └── Kameras # PLATZHALTER - Nur UI-Struktur ohne Funktionalität
│
└── Einstellungen Tab
├── WLAN Setup # VOLLSTÄNDIG IMPLEMENTIERT - Mit Statusanzeige und Neuverbindungsfunktion
├── MQTT Setup # VOLLSTÄNDIG IMPLEMENTIERT - Mit Topic-Anzeige und Konfigurationsmöglichkeit
├── Display # TEILWEISE IMPLEMENTIERT - Grundeinstellungen funktionieren, erweiterte Optionen in Planung
├── Systeminfo # VOLLSTÄNDIG IMPLEMENTIERT - Zeigt alle wichtigen Systeminformationen
├── Updates # NEU IN v0.4.3 - OTA-Update-Funktion über Weboberfläche implementiert
├── Logs # PLATZHALTER - Grundstruktur vorhanden, aber keine vollständige Logging-Funktion
├── Neustart # VOLLSTÄNDIG IMPLEMENTIERT - Neustart-Funktion über UI möglich
└── Werkseinstellungen # TEILWEISE IMPLEMENTIERT - Zurücksetzen der Konfiguration möglich, aber noch nicht vollständig
Navigation:
- Tabs werden durch Antippen des Tab-Titels gewechselt
- Menüpunkte werden durch Antippen ausgewählt
- Navigation innerhalb langer Menülisten erfolgt über die Scroll-Pfeile rechts
- Zurück zum Hauptmenü gelangt man durch Antippen des "Zurück"-Buttons in der oberen linken Ecke jeder Detailansicht
In dieser Ansicht können Sie die WLAN-Verbindungsparameter einsehen und ändern:
- Anzeige der aktuellen SSID und Verbindungsstatus
- IP-Adresse des Geräts
- Signalstärke (RSSI)
- "Neu verbinden"-Button zum Neuaufbau der Verbindung
- "Access Point aktivieren"-Button zum manuellen Wechsel in den AP-Modus
Hier können Sie die MQTT-Konfiguration einsehen und anpassen:
- Broker-Adresse und Verbindungsstatus
- Übersicht der abonnierten Topics
- "Konfigurieren"-Button für erweiterte Einstellungen
Einstellungen zur Anzeige und Darstellung:
- Farbschemawahl (Hell/Dunkel)
- Helligkeit
- Auto-Rotation
- Bildschirmschoner-Timeout
Zeigt allgemeine Systeminformationen an:
- Firmware-Version (0.4.3)
- CPU-Taktfrequenz
- Freier Speicher (ca. 218 KB)
- Laufzeit seit dem letzten Neustart
- WLAN- und MQTT-Verbindungsstatus
- ioBroker-Verbindungsstatus
Die Hauptübersicht zeigt alle wichtigen Werte des Solarsystems:
- PV-Leistung (aktuell produzierte Solarenergie)
- Verbrauch (aktueller Stromverbrauch des Hauses)
- Netzstatus (Einspeisung oder Bezug)
- Batteriestatus (Laden/Entladen und Ladezustand)
- Autarkiegrad in Prozent
Detaillierte Ansicht des Batteriestatus mit folgenden Informationen:
- Aktueller Ladezustand (SOC) in Prozent
- Grafische Darstellung als Füllstandsbalken
- Aktuelle Batterieleistung (Laden/Entladen)
- Batteriespannung
- Berechnung der Zeit bis zum Erreichen des Ziel-SOC (beim Laden) oder Min-SOC (beim Entladen)
- Gespeicherte Energie in kWh
Hinweis zur Zeitberechnung: Diese Funktion berechnet basierend auf der aktuellen Lade-/Entladerate, wie lange es dauern wird, bis die Batterie einen bestimmten Ladezustand erreicht. Die Berechnung berücksichtigt die in config.json
definierten Batterieparameter (Kapazität, Spannung, Ziel-SOC, Min-SOC).
Zeigt den aktuellen Austausch mit dem Stromnetz:
- Grafische Darstellung der Energieflussrichtung
- Aktuelle Leistung in Watt
- Unterscheidung zwischen Einspeisung (grün) und Bezug (rot)
Detailansicht der Solarstromproduktion:
- Aktuelle Leistung der Solarmodule
- Tagesertrag in kWh
- Spitzenleistung des Tages
Übersicht des Stromverbrauchs:
- Aktueller Gesamtverbrauch
- Verteilung auf verschiedene Verbraucher
- Tagesverbrauch
Zeigt den Grad der Unabhängigkeit vom Stromnetz:
- Aktueller Autarkiegrad in Prozent
- Grafische Darstellung
- Verlauf über die Zeit
Erweiterte statistische Ansicht mit historischen Daten:
- Grafikdarstellung der historischen Daten (PV-Leistung, Verbrauch, Batterieleistung)
- Durchschnittswerte für verschiedene Parameter
- Langzeitentwicklung der Solaranlage
Die Steuerungsfunktionen ermöglichen die Kontrolle verschiedener Haushaltsgeräte und -systeme. Folgende Steuerungen sind implementiert:
Grundlegende Steuerung der Heizungsanlage:
- Ein-/Ausschalten der Heizung
- Anzeige des aktuellen Status
Steuerung der Poolpumpe:
- Ein-/Ausschalten der Pumpe
- Anzeige des aktuellen Status
Steuerung der Hausbeleuchtung:
- Ein-/Ausschalten verschiedener Lichtgruppen
- Statusanzeige und Rückmeldung
Vollständige Steuerung der Rollläden (Details im Abschnitt Rollladen-Steuerung)
Die Heartbeat-Funktion bietet eine visuelle Echtzeit-Überwachung der Verbindung zum ioBroker-System.
- In der oberen rechten Ecke des Displays wird ein kleines Herzsymbol angezeigt
- Bei aktiver ioBroker-Verbindung "pulsiert" das Herz in roter Farbe
- Bei verlorener Verbindung wird das Herz grau und statisch dargestellt
- Der ESP32 sendet alle 60 Sekunden ein Heartbeat-Signal an ioBroker
- ioBroker antwortet mit einer Bestätigung
- Bei ausbleibender Antwort erkennt der ESP32 Verbindungsprobleme
- Die Animation zeigt den Zustand der Verbindung in Echtzeit an
- Sofortige Erkennung von Verbindungsproblemen auf einen Blick
- Keine Fehlinterpretation veralteter Daten durch klare visuelle Anzeige
- Automatische Wiederverbindungsversuche bei Verbindungsabbruch
Die Rollladensteuerung bietet eine umfassende Kontrolle über bis zu 6 Rollläden mit einer intuitiven Benutzeroberfläche.
- Steuerung von bis zu 6 individuellen Rollläden
- Positionssteuerung von 0% (komplett offen) bis 100% (komplett geschlossen)
- Direktsteuerung mit Auf-, Ab- und Stopp-Befehlen
- Schnellwahl-Positionierung (0%, 25%, 50%, 75%, 100%)
- Statusanzeige für Position und Bewegungsrichtung
- Farbliche Hervorhebung des aktiven Rolladens
- Wählen Sie im "Steuerung"-Tab den Menüpunkt "Rollladen"
- Wählen Sie den gewünschten Rolladen (R1-R6) durch Antippen aus
- Der aktuelle Rolladen wird in türkis hervorgehoben
- Sich bewegende Rollläden werden in orange dargestellt
- Verwenden Sie die Auf/Stopp/Ab-Tasten für direkte Steuerung
- Alternativ können Sie direkt eine Zielposition über die Positionstasten (0%, 25%, 50%, 75%, 100%) anwählen
- Der aktuelle Status (Position, Bewegungsrichtung) wird im unteren Bereich angezeigt
- Über die Weboberfläche können Sie die Rollläden auch aus der Ferne steuern:
- Wählen Sie den Menüpunkt "Solar Monitor" im Web-Interface
- Wählen Sie einen Rolladen aus dem Dropdown-Menü
- Verwenden Sie die Steuerungstasten oder den Positionsschieberegler
- Die Statusanzeige wird automatisch alle 5 Sekunden aktualisiert
- Die Rollladen-Positionen werden in Prozent angegeben (0% = offen, 100% = geschlossen)
- Die Bewegungsberechnung erfolgt anhand der eingestellten Geschwindigkeit (Standard: 3% pro Sekunde)
- Die Steuerung erfolgt direkt über die BlindControl-Objekte in ioBroker
- Die MQTT-Topics für die Rollladensteuerung haben folgende Struktur:
wobei X die Nummer des Rolladens (1-6) ist
mqtt.0/esp32solar/rolladen/X/currentPosition // Aktuelle Position mqtt.0/esp32solar/rolladen/X/targetPosition // Zielposition mqtt.0/esp32solar/rolladen/X/direction // Richtung (up/down/stop) mqtt.0/esp32solar/rolladen/X/moving // Bewegungsstatus (true/false)
Die Geschwindigkeit der Rollläden kann in der config.json
angepasst werden:
{
"rolladen": {
"speed_percent_per_second": 3,
"enabled": [true, true, true, true, true, true]
}
}
speed_percent_per_second
: Definiert die Bewegungsgeschwindigkeit in Prozent pro Sekundeenabled
: Ein Array mit 6 Boolean-Werten zur Aktivierung/Deaktivierung einzelner Rollläden
In zukünftigen Versionen ist eine Gruppen-Steuerung geplant, mit der mehrere Rollläden gleichzeitig bedient werden können. Diese Funktion befindet sich derzeit in der Entwicklung.
Die Rollladensteuerung ist vollständig in ioBroker integriert und kann somit in Automatisierungsszenarien eingebunden werden:
- Automatisches Schließen bei hoher Sonneneinstrahlung
- Energieoptimierte Steuerung basierend auf Temperatur und Sonneneinstrahlung
- Zeitgesteuerte Bewegungsprofile über den Tag
- Einbindung in "Anwesenheit"-Szenarien für erhöhte Sicherheit
Diese Automatisierungen werden direkt in ioBroker konfiguriert und kommunizieren dann über MQTT mit dem ESP32 Solar Monitor.
Die Rollladensteuerung ist in folgenden Dateien implementiert:
-
IoBrokerManager.cpp: Enthält die Funktionen zur Kommunikation mit ioBroker
bool IoBrokerManager::moveRolladen(const String &id, const String &direction) { if (id.length() == 0 || direction.length() == 0) { return false; } String topic = "esp32solar/rolladen/" + id + "/direction"; return mqttClient.publish(topic.c_str(), direction.c_str()); } bool IoBrokerManager::setRolladenTargetPosition(const String &id, int position) { if (id.length() == 0 || position < 0 || position > 100) { return false; } String topic = "esp32solar/rolladen/" + id + "/targetPosition"; return mqttClient.publish(topic.c_str(), String(position).c_str()); }
-
ViewManager.cpp: Enthält die Benutzeroberfläche für die Rollladensteuerung
void ViewManager::showView(const String &functionName) { // ... if (functionName == "controlRolladen") { updateRolladen(); } // ... } void ViewManager::updateRolladen() { // Zeichne Benutzeroberfläche für Rollladensteuerung // ... // Zeichne Rolladen-Buttons (R1-R6) for (int i = 1; i <= 6; i++) { // ... } // Zeichne Steuerungsbuttons (AUF/STOP/AB) // ... // Zeichne Positionsbuttons (0%, 25%, 50%, 75%, 100%) // ... // Zeige aktuellen Status // ... }
-
MqttManager.cpp: Verarbeitet die eingehenden MQTT-Nachrichten für die Rollläden
void MqttManager::messageReceived(char* topic, byte* payload, unsigned int length) { // ... // Rollladen-Status verarbeiten if (String(topic).startsWith("esp32solar/rolladen/")) { // Extrahiere Rolladen-ID und Parameter // Aktualisiere Zustandsdaten // ... } // ... }
Folgende Probleme können bei der Rollladensteuerung auftreten:
-
Rollläden reagieren nicht auf Befehle
- Stellen Sie sicher, dass die ioBroker-Verbindung aktiv ist (Heartbeat-Icon pulsiert)
- Überprüfen Sie die MQTT-Topics im ioBroker
- Prüfen Sie, ob die korrekten Rolladen-IDs verwendet werden
-
Falsche Positionsanzeige
- Kalibrieren Sie den Rolladen in ioBroker neu
- Stellen Sie sicher, dass die Bewegungsrichtungen korrekt konfiguriert sind
- Überprüfen Sie die korrekte Berechnung der Bewegungszeit
-
Rollläden stoppen nicht an der Zielposition
- Passen Sie den Parameter
speed_percent_per_second
an die tatsächliche Geschwindigkeit Ihrer Rollläden an - Prüfen Sie die BlindControl-Einstellungen in ioBroker
- Passen Sie den Parameter
-
Nicht alle Rollläden werden angezeigt
- Überprüfen Sie die
enabled
-Einstellungen in derconfig.json
- Stellen Sie sicher, dass die entsprechenden ioBroker-Objekte existieren
- Überprüfen Sie die
// ioBroker-Skript: Automatische Rollladensteuerung basierend auf Sonneneinstrahlung
// Dieses Skript steuert die Rollläden abhängig von der Sonneneinstrahlung und Temperatur
// Schwellenwerte
const BRIGHTNESS_THRESHOLD = 40000; // in Lux
const TEMPERATURE_THRESHOLD = 25; // in °C
// Ausrichtung der Fenster (0 = Nord, 90 = Ost, 180 = Süd, 270 = West)
const WINDOW_ORIENTATION = {
"1": 90, // Rolladen 1: Ost
"2": 90, // Rolladen 2: Ost
"3": 180, // Rolladen 3: Süd
"4": 180, // Rolladen 4: Süd
"5": 270, // Rolladen 5: West
"6": 270 // Rolladen 6: West
};
// Aktuelle Werte abrufen
let sunAzimuth = getState('astro.0.sunpos.azimuth').val; // Sonnenrichtung in Grad
let brightness = getState('weather.0.current.brightness').val; // Helligkeit in Lux
let temperature = getState('weather.0.current.temperature').val; // Temperatur in °C
// Verarbeite jeden Rolladen
Object.keys(WINDOW_ORIENTATION).forEach(rolladenId => {
let windowOrientation = WINDOW_ORIENTATION[rolladenId];
// Prüfe, ob die Sonne auf das Fenster scheint (±45°)
let sunOnWindow = Math.abs(sunAzimuth - windowOrientation) < 45;
// Aktuelle Rolladenposition
let currentPosition = getState('mqtt.0.esp32solar.rolladen.' + rolladenId + '.currentPosition').val;
// Entscheidungslogik
if (sunOnWindow && brightness > BRIGHTNESS_THRESHOLD && temperature > TEMPERATURE_THRESHOLD) {
// Sonne scheint stark auf das Fenster und es ist warm -> Rolladen schließen (70%)
if (currentPosition < 70) {
setState('mqtt.0.esp32solar.rolladen.' + rolladenId + '.targetPosition', 70);
log('Rolladen ' + rolladenId + ' wird auf 70% geschlossen (Sonnenschutz)');
}
} else if (!sunOnWindow || brightness < (BRIGHTNESS_THRESHOLD / 2)) {
// Keine direkte Sonne oder deutlich weniger hell -> Rolladen öffnen
if (currentPosition > 0) {
setState('mqtt.0.esp32solar.rolladen.' + rolladenId + '.targetPosition', 0);
log('Rolladen ' + rolladenId + ' wird geöffnet');
}
}
});
Für zukünftige Versionen der Rollladensteuerung sind folgende Funktionen geplant:
- Positions-Presets: Speichern und Abrufen vordefinierter Positionswerte
- Zentralsteuerung: Globale Steuerung aller Rollläden
- Szenarien: Vordefinierte Szenarien wie "Morgen", "Abend", "Kino", etc.
- Zeitsteuerung: Direkte Programmierung von Zeitplänen im ESP32
- Sonnenstand-Steuerung: Automatische Anpassung basierend auf Sonnenposition
- Wetterabhängige Steuerung: Integration von Wetterdaten zur intelligenten Steuerung
- Stromverbrauchsoptimierung: Koordinierte Steuerung in Abhängigkeit vom PV-Überschuss
- Verbesserte Visualisierung: Grafische Darstellung der Rollladen-Positionen
Diese Funktionen werden nach und nach in zukünftigen Updates implementiert werden.
-
Problem: Rollläden reagieren nicht auf Steuerungsbefehle
- Lösung 1: Prüfen Sie die Verbindung zu ioBroker (Heartbeat-Indikator)
- Lösung 2: Stellen Sie sicher, dass die BlindControl-Objekte in ioBroker korrekt konfiguriert sind
- Lösung 3: Überprüfen Sie die MQTT-Topics für die Rollladensteuerung
- Lösung 4: Testen Sie die Steuerung über die Weboberfläche, um Probleme einzugrenzen
-
Problem: Rollläden-Positionsanzeige aktualisiert sich nicht
- Lösung 1: Prüfen Sie die MQTT-Topics für die Rollladenpositionen in ioBroker
- Lösung 2: Stellen Sie sicher, dass die ioBroker-Instanz läuft und kommuniziert
- Tipp: Versuchen Sie, die Rollläden manuell aus ioBroker zu steuern, um die Kommunikation zu testen
- Problem: Herz bleibt grau trotz aktiver ioBroker-Instanz
- Lösung 1: Prüfen Sie, ob das Topic
esp32solar/heartbeat/response
in ioBroker korrekt eingerichtet ist - Lösung 2: Überprüfen Sie das JavaScript für die Heartbeat-Funktion in ioBroker
- Lösung 3: Fügen Sie folgendes Skript in ioBroker ein:
on({ id: [].concat(['mqtt.0.esp32solar.heartbeat.beat']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; setState('mqtt.0.esp32solar.heartbeat.response', (String(getState('mqtt.0.esp32solar.heartbeat.beat').val) + ',ACK')); });
- Tipp: Verwenden Sie die Systeminfo-Seite, um die MQTT-Verbindung zu prüfen
- Lösung 1: Prüfen Sie, ob das Topic
- Problem: JSON-Konfigurationen werden nicht erkannt
- Lösung 1: Überprüfen Sie die JSON-Syntax mit einem Online-Validator
- Lösung 2: Achten Sie auf korrekte Klammern und Anführungszeichen
- Lösung 3: Vermeiden Sie Sonderzeichen in Strings
- Lösung 4: Verwenden Sie UTF-8-Kodierung für Dateien mit Umlauten
- Die WLAN-Verbindung kann unter bestimmten Umständen instabil sein; die Version 0.4.3 enthält robustere Verbindungsroutinen
- Bei einigen Routern kann die Verbindungszeit länger als erwartet sein
- Die Touch-Kalibrierung kann je nach Hardware-Variante leicht abweichen
- Der Access Point Modus funktioniert möglicherweise nicht optimal auf allen Geräten
- Bei großen Konfigurationsdateien kann es zu Speicherengpässen kommen
- Verwenden Sie den seriellen Monitor (115200 Baud) für ausführliche Debug-Informationen
- Bei wiederkehrenden Problemen können Sie einen Reset durchführen
- Nutzen Sie die Systeminfo-Seite für Diagnose der Verbindungen und des Speicherverbrauchs
- Erstellen Sie regelmäßig Backups Ihrer Konfigurationsdateien über die Weboberfläche
- Prüfen Sie vor dem Speichern von Änderungen immer die JSON-Syntax
- Beim ersten Start oder nach einem Reset nutzen Sie den Access Point Modus zur einfachen Konfiguration
Wenn alles andere fehlschlägt, können Sie einen Factory Reset durchführen:
- Über das Menü: Einstellungen → Werkseinstellungen → Bestätigen
- Über die Weboberfläche: System → "Zurücksetzen auf Werkseinstellungen" klicken
- Manuell: Halten Sie den Reset-Button während des Einschaltens für 10 Sekunden gedrückt
Nach dem Factory Reset wird der Access Point Modus automatisch aktiviert, um eine Neukonfiguration zu ermöglichen.
Der ESP32 Solar Monitor ist modular aufgebaut und kann leicht um neue Funktionen erweitert werden. Mit ca. 218 KB freiem HEAP-Speicher gibt es noch viel Raum für Erweiterungen.
-
setup()
in ESP32_SolarMonitor.ino:- SPIFFS-Initialisierung
- Display & Touch-Initialisierung
- Konfiguration laden
- WLAN-Verbindung (oder AP-Modus)
- MQTT-Verbindung
- Webserver starten
- OTA-Updates aktivieren
-
Datenpfad:
MQTT-Broker → MqttManager → DataManager → ViewManager → Display
-
Steuerungspfad:
Display → TouchInput → MenuSystem → ViewManager → MqttManager → MQTT-Broker
-
Bearbeiten Sie
menu.json
:{ "name": "Neue Funktion", "function": "showNewFunction", "icon": "custom" }
-
Implementieren Sie die Funktion in
ViewManager.cpp
:void ViewManager::showNewFunction() { // Display löschen tft.fillScreen(BACKGROUND); // Überschrift zeichnen drawHeader("Neue Funktion"); // Eigene Funktionalität implementieren tft.setCursor(20, 80); tft.setTextColor(TEXT_COLOR); tft.println("Dies ist meine neue Funktion"); // Beispiel: Ein einfacher Button drawButton(120, 150, 80, 40, "Klick mich", TFT_BLUE); // Zurück-Button zeichnen drawBackButton(); }
-
Fügen Sie die Touch-Verarbeitung in
loop()
hinzu:// Im Detailansicht-Abschnitt von loop() else if (currentDetailFunction == "showNewFunction") { // Prüfen auf Button-Klick if (isInBounds(x, y, 120, 150, 200, 190)) { // Aktion ausführen tft.fillRect(20, 200, 280, 20, BACKGROUND); tft.setCursor(20, 200); tft.println("Button wurde geklickt!"); } }
-
Erweitern Sie
SolarData
inDataManager.h
:struct SolarData { // Bestehende Felder... // Neues Feld float newDataPoint; };
-
Fügen Sie einen neuen Topic in
mqtt_topics.json
hinzu:{ "name": "new_data_point", "topic": "solar_assistant/total/new_data_point/state", "description": "Mein neuer Datenpunkt", "unit": "X", "color": "TFT_GREEN" }
-
Verarbeiten Sie die Daten in
MqttManager.cpp
:void MqttManager::messageReceived(char* topic, byte* payload, unsigned int length) { // Bestehende Verarbeitung... // Neuen Datenpunkt verarbeiten else if (strcmp(topicName, "new_data_point") == 0) { data.newDataPoint = value.toFloat(); } }
- Fügen Sie ein neues API-Endpoint in
WebServer.cpp
hinzu:server.on("/api/newFunction", HTTP_GET, [](AsyncWebServerRequest *request) { JsonDocument doc; // Daten sammeln doc["value"] = dataManager.getData().newDataPoint; doc["timestamp"] = millis(); // Weitere Daten... // Als JSON senden String response; serializeJson(doc, response); request->send(200, "application/json", response); });
RFLink ermöglicht die Kommunikation mit 433/868 MHz Funkgeräten:
// Beispiel für RFLink-Integration
#include <RFLink.h>
RFLink rflink(Serial2); // Verwenden des zweiten seriellen Ports des ESP32
void setupRFLink() {
Serial2.begin(57600, SERIAL_8N1, RX_PIN, TX_PIN); // Typische Baudrate für RFLink
rflink.begin();
}
void sendRFLinkCommand(const String &protocol, const String &id, const String &command) {
rflink.sendCommand(protocol, id, command);
}
Modbus wird häufig für die Kommunikation mit Wechselrichtern verwendet:
// Beispiel für Modbus-Integration
#include <ModbusMaster.h>
ModbusMaster modbus;
void setupModbus() {
Serial2.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);
modbus.begin(1, Serial2); // Slave-Adresse 1
}
float readModbusRegister(uint16_t reg) {
uint8_t result = modbus.readHoldingRegisters(reg, 1);
if (result == modbus.ku8MBSuccess) {
return modbus.getResponseBuffer(0);
}
return -1;
}
// Temperatursesor-Integration
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensors(&oneWire);
void setupTemperatureSensors() {
sensors.begin();
}
float readTemperature(int index) {
sensors.requestTemperatures();
return sensors.getTempCByIndex(index);
}
// Beispiel für Wetter-API-Integration
#include <HTTPClient.h>
String getWeatherData(const String &city) {
HTTPClient http;
String url = "https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=" + city;
http.begin(url);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
http.end();
return payload;
}
http.end();
return "";
}
// Einfaches Balkendiagramm
void drawBarChart(int x, int y, int width, int height, float values[], int numValues, uint16_t barColor) {
int barWidth = width / numValues;
float maxValue = 0;
// Maximum finden
for (int i = 0; i < numValues; i++) {
if (values[i] > maxValue) maxValue = values[i];
}
// Rahmen zeichnen
tft.drawRect(x, y, width, height, TFT_WHITE);
// Balken zeichnen
for (int i = 0; i < numValues; i++) {
int barHeight = (values[i] / maxValue) * (height - 10);
tft.fillRect(x + 5 + i * barWidth, y + height - barHeight - 5, barWidth - 2, barHeight, barColor);
}
}
// Dashboard-Widget-Struktur
struct DashboardWidget {
String type; // "gauge", "value", "chart", etc.
String dataSource; // Name des Datenpunkts
int x, y; // Position
int width, height; // Größe
uint16_t color; // Farbe
};
// Widget-Rendering-Funktion
void renderWidget(const DashboardWidget &widget) {
if (widget.type == "gauge") {
drawGauge(widget.x, widget.y, widget.width, dataManager.getValue(widget.dataSource), widget.color);
}
else if (widget.type == "value") {
drawValueBox(widget.x, widget.y, widget.width, widget.height, dataManager.getValue(widget.dataSource), dataManager.getUnit(widget.dataSource), widget.color);
}
// Weitere Widget-Typen...
}
// Komplexeres Batterie-Simulationsmodell
float simulateBatteryPower(float pvPower, float loadPower, float currentSOC) {
float maxChargePower = 5000; // W
float maxDischargePower = 5000; // W
float chargingEfficiency = 0.95;
float dischargingEfficiency = 0.95;
// Nettoenergie
float netPower = pvPower - loadPower;
// Laden/Entladen basierend auf Überschuss/Defizit
if (netPower > 0) {
// Überschuss -> Laden
float chargePower = min(netPower, maxChargePower);
// Ladeleistung reduzieren, wenn fast voll
if (currentSOC > 90) {
chargePower *= (100 - currentSOC) / 10;
}
return chargePower * chargingEfficiency;
} else {
// Defizit -> Entladen
float dischargePower = min(-netPower, maxDischargePower);
// Entladeleistung reduzieren, wenn fast leer
if (currentSOC < 20) {
dischargePower *= currentSOC / 20;
}
return -dischargePower / dischargingEfficiency;
}
}
// Theme-Struktur
struct UITheme {
uint16_t backgroundColor;
uint16_t textColor;
uint16_t highlightColor;
uint16_t accentColor;
uint16_t warningColor;
uint16_t successColor;
};
// Vordefinierte Themes
UITheme darkTheme = {
TFT_BLACK, // Hintergrund
TFT_WHITE, // Text
TFT_CYAN, // Hervorhebung
TFT_BLUE, // Akzent
TFT_RED, // Warnung
TFT_GREEN // Erfolg
};
UITheme lightTheme = {
TFT_WHITE, // Hintergrund
TFT_BLACK, // Text
TFT_NAVY, // Hervorhebung
TFT_BLUE, // Akzent
TFT_RED, // Warnung
TFT_DARKGREEN // Erfolg
};
// Aktives Theme
UITheme currentTheme = darkTheme;
// Einfache Animation für Übergänge
void slideTransition(int direction) {
// direction: 0 = links, 1 = rechts, 2 = oben, 3 = unten
uint16_t screenBuffer[320]; // Puffer für eine Bildschirmzeile/spalte
if (direction == 0 || direction == 1) {
// Horizontale Animation
int step = (direction == 0) ? 10 : -10;
for (int x = (direction == 0) ? 0 : 320; (direction == 0) ? x <= 320 : x >= 0; x += step) {
// Bildschirm nach links/rechts schieben
for (int y = 0; y < 240; y++) {
// Zeile einlesen
for (int i = 0; i < 320; i++) {
if (i + x >= 0 && i + x < 320) {
screenBuffer[i] = tft.readPixel(i + x, y);
} else {
screenBuffer[i] = BACKGROUND;
}
}
// Zeile ausgeben
for (int i = 0; i < 320; i++) {
tft.drawPixel(i, y, screenBuffer[i]);
}
}
delay(5); // Kurze Verzögerung für Animation
}
}
// Ähnliches Prinzip für vertikale Animation...
}
Bei einem Standard-ESP32 mit ca. 180 KB freiem Speicher müssen die Zukunftspläne realistisch eingeschätzt werden. Die folgende Tabelle zeigt, welche Funktionen mit den vorhandenen Ressourcen umsetzbar sind:
Feature | Umsetzbarkeit | Speicheraufwand | Komplexität | Erläuterung |
---|---|---|---|---|
Verbesserter Access Point Modus | ✅ Sehr gut | Gering | Niedrig | Erweiterung des bestehenden Codes mit minimalen Speicheranforderungen |
MQTT-Discovery | ✅ Gut | Gering | Niedrig | Implementierung von standardisierten MQTT-Discovery-Paketen |
Grundlegende Sensorik | ✅ Gut | Gering-Mittel | Niedrig | Integration von Temperatur-, Feuchtigkeits- und Lichtsensoren über bestehende Schnittstellen |
Einfache Steuerungserweiterungen | ✅ Gut | Gering-Mittel | Niedrig | Zusätzliche Steuerungsobjekte mit bestehender MQTT-Struktur |
Grundlegende Datenanalyse | ✅ Bedingt | Mittel | Mittel | Einfache Statistiken, gleitende Durchschnitte, Min/Max-Werte |
Integration weiterer Energiequellen | ✅ Bedingt | Gering | Niedrig | Daten-Mapping ohne komplexe Verarbeitung |
Optimierte OTA-Updates | ✅ Bedingt | Mittel | Mittel | Verbesserte Fehlerbehandlung, aber ohne automatisches Backup |
Einfache grafische Darstellungen | Hoch | Mittel | Einfache Balken- und Liniendiagramme mit reduzierter Datenmenge | |
Multi-Language Support | Hoch | Mittel | Wenige Sprachen, externe Speicherung der Sprachdateien im SPIFFS | |
Einfaches Energiemanagement | Mittel | Hoch | Grundlegende Entscheidungslogik für wenige Verbraucher | |
Basis-Batteriemonitoring | Mittel | Mittel | Einfache Statusanalyse ohne komplexe Vorhersagen | |
Erweitertes Logging | ❌ Nicht empfohlen | Sehr hoch | Mittel | Nur mit zusätzlicher SD-Karte realistisch umsetzbar |
KI-basierte Prognosen | ❌ Nicht möglich | Extrem hoch | Sehr hoch | Übersteigt die Rechenleistung des ESP32 |
Komplexe Dashboards | ❌ Nicht möglich | Sehr hoch | Hoch | Zu ressourcenintensiv für den begrenzten Speicher |
Smartphone-App | ➡️ Extern | - | - | Muss als separates Projekt entwickelt werden |
Mehrbenutzersystem | ❌ Nicht möglich | Sehr hoch | Hoch | Authentifizierung und Rechteverwaltung überfordern den Speicher |
-
Verbesserter Access Point Modus
- Erweiterte Konfigurationsmöglichkeiten
- Verbesserte Captive-Portal-Funktionalität
- Status-Feedback während der Konfiguration
-
MQTT-Discovery
- Automatische Erkennung in Home Assistant
- Standard-konformes Discovery-Format
- Keine manuelle Konfiguration nötig
-
Grundlegende Sensorik
- Integration von bis zu 2-3 Sensoren (DS18B20, DHT22, etc.)
- Anzeige der Sensorwerte im UI
- Weiterleitung der Daten über MQTT
-
Einfache Steuerungserweiterungen
- Integration weiterer Aktoren (Relais, etc.)
- Gruppensteuerung für Rollläden
- Einfache Szenarien (Tag/Nacht, Anwesend/Abwesend)
-
Optimierte OTA-Updates
- Verbesserte Fehlerbehandlung
- Update-Prüfung vor Installation
- Rollback-Funktion bei fehlgeschlagenem Update
-
Einfaches Energiemanagement
- Regelbasierte Steuerung von bis zu 3 Verbrauchern
- Abhängig von PV-Überschuss
- Einfache Zeitpläne
-
Externe Datenanalyse
- Datenübertragung an externe Systeme (Raspberry Pi, Cloud)
- Auslagerung rechenintensiver Analysen
- Rückübertragung der Ergebnisse zum ESP32
-
Modularisierung
- Optionale Features, die bei Bedarf aktiviert werden können
- Dynamisches Ressourcenmanagement
- Konfigurierbare Build-Optionen für unterschiedliche Hardware-Varianten
Einige der komplexeren Features könnten mit folgenden Hardware-Erweiterungen realisiert werden:
Hardware-Erweiterung | Zusätzliche Funktionalität | Kostenabschätzung |
---|---|---|
ESP32-S3 | Mehr RAM und CPU-Leistung für komplexere Berechnungen | ~10€ |
ESP32 mit PSRAM | Zusätzlicher Speicher (4-8MB) für Datenverarbeitung | ~12€ |
SD-Karte | Erweitertes Logging, Datenspeicherung, Mehrsprachigkeit | ~5€ plus Adapter |
Raspberry Pi als Ergänzung | Komplexe Analysen, KI, Dashboards, App-Backend | ~50€ und mehr |
Zusätzliche Sensoren | Temperatur, Feuchtigkeit, Licht, Bewegung | ~3-15€ pro Sensor |
Die aktuelle Speicherkapazität von ca. 180 KB freiem RAM ermöglicht fokussierte Erweiterungen der Kernfunktionalität. Für den bestmöglichen Ressourceneinsatz empfehlen wir eine schrittweise Implementierung der Features, beginnend mit denen aus Phase 1.
Komplexere Funktionen sollten entweder auf leistungsfähigere Hardware ausgelagert oder als optionale Module gestaltet werden, die nicht permanent im Speicher bleiben. Mit einer klugen Ressourcenverwaltung und Modularisierung kann der ESP32 Solar Monitor trotz der Speicherbeschränkungen zu einem leistungsfähigen Steuerungszentrum für Solaranlagen ausgebaut werden.
Der ESP32 Solar Monitor ist ein offenes Projekt und lebt von Beiträgen der Community. Wenn Sie Verbesserungsvorschläge haben oder an der Entwicklung teilnehmen möchten, finden Sie das Projekt auf GitHub.
Mögliche Beitragsformen:
- Bugfixes und Fehlerbehebungen
- Neue Funktionen und Erweiterungen
- Verbesserungen der Dokumentation
- Übersetzungen der Benutzeroberfläche
- Hardware-Designs und -Anpassungen
- Beispiel-Konfigurationen für verschiedene Solarsysteme
Der ESP32 Solar Monitor nutzt folgende Bibliotheken:
- TFT_eSPI: Display-Ansteuerung
- XPT2046_Touchscreen: Touchscreen-Ansteuerung
- ArduinoJson: JSON-Verarbeitung (Version 7.x)
- PubSubClient: MQTT-Kommunikation
- ESPAsyncWebServer: Webserver-Funktionalität
- AsyncTCP: Asynchrone TCP-Kommunikation
- SPIFFS: Dateisystemverwaltung
- DNSServer: DNS-Server für den Access Point Modus
- Update: OTA-Update-Funktionalität
- WiFi: WLAN-Konnektivität
- ESPmDNS: Multicast DNS für einfache Erreichbarkeit
- SPI: SPI-Kommunikation mit Display und Touchscreen
Der ESP32 Solar Monitor ist ein offenes und erweiterbares Projekt zur Überwachung und Steuerung von Solaranlagen und Smart-Home-Geräten. Die modulare Architektur ermöglicht eine einfache Anpassung und Erweiterung. Mit Version 0.4.3 wurden wichtige Funktionen wie Heartbeat-Überwachung, Rollladensteuerung, Webserver-Funktionalität und der Access Point Modus für einfache Erstkonfiguration hinzugefügt, die den Monitor zu einem umfassenden Steuerungszentrum für Ihr smartes Zuhause machen.
Beiträge und Verbesserungsvorschläge sind jederzeit willkommen!
Diese Dokumentation wurde für Version 0.4.3 des ESP32 Solar Monitor erstellt.