Datenquelle nicht erreichbar!

Idee

Wäre es nicht schön, zu jedem Zeitpunkt zu wissen, wie viel Ökostrom gerade im Stromnetz ist?
Mit dieser Information könnte man alles Mögliche anfangen: Man könnte seine Spülmaschine immer dann einschalten, wenn der Ökostrom-Anteil besonders hoch ist. Man könnte sich freuen, wenn es draußen stürmt, weil dann die Windräder ordentlich laufen. Bei brütender Sommerhitze könnte man zufrieden ablesen, dass in Deutschland mehr Strom hergestellt wird, als wir benötigen und wir ihn deshalb exportieren können. Zum Beispiel nach Frankreich, weil den dortigen Atomkraftwerken das nötige Kühlwasser fehlt. Und über einen längeren Zeitraum betrachtet, könnte man hoffentlich beobachten, dass der Anteil an erneuerbaren Energien immer größer wird und dass die Energiewende voran kommt. Ich frage mich, warum solch eine Anzeige nicht längst vor dem Wirtschaftsministerium steht.

Die Idee ist eine Ökostrom-Anzeige, die als eigenständiges Messgerät leicht verständlich anzeigt, welcher Anteil an „grünem Strom“ gerade aus der Steckdose kommt. Die Bedienung soll so einfach sein, wie die eines einfachen Haushaltsmessgeräts, wie eine Küchenwaage, ein Thermometer oder ein Luftfeuchte-Messgerät.

Die Grafik, die oben zu sehen ist, zeigt bereits den aktuellen Ökostrom-Anteil an. Die Ökostrom-Anzeige, die hier vorgestellt wird, soll aber ein eigenständiges Gerät werden, das unaufdringlich und ohne Digitalästhetik im Haushalt aufgestellt werden kann. Also keine reine Webseite und auch keine Smartphone-App.

Die nachfolgenden Bilder zeigen den Prototypen:

Prototyp der Ökostrom-Anzeige

Daten

Um die Idee einer Ökostrom-Anzeige technisch zu realisieren, muss man ein bisschen tiefer in die Trickkiste greifen. Leider sieht man dem Strom, der aus der Steckdose kommt, seine dunkle Vergangenheit nicht an. Elektronen aus einem Kohlekraftwerk sind nicht braun-schwarz, Atomstrom ist nicht gelb und auch Elektronen aus dem Windrad sind weder grün noch blau. Man braucht daher Daten, die einem – nach Möglichkeit live – darüber Auskunft geben, wie viel Strom aus welchen Quellen gerade im Stromnetz ist.

Solche Daten stellt die Bundesnetzagentur bereit. Die staatliche Agentur ist durch die europäische „Verordnung über die Übermittlung und die Veröffentlichung von Daten in Strommärkten“ seit ein paar Jahren dazu verpflichtet, alle Daten im Zusammenhang mit der Stromerzeugung zu sammeln und im Internet zu veröffentlichen. Diese Transparenz soll einen Markt dafür schaffen, Kraftwerke zeitlich optimiert in Betrieb zu nehmen oder den Stromeinkauf entsprechend anzupassen. Die Bundesnetzagentur betreibt auf der Internetseite www.smard.de eine Datenbank, die solche Daten der Öffentlichkeit zur Verfügung stellt.

Ganz live sind diese Daten leider nicht. Sie werden immer erst mit einer Verzögerung von etwa 2 Stunden veröffentlicht. Allerdings erstellt die Behörde auch eine Prognose, wie viel Strom die installierten Wind- und Solarkraftwerke in den nächsten Stunden erzeugen werden. Die Prognose wird auf Grundlage des aktuellen Kraftwerksbestands, zurückliegender Verbrauchsprofile und der jeweiligen Wettervorhersage erstellt. Zählt man nun die prognostizierte Stromerzeugung aus erneuerbaren Energien zusammen und teilt sie durch den aktuellen Strombedarf, so erhält man die gesuchte Prozentzahl, die auf der Ökostrom-Anzeige dargestellt werden soll.

