Geschrieben am

Anleitungsartikel

In diesem Tutorial geht es darum den aktuellen Ladezustand (Prozent-Wert) des Hyundai IONIQ electric auszulesen und auf einer kleinen Website zur Verfügung zu stellen.

Leider stellt der Hersteller in Europa keine Möglichkeit zur Verfügung. Diesen eher unerfreulichen Zustand nahm ich zum Anlass dieses kleine Projekt zu starten. Schöner wäre natürlich eine fix und fertige Lösung des Herstellers. Da dies nicht gegeben ist, gibt es nun diese Bastelei, die aber bisher in meinem IONIQ anstandslos seinen Zweck erfüllt und mich stets über den Batteriestand informiert.

Vorab

Ich selbst bin Webentwickler und seit 2014 begeistert vom Thema Elektromobilität. Bevor ich mich für E-Mobile interessiert habe, hatte ich mit Autos nichts am Hut 🙂 Ich bin überhaupt kein KfZ Enthusiast oder habe Vorkenntnisse hinsichtlich Fahrzeugdiagnose oder Vorkenntnisse im Umgang mit der OBD2 Schnittstelle.

Dies ist eine Basis-Einrichtung und vernachlässigt das Thema Sicherheit.

Hardware + Kosten

Grundsätzlich funktioniert das System wohl auch mit anderer Hardware z. B. mit anderen OBD2 Bluetooth Dongle oder Surfsticks. Aber ich habe gute Erfahrungen damit gemacht und liste es deshalb hier auf.

Raspberry Pi Zero W (Starter Set)  Darin enthalten sind auch Gehäuse und ein USB Adapter. Das benötigst du später für den Surfstick  26,00 EUR
Netzteil + Kabel für Stromversorgung  9,89 EUR
8GB Micro SD Karte  7,99 EUR
OBD2 Bluetooth Dongle  Das Verlinkte Dongle ist etwas groß und die Abdeckung im Fahrzeug passt nicht mehr darüber.  10,99 EUR
Huawei E303 3G Surfstick  Ich empfehle diesen Stick oder ein anderer HUAWEI Surfstick, der HiLink unterstützt. d. h. hier richtet den Stick wie im Manual beschrieben an einem Windows PC ein. Am Raspberry Pi ist dann nichts mehr zu machen. Einfach nur noch einstecken.  25,49 EUR
Powerbank Für Ladevorgänge, muss der Raspberry Pi mit einer Powerbank mit Strom versorgt werden. Die USB Buchsen im Fahrzeug funktionieren leider nicht  31,99 EUR

Es entstehen also Hardwarekosten von ca. 110,00 EUR

Bitte beachten, Du benötigst….

… Vorkenntnisse in den Bereichen Linux, SSH und Webhosting. Außerdem brauchst du einen Provider, der Dir eine MySQL Datenbank und ein kleines PHP Skript hostet. Außerdem ein PC/Mac mit der Möglichkeit auf die SD Karte  zuzugreifen.

1. Vorbereitung

Für die Speicherung des Ladezustands benötigst du eine Tabelle in einer Datenbank. Im Tutorial hier benutze ich eine MySQL Datenbank. Die Datenbank muss von extern erreichbar sein.

Folgende Tabelle kannst du über das SQL-Skript anlegen

