ESP32-Bewässerungssystem
Modularer Aufbau mit getrennten .h/.cpp-Dateien:
src/
├── main.cpp # Einstiegspunkt
├── core/
│ ├── Application.h/.cpp # Haupt-Orchestrierung & Boot-Sequenz
│ ├── ConfigManager.h/.cpp # LittleFS JSON Konfiguration
│ └── StateManager.h/.cpp # Systemzustand-Automat
├── net/
│ ├── WifiManager.h/.cpp # Multi-AP, WPS, Setup-AP
│ └── TimeSync.h/.cpp # NTP + DS3231-Sync, Zeitzonenverwaltung
├── hw/
│ ├── OledStatus.h/.cpp # SSD1306 128×64 Statusanzeige
│ ├── Ds3231Manager.h/.cpp # DS3231 RTC-Verwaltung
│ └── RelayManager.h/.cpp # Relais-/Pumpensteuerg (sicherheitsgesperrt)
└── web/
├── WebServer.h/.cpp # HTTP-Server + DNS Captive Portal
├── WebPages.h # PROGMEM HTML-Templates
├── WebHandlers.h/.cpp # HTTP-Handler (Status, WLAN, Zeit, HW, ...)
- I²C initialisieren (Wire.begin)
- OLED initialisieren
- DS3231 erkennen → Systemzeit setzen (falls vorhanden)
- Konfiguration aus LittleFS laden
- Relais initialisieren (alle AUS – sichere Grundstellung)
- WLAN-Verbindung versuchen:
- Alle APs mit gleicher SSID scannen und nach Signalstärke sortieren
- Jeden AP nacheinander probieren
- Falls alle scheitern → WPS (60 Sek.)
- Falls WPS scheitert → Setup-AP starten
- Webserver starten (Normal- oder Portal-Modus)
- NTP-Zeitsync (bei WLAN-Verbindung), DS3231 aktualisieren
- Betriebsmodus bestimmen:
- WLAN verbunden →
RUNNING - Kein WLAN, aber Bewässerungskonfig vorhanden →
RUNNING_OFFLINE - Keine Bewässerungskonfig →
SETUP_REQUIRED
- WLAN verbunden →
- Kein WLAN ≠ kein Betrieb: Bei vorhandener Bewässerungskonfiguration läuft das System lokal weiter.
- Erststart ist gesperrt: Ohne Bewässerungsplan darf keine Pumpe geschaltet werden.
- DS3231-Warnung: Fehlt der RTC, wird im Webinterface ein roter Warnbalken angezeigt.
- Relais sicher gesperrt:
activateRelay()erfordert explizitesarmed=true.
| Datei | Inhalt |
|---|---|
/config.json |
WLAN, Zeitzone, NTP-Server, Standort |
/hardware.json |
Relais-Anzahl, GPIO-Pins, Invertierung |
/watering.json |
Bewässerungspläne (leer = Pumpen gesperrt) |
/status– Systemstatus (DS3231-Warnung, WLAN, Zeit, Betriebszustand)/config_wifi– WLAN-Einstellungen/config_time– Zeitzone & NTP-Server/config_location– Standort mit Kartenansicht (Leaflet)/config_hardware– Relais-Konfiguration (Neustart erforderlich bei Änderung)/config_watering– Bewässerungsplan (Phase 2)/watering_test– Simulation mit identischer Decision-Engine wie Livebetrieb
- Slots definieren nur Zeittrigger + Wiederholung (
Wochentageoderalle N Tage). - Pumpen-Zuweisungen verbinden Pumpen mit Slots (Bacula-ähnlich).
- Wetter-Templates enthalten mehrere kombinierbare Wetterregeln pro Vorlage (z. B.
Hitze -> +20%undRegen in 6h -> -25%). - Die Auswertung ist zentral und deterministisch: zuerst Aussetzen, danach Verkürzen/Verlängern relativ zur Basislaufzeit.
- Livebetrieb, Status, Simulation und API verwenden dieselbe
WateringDecisionEngine.
- OTA wird automatisch gestartet, sobald das Gerät im WLAN oder Setup-AP erreichbar ist.
- Das OTA-Passwort wird auf der Seite
/config_wifigepflegt. - Das Passwort schützt drahtlose Firmware-Updates über
ArduinoOTA.
/api/weather– Wetterdaten inkl. 24h-Kontext (wenn verfügbar)/api/watering_simulate– Simulationslauf für einen Slot/Zeitpunkt/api/watering_status– Gesamtstatus mit Slot-/Pumpen-Entscheidungen und nächsten Läufen
Bei fehlendem WLAN startet das Gerät als Access Point:
- SSID:
Bewaesserung-Setup - IP:
192.168.4.1 - DNS: Captive Portal (alle Anfragen →
/) - Keine Passwortabfrage für einfachen Erstzugang
pio run # Kompilieren
pio run -t upload # Flashen
pio run -t uploadfs # LittleFS hochladen
pio device monitor # Serieller Monitorolikraus/U8g2– OLED-Treiber (SSD1306)adafruit/RTClib– DS3231 RTCbblanchon/ArduinoJson– JSON-Konfigurationarduino-libraries/NTPClient– NTP-Zeitabfrage