In der nachfolgenden Tabelle sind die aktuellen Daten dargestellt, die zur Berechnung des Ökostrom-Anteils verwendet werden. Mit dem Umschalter unter der Tabelle kann man zwischen Energiewerten (Megawattstunden) und Prozentwerten umschalten.

Datenquelle nicht erreichbar!
Bezeichnung Beschreibung
wind_onshore Prognostizierte Erzeugung Windkraft auf dem Festland
wind_offshore Prognostizierte Erzeugung Windkraft auf dem Meer
solar Prognostizierte Erzeugung: Photovoltaik-Anlagen
water Stromerzeugung vor 24 Stunden: Wasserkraft (ohne Pumpspeicherkraftwerke)
biomass Stromerzeugung vor 24 Stunden: Biomasse (z.B. Holz, organischer Müll, Biogas)
Strombedarf Prognostizierter Stromverbrauch, gesamte Netzlast
Anteil Ökostrom Prozentwert des Verhältnisses: Erneuerbare Energien / Prognostizierter Stromverbrauch

Projekt

Bastele deine eigene Ökostrom-Anzeige!

Genug des theoretischen Vorgeplänkels. Jetzt wird es praktisch. Ich möchte nachfolgend beschreiben, wie ich die Idee umgesetzt habe, welche Bauteile dafür erforderlich sind und welcher Programmiercode die Daten aus dem Internet zieht. Die Voraussetzung für dieses Bastelprojekt ist als erstes ein Mikrocontroller-Board. Meine Wahl ist hier auf den Raspberry Pi Pico W gefallen, weil dieser einen WLAN-Chip an Bord hat und außerdem von Haus aus die Programmiersprache Python versteht, genauer gesagt MicoPython, eine abgespeckte Version der Programmiersprache.

Die Verschaltung des Raspberry Pi Pico W ist ganz simpel. An Pin 2 der Platine, der mit dem GPIO-Port 1 (GP1) belegt ist, wird ein Drehspulmessinstrument (z.B. 100 µA) angeschlossen, das über einen Potentiometer (z.B. 50 kOhm) mit der Masse an Pin 3 verbunden wird. Der Poti wird später so eingestellt, dass das Messinstrument bei der maximalen Spannung (3,3 Volt) voll ausschlägt. GP1 wird durch das Programm als PWM-Ausgang (Pulsweitenmodulation) geschaltet und kann damit die Ausgangsspannung zwischen 0 und 3,3 Volt variieren.

Anschluss des Messinstuments

Anschluss des Messinstuments am Raspberry Pi Pico W


Optional: Um die Anzeige auch ohne USB-Steckernetzteil nutzen zu können, habe ich außerdem eine Ladeplatine für einen 3,7V Li-Po-Akku sowie ein Lithium-Polymer-Akku verwendet. Der Akku wird mit der Ladeplatine an den passenden Batterie-Anschlüssen verbunden, der Output der Ladeplatine über einen Ein-Schalter mit dem VSYS-Spannungseingang des Raspberry Pi Pico W an Pin 39 und der Masse an Pin 38. Der Akku wird nun über den Mikro-USB-Stecker der Ladeplatine geladen und die Ladeplatine versorgt den Raspberry Pi Pico W mit Strom. Der Mikro-USB-Stecker des Raspberry Pi Pico W selbst darf dann nicht mehr mit Strom verbunden werden, sonst kommen sich beide Stromquellen in die Quere.

Anschluss der Ladeplatine und des Akkus

Anschluss der optionalen Ladeplatine und des Akkus