CREATE TABLE IF NOT EXISTS `bms` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `soc` int(255) NOT NULL,
 `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1267 ;

Halte für den späteren Schritt die Zugangsdaten für die Datenbank bereit.

Du benötigst den

  • Hostnamen (Servername)
  • Benutzername
  • Passwort
  • Datenbankname

2. Einrichtung des Raspberry Pi

Wenn du noch keinerlei Erfahrung mit dem Umgang mit dem Raspberry Pi hast, solltet du Dir einige Informationen darüber einholen. Z. B. hier 

Wenn du schon etwas vertraut im Umgang mit dem Raspberry Pi bist, kann es losgehen. Wir starten mit dem Bespielen der Micro SD Karte. Die SD Karte wird mit einem Image bespielt. Das ist ein vorkonfiguriertes Betriebssystem für den Pi. Ich habe dazu „Raspbian Stretch Lite“ ausgewählt, dass du hier herunterladen musst.

Es gibt viele verschiedene Möglichkeiten das Raspbian Image auf die SD Karte zu schreiben.

Für Windows: Win32DiskImager
Anleitung: https://www.raspberrypi.org/documentation/installation/installing-images/windows.md

Für Mac: Über das Terminal
Anleitung: https://www.raspberrypi.org/documentation/installation/installing-images/mac.md

Beides ist hinreichend im Netz dokumentiert, weshalb ich hier nicht weiter darauf eingehe.

2.1. WLAN und SSH konfigurieren

Bevor du die SD Karte in den Pi stecken und ihn booten kannst, solltest du vorab das WLAN konfigurieren, damit du die weitere Konfiguration per SSH durchführen kannst. Hierzu erstellst du eine Datei „wpa_supplicant.conf“ mit dem Inhalt

# Datei wpa_supplicant.conf in der Boot-Partition (Raspbian Stretch)
country=DE #omit if US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
 ssid="<DEIN WLAN NAME (SSID)"
 psk="<DEIN WLAN PASSWORT>"
 key_mgmt=WPA-PSK
}

und kopierst sie auf die SD Karte.

Erstelle zusätzlich noch eine leere Datei mit dem Namen „ssh“ und kopiere diese ebenfalls auf die SD Karte. Das hat zur Folge, dass du über SSH auf den Pi zugreifen kannst.

Nach dem Start verbindet sich der Raspberry Pi dann mit Deinem WLAN und du kannst ihn ab sofort über das Netzwerk ansprechen.

2.2. Inbetriebnahme des Raspberry Pi Zero W

Nun kannst du die beschriebene und über die beiden Dateien erweiterte, SD Karte in den Raspberry stecken und ihn starten. Du solltest dann das Gerät mit dem Namen „raspberrypi“ in Deinen Netzwerkgeräten finden. Z. B. über die Weboberfläche des Routers (Fritz Box)

Oder du kannst ihn direkt versuchen „anzupingen“ unter Windows mit dem Programm „cmd“ oder wenn du einen Mac oder Linux System nutzt, über das Terminal.

ping raspberrypi

Wenn der Raspberry im Netz erreichbar ist, erhältst du auf diesem Weg auch die IP Adresse des Geräts.

2.3. Erste Verbindung per SSH und Paket-Installationen

Du benutzt PuTTY oder das Terminal für SSH Verbindungen zum Raspberry Pi. Der Standard-Benutzername lautet „pi“ das Passwort „raspberry“

ssh pi@raspberrypi
pi@raspberrypi's password: raspberry

Nun müssen einige Pakete installiert werden, zuvor aber bitte das obligatorische update und upgrade durchführen

sudo apt-get update
sudo apt-get upgrade

sudo apt-get install bluetooth bluez-tools blueman python python-serial python-mysqldb

2.4. OBD2 Bluetooth Dongle mit Raspberry Pi koppeln

In diesem Schritt müssen drei Dinge gegeben sein.

  1. OBD2 Dongle ist im IONIQ eingesteckt
  2. Raspberry Pi ist in Reichweite des OBD2 Dongle (< 5m)
    Idealerweise versorgt Ihr den Raspberry Pi direkt im IONIQ mit Strom. Einfach an eine USB Buchse hängen. Fahrzeug einschalten!
  3. Raspberry Pi ist im WLAN

Ich könnte mir vorstellen, dass das für den ein oder anderen u. U. problematisch ist, weil z. B. das Fahrzeug in der Tiefgarage abgestellt ist und es dort kein WLAN für den Raspberry Pi gibt. Dann kann ich nur empfehlen das Koppeln des OBD2 Dongle und dem Raspberry Pi an einem Ort zu machen an dem diese Bedingungen gegeben sind.

Solltest du dafür ein anderes WLAN nutzen müssen, dann kannst du die Datei in Schritt 1.1. einfach um einen weiteren Network-Block, mit weiteren Zugangsdaten, erweitern .


network={ 
  ssid="<EIN ANDERES WLAN NAME (SSID)>" 
  psk="<EIN ANDERES WLAN PASSWORT>" 
  key_mgmt=WPA-PSK 
}

Nun zum Koppeln des Geräts:

sudo bluetoothctl

startet das Programm für die Einrichtung des  Bluetooth Geräts. Vermutlich muss du dies mit dem Passwort des Users „pi“ bestötigen. Also „raspberry“ eingeben und bestätigen

agent on
scan on

listet alle Bluetooth Geräte in Reichweite auf. Hier sollte auch euer OBD2 Dongle erscheinen. Du siehst auch die zugehlrige Geräte-Adresse (Format: XX:XX:XX:XX:XX:XX) . Diese ist für die weiteren Schritte wichtig!

pair XX:XX:XX:XX:XX:XX

Nun musst du noch den Gerätecode eingeben. I. d. R. ist das !1234″ oder „0000“. Wenn das geklappt hat, muss man dem Gerät noch generell vertrauen, damit diese Prozedur nicht permanent wiederholt weden muss. Das geht mit

trust XX:XX:XX:XX:XX:XX

Gerät als Device einbinden

Damit wir auf den OBD2 Dongle zugreifen können, muss er als Serielles Gerät noch eingebunden werden. und dies nach jedem neustart. Dazu fügen wir folgende Zeile in die Datei /etc/rc.local ein

sudo rfcomm bind hci0 XX:XX:XX:XX:XX:XX 1

Anschließend solltest du den Raspberry Pi neustarten

sudo reboot

2.5. Python Skript installieren

Wie schon vorab erwähnt, habe ich bis dato noch keine Zeile Python geschrieben. Deshalb mag es sein, dass sich die Python Profis hier die Hände vor die Augen halten. Der Code bietet ganz sicher einiges an Optimierungspotential!


import serial
import MySQLdb
import re
import time
import string
import io

db = MySQLdb.connect(host="<DB HOST>",    # your host, usually localhost
                     user="<DB USER>",         # your username
                     passwd="<DB PASSWORT>",  # your password
                     db="<DB NAME>")        # name of the data base

cur = db.cursor()

ser = serial.Serial("/dev/rfcomm0", timeout=None)
ser.baudrate = 9600
ser.flushInput()
ser.write(b'2105\r\n')
ser.flush()
seq = []
while True:
    reading = ser.read()
    seq.append(reading)
    joineddata = ' '.join(str(v) for v in seq).replace(' ', '')

    err = re.search('ERROR', joineddata)
    if err:
        break
    m = re.search('4([^;]*)5:', joineddata) #'/4([^;]*)\n5', joineddata)
    if m:
        ser.close()
        test = str(m.group(0))
        x = (test[-8:])      
        SoC = (int( x[3:5], 16)/2)
        if SoC > 0 & SoC <= 100:
            print(SoC)
            cur.execute("""INSERT INTO bms (soc) VALUES (%s)""", (SoC,) )
            db.commit()
        break

 

Trage Deine Datenbank-Zugangsdaten ein und speichere den Code auf dem Raspberry Pi in das Verzeichnis /home/pi/ unter dem Namen ioniq.py ab

Du kannst das Ganze dann bereits das erste mal testen, indem du das Programm aufrufst

python ioniq.py

Nach kurzer Programmlaufzeit solltest du einen neuen Datensatz in Deiner bms-Tabelle sehen und dort sollte de SoC stehen.

2.6. Python Skript per Cronjob ausführen

Damit man das programm nicht mauell ausführen muss, richten wir den Aufruf in der Crontab ein.

Dazu per SSH folgenden Befehl eingeben

crontab -e

und in diese Datei folgende Zeile einfügen

* * * * * python /home/pi/ioniq.py& PID=$!; sleep 15; kill $PID >/dev/null 2>&1

Nun wird ioniq.py minütlich aufgerufen

2.7. Surfstick

Raspberry Pi Zero ! + Huawei E303 Surfstick

Ich nutze den HUAWEI E303 Surfstick. Der unterstützt HiLink. Auch hier gehe ich nicht auf die Details der Einrichtung ein. Dies unterscheidet sich auch wieder von Surfstick zu Surfstick. Ich empfehle die Einrichtung wie im Handbuch des Sticks beschrieben, durchzuführen. Das muss und sollte auch nicht am Raspberry Pi erfolgen. Benutze dazu ein Windows PC oder Notebook.

Wenn du mit der Einrichtung fertig bist, kannst du den Stick normalerweise ohne Weiteres in die USB Buchse des Raspberry Pi stecken, benutze dazu den USB-Adapter (Im Starter Set enthalten)

Was du unbedingt machen solltest: Entferne die PIN Abfrage der SIM-Karte während der Einrichtung. Das ging bei mir über den Web-Browser.

Achja, ich habe übriegns sehr gute Erfahrungen mit der SIM Karte von netzclub.de gemacht! 🙂

2.8. Powerbank

Während der Fahrt kannst du den Raspberry Pi problemlos an einer der USB Buchsen im Fahrzeug betreiben. Jedoch ist es in der Regel während der Fahrt sinnfrei das System überhaupt Laufen zu lassen. Normalerweise ist der Ladestand dann interessant, wenn das Auto irgendwi abgestellt wird und aufläd. Und in diesem Fall muss der Raspberry Pi mit einer Powerbank betrieben werden, denn die USB Buchsen im IONIQ werden während des Ladevorgangs leider nicht mit Strom versorgt.

Ich selbst nutze eine vorhandene Powerbank, die ich noch zu Hause liegen habe. Achtet beim kauf der Powerbank auf 2 Dinge

  1. Sie sollte sich zur selben Zeit Be- und Entladen lassen
  2. Die Be- und Entladebuchsen sollten ausreichend weit voneinander entfernt liegen, damit beide Stecker auch Problemlos zusammen eingesteckt sein können.

3. Webinterface

Das Webinterface ist eine kleine Webanwendung, die ich Quick and Dirty in PHP geschrieben habe. Du kannst einfach diese ZIP-Datei herunterladen, entpacken und den Inhalt auf Deinen Webspace hochladen.

Auch hier setze ich etwas Vorkenntnisse voraus und gehe nicht darauf ein. Es sollte klar sein, dass PHP ab Version 5.6 vom Webhoster unterstützt werden muss.

Du musst nun noch die 2. Zeile in der index.php anpassen. Trage hier wieder Deine Datenbankdaten ein.