Kleine Hardware-Monitore mit ESP32-Chip erfreuen sich gerade steigender Beliebtheit. Ausgelöst hat den Trend ein Beitrag von @steveruizok auf X, seitdem tauchen die winzigen Displays überall auf. Ich habe mir auch eins bestellt.
Statt es zum Systemmonitor für den Rechner zu machen, hat es bei mir eine andere Aufgabe bekommen: Es soll zeigen, was mein Balkonkraftwerk gerade produziert. Das Projekt heißt bitSolarMonitor und entsteht Schritt für Schritt. Diesen ersten Schritt beschreibe ich hier.
Voraussetzungen: Was du brauchst
Hardware:
- 🛒 Waveshare ESP32-S3-Touch-AMOLED-1.8
- 🛒 Shelly Outdoor Plug S am Wechselrichter oder Einspeisedose, misst die Erzeugung
- Ein USB-A/C auf USB-C Datenkabel. Ein reines Ladekabel reicht nicht, damit wird das Board nicht erkannt.
- WLAN im 2,4-GHz-Band
- Optional für Stufe 2: Shelly Pro 3EM in der Unterverteilung
Software, um den Code aufs Board zu bekommen, zwei Wege:
Der bequeme Weg. Lass dir von Claude Code helfen. Das ganze Projekt ist so entstanden, Schritt für Schritt im Dialog. Repository verlinken, Board anstecken, und den Rest erklärt der Assistent unterwegs. Wer noch nie mit Mikrocontrollern gearbeitet hat, kommt so am schnellsten ans Ziel.
Der klassische Weg. Espressifs Entwicklungsumgebung einmal einrichten, danach sind es drei Befehle:
# Einmalig: ESP-IDF installieren
git clone -b v5.5.5 --depth 1 --recursive https://github.com/espressif/esp-idf.git ~/esp/esp-idf
cd ~/esp/esp-idf && ./install.sh esp32s3 && . ./export.sh
# Projekt holen, WLAN eintragen, flashen
git clone GITHUB_REPO_LINK && cd bitSolarMonitor
cp local.defaults.example local.defaults # WLAN-Name und Passwort eintragen
idf.py -p /dev/cu.usbmodem1101 flash
Die IP-Adressen deiner Shellys musst du nirgends eintragen, die sucht der Monitor selbst. Mehr dazu weiter unten.
Das Board
Als Monitor wird ein 🛒 Waveshare ESP32-S3-Touch-AMOLED-1.8 genutzt. Das kleine Entwicklerboard ist vollgepackt mit Funktionen:
| Anzeige | 1,8 Zoll AMOLED, 368 x 448 Pixel, Touch |
| Chip | ESP32-S3, zwei Kerne, 240 MHz |
| Speicher | 16 MB Flash, 8 MB PSRAM |
| Funk | WLAN und Bluetooth 5 |
| Sonstiges | Beschleunigungssensor, Mikrofon, Audio-Codec, Akku-Lademanagement, SD-Slot |
Angenehm am ESP32-S3: Er bringt USB direkt mit. Am Mac erscheint das Board sofort als serielle Schnittstelle, ohne dass man erst einen Treiber nachinstallieren muss.
Ab Werk läuft eine Demo darauf, sogar zwei: das Oberflächen-Framework esp-brookesia und der Sprachassistent xiaozhi.
Zuerst: Backup
Bevor irgendetwas überschrieben wird, legen wir ein Backup an. Waveshare bietet sie nirgends sauber zum Download an. Wer sie ohne Backup überschreibt, bekommt sie nicht zurück.
esptool --port /dev/cu.usbmodem1101 read-flash 0 0x1000000 factory-backup.bin
16 MB in 99 Sekunden. Diese Datei ist übrigens nicht nur eine Rückfahrkarte, sondern auch eine Informationsquelle. Ein simples strings über das Abbild verrät, welche Treiber Waveshare tatsächlich benutzt, und damit, welche Chips wirklich verbaut sind:
esp_lcd_new_panel_co5300
esp_lcd_touch_new_i2c_cst816s
Von diesem Board existieren mehrere Hardware-Revisionen mit unterschiedlichen Display- und Touch-Controllern. Wer den falschen Treiber erwischt, bekommt schlicht kein Bild und sucht den Fehler danach stundenlang an der falschen Stelle. Der Blick ins eigene Backup klärt in Sekunden, welche Variante man in der Hand hält.
Die Idee hinter bitSolarMonitor
Daten sind ausreichend vorhanden: Hersteller-App, Home Assistant, Diagramme ohne Ende. Nur eben hinter einem Zugang und über Apps oder den Computer. Wer unkompliziert wissen will, ob die Sonne noch für die Spülmaschine reicht, benötigt einen einfachen Zugang zu diesen Daten.
Deswegen bitSolarMonitor: keine Zugänge, kein Computer oder Handy nötig, sondern ein kleines Display, das sichtbar in der Wohnung aufgestellt ist.
Meine Anlage, bestehend aus 850 Wp Modulen, einem auf 800 W begrenzten Wechselrichter und einem Speicher, ist ausgelegt auf Nulleinspeisung. Am Stromzähler stehen deshalb immer ungefähr 0 Watt, egal wie sehr die Sonne scheint. Die Regelung bügelt das weg, der Überschuss wandert in den Akku.
Sichtbar wird die Erzeugung an anderer Stelle: an einem 🛒 Shelly Outdoor Plug S zwischen Wechselrichter und Speicher. Der misst die reine PV-Leistung, bevor der Speicher entscheidet, was ins Haus geht.
Beide Shelly-Geräte lassen sich lokal abfragen, ohne Cloud und ohne Konto:
curl "http://IP-DES-OUTDOOR-PLUGS/rpc/Switch.GetStatus?id=0"
Der Wert apower ist dabei negativ, weil eingespeist statt verbraucht wird. Beim Shelly Pro 3EM in der Unterverteilung liefert EM.GetStatus das Feld total_act_power, ebenfalls mit Vorzeichen: negativ bedeutet Einspeisung ins Netz.
Drei Ausbaustufen
Damit das Projekt nicht nur bei mir läuft, ist es gestuft aufgebaut:
- Nur ein Shelly Plug S. Zeigt die aktuelle PV-Erzeugung.
- Plus Shelly Pro 3EM. Zeigt zusätzlich Netzbezug und Einspeisung.
- Plus Speicherdaten. Kommt noch.
Technisch stecken die Ausbaustufen im Datenmodell. Jeder Messwert weiß selbst, ob er gilt:
typedef struct {
bool valid;
float value;
} measurement_t;
Die Oberfläche blendet aus, was ungültig ist. Fehlt der Smart Energy Meter, verschwindet einfach die entsprechende Kachel.
Dazu kommt eine Kleinigkeit, die den Nachbau deutlich angenehmer macht: Der Monitor sucht seine Shellys selbst. Er fragt per mDNS im Netz nach und ordnet die Fundstücke danach zu, wie sie antworten, nicht nach Modellnummer. Wer auf EM.GetStatus mit total_act_power antwortet, ist ein Energiezähler. Wer auf Switch.GetStatus mit apower antwortet, ist ein Plug. Das funktioniert damit auch mit Shelly-Modellen, die es beim Schreiben des Codes noch gar nicht gab.
Beim ersten Start sieht das so aus:
net: IP-Adresse: 192.XXX.1.XX
shelly: Suche Shelly-Geraete per mDNS ...
shelly: gefunden: shellypro3em-... -> Energiezaehler
shelly: gefunden: shellyoutdoorsg3-... -> Plug
pvmon: Erzeugung 115 W | Netz 1 W
Keine einzige IP-Adresse war konfiguriert. Vom Einschalten bis zum ersten Messwert vergingen 6 Sekunden.
Was das Gerät zeigt
01-display-seite-1-pv_result
02-display-seite-1-speicher_result
03-display-seite-2-ertrag_result
03-display-seite-3-status_result
Das Display ist klein, deshalb verteilt sich alles auf drei Seiten. Gewischt wird mit dem Finger, drei Punkte am unteren Rand zeigen, wo man gerade ist.
Seite 1 ist die Hauptseite: die aktuelle Erzeugung als große Zahl in einem Ring, der die Leistung ins Verhältnis zum Wechselrichterlimit setzt. Darunter zwei Kacheln für Netzbezug und Versorgungslage. Oben rechts die Uhrzeit, oben links die Temperatur des Outdoor Plug, der bei mir draußen hängt.
Seite 2 zeigt den Tagesverlauf als Kurve, darüber den Ertrag. Die Kurve arbeitet im Fünf-Minuten-Raster, 288 Werte decken damit 24 Stunden ab. Startet das Gerät mittags, beginnt die Kurve mittags, statt eine falsche Nulllinie für den Vormittag zu zeichnen.
Seite 3 ist die Statusseite: Netzspannung aller drei Phasen, WLAN mit Signalstärke, Laufzeit, die gefundenen Geräte. Die Netzspannung ist dabei mehr als Zierde. Wechselrichter regeln bei zu hoher Netzspannung ab und müssen jenseits von 253 V abschalten. Wer sich wundert, warum die Anlage bei bester Sonne wenig liefert, findet hier die Antwort.
Der obere der beiden Knöpfe schaltet die Helligkeit in drei Stufen durch. Nach 30 Sekunden ohne Berührung dimmt das Display von selbst auf ein Viertel herunter, ganz aus geht es nie. Der Monitor soll schließlich auch im Vorbeigehen ablesbar bleiben.
Ausblick
Ladezustand des Speichers & Verbrauchsprofile von Waschmaschine. Dann kann das Display die Frage beantworten, um die es eigentlich geht: Reichen Sonne + Speicher für eine Waschmaschine oder Spülmaschine.
Quellcode & Sonstiges
Der Quellcode liegt unter bitSolarMonitor auf GitHub
Weitere spannende ESP32-Projekte sammle ich auf einer Projektseite.
Hinweis: Bei den mit 🛒 gekennzeichneten Links handelt es sich um Affiliate-Links. Bei einem Kauf über diese Links entstehen für dich keine Mehrkosten, aber du unterstützt damit die Finanzierung dieses Blogs. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen.
