Lang lebe der Akku!

Die Lebensdauer der Batterie eines Elektroautos hängt stark davon ab, wie man sie lädt. Ein Elektroauto bis auf 100 Prozent zu laden, schadet dem Akku auf Dauer. Am besten ist es, den Akku immer nur auf bis zu 80 Prozent zu laden, das hilft die Lebensdauer der Batterie zu verlängern.

Auch das sogenannte Tiefentladen ist schlecht für den Akku. Von Tiefenentladung spricht man, wenn der Akkustand unter 20 Prozent sinkt. Im Idealfall bleibt der Akku immer in einem Ladezustand von ca. 50 bis 70 Prozent. Das ist in Praxis natürlich schwierig zu bewerkstelligen.

Manche Hersteller liefern die Lösung dafür in der Software und der Ladevorgang lässt sich entsprechend konfigurieren. Beim Mini Cooper ist das nicht so, daher habe ich mir eine individuelle Lösung gebaut. Diese funktioniert für elektrische BMW und Mini Modelle. Viel Spaß beim Nachmachen!

Vorweg: Natürlich lässt sich die Umsetzung mit verschiedenen Komponenten realisieren. In meinem Fall sind das:

  • ein Raspberry Pi der ersten Generation (natürlich geht auch ein neueres Modell, wie z.B. der Raspberry Pi 2)
  • eine Fritz!Box, bei mir die Fritz!Box 7590
  • eine fernsteuerbare Steckdose, bei mir die Fritz!DECT 210

Die Grundidee ist: wir lesen regelmäßig alle 15 Minuten den Ladezustand des Autos aus. Dazu benutzen wir die Python Bibliothek Bimmer Connected. Sobald der Ladezustand 80% erreicht hat, verbinden wir uns mittels der Python Bibliothek fritzconnection mit der Fritz!Box und schalten die Steckdose aus. Sobald der Ladezustand die 80% wieder unterschreitet, schalten wir die Steckdose wieder an.

Installation des Raspberry Pi

Mit dem Raspberry Pi Imager lässt sich das Betriebssystem am schnellsten installieren. Ich habe das Raspberry Pi OS Lite (32bit) gewählt.

Nach dem ersten Login wird Python installiert mit “sudo apt install python3” und anschließend der Python Paket Manager “pip” mit “sudo apt install python3-pip”.

Nun kommen die oben erwähnten Bibliotheken an die Reihe. Zuerst installiere ich fritzconnection und dann bimmer_connected. Um die vordefinierte Python Konfiguration zu übersteuern ist der Schalter –break-system-packages zu verwenden. Also zuerst “pip install fritzconnection –break-system-packages”, dann “pip install bimmer_connected –break-system-packages”.

Das Herzstück der Lösung

Die bimmer_connected Bibliothek bringt ein sample File namens “cli.py” mit. Damit kann man die Bibliothek testen und verschiedene nette Sachen mit dem Auto machen. Diese Datei nehmen wir als Basis und erweitern sie. Ich habe dafür eine Kopie der Datei in meinem User Directory namens “wallbox.py” angelegt. Im Header ergänzen wir die zusätzlichen Module der fritzconnection Bibliothek. Die Zeilen am besten direkt über den anderen “import” Zeilen anlegen.

from fritzconnection import FritzConnection
from fritzconnection.lib.fritzhomeauto import FritzHomeAutomation

In dieser Sektion der Datei (ziemlich weit unten zu finden):

for vehicle in account.vehicles:
if args.vin and vehicle.vin != args.vin:
continue
“””auskommentieren
print(f”VIN: {vehicle.vin}”)
print(f”Mileage: {vehicle.mileage.value} {vehicle.mileage.unit}”)
print(“Vehicle data:”)
print(json.dumps(account.vehicles, cls=MyBMWJSONEncoder, indent=4))
ende”””

kommentieren wir das Rausschreiben der Daten aus, das brauchen wir nicht. Achtung: ich gehe davon aus, dass genau EIN Auto im Konto hinterlegt ist. Sind es mehrere, müsst ihr vor dem Einfügen der nächsten Zeilen erst die richtige Fahrgestellnummer abfragen! Hinter dem auskommentierten Bereich fügt ihr dann folgende neue Zeilen ein. An den markierten Stellen müsst ihr eure Daten eintragen. Die IP Adresse der Fritz!Box, den Benutzernamen und das Passwort und ganz wichtig die AIN Nummer der Steckdose. Die könnt ihr auf der fritz.box Oberfläche im Bereich Smarthome ablesen, auf der Detailseite der Steckdose.

percent = str(vehicle.fuel_and_battery.remaining_battery_percent)
target = “80”
print(“Batterie in % ” + percent)
print(“Ladeziel in % ” + target)
percent_int = int(percent)
target_int = int(target)
if percent_int <target_int or percent_int >target_int:
fc = FritzConnection(address=”192.168.178.1-ggf.-anpassen”, user=”hier-fritzbox-username-eingeben”, password=”hier-fritzbox-passwort-eingeben”)
fha = FritzHomeAutomation(fc)
ain = ‘hier-die-AIN-nummer-der-steckdose-eingeben’
state = fha.get_device_information_by_identifier(ain)[‘NewSwitchState’]
print(“Steckdose ist: ” + state)
if percent_int <target_int and state==”OFF”:
fha.set_switch(ain, on=True)
print(“Steckdose angeschaltet”)
elif percent_int >target_int and state==”ON”:
fha.set_switch(ain, on=False)
print(“Steckdose ausgeschaltet”)
else:
print(“nichts zu tun”)
else:
print(“nichts zu tun”)

Im Wesentlichen war es das

Jetzt brauchen wir nur noch ein kleines Shell Skript um die Datei “wallbox.py” regelmäßig alle 15 Minuten ausführen zu können und die Anmeldeparameter für den BMW bzw. MINI Account zu übergeben. Die Region “rest_of_world” ist für Deutschland die richtige. Dazu legen wir die Datei “wallbox.sh” ebenfalls im User Directory mit folgendem Inhalt an:

python /home/hier-steht-der-raspberry-username/wallbox.py status <email-adresse-des-bmw/mini-konto> <passwort-des-bmw/mini-konto> rest_of_world > /home/hier-steht-der-raspberry-username/wallbox.log &

Die Ausgabe wird umgeleitet in eine Log Datei “wallbox.log”, so können wir besser debuggen wenn mal was nicht funktionieren sollte. Die “wallbox.sh” noch ausführbar machen mit “chmod 700 wallbox.sh”.

Nach einem Testlauf kommt das Shellskript noch in die crontab, damit es alle 15 Minuten gestartet wird mit “sudo crontab -e”. Folgende Zeile ist dort einzufügen:

0,15,30,45 * * * * /bin/su -c “/home/hier-steht-der-raspberry-username/wallbox.sh” – <hier-steht-der-raspberry-username>

Fertig.

Leave a Reply

If you want to leave a comment put in your first and lastname. Otherwise your comment won't be published.

Your email address will not be published. Required fields are marked *