Jetzt zum Programmcode. Das Zusammentragen der verschiedenen Stromdaten der Bundesnetzagentur habe ich außerhalb des Mikrocontroller-Boards auf meinen eigenen Webserver verlagert. Der Grund dafür ist, dass ich bei Bedarf die Berechnungsformeln und die Datenquellen anpassen kann, ohne dafür den Raspberry Pi Pico neu programmieren zu müssen. Außerdem kann ich die Daten auch für die Webversion der Ökostrom-Anzeige verwenden (also die vorliegende Webseite). Das magische JSON-File, das die jeweils aktuellen Zeitreihen des Ökostrom-Anteils enthält, ist unter ecopower.json abrufbar. Es wird stündlich von dem Python-Skript getFromSMARD.py aktualisiert. Die Dokumentation des Skripts befindet sich auf meinem Github-Account. Wer möchte, kann dieses auch für den Raspberry Pi Pico anpassen und lokal ausführen statt das vorverarbeitete JSON aus dem Internet zu laden.

Der MicroPython-Code, der direkt auf dem Raspberry Pi Pico W augeführt wird, hat folgenden Hauptbestandteil:

# initailize GPIO
pwm = PWM(Pin(1)) # Set GP1 as PWM-out (Pin 2 on RPi-board)
pwm.freq(1000) # Set the PWM frequency
pwm.duty_u16(0) # duty cycle = 0

# show that board has started succesfully
fadeMeter0to100()

# Define network
wlan = network.WLAN(network.STA_IF)

# load settings
filename = 'settings.json'
with open(filename, 'r') as f:
	settings = json.load(f)

url = settings['dataUrl']
wifiNetworks = settings['wifiNetworks']

while True:
	# Connect to network
	connectWiFi()
	# read json file and date from server
	jsonValues, jsonDate = getJson() 
	# disconnect and save energy
	disconnectWiFi()
	setClockFromHumantime(jsonDate)
	timestampNow = time.time()
	print('timestampNow: ', timestampNow)

	# get pre-pre-last object key (last one is 'timestamp')
	finalTimestamp = int(sorted(jsonValues.keys())[-3]) 
	if finalTimestamp > (timestampNow + 6*3600):
		finalTimestamp  = timestampNow + 6*3600 # maximum 6h from now

	while timestampNow < finalTimestamp:
		showValue()
		time.sleep(60)
		timestampNow = time.time() 
		
	print('Ende erreicht, lade aktuelleres JSON-File')						
						

Mit den ersten drei Befehlen wird der Ausgangsport GP1 als Analogausgang initialisiert und auf 0 Volt gesetzt.

Mit fadeMeter0to100() zeigt der Micro-Controller das erfolgreiche Hochfahren an, indem sich der Zeiger des Drehspulmessinstruments von 0 nach 100% dreht.

Das Netzwerk wird als station interface definiert, das mit einem Router kommunizieren soll. Unterhalb des Kommentars # load settings wird die Datei settings.json aus dem Speicher geladen. In dieser Datei ist die URL der Zeitreihe des Ökostrom-Anteils abgelegt sowie die Liste der verfügbaren WLAN-Netzwerke und dem jeweiligen Passwort. Wenn sich das Microcontroller-Board mit dem WLAN verbinden möchte, probiert es nacheinander alle Netzwerknamen durch. Die Namen und Passwörter müssen entsprechend an den Einsatzort angepasst werden. Die Liste kann beliebig erweitert werden. Ich habe diese Angaben in eine extra Datei ausgelagert, damit man nicht die Programmcode-Datei anfassen muss, sondern die Umgebungsbedingungen nur innerhalb von settings.json anpassen muss.

{
    "dataUrl": "https://ecomakerspace.de/oekostrom/ecopower.json",
    "wifiNetworks": {
        "Netzwerkname1": "passwort1",
        "Netzwerkname2": "passwort2",
        "Netzwerkname3": "passwort3"
  }
}

Als nächstes beginnt mit while True: eine Endlosschleife, die so lange durchlaufen wird, bis der Minicomputer ausgeschaltet wird. Die einzelnen Aktionen sind in Funktionen ausgelagert, die ich hier nicht einzeln beschreiben werde. Der gesamte Code ist auf meinem Github-Account veröffentlicht. Die Funktionsnamen bezeichnen, was hier passiert. Wenn connectWiFi() aufgerufen wird, signalisiert das Anzeige-Instrument, dass gerade ein Verbindungsversuch erfolgt, indem der Zeiger auf 50% springt und dann nach rechts und links wedelt, solange die Netzwerk-Verbindung noch nicht steht. Bleibt der Computer bei diesem Schritt stecken, z.B. weil kein Netzwerk verfügbar ist, so wird dies also durch die wackelnde Anzeige signalisiert. Erst wenn der Zeiger wieder auf 0 zurückspringt, war die Verbindung erfolgreich. Anschließend holt sich der Computer die Ökostrom-Datei ecopower.json aus dem Internet, schaltet das WLAN zum Stromsparen wieder ab und zeigt schließlich den aktuellen Ökostrom-Anteil auf dem Drehspulmessinstrument an. Der Wert wird alle 60 Sekunden neu berechnet.

Der Raspberry Pi Pico W hat zwar einen integrierten Timer, dessen Uhrzeit wird aber bei jedem Neustart zurückgesetzt. Wir müssen also die Uhrzeit jedesmal neu stellen, wenn der Computer hochgefahren wird. Dies wird hier durch einen Trick realisiert. Bei dem Abrufen der Ökostrom-Datei aus dem Internet schickt der aufgerufene Server im HTML-Header einen Datumsstring zurück. Zum Beispiel „date: Wed, 29 Nov 2023 20:54:32 GMT“. Diese Zeichenkette wird ausgelesen und an die Funktion setClockFromHumantime(jsonDate) übergeben. Dort wird der String mit einer Regular Expression in Zahlenwerte zerlegt und zum Stellen der Echtzeit-Uhr verwendet: RTC().datetime(timeTuple).

Die Endlosschleife erreicht erst nach 6 Stunden die letzte Zeile. Dann nämlich hat die Ökostrom-Datei den letzten Prognosewert erreicht und eine aktuellere Datei wird wieder aus dem Internet gezogen.

Ansonsten gibt es in dem Code wenig Überraschendes. Eines ist vielleicht noch interessant. Die Energiedaten liegen nur in 15-Minuten-Intervallen vor. Da der der Zeiger aber jede Minute aktualisiert wird, wird in der Funktion showValue() immer zwischen den beiden Tabellenwerten anhand des aktuellen Zeitstempels (vergangene Sekunden seit dem 1. Januar 1970) linear interpoliert: thisValue = lastValue + (nextValue - lastValue)/900 * (timestampNow - lastTimestamp). Damit ist ein gleitender Übergang zwischen den 15-Minuten-Werten möglich.

Zum Schluss noch die Bauteilliste und meine Bezugsquellen. Das ist natürlich nur ein Vorschlag. Prinzipiell kann man natürlich jedes Microcontroller-Board verwenden, das MicoPython versteht und einen WLAN-Chip integriert hat.

  • Raspberry Pi Pico W, RP2040 + WLAN Mikrocontroller-Board (z.B. berrybase.de, ca. 7 €)
  • Einbau-Messinstrument, 0...100 µA, 64x56 mm (z.B. pollin.de, ca. 7 €)
  • Drehpotentiometer 50 kOhm (z.B. pollin.de, ca. 0,50 €)
  • TEKO Gehäuse, P/2.10, ABS, Benzinblau, 110 x 70 x 48 mm (z.B. pollin.de, ca. 5 €)

Optional :

  • Ladeplatine für 3,7V LiIon / LiPo Akkus (z.B. berrybase.de, ca. 1,50 €)
  • LP-503562 Lithium-Polymer / LiPo Akku, 3,7V, 1200mAh (z.B. berrybase.de, ca. 6 €)
  • Ein-Schalter (z.B. pollin.de, ca. 1 €)

Kontakt

Dies ist ein privates Bastel-Projekt von Jens Gröger. Alle Bauanleitungen und Programmcodes werden kostenlos und zur beliebigen Weiterverwendung angeboten. Der Code ist unter der freien MIT-Lizenz veröffentlicht.

Jens Gröger
Bornholmer Straße 84
10439 Berlin
Germany
j.groeger(at)oeko.de
+49-30-405085-378.